@munsonlabs/video-player 0.0.8 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -61
- package/dist/element.d.mts +0 -1
- package/dist/element.mjs +1 -3
- package/dist/index.d.mts +18 -5
- package/dist/index.mjs +1 -3
- package/dist/style.css +1 -1
- package/package.json +8 -8
- package/dist/chunks/brightcove-BQ7atfxD.mjs +0 -1
- package/dist/chunks/brightcove-wzVhFaj0.mjs +0 -1
- package/dist/chunks/dailymotion-BkCqcmM9.mjs +0 -1
- package/dist/chunks/dailymotion-CEXthEHH.mjs +0 -1
- package/dist/chunks/jwplayer-BHEYGzXA.mjs +0 -1
- package/dist/chunks/jwplayer-DZmqU8XG.mjs +0 -1
- package/dist/chunks/loadScript-Du6JsTc2.mjs +0 -1
- package/dist/chunks/tech-BNI0cffg.mjs +0 -1
- package/dist/chunks/tech-DHDK_NLh.mjs +0 -1
- package/dist/chunks/video.cjs-gZWrkL0e.mjs +0 -239
- package/dist/chunks/videojs.ads-jA_s2l9Y.mjs +0 -3
- package/dist/chunks/videojs.ima-Ccon1y6f.mjs +0 -2
- package/dist/chunks/vimeo-C54chOVx.mjs +0 -1
- package/dist/chunks/vimeo-DiVKBACn.mjs +0 -15
- package/dist/chunks/youtube-BjxCa1gp.mjs +0 -1
- package/dist/chunks/youtube-CLB51PMl.mjs +0 -1
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@ A Vue 3 video player supporting YouTube, Vimeo, Dailymotion, Brightcove, JW Play
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npm install @munsonlabs/video-player
|
|
8
|
+
npm install @munsonlabs/video-player
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
## Vue Usage
|
|
@@ -49,25 +49,22 @@ import '@munsonlabs/video-player/style'
|
|
|
49
49
|
|
|
50
50
|
## VideoItem / VideoPlayer Props
|
|
51
51
|
|
|
52
|
-
| Prop | Type | Default | Description
|
|
53
|
-
| -------------- | -------------- | -------- |
|
|
54
|
-
| `videoUrl` | `string` | — | **Required.** The video URL or platform-specific URI
|
|
55
|
-
| `platform` | `string` | — | `youtube` · `vimeo` · `dailymotion` · `brightcove` · `jwplayer` · `html5`
|
|
56
|
-
| `title` | `string` | `''` | Video title
|
|
57
|
-
| `poster` | `string` | `''` | Poster image URL
|
|
58
|
-
| `aspectRatio` | `string` | `'16:9'` | e.g. `'16:9'`, `'9:16'`, `'4:3'`
|
|
59
|
-
| `autoplay` | `boolean` | `false` | Autoplay on mount (mutes automatically)
|
|
60
|
-
| `muted` | `boolean` | `false` | Start muted
|
|
61
|
-
| `lazy` | `boolean` | `true`\* | Show placeholder until clicked
|
|
62
|
-
| `nativeUi` | `boolean` | `false` | Use the platform's native controls (YouTube, Vimeo, Dailymotion only)
|
|
63
|
-
| `autoStage` | `boolean` | `false` | Immediately send this video to the stage on mount
|
|
64
|
-
| `playbackRate` | `number` | `1` | Initial playback rate
|
|
65
|
-
| `adTagUrl` | `string` | `''` | VAST or VMAP ad tag URL
|
|
66
|
-
| `
|
|
67
|
-
| `
|
|
68
|
-
| `payload` | `object` | `{}` | Arbitrary data attached to every `state-change` event |
|
|
69
|
-
| `action` | `PlayerAction` | `null` | Button shown in the player HUD — see [Actions](#actions) |
|
|
70
|
-
| `focusMode` | `boolean` | `false` | The "show controls" button centers the video and renders controls below it — see [Focus mode](#focus-mode) |
|
|
52
|
+
| Prop | Type | Default | Description |
|
|
53
|
+
| -------------- | -------------- | -------- | ------------------------------------------------------------------------- |
|
|
54
|
+
| `videoUrl` | `string` | — | **Required.** The video URL or platform-specific URI |
|
|
55
|
+
| `platform` | `string` | — | `youtube` · `vimeo` · `dailymotion` · `brightcove` · `jwplayer` · `html5` |
|
|
56
|
+
| `title` | `string` | `''` | Video title |
|
|
57
|
+
| `poster` | `string` | `''` | Poster image URL |
|
|
58
|
+
| `aspectRatio` | `string` | `'16:9'` | e.g. `'16:9'`, `'9:16'`, `'4:3'` |
|
|
59
|
+
| `autoplay` | `boolean` | `false` | Autoplay on mount (mutes automatically) |
|
|
60
|
+
| `muted` | `boolean` | `false` | Start muted |
|
|
61
|
+
| `lazy` | `boolean` | `true`\* | Show placeholder until clicked |
|
|
62
|
+
| `nativeUi` | `boolean` | `false` | Use the platform's native controls (YouTube, Vimeo, Dailymotion only) |
|
|
63
|
+
| `autoStage` | `boolean` | `false` | Immediately send this video to the stage on mount |
|
|
64
|
+
| `playbackRate` | `number` | `1` | Initial playback rate |
|
|
65
|
+
| `adTagUrl` | `string` | `''` | VAST or VMAP ad tag URL |
|
|
66
|
+
| `payload` | `object` | `{}` | Arbitrary data attached to every `state-change` event |
|
|
67
|
+
| `action` | `PlayerAction` | `null` | Button shown in the player HUD — see [Actions](#actions) |
|
|
71
68
|
|
|
72
69
|
\* `lazy` only has an effect on `VideoItem` (default `true`), which is what actually implements the placeholder-until-clicked behavior. `VideoPlayer` accepts the prop for type compatibility but defaults to `false` and never reads it — using `<VideoPlayer>` directly always mounts the real player immediately, regardless of `lazy`.
|
|
73
70
|
|
|
@@ -105,21 +102,22 @@ interface StateChangeEvent {
|
|
|
105
102
|
| 'firstQuartile'
|
|
106
103
|
| 'midpoint'
|
|
107
104
|
| 'thirdQuartile'
|
|
108
|
-
| '
|
|
109
|
-
| '
|
|
105
|
+
| 'controlsopen'
|
|
106
|
+
| 'controlsclose'
|
|
110
107
|
currentTime: number
|
|
111
108
|
duration: number
|
|
112
109
|
src: string
|
|
113
110
|
error?: { code: number; message: string } | null
|
|
114
111
|
isMuted?: boolean // volumechange only
|
|
115
112
|
playbackRate?: number // ratechange only
|
|
113
|
+
element?: HTMLElement | null // controlsopen/controlsclose only
|
|
116
114
|
payload?: Record<string, unknown>
|
|
117
115
|
}
|
|
118
116
|
```
|
|
119
117
|
|
|
120
118
|
`firstQuartile` / `midpoint` / `thirdQuartile` fire once each as playback crosses 25%, 50%, and 75% of the video's duration — useful for analytics integrations that expect IAB-style progress milestones. They reset and can fire again on loop restart.
|
|
121
119
|
|
|
122
|
-
`
|
|
120
|
+
`controlsopen` / `controlsclose` fire when the expanded controls popup mounts/unmounts (e.g. via the "show controls" button), with `element` set to the popup's root DOM node — handy for positioning your own UI relative to it, or measuring it. On `controlsclose`, `element` is a snapshot of the closing node; it's detached from the DOM immediately after.
|
|
123
121
|
|
|
124
122
|
On `error`, the player shows a "Retry" button that re-attempts loading the current source. You can also trigger this yourself via a template ref on `VideoPlayer`, which exposes a `retry()` method along with `togglePlay()`, `seek()`, `toggleMute()`, `setVolume()`, `toggleFullscreen()`, `toggleLoop()`, and `setPlaybackRate()`. Note this is on `VideoPlayer` specifically — `VideoItem` doesn't forward a ref to it, since it may be showing a lazy placeholder instead:
|
|
125
123
|
|
|
@@ -141,21 +139,6 @@ const player = ref(null)
|
|
|
141
139
|
|
|
142
140
|
---
|
|
143
141
|
|
|
144
|
-
## Focus mode
|
|
145
|
-
|
|
146
|
-
Set `focusMode` to change what the "show controls" button (in the HUD row) does: instead of overlaying the expanded controls on top of the video, the video centers itself on the page and the controls bar renders below it, dimming the rest of the page behind a backdrop.
|
|
147
|
-
|
|
148
|
-
```vue
|
|
149
|
-
<VideoItem video-url="..." platform="youtube" focus-mode />
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
- The video's original spot in the page keeps its size (an empty placeholder box) so surrounding layout doesn't jump while it's centered.
|
|
153
|
-
- Clicking the backdrop, pressing `Escape`, or the close button in the controls bar all return it to its original position.
|
|
154
|
-
- The move is animated via the [View Transitions API](https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API) where supported, falling back to an instant toggle otherwise.
|
|
155
|
-
- The video element itself is never moved in the DOM (no `Teleport`) — it's purely a CSS `position: fixed` toggle — so YouTube/Vimeo/Dailymotion iframes are never reloaded by entering or exiting focus mode.
|
|
156
|
-
|
|
157
|
-
---
|
|
158
|
-
|
|
159
142
|
## Actions
|
|
160
143
|
|
|
161
144
|
The `action` prop adds a button to the player HUD. Pass a built-in string or a custom action object.
|
|
@@ -201,19 +184,11 @@ Pass an `adTagUrl` to enable pre-roll, mid-roll, or VMAP ad schedules via the Go
|
|
|
201
184
|
<VideoItem video-url="https://..." platform="html5" ad-tag-url="https://pubads.g.doubleclick.net/..." />
|
|
202
185
|
```
|
|
203
186
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
Use `imaOptions` to pass any option supported by [videojs-ima](https://github.com/googleads/videojs-ima), including `customParameters` for `cust_params`:
|
|
187
|
+
Ads are not supported on YouTube, Vimeo, or Dailymotion.
|
|
207
188
|
|
|
208
|
-
|
|
209
|
-
<VideoItem
|
|
210
|
-
video-url="https://..."
|
|
211
|
-
ad-tag-url="https://pubads.g.doubleclick.net/..."
|
|
212
|
-
:ima-options="{ customParameters: { section: 'news', topic: 'sport' } }"
|
|
213
|
-
/>
|
|
214
|
-
```
|
|
189
|
+
### Ad overlay UI
|
|
215
190
|
|
|
216
|
-
|
|
191
|
+
While an ad is playing, a small overlay shows an "Ad" badge with a countdown to the ad's end, and a mute button that controls the ad creative's own independent audio (separate from the content video's volume/mute state — muting the player has no effect on ad audio, and vice versa). If the ad is paused (e.g. by another player's cross-player pause coordination), a resume icon appears over it as well.
|
|
217
192
|
|
|
218
193
|
---
|
|
219
194
|
|
|
@@ -232,6 +207,22 @@ Set the variables on any ancestor of the player — e.g. a wrapper `<div>` or `:
|
|
|
232
207
|
|
|
233
208
|
Icons use `fill="currentColor"`, so `--mvp-btn-color` recolors the icon along with `--mvp-btn-bg` for the background. Hover state is a `filter: brightness()` lift on top of `--mvp-btn-bg`, so it works for both the default translucent look and a solid theme color.
|
|
234
209
|
|
|
210
|
+
### Controls popup position
|
|
211
|
+
|
|
212
|
+
The expanded controls popup is centered over the video by default. Set `--mvp-popup-align: flex-end` to anchor it to the bottom edge instead:
|
|
213
|
+
|
|
214
|
+
```css
|
|
215
|
+
.my-video-wrapper {
|
|
216
|
+
--mvp-popup-align: flex-end;
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Real fullscreen always docks the popup to the bottom regardless of this variable.
|
|
221
|
+
|
|
222
|
+
### Fullscreen controls
|
|
223
|
+
|
|
224
|
+
Outside fullscreen, the full controls bar only appears after clicking "show controls" and stays open until dismissed. In real fullscreen it behaves like a standard native/YouTube-style player instead: it auto-shows on activity (mouse move, tap) and auto-hides after a short period of inactivity, with no explicit open/close step needed.
|
|
225
|
+
|
|
235
226
|
---
|
|
236
227
|
|
|
237
228
|
## Window Events
|
|
@@ -288,6 +279,19 @@ Import the element bundle to register all components as native custom elements.
|
|
|
288
279
|
></video-item>
|
|
289
280
|
```
|
|
290
281
|
|
|
282
|
+
If you'll be playing HLS (`.m3u8`) sources, also add an import map entry for `hls.js` — it's loaded on demand via a dynamic `import('hls.js')`, which (unlike the Vue usage, where your own bundler resolves it) has no resolution path in a plain browser without one:
|
|
283
|
+
|
|
284
|
+
```html
|
|
285
|
+
<script type="importmap">
|
|
286
|
+
{
|
|
287
|
+
"imports": {
|
|
288
|
+
"vue": "https://unpkg.com/vue@3/dist/vue.esm-browser.js",
|
|
289
|
+
"hls.js": "https://cdn.jsdelivr.net/npm/hls.js@1/+esm"
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
</script>
|
|
293
|
+
```
|
|
294
|
+
|
|
291
295
|
### Available elements
|
|
292
296
|
|
|
293
297
|
| Element | Vue equivalent |
|
|
@@ -299,16 +303,10 @@ Import the element bundle to register all components as native custom elements.
|
|
|
299
303
|
|
|
300
304
|
### Passing objects as web component attributes
|
|
301
305
|
|
|
302
|
-
Boolean and string props map directly to HTML attributes. Object props (`
|
|
306
|
+
Boolean and string props map directly to HTML attributes. Object props (`payload`) can be passed as inline JSON strings — Vue's custom element runtime parses them automatically:
|
|
303
307
|
|
|
304
308
|
```html
|
|
305
|
-
<video-item
|
|
306
|
-
video-url="https://..."
|
|
307
|
-
platform="html5"
|
|
308
|
-
ad-tag-url="https://..."
|
|
309
|
-
ima-options='{"customParameters":{"section":"news","topic":"sport"}}'
|
|
310
|
-
payload='{"articleId":"123"}'
|
|
311
|
-
></video-item>
|
|
309
|
+
<video-item video-url="https://..." platform="html5" ad-tag-url="https://..." payload='{"articleId":"123"}'></video-item>
|
|
312
310
|
```
|
|
313
311
|
|
|
314
312
|
For `action` (which contains a function), set it via JavaScript:
|
|
@@ -331,7 +329,6 @@ player.addEventListener('state-change', (e) => {
|
|
|
331
329
|
|
|
332
330
|
## Peer Dependencies
|
|
333
331
|
|
|
334
|
-
| Package
|
|
335
|
-
|
|
|
336
|
-
| `
|
|
337
|
-
| `vue` | `>=3` (Vue usage only) |
|
|
332
|
+
| Package | Version |
|
|
333
|
+
| ------- | ---------------------- |
|
|
334
|
+
| `vue` | `>=3` (Vue usage only) |
|
package/dist/element.d.mts
CHANGED
package/dist/element.mjs
CHANGED
|
@@ -1,3 +1 @@
|
|
|
1
|
-
import{a as e,t}from"./chunks/video.cjs-gZWrkL0e.mjs";import{C as n,D as r,E as i,O as a,S as o,T as s,a as c,b as l,g as u,h as d,i as f,m as p,o as m,p as h,r as g,v as _,w as v,x as y,y as b}from"./chunks/tech-DHDK_NLh.mjs";import{Fragment as x,Teleport as S,Transition as C,computed as w,createBlock as T,createCommentVNode as E,createElementBlock as D,createElementVNode as O,createStaticVNode as k,createVNode as A,defineComponent as j,defineCustomElement as M,inject as N,mergeProps as P,nextTick as F,normalizeClass as I,normalizeProps as ee,normalizeStyle as L,onBeforeUnmount as R,onMounted as z,openBlock as B,provide as V,reactive as te,ref as H,toDisplayString as U,toRef as W,unref as G,watch as K,withCtx as ne,withModifiers as q}from"vue";import re from"video.js/dist/video-js.css?inline";var ie=e(t(),1);const ae={},oe=[{test:e=>/youtu\.be|youtube\.com/.test(e),key:`youtube`,tech:`Youtube`,type:`video/youtube`,load:()=>import(`./chunks/youtube-BjxCa1gp.mjs`)},{test:e=>/vimeo\.com|player\.vimeo\.com/.test(e),key:`vimeo`,tech:`Vimeo`,type:`video/vimeo`,load:()=>import(`./chunks/vimeo-DiVKBACn.mjs`)},{test:e=>/dailymotion\.com|dai\.ly/.test(e),key:`dailymotion`,tech:`Dailymotion`,type:`video/dailymotion`,load:()=>import(`./chunks/dailymotion-CEXthEHH.mjs`)},{test:e=>/cdn\.jwplayer\.com/.test(e)||e.startsWith(`jwplayer://`),key:`jwplayer`,tech:null,type:`video/jwplayer`,load:()=>import(`./chunks/jwplayer-DZmqU8XG.mjs`)},{test:e=>e.startsWith(`brightcove://`),key:`brightcove`,tech:null,type:`video/brightcove`,load:()=>import(`./chunks/brightcove-BQ7atfxD.mjs`)}];function se(e){return oe.find(t=>t.test(e))?.tech!=null}async function ce(e){let t=oe.find(t=>t.test(e));if(!t)return{tech:null,type:null,adTagUrl:null};ae[t.key]||(ae[t.key]=t.load());let n=null,{prefetchConfig:r}=await ae[t.key];return r&&(n=(await r(e).catch(()=>null))?.adTagUrl??null),{tech:t.tech,type:t.type,adTagUrl:n}}function le(e){return!f(e)}function ue(){return window.google?.ima?Promise.resolve():new Promise((e,t)=>{let n=document.createElement(`script`);n.src=u,n.onload=e,n.onerror=()=>t(Error(`Failed to load Google IMA SDK`)),document.head.appendChild(n)})}async function de(t,n){return!n||!le(t)?!1:(await ue(),await import(`./chunks/videojs.ads-jA_s2l9Y.mjs`).then(t=>e(t.default,1)),await import(`./chunks/videojs.ima-Ccon1y6f.mjs`).then(t=>e(t.default,1)),!0)}function fe(e,t,n={}){e.ima({adTagUrl:t,showControlsForJSAds:!1,...n})}const pe=new Set;function me(e){return pe.add(e),()=>pe.delete(e)}function he(e){pe.forEach(t=>{if(t!==e)try{t()}catch{}})}function ge(e,t){let n=H(!1),r=H(!1);function i(){let e=document;n.value=!!(document.fullscreenElement||e.webkitFullscreenElement)}function a(){let n=t();if(typeof n?.enterFullscreen==`function`){n.enterFullscreen();return}let r=n?.el();if(typeof r?.webkitEnterFullscreen==`function`){r.webkitEnterFullscreen();return}e()?.requestFullscreen()}function o(){let n=t();if(typeof n?.exitFullscreen==`function`){n.exitFullscreen();return}e()?.exitFullscreen()}function c(){if(e()){if(n.value){o();return}a()}}function l(e){e.on(`fullscreenchange`,()=>{n.value=e.isFullscreen()??!1}),e.on(v,()=>{r.value=!0}),e.on(s,()=>{r.value=!1})}return z(()=>{document.addEventListener(`fullscreenchange`,i),document.addEventListener(`webkitfullscreenchange`,i)}),R(()=>{document.removeEventListener(`fullscreenchange`,i),document.removeEventListener(`webkitfullscreenchange`,i)}),{isFullscreen:n,isFullscreenPending:r,toggleFullscreen:c,attachPlayerEvents:l}}function _e(){let e=H(!1),t=null;function n(){clearTimeout(t??void 0),e.value=!1}function r(r){r.on(`waiting`,()=>{clearTimeout(t??void 0),t=setTimeout(()=>{e.value=!0},500)}),r.on(`playing`,n),r.on(`canplay`,n)}return R(()=>clearTimeout(t??void 0)),{isBuffering:e,attachPlayerEvents:r,reset:n}}function ve(e,t,n){let r=new Set;function i(){if(!t.value)return;let i=e.value/t.value;for(let[e,t]of b)!r.has(e)&&i>=e&&(r.add(e),n(t))}function a(){r.clear()}return{checkQuartiles:i,reset:a}}function ye(){try{return JSON.parse(localStorage.getItem(`player:positions`)??`[]`)}catch{return[]}}function be(e){localStorage.setItem(y,JSON.stringify(e))}function xe(e,t){if(t<5)return;let n=ye().filter(t=>t.url!==e);n.unshift({url:e,time:t}),be(n.slice(0,5))}function Se(e){return ye().find(t=>t.url===e)?.time??null}function Ce(e){be(ye().filter(t=>t.url!==e))}function we(e,t,n){let r=!1;function i(t){if(r)return;let n=Se(e);n&&t.currentTime(n),r=!0}function a(t){!t||n.value||xe(e,t.currentTime()??0)}function o(){Ce(e)}function s(){document.visibilityState===`hidden`&&a(t())}return z(()=>document.addEventListener(`visibilitychange`,s)),R(()=>{a(t()),document.removeEventListener(`visibilitychange`,s)}),{restoreOnce:i,save:a,clear:o}}function Te(e,t,n){let r=null;z(()=>{let i=e.value?.closest(`.player__shell`);i&&(r=new IntersectionObserver(([e])=>{let r=t();!e.isIntersecting&&r&&!r.paused()&&!n.value&&r.pause()},{threshold:.1}),r.observe(i))}),R(()=>r?.disconnect())}function Ee(e,t,n,r,i){function a(){let n=e();if(!(!n||!t.value)){if(n.paused()){n.play();return}n.pause()}}function o(t){e()?.currentTime(n.value*(t/100))}function s(){let t=e();t?.muted(!t.muted())}function c(t){let n=e();n&&(n.volume(t),n.muted(t===0))}function l(){r.value=!r.value}function u(t){let n=e();n&&(n.playbackRate(t),i.value=t)}return{togglePlay:a,seek:o,toggleMute:s,setVolume:c,toggleLoop:l,setPlaybackRate:u}}function De(e,t){let{isPlaying:r,hasEnded:i,isReady:a,isAdPlaying:s,current:c,total:l,buffered:u,vol:d,isMuted:f,isLooping:p,playbackRate:m,supportsPlaybackRate:h,hasStarted:g,isError:_,errorMessage:v}=e,{getTech:y,fire:b,pauseThisPlayer:x,positionMemory:S,quartiles:C,buffering:w,fullscreen:T}=t;function E(e){e.ready(()=>{a.value=!0,h.value=!!y()?.featuresPlaybackRate});let t=()=>{let t=e.duration();t&&t>0&&isFinite(t)&&(l.value=t)};e.on([`adstart`,n],()=>{he(x),s.value=!0,b(`adstart`)}),e.on([`adend`,o],()=>{s.value=!1,b(`adend`)}),e.on(`play`,()=>{he(x),g.value=!0,r.value=!0,i.value=!1,S.restoreOnce(e),b(`play`)}),e.on(`pause`,()=>{r.value=!1,S.save(e),b(`pause`)}),e.on(`ended`,()=>{if(r.value=!1,C.reset(),w.reset(),p.value){e.currentTime(0),e.play();return}l.value&&(c.value=l.value),i.value=!0,S.clear(),b(`ended`)}),e.on(`seeked`,()=>{b(`seeked`)}),e.on(`error`,()=>{let t=e.error();v.value=t?.message||`This video could not be played.`,_.value=!0,a.value=!0,b(`error`,{error:t})}),e.on(`timeupdate`,()=>{i.value||(c.value=e.currentTime()??0,l.value||t(),C.checkQuartiles())}),e.on(`durationchange`,t),e.on(`progress`,()=>{let t=e.duration();u.value=t?e.bufferedEnd()/t*100:0}),e.on(`volumechange`,()=>{let t=e.muted();d.value=e.volume()??1,f.value=t??!1,g.value&&b(`volumechange`,{isMuted:t})}),e.on(`ratechange`,()=>{let t=e.playbackRate()??1;m.value=t,g.value&&b(`ratechange`,{playbackRate:t})}),w.attachPlayerEvents(e),T.attachPlayerEvents(e)}return{attachPlayerEvents:E}}function Oe(e,t,n){let r=null,i=null,a=null,o=H(!1),s=H(!1),c=H(!1),l=H(!1),u=H(0),d=H(0),f=H(0),p=H(1),m=H(t.muted??t.autoplay??!1),h=H(!1),_=H(t.playbackRate??1),v=H(!1),y=H(!1),b=H(!1),x=H(``),S=H(!1),C=w(()=>d.value?u.value/d.value*100:0),T=w(()=>Math.max(f.value,C.value)),E=()=>r,D=()=>r?.tech({IWillNotUseThisInPlugins:!0}),O=ge(E,D),k=_e(),A=we(t.videoUrl,E,s);function j(e,r={}){n(`state-change`,{type:e,currentTime:u.value,duration:d.value,src:t.videoUrl,...r,payload:t.payload})}let M=ve(u,d,j);function N(){!r||!a||(b.value=!1,x.value=``,r.src(a))}function P(){r?.pause()}let F=Ee(E,c,d,h,_),{attachPlayerEvents:I}=De({isPlaying:o,hasEnded:s,isReady:c,isAdPlaying:l,current:u,total:d,buffered:f,vol:p,isMuted:m,isLooping:h,playbackRate:_,supportsPlaybackRate:v,hasStarted:y,isError:b,errorMessage:x},{getTech:D,fire:j,pauseThisPlayer:P,positionMemory:A,quartiles:M,buffering:k,fullscreen:O});return K(()=>t.muted,e=>{!r||e===void 0||r.muted(e)}),K(()=>t.playbackRate,e=>{!r||e===void 0||r.playbackRate(e)}),Te(e,E,O.isFullscreen),z(async()=>{let{tech:n,type:o,adTagUrl:s}=await ce(t.videoUrl),c=n?[n,`Html5`]:[`Html5`],l=t.adTagUrl||s||``,u=await de(n??`Html5`,l);if(!e.value)return;let d={src:t.videoUrl,...o&&{type:o}};a=d,S.value=!!(t.nativeUi&&!le(n??``)),r=(0,ie.default)(e.value,{techOrder:c,controls:!1,fluid:!0,aspectRatio:t.aspectRatio??`16:9`,poster:t.poster||``,playsinline:!0,autoplay:t.autoplay,muted:t.muted??t.autoplay,playbackRate:_.value,adTagUrl:l,youtube:{nativeUi:S.value},vimeo:{nativeUi:S.value},dailymotion:{nativeUi:S.value},...!u&&{sources:[d]},...t.techOptions}),u&&(fe(r,l,t.imaOptions??{}),r.src(d)),i=me(P),I(r)}),R(()=>{i?.(),r?.dispose(),r=null}),{isPlaying:o,hasEnded:s,isReady:c,isAdPlaying:l,isBuffering:k.isBuffering,current:u,total:d,vol:p,isMuted:m,isLooping:h,playbackRate:_,hasStarted:y,isError:b,errorMessage:x,progress:C,bufferedDisplay:T,isFullscreen:O.isFullscreen,isFullscreenPending:O.isFullscreenPending,fmt:g,fire:j,retry:N,togglePlay:F.togglePlay,seek:F.seek,toggleMute:F.toggleMute,setVolume:F.setVolume,toggleFullscreen:O.toggleFullscreen,toggleLoop:F.toggleLoop,setPlaybackRate:F.setPlaybackRate,supportsPlaybackRate:v,nativeUi:S}}function ke(e,t){let n=H(!0),r=H(!1),i=null,a=0;function o(e=400){a=Date.now()+e}function s(e=d){clearTimeout(i??void 0),i=setTimeout(()=>{n.value=!1,t?.value||(r.value=!1)},e)}function c(){clearTimeout(i??void 0)}function l(){r.value=!0,n.value=!0,s()}function u(){r.value=!1,e.value&&s()}function f(){e.value&&s()}function p(){n.value=!0,e.value&&s()}function m(){n.value=!0,s()}function h(){Date.now()<a||e.value&&s(600)}return K(e,e=>{if(!e){clearTimeout(i??void 0),n.value=!0;return}s()}),R(()=>clearTimeout(i??void 0)),{showHUD:n,isOpen:r,scheduleHide:s,pauseHide:c,onVideoTap:p,onMouseMove:m,onMouseLeave:h,openControls:l,closeControls:u,keepOpen:f,suppressMouseLeave:o}}function Ae(e,t,n){if(!document.startViewTransition||!e.value){n();return}e.value.style.viewTransitionName=t,document.startViewTransition(async()=>{n(),await F()}).finished.finally(()=>{e.value&&(e.value.style.viewTransitionName=``)})}function je(e,t,n,r,i){let a=typeof document<`u`&&!!document.startViewTransition,o=w(()=>t.value&&a);K(()=>o.value&&!n.isFullscreen?r.isOpen:!1,t=>{let r=()=>{e.value=t,document.documentElement.toggleAttribute(`data-video-focused`,t),n.fire(t?`focusstart`:`focusend`)};if(n.isFullscreen){r();return}Ae(i,`player-focus`,r)}),K(()=>n.isFullscreen,()=>{r.isOpen&&r.closeControls()});function s(t){t.key===`Escape`&&e.value&&r.closeControls()}return z(()=>document.addEventListener(`keydown`,s)),R(()=>document.removeEventListener(`keydown`,s)),{focusModeEnabled:o}}function Me(e,t){let n=H({width:0,height:0});function r(){n.value={width:window.innerWidth,height:window.innerHeight}}return z(()=>{r(),window.addEventListener(`resize`,r)}),R(()=>window.removeEventListener(`resize`,r)),w(()=>{if(!e.value)return{};let[r,i]=t.value.split(`:`).map(Number),a=Math.min(720,n.value.width-32),o=Math.min(n.value.height*p,n.value.height-32-140),s=a,c=s*i/r;return c>o&&(c=o,s=c*r/i),{width:`${s}px`,height:`${c}px`}})}const J=Symbol(`player`),Y=Symbol(`hud`),Ne=Symbol(`action`),Pe=Symbol(`compact`);function X(e){let t=N(e);if(t===void 0)throw Error(`[video-player] missing "${String(e.description)}" context — this component must be rendered inside <VideoPlayer>`);return t}function Fe(e,t,n){return{hudVisible:w(()=>!e.isReady||e.isError||t.isOpen&&e.isFullscreen?!1:t.showHUD),popupVisible:w(()=>!e.isReady||e.isError||n.value&&!e.isFullscreen?!1:t.isOpen)}}function Ie(e,t,n){return w(()=>!(!e?.value||t.value||n.isFullscreen))}function Le(e,t){let n=w(()=>e?.value??null),r=w(()=>!!n.value&&typeof n.value==`object`),i=w(()=>r.value?n.value:null),a=w(()=>n.value===`mute`?t.isMuted?`Unmute`:`Mute`:n.value===`loop`?t.isLooping?`Disable loop`:`Loop`:``);function o(){n.value===`mute`?t.toggleMute():n.value===`loop`&&t.toggleLoop()}return{currentAction:n,isCustom:r,customAction:i,builtinLabel:a,onBuiltinClick:o}}var Z=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n};const Re={},ze={viewBox:`0 0 24 24`,fill:`currentColor`};function Be(e,t){return B(),D(`svg`,ze,[...t[0]||=[O(`path`,{d:`M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z`},null,-1)]])}var Ve=Z(Re,[[`render`,Be]]);const He={},Ue={viewBox:`0 0 24 24`,fill:`currentColor`};function We(e,t){return B(),D(`svg`,Ue,[...t[0]||=[O(`path`,{d:`M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z`},null,-1)]])}var Ge=Z(He,[[`render`,We]]);const Ke={},qe={viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`};function Je(e,t){return B(),D(`svg`,qe,[...t[0]||=[k(`<line x1="4" y1="6" x2="20" y2="6"></line><line x1="4" y1="12" x2="20" y2="12"></line><line x1="4" y1="18" x2="20" y2="18"></line><circle cx="9" cy="6" r="2.5" fill="currentColor" stroke="none"></circle><circle cx="15" cy="12" r="2.5" fill="currentColor" stroke="none"></circle><circle cx="9" cy="18" r="2.5" fill="currentColor" stroke="none"></circle>`,6)]])}var Ye=Z(Ke,[[`render`,Je]]);const Xe={},Ze={viewBox:`0 0 24 24`,fill:`currentColor`};function Qe(e,t){return B(),D(`svg`,Ze,[...t[0]||=[O(`path`,{d:`M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z`},null,-1)]])}var $e=Z(Xe,[[`render`,Qe]]);const et={},tt={viewBox:`0 0 24 24`,fill:`currentColor`};function nt(e,t){return B(),D(`svg`,tt,[...t[0]||=[O(`path`,{d:`M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z`},null,-1)]])}var rt=Z(et,[[`render`,nt]]);const it={},at={viewBox:`0 0 24 24`,fill:`currentColor`};function ot(e,t){return B(),D(`svg`,at,[...t[0]||=[O(`path`,{d:`M7 7h10v3l4-4-4-4v3H5v6h2V7zm10 10H7v-3l-4 4 4 4v-3h12v-6h-2v4z`},null,-1)]])}var st=Z(it,[[`render`,ot]]);const ct={},lt={viewBox:`0 0 24 24`,fill:`currentColor`};function ut(e,t){return B(),D(`svg`,lt,[...t[0]||=[O(`path`,{d:`M6 19h4V5H6v14zm8-14v14h4V5h-4z`},null,-1)]])}var dt=Z(ct,[[`render`,ut]]);const ft={},pt={viewBox:`0 0 24 24`,fill:`currentColor`};function mt(e,t){return B(),D(`svg`,pt,[...t[0]||=[O(`path`,{d:`M8 5v14l11-7z`},null,-1)]])}var ht=Z(ft,[[`render`,mt]]);const gt={},_t={viewBox:`0 0 24 24`,fill:`currentColor`};function vt(e,t){return B(),D(`svg`,_t,[...t[0]||=[O(`path`,{d:`M12 5V1L7 6l5 5V7c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6H4c0 4.42 3.58 8 8 8s8-3.58 8-8-3.58-8-8-8z`},null,-1)]])}var yt=Z(gt,[[`render`,vt]]);const bt={},xt={viewBox:`0 0 24 24`,fill:`currentColor`};function St(e,t){return B(),D(`svg`,xt,[...t[0]||=[O(`path`,{d:`M16.5 12A4.5 4.5 0 0 0 14 7.97v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51A8.796 8.796 0 0 0 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06A8.99 8.99 0 0 0 17.73 18L19 19.27 20.27 18 5.27 3 4.27 3zM12 4L9.91 6.09 12 8.18V4z`},null,-1)]])}var Ct=Z(bt,[[`render`,St]]);const wt={},Tt={viewBox:`0 0 24 24`,fill:`currentColor`};function Et(e,t){return B(),D(`svg`,Tt,[...t[0]||=[O(`path`,{d:`M3 9v6h4l5 5V4L7 9H3zm13.5 3A4.5 4.5 0 0 0 14 7.97v8.05c1.48-.73 2.5-2.25 2.5-4.02z`},null,-1)]])}var Dt=Z(wt,[[`render`,Et]]);const Ot=[`aria-label`];var Q=Z(j({__name:`PlayPauseButton`,props:{isPlaying:{type:Boolean,required:!0},hasEnded:{type:Boolean,required:!1,default:!1},size:{type:String,required:!1,default:`sm`}},emits:[`toggle-play`],setup(e){let t=e,n=w(()=>t.isPlaying?`Pause`:t.hasEnded?`Replay`:`Play`);return(t,r)=>(B(),D(`button`,{class:I([`ppbtn`,`ppbtn--${e.size}`]),"aria-label":n.value,onClick:r[0]||=q(e=>t.$emit(`toggle-play`),[`stop`])},[e.isPlaying?(B(),T(G(dt),{key:0})):e.hasEnded?(B(),T(G(yt),{key:1})):(B(),T(G(ht),{key:2}))],10,Ot))}}),[[`__scopeId`,`data-v-85902525`]]),kt=j({__name:`VolumeIcon`,setup(e){let t=X(J),n=w(()=>!t.isMuted&&t.vol>0);return(e,t)=>n.value?(B(),T(G(Dt),{key:0})):(B(),T(G(Ct),{key:1}))}}),$=Z(j({__name:`Spinner`,props:{size:{type:Number,required:!1,default:14},borderWidth:{type:Number,required:!1,default:2}},setup(e){return(t,n)=>(B(),D(`div`,{class:`spinner`,style:L({width:`${e.size}px`,height:`${e.size}px`,borderWidth:`${e.borderWidth}px`})},null,4))}}),[[`__scopeId`,`data-v-259be2b2`]]);const At={class:`hud`},jt=[`aria-label`],Mt=[`aria-label`],Nt=[`aria-label`,`innerHTML`],Pt={key:3,class:`hud__spacer`},Ft={class:`hud__play-wrap`},It={key:5,class:`hud__spacer`};var Lt=Z(j({__name:`HudButtons`,props:{isFocused:{type:Boolean,required:!1,default:!1}},setup(e){let t=X(J),n=X(Y),{currentAction:r,isCustom:i,customAction:a,builtinLabel:o,onBuiltinClick:s}=Le(N(Ne),t);return(c,l)=>(B(),D(`div`,At,[!e.isFocused&&G(r)===`mute`?(B(),D(`button`,{key:0,class:I([`hud__btn`,{"hud__btn--active":G(t).isMuted}]),"aria-label":G(o),onClick:l[0]||=q((...e)=>G(s)&&G(s)(...e),[`stop`])},[A(kt)],10,jt)):!e.isFocused&&G(r)===`loop`?(B(),D(`button`,{key:1,class:I([`hud__btn`,{"hud__btn--active":G(t).isLooping}]),"aria-label":G(o),onClick:l[1]||=q((...e)=>G(s)&&G(s)(...e),[`stop`])},[A(G(st))],10,Mt)):!e.isFocused&&G(i)&&G(a)?(B(),D(`button`,{key:2,class:`hud__btn`,"aria-label":G(a).label,onClick:l[2]||=q(e=>G(a).onClick(),[`stop`]),innerHTML:G(a).icon},null,8,Nt)):(B(),D(`div`,Pt)),O(`div`,Ft,[A(Q,{"is-playing":G(t).isPlaying,"has-ended":G(t).hasEnded,size:`lg`,onTogglePlay:G(t).togglePlay},null,8,[`is-playing`,`has-ended`,`onTogglePlay`]),G(t).isBuffering?(B(),T($,{key:0,class:`hud__buf-spinner`})):E(`v-if`,!0)]),e.isFocused?(B(),D(`div`,It)):(B(),D(`button`,{key:4,class:`hud__btn`,"aria-label":`Show controls`,onClick:l[3]||=q((...e)=>G(n).openControls&&G(n).openControls(...e),[`stop`])},[A(G(Ye))]))]))}}),[[`__scopeId`,`data-v-a6d118e7`]]);function Rt(e){let t=H(null),n=w(()=>t.value??e.progress),r=null;function i(){r&&clearTimeout(r),r=null,t.value=null}function a(e){r&&clearTimeout(r),r=null,t.value=Number(e.target.value)}function o(n){let a=Number(n.target.value);t.value=a,e.seek(a),r&&clearTimeout(r),r=setTimeout(i,l)}return K(()=>e.current,()=>{if(t.value===null||!e.total)return;let n=t.value/100*e.total;Math.abs(e.current-n)<1&&i()}),R(i),{displaySeek:n,onSeekInput:a,onSeekChange:o}}function zt(e){function t(){let t=_.indexOf(e.playbackRate);e.setPlaybackRate(_[(t+1)%_.length])}function n(e){return`${e}×`}return{cycleRate:t,fmtRate:n}}const Bt={class:`controls__vol-header`},Vt=[`aria-label`],Ht={class:`controls__vol-body`},Ut=[`value`],Wt={class:`controls__vol-pct`};var Gt=Z(j({__name:`VolumePanel`,emits:[`back`],setup(e){let t=X(J),n=X(Y),r=w(()=>t.isMuted?0:Math.round(t.vol*100));function i(e){t.setVolume(Number(e.target.value)/100)}return(e,a)=>(B(),D(x,null,[O(`div`,Bt,[O(`button`,{class:`controls__btn`,"aria-label":`Back`,onClick:a[0]||=t=>e.$emit(`back`)},[A(G(Ve))]),a[6]||=O(`span`,{class:`controls__vol-label`},`Volume`,-1),O(`button`,{class:`controls__btn`,"aria-label":G(t).isMuted?`Unmute`:`Mute`,onClick:a[1]||=e=>G(t).toggleMute()},[A(kt)],8,Vt)]),O(`div`,Ht,[O(`input`,{type:`range`,min:`0`,max:`100`,step:`1`,value:r.value,class:`controls__vol-slider`,style:L({"--v":r.value+`%`}),"aria-label":`Volume`,onInput:i,onMousedown:a[2]||=e=>G(n).pauseHide(),onMouseup:a[3]||=e=>G(n).scheduleHide(),onTouchstartPassive:a[4]||=e=>G(n).pauseHide(),onTouchend:a[5]||=e=>G(n).scheduleHide()},null,44,Ut),O(`span`,Wt,U(r.value)+`%`,1)])],64))}}),[[`__scopeId`,`data-v-10b0ae67`]]);const Kt=[`value`],qt={class:`controls__row`},Jt={class:`controls__play-wrap`},Yt={class:`controls__time`},Xt=[`aria-label`,`innerHTML`],Zt={class:`controls__fs-wrap`},Qt=[`aria-label`];var $t=Z(j({__name:`ControlsPopup`,props:{focusMode:{type:Boolean,required:!1,default:!1}},setup(e){let t=e,n=X(J),r=X(Y),i=Ie(N(Pe),W(t,`focusMode`),n),{isCustom:a,customAction:o}=Le(N(Ne),n),s=H(!1),l=H(null);R(()=>{s.value=!1});function u(e){r.suppressMouseLeave(),Ae(l,`controls-popup`,e)}function d(){if(c()){n.toggleMute();return}u(()=>{s.value=!0})}let{displaySeek:f,onSeekInput:p,onSeekChange:m}=Rt(n),{cycleRate:h,fmtRate:g}=zt(n);return(t,c)=>(B(),D(`div`,{ref_key:`popupEl`,ref:l,class:I([`controls`,{"controls--fs":G(n).isFullscreen||e.focusMode,"controls--compact":G(i)}]),onMousemove:c[13]||=q((...e)=>G(r).keepOpen&&G(r).keepOpen(...e),[`stop`])},[s.value?(B(),T(Gt,{key:0,onBack:c[0]||=e=>u(()=>s.value=!1)})):(B(),D(x,{key:1},[O(`input`,{type:`range`,min:`0`,max:`100`,value:G(f),class:`controls__seek`,style:L({"--p":G(f)+`%`,"--b":G(n).bufferedDisplay+`%`}),onInput:c[1]||=(...e)=>G(p)&&G(p)(...e),onChange:c[2]||=(...e)=>G(m)&&G(m)(...e),onMousedown:c[3]||=e=>G(r).pauseHide(),onMouseup:c[4]||=e=>G(r).scheduleHide(),onTouchstartPassive:c[5]||=e=>G(r).pauseHide(),onTouchend:c[6]||=e=>G(r).scheduleHide()},null,44,Kt),O(`div`,qt,[O(`div`,Jt,[G(n).isBuffering?(B(),T($,{key:0})):(B(),T(Q,{key:1,"is-playing":G(n).isPlaying,"has-ended":G(n).hasEnded,size:`sm`,onTogglePlay:c[7]||=e=>G(n).togglePlay()},null,8,[`is-playing`,`has-ended`]))]),O(`span`,Yt,U(G(n).fmt(G(n).current))+` / `+U(G(n).fmt(G(n).total)),1),G(n).supportsPlaybackRate?(B(),D(`button`,{key:0,class:I([`controls__btn controls__btn--rate`,{"controls__btn--active":G(n).playbackRate!==1}]),"aria-label":`Playback rate`,onClick:c[8]||=(...e)=>G(h)&&G(h)(...e)},U(G(g)(G(n).playbackRate)),3)):E(`v-if`,!0),O(`button`,{class:I([`controls__btn controls__btn--loop`,{"controls__btn--active":G(n).isLooping}]),"aria-label":`Toggle loop`,onClick:c[9]||=e=>G(n).toggleLoop()},[A(G(st))],2),O(`button`,{class:`controls__btn`,"aria-label":`Volume`,onClick:d},[A(kt)]),G(a)&&G(o)?(B(),D(`button`,{key:1,class:`controls__btn`,"aria-label":G(o).label,onClick:c[10]||=e=>G(o).onClick(),innerHTML:G(o).icon},null,8,Xt)):E(`v-if`,!0),O(`div`,Zt,[G(n).isFullscreenPending?(B(),T($,{key:0})):(B(),D(`button`,{key:1,class:`controls__btn`,"aria-label":G(n).isFullscreen?`Exit fullscreen`:`Fullscreen`,onClick:c[11]||=e=>G(n).toggleFullscreen()},[G(n).isFullscreen?(B(),T(G(rt),{key:0})):(B(),T(G($e),{key:1}))],8,Qt))]),O(`button`,{class:`controls__btn controls__btn--close`,"aria-label":`Close`,onClick:c[12]||=e=>G(r).closeControls()},[A(G(Ge))])])],64))],34))}}),[[`__scopeId`,`data-v-5712aad4`]]);const en={key:0,class:`overlay__spinner`},tn={key:0,class:`overlay__error`};var nn=Z(j({__name:`PlayerOverlay`,props:{focusMode:{type:Boolean,required:!1,default:!1},isFocused:{type:Boolean,required:!1,default:!1},disableTapCapture:{type:Boolean,required:!1,default:!1}},setup(e){let t=e,n=X(J),r=X(Y),{hudVisible:i,popupVisible:a}=Fe(n,r,W(t,`focusMode`));return(t,o)=>(B(),D(x,null,[e.disableTapCapture?E(`v-if`,!0):(B(),D(`div`,{key:0,class:`overlay__tap-capture`,style:L({pointerEvents:!G(n).hasStarted||G(n).isAdPlaying?`none`:void 0}),onClick:o[0]||=(...e)=>G(r).onVideoTap&&G(r).onVideoTap(...e),onTouchend:o[1]||=q((...e)=>G(r).onVideoTap&&G(r).onVideoTap(...e),[`prevent`,`stop`])},null,36)),A(C,{name:`fade`},{default:ne(()=>[!G(n).isReady&&!G(n).isError?(B(),D(`div`,en,[A($,{size:40,"border-width":3})])):E(`v-if`,!0)]),_:1}),A(C,{name:`fade`},{default:ne(()=>[G(n).isError?(B(),D(`div`,tn,[O(`p`,null,U(G(n).errorMessage||`This video could not be played.`),1),O(`button`,{class:`overlay__retry`,onClick:o[2]||=q((...e)=>G(n).retry&&G(n).retry(...e),[`stop`])},`Retry`)])):E(`v-if`,!0)]),_:1}),O(`div`,{class:I([`overlay__hud`,{"overlay__hud--visible":G(i)}])},[A(Lt,{"is-focused":e.isFocused},null,8,[`is-focused`])],2),A(C,{name:`popup`},{default:ne(()=>[G(a)?(B(),D(`div`,{key:0,class:I([`overlay__popup`,{"overlay__popup--fs":G(n).isFullscreen}]),onClick:o[3]||=q(()=>{},[`stop`])},[A($t)],2)):E(`v-if`,!0)]),_:1})],64))}}),[[`__scopeId`,`data-v-f3307b98`]]);const rn=[`data-focused`],an={"data-vjs-player":``},on=[`poster`],sn={key:1,class:`player__native-play`};var cn=Z(j({__name:`VideoPlayer`,props:{videoUrl:{type:String,required:!0},title:{type:String,required:!1,default:``},poster:{type:String,required:!1,default:``},aspectRatio:{type:String,required:!1,default:h},platform:{type:String,required:!1,default:``},techOptions:{type:Object,required:!1,default:()=>({})},adTagUrl:{type:String,required:!1,default:``},imaOptions:{type:Object,required:!1},autoplay:{type:Boolean,required:!1,default:!1},muted:{type:Boolean,required:!1},playbackRate:{type:Number,required:!1},nativeUi:{type:Boolean,required:!1,default:!1},autoStage:{type:Boolean,required:!1,default:!1},lazy:{type:Boolean,required:!1,default:!1},payload:{type:Object,required:!1,default:()=>({})},action:{type:[String,Object,null],required:!1,default:null},focusMode:{type:Boolean,required:!1,default:!1},disableTapCapture:{type:Boolean,required:!1,default:!1}},emits:[`state-change`],setup(e,{expose:t,emit:n}){let r=e,i=n,a=H(null),o=te(Oe(a,r,i)),s=H(!1),c=te(ke(W(o,`isPlaying`),s));V(J,o),V(Y,c),V(Ne,W(r,`action`));let{isPortrait:l,cssRatio:u}=m(r.aspectRatio),d=H(null),{focusModeEnabled:f}=je(s,W(r,`focusMode`),o,c,d),p=Me(s,W(r,`aspectRatio`)),h=w(()=>!r.poster&&!o.isReady),g=w(()=>!se(r.videoUrl));return t(o),(e,t)=>(B(),D(`div`,{class:`player`,"data-focused":s.value?``:null},[s.value?(B(),D(`div`,{key:0,class:I([`player__placeholder`,{"player__shell--portrait":G(l)}]),style:L({aspectRatio:G(u)})},null,6)):E(`v-if`,!0),E(` Teleported to body while focused so the fixed-position overlay escapes any ancestor
|
|
2
|
-
that establishes its own containing block (transform, filter, contain, etc. combined with
|
|
3
|
-
overflow: hidden), which would otherwise clip it despite \`position: fixed\`. `),(B(),T(S,{to:`body`,disabled:!s.value||!g.value},[s.value?(B(),D(`div`,{key:0,class:`player__backdrop`,onClick:t[0]||=e=>c.closeControls()})):E(`v-if`,!0),O(`div`,{ref_key:`focusFrameEl`,ref:d,class:I([`player__focus-frame`,{"player__focus-frame--active":s.value}])},[O(`div`,{class:I([`player__shell`,{"player__shell--portrait":G(l)}]),style:L([{aspectRatio:G(u)},G(p)]),onMousemove:t[1]||=e=>c.onMouseMove(),onContextmenuCapture:t[2]||=q(()=>{},[`prevent`]),onMouseleave:t[3]||=e=>c.onMouseLeave()},[O(`div`,an,[O(`video`,{ref_key:`videoEl`,ref:a,class:I([`video-js`,{"video-js--hidden":h.value}]),poster:r.poster,playsinline:``},null,10,on),o.nativeUi?E(`v-if`,!0):(B(),T(nn,{key:0,"focus-mode":G(f),"is-focused":s.value,"disable-tap-capture":r.disableTapCapture},null,8,[`focus-mode`,`is-focused`,`disable-tap-capture`])),o.nativeUi&&!o.hasStarted?(B(),D(`div`,sn,[A(Q,{"is-playing":!1,size:`lg`,onTogglePlay:o.togglePlay},null,8,[`onTogglePlay`])])):E(`v-if`,!0)])],38),s.value?(B(),D(`div`,{key:0,class:`player__focus-controls`,onClick:t[4]||=q(()=>{},[`stop`])},[A($t,{"focus-mode":``})])):E(`v-if`,!0)],2)],8,[`disabled`]))],8,rn))}}),[[`__scopeId`,`data-v-4ab3cf75`]]);const ln=H(0),un=w(()=>ln.value>0);function dn(){ln.value++}function fn(){ln.value--}function pn(e,t){window.dispatchEvent(new CustomEvent(e,{detail:t}))}function mn(e,t){let n=e=>t(e.detail);z(()=>window.addEventListener(e,n)),R(()=>window.removeEventListener(e,n))}const hn=[`src`],gn={class:`stage__idle-body`},_n={class:`stage__idle-btn`},vn={class:`stage__idle-title`},yn={key:1,class:`stage__idle-empty`};var bn=Z(j({__name:`VideoStage`,props:{pinPosition:{type:String,required:!1,default:`bottom-right`}},emits:[`state-change`],setup(e,{emit:t}){let n=t,o=H(null),s=H(null),c=H(!1),l=H(!1),u=H(null),d=H(null),f=H(!1);V(Pe,f);let p=w(()=>f.value&&!!s.value&&c.value),h=w(()=>m(s.value?.aspectRatio||`16:9`).cssRatio),g=H(null),_=H(null);K(f,e=>{g.value=e&&d.value?{height:d.value.offsetHeight,width:d.value.offsetWidth}:null});let v=w(()=>{if(!g.value)return{};let{height:e,width:t}=g.value,n=_.value&&t?_.value/t:1;return{height:`${Math.round(e*n)}px`}}),y=null,b=null;function S(){y?.disconnect(),b?.disconnect(),u.value&&(y=new IntersectionObserver(([e])=>{f.value=!e.isIntersecting},{threshold:1}),y.observe(u.value),b=new ResizeObserver(([e])=>{_.value=e.contentRect.width}),b.observe(u.value))}K(u,S);function C(){s.value&&(s.value={...s.value,autoplay:!0},c.value=!0)}function k(){s.value=null,c.value=!1,l.value=!1,f.value=!1,g.value=null,j()}function j(){pn(r,{currentVideoUrl:s.value?.videoUrl??null,isPlaying:l.value})}function M(e){if(s.value?.videoUrl===e.videoUrl&&c.value){o.value?.togglePlay();return}s.value=e,c.value=!1,l.value=!1,j(),c.value=!0}function N(e){if(!(!s.value||e.videoUrl!==s.value.videoUrl)){if(!c.value){s.value={...s.value,autoplay:!0},c.value=!0;return}o.value?.togglePlay()}}function F(e){e.type===`play`&&(l.value=!0),(e.type===`pause`||e.type===`ended`)&&(l.value=!1),j(),n(`state-change`,e)}return mn(i,M),mn(a,N),z(dn),R(()=>{fn(),y?.disconnect(),b?.disconnect()}),(t,n)=>(B(),D(`div`,{ref_key:`wrapperEl`,ref:u,class:`stage-wrapper`,style:L(v.value)},[O(`div`,{ref_key:`stageEl`,ref:d,class:I([`stage`,{"stage--minified":p.value,[`stage--pin-${e.pinPosition}`]:p.value}])},[p.value?(B(),D(`button`,{key:0,class:`stage__dismiss`,"aria-label":`Close`,onClick:q(k,[`stop`])},[A(G(Ge))])):E(`v-if`,!0),s.value&&c.value?(B(),T(cn,P({ref_key:`playerRef`,ref:o,key:s.value.videoUrl},s.value,{onStateChange:F}),null,16)):(B(),D(`div`,{key:2,class:`stage__idle`,style:L({aspectRatio:h.value}),onClick:C},[s.value?.poster?(B(),D(`img`,{key:0,src:s.value.poster,class:`stage__idle-poster`},null,8,hn)):E(`v-if`,!0),n[0]||=O(`div`,{class:`stage__idle-scrim`},null,-1),O(`div`,gn,[s.value?(B(),D(x,{key:0},[O(`div`,_n,[A(G(ht))]),O(`p`,vn,U(s.value.title),1)],64)):(B(),D(`p`,yn,`Select a video to play`))])],4))],2)],4))}}),[[`__scopeId`,`data-v-fb8c86cf`]]);const xn={class:`placeholder`},Sn=[`src`,`alt`],Cn={class:`placeholder__btn-wrap`},wn={key:2,class:`placeholder__footer`},Tn={class:`placeholder__title`};var En=Z(j({__name:`VideoPlaceholder`,props:{videoUrl:{type:String,required:!0},title:{type:String,required:!1,default:``},poster:{type:String,required:!1,default:``},aspectRatio:{type:String,required:!1,default:h},platform:{type:String,required:!1,default:``},techOptions:{type:Object,required:!1,default:()=>({})},adTagUrl:{type:String,required:!1,default:``},imaOptions:{type:Object,required:!1},autoplay:{type:Boolean,required:!1,default:!1},muted:{type:Boolean,required:!1},playbackRate:{type:Number,required:!1},nativeUi:{type:Boolean,required:!1,default:!1},autoStage:{type:Boolean,required:!1,default:!1},lazy:{type:Boolean,required:!1},payload:{type:Object,required:!1,default:()=>({})},action:{type:[String,Object,null],required:!1,default:null},focusMode:{type:Boolean,required:!1},disableTapCapture:{type:Boolean,required:!1}},setup(e){let t=e,{isPortrait:n,cssRatio:a}=m(t.aspectRatio),o=H(!1),s=H(!1);mn(r,e=>{o.value=e.currentVideoUrl===t.videoUrl,s.value=o.value&&e.isPlaying});function c(e){pn(i,{...t,...e!==void 0&&{autoplay:e}})}function l(){c(!0)}return z(()=>{t.autoStage&&c()}),(t,r)=>(B(),D(`div`,xn,[O(`div`,{class:I([`placeholder__shell`,{"placeholder__shell--portrait":G(n),"placeholder__shell--active":o.value}]),style:L({aspectRatio:G(a)}),onClick:l},[e.poster?(B(),D(`img`,{key:0,class:`placeholder__poster`,src:e.poster,alt:e.title},null,8,Sn)):E(`v-if`,!0),r[0]||=O(`div`,{class:`placeholder__scrim`},null,-1),e.platform?(B(),D(`span`,{key:1,class:I([`placeholder__badge`,`badge--${e.platform}`])},U(e.platform),3)):E(`v-if`,!0),O(`div`,Cn,[A(Q,{"is-playing":o.value&&s.value,size:`lg`,onTogglePlay:l},null,8,[`is-playing`])]),e.title?(B(),D(`div`,wn,[O(`p`,Tn,U(e.title),1)])):E(`v-if`,!0)],6)]))}}),[[`__scopeId`,`data-v-dbcb4f82`]]),Dn=j({__name:`VideoItem`,props:{videoUrl:{type:String,required:!0},title:{type:String,required:!1},poster:{type:String,required:!1},aspectRatio:{type:String,required:!1},platform:{type:String,required:!1},techOptions:{type:Object,required:!1},adTagUrl:{type:String,required:!1},imaOptions:{type:Object,required:!1},autoplay:{type:Boolean,required:!1},muted:{type:Boolean,required:!1},playbackRate:{type:Number,required:!1},nativeUi:{type:Boolean,required:!1},autoStage:{type:Boolean,required:!1},lazy:{type:Boolean,required:!1,default:!0},payload:{type:Object,required:!1},action:{type:[String,Object,null],required:!1,default:null},focusMode:{type:Boolean,required:!1},disableTapCapture:{type:Boolean,required:!1}},emits:[`state-change`],setup(e,{emit:t}){let n=e,r=t,i=H(!1);return(e,t)=>G(un)?(B(),T(En,ee(P({key:0},n)),null,16)):(B(),D(x,{key:1},[n.lazy&&!i.value&&!n.autoplay?(B(),T(En,P({key:0},n,{onClickCapture:t[0]||=e=>i.value=!0}),null,16)):(B(),T(cn,P({key:1},n,{autoplay:i.value||n.autoplay,onStateChange:t[1]||=e=>r(`state-change`,e)}),null,16,[`autoplay`]))],64))}});const On=M(cn,{shadowRoot:!1,styles:[re]}),kn=M(bn,{shadowRoot:!1}),An=M(En,{shadowRoot:!1}),jn=M(Dn,{shadowRoot:!1});customElements.define(`video-player`,On),customElements.define(`video-stage`,kn),customElements.define(`video-placeholder`,An),customElements.define(`video-item`,jn);export{jn as VideoItemElement,An as VideoPlaceholderElement,On as VideoPlayerElement,kn as VideoStageElement};
|
|
1
|
+
import{Fragment as e,Transition as t,computed as n,createBlock as r,createCommentVNode as i,createElementBlock as a,createElementVNode as o,createStaticVNode as s,createTextVNode as c,createVNode as l,defineComponent as u,defineCustomElement as d,inject as f,mergeProps as p,nextTick as m,normalizeClass as h,normalizeProps as g,normalizeStyle as _,onBeforeUnmount as v,onMounted as y,openBlock as b,provide as x,reactive as S,ref as C,toDisplayString as w,toRef as T,unref as E,watch as D,withCtx as O,withModifiers as k}from"vue";function A(){return/iPad|iPhone|iPod/.test(navigator.userAgent)||/Mac/.test(navigator.userAgent)&&navigator.maxTouchPoints>1}function j(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled)}function M(e){(e.requestFullscreen||e.webkitRequestFullscreen)?.call(e)}function N(){(document.exitFullscreen||document.webkitExitFullscreen)?.call(document)}function P(e){let[t,n]=e.split(`:`).map(Number);return{isPortrait:n>t,cssRatio:`${t}/${n}`}}function F(e){return!e||isNaN(e)?`0:00`:`${Math.floor(e/60)}:${String(Math.floor(e%60)).padStart(2,`0`)}`}function I(e,t=(...e)=>String(e[0])){let n={};return async(...r)=>{let i=t(...r);if(n[i])return n[i];let a=await e(...r);return n[i]=a,a}}function L(e){return e.filter(e=>e.src&&(e.type===`application/x-mpegURL`||e.type===`video/mp4`)).sort((e,t)=>e.type===`application/x-mpegURL`?-1:1)}const ee=`video-select`,R=`video-state`,z=`fullscreen-pending`,B=`fullscreen-pending-done`,V=`mvp-youtube`,H=`mvp-vimeo`,U=`mvp-dailymotion`,W=`mvp-ad-playing`,G=`mvp-ad-paused`,te=`16:9`,ne=[.5,.75,1,1.25,1.5,2],re=[[.25,`firstQuartile`],[.5,`midpoint`],[.75,`thirdQuartile`]];function ie(e){return e.match(/cdn\.jwplayer\.com\/videos\/([^-]+)/)?.[1]??e.match(/cdn\.jwplayer\.com\/manifests\/([^.]+)/)?.[1]??e.match(/^jwplayer:\/\/([^/]+)$/)?.[1]??null}function ae(e){let t=e?.advertising?.schedule;return Array.isArray(t)&&t.length?t[0].tag??null:e?.advertising?.tag??null}const oe=I(async e=>{let t=await fetch(`https://cdn.jwplayer.com/v2/media/${e}`);if(!t.ok)throw Error(`JW Platform API error: ${t.status}`);let n=(await t.json()).playlist?.[0];if(!n)throw Error(`JW Platform: empty playlist`);let r=L((n.sources??[]).map(e=>({src:e.file,type:e.type})));if(!r.length)throw Error(`JW Platform: no playable sources found`);return{src:r[0].src,type:r[0].type,poster:n.image??null,adTagUrl:ae(n)}});async function se(e){let t=ie(e);if(!t)throw Error(`JW Platform: unrecognised source URL: ${e}`);let n=await oe(t);if(e.startsWith(`jwplayer://`))return n;let r=/\.mp4(\?|#|$)/.test(e)?`video/mp4`:`application/x-mpegURL`;return{...n,src:e,type:r}}function ce(e){let t=e.match(/^brightcove:\/\/([^/]+)\/([^/]+)\/([^/]+)\/([^/]+)$/);return t?{accountId:t[1],playerId:t[2],embed:t[3],videoId:t[4]}:null}function le(e){return(e?.plugins??[]).find(e=>e.name===`ima3`)?.options?.serverUrl??null}const ue=I(async(e,t,n,r)=>{let i=await fetch(`https://players.brightcove.net/${e}/${t}_${n}/config.json`);if(!i.ok)throw Error(`Brightcove: could not load player config (${i.status})`);let a=await i.json(),o=r??a?.video_cloud?.policy_key;if(!o)throw Error(`Brightcove: policy_key not found in player config`);return{policyKey:o,adTagUrl:le(a)}},(e,t,n)=>`${e}/${t}_${n}`);async function de(e,t,n){let r=await fetch(`https://edge.api.brightcove.com/playback/v1/accounts/${e}/videos/${t}`,{headers:{Accept:`application/json;pk=${n}`}});if(!r.ok)throw Error(`Brightcove Playback API error: ${r.status}`);let i=await r.json(),a=L(i.sources||[]);if(!a.length)throw Error(`Brightcove: no playable sources found`);return{sources:a.map(e=>({src:e.src,type:e.type})),poster:i.poster??i.thumbnail??null}}async function fe(e,t){let n=ce(e);if(!n)throw Error(`Brightcove: invalid src — expected "brightcove://accountId/playerId/embed/videoId"`);let{accountId:r,playerId:i,embed:a,videoId:o}=n,{policyKey:s,adTagUrl:c}=await ue(r,i,a,t),{sources:l,poster:u}=await de(r,o,s);return{...l[0],poster:u,adTagUrl:c}}function K(){let e=new Map;function t(t,n){for(let r of Array.isArray(t)?t:[t])e.has(r)||e.set(r,new Set),e.get(r)?.add(n)}function n(t,n){e.get(t)?.delete(n)}function r(t,...n){e.get(t)?.forEach(e=>e(...n))}function i(){e.clear()}return{on:t,off:n,trigger:r,dispose:i}}const pe={};function me(e,t=e){return pe[t]||(pe[t]=new Promise((t,n)=>{let r=document.createElement(`script`);r.src=e,r.onload=()=>t(),r.onerror=()=>n(Error(`Failed to load script: ${e}`)),document.head.appendChild(r)})),pe[t]}let he=0;function ge(e,t){e.parentElement?.classList.add(t);let n=`${t}-${++he}`,r=document.createElement(`div`);r.id=n,r.className=`mvp-tech`,r.style.cssText=`width:100%;height:100%;top:0;left:0;position:absolute`;let i=document.createElement(`div`);return i.style.cssText=`width:100%;height:100%;position:absolute;inset:0;opacity:0;pointer-events:none;transition:opacity 0.2s`,i.appendChild(r),e.parentElement?.insertBefore(i,e),{techId:n,wrapper:i,innerDiv:r}}function _e(e,t){e.style.display=`none`,t.style.opacity=`1`,t.style.pointerEvents=``}function ve(e,t,n){t.remove(),e.parentElement?.classList.remove(n),e.style.display=``}function ye(e){return e.closest(`.player__shell`)}function be(e){e.trigger(z);let t=document.createElement(`div`);t.style.cssText=`position:fixed;inset:0;z-index:99999;opacity:0;pointer-events:none`,document.body.appendChild(t);let n=!1;function r(r){n||(n=!0,e.trigger(B),t.remove(),r?.())}return{overlay:t,finish:r}}function xe(e,t){return t===e.PlayerState.PLAYING||t===e.PlayerState.BUFFERING}function Se(e){let t={videoId:null,listId:null},n=e.match(/^.*(youtu\.be\/|v\/|u\/\w\/|embed\/|watch\?v=|shorts\/|&v=)([^#&?]*).*/);n?.[2]?.length===11&&(t.videoId=n[2]);let r=e.match(/[?&]list=([^#&?]+)/);return r?.[1]&&(t.listId=r[1]),t}let Ce=!1,we=!1;const q=[];function Te(){we||(we=!0,me(`https://www.youtube.com/iframe_api`).then(()=>{window.YT?.ready(()=>{Ce=!0,q.forEach(e=>e()),q.length=0})}))}function Ee(e,t){Te();let n=K(),{techId:r,wrapper:i}=ge(e,V),a=Se(t.src),o=null,s=a.videoId,c=!1,l=!1,u=!1,d=null,f=!1,p=null,m=!1,h=new Set,g=null,_={active:!1,wasPaused:!1,timeBefore:0,catchUpInterval:null};function v(e,t=0){let n=setTimeout(()=>{h.delete(n),e()},t);h.add(n)}function y(){try{let e=o?.getPlayerResponse()?.adPlacements;return Array.isArray(e)&&e.length>0}catch{return!1}}function b(e){o?.loadVideoById({videoId:e})}function x(e){o?.cueVideoById({videoId:e})}function S(){a.videoId&&(_.wasPaused=!1,c?s===a.videoId?o?.playVideo():(b(a.videoId),s=a.videoId):(n.trigger(`waiting`),l=!0))}function C(){_.catchUpInterval&&clearInterval(_.catchUpInterval),_.active=!1,_.wasPaused&&o?.pauseVideo(),n.trigger(`seeked`)}function w(){m=(o?.getAvailablePlaybackRates()??[]).length>1,c=!0,t.muted&&o?.mute(),l?S():u&&a.videoId&&(x(a.videoId),s=a.videoId)}function T(e){if(e===d||p!==null)return;d=e;let t=y();t!==f&&(f=t,n.trigger(t?`adstart`:`adend`));let r=window.YT;if(r){switch(e){case-1:n.trigger(`loadstart`),n.trigger(`loadedmetadata`),n.trigger(`durationchange`),n.trigger(`ratechange`);break;case r.PlayerState.ENDED:n.trigger(`ended`);break;case r.PlayerState.PLAYING:n.trigger(`timeupdate`),n.trigger(`durationchange`),n.trigger(`playing`),n.trigger(`play`),_.active&&C();break;case r.PlayerState.PAUSED:n.trigger(`canplay`),_.active||n.trigger(`pause`);break;case r.PlayerState.BUFFERING:n.trigger(`waiting`);break;case r.PlayerState.CUED:n.trigger(`canplay`);break}g&&=(clearInterval(g),null),e===r.PlayerState.PLAYING&&(g=setInterval(()=>n.trigger(`timeupdate`),250))}}function E(){let e={controls:+!!t.nativeUi,modestbranding:1,rel:0,showinfo:0,mute:+!!t.muted,origin:window.location.origin,allowfullscreen:1,fullscreen:1,fs:1,playsinline:1,...t.customVars};s=a.videoId,o=new window.YT.Player(r,{videoId:s??void 0,playerVars:e,events:{onReady:w,onStateChange:e=>T(e.data),onPlaybackRateChange:()=>n.trigger(`ratechange`),onVolumeChange:()=>n.trigger(`volumechange`),onError:e=>{p=e.data,n.trigger(`error`),v(()=>{p=null})}}})}Ce?E():q.push(E),t.autoplay?c?S():l=!0:a.videoId&&(u=!0);function D(){if(!o)return;let e=o.getCurrentTime(),{video_id:t}=o.getVideoData();o.pauseVideo();let{overlay:r,finish:i}=be(n),a=document.createElement(`div`);a.id=`yt-fs-${Math.random().toString(36).slice(2)}`,r.appendChild(a);let s=null,c=()=>{i(()=>{let t=s?.getCurrentTime()??e;try{s?.destroy()}catch{}o?.seekTo(t,!0),n.trigger(`timeupdate`)})};s=new window.YT.Player(a.id,{videoId:t,playerVars:{playsinline:0,autoplay:1,controls:1,modestbranding:1,rel:0,start:Math.floor(e)},events:{onReady:t=>{i(),t.target.seekTo(e,!0),t.target.playVideo()},onStateChange:e=>{let t=window.YT;t&&(e.data===t.PlayerState.PAUSED||e.data===t.PlayerState.ENDED)&&c()}}})}function O(){if(A()&&o){D();return}let t=ye(e);t&&M(t)}function k(){N()}return{el:i,play:S,pause:()=>o?.pauseVideo(),paused:()=>{if(!o)return!0;let e=window.YT;return!e||!xe(e,d)},currentTime:()=>o?.getCurrentTime()??0,setCurrentTime:e=>{if(!o)return;let t=window.YT;t&&d===t.PlayerState.PAUSED&&(_.timeBefore=o.getCurrentTime()),_.active||(_.wasPaused=!t||!xe(t,d)),o.seekTo(e,!0),n.trigger(`timeupdate`),n.trigger(`seeking`),_.active=!0,t&&d===t.PlayerState.PAUSED&&_.timeBefore!==e&&(_.catchUpInterval&&clearInterval(_.catchUpInterval),_.catchUpInterval=setInterval(()=>{d!==t.PlayerState.PAUSED||!_.active?_.catchUpInterval&&clearInterval(_.catchUpInterval):o&&o.getCurrentTime()!==_.timeBefore&&(n.trigger(`timeupdate`),C())},250))},duration:()=>o?.getDuration()??0,volume:()=>o?o.getVolume()/100:1,setVolume:e=>o?.setVolume(e*100),muted:()=>o?.isMuted()??!1,setMuted:e=>{o&&(e?o.mute():o.unMute(),v(()=>n.trigger(`volumechange`),50))},playbackRate:()=>o?.getPlaybackRate()??1,setPlaybackRate:e=>o?.setPlaybackRate(e),bufferedEnd:()=>o?.getVideoLoadedFraction?o.getVideoLoadedFraction()*o.getDuration():0,error:()=>p===null?null:{code:p,message:`This video could not be played.`},setSrc:e=>{let t=Se(e);a.videoId=t.videoId,a.listId=t.listId,a.videoId&&(c?(b(a.videoId),s=a.videoId):u=!0)},featuresPlaybackRate:()=>m,supportsFullScreen:j,enterFullscreen:O,exitFullscreen:k,on:n.on,off:n.off,dispose:()=>{if(h.forEach(clearTimeout),h.clear(),g&&clearInterval(g),_.catchUpInterval&&clearInterval(_.catchUpInterval),o)try{o.stopVideo(),o.destroy()}catch{}else{let e=q.indexOf(E);e!==-1&&q.splice(e,1)}o=null,ve(e,i,V),n.dispose()}}}function De(e){return e.match(/(?:vimeo\.com\/(?:video\/|channels\/[^/]+\/|groups\/[^/]+\/videos\/)?|player\.vimeo\.com\/video\/)(\d+)/)?.[1]??null}function Oe(e,t){let n=K(),{techId:r,wrapper:i}=ge(e,H),a=De(t.src),o=null,s=0,c=0,l=1,u=!1,d=!0,f=1,p=!1,m=!1,h=!1,g=null,_=new Set;function v(e,t=0){let n=setTimeout(()=>{_.delete(n),e()},t);_.add(n)}function y(){if(!o){m=!0;return}o.play().catch(()=>{})}function b(){t.muted&&o?.setMuted(!0).catch(()=>{}),m&&y()}async function x(e){if(await me(`https://player.vimeo.com/api/player.js`,`vimeo`),h||!window.Vimeo)return;let i={id:Number(e),byline:!1,portrait:!1,title:!1,transparent:!0,controls:!!t.nativeUi,autopause:!1,...t.autoplay!==void 0&&{autoplay:t.autoplay},...t.muted!==void 0&&{muted:t.muted}};o=new window.Vimeo.Player(r,i),t.autoplay&&(m=!0),o.ready().then(b).catch(e=>{g={code:4,message:e?.message||`This video is unavailable or cannot be embedded here.`},n.trigger(`error`)}),o.on(`play`,()=>{d=!1,n.trigger(`play`),n.trigger(`playing`)}),o.on(`pause`,()=>{d=!0,n.trigger(`pause`)}),o.on(`ended`,()=>{d=!0,n.trigger(`ended`)}),o.on(`timeupdate`,e=>{let{seconds:t,duration:r}=e;s=t,c=r,n.trigger(`timeupdate`),r&&!p&&(p=!0,n.trigger(`durationchange`))}),o.on(`loaded`,()=>{p=!1,n.trigger(`loadedmetadata`),n.trigger(`durationchange`)}),o.on(`seeking`,e=>{s=e.seconds,n.trigger(`seeking`)}),o.on(`seeked`,e=>{s=e.seconds,n.trigger(`seeked`),n.trigger(`timeupdate`)}),o.on(`bufferstart`,()=>n.trigger(`waiting`)),o.on(`bufferend`,()=>n.trigger(`canplay`)),o.on(`volumechange`,e=>{l=e.volume,n.trigger(`volumechange`)}),o.on(`error`,()=>n.trigger(`error`))}a&&x(a);function S(){if(!A()){let t=ye(e);t&&M(t);return}o?.requestFullscreen().catch(()=>{})}function C(){N()}return{el:i,play:y,pause:()=>o?.pause().catch(()=>{}),paused:()=>d,currentTime:()=>s,setCurrentTime:e=>{o?.setCurrentTime(e).catch(()=>{}),n.trigger(`timeupdate`),n.trigger(`seeking`)},duration:()=>c,volume:()=>l,setVolume:e=>{l=e,o?.setVolume(e).catch(()=>{})},muted:()=>u,setMuted:e=>{u=e,o?.setMuted(e).then(()=>v(()=>n.trigger(`volumechange`),50)).catch(()=>{})},playbackRate:()=>f,setPlaybackRate:e=>{f=e,o?.setPlaybackRate(e).catch(()=>{}),n.trigger(`ratechange`)},bufferedEnd:()=>s,error:()=>g,setSrc:()=>{},featuresPlaybackRate:()=>!1,supportsFullScreen:j,enterFullscreen:S,exitFullscreen:C,on:n.on,off:n.off,dispose:()=>{h=!0,_.forEach(clearTimeout),_.clear(),o?.destroy().catch(()=>{}),o=null,ve(e,i,H),n.dispose()}}}function ke(e){let t=e.match(/[?&]video=([a-zA-Z0-9]+)/);return t?t[1]:e.match(/(?:dailymotion\.com\/(?:embed\/)?video\/|dai\.ly\/)([a-zA-Z0-9]+)/)?.[1]??null}function Ae(e,t){let n=K(),{techId:r,wrapper:i}=ge(e,U),a=ye(e),o=ke(t.src),s=typeof t.customVars?.playerId==`string`?t.customVars.playerId:void 0,c=null,l=0,u=0,d=1,f=!1,p=!0,m=!1,h=!1,g=null;async function _(){if(!o){g={code:4,message:`Could not parse video ID from source URL`},n.trigger(`error`);return}try{let e=await me(s?`https://geo.dailymotion.com/libs/player/${s}.js`:`https://geo.dailymotion.com/libs/player.js`,s||`dailymotion-sdk`).then(()=>window.dailymotion);if(!e)return;let i=await e.createPlayer(r,{...s&&{player:s},video:o,params:{autoplay:!!t.autoplay,mute:!!t.muted}});c=i;let a=e.events;m&&i.play(),i.on(a.PLAYER_CRITICALPATHREADY,e=>{let t=e.videoThumbnails;if(!t)return;let r=Object.keys(t).map(Number).sort((e,t)=>t-e)[0],i=r===void 0?void 0:t[r];i&&n.trigger(`posterchange`,i)}),i.on(a.VIDEO_PLAY,()=>{p=!1,n.trigger(`play`),n.trigger(`playing`),!t.autoplay&&!h&&(h=!0,i.pause())}),i.on(a.VIDEO_PLAYING,()=>{p=!1,n.trigger(`play`),n.trigger(`playing`)}),i.on(a.VIDEO_PAUSE,()=>{p=!0,n.trigger(`pause`)}),a.VIDEO_BUFFERING&&i.on(a.VIDEO_BUFFERING,()=>n.trigger(`waiting`)),i.on(a.VIDEO_END,()=>{p=!0,n.trigger(`ended`)}),i.on(a.VIDEO_TIMECHANGE,e=>{l=e.videoTime??l,u=e.videoDuration??u,n.trigger(`timeupdate`)}),i.on(a.VIDEO_DURATIONCHANGE,e=>{u=e.videoDuration??u,n.trigger(`durationchange`)}),i.on(a.VIDEO_SEEKSTART,()=>n.trigger(`seeking`)),i.on(a.VIDEO_SEEKEND,e=>{l=e.videoTime??l,n.trigger(`seeked`)}),i.on(a.PLAYER_VOLUMECHANGE,e=>{d=e.playerVolume??d,f=e.playerIsMuted??f,n.trigger(`volumechange`)}),i.on(a.PLAYER_ERROR,()=>n.trigger(`error`)),a.AD_START&&i.on(a.AD_START,()=>{p=!1,n.trigger(`play`),n.trigger(`adstart`)}),a.AD_END&&i.on(a.AD_END,()=>n.trigger(`adend`))}catch(e){g={code:4,message:e instanceof Error?e.message:`This video could not be played.`},n.trigger(`error`)}}_();function v(){c?c.play():m=!0}function y(){if(A()){c?.setFullscreen(!0);return}a&&M(a)}function b(){if(A()){c?.setFullscreen(!1);return}N()}return{el:i,play:v,pause:()=>c?.pause(),paused:()=>p,currentTime:()=>l,setCurrentTime:e=>{l=e,c?.seek(e),n.trigger(`seeking`)},duration:()=>u,volume:()=>d,setVolume:e=>{d=e,c?.setVolume(e)},muted:()=>f,setMuted:e=>{f=e,c?.setMute(e)},playbackRate:()=>1,setPlaybackRate:()=>{},bufferedEnd:()=>l,error:()=>g,setSrc:()=>{},featuresPlaybackRate:()=>!1,supportsFullScreen:j,enterFullscreen:y,exitFullscreen:b,on:n.on,off:n.off,dispose:()=>{c?.destroy?.(),c=null,ve(e,i,U),n.dispose()}}}const je=[{test:e=>/youtu\.be|youtube\.com/.test(e),key:`youtube`,embed:!0},{test:e=>/vimeo\.com|player\.vimeo\.com/.test(e),key:`vimeo`,embed:!0},{test:e=>/dailymotion\.com|dai\.ly/.test(e),key:`dailymotion`,embed:!0},{test:e=>/cdn\.jwplayer\.com/.test(e)||e.startsWith(`jwplayer://`),key:`jwplayer`,embed:!1},{test:e=>e.startsWith(`brightcove://`),key:`brightcove`,embed:!1}];function Me(e){return je.find(t=>t.test(e))?.key??`html5`}function Ne(e){if(/\.m3u8(\?|#|$)/.test(e))return`application/x-mpegURL`;if(/\.mp4(\?|#|$)/.test(e))return`video/mp4`}function Pe(e){return je.find(t=>t.test(e))?.embed??!1}const Fe={youtube:Ee,vimeo:Oe,dailymotion:Ae};function Ie(e,t,n){let r=Fe[Me(e)];return r?r(t,n):null}async function Le(e){let t=Me(e);return t===`jwplayer`?se(e):t===`brightcove`?fe(e):{src:e,type:Ne(e)}}const Re=[`play`,`pause`,`ended`,`error`,`timeupdate`,`durationchange`,`progress`,`volumechange`,`ratechange`,`seeking`,`seeked`,`waiting`,`playing`,`canplay`];function ze(e,t){let n=K(),r=null,i=!1,a=null;async function o(t){let{default:n}=await import(`hls.js`);if(!(i||a!==t)){if(!n.isSupported()){e.src=t;return}r=new n({liveDurationInfinity:!0}),r.loadSource(t),r.attachMedia(e)}}function s(t,n){if(r?.destroy(),r=null,a=null,n===`application/x-mpegURL`){a=t,o(t);return}e.src=t}let c=e=>()=>n.trigger(e),l=Re.map(e=>[e,c(e)]);for(let[t,n]of l)e.addEventListener(t,n);let u=[[`webkitbeginfullscreen`,c(`nativefullscreenenter`)],[`webkitendfullscreen`,c(`nativefullscreenexit`)]];for(let[t,n]of u)e.addEventListener(t,n);e.poster=t.poster??``,e.muted=t.muted??t.autoplay??!1,e.playbackRate=t.playbackRate??1,e.playsInline=!0,s(t.src,t.type),t.autoplay&&e.play();function d(){let t=e;if(typeof t.webkitEnterFullscreen==`function`){t.webkitEnterFullscreen();return}let n=e.closest(`.player__shell`);n instanceof HTMLElement&&M(n)}function f(){let t=e;if(typeof t.webkitExitFullscreen==`function`){t.webkitExitFullscreen();return}N()}return{el:e,play:()=>e.play(),pause:()=>e.pause(),paused:()=>e.paused,currentTime:()=>e.currentTime,setCurrentTime:t=>{e.currentTime=t},duration:()=>e.duration,volume:()=>e.volume,setVolume:t=>{e.volume=t},muted:()=>e.muted,setMuted:t=>{e.muted=t},playbackRate:()=>e.playbackRate,setPlaybackRate:t=>{e.playbackRate=t},bufferedEnd:()=>{let{buffered:t,duration:n}=e;if(!t.length)return 0;let r=t.end(t.length-1);return n&&r>n?n:r},error:()=>{let t=e.error;return t?{code:t.code,message:t.message||`This video could not be played.`}:null},setSrc:s,featuresPlaybackRate:()=>!0,supportsFullScreen:j,enterFullscreen:d,exitFullscreen:f,on:n.on,off:n.off,dispose:()=>{i=!0,r?.destroy();for(let[t,n]of l)e.removeEventListener(t,n);for(let[t,n]of u)e.removeEventListener(t,n);n.dispose()}}}function Be(){return window.google?.ima?Promise.resolve():new Promise((e,t)=>{let n=document.createElement(`script`);n.src=`https://imasdk.googleapis.com/js/sdkloader/ima3.js`,n.onload=()=>e(),n.onerror=()=>t(Error(`Failed to load Google IMA SDK`)),document.head.appendChild(n)})}function Ve(e,t,n,r){let i=document.createElement(`div`);i.className=`ima-ad-container`,e.appendChild(i);let a=null,o=null,s=null,c=!1,l=!1,u=!1,d=!1,f=!1,p=!1,m=1,h=new ResizeObserver(([e])=>{let t=window.google?.ima;if(!s||!t)return;let{width:n,height:r}=e.contentRect;s.resize(n,r,t.ViewMode.NORMAL)});h.observe(t);function g(){o?.contentComplete()}function _(t){d=t,e.classList.toggle(W,t),t||(f=!1,e.classList.remove(G))}function v(){if(c||!l||!u||!a||!o)return;c=!0;let e=window.google?.ima;if(!e)return;a.initialize();let t=new e.AdsRequest;t.adTagUrl=n,o.requestAds(t)}Be().then(()=>{if(p)return;let n=window.google?.ima;n&&(a=new n.AdDisplayContainer(i,t),o=new n.AdsLoader(a),l=!0,o.addEventListener(n.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,i=>{if(p)return;let a=new n.AdsRenderingSettings;a.restoreCustomPlaybackStateOnAdBreakComplete=!0,s=i.getAdsManager(t,a),t.addEventListener(`ended`,g),s.addEventListener(n.AdEvent.Type.CONTENT_PAUSE_REQUESTED,()=>{t.removeEventListener(`ended`,g),t.pause(),_(!0),r.onAdStart();let e=s?.getVolume()??1;e>0&&(m=e),r.onAdMuteChange(e===0)}),s.addEventListener(n.AdEvent.Type.CONTENT_RESUME_REQUESTED,()=>{t.addEventListener(`ended`,g),_(!1),r.onAdEnd(),t.ended||t.play()}),s.addEventListener(n.AdEvent.Type.PAUSED,()=>{f=!0,e.classList.add(G),r.onAdPauseChange(!0)}),s.addEventListener(n.AdEvent.Type.RESUMED,()=>{f=!1,e.classList.remove(G),r.onAdPauseChange(!1)}),s.addEventListener(n.AdEvent.Type.AD_PROGRESS,()=>{r.onAdProgress(s?.getRemainingTime()??0)}),s.addEventListener(n.AdErrorEvent.Type.AD_ERROR,e=>{_(!1),r.onError(e.getError().getMessage()),t.play()});try{s.init(t.clientWidth,t.clientHeight,n.ViewMode.NORMAL),s.start()}catch(e){r.onError(e instanceof Error?e.message:`Ad playback failed to start.`)}}),o.addEventListener(n.AdErrorEvent.Type.AD_ERROR,e=>{r.onError(e.getError().getMessage())}),v())}).catch(e=>r.onError(e.message));function y(){u=!0,v()}function b(){if(!s)return;let e=s.getVolume();e>0?(m=e,s.setVolume(0)):s.setVolume(m||1),r.onAdMuteChange(s.getVolume()===0)}return{isAdPlaying:()=>d,isAdPaused:()=>f,requestAdsOnFirstPlay:y,pauseAd:()=>s?.pause(),resumeAd:()=>s?.resume(),toggleAdMute:b,dispose:()=>{p=!0,h.disconnect(),t.removeEventListener(`ended`,g),s?.destroy(),o?.destroy(),i.remove(),e.classList.remove(W,G)}}}const He=new Set;function Ue(e){return He.add(e),()=>He.delete(e)}function We(e){He.forEach(t=>{if(t!==e)try{t()}catch{}})}function Ge(e){let t=C(!1),n=C(!1);function r(){let e=document;t.value=!!(document.fullscreenElement||e.webkitFullscreenElement),n.value=!1}function i(){let n=e();if(n){if(t.value){n.exitFullscreen();return}n.enterFullscreen()}}function a(){n.value=!0}function o(e){e.on(z,()=>{n.value=!0}),e.on(B,()=>{n.value=!1}),e.on(`nativefullscreenenter`,()=>{t.value=!0,n.value=!1}),e.on(`nativefullscreenexit`,()=>{t.value=!1,n.value=!1})}return y(()=>{document.addEventListener(`fullscreenchange`,r),document.addEventListener(`webkitfullscreenchange`,r)}),v(()=>{document.removeEventListener(`fullscreenchange`,r),document.removeEventListener(`webkitfullscreenchange`,r)}),{isFullscreen:t,isFullscreenPending:n,toggleFullscreen:i,markFullscreenPending:a,attachPlayerEvents:o}}function Ke(){let e=C(!1),t=null;function n(){clearTimeout(t??void 0),e.value=!1}function r(r){r.on(`waiting`,()=>{clearTimeout(t??void 0),t=setTimeout(()=>{e.value=!0},500)}),r.on(`playing`,n),r.on(`canplay`,n)}return v(()=>clearTimeout(t??void 0)),{isBuffering:e,attachPlayerEvents:r,reset:n}}function qe(e,t,n){let r=new Set;function i(){if(!t.value)return;let i=e.value/t.value;for(let[e,t]of re)!r.has(e)&&i>=e&&(r.add(e),n(t))}function a(){r.clear()}return{checkQuartiles:i,reset:a}}function Je(){try{return JSON.parse(localStorage.getItem(`player:positions`)??`[]`)}catch{return[]}}function Ye(e){localStorage.setItem(`player:positions`,JSON.stringify(e))}function Xe(e,t){if(t<5)return;let n=Je().filter(t=>t.url!==e);n.unshift({url:e,time:t}),Ye(n.slice(0,5))}function Ze(e){return Je().find(t=>t.url===e)?.time??null}function Qe(e){Ye(Je().filter(t=>t.url!==e))}function $e(e,t,n){let r=!1;function i(t){if(r)return;let n=Ze(e);n&&t.setCurrentTime(n),r=!0}function a(t){!t||n.value||Xe(e,t.currentTime()??0)}function o(){Qe(e)}function s(){document.visibilityState===`hidden`&&a(t())}return y(()=>document.addEventListener(`visibilitychange`,s)),v(()=>{a(t()),document.removeEventListener(`visibilitychange`,s)}),{restoreOnce:i,save:a,clear:o}}function et(e,t,n,r){let i=null;y(()=>{let a=e.value?.closest(`.player__shell`);a&&(i=new IntersectionObserver(([e])=>{let i=t();!e.isIntersecting&&i&&!i.paused()&&!n.value&&!r.value&&i.pause()},{threshold:.1}),i.observe(a))}),v(()=>i?.disconnect())}function tt(e,t,n,r,i,a){function o(){let n=e();if(!(!n||!t.value)){if(!a.value){n.play();return}n.pause()}}function s(t){e()?.setCurrentTime(n.value*(t/100))}function c(){let t=e();t?.setMuted(!t.muted())}function l(t){let n=e();n&&(n.setVolume(t),n.setMuted(t===0))}function u(){r.value=!r.value}function d(t){let n=e();n&&(n.setPlaybackRate(t),i.value=t)}return{togglePlay:o,seek:s,toggleMute:c,setVolume:l,toggleLoop:u,setPlaybackRate:d}}function nt(e,t){let{isPlaying:n,hasEnded:r,isReady:i,isAdPlaying:a,isLive:o,current:s,total:c,buffered:l,vol:u,isMuted:d,isLooping:f,playbackRate:p,supportsPlaybackRate:m,hasStarted:h,isError:g,errorMessage:_}=e,{fire:v,pauseThisPlayer:y,positionMemory:b,quartiles:x,buffering:S,fullscreen:C}=t;function w(e){i.value=!0,m.value=e.featuresPlaybackRate();let t=()=>{let t=e.duration();if(t===1/0){o.value=!0;return}o.value=!1,t&&t>0&&isFinite(t)&&(c.value=t)};e.on(`adstart`,()=>{We(y),a.value=!0,v(`adstart`)}),e.on(`adend`,()=>{a.value=!1,v(`adend`)}),e.on(`play`,()=>{We(y),h.value=!0,n.value=!0,r.value=!1,o.value||b.restoreOnce(e),v(`play`)}),e.on(`pause`,()=>{n.value=!1,o.value||b.save(e),v(`pause`)}),e.on(`ended`,()=>{if(n.value=!1,x.reset(),S.reset(),f.value){e.setCurrentTime(0),e.play();return}c.value&&(s.value=c.value),r.value=!0,b.clear(),v(`ended`)}),e.on(`seeked`,()=>{v(`seeked`)}),e.on(`error`,()=>{let t=e.error();_.value=t?.message||`This video could not be played.`,g.value=!0,i.value=!0,v(`error`,{error:t})}),e.on(`timeupdate`,()=>{r.value||(s.value=e.currentTime()??0,c.value||t(),m.value||=e.featuresPlaybackRate(),o.value||x.checkQuartiles())}),e.on(`durationchange`,t),e.on(`progress`,()=>{let t=e.duration();l.value=t?e.bufferedEnd()/t*100:0}),e.on(`volumechange`,()=>{let t=e.muted();u.value=e.volume()??1,d.value=t??!1,h.value&&v(`volumechange`,{isMuted:t})}),e.on(`ratechange`,()=>{let t=e.playbackRate()??1;p.value=t,h.value&&v(`ratechange`,{playbackRate:t})}),S.attachPlayerEvents(e),C.attachPlayerEvents(e)}return{attachPlayerEvents:w}}function rt(e,t,r){let i=null,a=null,o=null,s=null,c=C(!1),l=C(!1),u=C(!1),d=C(!1),f=C(!1),p=C(!1),m=C(0),h=C(!1),g=C(0),_=C(0),b=C(0),x=C(1),S=C(t.muted??t.autoplay??!1),w=C(!1),T=C(t.playbackRate??1),E=C(!1),O=C(!1),k=C(!1),A=C(``),j=C(!1),M=n(()=>_.value?g.value/_.value*100:0),N=n(()=>Math.max(b.value,M.value)),P=()=>i,I=Ge(P),L=Ke(),ee=$e(t.videoUrl,P,l);function R(e,n={}){r(`state-change`,{type:e,currentTime:g.value,duration:_.value,src:t.videoUrl,...n,payload:t.payload})}let z=qe(g,_,R);function B(){!i||!s||(k.value=!1,A.value=``,i.setSrc(s.src,s.type))}function V(){a?.toggleAdMute()}function H(){if(a?.isAdPlaying()){a.pauseAd();return}i?.pause()}function U(){if(a?.isAdPlaying()){a.isAdPaused()?a.resumeAd():a.pauseAd();return}W.togglePlay()}let W=tt(P,u,_,w,T,c),{attachPlayerEvents:G}=nt({isPlaying:c,hasEnded:l,isReady:u,isAdPlaying:d,isLive:h,current:g,total:_,buffered:b,vol:x,isMuted:S,isLooping:w,playbackRate:T,supportsPlaybackRate:E,hasStarted:O,isError:k,errorMessage:A},{fire:R,pauseThisPlayer:H,positionMemory:ee,quartiles:z,buffering:L,fullscreen:I});return D(()=>t.muted,e=>{!i||e===void 0||i.setMuted(e)}),D(()=>t.playbackRate,e=>{!i||e===void 0||i.setPlaybackRate(e)}),et(e,P,I.isFullscreen,I.isFullscreenPending),D(O,t=>{!t||!e.value||!i||i.el===e.value||_e(e.value,i.el)}),y(async()=>{if(Pe(t.videoUrl)){if(!e.value)return;let n=Ie(t.videoUrl,e.value,{src:t.videoUrl,poster:t.poster,autoplay:t.autoplay,muted:t.muted??t.autoplay,nativeUi:t.nativeUi});if(!n){k.value=!0,u.value=!0,A.value=`This platform is not yet supported.`;return}j.value=!!t.nativeUi,i=n,s={src:t.videoUrl},o=Ue(H),G(i);return}let n=await Le(t.videoUrl).catch(()=>({src:t.videoUrl}));if(!e.value)return;s={src:n.src,type:n.type},i=ze(e.value,{src:n.src,type:n.type,poster:n.poster||t.poster||``,autoplay:t.autoplay,muted:t.muted??t.autoplay,playbackRate:T.value});let r=t.adTagUrl||n.adTagUrl||``;r&&e.value.parentElement&&(a=Ve(e.value.parentElement,e.value,r,{onAdStart:()=>{d.value=!0,f.value=!1,R(`adstart`)},onAdEnd:()=>{d.value=!1,f.value=!1,m.value=0,R(`adend`)},onAdPauseChange:e=>{f.value=e,e||We(H)},onAdMuteChange:e=>{p.value=e},onAdProgress:e=>{m.value=e},onError:e=>{d.value=!1,f.value=!1,m.value=0,console.error(`Ad playback error for ${r}:`,e)}}),i.on(`play`,()=>a?.requestAdsOnFirstPlay())),o=Ue(H),G(i)}),v(()=>{o?.(),a?.dispose(),a=null,i?.dispose(),i=null}),{isPlaying:c,hasEnded:l,isReady:u,isAdPlaying:d,isAdPaused:f,isAdMuted:p,adRemainingTime:m,isLive:h,isBuffering:L.isBuffering,current:g,total:_,vol:x,isMuted:S,isLooping:w,playbackRate:T,hasStarted:O,isError:k,errorMessage:A,progress:M,bufferedDisplay:N,isFullscreen:I.isFullscreen,isFullscreenPending:I.isFullscreenPending,fmt:F,fire:R,retry:B,togglePlay:U,seek:W.seek,toggleMute:W.toggleMute,setVolume:W.setVolume,toggleFullscreen:I.toggleFullscreen,markFullscreenPending:I.markFullscreenPending,toggleLoop:W.toggleLoop,toggleAdMute:V,setPlaybackRate:W.setPlaybackRate,supportsPlaybackRate:E,nativeUi:j}}function it(e){let t=C(!0),n=C(!1),r=null,i=0;function a(e=400){i=Date.now()+e}function o(e=3500){clearTimeout(r??void 0),r=setTimeout(()=>{t.value=!1,n.value=!1},e)}function s(){clearTimeout(r??void 0)}function c(){n.value=!0,t.value=!0,o()}function l(){n.value=!1,e.value&&o()}function u(){e.value&&o()}function d(){t.value=!0,e.value&&o()}function f(){t.value=!0,o()}function p(){Date.now()<i||e.value&&o(600)}return D(e,e=>{if(!e){clearTimeout(r??void 0),t.value=!0;return}o()}),v(()=>clearTimeout(r??void 0)),{showHUD:t,isOpen:n,scheduleHide:o,pauseHide:s,onVideoTap:d,onMouseMove:f,onMouseLeave:p,openControls:c,closeControls:l,keepOpen:u,suppressMouseLeave:a}}const J=Symbol(`player`),Y=Symbol(`hud`),at=Symbol(`action`),ot=Symbol(`compact`);function X(e){let t=f(e);if(t===void 0)throw Error(`[video-player] missing "${String(e.description)}" context — this component must be rendered inside <VideoPlayer>`);return t}function st(e,t){return{hudVisible:n(()=>!e.isReady||e.isError?!1:t.showHUD),popupVisible:n(()=>!e.isReady||e.isError?!1:e.isFullscreen?t.showHUD:t.isOpen)}}function ct(e,t){return n(()=>!(!e?.value||t.isFullscreen))}function lt(e,t){let r=n(()=>e?.value??null),i=n(()=>!!r.value&&typeof r.value==`object`),a=n(()=>i.value?r.value:null),o=n(()=>r.value===`mute`?t.isMuted?`Unmute`:`Mute`:r.value===`loop`?t.isLooping?`Disable loop`:`Loop`:``);function s(){r.value===`mute`?t.toggleMute():r.value===`loop`&&t.toggleLoop()}return{currentAction:r,isCustom:i,customAction:a,builtinLabel:o,onBuiltinClick:s}}var Z=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n};const ut={},dt={viewBox:`0 0 24 24`,fill:`currentColor`};function ft(e,t){return b(),a(`svg`,dt,[...t[0]||=[o(`path`,{d:`M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z`},null,-1)]])}var pt=Z(ut,[[`render`,ft]]);const mt={},ht={viewBox:`0 0 24 24`,fill:`currentColor`};function gt(e,t){return b(),a(`svg`,ht,[...t[0]||=[o(`path`,{d:`M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z`},null,-1)]])}var _t=Z(mt,[[`render`,gt]]);const vt={},yt={viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`};function bt(e,t){return b(),a(`svg`,yt,[...t[0]||=[s(`<line x1="4" y1="6" x2="20" y2="6"></line><line x1="4" y1="12" x2="20" y2="12"></line><line x1="4" y1="18" x2="20" y2="18"></line><circle cx="9" cy="6" r="2.5" fill="currentColor" stroke="none"></circle><circle cx="15" cy="12" r="2.5" fill="currentColor" stroke="none"></circle><circle cx="9" cy="18" r="2.5" fill="currentColor" stroke="none"></circle>`,6)]])}var xt=Z(vt,[[`render`,bt]]);const St={},Ct={viewBox:`0 0 24 24`,fill:`currentColor`};function wt(e,t){return b(),a(`svg`,Ct,[...t[0]||=[o(`path`,{d:`M4 12l1.41 1.41L11 7.83V20h2V7.83l5.59 5.58L20 12l-8-8-8 8z`},null,-1)]])}var Tt=Z(St,[[`render`,wt]]);const Et={},Dt={viewBox:`0 0 24 24`,fill:`currentColor`};function Ot(e,t){return b(),a(`svg`,Dt,[...t[0]||=[o(`path`,{d:`M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z`},null,-1)]])}var kt=Z(Et,[[`render`,Ot]]);const At={},jt={viewBox:`0 0 24 24`,fill:`currentColor`};function Mt(e,t){return b(),a(`svg`,jt,[...t[0]||=[o(`path`,{d:`M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z`},null,-1)]])}var Nt=Z(At,[[`render`,Mt]]);const Pt={},Ft={viewBox:`0 0 24 24`,fill:`currentColor`};function It(e,t){return b(),a(`svg`,Ft,[...t[0]||=[o(`path`,{d:`M7 7h10v3l4-4-4-4v3H5v6h2V7zm10 10H7v-3l-4 4 4 4v-3h12v-6h-2v4z`},null,-1)]])}var Lt=Z(Pt,[[`render`,It]]);const Rt={},zt={viewBox:`0 0 24 24`,fill:`currentColor`};function Bt(e,t){return b(),a(`svg`,zt,[...t[0]||=[o(`path`,{d:`M6 19h4V5H6v14zm8-14v14h4V5h-4z`},null,-1)]])}var Vt=Z(Rt,[[`render`,Bt]]);const Ht={},Ut={viewBox:`0 0 24 24`,fill:`currentColor`};function Wt(e,t){return b(),a(`svg`,Ut,[...t[0]||=[o(`path`,{d:`M8 5v14l11-7z`},null,-1)]])}var Gt=Z(Ht,[[`render`,Wt]]);const Kt={},qt={viewBox:`0 0 24 24`,fill:`currentColor`};function Jt(e,t){return b(),a(`svg`,qt,[...t[0]||=[o(`path`,{d:`M12 5V1L7 6l5 5V7c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6H4c0 4.42 3.58 8 8 8s8-3.58 8-8-3.58-8-8-8z`},null,-1)]])}var Yt=Z(Kt,[[`render`,Jt]]);const Xt={},Zt={viewBox:`0 0 24 24`,fill:`currentColor`};function Qt(e,t){return b(),a(`svg`,Zt,[...t[0]||=[o(`path`,{d:`M16.5 12A4.5 4.5 0 0 0 14 7.97v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51A8.796 8.796 0 0 0 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06A8.99 8.99 0 0 0 17.73 18L19 19.27 20.27 18 5.27 3 4.27 3zM12 4L9.91 6.09 12 8.18V4z`},null,-1)]])}var $t=Z(Xt,[[`render`,Qt]]);const en={},tn={viewBox:`0 0 24 24`,fill:`currentColor`};function nn(e,t){return b(),a(`svg`,tn,[...t[0]||=[o(`path`,{d:`M3 9v6h4l5 5V4L7 9H3zm13.5 3A4.5 4.5 0 0 0 14 7.97v8.05c1.48-.73 2.5-2.25 2.5-4.02z`},null,-1)]])}var rn=Z(en,[[`render`,nn]]);const an=[`aria-label`];var Q=Z(u({__name:`PlayPauseButton`,props:{isPlaying:{type:Boolean,required:!0},hasEnded:{type:Boolean,required:!1,default:!1},size:{type:String,required:!1,default:`sm`}},emits:[`toggle-play`],setup(e){let t=e,i=n(()=>t.isPlaying?`Pause`:t.hasEnded?`Replay`:`Play`);return(t,n)=>(b(),a(`button`,{class:h([`ppbtn`,`ppbtn--${e.size}`]),"aria-label":i.value,onClick:n[0]||=k(e=>t.$emit(`toggle-play`),[`stop`])},[e.isPlaying?(b(),r(E(Vt),{key:0})):e.hasEnded?(b(),r(E(Yt),{key:1})):(b(),r(E(Gt),{key:2}))],10,an))}}),[[`__scopeId`,`data-v-85902525`]]),on=u({__name:`VolumeIcon`,setup(e){let t=X(J),i=n(()=>!t.isMuted&&t.vol>0);return(e,t)=>i.value?(b(),r(E(rn),{key:0})):(b(),r(E($t),{key:1}))}}),$=Z(u({__name:`Spinner`,props:{size:{type:Number,required:!1,default:14},borderWidth:{type:Number,required:!1,default:2}},setup(e){return(t,n)=>(b(),a(`div`,{class:`spinner`,style:_({width:`${e.size}px`,height:`${e.size}px`,borderWidth:`${e.borderWidth}px`})},null,4))}}),[[`__scopeId`,`data-v-259be2b2`]]);const sn={class:`hud`},cn=[`aria-label`],ln=[`aria-label`],un=[`aria-label`,`innerHTML`],dn={key:3,class:`hud__spacer`},fn={class:`hud__play-wrap`};var pn=Z(u({__name:`HudButtons`,setup(t){let n=X(J),s=X(Y),{currentAction:c,isCustom:u,customAction:d,builtinLabel:p,onBuiltinClick:m}=lt(f(at),n);return(t,f)=>(b(),a(`div`,sn,[!E(s).isOpen&&!E(n).isFullscreen?(b(),a(e,{key:0},[E(c)===`mute`?(b(),a(`button`,{key:0,class:h([`hud__btn`,{"hud__btn--active":E(n).isMuted}]),"aria-label":E(p),onClick:f[0]||=k((...e)=>E(m)&&E(m)(...e),[`stop`])},[l(on)],10,cn)):E(c)===`loop`?(b(),a(`button`,{key:1,class:h([`hud__btn`,{"hud__btn--active":E(n).isLooping}]),"aria-label":E(p),onClick:f[1]||=k((...e)=>E(m)&&E(m)(...e),[`stop`])},[l(E(Lt))],10,ln)):E(u)&&E(d)?(b(),a(`button`,{key:2,class:`hud__btn`,"aria-label":E(d).label,onClick:f[2]||=k(e=>E(d).onClick(),[`stop`]),innerHTML:E(d).icon},null,8,un)):(b(),a(`div`,dn))],64)):i(`v-if`,!0),o(`div`,fn,[l(Q,{"is-playing":E(n).isPlaying,"has-ended":E(n).hasEnded,size:`lg`,onTogglePlay:E(n).togglePlay},null,8,[`is-playing`,`has-ended`,`onTogglePlay`]),E(n).isBuffering?(b(),r($,{key:0,class:`hud__buf-spinner`})):i(`v-if`,!0)]),!E(s).isOpen&&!E(n).isFullscreen?(b(),a(`button`,{key:1,class:`hud__btn`,"aria-label":`Show controls`,onClick:f[3]||=k((...e)=>E(s).openControls&&E(s).openControls(...e),[`stop`])},[l(E(xt))])):i(`v-if`,!0)]))}}),[[`__scopeId`,`data-v-a6d118e7`]]);function mn(e){let t=C(null),r=n(()=>t.value??e.progress),i=null;function a(){i&&clearTimeout(i),i=null,t.value=null}function o(e){i&&clearTimeout(i),i=null,t.value=Number(e.target.value)}function s(n){let r=Number(n.target.value);t.value=r,e.seek(r),i&&clearTimeout(i),i=setTimeout(a,3e3)}return D(()=>e.current,()=>{if(t.value===null||!e.total)return;let n=t.value/100*e.total;Math.abs(e.current-n)<1&&a()}),v(a),{displaySeek:r,onSeekInput:o,onSeekChange:s}}function hn(e){function t(){let t=ne.indexOf(e.playbackRate);e.setPlaybackRate(ne[(t+1)%ne.length])}function n(e){return`${e}×`}return{cycleRate:t,fmtRate:n}}function gn(e,t,n){if(!document.startViewTransition||!e.value){n();return}e.value.style.viewTransitionName=t,document.startViewTransition(async()=>{n(),await m()}).finished.finally(()=>{e.value&&(e.value.style.viewTransitionName=``)})}const _n={class:`controls__vol-header`},vn=[`aria-label`],yn={class:`controls__vol-body`},bn=[`value`],xn={class:`controls__vol-pct`};var Sn=Z(u({__name:`VolumePanel`,emits:[`back`],setup(t){let r=X(J),i=X(Y),s=n(()=>r.isMuted?0:Math.round(r.vol*100));function c(e){r.setVolume(Number(e.target.value)/100)}return(t,n)=>(b(),a(e,null,[o(`div`,_n,[o(`button`,{class:`controls__btn`,"aria-label":`Back`,onClick:n[0]||=e=>t.$emit(`back`)},[l(E(pt))]),n[6]||=o(`span`,{class:`controls__vol-label`},`Volume`,-1),o(`button`,{class:`controls__btn`,"aria-label":E(r).isMuted?`Unmute`:`Mute`,onClick:n[1]||=e=>E(r).toggleMute()},[l(on)],8,vn)]),o(`div`,yn,[o(`input`,{type:`range`,min:`0`,max:`100`,step:`1`,value:s.value,class:`controls__vol-slider`,style:_({"--v":s.value+`%`}),"aria-label":`Volume`,onInput:c,onMousedown:n[2]||=e=>E(i).pauseHide(),onMouseup:n[3]||=e=>E(i).scheduleHide(),onTouchstartPassive:n[4]||=e=>E(i).pauseHide(),onTouchend:n[5]||=e=>E(i).scheduleHide()},null,44,bn),o(`span`,xn,w(s.value)+`%`,1)])],64))}}),[[`__scopeId`,`data-v-10b0ae67`]]);const Cn=[`value`],wn={class:`controls__row`},Tn={class:`controls__play-wrap`},En={key:0,class:`controls__live`},Dn={key:1,class:`controls__time`},On=[`aria-label`,`innerHTML`],kn={class:`controls__fs-wrap`},An=[`aria-label`];var jn=Z(u({__name:`ControlsPopup`,setup(t){let n=X(J),s=X(Y),u=ct(f(ot),n),{isCustom:d,customAction:p}=lt(f(at),n),m=C(!1),g=C(null);function x(e){g.value&&!g.value.contains(e.target)&&s.closeControls()}y(()=>{n.fire(`controlsopen`,{element:g.value}),document.addEventListener(`click`,x)}),v(()=>{m.value=!1,n.fire(`controlsclose`,{element:g.value}),document.removeEventListener(`click`,x)});function S(e){s.suppressMouseLeave(),gn(g,`controls-popup`,e)}function T(){if(A()){n.toggleMute();return}S(()=>{m.value=!0})}let{displaySeek:D,onSeekInput:O,onSeekChange:j}=mn(n),{cycleRate:M,fmtRate:N}=hn(n);function P(){n.isFullscreen||n.markFullscreenPending(),n.toggleFullscreen()}return(t,f)=>(b(),a(`div`,{ref_key:`popupEl`,ref:g,class:h([`controls`,{"controls--fs":E(n).isFullscreen,"controls--compact":E(u)}]),onMousemove:f[12]||=k((...e)=>E(s).keepOpen&&E(s).keepOpen(...e),[`stop`])},[m.value?(b(),r(Sn,{key:0,onBack:f[0]||=e=>S(()=>m.value=!1)})):(b(),a(e,{key:1},[E(n).isLive?i(`v-if`,!0):(b(),a(`input`,{key:0,type:`range`,min:`0`,max:`100`,value:E(D),class:`controls__seek`,style:_({"--p":E(D)+`%`,"--b":E(n).bufferedDisplay+`%`}),onInput:f[1]||=(...e)=>E(O)&&E(O)(...e),onChange:f[2]||=(...e)=>E(j)&&E(j)(...e),onMousedown:f[3]||=e=>E(s).pauseHide(),onMouseup:f[4]||=e=>E(s).scheduleHide(),onTouchstartPassive:f[5]||=e=>E(s).pauseHide(),onTouchend:f[6]||=e=>E(s).scheduleHide()},null,44,Cn)),o(`div`,wn,[o(`div`,Tn,[E(n).isBuffering?(b(),r($,{key:0})):(b(),r(Q,{key:1,"is-playing":E(n).isPlaying,"has-ended":E(n).hasEnded,size:`sm`,onTogglePlay:f[7]||=e=>E(n).togglePlay()},null,8,[`is-playing`,`has-ended`]))]),E(n).isLive?(b(),a(`span`,En,[...f[13]||=[o(`span`,{class:`controls__live-dot`},null,-1),c(`Live`,-1)]])):(b(),a(`span`,Dn,w(E(n).fmt(E(n).current))+` / `+w(E(n).fmt(E(n).total)),1)),E(n).supportsPlaybackRate?(b(),a(`button`,{key:2,class:h([`controls__btn controls__btn--rate`,{"controls__btn--active":E(n).playbackRate!==1}]),"aria-label":`Playback rate`,onClick:f[8]||=(...e)=>E(M)&&E(M)(...e)},w(E(N)(E(n).playbackRate)),3)):i(`v-if`,!0),o(`button`,{class:h([`controls__btn controls__btn--loop`,{"controls__btn--active":E(n).isLooping}]),"aria-label":`Toggle loop`,onClick:f[9]||=e=>E(n).toggleLoop()},[l(E(Lt))],2),o(`button`,{class:`controls__btn`,"aria-label":`Volume`,onClick:T},[l(on)]),E(d)&&E(p)?(b(),a(`button`,{key:3,class:`controls__btn`,"aria-label":E(p).label,onClick:f[10]||=e=>E(p).onClick(),innerHTML:E(p).icon},null,8,On)):i(`v-if`,!0),o(`div`,kn,[E(n).isFullscreenPending?(b(),r($,{key:0})):(b(),a(`button`,{key:1,class:`controls__btn`,"aria-label":E(n).isFullscreen?`Exit fullscreen`:`Fullscreen`,onClick:P},[E(n).isFullscreen?(b(),r(E(Nt),{key:0})):(b(),r(E(kt),{key:1}))],8,An))]),E(n).isFullscreen?i(`v-if`,!0):(b(),a(`button`,{key:4,class:`controls__btn controls__btn--close`,"aria-label":`Close`,onClick:f[11]||=e=>E(s).closeControls()},[l(E(_t))]))])],64))],34))}}),[[`__scopeId`,`data-v-5712aad4`]]);const Mn={class:`ad-overlay`},Nn={class:`ad-overlay__bar`},Pn={class:`ad-overlay__badge`},Fn={key:0,class:`ad-overlay__countdown`},In=[`aria-label`],Ln={key:0,class:`ad-overlay__resume`};var Rn=Z(u({__name:`AdOverlay`,setup(e){let t=X(J),s=n(()=>t.adRemainingTime>0?t.fmt(t.adRemainingTime):``);return(e,n)=>(b(),a(`div`,Mn,[o(`div`,Nn,[o(`div`,Pn,[n[2]||=o(`span`,null,`Ad`,-1),s.value?(b(),a(`span`,Fn,w(s.value),1)):i(`v-if`,!0)]),o(`button`,{class:`ad-overlay__mute`,"aria-label":E(t).isAdMuted?`Unmute ad`:`Mute ad`,onClick:n[0]||=e=>E(t).toggleAdMute()},[E(t).isAdMuted?(b(),r(E($t),{key:0})):(b(),r(E(rn),{key:1}))],8,In)]),E(t).isAdPaused?(b(),a(`div`,Ln,[l(Q,{"is-playing":!1,size:`lg`,onTogglePlay:n[1]||=e=>E(t).togglePlay()})])):i(`v-if`,!0)]))}}),[[`__scopeId`,`data-v-23efcc8b`]]);const zn={key:0,class:`overlay__spinner`},Bn={key:0,class:`overlay__error`};var Vn=Z(u({__name:`PlayerOverlay`,props:{disableTapCapture:{type:Boolean,required:!1,default:!1}},setup(n){let s=X(J),c=X(Y),{hudVisible:u,popupVisible:d}=st(s,c);function f(){if(s.isAdPlaying&&s.isAdPaused){s.togglePlay();return}c.onVideoTap()}return(c,p)=>(b(),a(e,null,[!n.disableTapCapture&&E(s).hasStarted&&!(E(s).isAdPlaying&&!E(s).isAdPaused)?(b(),a(`div`,{key:0,class:`overlay__tap-capture`,onClick:f,onTouchend:k(f,[`prevent`,`stop`])},null,32)):i(`v-if`,!0),E(s).isAdPlaying?(b(),r(Rn,{key:1})):i(`v-if`,!0),l(t,{name:`fade`},{default:O(()=>[!E(s).isReady&&!E(s).isError?(b(),a(`div`,zn,[l($,{size:40,"border-width":3})])):i(`v-if`,!0)]),_:1}),l(t,{name:`fade`},{default:O(()=>[E(s).isError?(b(),a(`div`,Bn,[o(`p`,null,w(E(s).errorMessage||`This video could not be played.`),1),o(`button`,{class:`overlay__retry`,onClick:p[0]||=k((...e)=>E(s).retry&&E(s).retry(...e),[`stop`])},`Retry`)])):i(`v-if`,!0)]),_:1}),o(`div`,{class:h([`overlay__hud`,{"overlay__hud--visible":E(u)}])},[l(pn)],2),l(t,{name:`popup`},{default:O(()=>[E(d)?(b(),a(`div`,{key:0,class:h([`overlay__popup`,{"overlay__popup--fs":E(s).isFullscreen}])},[l(jn)],2)):i(`v-if`,!0)]),_:1})],64))}}),[[`__scopeId`,`data-v-f3307b98`]]);const Hn={class:`player`},Un={"data-mvp-player":``},Wn=[`poster`],Gn={key:1,class:`player__native-play`};var Kn=Z(u({__name:`VideoPlayer`,props:{videoUrl:{type:String,required:!0},title:{type:String,required:!1,default:``},poster:{type:String,required:!1,default:``},aspectRatio:{type:String,required:!1,default:te},platform:{type:String,required:!1,default:``},techOptions:{type:Object,required:!1,default:()=>({})},adTagUrl:{type:String,required:!1,default:``},imaOptions:{type:Object,required:!1},autoplay:{type:Boolean,required:!1,default:!1},muted:{type:Boolean,required:!1,default:void 0},playbackRate:{type:Number,required:!1},nativeUi:{type:Boolean,required:!1,default:!1},autoStage:{type:Boolean,required:!1,default:!1},lazy:{type:Boolean,required:!1,default:!1},payload:{type:Object,required:!1,default:()=>({})},action:{type:[String,Object,null],required:!1,default:null},disableTapCapture:{type:Boolean,required:!1,default:!1}},emits:[`state-change`],setup(e,{expose:t,emit:s}){let c=e,u=s,d=C(null),f=S(rt(d,c,u)),p=S(it(T(f,`isPlaying`)));x(J,f),x(Y,p),x(at,T(c,`action`));let m=n(()=>P(c.aspectRatio)),g=n(()=>m.value.isPortrait),v=n(()=>m.value.cssRatio),y=n(()=>!c.poster&&!f.isReady);return t(f),(e,t)=>(b(),a(`div`,Hn,[o(`div`,{class:h([`player__shell`,{"player__shell--portrait":g.value}]),style:_({aspectRatio:v.value}),onMousemove:t[0]||=e=>p.onMouseMove(),onContextmenuCapture:t[1]||=k(()=>{},[`prevent`]),onMouseleave:t[2]||=e=>p.onMouseLeave()},[o(`div`,Un,[o(`video`,{ref_key:`videoEl`,ref:d,class:h([`mvp-video`,{"mvp-video--hidden":y.value}]),poster:c.poster,playsinline:``},null,10,Wn),f.nativeUi?i(`v-if`,!0):(b(),r(Vn,{key:0,"disable-tap-capture":c.disableTapCapture},null,8,[`disable-tap-capture`])),f.nativeUi&&!f.hasStarted?(b(),a(`div`,Gn,[l(Q,{"is-playing":!1,size:`lg`,onTogglePlay:f.togglePlay},null,8,[`onTogglePlay`])])):i(`v-if`,!0)])],38)]))}}),[[`__scopeId`,`data-v-4ab3cf75`]]);const qn=C(0),Jn=n(()=>qn.value>0);function Yn(){qn.value++}function Xn(){qn.value--}function Zn(e,t){window.dispatchEvent(new CustomEvent(e,{detail:t}))}function Qn(e,t){let n=e=>t(e.detail);y(()=>window.addEventListener(e,n)),v(()=>window.removeEventListener(e,n))}const $n=[`src`],er={class:`stage__idle-body`},tr={class:`stage__idle-btn`},nr={class:`stage__idle-title`},rr={key:1,class:`stage__idle-empty`};var ir=Z(u({__name:`VideoStage`,props:{pinPosition:{type:String,required:!1,default:`bottom-right`}},emits:[`state-change`],setup(t,{emit:s}){let c=s,u=C(null),d=C(null),f=C(!1),m=C(!1),g=C(null),S=C(null),T=C(!1);x(ot,T);let O=n(()=>T.value&&!!d.value&&f.value),A=n(()=>P(d.value?.aspectRatio||`16:9`).cssRatio),j=C(null),M=C(null);D(T,e=>{j.value=e&&S.value?{height:S.value.offsetHeight,width:S.value.offsetWidth}:null});let N=n(()=>{if(!j.value)return{};let{height:e,width:t}=j.value,n=M.value&&t?M.value/t:1;return{height:`${Math.round(e*n)}px`}}),F=null,I=null;function L(){F?.disconnect(),I?.disconnect(),g.value&&(F=new IntersectionObserver(([e])=>{T.value=!e.isIntersecting},{threshold:1}),F.observe(g.value),I=new ResizeObserver(([e])=>{M.value=e.contentRect.width}),I.observe(g.value))}D(g,L);function z(){d.value&&(d.value={...d.value,autoplay:!0},f.value=!0)}function B(){g.value?.scrollIntoView({behavior:`smooth`,block:`center`})}function V(){d.value=null,f.value=!1,m.value=!1,T.value=!1,j.value=null,H()}function H(){Zn(R,{currentVideoUrl:d.value?.videoUrl??null,isPlaying:m.value})}function U(e){if(d.value?.videoUrl===e.videoUrl&&f.value){u.value?.togglePlay();return}d.value=e,f.value=!1,m.value=!1,H(),f.value=!0}function W(e){if(!(!d.value||e.videoUrl!==d.value.videoUrl)){if(!f.value){d.value={...d.value,autoplay:!0},f.value=!0;return}u.value?.togglePlay()}}function G(e){e.type===`play`&&(m.value=!0),(e.type===`pause`||e.type===`ended`)&&(m.value=!1),H(),c(`state-change`,e)}return Qn(ee,U),Qn(`video-toggle`,W),y(Yn),v(()=>{Xn(),F?.disconnect(),I?.disconnect()}),(n,s)=>(b(),a(`div`,{ref_key:`wrapperEl`,ref:g,class:`stage-wrapper`,style:_(N.value)},[o(`div`,{ref_key:`stageEl`,ref:S,class:h([`stage`,{"stage--minified":O.value,[`stage--pin-${t.pinPosition}`]:O.value}])},[O.value?(b(),a(`button`,{key:0,class:`stage__scroll-to`,"aria-label":`Scroll to player`,onClick:k(B,[`stop`])},[l(E(Tt))])):i(`v-if`,!0),O.value?(b(),a(`button`,{key:1,class:`stage__dismiss`,"aria-label":`Close`,onClick:k(V,[`stop`])},[l(E(_t))])):i(`v-if`,!0),d.value&&f.value?(b(),r(Kn,p({ref_key:`playerRef`,ref:u,key:d.value.videoUrl},d.value,{onStateChange:G}),null,16)):(b(),a(`div`,{key:3,class:`stage__idle`,style:_({aspectRatio:A.value}),onClick:z},[d.value?.poster?(b(),a(`img`,{key:0,src:d.value.poster,class:`stage__idle-poster`},null,8,$n)):i(`v-if`,!0),s[0]||=o(`div`,{class:`stage__idle-scrim`},null,-1),o(`div`,er,[d.value?(b(),a(e,{key:0},[o(`div`,tr,[l(E(Gt))]),o(`p`,nr,w(d.value.title),1)],64)):(b(),a(`p`,rr,`Select a video to play`))])],4))],2)],4))}}),[[`__scopeId`,`data-v-fb8c86cf`]]);const ar={class:`placeholder`},or=[`src`,`alt`],sr={class:`placeholder__btn-wrap`},cr={key:2,class:`placeholder__footer`},lr={class:`placeholder__title`};var ur=Z(u({__name:`VideoPlaceholder`,props:{videoUrl:{type:String,required:!0},title:{type:String,required:!1,default:``},poster:{type:String,required:!1,default:``},aspectRatio:{type:String,required:!1,default:te},platform:{type:String,required:!1,default:``},techOptions:{type:Object,required:!1,default:()=>({})},adTagUrl:{type:String,required:!1,default:``},imaOptions:{type:Object,required:!1},autoplay:{type:Boolean,required:!1,default:!1},muted:{type:Boolean,required:!1,default:void 0},playbackRate:{type:Number,required:!1},nativeUi:{type:Boolean,required:!1,default:!1},autoStage:{type:Boolean,required:!1,default:!1},lazy:{type:Boolean,required:!1},payload:{type:Object,required:!1,default:()=>({})},action:{type:[String,Object,null],required:!1,default:null},disableTapCapture:{type:Boolean,required:!1}},setup(e){let t=e,r=n(()=>P(t.aspectRatio)),s=n(()=>r.value.isPortrait),c=n(()=>r.value.cssRatio),u=C(!1),d=C(!1);Qn(R,e=>{u.value=e.currentVideoUrl===t.videoUrl,d.value=u.value&&e.isPlaying});function f(e){Zn(ee,{...t,...e!==void 0&&{autoplay:e}})}function p(){f(!0)}return y(()=>{t.autoStage&&f()}),(t,n)=>(b(),a(`div`,ar,[o(`div`,{class:h([`placeholder__shell`,{"placeholder__shell--portrait":s.value,"placeholder__shell--active":u.value}]),style:_({aspectRatio:c.value}),onClick:p},[e.poster?(b(),a(`img`,{key:0,class:`placeholder__poster`,src:e.poster,alt:e.title},null,8,or)):i(`v-if`,!0),n[0]||=o(`div`,{class:`placeholder__scrim`},null,-1),e.platform?(b(),a(`span`,{key:1,class:h([`placeholder__badge`,`badge--${e.platform}`])},w(e.platform),3)):i(`v-if`,!0),o(`div`,sr,[l(Q,{"is-playing":u.value&&d.value,size:`lg`,onTogglePlay:p},null,8,[`is-playing`])]),e.title?(b(),a(`div`,cr,[o(`p`,lr,w(e.title),1)])):i(`v-if`,!0)],6)]))}}),[[`__scopeId`,`data-v-dbcb4f82`]]),dr=u({__name:`VideoItem`,props:{videoUrl:{type:String,required:!0},title:{type:String,required:!1},poster:{type:String,required:!1},aspectRatio:{type:String,required:!1},platform:{type:String,required:!1},techOptions:{type:Object,required:!1},adTagUrl:{type:String,required:!1},imaOptions:{type:Object,required:!1},autoplay:{type:Boolean,required:!1},muted:{type:Boolean,required:!1,default:void 0},playbackRate:{type:Number,required:!1},nativeUi:{type:Boolean,required:!1},autoStage:{type:Boolean,required:!1},lazy:{type:Boolean,required:!1,default:!0},payload:{type:Object,required:!1},action:{type:[String,Object,null],required:!1,default:null},disableTapCapture:{type:Boolean,required:!1}},emits:[`state-change`],setup(t,{emit:n}){let i=t,o=n,s=C(!1);return(t,n)=>E(Jn)?(b(),r(ur,g(p({key:0},i)),null,16)):(b(),a(e,{key:1},[i.lazy&&!s.value&&!i.autoplay?(b(),r(ur,p({key:0},i,{onClickCapture:n[0]||=e=>s.value=!0}),null,16)):(b(),r(Kn,p({key:1},i,{autoplay:s.value||i.autoplay,onStateChange:n[1]||=e=>o(`state-change`,e)}),null,16,[`autoplay`]))],64))}});const fr=d(Kn,{shadowRoot:!1}),pr=d(ir,{shadowRoot:!1}),mr=d(ur,{shadowRoot:!1}),hr=d(dr,{shadowRoot:!1});customElements.define(`video-player`,fr),customElements.define(`video-stage`,pr),customElements.define(`video-placeholder`,mr),customElements.define(`video-item`,hr);export{hr as VideoItemElement,mr as VideoPlaceholderElement,fr as VideoPlayerElement,pr as VideoStageElement};
|
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { ComputedRef, InjectionKey, Plugin, Ref, UnwrapNestedRefs } from "vue";
|
|
2
|
-
|
|
3
2
|
//#region src/types.d.ts
|
|
4
3
|
type Platform = 'youtube' | 'vimeo' | 'dailymotion' | 'jwplayer' | 'brightcove' | 'html5';
|
|
5
4
|
type BuiltinAction = 'mute' | 'loop';
|
|
@@ -9,7 +8,7 @@ interface CustomAction {
|
|
|
9
8
|
onClick: () => void;
|
|
10
9
|
}
|
|
11
10
|
type PlayerAction = BuiltinAction | CustomAction;
|
|
12
|
-
type StateChangeType = 'play' | 'pause' | 'ended' | 'seeked' | 'error' | 'adstart' | 'adend' | 'volumechange' | 'ratechange' | 'firstQuartile' | 'midpoint' | 'thirdQuartile' | '
|
|
11
|
+
type StateChangeType = 'play' | 'pause' | 'ended' | 'seeked' | 'error' | 'adstart' | 'adend' | 'volumechange' | 'ratechange' | 'firstQuartile' | 'midpoint' | 'thirdQuartile' | 'controlsopen' | 'controlsclose';
|
|
13
12
|
interface StateChangeEvent {
|
|
14
13
|
type: StateChangeType;
|
|
15
14
|
currentTime: number;
|
|
@@ -21,6 +20,7 @@ interface StateChangeEvent {
|
|
|
21
20
|
} | null;
|
|
22
21
|
isMuted?: boolean;
|
|
23
22
|
playbackRate?: number;
|
|
23
|
+
element?: HTMLElement | null;
|
|
24
24
|
payload?: Record<string, unknown>;
|
|
25
25
|
}
|
|
26
26
|
interface PlayerProps {
|
|
@@ -40,7 +40,6 @@ interface PlayerProps {
|
|
|
40
40
|
lazy?: boolean;
|
|
41
41
|
payload?: Record<string, unknown>;
|
|
42
42
|
action?: PlayerAction | null;
|
|
43
|
-
focusMode?: boolean;
|
|
44
43
|
disableTapCapture?: boolean;
|
|
45
44
|
}
|
|
46
45
|
type VideoSelectDetail = PlayerProps;
|
|
@@ -61,6 +60,10 @@ declare const __VLS_export$3: import("vue").DefineComponent<PlayerProps, {
|
|
|
61
60
|
hasEnded: boolean;
|
|
62
61
|
isReady: boolean;
|
|
63
62
|
isAdPlaying: boolean;
|
|
63
|
+
isAdPaused: boolean;
|
|
64
|
+
isAdMuted: boolean;
|
|
65
|
+
adRemainingTime: number;
|
|
66
|
+
isLive: boolean;
|
|
64
67
|
isBuffering: boolean;
|
|
65
68
|
current: number;
|
|
66
69
|
total: number;
|
|
@@ -83,7 +86,9 @@ declare const __VLS_export$3: import("vue").DefineComponent<PlayerProps, {
|
|
|
83
86
|
toggleMute: () => void;
|
|
84
87
|
setVolume: (val: number) => void;
|
|
85
88
|
toggleFullscreen: () => void;
|
|
89
|
+
markFullscreenPending: () => void;
|
|
86
90
|
toggleLoop: () => void;
|
|
91
|
+
toggleAdMute: () => void;
|
|
87
92
|
setPlaybackRate: (rate: number) => void;
|
|
88
93
|
supportsPlaybackRate: boolean;
|
|
89
94
|
nativeUi: boolean;
|
|
@@ -100,11 +105,11 @@ declare const __VLS_export$3: import("vue").DefineComponent<PlayerProps, {
|
|
|
100
105
|
techOptions: Record<string, unknown>;
|
|
101
106
|
adTagUrl: string;
|
|
102
107
|
autoplay: boolean;
|
|
108
|
+
muted: boolean;
|
|
103
109
|
autoStage: boolean;
|
|
104
110
|
lazy: boolean;
|
|
105
111
|
payload: Record<string, unknown>;
|
|
106
112
|
action: PlayerAction | null;
|
|
107
|
-
focusMode: boolean;
|
|
108
113
|
disableTapCapture: boolean;
|
|
109
114
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
110
115
|
declare const _default$2: typeof __VLS_export$3;
|
|
@@ -132,6 +137,7 @@ declare const __VLS_export$1: import("vue").DefineComponent<PlayerProps, {}, {},
|
|
|
132
137
|
techOptions: Record<string, unknown>;
|
|
133
138
|
adTagUrl: string;
|
|
134
139
|
autoplay: boolean;
|
|
140
|
+
muted: boolean;
|
|
135
141
|
autoStage: boolean;
|
|
136
142
|
payload: Record<string, unknown>;
|
|
137
143
|
action: PlayerAction | null;
|
|
@@ -144,13 +150,14 @@ declare const __VLS_export: import("vue").DefineComponent<PlayerProps, {}, {}, {
|
|
|
144
150
|
}, string, import("vue").PublicProps, Readonly<PlayerProps> & Readonly<{
|
|
145
151
|
"onState-change"?: ((event: StateChangeEvent) => any) | undefined;
|
|
146
152
|
}>, {
|
|
153
|
+
muted: boolean;
|
|
147
154
|
lazy: boolean;
|
|
148
155
|
action: PlayerAction | null;
|
|
149
156
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
150
157
|
declare const _default: typeof __VLS_export;
|
|
151
158
|
//#endregion
|
|
152
159
|
//#region src/adapters/index.d.ts
|
|
153
|
-
declare function getPlatform(url:
|
|
160
|
+
declare function getPlatform(url: string): string;
|
|
154
161
|
//#endregion
|
|
155
162
|
//#region src/composables/player/usePlayer.d.ts
|
|
156
163
|
interface UsePlayerReturn {
|
|
@@ -158,6 +165,10 @@ interface UsePlayerReturn {
|
|
|
158
165
|
hasEnded: Ref<boolean>;
|
|
159
166
|
isReady: Ref<boolean>;
|
|
160
167
|
isAdPlaying: Ref<boolean>;
|
|
168
|
+
isAdPaused: Ref<boolean>;
|
|
169
|
+
isAdMuted: Ref<boolean>;
|
|
170
|
+
adRemainingTime: Ref<number>;
|
|
171
|
+
isLive: Ref<boolean>;
|
|
161
172
|
isBuffering: Ref<boolean>;
|
|
162
173
|
current: Ref<number>;
|
|
163
174
|
total: Ref<number>;
|
|
@@ -180,7 +191,9 @@ interface UsePlayerReturn {
|
|
|
180
191
|
toggleMute: () => void;
|
|
181
192
|
setVolume: (val: number) => void;
|
|
182
193
|
toggleFullscreen: () => void;
|
|
194
|
+
markFullscreenPending: () => void;
|
|
183
195
|
toggleLoop: () => void;
|
|
196
|
+
toggleAdMute: () => void;
|
|
184
197
|
setPlaybackRate: (rate: number) => void;
|
|
185
198
|
supportsPlaybackRate: Ref<boolean>;
|
|
186
199
|
nativeUi: Ref<boolean>;
|