@videojs/html 0.1.0-preview.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -0
- package/README.md +26 -0
- package/dist/chunk-Bp6m_JJh.js +13 -0
- package/dist/icons-YlVTDFdV.js +198 -0
- package/dist/icons-YlVTDFdV.js.map +1 -0
- package/dist/icons.d.ts +2 -0
- package/dist/icons.js +3 -0
- package/dist/index-BtSCzZKn.d.ts +62 -0
- package/dist/index-BtSCzZKn.d.ts.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/media-skin-BlXPC9wG.js +1458 -0
- package/dist/media-skin-BlXPC9wG.js.map +1 -0
- package/dist/media-skin-CbuyuCb-.d.ts +208 -0
- package/dist/media-skin-CbuyuCb-.d.ts.map +1 -0
- package/dist/skins/default.d.ts +12 -0
- package/dist/skins/default.d.ts.map +1 -0
- package/dist/skins/default.js +424 -0
- package/dist/skins/default.js.map +1 -0
- package/dist/store.d.ts +1 -0
- package/dist/store.js +0 -0
- package/package.json +60 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-skin-BlXPC9wG.js","names":["useCurrentTimeDisplayState: StateHook<{\n currentTime: number | undefined;\n duration: number | undefined;\n}>","getCurrentTimeDisplayProps: PropsHook<{\n currentTime: number | undefined;\n duration: number | undefined;\n}>","CurrentTimeDisplay: ConnectedComponentConstructor<CurrentTimeDisplayState>","getTemplateHTML","useDurationDisplayState: StateHook<{\n duration: number | undefined;\n}>","getDurationDisplayProps: PropsHook<{\n duration: number | undefined;\n}>","DurationDisplay: ConnectedComponentConstructor<DurationDisplayState>","getTemplateHTML","#handleKeyDown","#handleKeyUp","getFullscreenButtonState: StateHook<{ fullscreen: boolean }>","getFullscreenButtonProps: PropsHook<{ fullscreen: boolean }>","FullscreenButton: ConnectedComponentConstructor<FullscreenButtonState>","getMuteButtonState: StateHook<{\n muted: boolean;\n volumeLevel: string;\n}>","getMuteButtonProps: PropsHook<{\n muted: boolean;\n volumeLevel: string;\n}>","MuteButton: ConnectedComponentConstructor<MuteButtonState>","getPlayButtonState: StateHook<{ paused: boolean }>","getPlayButtonProps: PropsHook<{ paused: boolean }>","PlayButton: ConnectedComponentConstructor<PlayButtonState>","#updateVisibility","#abortController","#clearHoverTimeout","#cleanup","#transitionStatus","#handleMouseEnter","#handleMouseLeave","#handleFocusIn","#handleFocusOut","#triggerElement","#portalElement","#positionerElement","#popupElement","#open","#setupFloating","#hoverTimeout","#setupPortal","#cleanupPortal","#portal","#childrenArray","#guards","Popover: {\n Root: typeof MediaPopoverRoot;\n Trigger: typeof MediaPopoverTrigger;\n Portal: typeof MediaPopoverPortal;\n Positioner: typeof MediaPopoverPositioner;\n Popup: typeof MediaPopoverPopup;\n}","getTimeSliderRootProps: PropsHook<{\n currentTime: number;\n duration: number;\n requestSeek: (time: number) => void;\n core: CoreTimeSlider | null;\n}>","CoreTimeSlider","useTimeSliderRootState: StateHook<{\n currentTime: number;\n duration: number;\n requestSeek: (time: number) => void;\n core: CoreTimeSlider | null;\n}>","getTimeSliderTrackProps: PropsHook<Record<string, never>>","getTimeSliderProgressProps: PropsHook<Record<string, never>>","getTimeSliderPointerProps: PropsHook<Record<string, never>>","getTimeSliderThumbProps: PropsHook<Record<string, never>>","TimeSliderRoot: ConnectedComponentConstructor<{\n currentTime: number;\n duration: number;\n requestSeek: (time: number) => void;\n core: CoreTimeSlider | null;\n}>","TimeSliderTrack: ConnectedComponentConstructor<any>","TimeSliderProgress: ConnectedComponentConstructor<any>","TimeSliderPointer: ConnectedComponentConstructor<any>","TimeSliderThumb: ConnectedComponentConstructor<any>","TimeSlider","#handleMouseEnter","#handleMouseLeave","#handleMouseMove","#updateVisibility","#clearHoverTimeout","#cleanup","#transitionStatus","#triggerElement","#portalElement","#positionerElement","#popupElement","#open","#setupFloating","#arrowElement","#mousePosition","#hoverTimeout","#setOpen","#updatePosition","#setupPortal","#cleanupPortal","#portal","Tooltip: {\n Root: typeof MediaTooltipRoot;\n Trigger: typeof MediaTooltipTrigger;\n Portal: typeof MediaTooltipPortal;\n Positioner: typeof MediaTooltipPositioner;\n Popup: typeof MediaTooltipPopup;\n Arrow: typeof MediaTooltipArrow;\n}","getVolumeSliderRootProps: PropsHook<{\n volume: number;\n muted: boolean;\n volumeLevel: string;\n requestVolumeChange: (volume: number) => void;\n core: CoreVolumeSlider | null;\n}>","CoreVolumeSlider","useVolumeSliderRootState: StateHook<{\n volume: number;\n muted: boolean;\n volumeLevel: string;\n requestVolumeChange: (volume: number) => void;\n core: CoreVolumeSlider | null;\n}>","getVolumeSliderTrackProps: PropsHook<Record<string, never>>","getVolumeSliderProgressProps: PropsHook<Record<string, never>>","getVolumeSliderThumbProps: PropsHook<Record<string, never>>","VolumeSliderRoot: ConnectedComponentConstructor<{\n volume: number;\n muted: boolean;\n volumeLevel: string;\n requestVolumeChange: (volume: number) => void;\n core: CoreVolumeSlider | null;\n}>","VolumeSliderTrack: ConnectedComponentConstructor<any>","VolumeSliderProgress: ConnectedComponentConstructor<any>","VolumeSliderThumb: ConnectedComponentConstructor<any>","VolumeSlider","getTemplateHTML","CustomElementConsumer: Constructor<CustomElement>","ProviderHTMLElement: Constructor<CustomElement>"],"sources":["../src/utils/component-factory.ts","../src/components/media-current-time-display.ts","../src/components/media-duration-display.ts","../src/components/media-chrome-button.ts","../src/components/media-fullscreen-button.ts","../src/components/media-mute-button.ts","../src/components/media-play-button.ts","../src/components/media-popover.ts","../src/components/media-time-slider.ts","../src/components/media-tooltip.ts","../src/components/media-volume-slider.ts","../src/media/media-container.ts","../src/media/media-provider.ts","../src/media/media-skin.ts"],"sourcesContent":["import { ConsumerMixin } from '@open-wc/context-protocol';\n\n/**\n * Generic types for HTML component hooks pattern\n * Mirrors the React hooks architecture for consistency\n */\nexport interface StateHook<T = any> {\n keys: string[];\n transform: (rawState: any, mediaStore: any) => T;\n}\n\nexport type PropsHook<T = any, P = any> = (state: T, element: HTMLElement) => P;\n\nexport interface ConnectedComponentConstructor<State> {\n new (state: State): HTMLElement;\n}\n\n/**\n * Generic factory function to create connected HTML components using hooks pattern.\n * Provides equivalent functionality to React's toConnectedComponent but for custom elements.\n *\n * @param BaseClass - Base custom element class to extend\n * @param stateHook - Hook that defines state keys and transformation logic\n * @param propsHook - Hook that handles element attributes and properties based on state\n * @param eventsHook - Hook that defines event handling logic\n * @param displayName - Display name for debugging\n * @returns Connected custom element class with media store integration\n */\nexport function toConnectedHTMLComponent<State = any>(\n BaseClass: CustomElementConstructor,\n stateHook: StateHook<State>,\n propsHook: PropsHook<State>,\n displayName?: string,\n): ConnectedComponentConstructor<State> {\n const ConnectedComponent = class extends ConsumerMixin(BaseClass) {\n static get observedAttributes(): string[] {\n return [\n // @ts-expect-error ts(2339)\n ...(super.observedAttributes ?? []),\n ];\n }\n\n _mediaStore: any;\n\n contexts = {\n mediaStore: (mediaStore: any) => {\n this._mediaStore = mediaStore;\n\n // Subscribe to media store state changes\n // Split into two phases: state transformation, then props update\n this._mediaStore.subscribeKeys(stateHook.keys, (rawState: any) => {\n // Phase 1: Transform raw media store state (state concern)\n const state = stateHook.transform(rawState, mediaStore);\n\n // Phase 2: Update element attributes/properties (props concern)\n const props = propsHook(state ?? {} as State, this);\n // @ts-expect-error any\n this._update(props, state, mediaStore);\n });\n },\n };\n\n connectedCallback(): void {\n super.connectedCallback?.();\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback?.();\n }\n\n handleEvent(event: CustomEvent): void {\n // @ts-expect-error any\n super.handleEvent?.(event);\n }\n };\n\n // Set display name for debugging and dev tools\n if (displayName) {\n Object.defineProperty(ConnectedComponent, 'name', { value: displayName });\n }\n\n return ConnectedComponent;\n}\n","import type { CurrentTimeDisplayState } from '@videojs/core/store';\nimport type { ConnectedComponentConstructor, PropsHook, StateHook } from '../utils/component-factory';\n\nimport { currentTimeDisplayStateDefinition } from '@videojs/core/store';\n\nimport { formatDisplayTime } from '@videojs/utils';\nimport { toConnectedHTMLComponent } from '../utils/component-factory';\n\nexport class CurrentTimeDisplayBase extends HTMLElement {\n static shadowRootOptions = {\n mode: 'open' as ShadowRootMode,\n };\n\n static observedAttributes: string[] = ['show-remaining'];\n\n _state:\n | {\n currentTime: number | undefined;\n duration: number | undefined;\n }\n | undefined;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow((this.constructor as typeof CurrentTimeDisplayBase).shadowRootOptions);\n }\n }\n\n get currentTime(): number {\n return this._state?.currentTime ?? 0;\n }\n\n get duration(): number {\n return this._state?.duration ?? 0;\n }\n\n get showRemaining(): boolean {\n return this.hasAttribute('show-remaining');\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, _newValue: string | null): void {\n if (name === 'show-remaining' && this._state) {\n // Re-render with current state when show-remaining attribute changes\n this._update({}, this._state);\n }\n }\n\n _update(_props: any, state: any): void {\n this._state = state;\n\n /** @TODO Should this live here or elsewhere? (CJP) */\n const timeLabel\n = this.showRemaining && state.duration != null && state.currentTime != null\n ? formatDisplayTime(-(state.duration - state.currentTime))\n : formatDisplayTime(state.currentTime);\n\n if (this.shadowRoot) {\n this.shadowRoot.textContent = timeLabel;\n }\n }\n}\n\nexport const useCurrentTimeDisplayState: StateHook<{\n currentTime: number | undefined;\n duration: number | undefined;\n}> = {\n keys: [...currentTimeDisplayStateDefinition.keys],\n transform: (rawState, _mediaStore) => ({\n ...currentTimeDisplayStateDefinition.stateTransform(rawState),\n // Current time display is read-only, so no request methods needed\n }),\n};\n\nexport const getCurrentTimeDisplayProps: PropsHook<{\n currentTime: number | undefined;\n duration: number | undefined;\n}> = (_state, _element) => {\n const baseProps: Record<string, any> = {};\n return baseProps;\n};\n\nexport const CurrentTimeDisplay: ConnectedComponentConstructor<CurrentTimeDisplayState> = toConnectedHTMLComponent(\n CurrentTimeDisplayBase,\n useCurrentTimeDisplayState,\n getCurrentTimeDisplayProps,\n 'CurrentTimeDisplay',\n);\n\n// Register the custom element\nif (!globalThis.customElements.get('media-current-time-display')) {\n globalThis.customElements.define('media-current-time-display', CurrentTimeDisplay);\n}\n\nexport default CurrentTimeDisplay;\n","import type { DurationDisplayState } from '@videojs/core/store';\nimport type { ConnectedComponentConstructor, PropsHook, StateHook } from '../utils/component-factory';\n\nimport { durationDisplayStateDefinition } from '@videojs/core/store';\n\nimport { formatDisplayTime } from '@videojs/utils';\nimport { namedNodeMapToObject } from '@videojs/utils/dom';\nimport { toConnectedHTMLComponent } from '../utils/component-factory';\n\nexport function getTemplateHTML(\n this: typeof DurationDisplayBase,\n _attrs: Record<string, string>,\n _props: Record<string, any> = {},\n) {\n return /* html */ `\n <span></span>\n `;\n}\n\nexport class DurationDisplayBase extends HTMLElement {\n static shadowRootOptions = {\n mode: 'open' as ShadowRootMode,\n };\n\n static getTemplateHTML: typeof getTemplateHTML = getTemplateHTML;\n\n _state:\n | {\n duration: number | undefined;\n }\n | undefined;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow((this.constructor as typeof DurationDisplayBase).shadowRootOptions);\n\n const attrs = namedNodeMapToObject(this.attributes);\n const html = (this.constructor as typeof DurationDisplayBase).getTemplateHTML(attrs);\n const shadowRoot = this.shadowRoot as unknown as ShadowRoot;\n shadowRoot.setHTMLUnsafe ? shadowRoot.setHTMLUnsafe(html) : (shadowRoot.innerHTML = html);\n }\n }\n\n get duration(): number {\n return this._state?.duration ?? 0;\n }\n\n _update(_props: any, state: any): void {\n this._state = state;\n\n // Update the span content with formatted duration\n const spanElement = this.shadowRoot?.querySelector('span') as HTMLElement;\n if (spanElement) {\n spanElement.textContent = formatDisplayTime(state.duration);\n }\n }\n}\n\nexport const useDurationDisplayState: StateHook<{\n duration: number | undefined;\n}> = {\n keys: [...durationDisplayStateDefinition.keys],\n transform: (rawState, _mediaStore) => ({\n ...durationDisplayStateDefinition.stateTransform(rawState),\n // Duration display is read-only, so no request methods needed\n }),\n};\n\nexport const getDurationDisplayProps: PropsHook<{\n duration: number | undefined;\n}> = (_state, _element) => {\n const baseProps: Record<string, any> = {};\n return baseProps;\n};\n\nexport const DurationDisplay: ConnectedComponentConstructor<DurationDisplayState> = toConnectedHTMLComponent(\n DurationDisplayBase,\n useDurationDisplayState,\n getDurationDisplayProps,\n 'DurationDisplay',\n);\n\n// Register the custom element\nif (!globalThis.customElements.get('media-duration-display')) {\n globalThis.customElements.define('media-duration-display', DurationDisplay);\n}\n\nexport default DurationDisplay;\n","import { namedNodeMapToObject } from '@videojs/utils/dom';\n\nexport function getTemplateHTML(\n this: typeof MediaChromeButton,\n _attrs: Record<string, string>,\n _props: Record<string, any> = {},\n): string {\n return /* html */ `\n <style>\n /*\n NOTE: Even though primitives should aim to be \"unstyled\" in their core definitions, we should\n still add pointer-events, as this defines functionality. (CJP)\n */\n :host {\n pointer-events: auto;\n }\n </style>\n <slot>\n </slot>\n `;\n}\n\nexport class MediaChromeButton extends HTMLElement {\n static shadowRootOptions = {\n mode: 'open' as ShadowRootMode,\n };\n\n static getTemplateHTML: typeof getTemplateHTML = getTemplateHTML;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n // Set up the Shadow DOM if not using Declarative Shadow DOM.\n this.attachShadow((this.constructor as typeof MediaChromeButton).shadowRootOptions);\n\n const attrs = namedNodeMapToObject(this.attributes);\n const html = (this.constructor as typeof MediaChromeButton).getTemplateHTML(attrs);\n // From MDN: setHTMLUnsafe should be used instead of ShadowRoot.innerHTML\n // when a string of HTML may contain declarative shadow roots.\n const shadowRoot = this.shadowRoot as unknown as ShadowRoot;\n shadowRoot.setHTMLUnsafe ? shadowRoot.setHTMLUnsafe(html) : (shadowRoot.innerHTML = html);\n }\n\n this.addEventListener('click', this);\n this.addEventListener('keydown', this);\n }\n\n handleEvent(event: Event): void {\n const { type } = event;\n if (type === 'keydown') {\n this.#handleKeyDown(event as KeyboardEvent);\n }\n }\n\n #handleKeyDown = (event: KeyboardEvent): void => {\n const { metaKey, altKey, key } = event;\n if (metaKey || altKey || !['Enter', ' '].includes(key)) {\n this.removeEventListener('keyup', this.#handleKeyUp);\n return;\n }\n this.addEventListener('keyup', this.#handleKeyUp, { once: true });\n };\n\n #handleKeyUp = (_event: KeyboardEvent): void => {\n this.handleEvent({ type: 'click' } as Event);\n };\n}\n","import type { FullscreenButtonState } from '@videojs/core/store';\nimport type { ConnectedComponentConstructor, PropsHook, StateHook } from '../utils/component-factory';\n\nimport { fullscreenButtonStateDefinition } from '@videojs/core/store';\n\nimport { setAttributes } from '@videojs/utils/dom';\nimport { toConnectedHTMLComponent } from '../utils/component-factory';\nimport { MediaChromeButton } from './media-chrome-button';\n\nexport class FullscreenButtonBase extends MediaChromeButton {\n _state:\n | {\n fullscreen: boolean;\n requestEnterFullscreen: () => void;\n requestExitFullscreen: () => void;\n }\n | undefined;\n\n handleEvent(event: Event): void {\n super.handleEvent(event);\n\n const { type } = event;\n const state = this._state;\n if (state && type === 'click') {\n if (state.fullscreen) {\n state.requestExitFullscreen();\n } else {\n state.requestEnterFullscreen();\n }\n }\n }\n\n get fullscreen(): boolean {\n return this._state?.fullscreen ?? false;\n }\n\n _update(props: any, state: any, _mediaStore?: any): void {\n this._state = state;\n /** @TODO Follow up with React vs. W.C. data-* attributes discrepancies (CJP) */\n setAttributes(this, props);\n }\n}\n\n/**\n * FullscreenButton state hook - equivalent to React's useFullscreenButtonState\n * Handles media store state subscription and transformation\n */\nexport const getFullscreenButtonState: StateHook<{ fullscreen: boolean }> = {\n keys: fullscreenButtonStateDefinition.keys,\n transform: (rawState, mediaStore) => ({\n ...fullscreenButtonStateDefinition.stateTransform(rawState),\n ...fullscreenButtonStateDefinition.createRequestMethods(mediaStore.dispatch),\n }),\n};\n\nexport const getFullscreenButtonProps: PropsHook<{ fullscreen: boolean }> = (state, _element) => {\n const baseProps: Record<string, any> = {\n /** data attributes/props */\n 'data-fullscreen': state.fullscreen,\n /** @TODO Need another state provider in core for i18n (CJP) */\n /** aria attributes/props */\n role: 'button',\n tabindex: '0',\n 'aria-label': state.fullscreen ? 'exit fullscreen' : 'enter fullscreen',\n /** tooltip */\n 'data-tooltip': state.fullscreen ? 'Exit Fullscreen' : 'Enter Fullscreen',\n /** @TODO Figure out how we want to handle attr overrides (e.g. aria-label) (CJP) */\n /** external props spread last to allow for overriding */\n // ...props,\n };\n\n return baseProps;\n};\n\nexport const FullscreenButton: ConnectedComponentConstructor<FullscreenButtonState> = toConnectedHTMLComponent(\n FullscreenButtonBase,\n getFullscreenButtonState,\n getFullscreenButtonProps,\n 'FullscreenButton',\n);\n\n// NOTE: In this architecture it will be important to decouple component class definitions from their registration in the CustomElementsRegistry. (CJP)\nif (!globalThis.customElements.get('media-fullscreen-button')) {\n globalThis.customElements.define('media-fullscreen-button', FullscreenButton);\n}\n\nexport default FullscreenButton;\n","import type { MuteButtonState } from '@videojs/core/store';\nimport type { ConnectedComponentConstructor, PropsHook, StateHook } from '../utils/component-factory';\n\nimport { muteButtonStateDefinition } from '@videojs/core/store';\n\nimport { setAttributes } from '@videojs/utils/dom';\nimport { toConnectedHTMLComponent } from '../utils/component-factory';\nimport { MediaChromeButton } from './media-chrome-button';\n\nexport class MuteButtonBase extends MediaChromeButton {\n _state:\n | {\n muted: boolean;\n volumeLevel: string;\n requestMute: () => void;\n requestUnmute: () => void;\n }\n | undefined;\n\n handleEvent(event: Event): void {\n super.handleEvent(event);\n\n const { type } = event;\n const state = this._state;\n\n if (state) {\n if (type === 'click') {\n if (state.volumeLevel === 'off') {\n state.requestUnmute();\n } else {\n state.requestMute();\n }\n }\n }\n }\n\n get muted(): boolean {\n return this._state?.muted ?? false;\n }\n\n get volumeLevel(): string {\n return this._state?.volumeLevel ?? 'high';\n }\n\n _update(props: any, state: any): void {\n this._state = state;\n /** @TODO Follow up with React vs. W.C. data-* attributes discrepancies (CJP) */\n setAttributes(this, props);\n }\n}\n\nexport const getMuteButtonState: StateHook<{\n muted: boolean;\n volumeLevel: string;\n}> = {\n keys: muteButtonStateDefinition.keys,\n transform: (rawState, mediaStore) => ({\n ...muteButtonStateDefinition.stateTransform(rawState),\n ...muteButtonStateDefinition.createRequestMethods(mediaStore.dispatch),\n }),\n};\n\nexport const getMuteButtonProps: PropsHook<{\n muted: boolean;\n volumeLevel: string;\n}> = (state, _element) => {\n const baseProps: Record<string, any> = {\n /** data attributes/props */\n 'data-muted': state.muted,\n 'data-volume-level': state.volumeLevel,\n /** @TODO Need another state provider in core for i18n (CJP) */\n /** aria attributes/props */\n role: 'button',\n tabindex: '0',\n 'aria-label': state.muted ? 'unmute' : 'mute',\n /** tooltip */\n 'data-tooltip': state.muted ? 'Unmute' : 'Mute',\n /** @TODO Figure out how we want to handle attr overrides (e.g. aria-label) (CJP) */\n /** external props spread last to allow for overriding */\n // ...props,\n };\n\n return baseProps;\n};\n\nexport const MuteButton: ConnectedComponentConstructor<MuteButtonState> = toConnectedHTMLComponent(\n MuteButtonBase,\n getMuteButtonState,\n getMuteButtonProps,\n 'MuteButton',\n);\n\n// NOTE: In this architecture it will be important to decouple component class definitions from their registration in the CustomElementsRegistry. (CJP)\nif (!globalThis.customElements.get('media-mute-button')) {\n globalThis.customElements.define('media-mute-button', MuteButton);\n}\n\nexport default MuteButton;\n","import type { PlayButtonState } from '@videojs/core/store';\nimport type { ConnectedComponentConstructor, PropsHook, StateHook } from '../utils/component-factory';\n\nimport { playButtonStateDefinition } from '@videojs/core/store';\n\nimport { setAttributes } from '@videojs/utils/dom';\nimport { toConnectedHTMLComponent } from '../utils/component-factory';\nimport { MediaChromeButton } from './media-chrome-button';\n\nexport class PlayButtonBase extends MediaChromeButton {\n _state: { paused: boolean; requestPlay: () => void; requestPause: () => void } | undefined;\n\n handleEvent(event: Event): void {\n super.handleEvent(event);\n\n const { type } = event;\n const state = this._state;\n if (state && type === 'click') {\n if (state.paused) {\n state.requestPlay();\n } else {\n state.requestPause();\n }\n }\n }\n\n get paused(): boolean {\n return this._state?.paused ?? true;\n }\n\n _update(props: any, state: any, _mediaStore?: any): void {\n this._state = state;\n /** @TODO Follow up with React vs. W.C. data-* attributes discrepancies (CJP) */\n setAttributes(this, props);\n }\n}\n\nexport const getPlayButtonState: StateHook<{ paused: boolean }> = {\n keys: playButtonStateDefinition.keys,\n transform: (rawState, mediaStore) => ({\n ...playButtonStateDefinition.stateTransform(rawState),\n ...playButtonStateDefinition.createRequestMethods(mediaStore.dispatch),\n }),\n};\n\nexport const getPlayButtonProps: PropsHook<{ paused: boolean }> = (state, _element) => {\n const baseProps: Record<string, any> = {\n /** data attributes/props */\n 'data-paused': state.paused,\n /** @TODO Need another state provider in core for i18n (CJP) */\n /** aria attributes/props */\n role: 'button',\n tabindex: '0',\n 'aria-label': state.paused ? 'play' : 'pause',\n /** tooltip */\n 'data-tooltip': state.paused ? 'Play' : 'Pause',\n /** @TODO Figure out how we want to handle attr overrides (e.g. aria-label) (CJP) */\n /** external props spread last to allow for overriding */\n // ...props,\n };\n\n return baseProps;\n};\n\nexport const PlayButton: ConnectedComponentConstructor<PlayButtonState> = toConnectedHTMLComponent(\n PlayButtonBase,\n getPlayButtonState,\n getPlayButtonProps,\n 'PlayButton',\n);\n\n// NOTE: In this architecture it will be important to decouple component class definitions from their registration in the CustomElementsRegistry. (CJP)\nif (!globalThis.customElements.get('media-play-button')) {\n globalThis.customElements.define('media-play-button', PlayButton);\n}\n\nexport default PlayButton;\n","import type { Placement } from '@floating-ui/dom';\nimport { autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { uniqueId } from '@videojs/utils';\n\nimport { getDocument, getNextTabbable, getPreviousTabbable, isOutsideEvent } from '@videojs/utils/dom';\n\nexport class MediaPopoverRoot extends HTMLElement {\n #open = false;\n #hoverTimeout: ReturnType<typeof setTimeout> | null = null;\n #cleanup: (() => void) | null = null;\n #transitionStatus: 'initial' | 'open' | 'close' | 'unmounted' = 'initial';\n #abortController: AbortController | null = null;\n\n connectedCallback(): void {\n this.#updateVisibility();\n\n this.#abortController ??= new AbortController();\n const { signal } = this.#abortController;\n\n this.addEventListener('mouseenter', this, { signal });\n this.addEventListener('mouseleave', this, { signal });\n this.addEventListener('focusin', this, { signal });\n this.addEventListener('focusout', this, { signal });\n\n getDocument(this).documentElement.addEventListener('mouseleave', this, { signal });\n }\n\n disconnectedCallback(): void {\n this.#clearHoverTimeout();\n this.#cleanup?.();\n\n this.#transitionStatus = 'unmounted';\n this.#updateVisibility();\n\n this.#abortController?.abort();\n this.#abortController = null;\n }\n\n handleEvent(event: Event): void {\n switch (event.type) {\n case 'mouseenter':\n this.#handleMouseEnter();\n break;\n case 'mouseleave':\n this.#handleMouseLeave(event as MouseEvent);\n break;\n case 'focusin':\n this.#handleFocusIn(event as FocusEvent);\n break;\n case 'focusout':\n this.#handleFocusOut(event as FocusEvent);\n break;\n default:\n break;\n }\n }\n\n static get observedAttributes(): string[] {\n return ['open-on-hover', 'delay', 'close-delay'];\n }\n\n get openOnHover(): boolean {\n return this.hasAttribute('open-on-hover');\n }\n\n get delay(): number {\n return Number.parseInt(this.getAttribute('delay') ?? '0', 10);\n }\n\n get closeDelay(): number {\n return Number.parseInt(this.getAttribute('close-delay') ?? '0', 10);\n }\n\n get #triggerElement(): MediaPopoverTrigger | null {\n return this.querySelector('media-popover-trigger') as MediaPopoverTrigger | null;\n }\n\n get #portalElement(): MediaPopoverPortal | null {\n return this.querySelector('media-popover-portal') as MediaPopoverPortal | null;\n }\n\n get #positionerElement(): MediaPopoverPositioner | null {\n return this.#portalElement?.querySelector('media-popover-positioner') as MediaPopoverPositioner | null;\n }\n\n get #popupElement(): MediaPopoverPopup | null {\n return this.#portalElement?.querySelector('media-popover-popup') as MediaPopoverPopup | null;\n }\n\n setOpen(open: boolean): void {\n if (this.#open === open) return;\n\n this.#open = open;\n\n if (open) {\n this.#setupFloating();\n this.#portalElement?.renderGuards();\n } else {\n this.#portalElement?.removeGuards();\n this.#cleanup?.();\n this.#cleanup = null;\n }\n\n if (open) {\n this.#transitionStatus = 'initial';\n requestAnimationFrame(() => {\n this.#transitionStatus = 'open';\n this.#updateVisibility();\n });\n } else {\n this.#transitionStatus = 'close';\n }\n\n this.#updateVisibility();\n }\n\n #updateVisibility(): void {\n this.style.display = 'contents';\n\n if (this.#popupElement) {\n const placement = this.#positionerElement?.side ?? 'top';\n this.#popupElement.setAttribute('data-side', placement);\n\n this.#popupElement.toggleAttribute('data-starting-style', this.#transitionStatus === 'initial');\n this.#popupElement.toggleAttribute('data-open', this.#transitionStatus === 'initial' || this.#transitionStatus === 'open');\n this.#popupElement.toggleAttribute('data-ending-style', this.#transitionStatus === 'close' || this.#transitionStatus === 'unmounted');\n this.#popupElement.toggleAttribute('data-closed', this.#transitionStatus === 'close' || this.#transitionStatus === 'unmounted');\n\n this.#abortController ??= new AbortController();\n const { signal } = this.#abortController;\n this.#popupElement.addEventListener('mouseleave', this, { signal });\n }\n\n const triggerElement = this.#triggerElement?.firstElementChild as HTMLElement;\n if (triggerElement) {\n triggerElement.setAttribute('aria-expanded', this.#open.toString());\n triggerElement.toggleAttribute('data-popup-open', this.#open);\n\n if (this.#popupElement?.id) {\n triggerElement.setAttribute('aria-controls', this.#popupElement?.id);\n }\n }\n }\n\n #setupFloating(): void {\n if (!this.#triggerElement || !this.#popupElement) return;\n\n const trigger = this.#triggerElement.firstElementChild as HTMLElement;\n const popup = this.#popupElement;\n\n if (!trigger || !popup) return;\n\n const placement = this.#positionerElement?.side ?? 'top';\n const sideOffset = this.#positionerElement?.sideOffset;\n\n const updatePosition = () => {\n computePosition(trigger, popup, {\n placement,\n middleware: [offset(sideOffset), flip(), shift()],\n }).then(({ x, y }: { x: number; y: number }) => {\n Object.assign(popup.style, {\n left: `${x}px`,\n top: `${y}px`,\n });\n });\n };\n\n updatePosition();\n this.#cleanup = autoUpdate(trigger, popup, updatePosition);\n }\n\n #clearHoverTimeout(): void {\n if (this.#hoverTimeout) {\n clearTimeout(this.#hoverTimeout);\n this.#hoverTimeout = null;\n }\n }\n\n #handleMouseEnter(): void {\n if (!this.openOnHover) return;\n\n this.#clearHoverTimeout();\n this.#hoverTimeout = globalThis.setTimeout(() => {\n this.setOpen(true);\n }, this.delay);\n }\n\n #handleMouseLeave(event: MouseEvent): void {\n if (!this.openOnHover) return;\n\n if (event.relatedTarget && this.#popupElement?.contains(event.relatedTarget as Node)) return;\n\n this.#clearHoverTimeout();\n this.#hoverTimeout = globalThis.setTimeout(() => {\n this.setOpen(false);\n }, this.closeDelay);\n }\n\n #handleFocusIn(_event: FocusEvent): void {\n this.setOpen(true);\n }\n\n #handleFocusOut(event: FocusEvent): void {\n const relatedTarget = event.relatedTarget as HTMLElement;\n if (relatedTarget && relatedTarget.hasAttribute('data-focus-guard')) return;\n\n this.setOpen(false);\n };\n}\n\nexport class MediaPopoverTrigger extends HTMLElement {\n connectedCallback(): void {\n this.style.display = 'contents';\n\n const triggerElement = this.firstElementChild as HTMLElement;\n if (triggerElement) {\n triggerElement.setAttribute('aria-haspopup', 'true');\n triggerElement.setAttribute('aria-expanded', 'false');\n\n const mutationObserver = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (mutation.type === 'attributes') {\n const rootElement = this.closest('media-popover-root') as MediaPopoverRoot;\n let popupElement = rootElement.querySelector('media-popover-popup') as MediaPopoverPopup;\n\n if (!popupElement) {\n const portalElement = rootElement.querySelector('media-popover-portal') as MediaPopoverPortal;\n if (!portalElement) {\n return;\n }\n\n popupElement = portalElement.querySelector('media-popover-popup') as MediaPopoverPopup;\n if (!popupElement) {\n return;\n }\n }\n\n const attributeName = mutation.attributeName;\n if (!attributeName || !attributeName.startsWith('data-')) {\n return;\n }\n\n const attributeValue = triggerElement.getAttribute(attributeName);\n if (attributeValue !== null) {\n popupElement.setAttribute(attributeName, attributeValue);\n } else {\n popupElement.removeAttribute(attributeName);\n }\n }\n });\n });\n\n mutationObserver.observe(triggerElement, {\n attributes: true,\n });\n }\n }\n}\n\nexport class MediaPopoverPortal extends HTMLElement {\n #portal: HTMLElement | null = null;\n #childrenArray: Element[] = [];\n #guards: HTMLElement[] = [];\n\n connectedCallback(): void {\n this.style.display = 'contents';\n this.#setupPortal();\n }\n\n disconnectedCallback(): void {\n this.#cleanupPortal();\n }\n\n querySelector(selector: string): HTMLElement | null {\n return this.#portal!.querySelector(selector);\n }\n\n querySelectorAll(selector: string): NodeListOf<Element> {\n return this.#portal!.querySelectorAll(selector);\n }\n\n handleEvent(event: Event): void {\n this.dispatchEvent(new Event(event.type, { bubbles: true }));\n }\n\n #setupPortal(): void {\n const portalId = this.getAttribute('root-id') ?? '@default_portal_id';\n if (!portalId) return;\n\n /* @TODO We need to make sure portal logic is non-brittle longer term (CJP) */\n // NOTE: Hacky solution in part to ensure styling propogates from skin to container's baked in portal (TL;DR - Shadow DOM vs. Light DOM CSS) (CJP)\n const portalContainer\n = ((this.getRootNode() as ShadowRoot | Document).getElementById(portalId)\n ?? (this.getRootNode() as ShadowRoot | Document)\n .querySelector('media-container')\n ?.shadowRoot\n ?.getElementById(portalId))\n ? (this.getRootNode() as ShadowRoot | Document).querySelector('media-container')\n : undefined;\n if (!portalContainer) return;\n\n this.#portal = document.createElement('div');\n this.#portal.slot = 'portal';\n this.#portal.id = uniqueId();\n\n this.#childrenArray = Array.from(this.children);\n this.#portal.append(...this.#childrenArray);\n portalContainer.append(this.#portal);\n }\n\n #cleanupPortal(): void {\n if (!this.#portal) return;\n\n this.removeGuards();\n\n this.append(...this.#childrenArray);\n this.#portal.remove();\n this.#portal = null;\n this.#childrenArray = [];\n }\n\n renderGuards(): void {\n if (!this.#portal) return;\n\n if (this.#guards.length === 0) {\n const beforeInsideGuard = createFocusGuard('inside');\n const afterInsideGuard = createFocusGuard('inside');\n const beforeOutsideGuard = createFocusGuard('outside');\n const afterOutsideGuard = createFocusGuard('outside');\n\n beforeOutsideGuard.addEventListener('focus', (event: FocusEvent) => {\n if (this.#portal && isOutsideEvent(event, this.#portal)) {\n beforeInsideGuard.focus();\n } else {\n getPreviousTabbable(this)?.focus();\n }\n });\n\n afterOutsideGuard.addEventListener('focus', (event: FocusEvent) => {\n if (this.#portal && isOutsideEvent(event, this.#portal)) {\n afterInsideGuard.focus();\n } else {\n getNextTabbable(this)?.focus();\n }\n });\n\n beforeInsideGuard.addEventListener('focus', (event: FocusEvent) => {\n if (this.#portal && isOutsideEvent(event, this.#portal)) {\n getNextTabbable(this.#portal)?.focus();\n } else {\n beforeOutsideGuard.focus();\n }\n });\n\n afterInsideGuard.addEventListener('focus', (event: FocusEvent) => {\n if (this.#portal && isOutsideEvent(event, this.#portal)) {\n getPreviousTabbable(this.#portal)?.focus();\n } else {\n afterOutsideGuard.focus();\n }\n });\n\n // Add guards to portal element (outside guards)\n this.prepend(beforeOutsideGuard);\n this.append(afterOutsideGuard);\n\n // Add guards to portal container (inside guards)\n this.#portal.prepend(beforeInsideGuard);\n this.#portal.append(afterInsideGuard);\n\n this.#guards = [beforeOutsideGuard, afterOutsideGuard, beforeInsideGuard, afterInsideGuard];\n }\n }\n\n removeGuards(): void {\n this.#guards.forEach(guard => guard.remove());\n this.#guards = [];\n }\n}\n\nfunction createFocusGuard(dataType: 'inside' | 'outside'): HTMLElement {\n const focusGuard = document.createElement('span');\n focusGuard.setAttribute('data-type', dataType);\n focusGuard.setAttribute('tabindex', '0');\n focusGuard.toggleAttribute('data-focus-guard', true);\n return focusGuard;\n}\n\nexport class MediaPopoverPositioner extends HTMLElement {\n connectedCallback(): void {\n this.style.display = 'contents';\n\n const popup = this.firstElementChild as HTMLElement;\n if (popup) {\n Object.assign(popup.style, {\n position: 'absolute',\n top: '0',\n left: '0',\n });\n }\n }\n\n get side(): Placement {\n return this.getAttribute('side') as Placement;\n }\n\n get sideOffset(): number {\n return Number.parseInt(this.getAttribute('side-offset') ?? '0', 10);\n }\n}\n\nexport class MediaPopoverPopup extends HTMLElement {\n connectedCallback(): void {\n this.setAttribute('role', 'dialog');\n this.setAttribute('aria-modal', 'false');\n this.id = uniqueId();\n }\n}\n\nif (!globalThis.customElements.get('media-popover-root')) {\n globalThis.customElements.define('media-popover-root', MediaPopoverRoot);\n}\n\nif (!globalThis.customElements.get('media-popover-trigger')) {\n globalThis.customElements.define('media-popover-trigger', MediaPopoverTrigger);\n}\n\nif (!globalThis.customElements.get('media-popover-portal')) {\n globalThis.customElements.define('media-popover-portal', MediaPopoverPortal);\n}\n\nif (!globalThis.customElements.get('media-popover-positioner')) {\n globalThis.customElements.define('media-popover-positioner', MediaPopoverPositioner);\n}\n\nif (!globalThis.customElements.get('media-popover-popup')) {\n globalThis.customElements.define('media-popover-popup', MediaPopoverPopup);\n}\n\nexport const Popover: {\n Root: typeof MediaPopoverRoot;\n Trigger: typeof MediaPopoverTrigger;\n Portal: typeof MediaPopoverPortal;\n Positioner: typeof MediaPopoverPositioner;\n Popup: typeof MediaPopoverPopup;\n} = {\n Root: MediaPopoverRoot,\n Trigger: MediaPopoverTrigger,\n Portal: MediaPopoverPortal,\n Positioner: MediaPopoverPositioner,\n Popup: MediaPopoverPopup,\n};\n\nexport default Popover;\n","import type { ConnectedComponentConstructor, PropsHook, StateHook } from '../utils/component-factory';\n\nimport { TimeSlider as CoreTimeSlider } from '@videojs/core';\nimport { timeSliderStateDefinition } from '@videojs/core/store';\n\nimport { setAttributes } from '@videojs/utils/dom';\nimport { toConnectedHTMLComponent } from '../utils/component-factory';\n\ninterface TimeSliderRootState {\n currentTime: number;\n duration: number;\n requestSeek: (time: number) => void;\n core: CoreTimeSlider | null;\n}\n\n/**\n * TimeSlider Root props hook - equivalent to React's useTimeSliderRootProps\n * Handles element attributes and properties based on state\n */\nexport const getTimeSliderRootProps: PropsHook<{\n currentTime: number;\n duration: number;\n requestSeek: (time: number) => void;\n core: CoreTimeSlider | null;\n}> = (state, element) => {\n const formatTime = (time: number) => {\n const minutes = Math.floor(time / 60);\n const seconds = Math.floor(time % 60);\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n };\n\n const currentTimeText = formatTime(state.currentTime);\n const durationText = formatTime(state.duration);\n\n const baseProps: Record<string, any> = {\n role: 'slider',\n tabindex: element.getAttribute('tabindex') ?? '0',\n 'data-current-time': state.currentTime.toString(),\n 'data-duration': state.duration.toString(),\n 'data-orientation': (element as any).orientation || 'horizontal',\n 'aria-label': 'Seek',\n 'aria-valuemin': '0',\n 'aria-valuemax': Math.round(state.duration).toString(),\n 'aria-valuenow': Math.round(state.currentTime).toString(),\n 'aria-valuetext': `${currentTimeText} of ${durationText}`,\n 'aria-orientation': (element as any).orientation || 'horizontal',\n };\n\n return baseProps;\n};\n\nexport class TimeSliderRootBase extends HTMLElement {\n static readonly observedAttributes: readonly string[] = ['orientation'];\n\n _state: TimeSliderRootState | undefined;\n _core: CoreTimeSlider | null = null;\n\n get currentTime(): number {\n return this._state?.currentTime ?? 0;\n }\n\n get duration(): number {\n return this._state?.duration ?? 0;\n }\n\n get orientation(): 'horizontal' | 'vertical' {\n return (this.getAttribute('orientation') as 'horizontal' | 'vertical') || 'horizontal';\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, _newValue: string | null): void {\n if (name === 'orientation' && this._state) {\n this._render(getTimeSliderRootProps(this._state, this), this._state);\n }\n }\n\n _update(_props: any, state: any): void {\n this._state = state;\n\n if (state && !this._core) {\n this._core = new CoreTimeSlider();\n this._core.subscribe(() => this._render(getTimeSliderRootProps(state, this), state));\n this._core.attach(this);\n state.core = this._core;\n }\n\n this._core?.setState(state);\n }\n\n _render(props: any, state: any): void {\n const coreState = state?.core?.getState();\n if (!coreState) return;\n\n this.style.setProperty('--slider-fill', `${Math.round(coreState._fillWidth)}%`);\n this.style.setProperty('--slider-pointer', `${Math.round(coreState._pointerWidth)}%`);\n\n setAttributes(this, props);\n }\n}\n\nexport class TimeSliderTrackBase extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback(): void {\n // Set this element as the track element in the core TimeSlider\n const rootElement = this.closest('media-time-slider-root') as any;\n if (rootElement?._state?.core) {\n rootElement._state.core.setState({ _trackElement: this });\n }\n }\n\n _update(props: any, _state: any): void {\n setAttributes(this, props);\n\n if (props['data-orientation'] === 'horizontal') {\n this.style.width = '100%';\n this.style.removeProperty('height');\n } else {\n this.style.height = '100%';\n this.style.removeProperty('width');\n }\n }\n}\n\nexport class TimeSliderProgressBase extends HTMLElement {\n constructor() {\n super();\n this.style.position = 'absolute';\n this.style.width = 'var(--slider-fill, 0%)';\n this.style.height = '100%';\n }\n\n _update(props: any, _state: any): void {\n setAttributes(this, props);\n\n if (props['data-orientation'] === 'horizontal') {\n this.style.width = 'var(--slider-fill, 0%)';\n this.style.height = '100%';\n this.style.top = '0';\n this.style.removeProperty('bottom');\n } else {\n this.style.height = 'var(--slider-fill, 0%)';\n this.style.width = '100%';\n this.style.bottom = '0';\n this.style.removeProperty('top');\n }\n }\n}\n\nexport class TimeSliderPointerBase extends HTMLElement {\n constructor() {\n super();\n this.style.position = 'absolute';\n this.style.width = 'var(--slider-pointer, 0%)';\n this.style.height = '100%';\n }\n\n _update(props: any, _state: any): void {\n setAttributes(this, props);\n\n if (props['data-orientation'] === 'horizontal') {\n this.style.width = 'var(--slider-pointer, 0%)';\n this.style.height = '100%';\n this.style.top = '0';\n this.style.removeProperty('bottom');\n } else {\n this.style.height = 'var(--slider-pointer, 0%)';\n this.style.width = '100%';\n this.style.bottom = '0';\n this.style.removeProperty('top');\n }\n }\n}\n\nexport class TimeSliderThumbBase extends HTMLElement {\n constructor() {\n super();\n this.style.position = 'absolute';\n }\n\n _update(props: any, _state: any): void {\n setAttributes(this, props);\n\n // Set appropriate positioning based on orientation\n if (props['data-orientation'] === 'horizontal') {\n this.style.left = 'var(--slider-fill, 0%)';\n this.style.top = '50%';\n this.style.transform = 'translate(-50%, -50%)';\n } else {\n this.style.bottom = 'var(--slider-fill, 0%)';\n this.style.left = '50%';\n this.style.transform = 'translate(-50%, 50%)';\n }\n }\n}\n\nexport const useTimeSliderRootState: StateHook<{\n currentTime: number;\n duration: number;\n requestSeek: (time: number) => void;\n core: CoreTimeSlider | null;\n}> = {\n keys: timeSliderStateDefinition.keys,\n transform: (rawState, mediaStore) => ({\n ...timeSliderStateDefinition.stateTransform(rawState),\n ...timeSliderStateDefinition.createRequestMethods(mediaStore.dispatch),\n core: null,\n }),\n};\n\nexport const getTimeSliderTrackProps: PropsHook<Record<string, never>> = (_state, element) => {\n const rootElement = element.closest('media-time-slider-root') as any;\n return {\n 'data-orientation': rootElement?.orientation || 'horizontal',\n };\n};\n\nexport const getTimeSliderProgressProps: PropsHook<Record<string, never>> = (_state, element) => {\n const rootElement = element.closest('media-time-slider-root') as any;\n return {\n 'data-orientation': rootElement?.orientation || 'horizontal',\n };\n};\n\nexport const getTimeSliderPointerProps: PropsHook<Record<string, never>> = (_state, element) => {\n const rootElement = element.closest('media-time-slider-root') as any;\n return {\n 'data-orientation': rootElement?.orientation || 'horizontal',\n };\n};\n\nexport const getTimeSliderThumbProps: PropsHook<Record<string, never>> = (_state, element) => {\n const rootElement = element.closest('media-time-slider-root') as any;\n return {\n 'data-orientation': rootElement?.orientation || 'horizontal',\n };\n};\n\nexport const TimeSliderRoot: ConnectedComponentConstructor<{\n currentTime: number;\n duration: number;\n requestSeek: (time: number) => void;\n core: CoreTimeSlider | null;\n}> = toConnectedHTMLComponent(TimeSliderRootBase, useTimeSliderRootState, getTimeSliderRootProps, 'TimeSliderRoot');\n\nexport const TimeSliderTrack: ConnectedComponentConstructor<any> = toConnectedHTMLComponent(\n TimeSliderTrackBase,\n { keys: [], transform: () => ({}) },\n getTimeSliderTrackProps,\n 'TimeSliderTrack',\n);\n\nexport const TimeSliderProgress: ConnectedComponentConstructor<any> = toConnectedHTMLComponent(\n TimeSliderProgressBase,\n { keys: [], transform: () => ({}) },\n getTimeSliderProgressProps,\n 'TimeSliderProgress',\n);\n\nexport const TimeSliderPointer: ConnectedComponentConstructor<any> = toConnectedHTMLComponent(\n TimeSliderPointerBase,\n { keys: [], transform: () => ({}) },\n getTimeSliderPointerProps,\n 'TimeSliderPointer',\n);\n\nexport const TimeSliderThumb: ConnectedComponentConstructor<any> = toConnectedHTMLComponent(\n TimeSliderThumbBase,\n { keys: [], transform: () => ({}) },\n getTimeSliderThumbProps,\n 'TimeSliderThumb',\n);\n\nexport const TimeSlider = Object.assign(\n {},\n {\n Root: TimeSliderRoot,\n Track: TimeSliderTrack,\n Progress: TimeSliderProgress,\n Pointer: TimeSliderPointer,\n Thumb: TimeSliderThumb,\n },\n) as {\n Root: typeof TimeSliderRoot;\n Track: typeof TimeSliderTrack;\n Progress: typeof TimeSliderProgress;\n Pointer: typeof TimeSliderPointer;\n Thumb: typeof TimeSliderThumb;\n};\n\nif (!globalThis.customElements.get('media-time-slider-root')) {\n globalThis.customElements.define('media-time-slider-root', TimeSliderRoot);\n}\n\nif (!globalThis.customElements.get('media-time-slider-track')) {\n globalThis.customElements.define('media-time-slider-track', TimeSliderTrack);\n}\n\nif (!globalThis.customElements.get('media-time-slider-progress')) {\n globalThis.customElements.define('media-time-slider-progress', TimeSliderProgress);\n}\n\nif (!globalThis.customElements.get('media-time-slider-pointer')) {\n globalThis.customElements.define('media-time-slider-pointer', TimeSliderPointer);\n}\n\nif (!globalThis.customElements.get('media-time-slider-thumb')) {\n globalThis.customElements.define('media-time-slider-thumb', TimeSliderThumb);\n}\n\nexport default TimeSlider;\n","import type { Placement } from '@floating-ui/dom';\nimport type { MediaContainer } from '@/media/media-container';\n\nimport { arrow, autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { uniqueId } from '@videojs/utils';\n\nexport class MediaTooltipRoot extends HTMLElement {\n #open = false;\n #hoverTimeout: ReturnType<typeof setTimeout> | null = null;\n #cleanup: (() => void) | null = null;\n #arrowElement: HTMLElement | null = null;\n #mousePosition = { x: 0, y: 0 };\n #transitionStatus: 'initial' | 'open' | 'close' | 'unmounted' = 'initial';\n\n constructor() {\n super();\n this.addEventListener('mouseenter', this);\n this.addEventListener('mouseleave', this);\n this.addEventListener('mousemove', this);\n }\n\n handleEvent(event: Event): void {\n if (event.type === 'mouseenter') {\n this.#handleMouseEnter();\n } else if (event.type === 'mouseleave') {\n this.#handleMouseLeave();\n } else if (event.type === 'mousemove') {\n this.#handleMouseMove(event as MouseEvent);\n }\n }\n\n connectedCallback(): void {\n this.#updateVisibility();\n }\n\n disconnectedCallback(): void {\n this.#clearHoverTimeout();\n this.#cleanup?.();\n\n this.#transitionStatus = 'unmounted';\n this.#updateVisibility();\n }\n\n static get observedAttributes(): string[] {\n return ['delay', 'close-delay', 'track-cursor-axis'];\n }\n\n get delay(): number {\n return Number.parseInt(this.getAttribute('delay') ?? '0', 10);\n }\n\n get closeDelay(): number {\n return Number.parseInt(this.getAttribute('close-delay') ?? '0', 10);\n }\n\n get trackCursorAxis(): 'x' | 'y' | 'both' | undefined {\n const value = this.getAttribute('track-cursor-axis');\n return value === 'x' || value === 'y' || value === 'both' ? value : undefined;\n }\n\n get #triggerElement(): MediaTooltipTrigger | null {\n return this.querySelector('media-tooltip-trigger') as MediaTooltipTrigger | null;\n }\n\n get #portalElement(): MediaTooltipPortal | null {\n return this.querySelector('media-tooltip-portal') as MediaTooltipPortal | null;\n }\n\n get #positionerElement(): MediaTooltipPositioner | null {\n return this.#portalElement?.querySelector('media-tooltip-positioner') as MediaTooltipPositioner | null;\n }\n\n get #popupElement(): MediaTooltipPopup | null {\n return this.#portalElement?.querySelector('media-tooltip-popup') as MediaTooltipPopup | null;\n }\n\n #setOpen(open: boolean): void {\n if (this.#open === open) return;\n\n this.#open = open;\n\n if (open) {\n this.#transitionStatus = 'initial';\n requestAnimationFrame(() => {\n this.#transitionStatus = 'open';\n this.#updateVisibility();\n });\n } else {\n this.#transitionStatus = 'close';\n }\n\n this.#updateVisibility();\n\n if (open) {\n this.#setupFloating();\n } else {\n this.#cleanup?.();\n this.#cleanup = null;\n }\n }\n\n #updateVisibility(): void {\n this.style.display = 'contents';\n\n if (this.#popupElement) {\n const placement = this.#positionerElement?.side ?? 'top';\n this.#popupElement.setAttribute('data-side', placement);\n\n this.#popupElement.toggleAttribute('data-starting-style', this.#transitionStatus === 'initial');\n this.#popupElement.toggleAttribute('data-open', this.#transitionStatus === 'initial' || this.#transitionStatus === 'open');\n this.#popupElement.toggleAttribute('data-ending-style', this.#transitionStatus === 'close' || this.#transitionStatus === 'unmounted');\n this.#popupElement.toggleAttribute('data-closed', this.#transitionStatus === 'close' || this.#transitionStatus === 'unmounted');\n }\n\n const triggerElement = this.#triggerElement?.firstElementChild as HTMLElement;\n if (triggerElement) {\n triggerElement.toggleAttribute('data-popup-open', this.#open);\n }\n }\n\n #setupFloating(): void {\n if (!this.#triggerElement || !this.#popupElement) return;\n\n const trigger = this.#triggerElement.firstElementChild as HTMLElement;\n const popup = this.#popupElement;\n\n if (!trigger || !popup) return;\n\n const placement = this.#positionerElement?.side ?? 'top';\n const sideOffset = this.#positionerElement?.sideOffset ?? 0;\n const collisionPadding = this.#positionerElement?.collisionPadding ?? 0;\n const mediaContainer = this.closest('media-container') as MediaContainer;\n\n this.#arrowElement = popup.querySelector('media-tooltip-arrow') as HTMLElement;\n\n const updatePosition = () => {\n const middleware = [\n offset(sideOffset),\n flip(),\n shift({\n boundary: mediaContainer,\n padding: collisionPadding,\n }),\n ];\n\n if (this.#arrowElement) {\n middleware.push(arrow({ element: this.#arrowElement }));\n }\n\n const referenceElement = this.trackCursorAxis\n ? {\n getBoundingClientRect: () => {\n const triggerRect = trigger.getBoundingClientRect();\n\n if (this.trackCursorAxis === 'x') {\n return {\n width: 0,\n height: 0,\n top: triggerRect.top,\n right: this.#mousePosition.x,\n bottom: triggerRect.bottom,\n left: this.#mousePosition.x,\n x: this.#mousePosition.x,\n y: triggerRect.top,\n };\n } else if (this.trackCursorAxis === 'y') {\n return {\n width: 0,\n height: 0,\n top: this.#mousePosition.y,\n right: triggerRect.right,\n bottom: this.#mousePosition.y,\n left: triggerRect.left,\n x: triggerRect.left,\n y: this.#mousePosition.y,\n };\n } else {\n // Track both axes (trackCursorAxis === 'both')\n return {\n width: 0,\n height: 0,\n top: this.#mousePosition.y,\n right: this.#mousePosition.x,\n bottom: this.#mousePosition.y,\n left: this.#mousePosition.x,\n x: this.#mousePosition.x,\n y: this.#mousePosition.y,\n };\n }\n },\n }\n : trigger;\n\n computePosition(referenceElement, popup, {\n placement,\n middleware,\n }).then(({ x, y, middlewareData, placement: computedPlacement }: { x: number; y: number; middlewareData: any; placement: Placement }) => {\n Object.assign(popup.style, {\n left: `${x}px`,\n top: `${y}px`,\n });\n\n popup.setAttribute('data-side', computedPlacement);\n\n if (this.#arrowElement && middlewareData.arrow) {\n const { x: arrowX, y: arrowY } = middlewareData.arrow;\n Object.assign(this.#arrowElement.style, {\n left: arrowX != null ? `${arrowX}px` : undefined,\n top: arrowY != null ? `${arrowY}px` : undefined,\n });\n }\n });\n };\n\n updatePosition();\n\n if (!this.trackCursorAxis) {\n this.#cleanup = autoUpdate(trigger, popup, updatePosition);\n }\n }\n\n #updatePosition(): void {\n if (this.#open && this.trackCursorAxis) {\n this.#setupFloating();\n }\n }\n\n #clearHoverTimeout(): void {\n if (this.#hoverTimeout) {\n clearTimeout(this.#hoverTimeout);\n this.#hoverTimeout = null;\n }\n }\n\n #handleMouseEnter(): void {\n this.#clearHoverTimeout();\n this.#hoverTimeout = globalThis.setTimeout(() => {\n this.#setOpen(true);\n }, this.delay);\n }\n\n #handleMouseLeave(): void {\n this.#clearHoverTimeout();\n this.#hoverTimeout = globalThis.setTimeout(() => {\n this.#setOpen(false);\n }, this.closeDelay);\n }\n\n #handleMouseMove(event: MouseEvent): void {\n if (this.trackCursorAxis) {\n this.#mousePosition = { x: event.clientX, y: event.clientY };\n\n if (this.#open) {\n this.#updatePosition();\n }\n }\n }\n}\n\nexport class MediaTooltipTrigger extends HTMLElement {\n connectedCallback(): void {\n this.style.display = 'contents';\n\n const triggerElement = this.firstElementChild as HTMLElement;\n if (triggerElement) {\n const mutationObserver = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (mutation.type === 'attributes') {\n const rootElement = this.closest('media-tooltip-root') as MediaTooltipRoot;\n let popupElement = rootElement.querySelector('media-tooltip-popup') as MediaTooltipPopup;\n\n if (!popupElement) {\n const portalElement = rootElement.querySelector('media-tooltip-portal') as MediaTooltipPortal;\n if (!portalElement) {\n return;\n }\n\n popupElement = portalElement.querySelector('media-tooltip-popup') as MediaTooltipPopup;\n if (!popupElement) {\n return;\n }\n }\n\n const attributeName = mutation.attributeName;\n if (!attributeName || !attributeName.startsWith('data-')) {\n return;\n }\n\n const attributeValue = triggerElement.getAttribute(attributeName);\n if (attributeValue !== null) {\n popupElement.setAttribute(attributeName, attributeValue);\n } else {\n popupElement.removeAttribute(attributeName);\n }\n }\n });\n });\n\n mutationObserver.observe(triggerElement, {\n attributes: true,\n });\n }\n }\n}\n\nexport class MediaTooltipPortal extends HTMLElement {\n #portal: HTMLElement | null = null;\n\n connectedCallback(): void {\n this.style.display = 'contents';\n this.#setupPortal();\n }\n\n disconnectedCallback(): void {\n this.#cleanupPortal();\n }\n\n querySelector(selector: string): HTMLElement | null {\n return this.#portal?.querySelector(selector) ?? null;\n }\n\n #setupPortal(): void {\n const portalId = this.getAttribute('root-id') ?? '@default_portal_id';\n if (!portalId) return;\n\n /* @TODO We need to make sure portal logic is non-brittle longer term (CJP) */\n // NOTE: Hacky solution in part to ensure styling propogates from skin to container's baked in portal (TL;DR - Shadow DOM vs. Light DOM CSS) (CJP)\n const portalContainer\n = ((this.getRootNode() as ShadowRoot | Document).getElementById(portalId)\n ?? (this.getRootNode() as ShadowRoot | Document)\n .querySelector('media-container')\n ?.shadowRoot\n ?.getElementById(portalId))\n ? (this.getRootNode() as ShadowRoot | Document).querySelector('media-container')\n : undefined;\n if (!portalContainer) return;\n\n this.#portal = document.createElement('div');\n this.#portal.slot = 'portal';\n this.#portal.id = uniqueId();\n portalContainer.append(this.#portal);\n\n this.#portal.append(...this.children);\n }\n\n #cleanupPortal(): void {\n if (!this.#portal) return;\n\n // Move children back to the portal element\n this.append(...this.#portal.children);\n this.#portal.remove();\n this.#portal = null;\n }\n}\n\nexport class MediaTooltipPositioner extends HTMLElement {\n connectedCallback(): void {\n this.style.display = 'contents';\n\n const popup = this.firstElementChild as HTMLElement;\n if (popup) {\n Object.assign(popup.style, {\n position: 'absolute',\n top: '0',\n left: '0',\n });\n }\n }\n\n get side(): Placement {\n return (this.getAttribute('side') as Placement) ?? 'top';\n }\n\n get sideOffset(): number {\n return Number.parseInt(this.getAttribute('side-offset') ?? '0', 10);\n }\n\n get collisionPadding(): number {\n return Number.parseInt(this.getAttribute('collision-padding') ?? '0', 10);\n }\n}\n\nexport class MediaTooltipPopup extends HTMLElement {\n connectedCallback(): void {\n this.setAttribute('role', 'tooltip');\n }\n}\n\nexport class MediaTooltipArrow extends HTMLElement {\n connectedCallback(): void {\n this.setAttribute('aria-hidden', 'true');\n }\n}\n\nif (!globalThis.customElements.get('media-tooltip-root')) {\n globalThis.customElements.define('media-tooltip-root', MediaTooltipRoot);\n}\n\nif (!globalThis.customElements.get('media-tooltip-trigger')) {\n globalThis.customElements.define('media-tooltip-trigger', MediaTooltipTrigger);\n}\n\nif (!globalThis.customElements.get('media-tooltip-portal')) {\n globalThis.customElements.define('media-tooltip-portal', MediaTooltipPortal);\n}\n\nif (!globalThis.customElements.get('media-tooltip-positioner')) {\n globalThis.customElements.define('media-tooltip-positioner', MediaTooltipPositioner);\n}\n\nif (!globalThis.customElements.get('media-tooltip-popup')) {\n globalThis.customElements.define('media-tooltip-popup', MediaTooltipPopup);\n}\n\nif (!globalThis.customElements.get('media-tooltip-arrow')) {\n globalThis.customElements.define('media-tooltip-arrow', MediaTooltipArrow);\n}\n\nexport const Tooltip: {\n Root: typeof MediaTooltipRoot;\n Trigger: typeof MediaTooltipTrigger;\n Portal: typeof MediaTooltipPortal;\n Positioner: typeof MediaTooltipPositioner;\n Popup: typeof MediaTooltipPopup;\n Arrow: typeof MediaTooltipArrow;\n} = {\n Root: MediaTooltipRoot,\n Trigger: MediaTooltipTrigger,\n Portal: MediaTooltipPortal,\n Positioner: MediaTooltipPositioner,\n Popup: MediaTooltipPopup,\n Arrow: MediaTooltipArrow,\n};\n\nexport default Tooltip;\n","import type { ConnectedComponentConstructor, PropsHook, StateHook } from '../utils/component-factory';\n\nimport { VolumeSlider as CoreVolumeSlider } from '@videojs/core';\nimport { volumeSliderStateDefinition } from '@videojs/core/store';\n\nimport { setAttributes } from '@videojs/utils/dom';\nimport { toConnectedHTMLComponent } from '../utils/component-factory';\n\n/**\n * VolumeSlider Root props hook - equivalent to React's useVolumeSliderRootProps\n * Handles element attributes and properties based on state\n */\nexport const getVolumeSliderRootProps: PropsHook<{\n volume: number;\n muted: boolean;\n volumeLevel: string;\n requestVolumeChange: (volume: number) => void;\n core: CoreVolumeSlider | null;\n}> = (state, element) => {\n const volumeText = `${Math.round(state.muted ? 0 : state.volume * 100)}%`;\n\n const baseProps: Record<string, any> = {\n role: 'slider',\n tabindex: element.getAttribute('tabindex') ?? '0',\n 'data-muted': state.muted.toString(),\n 'data-volume-level': state.volumeLevel,\n 'data-orientation': (element as any).orientation || 'horizontal',\n 'aria-label': 'Volume',\n 'aria-valuemin': '0',\n 'aria-valuemax': '100',\n 'aria-valuetext': volumeText,\n 'aria-orientation': (element as any).orientation || 'horizontal',\n };\n\n return baseProps;\n};\n\n/**\n * VolumeSlider Root component - Main container with pointer event handling\n */\ninterface VolumeSliderRootState {\n volume: number;\n muted: boolean;\n volumeLevel: string;\n requestVolumeChange: (volume: number) => void;\n core: CoreVolumeSlider | null;\n}\n\nexport class VolumeSliderRootBase extends HTMLElement {\n static readonly observedAttributes: readonly string[] = ['orientation'];\n\n _state: VolumeSliderRootState | undefined;\n _core: CoreVolumeSlider | null = null;\n\n get volume(): number | undefined {\n return this._state?.volume;\n }\n\n get muted(): boolean {\n return this._state?.muted ?? false;\n }\n\n get volumeLevel(): string {\n return this._state?.volumeLevel ?? 'high';\n }\n\n get orientation(): 'horizontal' | 'vertical' {\n return (this.getAttribute('orientation') as 'horizontal' | 'vertical') || 'horizontal';\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, _newValue: string | null): void {\n if (name === 'orientation' && this._state) {\n this._render(getVolumeSliderRootProps(this._state, this), this._state);\n }\n }\n\n _update(_props: any, state: any): void {\n this._state = state;\n\n if (state && !this._core) {\n this._core = new CoreVolumeSlider();\n this._core.subscribe(() => this._render(getVolumeSliderRootProps(state, this), state));\n this._core.attach(this);\n state.core = this._core;\n }\n\n this._core?.setState(state);\n }\n\n _render(props: any, state: any): void {\n const coreState = state?.core?.getState();\n if (!coreState) return;\n\n this.style.setProperty('--slider-fill', `${coreState._fillWidth.toFixed(3)}%`);\n this.style.setProperty('--slider-pointer', `${coreState._pointerWidth.toFixed(3)}%`);\n\n props['aria-valuenow'] = coreState._fillWidth.toString();\n\n setAttributes(this, props);\n }\n}\n\n/**\n * VolumeSlider Track component - Track element that captures pointer events\n */\nexport class VolumeSliderTrackBase extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback(): void {\n // Set this element as the track element in the core VolumeSlider\n const rootElement = this.closest('media-volume-slider-root') as any;\n if (rootElement?._state?.core) {\n rootElement._state.core.setState({ _trackElement: this });\n }\n }\n\n _update(props: any, _state: any): void {\n setAttributes(this, props);\n\n if (props['data-orientation'] === 'horizontal') {\n this.style.width = '100%';\n this.style.removeProperty('height');\n } else {\n this.style.height = '100%';\n this.style.removeProperty('width');\n }\n }\n}\n\n/**\n * VolumeSlider Progress component - Shows current progress\n */\nexport class VolumeSliderProgressBase extends HTMLElement {\n constructor() {\n super();\n this.style.position = 'absolute';\n this.style.width = 'var(--slider-fill, 0%)';\n this.style.height = '100%';\n }\n\n _update(props: any, _state: any): void {\n setAttributes(this, props);\n\n if (props['data-orientation'] === 'horizontal') {\n this.style.width = 'var(--slider-fill, 0%)';\n this.style.height = '100%';\n this.style.top = '0';\n this.style.removeProperty('bottom');\n } else {\n this.style.height = 'var(--slider-fill, 0%)';\n this.style.width = '100%';\n this.style.bottom = '0';\n this.style.removeProperty('top');\n }\n }\n}\n\n/**\n * VolumeSlider Thumb component - Draggable thumb element\n */\nexport class VolumeSliderThumbBase extends HTMLElement {\n constructor() {\n super();\n this.style.position = 'absolute';\n }\n\n _update(props: any, _state: any): void {\n setAttributes(this, props);\n\n // Set appropriate positioning based on orientation\n if (props['data-orientation'] === 'horizontal') {\n this.style.left = 'var(--slider-fill, 0%)';\n this.style.top = '50%';\n this.style.transform = 'translate(-50%, -50%)';\n } else {\n this.style.bottom = 'var(--slider-fill, 0%)';\n this.style.left = '50%';\n this.style.transform = 'translate(-50%, 50%)';\n }\n }\n}\n\n/**\n * VolumeSlider Root state hook - equivalent to React's useVolumeSliderRootState\n * Handles media store state subscription and transformation\n */\nexport const useVolumeSliderRootState: StateHook<{\n volume: number;\n muted: boolean;\n volumeLevel: string;\n requestVolumeChange: (volume: number) => void;\n core: CoreVolumeSlider | null;\n}> = {\n keys: volumeSliderStateDefinition.keys,\n transform: (rawState, mediaStore) => ({\n ...volumeSliderStateDefinition.stateTransform(rawState),\n ...volumeSliderStateDefinition.createRequestMethods(mediaStore.dispatch),\n core: null,\n }),\n};\n\n/**\n * VolumeSlider Track props hook\n */\nexport const getVolumeSliderTrackProps: PropsHook<Record<string, never>> = (_state, element) => {\n const rootElement = element.closest('media-volume-slider-root') as any;\n return {\n 'data-orientation': rootElement?.orientation || 'horizontal',\n };\n};\n\n/**\n * VolumeSlider Progress props hook\n */\nexport const getVolumeSliderProgressProps: PropsHook<Record<string, never>> = (_state, element) => {\n const rootElement = element.closest('media-volume-slider-root') as any;\n return {\n 'data-orientation': rootElement?.orientation || 'horizontal',\n };\n};\n\n/**\n * VolumeSlider Thumb props hook\n */\nexport const getVolumeSliderThumbProps: PropsHook<Record<string, never>> = (_state, element) => {\n const rootElement = element.closest('media-volume-slider-root') as any;\n return {\n 'data-orientation': rootElement?.orientation || 'horizontal',\n };\n};\n\n/**\n * Connected VolumeSlider Root component using hook-style architecture\n */\nexport const VolumeSliderRoot: ConnectedComponentConstructor<{\n volume: number;\n muted: boolean;\n volumeLevel: string;\n requestVolumeChange: (volume: number) => void;\n core: CoreVolumeSlider | null;\n}> = toConnectedHTMLComponent(VolumeSliderRootBase, useVolumeSliderRootState, getVolumeSliderRootProps, 'VolumeSliderRoot');\n\n/**\n * Connected VolumeSlider Track component\n */\nexport const VolumeSliderTrack: ConnectedComponentConstructor<any> = toConnectedHTMLComponent(\n VolumeSliderTrackBase,\n { keys: [], transform: () => ({}) },\n getVolumeSliderTrackProps,\n 'VolumeSliderTrack',\n);\n\n/**\n * Connected VolumeSlider Progress component\n */\nexport const VolumeSliderProgress: ConnectedComponentConstructor<any> = toConnectedHTMLComponent(\n VolumeSliderProgressBase,\n { keys: [], transform: () => ({}) },\n getVolumeSliderProgressProps,\n 'VolumeSliderProgress',\n);\n\n/**\n * Connected VolumeSlider Thumb component\n */\nexport const VolumeSliderThumb: ConnectedComponentConstructor<any> = toConnectedHTMLComponent(\n VolumeSliderThumbBase,\n { keys: [], transform: () => ({}) },\n getVolumeSliderThumbProps,\n 'VolumeSliderThumb',\n);\n\n/**\n * Compound VolumeSlider component object\n */\nexport const VolumeSlider = Object.assign(\n {},\n {\n Root: VolumeSliderRoot,\n Track: VolumeSliderTrack,\n Progress: VolumeSliderProgress,\n Thumb: VolumeSliderThumb,\n },\n) as {\n Root: typeof VolumeSliderRoot;\n Track: typeof VolumeSliderTrack;\n Progress: typeof VolumeSliderProgress;\n Thumb: typeof VolumeSliderThumb;\n};\n\nif (!globalThis.customElements.get('media-volume-slider-root')) {\n globalThis.customElements.define('media-volume-slider-root', VolumeSliderRoot);\n}\n\nif (!globalThis.customElements.get('media-volume-slider-track')) {\n globalThis.customElements.define('media-volume-slider-track', VolumeSliderTrack);\n}\n\nif (!globalThis.customElements.get('media-volume-slider-progress')) {\n globalThis.customElements.define('media-volume-slider-progress', VolumeSliderProgress);\n}\n\nif (!globalThis.customElements.get('media-volume-slider-thumb')) {\n globalThis.customElements.define('media-volume-slider-thumb', VolumeSliderThumb);\n}\n\nexport default VolumeSlider;\n","import type { Constructor, CustomElement } from '@open-wc/context-protocol';\n\nimport { ConsumerMixin } from '@open-wc/context-protocol';\n\n/* @TODO We need to make sure portal logic is non-brittle longer term (CJP) */\nexport function getTemplateHTML() {\n return /* html */ `\n <slot name=\"media\"></slot>\n <slot></slot>\n <div id=\"@default_portal_id\" style={ position: absolute; zIndex: 10; }>\n <slot name=\"portal\"></slot>\n </div>\n `;\n}\n\nconst CustomElementConsumer: Constructor<CustomElement> = ConsumerMixin(HTMLElement);\n\nexport class MediaContainer extends CustomElementConsumer {\n static shadowRootOptions = { mode: 'open' as ShadowRootMode };\n static getTemplateHTML: () => string = getTemplateHTML;\n\n _mediaStore: any;\n _mediaSlot: HTMLSlotElement;\n _paused: boolean = true;\n contexts = {\n mediaStore: (mediaStore: any): void => {\n this._mediaStore = mediaStore;\n this._handleMediaSlotChange();\n this._registerContainerStateOwner();\n this._subscribeToPlayState();\n },\n };\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow((this.constructor as typeof MediaContainer).shadowRootOptions);\n this.shadowRoot!.innerHTML = (this.constructor as typeof MediaContainer).getTemplateHTML();\n }\n\n this._mediaSlot = this.shadowRoot!.querySelector('slot[name=media]') as HTMLSlotElement;\n this._mediaSlot.addEventListener('slotchange', this._handleMediaSlotChange);\n\n // Add click handler for play/pause functionality\n this.addEventListener('click', this._handleClick);\n }\n\n connectedCallback(): void {\n super.connectedCallback?.();\n this._registerContainerStateOwner();\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback?.();\n this._unregisterContainerStateOwner();\n }\n\n _registerContainerStateOwner = (): void => {\n if (!this._mediaStore) return;\n this._mediaStore.dispatch({ type: 'containerstateownerchangerequest', detail: this });\n };\n\n _unregisterContainerStateOwner = (): void => {\n if (!this._mediaStore) return;\n this._mediaStore.dispatch({ type: 'containerstateownerchangerequest', detail: null });\n };\n\n _handleMediaSlotChange = (): void => {\n const media = this._mediaSlot.assignedElements({ flatten: true })[0];\n this._mediaStore.dispatch({ type: 'mediastateownerchangerequest', detail: media });\n };\n\n _handleClick = (event: Event): void => {\n if (!this._mediaStore) return;\n\n if (!['video', 'audio'].includes((event.target as HTMLElement).localName || '')) return;\n\n if (this._paused) {\n this._mediaStore.dispatch({ type: 'playrequest' });\n } else {\n this._mediaStore.dispatch({ type: 'pauserequest' });\n }\n };\n\n _subscribeToPlayState = (): void => {\n if (!this._mediaStore) return;\n\n // Subscribe to paused state changes\n this._mediaStore.subscribe((state: any) => {\n this._paused = state.paused ?? true;\n });\n };\n}\n\nif (!globalThis.customElements.get('media-container')) {\n // @ts-expect-error ts(2345)\n globalThis.customElements.define('media-container', MediaContainer);\n}\n","import type { Constructor, CustomElement } from '@open-wc/context-protocol';\nimport type { MediaStore } from '@videojs/core/store';\n\nimport { ProviderMixin } from '@open-wc/context-protocol';\nimport { createMediaStore } from '@videojs/core/store';\n\nconst ProviderHTMLElement: Constructor<CustomElement> = ProviderMixin(HTMLElement);\n\nexport class MediaProvider extends ProviderHTMLElement {\n contexts = {\n mediaStore: (): MediaStore => {\n return createMediaStore();\n },\n };\n}\n\n// @ts-expect-error - fix types after (Rahim)\ncustomElements.define('media-provider', MediaProvider);\n","export function getTemplateHTML() {\n return /* html */ `\n <style>\n :host {\n display: block;\n }\n\n media-container {\n display: block;\n width: 100%;\n height: 100%;\n }\n </style>\n <slot></slot>\n `;\n}\n\nexport class MediaSkin extends HTMLElement {\n static shadowRootOptions = { mode: 'open' as ShadowRootMode };\n static getTemplateHTML: () => string = getTemplateHTML;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow((this.constructor as typeof MediaSkin).shadowRootOptions);\n this.shadowRoot!.innerHTML = (this.constructor as typeof MediaSkin).getTemplateHTML();\n }\n }\n}\n\nif (!customElements.get('media-skin')) {\n customElements.define('media-skin', MediaSkin);\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { CurrentTimeDisplayState, DurationDisplayState, FullscreenButtonState, MediaStore, MuteButtonState, PlayButtonState } from "@videojs/core/store";
|
|
2
|
+
import { Constructor, CustomElement } from "@open-wc/context-protocol";
|
|
3
|
+
import { Placement } from "@floating-ui/dom";
|
|
4
|
+
import { TimeSlider, VolumeSlider } from "@videojs/core";
|
|
5
|
+
|
|
6
|
+
//#region src/utils/component-factory.d.ts
|
|
7
|
+
|
|
8
|
+
interface ConnectedComponentConstructor<State> {
|
|
9
|
+
new (state: State): HTMLElement;
|
|
10
|
+
}
|
|
11
|
+
//#endregion
|
|
12
|
+
//#region src/components/media-current-time-display.d.ts
|
|
13
|
+
|
|
14
|
+
declare const CurrentTimeDisplay: ConnectedComponentConstructor<CurrentTimeDisplayState>;
|
|
15
|
+
//#endregion
|
|
16
|
+
//#region src/components/media-duration-display.d.ts
|
|
17
|
+
|
|
18
|
+
declare const DurationDisplay: ConnectedComponentConstructor<DurationDisplayState>;
|
|
19
|
+
//#endregion
|
|
20
|
+
//#region src/components/media-fullscreen-button.d.ts
|
|
21
|
+
|
|
22
|
+
declare const FullscreenButton: ConnectedComponentConstructor<FullscreenButtonState>;
|
|
23
|
+
//#endregion
|
|
24
|
+
//#region src/components/media-mute-button.d.ts
|
|
25
|
+
|
|
26
|
+
declare const MuteButton: ConnectedComponentConstructor<MuteButtonState>;
|
|
27
|
+
//#endregion
|
|
28
|
+
//#region src/components/media-play-button.d.ts
|
|
29
|
+
declare const PlayButton: ConnectedComponentConstructor<PlayButtonState>;
|
|
30
|
+
//#endregion
|
|
31
|
+
//#region src/components/media-popover.d.ts
|
|
32
|
+
declare class MediaPopoverRoot extends HTMLElement {
|
|
33
|
+
#private;
|
|
34
|
+
connectedCallback(): void;
|
|
35
|
+
disconnectedCallback(): void;
|
|
36
|
+
handleEvent(event: Event): void;
|
|
37
|
+
static get observedAttributes(): string[];
|
|
38
|
+
get openOnHover(): boolean;
|
|
39
|
+
get delay(): number;
|
|
40
|
+
get closeDelay(): number;
|
|
41
|
+
setOpen(open: boolean): void;
|
|
42
|
+
}
|
|
43
|
+
declare class MediaPopoverTrigger extends HTMLElement {
|
|
44
|
+
connectedCallback(): void;
|
|
45
|
+
}
|
|
46
|
+
declare class MediaPopoverPortal extends HTMLElement {
|
|
47
|
+
#private;
|
|
48
|
+
connectedCallback(): void;
|
|
49
|
+
disconnectedCallback(): void;
|
|
50
|
+
querySelector(selector: string): HTMLElement | null;
|
|
51
|
+
querySelectorAll(selector: string): NodeListOf<Element>;
|
|
52
|
+
handleEvent(event: Event): void;
|
|
53
|
+
renderGuards(): void;
|
|
54
|
+
removeGuards(): void;
|
|
55
|
+
}
|
|
56
|
+
declare class MediaPopoverPositioner extends HTMLElement {
|
|
57
|
+
connectedCallback(): void;
|
|
58
|
+
get side(): Placement;
|
|
59
|
+
get sideOffset(): number;
|
|
60
|
+
}
|
|
61
|
+
declare class MediaPopoverPopup extends HTMLElement {
|
|
62
|
+
connectedCallback(): void;
|
|
63
|
+
}
|
|
64
|
+
declare const Popover: {
|
|
65
|
+
Root: typeof MediaPopoverRoot;
|
|
66
|
+
Trigger: typeof MediaPopoverTrigger;
|
|
67
|
+
Portal: typeof MediaPopoverPortal;
|
|
68
|
+
Positioner: typeof MediaPopoverPositioner;
|
|
69
|
+
Popup: typeof MediaPopoverPopup;
|
|
70
|
+
};
|
|
71
|
+
//#endregion
|
|
72
|
+
//#region src/components/media-time-slider.d.ts
|
|
73
|
+
|
|
74
|
+
declare const TimeSliderRoot: ConnectedComponentConstructor<{
|
|
75
|
+
currentTime: number;
|
|
76
|
+
duration: number;
|
|
77
|
+
requestSeek: (time: number) => void;
|
|
78
|
+
core: TimeSlider | null;
|
|
79
|
+
}>;
|
|
80
|
+
declare const TimeSliderTrack: ConnectedComponentConstructor<any>;
|
|
81
|
+
declare const TimeSliderProgress: ConnectedComponentConstructor<any>;
|
|
82
|
+
declare const TimeSliderPointer: ConnectedComponentConstructor<any>;
|
|
83
|
+
declare const TimeSliderThumb: ConnectedComponentConstructor<any>;
|
|
84
|
+
declare const TimeSlider$1: {
|
|
85
|
+
Root: typeof TimeSliderRoot;
|
|
86
|
+
Track: typeof TimeSliderTrack;
|
|
87
|
+
Progress: typeof TimeSliderProgress;
|
|
88
|
+
Pointer: typeof TimeSliderPointer;
|
|
89
|
+
Thumb: typeof TimeSliderThumb;
|
|
90
|
+
};
|
|
91
|
+
//#endregion
|
|
92
|
+
//#region src/components/media-tooltip.d.ts
|
|
93
|
+
declare class MediaTooltipRoot extends HTMLElement {
|
|
94
|
+
#private;
|
|
95
|
+
constructor();
|
|
96
|
+
handleEvent(event: Event): void;
|
|
97
|
+
connectedCallback(): void;
|
|
98
|
+
disconnectedCallback(): void;
|
|
99
|
+
static get observedAttributes(): string[];
|
|
100
|
+
get delay(): number;
|
|
101
|
+
get closeDelay(): number;
|
|
102
|
+
get trackCursorAxis(): "x" | "y" | "both" | undefined;
|
|
103
|
+
}
|
|
104
|
+
declare class MediaTooltipTrigger extends HTMLElement {
|
|
105
|
+
connectedCallback(): void;
|
|
106
|
+
}
|
|
107
|
+
declare class MediaTooltipPortal extends HTMLElement {
|
|
108
|
+
#private;
|
|
109
|
+
connectedCallback(): void;
|
|
110
|
+
disconnectedCallback(): void;
|
|
111
|
+
querySelector(selector: string): HTMLElement | null;
|
|
112
|
+
}
|
|
113
|
+
declare class MediaTooltipPositioner extends HTMLElement {
|
|
114
|
+
connectedCallback(): void;
|
|
115
|
+
get side(): Placement;
|
|
116
|
+
get sideOffset(): number;
|
|
117
|
+
get collisionPadding(): number;
|
|
118
|
+
}
|
|
119
|
+
declare class MediaTooltipPopup extends HTMLElement {
|
|
120
|
+
connectedCallback(): void;
|
|
121
|
+
}
|
|
122
|
+
declare class MediaTooltipArrow extends HTMLElement {
|
|
123
|
+
connectedCallback(): void;
|
|
124
|
+
}
|
|
125
|
+
declare const Tooltip: {
|
|
126
|
+
Root: typeof MediaTooltipRoot;
|
|
127
|
+
Trigger: typeof MediaTooltipTrigger;
|
|
128
|
+
Portal: typeof MediaTooltipPortal;
|
|
129
|
+
Positioner: typeof MediaTooltipPositioner;
|
|
130
|
+
Popup: typeof MediaTooltipPopup;
|
|
131
|
+
Arrow: typeof MediaTooltipArrow;
|
|
132
|
+
};
|
|
133
|
+
//#endregion
|
|
134
|
+
//#region src/components/media-volume-slider.d.ts
|
|
135
|
+
/**
|
|
136
|
+
* Connected VolumeSlider Root component using hook-style architecture
|
|
137
|
+
*/
|
|
138
|
+
declare const VolumeSliderRoot: ConnectedComponentConstructor<{
|
|
139
|
+
volume: number;
|
|
140
|
+
muted: boolean;
|
|
141
|
+
volumeLevel: string;
|
|
142
|
+
requestVolumeChange: (volume: number) => void;
|
|
143
|
+
core: VolumeSlider | null;
|
|
144
|
+
}>;
|
|
145
|
+
/**
|
|
146
|
+
* Connected VolumeSlider Track component
|
|
147
|
+
*/
|
|
148
|
+
declare const VolumeSliderTrack: ConnectedComponentConstructor<any>;
|
|
149
|
+
/**
|
|
150
|
+
* Connected VolumeSlider Progress component
|
|
151
|
+
*/
|
|
152
|
+
declare const VolumeSliderProgress: ConnectedComponentConstructor<any>;
|
|
153
|
+
/**
|
|
154
|
+
* Connected VolumeSlider Thumb component
|
|
155
|
+
*/
|
|
156
|
+
declare const VolumeSliderThumb: ConnectedComponentConstructor<any>;
|
|
157
|
+
/**
|
|
158
|
+
* Compound VolumeSlider component object
|
|
159
|
+
*/
|
|
160
|
+
declare const VolumeSlider$1: {
|
|
161
|
+
Root: typeof VolumeSliderRoot;
|
|
162
|
+
Track: typeof VolumeSliderTrack;
|
|
163
|
+
Progress: typeof VolumeSliderProgress;
|
|
164
|
+
Thumb: typeof VolumeSliderThumb;
|
|
165
|
+
};
|
|
166
|
+
//#endregion
|
|
167
|
+
//#region src/media/media-container.d.ts
|
|
168
|
+
declare const CustomElementConsumer: Constructor<CustomElement>;
|
|
169
|
+
declare class MediaContainer extends CustomElementConsumer {
|
|
170
|
+
static shadowRootOptions: {
|
|
171
|
+
mode: ShadowRootMode;
|
|
172
|
+
};
|
|
173
|
+
static getTemplateHTML: () => string;
|
|
174
|
+
_mediaStore: any;
|
|
175
|
+
_mediaSlot: HTMLSlotElement;
|
|
176
|
+
_paused: boolean;
|
|
177
|
+
contexts: {
|
|
178
|
+
mediaStore: (mediaStore: any) => void;
|
|
179
|
+
};
|
|
180
|
+
constructor();
|
|
181
|
+
connectedCallback(): void;
|
|
182
|
+
disconnectedCallback(): void;
|
|
183
|
+
_registerContainerStateOwner: () => void;
|
|
184
|
+
_unregisterContainerStateOwner: () => void;
|
|
185
|
+
_handleMediaSlotChange: () => void;
|
|
186
|
+
_handleClick: (event: Event) => void;
|
|
187
|
+
_subscribeToPlayState: () => void;
|
|
188
|
+
}
|
|
189
|
+
//#endregion
|
|
190
|
+
//#region src/media/media-provider.d.ts
|
|
191
|
+
declare const ProviderHTMLElement: Constructor<CustomElement>;
|
|
192
|
+
declare class MediaProvider extends ProviderHTMLElement {
|
|
193
|
+
contexts: {
|
|
194
|
+
mediaStore: () => MediaStore;
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
//#endregion
|
|
198
|
+
//#region src/media/media-skin.d.ts
|
|
199
|
+
declare class MediaSkin extends HTMLElement {
|
|
200
|
+
static shadowRootOptions: {
|
|
201
|
+
mode: ShadowRootMode;
|
|
202
|
+
};
|
|
203
|
+
static getTemplateHTML: () => string;
|
|
204
|
+
constructor();
|
|
205
|
+
}
|
|
206
|
+
//#endregion
|
|
207
|
+
export { Tooltip as a, PlayButton as c, DurationDisplay as d, CurrentTimeDisplay as f, VolumeSlider$1 as i, MuteButton as l, MediaProvider as n, TimeSlider$1 as o, MediaContainer as r, Popover as s, MediaSkin as t, FullscreenButton as u };
|
|
208
|
+
//# sourceMappingURL=media-skin-CbuyuCb-.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-skin-CbuyuCb-.d.ts","names":["useCurrentTimeDisplayState: StateHook<{\n currentTime: number | undefined;\n duration: number | undefined;\n}>","getCurrentTimeDisplayProps: PropsHook<{\n currentTime: number | undefined;\n duration: number | undefined;\n}>","CurrentTimeDisplay: ConnectedComponentConstructor<CurrentTimeDisplayState>","useDurationDisplayState: StateHook<{\n duration: number | undefined;\n}>","getDurationDisplayProps: PropsHook<{\n duration: number | undefined;\n}>","DurationDisplay: ConnectedComponentConstructor<DurationDisplayState>","getFullscreenButtonState: StateHook<{ fullscreen: boolean }>","getFullscreenButtonProps: PropsHook<{ fullscreen: boolean }>","FullscreenButton: ConnectedComponentConstructor<FullscreenButtonState>","getMuteButtonState: StateHook<{\n muted: boolean;\n volumeLevel: string;\n}>","getMuteButtonProps: PropsHook<{\n muted: boolean;\n volumeLevel: string;\n}>","MuteButton: ConnectedComponentConstructor<MuteButtonState>","getPlayButtonState: StateHook<{ paused: boolean }>","getPlayButtonProps: PropsHook<{ paused: boolean }>","PlayButton: ConnectedComponentConstructor<PlayButtonState>","Popover: {\n Root: typeof MediaPopoverRoot;\n Trigger: typeof MediaPopoverTrigger;\n Portal: typeof MediaPopoverPortal;\n Positioner: typeof MediaPopoverPositioner;\n Popup: typeof MediaPopoverPopup;\n}","getTimeSliderRootProps: PropsHook<{\n currentTime: number;\n duration: number;\n requestSeek: (time: number) => void;\n core: CoreTimeSlider | null;\n}>","useTimeSliderRootState: StateHook<{\n currentTime: number;\n duration: number;\n requestSeek: (time: number) => void;\n core: CoreTimeSlider | null;\n}>","getTimeSliderTrackProps: PropsHook<Record<string, never>>","getTimeSliderProgressProps: PropsHook<Record<string, never>>","getTimeSliderPointerProps: PropsHook<Record<string, never>>","getTimeSliderThumbProps: PropsHook<Record<string, never>>","TimeSliderRoot: ConnectedComponentConstructor<{\n currentTime: number;\n duration: number;\n requestSeek: (time: number) => void;\n core: CoreTimeSlider | null;\n}>","TimeSliderTrack: ConnectedComponentConstructor<any>","TimeSliderProgress: ConnectedComponentConstructor<any>","TimeSliderPointer: ConnectedComponentConstructor<any>","TimeSliderThumb: ConnectedComponentConstructor<any>","Tooltip: {\n Root: typeof MediaTooltipRoot;\n Trigger: typeof MediaTooltipTrigger;\n Portal: typeof MediaTooltipPortal;\n Positioner: typeof MediaTooltipPositioner;\n Popup: typeof MediaTooltipPopup;\n Arrow: typeof MediaTooltipArrow;\n}","getVolumeSliderRootProps: PropsHook<{\n volume: number;\n muted: boolean;\n volumeLevel: string;\n requestVolumeChange: (volume: number) => void;\n core: CoreVolumeSlider | null;\n}>","useVolumeSliderRootState: StateHook<{\n volume: number;\n muted: boolean;\n volumeLevel: string;\n requestVolumeChange: (volume: number) => void;\n core: CoreVolumeSlider | null;\n}>","getVolumeSliderTrackProps: PropsHook<Record<string, never>>","getVolumeSliderProgressProps: PropsHook<Record<string, never>>","getVolumeSliderThumbProps: PropsHook<Record<string, never>>","VolumeSliderRoot: ConnectedComponentConstructor<{\n volume: number;\n muted: boolean;\n volumeLevel: string;\n requestVolumeChange: (volume: number) => void;\n core: CoreVolumeSlider | null;\n}>","VolumeSliderTrack: ConnectedComponentConstructor<any>","VolumeSliderProgress: ConnectedComponentConstructor<any>","VolumeSliderThumb: ConnectedComponentConstructor<any>","CustomElementConsumer: Constructor<CustomElement>","ProviderHTMLElement: Constructor<CustomElement>"],"sources":["../src/utils/component-factory.ts","../src/components/media-current-time-display.ts","../src/components/media-duration-display.ts","../src/components/media-fullscreen-button.ts","../src/components/media-mute-button.ts","../src/components/media-play-button.ts","../src/components/media-popover.ts","../src/components/media-time-slider.ts","../src/components/media-tooltip.ts","../src/components/media-volume-slider.ts","../src/media/media-container.ts","../src/media/media-provider.ts","../src/media/media-skin.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import "../index-BtSCzZKn.js";
|
|
2
|
+
import { t as MediaSkin } from "../media-skin-CbuyuCb-.js";
|
|
3
|
+
|
|
4
|
+
//#region src/skins/default/index.d.ts
|
|
5
|
+
|
|
6
|
+
declare function getTemplateHTML(): string;
|
|
7
|
+
declare class MediaSkinDefault extends MediaSkin {
|
|
8
|
+
static getTemplateHTML: () => string;
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
export { MediaSkinDefault, getTemplateHTML };
|
|
12
|
+
//# sourceMappingURL=default.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default.d.ts","names":[],"sources":["../../src/skins/default/index.ts"],"sourcesContent":[],"mappings":";;;;;iBAegB,eAAA,CAAA;cAkXH,gBAAA,SAAyB,SAAA"}
|