@munsonlabs/video-player 0.0.8 → 0.0.9

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 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 video.js
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
- | `imaOptions` | `object` | `{}` | Extra options passed to the IMA plugin (e.g. `{ customParameters: { section: 'news' } }`) |
67
- | `techOptions` | `object` | `{}` | Extra options passed directly to Video.js |
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
- | 'focusstart'
109
- | 'focusend'
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
- `focusstart` / `focusend` fire when [focus mode](#focus-mode) is entered/exited (only relevant if `focusMode` is set).
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
- ### Custom IMA parameters
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
- ```vue
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
- Ads are not supported on YouTube, Vimeo, or Dailymotion.
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
@@ -299,16 +290,10 @@ Import the element bundle to register all components as native custom elements.
299
290
 
300
291
  ### Passing objects as web component attributes
301
292
 
302
- Boolean and string props map directly to HTML attributes. Object props (`imaOptions`, `techOptions`, `payload`) can be passed as inline JSON strings — Vue's custom element runtime parses them automatically:
293
+ 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
294
 
304
295
  ```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>
296
+ <video-item video-url="https://..." platform="html5" ad-tag-url="https://..." payload='{"articleId":"123"}'></video-item>
312
297
  ```
313
298
 
314
299
  For `action` (which contains a function), set it via JavaScript:
@@ -331,7 +316,6 @@ player.addEventListener('state-change', (e) => {
331
316
 
332
317
  ## Peer Dependencies
333
318
 
334
- | Package | Version |
335
- | ---------- | ---------------------- |
336
- | `video.js` | `>=8` |
337
- | `vue` | `>=3` (Vue usage only) |
319
+ | Package | Version |
320
+ | ------- | ---------------------- |
321
+ | `vue` | `>=3` (Vue usage only) |
@@ -23,7 +23,6 @@ interface PlayerProps {
23
23
  lazy?: boolean;
24
24
  payload?: Record<string, unknown>;
25
25
  action?: PlayerAction | null;
26
- focusMode?: boolean;
27
26
  disableTapCapture?: boolean;
28
27
  }
29
28
  //#endregion
package/dist/element.mjs CHANGED
@@ -1,3 +1,13 @@
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";import A from"hls.js";var j=Object.create,M=Object.defineProperty,N=Object.getOwnPropertyDescriptor,P=Object.getOwnPropertyNames,F=Object.getPrototypeOf,I=Object.prototype.hasOwnProperty,L=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),R=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=P(t),a=0,o=i.length,s;a<o;a++)s=i[a],!I.call(e,s)&&s!==n&&M(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=N(t,s))||r.enumerable});return e},z=(e,t,n)=>(n=e==null?{}:j(F(e)),R(t||!e||!e.__esModule?M(n,`default`,{value:e,enumerable:!0}):n,e));function B(){return/iPad|iPhone|iPod/.test(navigator.userAgent)||/Mac/.test(navigator.userAgent)&&navigator.maxTouchPoints>1}function V(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled)}function H(e){(e.requestFullscreen||e.webkitRequestFullscreen)?.call(e)}function U(){(document.exitFullscreen||document.webkitExitFullscreen)?.call(document)}function W(e){let[t,n]=e.split(`:`).map(Number);return{isPortrait:n>t,cssRatio:`${t}/${n}`}}function ee(e){return!e||isNaN(e)?`0:00`:`${Math.floor(e/60)}:${String(Math.floor(e%60)).padStart(2,`0`)}`}function G(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 te(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 ne=`video-select`,re=`video-state`,ie=`fullscreen-pending`,ae=`fullscreen-pending-done`,oe=`mvp-youtube`,se=`mvp-vimeo`,ce=`mvp-dailymotion`,le=`mvp-ad-playing`,K=`mvp-ad-paused`,ue=`16:9`,de=[.5,.75,1,1.25,1.5,2],fe=[[.25,`firstQuartile`],[.5,`midpoint`],[.75,`thirdQuartile`]];function pe(e){return e.match(/cdn\.jwplayer\.com\/videos\/([^-]+)/)?.[1]??e.match(/cdn\.jwplayer\.com\/manifests\/([^.]+)/)?.[1]??e.match(/^jwplayer:\/\/([^/]+)$/)?.[1]??null}function me(e){let t=e?.advertising?.schedule;return Array.isArray(t)&&t.length?t[0].tag??null:e?.advertising?.tag??null}const he=G(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=te((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:me(n)}});async function ge(e){let t=pe(e);if(!t)throw Error(`JW Platform: unrecognised source URL: ${e}`);let n=await he(t);if(e.startsWith(`jwplayer://`))return n;let r=/\.mp4(\?|#|$)/.test(e)?`video/mp4`:`application/x-mpegURL`;return{...n,src:e,type:r}}function _e(e){let t=e.match(/^brightcove:\/\/([^/]+)\/([^/]+)\/([^/]+)\/([^/]+)$/);return t?{accountId:t[1],playerId:t[2],embed:t[3],videoId:t[4]}:null}function ve(e){return(e?.plugins??[]).find(e=>e.name===`ima3`)?.options?.serverUrl??null}const ye=G(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:ve(a)}},(e,t,n)=>`${e}/${t}_${n}`);async function be(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=te(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 xe(e,t){let n=_e(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 ye(r,i,a,t),{sources:l,poster:u}=await be(r,o,s);return{...l[0],poster:u,adTagUrl:c}}function q(){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 Se={};function Ce(e,t=e){return Se[t]||(Se[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)})),Se[t]}let we=0;function Te(e,t){e.parentElement?.classList.add(t);let n=`${t}-${++we}`,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 Ee(e,t){e.style.display=`none`,t.style.opacity=`1`,t.style.pointerEvents=``}function De(e,t,n){t.remove(),e.parentElement?.classList.remove(n),e.style.display=``}function Oe(e){return e.closest(`.player__shell`)}function ke(e){e.trigger(ie);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(ae),t.remove(),r?.())}return{overlay:t,finish:r}}function Ae(e,t){return t===e.PlayerState.PLAYING||t===e.PlayerState.BUFFERING}function je(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 Me=!1,Ne=!1;const J=[];function Pe(){Ne||(Ne=!0,Ce(`https://www.youtube.com/iframe_api`).then(()=>{window.YT?.ready(()=>{Me=!0,J.forEach(e=>e()),J.length=0})}))}function Fe(e,t){Pe();let n=q(),{techId:r,wrapper:i}=Te(e,oe),a=je(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})}}})}Me?E():J.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}=ke(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(B()&&o){D();return}let t=Oe(e);t&&H(t)}function k(){U()}return{el:i,play:S,pause:()=>o?.pauseVideo(),paused:()=>{if(!o)return!0;let e=window.YT;return!e||!Ae(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||!Ae(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=je(e);a.videoId=t.videoId,a.listId=t.listId,a.videoId&&(c?(b(a.videoId),s=a.videoId):u=!0)},featuresPlaybackRate:()=>m,supportsFullScreen:V,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=J.indexOf(E);e!==-1&&J.splice(e,1)}o=null,De(e,i,oe),n.dispose()}}}
2
+ /*! @vimeo/player v2.30.4 | (c) 2026 Vimeo | MIT License | https://github.com/vimeo/player.js */
3
+ /*!
4
+ * weakmap-polyfill v2.0.4 - ECMAScript6 WeakMap polyfill
5
+ * https://github.com/polygonplanet/weakmap-polyfill
6
+ * Copyright (c) 2015-2021 polygonplanet <polygon.planet.aqua@gmail.com>
7
+ * @license MIT
8
+ */
9
+ /*! Native Promise Only
10
+ v0.8.1 (c) Kyle Simpson
11
+ MIT License: http://getify.mit-license.org
12
+ */
13
+ var Ie=z(L(((e,t)=>{(function(n,r){typeof e==`object`&&t!==void 0?t.exports=r():typeof define==`function`&&define.amd?define(r):(n=typeof globalThis<`u`?globalThis:n||self,n.Vimeo=n.Vimeo||{},n.Vimeo.Player=r())})(e,(function(){let e=typeof global<`u`&&{}.toString.call(global)===`[object global]`,t=typeof Bun<`u`,n=typeof Deno<`u`,r=typeof WebSocketPair==`function`&&caches?.default!==void 0,i=e||t||n||r;function a(e,t){return e.indexOf(t.toLowerCase())===0?e:`${t.toLowerCase()}${e.substr(0,1).toUpperCase()}${e.substr(1)}`}function o(e){return!!(e&&e.nodeType===1&&`nodeName`in e&&e.ownerDocument&&e.ownerDocument.defaultView)}function s(e){return!isNaN(parseFloat(e))&&isFinite(e)&&Math.floor(e)==e}function c(e){return/^(https?:)?\/\/((((player|www)\.)?vimeo\.com)|((player\.)?[a-zA-Z0-9-]+\.(videoji\.(hk|cn)|vimeo\.work)))(?=$|\/)/.test(e)}function l(e){return/^https:\/\/player\.((vimeo\.com)|([a-zA-Z0-9-]+\.(videoji\.(hk|cn)|vimeo\.work)))\/video\/\d+/.test(e)}function u(e){let t=(e||``).match(/^(?:https?:)?(?:\/\/)?([^/?]+)/),n=(t&&t[1]||``).replace(`player.`,``);for(let e of[`.videoji.hk`,`.vimeo.work`,`.videoji.cn`])if(n.endsWith(e))return n;return`vimeo.com`}function d(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},t=e.id,n=e.url,r=t||n;if(!r)throw Error(`An id or url must be passed, either in an options object or as a data-vimeo-id or data-vimeo-url attribute.`);if(s(r))return`https://vimeo.com/${r}`;if(c(r))return r.replace(`http:`,`https:`);throw TypeError(t?`“${t}” is not a valid video id.`:`“${r}” is not a vimeo.com url.`)}let f=function(e,t,n){let r=arguments.length>3&&arguments[3]!==void 0?arguments[3]:`addEventListener`,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:`removeEventListener`,a=typeof t==`string`?[t]:t;return a.forEach(t=>{e[r](t,n)}),{cancel:()=>a.forEach(t=>e[i](t,n))}};function p(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:document;if(!e||!t||typeof t.querySelectorAll!=`function`)return null;let n=t.querySelectorAll(`iframe`);for(let t=0;t<n.length;t++)if(n[t]&&n[t].contentWindow===e)return n[t];return null}let m=Array.prototype.indexOf!==void 0,h=typeof window<`u`&&window.postMessage!==void 0;if(!i&&(!m||!h))throw Error(`Sorry, the Vimeo Player API is not available in this browser.`);var g=typeof globalThis<`u`?globalThis:typeof window<`u`?window:typeof global<`u`?global:typeof self<`u`?self:{};function _(e,t){return t={exports:{}},e(t,t.exports),t.exports}(function(e){if(e.WeakMap)return;var t=Object.prototype.hasOwnProperty,n=Object.defineProperty&&function(){try{return Object.defineProperty({},"x",{value:1}).x===1}catch{}}(),r=function(e,t,r){n?Object.defineProperty(e,t,{configurable:!0,writable:!0,value:r}):e[t]=r};e.WeakMap=function(){function e(){if(this===void 0)throw TypeError(`Constructor WeakMap requires 'new'`);if(r(this,`_id`,a(`_WeakMap`)),arguments.length>0)throw TypeError(`WeakMap iterable is not supported`)}r(e.prototype,`delete`,function(e){if(n(this,`delete`),!i(e))return!1;var t=e[this._id];return t&&t[0]===e?(delete e[this._id],!0):!1}),r(e.prototype,`get`,function(e){if(n(this,`get`),i(e)){var t=e[this._id];if(t&&t[0]===e)return t[1]}}),r(e.prototype,`has`,function(e){if(n(this,`has`),!i(e))return!1;var t=e[this._id];return!!(t&&t[0]===e)}),r(e.prototype,`set`,function(e,t){if(n(this,`set`),!i(e))throw TypeError(`Invalid value used as weak map key`);var a=e[this._id];return a&&a[0]===e?(a[1]=t,this):(r(e,this._id,[e,t]),this)});function n(e,n){if(!i(e)||!t.call(e,`_id`))throw TypeError(n+` method called on incompatible receiver `+typeof e)}function a(e){return e+`_`+o()+`.`+o()}function o(){return Math.random().toString().substring(2)}return r(e,`_polyfill`,!0),e}();function i(e){return Object(e)===e}})(typeof globalThis<`u`?globalThis:typeof self<`u`?self:typeof window<`u`?window:g);var v=_(function(e){(function(t,n,r){n[t]=n[t]||r(),e.exports&&=n[t]})(`Promise`,g,function(){var e,t,n,r=Object.prototype.toString,i=typeof setImmediate<`u`?function(e){return setImmediate(e)}:setTimeout;try{Object.defineProperty({},"x",{}),e=function(e,t,n,r){return Object.defineProperty(e,t,{value:n,writable:!0,configurable:r!==!1})}}catch{e=function(e,t,n){return e[t]=n,e}}n=function(){var e,n,r;function i(e,t){this.fn=e,this.self=t,this.next=void 0}return{add:function(t,a){r=new i(t,a),n?n.next=r:e=r,n=r,r=void 0},drain:function(){var r=e;for(e=n=t=void 0;r;)r.fn.call(r.self),r=r.next}}}();function a(e,r){n.add(e,r),t||=i(n.drain)}function o(e){var t,n=typeof e;return e!=null&&(n==`object`||n==`function`)&&(t=e.then),typeof t==`function`&&t}function s(){for(var e=0;e<this.chain.length;e++)c(this,this.state===1?this.chain[e].success:this.chain[e].failure,this.chain[e]);this.chain.length=0}function c(e,t,n){var r,i;try{t===!1?n.reject(e.msg):(r=t===!0?e.msg:t.call(void 0,e.msg),r===n.promise?n.reject(TypeError(`Promise-chain cycle`)):(i=o(r))?i.call(r,n.resolve,n.reject):n.resolve(r))}catch(e){n.reject(e)}}function l(e){var t,n=this;if(!n.triggered){n.triggered=!0,n.def&&(n=n.def);try{(t=o(e))?a(function(){var r=new f(n);try{t.call(e,function(){l.apply(r,arguments)},function(){u.apply(r,arguments)})}catch(e){u.call(r,e)}}):(n.msg=e,n.state=1,n.chain.length>0&&a(s,n))}catch(e){u.call(new f(n),e)}}}function u(e){var t=this;t.triggered||(t.triggered=!0,t.def&&(t=t.def),t.msg=e,t.state=2,t.chain.length>0&&a(s,t))}function d(e,t,n,r){for(var i=0;i<t.length;i++)(function(i){e.resolve(t[i]).then(function(e){n(i,e)},r)})(i)}function f(e){this.def=e,this.triggered=!1}function p(e){this.promise=e,this.state=0,this.triggered=!1,this.chain=[],this.msg=void 0}function m(e){if(typeof e!=`function`)throw TypeError(`Not a function`);if(this.__NPO__!==0)throw TypeError(`Not a promise`);this.__NPO__=1;var t=new p(this);this.then=function(e,n){var r={success:typeof e!=`function`||e,failure:typeof n==`function`&&n};return r.promise=new this.constructor(function(e,t){if(typeof e!=`function`||typeof t!=`function`)throw TypeError(`Not a function`);r.resolve=e,r.reject=t}),t.chain.push(r),t.state!==0&&a(s,t),r.promise},this.catch=function(e){return this.then(void 0,e)};try{e.call(void 0,function(e){l.call(t,e)},function(e){u.call(t,e)})}catch(e){u.call(t,e)}}var h=e({},`constructor`,m,!1);return m.prototype=h,e(h,`__NPO__`,0,!1),e(m,`resolve`,function(e){var t=this;return e&&typeof e==`object`&&e.__NPO__===1?e:new t(function(t,n){if(typeof t!=`function`||typeof n!=`function`)throw TypeError(`Not a function`);t(e)})}),e(m,`reject`,function(e){return new this(function(t,n){if(typeof t!=`function`||typeof n!=`function`)throw TypeError(`Not a function`);n(e)})}),e(m,`all`,function(e){var t=this;return r.call(e)==`[object Array]`?e.length===0?t.resolve([]):new t(function(n,r){if(typeof n!=`function`||typeof r!=`function`)throw TypeError(`Not a function`);var i=e.length,a=Array(i),o=0;d(t,e,function(e,t){a[e]=t,++o===i&&n(a)},r)}):t.reject(TypeError(`Not an array`))}),e(m,`race`,function(e){var t=this;return r.call(e)==`[object Array]`?new t(function(n,r){if(typeof n!=`function`||typeof r!=`function`)throw TypeError(`Not a function`);d(t,e,function(e,t){n(t)},r)}):t.reject(TypeError(`Not an array`))}),m})});let y=new WeakMap;function b(e,t,n){let r=y.get(e.element)||{};t in r||(r[t]=[]),r[t].push(n),y.set(e.element,r)}function x(e,t){return(y.get(e.element)||{})[t]||[]}function S(e,t,n){let r=y.get(e.element)||{};if(!r[t])return!0;if(!n)return r[t]=[],y.set(e.element,r),!0;let i=r[t].indexOf(n);return i!==-1&&r[t].splice(i,1),y.set(e.element,r),r[t]&&r[t].length===0}function C(e,t){let n=x(e,t);if(n.length<1)return!1;let r=n.shift();return S(e,t,r),r}function w(e,t){let n=y.get(e);y.set(t,n),y.delete(e)}function T(e){if(typeof e==`string`)try{e=JSON.parse(e)}catch(e){return console.warn(e),{}}return e}function E(e,t,n){if(!e.element.contentWindow||!e.element.contentWindow.postMessage)return;let r={method:t};n!==void 0&&(r.value=n);let i=parseFloat(navigator.userAgent.toLowerCase().replace(/^.*msie (\d+).*$/,`$1`));i>=8&&i<10&&(r=JSON.stringify(r)),e.element.contentWindow.postMessage(r,e.origin)}function D(e,t){t=T(t);let n=[],r;if(t.event)t.event===`error`&&x(e,t.data.method).forEach(n=>{let r=Error(t.data.message);r.name=t.data.name,n.reject(r),S(e,t.data.method,n)}),n=x(e,`event:${t.event}`),r=t.data;else if(t.method){let i=C(e,t.method);i&&(n.push(i),r=t.value)}n.forEach(t=>{try{if(typeof t==`function`){t.call(e,r);return}t.resolve(r)}catch{}})}let O=`airplay.audio_tracks.audiotrack.autopause.autoplay.background.byline.cc.chapter_id.chapters.chromecast.color.colors.controls.disable_context_menu.dnt.end_time.fullscreen.height.id.initial_quality.interactive_params.keyboard.loop.maxheight.max_quality.maxwidth.min_quality.muted.play_button_position.playsinline.portrait.preload.progress_bar.quality.quality_selector.responsive.skipping_forward.speed.start_time.texttrack.thumbnail_id.title.transcript.transparent.unmute_button.url.vimeo_logo.volume.watch_full_video.width`.split(`.`);function k(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};return O.reduce((t,n)=>{let r=e.getAttribute(`data-vimeo-${n}`);return(r||r===``)&&(t[n]=r===``?1:r),t},t)}function A(e,t){let{html:n}=e;if(!t)throw TypeError(`An element must be provided`);if(t.getAttribute(`data-vimeo-initialized`)!==null)return t.querySelector(`iframe`);let r=document.createElement(`div`);return r.innerHTML=n,t.appendChild(r.firstChild),t.setAttribute(`data-vimeo-initialized`,`true`),t.querySelector(`iframe`)}function j(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0;return new Promise((r,i)=>{if(!c(e))throw TypeError(`“${e}” is not a vimeo.com url.`);let a=`https://${u(e)}/api/oembed.json?url=${encodeURIComponent(e)}`;for(let e in t)t.hasOwnProperty(e)&&(a+=`&${e}=${encodeURIComponent(t[e])}`);let o=`XDomainRequest`in window?new XDomainRequest:new XMLHttpRequest;o.open(`GET`,a,!0),o.onload=function(){if(o.status===404){i(Error(`“${e}” was not found.`));return}if(o.status===403){i(Error(`“${e}” is not embeddable.`));return}try{let t=JSON.parse(o.responseText);if(t.domain_status_code===403){A(t,n),i(Error(`“${e}” is not embeddable.`));return}r(t)}catch(e){i(e)}},o.onerror=function(){let e=o.status?` (${o.status})`:``;i(Error(`There was an error fetching the embed code from Vimeo${e}.`))},o.send()})}function M(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:document,t=[].slice.call(e.querySelectorAll(`[data-vimeo-id], [data-vimeo-url]`)),n=e=>{`console`in window&&console.error&&console.error(`There was an error creating an embed: ${e}`)};t.forEach(e=>{try{if(e.getAttribute(`data-vimeo-defer`)!==null)return;let t=k(e);j(d(t),t,e).then(t=>A(t,e)).catch(n)}catch(e){n(e)}})}function N(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:document;window.VimeoPlayerResizeEmbeds_||(window.VimeoPlayerResizeEmbeds_=!0,window.addEventListener(`message`,t=>{if(!c(t.origin)||!t.data||t.data.event!==`spacechange`)return;let n=t.source?p(t.source,e):null;if(n){let e=n.parentElement;e.style.paddingBottom=`${t.data.data[0].bottom}px`}}))}function P(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:document;window.VimeoSeoMetadataAppended||(window.VimeoSeoMetadataAppended=!0,window.addEventListener(`message`,t=>{if(!c(t.origin))return;let n=T(t.data);if(!n||n.event!==`ready`)return;let r=t.source?p(t.source,e):null;r&&l(r.src)&&new U(r).callMethod(`appendVideoMetadata`,window.location.href)}))}function F(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:document;if(window.VimeoCheckedUrlTimeParam)return;window.VimeoCheckedUrlTimeParam=!0;let t=e=>{`console`in window&&console.error&&console.error(`There was an error getting video Id: ${e}`)};window.addEventListener(`message`,n=>{if(!c(n.origin))return;let r=T(n.data);if(!r||r.event!==`ready`)return;let i=n.source?p(n.source,e):null;if(i&&l(i.src)){let e=new U(i);e.getVideoId().then(t=>{let n=RegExp(`[?&]vimeo_t_${t}=([^&#]*)`).exec(window.location.href);if(n&&n[1]){let t=decodeURI(n[1]);e.setCurrentTime(t)}}).catch(t)}})}function I(){window.VimeoDRMEmbedsUpdated||(window.VimeoDRMEmbedsUpdated=!0,window.addEventListener(`message`,e=>{if(!c(e.origin))return;let t=T(e.data);if(!t||t.event!==`drminitfailed`)return;let n=e.source?p(e.source):null;if(!n)return;let r=n.getAttribute(`allow`)||``;if(!r.includes(`encrypted-media`)){n.setAttribute(`allow`,`${r}; encrypted-media`);let e=new URL(n.getAttribute(`src`));e.searchParams.set(`forcereload`,`drm`),n.setAttribute(`src`,e.toString());return}}))}function L(){let e=function(){let e,t=[[`requestFullscreen`,`exitFullscreen`,`fullscreenElement`,`fullscreenEnabled`,`fullscreenchange`,`fullscreenerror`],[`webkitRequestFullscreen`,`webkitExitFullscreen`,`webkitFullscreenElement`,`webkitFullscreenEnabled`,`webkitfullscreenchange`,`webkitfullscreenerror`],[`webkitRequestFullScreen`,`webkitCancelFullScreen`,`webkitCurrentFullScreenElement`,`webkitCancelFullScreen`,`webkitfullscreenchange`,`webkitfullscreenerror`],[`mozRequestFullScreen`,`mozCancelFullScreen`,`mozFullScreenElement`,`mozFullScreenEnabled`,`mozfullscreenchange`,`mozfullscreenerror`],[`msRequestFullscreen`,`msExitFullscreen`,`msFullscreenElement`,`msFullscreenEnabled`,`MSFullscreenChange`,`MSFullscreenError`]],n=0,r=t.length,i={};for(;n<r;n++)if(e=t[n],e&&e[1]in document){for(n=0;n<e.length;n++)i[t[0][n]]=e[n];return i}return!1}(),t={fullscreenchange:e.fullscreenchange,fullscreenerror:e.fullscreenerror},n={request(t){return new Promise((r,i)=>{let a=function(){n.off(`fullscreenchange`,a),r()};n.on(`fullscreenchange`,a),t||=document.documentElement;let o=t[e.requestFullscreen]();o instanceof Promise&&o.then(a).catch(i)})},exit(){return new Promise((t,r)=>{if(!n.isFullscreen){t();return}let i=function(){n.off(`fullscreenchange`,i),t()};n.on(`fullscreenchange`,i);let a=document[e.exitFullscreen]();a instanceof Promise&&a.then(i).catch(r)})},on(e,n){let r=t[e];r&&document.addEventListener(r,n)},off(e,n){let r=t[e];r&&document.removeEventListener(r,n)}};return Object.defineProperties(n,{isFullscreen:{get(){return!!document[e.fullscreenElement]}},element:{enumerable:!0,get(){return document[e.fullscreenElement]}},isEnabled:{enumerable:!0,get(){return!!document[e.fullscreenEnabled]}}}),n}let R={role:`viewer`,autoPlayMuted:!0,allowedDrift:.3,maxAllowedDrift:1,minCheckInterval:.1,maxRateAdjustment:.2,maxTimeToCatchUp:1};class z extends EventTarget{logger;constructor(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},r=arguments.length>3?arguments[3]:void 0;super(),this.logger=r,this.init(t,e,{...R,...n})}disconnect(){this.dispatchEvent(new Event(`disconnect`))}async init(e,t,n){if(await this.waitForTOReadyState(e,`open`),n.role===`viewer`){await this.updatePlayer(e,t,n);let r=f(e,`change`,()=>this.updatePlayer(e,t,n)),i=this.maintainPlaybackPosition(e,t,n);this.addEventListener(`disconnect`,()=>{i.cancel(),r.cancel()})}else{await this.updateTimingObject(e,t);let n=f(t,[`seeked`,`play`,`pause`,`ratechange`],()=>this.updateTimingObject(e,t),`on`,`off`);this.addEventListener(`disconnect`,()=>n.cancel())}}async updateTimingObject(e,t){let[n,r,i]=await Promise.all([t.getCurrentTime(),t.getPaused(),t.getPlaybackRate()]);e.update({position:n,velocity:r?0:i})}async updatePlayer(e,t,n){let{position:r,velocity:i}=e.query();typeof r==`number`&&t.setCurrentTime(r),typeof i==`number`&&(i===0?await t.getPaused()===!1&&t.pause():i>0&&(await t.getPaused()===!0&&(await t.play().catch(async e=>{e.name===`NotAllowedError`&&n.autoPlayMuted&&(await t.setMuted(!0),await t.play().catch(e=>console.error(`Couldn't play the video from TimingSrcConnector. Error:`,e)))}),this.updatePlayer(e,t,n)),await t.getPlaybackRate()!==i&&t.setPlaybackRate(i)))}maintainPlaybackPosition(e,t,n){let{allowedDrift:r,maxAllowedDrift:i,minCheckInterval:a,maxRateAdjustment:o,maxTimeToCatchUp:s}=n,c=Math.min(s,Math.max(a,i))*1e3,l=async()=>{if(e.query().velocity===0||await t.getPaused()===!0)return;let n=e.query().position-await t.getCurrentTime(),a=Math.abs(n);if(this.log(`Drift: ${n}`),a>i)await this.adjustSpeed(t,0),t.setCurrentTime(e.query().position),this.log(`Resync by currentTime`);else if(a>r){let e=a/s,r=o,i=e<r?(r-e)/2:r;await this.adjustSpeed(t,i*Math.sign(n)),this.log(`Resync by playbackRate`)}},u=setInterval(()=>l(),c);return{cancel:()=>clearInterval(u)}}log(e){this.logger?.(`TimingSrcConnector: ${e}`)}speedAdjustment=0;adjustSpeed=async(e,t)=>{if(this.speedAdjustment===t)return;let n=await e.getPlaybackRate()-this.speedAdjustment+t;this.log(`New playbackRate: ${n}`),await e.setPlaybackRate(n),this.speedAdjustment=t};waitForTOReadyState(e,t){return new Promise(n=>{let r=()=>{e.readyState===t?n():e.addEventListener(`readystatechange`,r,{once:!0})};r()})}}let B=new WeakMap,V=new WeakMap,H={};class U{constructor(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(window.jQuery&&e instanceof jQuery&&(e.length>1&&window.console&&console.warn&&console.warn(`A jQuery object with multiple elements was passed, using the first element.`),e=e[0]),typeof document<`u`&&typeof e==`string`&&(e=document.getElementById(e)),!o(e))throw TypeError(`You must pass either a valid element or a valid id.`);if(e.nodeName!==`IFRAME`){let t=e.querySelector(`iframe`);t&&(e=t)}if(e.nodeName===`IFRAME`&&!c(e.getAttribute(`src`)||``))throw Error(`The player element passed isn’t a Vimeo embed.`);if(B.has(e))return B.get(e);this._window=e.ownerDocument.defaultView,this.element=e,this.origin=`*`;let n=new v((n,r)=>{if(this._onMessage=e=>{if(!c(e.origin)||this.element.contentWindow!==e.source)return;this.origin===`*`&&(this.origin=e.origin);let t=T(e.data);if(t&&t.event===`error`&&t.data&&t.data.method===`ready`){let e=Error(t.data.message);e.name=t.data.name,r(e);return}let i=t&&t.event===`ready`,a=t&&t.method===`ping`;if(i||a){this.element.setAttribute(`data-ready`,`true`),n();return}D(this,t)},this._window.addEventListener(`message`,this._onMessage),this.element.nodeName!==`IFRAME`){let n=k(e,t);j(d(n),n,e).then(t=>{let n=A(t,e);return this.element=n,this._originalElement=e,w(e,n),B.set(this.element,this),t}).catch(r)}});if(V.set(this,n),B.set(this.element,this),this.element.nodeName===`IFRAME`&&E(this,`ping`),H.isEnabled){let e=()=>H.exit();this.fullscreenchangeHandler=()=>{H.isFullscreen?b(this,`event:exitFullscreen`,e):S(this,`event:exitFullscreen`,e),this.ready().then(()=>{E(this,`fullscreenchange`,H.isFullscreen)})},H.on(`fullscreenchange`,this.fullscreenchangeHandler)}return this}static isVimeoUrl(e){return c(e)}callMethod(e){var t=[...arguments].slice(1);if(e==null)throw TypeError(`You must pass a method name.`);return new v((n,r)=>this.ready().then(()=>{b(this,e,{resolve:n,reject:r}),t.length===0?t={}:t.length===1&&(t=t[0]),E(this,e,t)}).catch(r))}get(e){return new v((t,n)=>(e=a(e,`get`),this.ready().then(()=>{b(this,e,{resolve:t,reject:n}),E(this,e)}).catch(n)))}set(e,t){return new v((n,r)=>{if(e=a(e,`set`),t==null)throw TypeError(`There must be a value to set.`);return this.ready().then(()=>{b(this,e,{resolve:n,reject:r}),E(this,e,t)}).catch(r)})}on(e,t){if(!e)throw TypeError(`You must pass an event name.`);if(!t)throw TypeError(`You must pass a callback function.`);if(typeof t!=`function`)throw TypeError(`The callback must be a function.`);x(this,`event:${e}`).length===0&&this.callMethod(`addEventListener`,e).catch(()=>{}),b(this,`event:${e}`,t)}off(e,t){if(!e)throw TypeError(`You must pass an event name.`);if(t&&typeof t!=`function`)throw TypeError(`The callback must be a function.`);S(this,`event:${e}`,t)&&this.callMethod(`removeEventListener`,e).catch(e=>{})}loadVideo(e){return this.callMethod(`loadVideo`,e)}ready(){let e=V.get(this)||new v((e,t)=>{t(Error(`Unknown player. Probably unloaded.`))});return v.resolve(e)}addCuePoint(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};return this.callMethod(`addCuePoint`,{time:e,data:t})}removeCuePoint(e){return this.callMethod(`removeCuePoint`,e)}enableTextTrack(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:null,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;if(!e)throw TypeError(`You must pass a language.`);return this.callMethod(`enableTextTrack`,{language:e,kind:t,showing:n})}disableTextTrack(){return this.callMethod(`disableTextTrack`)}selectAudioTrack(e,t){if(!e)throw TypeError(`You must pass a language.`);return this.callMethod(`selectAudioTrack`,{language:e,kind:t})}selectDefaultAudioTrack(){return this.callMethod(`selectDefaultAudioTrack`)}pause(){return this.callMethod(`pause`)}play(){return this.callMethod(`play`)}requestFullscreen(){return H.isEnabled?H.request(this.element):this.callMethod(`requestFullscreen`)}exitFullscreen(){return H.isEnabled?H.exit():this.callMethod(`exitFullscreen`)}getFullscreen(){return H.isEnabled?v.resolve(H.isFullscreen):this.get(`fullscreen`)}requestPictureInPicture(){return this.callMethod(`requestPictureInPicture`)}exitPictureInPicture(){return this.callMethod(`exitPictureInPicture`)}getPictureInPicture(){return this.get(`pictureInPicture`)}remotePlaybackPrompt(){return this.callMethod(`remotePlaybackPrompt`)}unload(){return this.callMethod(`unload`)}destroy(){return new v(e=>{if(V.delete(this),B.delete(this.element),this._originalElement&&(B.delete(this._originalElement),this._originalElement.removeAttribute(`data-vimeo-initialized`)),this.element&&this.element.nodeName===`IFRAME`&&this.element.parentNode&&(this.element.parentNode.parentNode&&this._originalElement&&this._originalElement!==this.element.parentNode?this.element.parentNode.parentNode.removeChild(this.element.parentNode):this.element.parentNode.removeChild(this.element)),this.element&&this.element.nodeName===`DIV`&&this.element.parentNode){this.element.removeAttribute(`data-vimeo-initialized`);let e=this.element.querySelector(`iframe`);e&&e.parentNode&&(e.parentNode.parentNode&&this._originalElement&&this._originalElement!==e.parentNode?e.parentNode.parentNode.removeChild(e.parentNode):e.parentNode.removeChild(e))}this._window.removeEventListener(`message`,this._onMessage),H.isEnabled&&H.off(`fullscreenchange`,this.fullscreenchangeHandler),e()})}getAutopause(){return this.get(`autopause`)}setAutopause(e){return this.set(`autopause`,e)}getBuffered(){return this.get(`buffered`)}getCameraProps(){return this.get(`cameraProps`)}setCameraProps(e){return this.set(`cameraProps`,e)}getChapters(){return this.get(`chapters`)}getCurrentChapter(){return this.get(`currentChapter`)}getColor(){return this.get(`color`)}getColors(){return v.all([this.get(`colorOne`),this.get(`colorTwo`),this.get(`colorThree`),this.get(`colorFour`)])}setColor(e){return this.set(`color`,e)}setColors(e){if(!Array.isArray(e))return new v((e,t)=>t(TypeError(`Argument must be an array.`)));let t=new v(e=>e(null)),n=[e[0]?this.set(`colorOne`,e[0]):t,e[1]?this.set(`colorTwo`,e[1]):t,e[2]?this.set(`colorThree`,e[2]):t,e[3]?this.set(`colorFour`,e[3]):t];return v.all(n)}getCuePoints(){return this.get(`cuePoints`)}getCurrentTime(){return this.get(`currentTime`)}setCurrentTime(e){return this.set(`currentTime`,e)}getDuration(){return this.get(`duration`)}getEnded(){return this.get(`ended`)}getLoop(){return this.get(`loop`)}setLoop(e){return this.set(`loop`,e)}setMuted(e){return this.set(`muted`,e)}getMuted(){return this.get(`muted`)}getPaused(){return this.get(`paused`)}getPlaybackRate(){return this.get(`playbackRate`)}setPlaybackRate(e){return this.set(`playbackRate`,e)}getPlayed(){return this.get(`played`)}getQualities(){return this.get(`qualities`)}getQuality(){return this.get(`quality`)}setQuality(e){return this.set(`quality`,e)}getRemotePlaybackAvailability(){return this.get(`remotePlaybackAvailability`)}getRemotePlaybackState(){return this.get(`remotePlaybackState`)}getSeekable(){return this.get(`seekable`)}getSeeking(){return this.get(`seeking`)}getTextTracks(){return this.get(`textTracks`)}getAudioTracks(){return this.get(`audioTracks`)}getEnabledAudioTrack(){return this.get(`enabledAudioTrack`)}getDefaultAudioTrack(){return this.get(`defaultAudioTrack`)}getVideoEmbedCode(){return this.get(`videoEmbedCode`)}getVideoId(){return this.get(`videoId`)}getVideoTitle(){return this.get(`videoTitle`)}getVideoWidth(){return this.get(`videoWidth`)}getVideoHeight(){return this.get(`videoHeight`)}getVideoUrl(){return this.get(`videoUrl`)}getVolume(){return this.get(`volume`)}setVolume(e){return this.set(`volume`,e)}async setTimingSrc(e,t){if(!e)throw TypeError(`A Timing Object must be provided.`);await this.ready();let n=new z(this,e,t);return E(this,`notifyTimingObjectConnect`),n.addEventListener(`disconnect`,()=>E(this,`notifyTimingObjectDisconnect`)),n}}return i||(H=L(),M(),N(),P(),F(),I()),U}))}))(),1);function Le(e){return e.match(/(?:vimeo\.com\/(?:video\/|channels\/[^/]+\/|groups\/[^/]+\/videos\/)?|player\.vimeo\.com\/video\/)(\d+)/)?.[1]??null}function Re(e,t){let n=q(),{techId:r,wrapper:i}=Te(e,se),a=Le(t.src),o=null,s=0,c=0,l=1,u=!1,d=!0,f=1,p=!1,m=!1,h=null,g=new Set;function _(e,t=0){let n=setTimeout(()=>{g.delete(n),e()},t);g.add(n)}function v(){if(!o){m=!0;return}o.play().catch(()=>{})}function y(){t.muted&&o?.setMuted(!0).catch(()=>{}),m&&v()}a&&(o=new Ie.default(r,{id:Number(a),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}}),t.autoplay&&(m=!0),o.ready().then(y).catch(e=>{h={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=>{s=e.seconds,c=e.duration,n.trigger(`timeupdate`),e.duration&&!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`)));function b(){if(!B()){let t=Oe(e);t&&H(t);return}o?.requestFullscreen().catch(()=>{})}function x(){U()}return{el:i,play:v,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(()=>_(()=>n.trigger(`volumechange`),50)).catch(()=>{})},playbackRate:()=>f,setPlaybackRate:e=>{f=e,o?.setPlaybackRate(e).catch(()=>{}),n.trigger(`ratechange`)},bufferedEnd:()=>s,error:()=>h,setSrc:()=>{},featuresPlaybackRate:()=>!1,supportsFullScreen:V,enterFullscreen:b,exitFullscreen:x,on:n.on,off:n.off,dispose:()=>{g.forEach(clearTimeout),g.clear(),o?.destroy().catch(()=>{}),o=null,De(e,i,se),n.dispose()}}}function ze(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 Be(e,t){let n=q(),{techId:r,wrapper:i}=Te(e,ce),a=Oe(e),o=ze(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 Ce(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(B()){c?.setFullscreen(!0);return}a&&H(a)}function b(){if(B()){c?.setFullscreen(!1);return}U()}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:V,enterFullscreen:y,exitFullscreen:b,on:n.on,off:n.off,dispose:()=>{c?.destroy?.(),c=null,De(e,i,ce),n.dispose()}}}const Ve=[{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 He(e){return Ve.find(t=>t.test(e))?.key??`html5`}function Ue(e){if(/\.m3u8(\?|#|$)/.test(e))return`application/x-mpegURL`;if(/\.mp4(\?|#|$)/.test(e))return`video/mp4`}function We(e){return Ve.find(t=>t.test(e))?.embed??!1}const Ge={youtube:Fe,vimeo:Re,dailymotion:Be};function Ke(e,t,n){let r=Ge[He(e)];return r?r(t,n):null}async function qe(e){let t=He(e);return t===`jwplayer`?ge(e):t===`brightcove`?xe(e):{src:e,type:Ue(e)}}const Je=[`play`,`pause`,`ended`,`error`,`timeupdate`,`durationchange`,`progress`,`volumechange`,`ratechange`,`seeking`,`seeked`,`waiting`,`playing`,`canplay`];function Ye(e,t){let n=q(),r=null;function i(t,n){if(r?.destroy(),r=null,n===`application/x-mpegURL`&&A.isSupported()){r=new A({liveDurationInfinity:!0}),r.loadSource(t),r.attachMedia(e);return}e.src=t}let a=e=>()=>n.trigger(e),o=Je.map(e=>[e,a(e)]);for(let[t,n]of o)e.addEventListener(t,n);let s=[[`webkitbeginfullscreen`,a(`nativefullscreenenter`)],[`webkitendfullscreen`,a(`nativefullscreenexit`)]];for(let[t,n]of s)e.addEventListener(t,n);e.poster=t.poster??``,e.muted=t.muted??t.autoplay??!1,e.playbackRate=t.playbackRate??1,e.playsInline=!0,i(t.src,t.type),t.autoplay&&e.play();function c(){let t=e;if(typeof t.webkitEnterFullscreen==`function`){t.webkitEnterFullscreen();return}let n=e.closest(`.player__shell`);n instanceof HTMLElement&&H(n)}function l(){let t=e;if(typeof t.webkitExitFullscreen==`function`){t.webkitExitFullscreen();return}U()}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:i,featuresPlaybackRate:()=>!0,supportsFullScreen:V,enterFullscreen:c,exitFullscreen:l,on:n.on,off:n.off,dispose:()=>{r?.destroy();for(let[t,n]of o)e.removeEventListener(t,n);for(let[t,n]of s)e.removeEventListener(t,n);n.dispose()}}}function Xe(){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 Ze(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(le,t),t||(f=!1,e.classList.remove(K))}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)}Xe().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(K),r.onAdPauseChange(!0)}),s.addEventListener(n.AdEvent.Type.RESUMED,()=>{f=!1,e.classList.remove(K),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(le,K)}}}const Qe=new Set;function $e(e){return Qe.add(e),()=>Qe.delete(e)}function et(e){Qe.forEach(t=>{if(t!==e)try{t()}catch{}})}function tt(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(ie,()=>{n.value=!0}),e.on(ae,()=>{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 nt(){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 rt(e,t,n){let r=new Set;function i(){if(!t.value)return;let i=e.value/t.value;for(let[e,t]of fe)!r.has(e)&&i>=e&&(r.add(e),n(t))}function a(){r.clear()}return{checkQuartiles:i,reset:a}}function it(){try{return JSON.parse(localStorage.getItem(`player:positions`)??`[]`)}catch{return[]}}function at(e){localStorage.setItem(`player:positions`,JSON.stringify(e))}function ot(e,t){if(t<5)return;let n=it().filter(t=>t.url!==e);n.unshift({url:e,time:t}),at(n.slice(0,5))}function st(e){return it().find(t=>t.url===e)?.time??null}function ct(e){at(it().filter(t=>t.url!==e))}function lt(e,t,n){let r=!1;function i(t){if(r)return;let n=st(e);n&&t.setCurrentTime(n),r=!0}function a(t){!t||n.value||ot(e,t.currentTime()??0)}function o(){ct(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 ut(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 dt(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 ft(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`,()=>{et(y),a.value=!0,v(`adstart`)}),e.on(`adend`,()=>{a.value=!1,v(`adend`)}),e.on(`play`,()=>{et(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 pt(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,F=tt(P),I=nt(),L=lt(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=rt(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=dt(P,u,_,w,T,c),{attachPlayerEvents:G}=ft({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:L,quartiles:z,buffering:I,fullscreen:F});return D(()=>t.muted,e=>{!i||e===void 0||i.setMuted(e)}),D(()=>t.playbackRate,e=>{!i||e===void 0||i.setPlaybackRate(e)}),ut(e,P,F.isFullscreen,F.isFullscreenPending),D(O,t=>{!t||!e.value||!i||i.el===e.value||Ee(e.value,i.el)}),y(async()=>{if(We(t.videoUrl)){if(!e.value)return;let n=Ke(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=$e(H),G(i);return}let n=await qe(t.videoUrl).catch(()=>({src:t.videoUrl}));if(!e.value)return;s={src:n.src,type:n.type},i=Ye(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=Ze(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||et(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=$e(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:I.isBuffering,current:g,total:_,vol:x,isMuted:S,isLooping:w,playbackRate:T,hasStarted:O,isError:k,errorMessage:A,progress:M,bufferedDisplay:N,isFullscreen:F.isFullscreen,isFullscreenPending:F.isFullscreenPending,fmt:ee,fire:R,retry:B,togglePlay:U,seek:W.seek,toggleMute:W.toggleMute,setVolume:W.setVolume,toggleFullscreen:F.toggleFullscreen,markFullscreenPending:F.markFullscreenPending,toggleLoop:W.toggleLoop,toggleAdMute:V,setPlaybackRate:W.setPlaybackRate,supportsPlaybackRate:E,nativeUi:j}}function mt(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 Y=Symbol(`player`),X=Symbol(`hud`),ht=Symbol(`action`),gt=Symbol(`compact`);function Z(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 _t(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 vt(e,t){return n(()=>!(!e?.value||t.isFullscreen))}function yt(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 Q=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n};const bt={},xt={viewBox:`0 0 24 24`,fill:`currentColor`};function St(e,t){return b(),a(`svg`,xt,[...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 Ct=Q(bt,[[`render`,St]]);const wt={},Tt={viewBox:`0 0 24 24`,fill:`currentColor`};function Et(e,t){return b(),a(`svg`,Tt,[...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 Dt=Q(wt,[[`render`,Et]]);const Ot={},kt={viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`};function At(e,t){return b(),a(`svg`,kt,[...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 jt=Q(Ot,[[`render`,At]]);const Mt={},Nt={viewBox:`0 0 24 24`,fill:`currentColor`};function Pt(e,t){return b(),a(`svg`,Nt,[...t[0]||=[o(`path`,{d:`M4 12l1.41 1.41L11 7.83V20h2V7.83l5.59 5.58L20 12l-8-8-8 8z`},null,-1)]])}var Ft=Q(Mt,[[`render`,Pt]]);const It={},Lt={viewBox:`0 0 24 24`,fill:`currentColor`};function Rt(e,t){return b(),a(`svg`,Lt,[...t[0]||=[o(`path`,{d:`M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z`},null,-1)]])}var zt=Q(It,[[`render`,Rt]]);const Bt={},Vt={viewBox:`0 0 24 24`,fill:`currentColor`};function Ht(e,t){return b(),a(`svg`,Vt,[...t[0]||=[o(`path`,{d:`M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z`},null,-1)]])}var Ut=Q(Bt,[[`render`,Ht]]);const Wt={},Gt={viewBox:`0 0 24 24`,fill:`currentColor`};function Kt(e,t){return b(),a(`svg`,Gt,[...t[0]||=[o(`path`,{d:`M7 7h10v3l4-4-4-4v3H5v6h2V7zm10 10H7v-3l-4 4 4 4v-3h12v-6h-2v4z`},null,-1)]])}var qt=Q(Wt,[[`render`,Kt]]);const Jt={},Yt={viewBox:`0 0 24 24`,fill:`currentColor`};function Xt(e,t){return b(),a(`svg`,Yt,[...t[0]||=[o(`path`,{d:`M6 19h4V5H6v14zm8-14v14h4V5h-4z`},null,-1)]])}var Zt=Q(Jt,[[`render`,Xt]]);const Qt={},$t={viewBox:`0 0 24 24`,fill:`currentColor`};function en(e,t){return b(),a(`svg`,$t,[...t[0]||=[o(`path`,{d:`M8 5v14l11-7z`},null,-1)]])}var tn=Q(Qt,[[`render`,en]]);const nn={},rn={viewBox:`0 0 24 24`,fill:`currentColor`};function an(e,t){return b(),a(`svg`,rn,[...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 on=Q(nn,[[`render`,an]]);const sn={},cn={viewBox:`0 0 24 24`,fill:`currentColor`};function ln(e,t){return b(),a(`svg`,cn,[...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 un=Q(sn,[[`render`,ln]]);const dn={},fn={viewBox:`0 0 24 24`,fill:`currentColor`};function pn(e,t){return b(),a(`svg`,fn,[...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 mn=Q(dn,[[`render`,pn]]);const hn=[`aria-label`];var $=Q(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(Zt),{key:0})):e.hasEnded?(b(),r(E(on),{key:1})):(b(),r(E(tn),{key:2}))],10,hn))}}),[[`__scopeId`,`data-v-85902525`]]),gn=u({__name:`VolumeIcon`,setup(e){let t=Z(Y),i=n(()=>!t.isMuted&&t.vol>0);return(e,t)=>i.value?(b(),r(E(mn),{key:0})):(b(),r(E(un),{key:1}))}}),_n=Q(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 vn={class:`hud`},yn=[`aria-label`],bn=[`aria-label`],xn=[`aria-label`,`innerHTML`],Sn={key:3,class:`hud__spacer`},Cn={class:`hud__play-wrap`};var wn=Q(u({__name:`HudButtons`,setup(t){let n=Z(Y),s=Z(X),{currentAction:c,isCustom:u,customAction:d,builtinLabel:p,onBuiltinClick:m}=yt(f(ht),n);return(t,f)=>(b(),a(`div`,vn,[!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(gn)],10,yn)):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(qt))],10,bn)):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,xn)):(b(),a(`div`,Sn))],64)):i(`v-if`,!0),o(`div`,Cn,[l($,{"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(_n,{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(jt))])):i(`v-if`,!0)]))}}),[[`__scopeId`,`data-v-a6d118e7`]]);function Tn(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 En(e){function t(){let t=de.indexOf(e.playbackRate);e.setPlaybackRate(de[(t+1)%de.length])}function n(e){return`${e}×`}return{cycleRate:t,fmtRate:n}}function Dn(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 On={class:`controls__vol-header`},kn=[`aria-label`],An={class:`controls__vol-body`},jn=[`value`],Mn={class:`controls__vol-pct`};var Nn=Q(u({__name:`VolumePanel`,emits:[`back`],setup(t){let r=Z(Y),i=Z(X),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`,On,[o(`button`,{class:`controls__btn`,"aria-label":`Back`,onClick:n[0]||=e=>t.$emit(`back`)},[l(E(Ct))]),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(gn)],8,kn)]),o(`div`,An,[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,jn),o(`span`,Mn,w(s.value)+`%`,1)])],64))}}),[[`__scopeId`,`data-v-10b0ae67`]]);const Pn=[`value`],Fn={class:`controls__row`},In={class:`controls__play-wrap`},Ln={key:0,class:`controls__live`},Rn={key:1,class:`controls__time`},zn=[`aria-label`,`innerHTML`],Bn={class:`controls__fs-wrap`},Vn=[`aria-label`];var Hn=Q(u({__name:`ControlsPopup`,setup(t){let n=Z(Y),s=Z(X),u=vt(f(gt),n),{isCustom:d,customAction:p}=yt(f(ht),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(),Dn(g,`controls-popup`,e)}function T(){if(B()){n.toggleMute();return}S(()=>{m.value=!0})}let{displaySeek:D,onSeekInput:O,onSeekChange:A}=Tn(n),{cycleRate:j,fmtRate:M}=En(n);function N(){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(Nn,{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(A)&&E(A)(...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,Pn)),o(`div`,Fn,[o(`div`,In,[E(n).isBuffering?(b(),r(_n,{key:0})):(b(),r($,{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`,Ln,[...f[13]||=[o(`span`,{class:`controls__live-dot`},null,-1),c(`Live`,-1)]])):(b(),a(`span`,Rn,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(j)&&E(j)(...e)},w(E(M)(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(qt))],2),o(`button`,{class:`controls__btn`,"aria-label":`Volume`,onClick:T},[l(gn)]),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,zn)):i(`v-if`,!0),o(`div`,Bn,[E(n).isFullscreenPending?(b(),r(_n,{key:0})):(b(),a(`button`,{key:1,class:`controls__btn`,"aria-label":E(n).isFullscreen?`Exit fullscreen`:`Fullscreen`,onClick:N},[E(n).isFullscreen?(b(),r(E(Ut),{key:0})):(b(),r(E(zt),{key:1}))],8,Vn))]),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(Dt))]))])],64))],34))}}),[[`__scopeId`,`data-v-5712aad4`]]);const Un={class:`ad-overlay`},Wn={class:`ad-overlay__bar`},Gn={class:`ad-overlay__badge`},Kn={key:0,class:`ad-overlay__countdown`},qn=[`aria-label`],Jn={key:0,class:`ad-overlay__resume`};var Yn=Q(u({__name:`AdOverlay`,setup(e){let t=Z(Y),s=n(()=>t.adRemainingTime>0?t.fmt(t.adRemainingTime):``);return(e,n)=>(b(),a(`div`,Un,[o(`div`,Wn,[o(`div`,Gn,[n[2]||=o(`span`,null,`Ad`,-1),s.value?(b(),a(`span`,Kn,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(un),{key:0})):(b(),r(E(mn),{key:1}))],8,qn)]),E(t).isAdPaused?(b(),a(`div`,Jn,[l($,{"is-playing":!1,size:`lg`,onTogglePlay:n[1]||=e=>E(t).togglePlay()})])):i(`v-if`,!0)]))}}),[[`__scopeId`,`data-v-23efcc8b`]]);const Xn={key:0,class:`overlay__spinner`},Zn={key:0,class:`overlay__error`};var Qn=Q(u({__name:`PlayerOverlay`,props:{disableTapCapture:{type:Boolean,required:!1,default:!1}},setup(n){let s=Z(Y),c=Z(X),{hudVisible:u,popupVisible:d}=_t(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(Yn,{key:1})):i(`v-if`,!0),l(t,{name:`fade`},{default:O(()=>[!E(s).isReady&&!E(s).isError?(b(),a(`div`,Xn,[l(_n,{size:40,"border-width":3})])):i(`v-if`,!0)]),_:1}),l(t,{name:`fade`},{default:O(()=>[E(s).isError?(b(),a(`div`,Zn,[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(wn)],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(Hn)],2)):i(`v-if`,!0)]),_:1})],64))}}),[[`__scopeId`,`data-v-f3307b98`]]);const $n={class:`player`},er={"data-mvp-player":``},tr=[`poster`],nr={key:1,class:`player__native-play`};var rr=Q(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:ue},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(pt(d,c,u)),p=S(mt(T(f,`isPlaying`)));x(Y,f),x(X,p),x(ht,T(c,`action`));let m=n(()=>W(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`,$n,[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`,er,[o(`video`,{ref_key:`videoEl`,ref:d,class:h([`mvp-video`,{"mvp-video--hidden":y.value}]),poster:c.poster,playsinline:``},null,10,tr),f.nativeUi?i(`v-if`,!0):(b(),r(Qn,{key:0,"disable-tap-capture":c.disableTapCapture},null,8,[`disable-tap-capture`])),f.nativeUi&&!f.hasStarted?(b(),a(`div`,nr,[l($,{"is-playing":!1,size:`lg`,onTogglePlay:f.togglePlay},null,8,[`onTogglePlay`])])):i(`v-if`,!0)])],38)]))}}),[[`__scopeId`,`data-v-4ab3cf75`]]);const ir=C(0),ar=n(()=>ir.value>0);function or(){ir.value++}function sr(){ir.value--}function cr(e,t){window.dispatchEvent(new CustomEvent(e,{detail:t}))}function lr(e,t){let n=e=>t(e.detail);y(()=>window.addEventListener(e,n)),v(()=>window.removeEventListener(e,n))}const ur=[`src`],dr={class:`stage__idle-body`},fr={class:`stage__idle-btn`},pr={class:`stage__idle-title`},mr={key:1,class:`stage__idle-empty`};var hr=Q(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(gt,T);let O=n(()=>T.value&&!!d.value&&f.value),A=n(()=>W(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`}}),P=null,F=null;function I(){P?.disconnect(),F?.disconnect(),g.value&&(P=new IntersectionObserver(([e])=>{T.value=!e.isIntersecting},{threshold:1}),P.observe(g.value),F=new ResizeObserver(([e])=>{M.value=e.contentRect.width}),F.observe(g.value))}D(g,I);function L(){d.value&&(d.value={...d.value,autoplay:!0},f.value=!0)}function R(){g.value?.scrollIntoView({behavior:`smooth`,block:`center`})}function z(){d.value=null,f.value=!1,m.value=!1,T.value=!1,j.value=null,B()}function B(){cr(re,{currentVideoUrl:d.value?.videoUrl??null,isPlaying:m.value})}function V(e){if(d.value?.videoUrl===e.videoUrl&&f.value){u.value?.togglePlay();return}d.value=e,f.value=!1,m.value=!1,B(),f.value=!0}function H(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 U(e){e.type===`play`&&(m.value=!0),(e.type===`pause`||e.type===`ended`)&&(m.value=!1),B(),c(`state-change`,e)}return lr(ne,V),lr(`video-toggle`,H),y(or),v(()=>{sr(),P?.disconnect(),F?.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(R,[`stop`])},[l(E(Ft))])):i(`v-if`,!0),O.value?(b(),a(`button`,{key:1,class:`stage__dismiss`,"aria-label":`Close`,onClick:k(z,[`stop`])},[l(E(Dt))])):i(`v-if`,!0),d.value&&f.value?(b(),r(rr,p({ref_key:`playerRef`,ref:u,key:d.value.videoUrl},d.value,{onStateChange:U}),null,16)):(b(),a(`div`,{key:3,class:`stage__idle`,style:_({aspectRatio:A.value}),onClick:L},[d.value?.poster?(b(),a(`img`,{key:0,src:d.value.poster,class:`stage__idle-poster`},null,8,ur)):i(`v-if`,!0),s[0]||=o(`div`,{class:`stage__idle-scrim`},null,-1),o(`div`,dr,[d.value?(b(),a(e,{key:0},[o(`div`,fr,[l(E(tn))]),o(`p`,pr,w(d.value.title),1)],64)):(b(),a(`p`,mr,`Select a video to play`))])],4))],2)],4))}}),[[`__scopeId`,`data-v-fb8c86cf`]]);const gr={class:`placeholder`},_r=[`src`,`alt`],vr={class:`placeholder__btn-wrap`},yr={key:2,class:`placeholder__footer`},br={class:`placeholder__title`};var xr=Q(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:ue},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(()=>W(t.aspectRatio)),s=n(()=>r.value.isPortrait),c=n(()=>r.value.cssRatio),u=C(!1),d=C(!1);lr(re,e=>{u.value=e.currentVideoUrl===t.videoUrl,d.value=u.value&&e.isPlaying});function f(e){cr(ne,{...t,...e!==void 0&&{autoplay:e}})}function p(){f(!0)}return y(()=>{t.autoStage&&f()}),(t,n)=>(b(),a(`div`,gr,[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,_r)):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`,vr,[l($,{"is-playing":u.value&&d.value,size:`lg`,onTogglePlay:p},null,8,[`is-playing`])]),e.title?(b(),a(`div`,yr,[o(`p`,br,w(e.title),1)])):i(`v-if`,!0)],6)]))}}),[[`__scopeId`,`data-v-dbcb4f82`]]),Sr=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(ar)?(b(),r(xr,g(p({key:0},i)),null,16)):(b(),a(e,{key:1},[i.lazy&&!s.value&&!i.autoplay?(b(),r(xr,p({key:0},i,{onClickCapture:n[0]||=e=>s.value=!0}),null,16)):(b(),r(rr,p({key:1},i,{autoplay:s.value||i.autoplay,onStateChange:n[1]||=e=>o(`state-change`,e)}),null,16,[`autoplay`]))],64))}});const Cr=d(rr,{shadowRoot:!1}),wr=d(hr,{shadowRoot:!1}),Tr=d(xr,{shadowRoot:!1}),Er=d(Sr,{shadowRoot:!1});customElements.define(`video-player`,Cr),customElements.define(`video-stage`,wr),customElements.define(`video-placeholder`,Tr),customElements.define(`video-item`,Er);export{Er as VideoItemElement,Tr as VideoPlaceholderElement,Cr as VideoPlayerElement,wr 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' | 'focusstart' | 'focusend';
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: any): string;
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>;