@videts/vide 0.9.3 → 0.9.7

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.
Files changed (75) hide show
  1. package/dist/{chunk-G74QBLVV.mjs → chunk-2UHU76KF.mjs} +1 -1
  2. package/dist/{chunk-2OVLZ27V.mjs → chunk-7R6TO7ZE.mjs} +1 -1
  3. package/dist/chunk-AQLZYNP7.mjs +1 -0
  4. package/dist/{chunk-VPH4JIJV.mjs → chunk-CD27DYME.mjs} +1 -1
  5. package/dist/chunk-TNHV5PHM.mjs +1 -0
  6. package/dist/chunk-YBNODS5R.mjs +2 -0
  7. package/dist/chunk-YE6RITJU.mjs +1 -0
  8. package/dist/{chunk-NA4C7W64.mjs → chunk-ZUEPNVVV.mjs} +1 -1
  9. package/dist/dash/index.d.ts +2 -2
  10. package/dist/drm/index.d.ts +1 -1
  11. package/dist/drm/index.js +1 -1
  12. package/dist/drm/index.mjs +1 -1
  13. package/dist/hls/index.d.ts +2 -2
  14. package/dist/hls/index.js +1 -1
  15. package/dist/hls/index.mjs +1 -1
  16. package/dist/index.d.ts +2 -2
  17. package/dist/index.js +1 -1
  18. package/dist/index.mjs +1 -1
  19. package/dist/omid/index.d.ts +2 -2
  20. package/dist/react/index.d.ts +7 -8
  21. package/dist/react/index.js +2 -2
  22. package/dist/react/index.mjs +2 -2
  23. package/dist/simid/index.d.ts +2 -2
  24. package/dist/ssai/index.d.ts +1 -1
  25. package/dist/ssai/index.js +1 -1
  26. package/dist/ssai/index.mjs +1 -1
  27. package/dist/svelte/VideUI.svelte +2 -1
  28. package/dist/svelte/Video.svelte +2 -9
  29. package/dist/svelte/Video.svelte.d.ts +0 -2
  30. package/dist/svelte/components/AdCountdown.svelte +1 -1
  31. package/dist/svelte/components/AdLearnMore.svelte +19 -6
  32. package/dist/svelte/components/AdLearnMore.svelte.d.ts +0 -1
  33. package/dist/svelte/components/AdSkip.svelte +7 -7
  34. package/dist/svelte/components/ErrorDisplay.svelte +1 -1
  35. package/dist/svelte/components/Loader.svelte +1 -1
  36. package/dist/svelte/icons/IconExternalLink.svelte +4 -0
  37. package/dist/svelte/icons/IconExternalLink.svelte.d.ts +26 -0
  38. package/dist/svelte/icons/IconSkipForward.svelte +3 -0
  39. package/dist/svelte/icons/IconSkipForward.svelte.d.ts +26 -0
  40. package/dist/svelte/index.d.ts +2 -0
  41. package/dist/svelte/index.js +2 -0
  42. package/dist/{types-BsEF8iWC.d.ts → types-BD5ZFUAt.d.ts} +6 -2
  43. package/dist/{types-CwjR99DL.d.ts → types-CABQEV7R.d.ts} +1 -1
  44. package/dist/{types-SuT99_Z3.d.ts → types-CXi-EgbJ.d.ts} +1 -1
  45. package/dist/{types-DzY1cmXC.d.ts → types-CaEBUCfi.d.ts} +1 -1
  46. package/dist/{types-C1_eVsFF.d.ts → types-DWH68b8d.d.ts} +1 -1
  47. package/dist/{types-COeag8fU.d.ts → types-JlkZYMyA.d.ts} +1 -1
  48. package/dist/ui/index.d.ts +4 -4
  49. package/dist/ui/index.js +1 -1
  50. package/dist/ui/index.mjs +1 -1
  51. package/dist/ui/theme.css +92 -9
  52. package/dist/vast/index.d.ts +6 -6
  53. package/dist/vast/index.js +1 -1
  54. package/dist/vast/index.mjs +1 -1
  55. package/dist/vide.core.global.js +1 -1
  56. package/dist/vide.dash.global.js +1 -1
  57. package/dist/vide.drm.global.js +1 -1
  58. package/dist/vide.global.js +2 -2
  59. package/dist/vide.hls.global.js +1 -1
  60. package/dist/vide.ssai.global.js +1 -1
  61. package/dist/vide.ui.css +92 -9
  62. package/dist/vide.ui.global.js +1 -1
  63. package/dist/vide.vast.global.js +1 -1
  64. package/dist/vide.vmap.global.js +1 -1
  65. package/dist/vmap/index.d.ts +4 -4
  66. package/dist/vmap/index.js +1 -1
  67. package/dist/vmap/index.mjs +1 -1
  68. package/dist/vue/index.d.ts +14 -42
  69. package/dist/vue/index.js +2 -2
  70. package/dist/vue/index.mjs +2 -2
  71. package/package.json +1 -1
  72. package/dist/chunk-3RDTWUHH.mjs +0 -1
  73. package/dist/chunk-6DWWYSH4.mjs +0 -1
  74. package/dist/chunk-LPSJOF2I.mjs +0 -2
  75. package/dist/chunk-WINCDUN5.mjs +0 -1
@@ -1,2 +1,2 @@
1
- import {d as d$1}from'../chunk-2OVLZ27V.mjs';import {b as b$1,e,c,x}from'../chunk-LPSJOF2I.mjs';import {a}from'../chunk-6DWWYSH4.mjs';import {a as a$3}from'../chunk-3RDTWUHH.mjs';import {c as c$1}from'../chunk-WINCDUN5.mjs';import'../chunk-G74QBLVV.mjs';import'../chunk-UY5CGRNN.mjs';import {a as a$1}from'../chunk-NA4C7W64.mjs';import {a as a$2}from'../chunk-JRU2FKRB.mjs';import'../chunk-H3OXPFD3.mjs';import {e as e$1}from'../chunk-VPH4JIJV.mjs';import'../chunk-DWXOYV4E.mjs';import {createContext,forwardRef,useContext,useState,useEffect,useCallback,useRef,useMemo}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';function We(){let[r,t]=useState(null),e=useCallback(o=>{let i=a(o);t(i);},[]);return useEffect(()=>()=>{r?.destroy();},[r]),{current:r,_registerEl:e}}function Xe(r){return r===null?null:"_registerEl"in r?r.current:r}function f(r,t,e){let o=useRef(e);o.current=e;let i=Xe(r);useEffect(()=>{if(!i)return;let n=s=>o.current(s);return i.on(t,n),()=>i.off(t,n)},[i,t]);}function V(r,t,e){let o=useRef(e);o.current=e,useEffect(()=>{let i=r.current;if(!i)return;let s=t(o.current).setup(i);return ()=>{s?.();}},[r.current,t]);}function Je(r,t){V(r,a$1,t??{});}function Qe(r,t){V(r,a$2,t??{});}function Ze(r,t){V(r,e$1,t);}function et(r,t){V(r,a$3,t);}function tt(r,t){V(r,c$1,t);}function ot(r,t){V(r,d$1,t??{});}function rt(r,t){V(r,x,t);}var v=createContext(null);function d(){let r=useContext(v);if(r===null)throw new Error("useVideContext must be used within <Vide.Root>");return r.player}function Ce(){let r=useContext(v);if(r===null)throw new Error("Vide.Video must be used within <Vide.Root>");return r}function U({player:r,children:t}){let e=useMemo(()=>({player:r.current,registerEl:r._registerEl}),[r.current,r._registerEl]);return jsx(v.Provider,{value:e,children:t})}function z(r){let{registerEl:t}=Ce(),e=useCallback(o=>{o&&t(o);},[t]);return jsx("video",{ref:e,...r})}function Ee(...r){return r.filter(Boolean).join(" ")}var K=forwardRef(function({children:t,className:e,...o},i){let s=useContext(v)?.player??null,[a,l]=useState("");return useEffect(()=>{if(!s){l("");return}l(b$1(s.state));let m=({to:u})=>{l(b$1(u));};return s.on("statechange",m),()=>{s.off("statechange",m);}},[s]),jsx("section",{ref:i,className:Ee("vide-ui",a,e),"aria-label":"Video player",...o,children:t})});function W({children:r,className:t,...e}){return useContext(v)?.player?jsx("div",{className:Ee("vide-controls",t),...e,children:r}):null}function b(r,t){function e(o){let n=useContext(v)?.player??null,s=useRef(o);return s.current=o,useEffect(()=>{if(!n)return;let l=t(s.current).setup(n);return ()=>{l?.();}},[n,t]),null}return e.displayName=r,e}var q=b("HlsPlugin",a$1),G=b("DashPlugin",a$2),X=b("DrmPlugin",e$1),Y=b("VastPlugin",a$3),$=b("VmapPlugin",c$1),J=b("SsaiPlugin",d$1);var h={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",width:24,height:24,fill:"currentColor","aria-hidden":true};function H(){return jsx("svg",{...h,"aria-hidden":"true",children:jsx("path",{d:"M8 5v14l11-7z"})})}function Ne(){return jsx("svg",{...h,"aria-hidden":"true",children:jsx("path",{d:"M6 19h4V5H6v14zm8-14v14h4V5h-4z"})})}function w(){return jsx("svg",{...h,"aria-hidden":"true",children:jsx("path",{d:"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z"})})}function D(){return jsx("svg",{...h,"aria-hidden":"true",children:jsx("path",{d:"M18.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 9v6h4l5 5V4L9 9H5z"})})}function T(){return jsx("svg",{...h,"aria-hidden":"true",children:jsx("path",{d:"M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 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.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4l-1.88 1.88L12 7.76V4z"})})}function Me(){return jsx("svg",{...h,"aria-hidden":"true",children:jsx("path",{d:"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"})})}function Re(){return jsx("svg",{...h,"aria-hidden":"true",children:jsx("path",{d:"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z"})})}function Z({className:r,children:t}){let e=d(),[o,i]=useState(false);f(e,"statechange",({to:s})=>{s==="playing"||s==="ad:playing"?i(true):(s==="paused"||s==="ready"||s==="ended"||s==="ad:paused")&&i(false);});let n=useCallback(()=>{e&&(e.state==="playing"||e.state==="ad:playing"?e.pause():e.play().catch(()=>{}));},[e]);return jsx("button",{type:"button",className:["vide-play",r].filter(Boolean).join(" "),"aria-label":o?"Pause":"Play",onClick:n,"data-playing":o||void 0,children:t??(o?jsx(Ne,{}):jsx(H,{}))})}function ee({className:r,children:t}){let e=d(),[o,i]=useState(false),[n,s]=useState(1);useEffect(()=>{if(!e)return;let m=()=>{i(e.muted||e.volume===0),s(e.volume);};return e.el.addEventListener("volumechange",m),m(),()=>{e.el.removeEventListener("volumechange",m);}},[e]);let a=useCallback(()=>{e&&(e.muted=!e.muted);},[e]),l;return o?l=jsx(T,{}):n<.5?l=jsx(D,{}):l=jsx(w,{}),jsx("button",{type:"button",className:["vide-mute",r].filter(Boolean).join(" "),"aria-label":o?"Unmute":"Mute",onClick:a,"data-muted":o||void 0,children:t??l})}function re({className:r}){let t=d(),[e,o]=useState(0),[i,n]=useState(0),[s,a]=useState(false),l=useRef(false),m=useRef(null);f(t,"timeupdate",({currentTime:p,duration:c})=>{if(!l.current&&c>0&&o(p/c),t&&t.el.buffered.length>0&&c>0){let k=t.el.buffered.end(t.el.buffered.length-1);n(Math.min(1,k/c));}}),f(t,"statechange",({to:p})=>{a(p==="ad:loading"||p==="ad:playing"||p==="ad:paused");});let u=useCallback(p=>{if(!m.current)return 0;let c=m.current.getBoundingClientRect();return c.width===0?0:Math.max(0,Math.min(1,(p.clientX-c.left)/c.width))},[]),g=useCallback(p=>{!t||s||(l.current=true,m.current?.setPointerCapture(p.pointerId),o(u(p)));},[t,s,u]),O=useCallback(p=>{l.current&&o(u(p));},[u]),I=useCallback(p=>{if(!l.current||!t)return;l.current=false,m.current?.releasePointerCapture(p.pointerId);let c=u(p),k=t.el.duration;Number.isFinite(k)&&k>0&&(t.currentTime=c*k);},[t,u]);return jsxs("div",{ref:m,className:["vide-progress",r].filter(Boolean).join(" "),role:"slider",tabIndex:0,"aria-label":"Seek","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Math.round(e*100),"data-disabled":s||void 0,style:{"--vide-progress":e,"--vide-progress-buffered":i},onPointerDown:g,onPointerMove:O,onPointerUp:I,children:[jsx("div",{className:"vide-progress__buffered"}),jsx("div",{className:"vide-progress__bar"}),jsx("div",{className:"vide-progress__handle"})]})}function ne({className:r,children:t}){let e=d(),[o,i]=useState(1),[n,s]=useState(false),a=useRef(false),l=useRef(null);useEffect(()=>{if(!e)return;let p=()=>{a.current||i(e.muted?0:e.volume),s(e.muted||e.volume===0);};return e.el.addEventListener("volumechange",p),p(),()=>{e.el.removeEventListener("volumechange",p);}},[e]);let m=useCallback(()=>{e&&(e.muted=!e.muted);},[e]),u=useCallback(p=>{if(!l.current)return 0;let c=l.current.getBoundingClientRect();return c.width===0?0:Math.max(0,Math.min(1,(p.clientX-c.left)/c.width))},[]),g=useCallback(p=>{if(!e)return;a.current=true,l.current?.setPointerCapture(p.pointerId);let c=u(p);e.volume=c,e.muted&&c>0&&(e.muted=false),i(c),s(c===0);},[e,u]),O=useCallback(p=>{if(!a.current||!e)return;let c=u(p);e.volume=c,e.muted&&c>0&&(e.muted=false),i(c),s(c===0);},[e,u]),I=useCallback(p=>{a.current&&(a.current=false,l.current?.releasePointerCapture(p.pointerId));},[]);return jsxs("div",{className:["vide-volume",r].filter(Boolean).join(" "),"data-muted":n||void 0,style:{"--vide-volume":o},children:[jsx("button",{type:"button",className:"vide-volume__button","aria-label":n?"Unmute":"Mute",onClick:m,children:t??(n?jsx(T,{}):o<.5?jsx(D,{}):jsx(w,{}))}),jsxs("div",{ref:l,className:"vide-volume__slider",role:"slider",tabIndex:0,"aria-label":"Volume","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Math.round(o*100),onPointerDown:g,onPointerMove:O,onPointerUp:I,children:[jsx("div",{className:"vide-volume__track"}),jsx("div",{className:"vide-volume__filled"})]})]})}function se({className:r,target:t,children:e}){let o=d(),[i,n]=useState(false);useEffect(()=>{let a=()=>{n(document.fullscreenElement!=null||document.webkitFullscreenElement!=null);};return document.addEventListener("fullscreenchange",a),document.addEventListener("webkitfullscreenchange",a),()=>{document.removeEventListener("fullscreenchange",a),document.removeEventListener("webkitfullscreenchange",a);}},[]);let s=useCallback(()=>{let a=t??o?.el.closest(".vide-ui")??o?.el.parentElement;a&&(document.fullscreenElement?document.exitFullscreen().catch(()=>{}):a.requestFullscreen().catch(()=>{}));},[o,t]);return jsx("button",{type:"button",className:["vide-fullscreen",r].filter(Boolean).join(" "),"aria-label":i?"Exit fullscreen":"Fullscreen",onClick:s,"data-fullscreen":i||void 0,children:e??(i?jsx(Re,{}):jsx(Me,{}))})}function le({className:r,separator:t="/"}){let e$1=d(),[o,i]=useState(0),[n,s]=useState(0);return f(e$1,"timeupdate",a=>{i(a.currentTime),s(a.duration);}),jsxs("div",{className:["vide-time",r].filter(Boolean).join(" "),"aria-label":"Time",children:[jsx("span",{className:"vide-time__current",children:e(o)}),jsx("span",{className:"vide-time__separator",children:t}),jsx("span",{className:"vide-time__duration",children:e(n)})]})}function ue({className:r,...t}){return jsx("div",{className:["vide-loader",r].filter(Boolean).join(" "),...t,children:jsx("div",{className:"vide-loader__spinner"})})}function pe({src:r,alt:t="",className:e,...o}){return jsx("div",{className:["vide-poster",e].filter(Boolean).join(" "),...o,children:jsx("img",{className:"vide-poster__image",src:r,alt:t})})}function ce({className:r}){let t=useContext(v)?.player??null,[e,o]=useState("");return f(t,"error",({message:i})=>{o(i);}),jsx("div",{className:["vide-error",r].filter(Boolean).join(" "),children:jsx("span",{className:"vide-error__message",children:e})})}function me({className:r,children:t}){let e=useContext(v)?.player??null,o=useCallback(()=>{if(e){if(e.state==="ended"){let s=function({to:a}){a==="ready"&&(n.off("statechange",s),n.play().catch(()=>{}));};let n=e;n.on("statechange",s),n.el.currentTime=0,n.el.load();return}e.play().catch(()=>{});}},[e]);return jsx("button",{type:"button",className:["vide-bigplay",r].filter(Boolean).join(" "),"aria-label":"Play video",onClick:o,children:t??jsx(H,{})})}var At=200;function fe({className:r,enableFullscreen:t=true}){let e=useContext(v)?.player??null,o=useRef(null),i=useCallback(()=>{e&&(e.state==="playing"||e.state==="ad:playing"?e.pause():e.play().catch(()=>{}));},[e]),n=useCallback(()=>{if(!t)return;let a=e?.el.closest(".vide-ui")??e?.el.parentElement;a&&(document.fullscreenElement!=null?document.exitFullscreen().catch(()=>{}):a.requestFullscreen&&a.requestFullscreen().catch(()=>{}));},[e,t]),s=useCallback(()=>{if(e){if(c(e.state)){e.el.click(),i();return}if(o.current!==null){clearTimeout(o.current),o.current=null,n();return}o.current=setTimeout(()=>{o.current=null,i();},At);}},[e,i,n]);return jsx("div",{className:["vide-clickplay",r].filter(Boolean).join(" "),onClick:s,onKeyDown:a=>{(a.key==="Enter"||a.key===" ")&&(a.preventDefault(),s());}})}function P(r){let[t,e]=useState({active:false,meta:null});return f(r,"ad:start",o=>{e({active:true,meta:{adId:o.adId,clickThrough:o.clickThrough,skipOffset:o.skipOffset,duration:o.duration,adTitle:o.adTitle,adStartTime:Date.now()}});}),f(r,"ad:end",()=>{e({active:false,meta:null});}),f(r,"ad:skip",()=>{e({active:false,meta:null});}),t}function ve({className:r,children:t}){let e=d(),{active:o,meta:i}=P(e),n=useCallback(()=>{if(!e)return;e.el.click();let s=i?.clickThrough;s?(window.open(s,"_blank"),e.el.pause()):e.el.paused?Promise.resolve(e.el.play()).catch(()=>{}):e.el.pause();},[e,i]);return !e||!o?null:jsx("div",{className:["vide-ad-overlay",r].filter(Boolean).join(" "),onClick:n,children:t})}function ye({className:r,children:t}){let e=d(),{active:o,meta:i}=P(e),[n,s]=useState(false),[a,l]=useState(0);f(e,"timeupdate",({currentTime:u})=>{!o||!i||i.skipOffset===void 0||(u>=i.skipOffset?s(true):(s(false),l(Math.max(0,Math.ceil(i.skipOffset-u)))));});let m=useCallback(()=>{!e||!n||!i||e.emit("ad:skip",{adId:i.adId});},[e,n,i]);return !e||!o||!i||i.skipOffset===void 0?null:jsx("button",{type:"button",className:["vide-skip",!n&&"vide-skip--disabled",r].filter(Boolean).join(" "),"aria-label":"Skip ad",onClick:m,disabled:!n,children:n?t??"Skip Ad":`Skip in ${a}s`})}function Pe({className:r,format:t}){let e=d(),{active:o,meta:i}=P(e),[n,s]=useState(0);return f(e,"timeupdate",({currentTime:a})=>{if(!o||!i)return;let l=i.duration??(e&&Number.isFinite(e.duration)?e.duration:0);s(Math.max(0,Math.ceil(l-a)));}),!e||!o?null:jsx("div",{className:["vide-ad-countdown",r].filter(Boolean).join(" "),children:t?t(n):`Ad \xB7 ${n}s`})}function ge({className:r,children:t}){let e=d(),{active:o}=P(e);return !e||!o?null:jsx("div",{className:["vide-ad-label",r].filter(Boolean).join(" "),children:t??"Ad"})}function xe({className:r,children:t,showTitle:e}){let o=d(),{active:i,meta:n}=P(o),s=useCallback(()=>{!o||!n?.clickThrough||(o.el.click(),window.open(n.clickThrough,"_blank"),o.el.pause());},[o,n]);return !o||!i||!n?.clickThrough?null:jsx("button",{type:"button",className:["vide-ad-cta",r].filter(Boolean).join(" "),onClick:s,children:e&&n.adTitle?jsxs(Fragment,{children:[jsx("span",{className:"vide-ad-cta__title",children:n.adTitle}),t??"Learn More"]}):t??"Learn More"})}var qt=3e3;function Gt(r,t){let e=useRef(null);useEffect(()=>{let o=r.current;if(!o||!t)return;function i(){if(!t)return true;let u=t.state;return u==="paused"||u==="ended"||u==="idle"||u==="ready"||c(u)}function n(){o?.classList.remove("vide-ui--autohide");}function s(){e.current!==null&&(clearTimeout(e.current),e.current=null);}function a(){s(),!i()&&(e.current=setTimeout(()=>{o?.classList.add("vide-ui--autohide");},qt));}function l(){n(),a();}function m({to:u}){u==="paused"||u==="ended"||u==="idle"||u==="ready"||c(u)?(s(),n()):a();}return o.addEventListener("mousemove",l),o.addEventListener("touchstart",l),o.addEventListener("keydown",l),t.on("statechange",m),a(),()=>{s(),o.removeEventListener("mousemove",l),o.removeEventListener("touchstart",l),o.removeEventListener("keydown",l),o.classList.remove("vide-ui--autohide"),t.off("statechange",m);}},[r,t]);}function Yt(r,t,e={}){useEffect(()=>{let o=r.current;if(!o||!t)return;o.setAttribute("tabindex","0");function i(n){if(!t)return;let s=!e.disableSeek,a=!e.disableVolume,l=!e.disableFullscreen,m=c(t.state);switch(n.key){case " ":case "k":case "K":n.preventDefault(),t.state==="playing"||t.state==="ad:playing"?t.pause():t.play().catch(()=>{});break;case "ArrowLeft":if(!s||m)return;n.preventDefault(),t.currentTime=Math.max(0,t.el.currentTime-5);break;case "ArrowRight":if(!s||m)return;n.preventDefault(),t.currentTime=Math.min(t.el.duration||0,t.el.currentTime+5);break;case "ArrowUp":if(!a)return;n.preventDefault(),t.volume=Math.min(1,t.volume+.1),t.muted&&(t.muted=false);break;case "ArrowDown":if(!a)return;n.preventDefault(),t.volume=Math.max(0,t.volume-.1);break;case "m":case "M":if(!a)return;n.preventDefault(),t.muted=!t.muted;break;case "f":case "F":if(!l)return;n.preventDefault(),document.fullscreenElement!=null?document.exitFullscreen().catch(()=>{}):(o?.closest(".vide-ui")??o)?.requestFullscreen().catch(()=>{});break;default:if(n.key.length===1&&n.key>="0"&&n.key<="9"&&s&&!m){n.preventDefault();let u=Number.parseInt(n.key,10)/10,g=t.el.duration;Number.isFinite(g)&&g>0&&(t.currentTime=u*g);}break}}return o.addEventListener("keydown",i),()=>{o.removeEventListener("keydown",i),o.removeAttribute("tabindex");}},[r,t,e.disableSeek,e.disableVolume,e.disableFullscreen]);}var Bn={Root:U,Video:z,UI:K,Controls:W,HlsPlugin:q,DashPlugin:G,DrmPlugin:X,VastPlugin:Y,VmapPlugin:$,SsaiPlugin:J,PlayButton:Z,MuteButton:ee,Progress:re,Volume:ne,FullscreenButton:se,TimeDisplay:le,Loader:ue,Poster:pe,ErrorDisplay:ce,BigPlayButton:me,ClickPlay:fe,AdOverlay:ve,AdSkip:ye,AdCountdown:Pe,AdLabel:ge,AdLearnMore:xe};
2
- export{Pe as AdCountdown,ge as AdLabel,xe as AdLearnMore,ve as AdOverlay,ye as AdSkip,me as BigPlayButton,fe as ClickPlay,G as DashPlugin,X as DrmPlugin,ce as ErrorDisplay,se as FullscreenButton,q as HlsPlugin,ue as Loader,ee as MuteButton,Z as PlayButton,pe as Poster,re as Progress,J as SsaiPlugin,le as TimeDisplay,Y as VastPlugin,Bn as Vide,v as VideContext,W as VideControls,U as VideRoot,K as VideUI,z as VideVideo,$ as VmapPlugin,ne as Volume,P as useAdState,Gt as useAutohide,Qe as useDash,Ze as useDrm,Je as useHls,Yt as useKeyboard,ot as useSsai,rt as useUi,et as useVast,d as useVideContext,f as useVideEvent,We as useVidePlayer,tt as useVmap};
1
+ import {d}from'../chunk-7R6TO7ZE.mjs';import {b as b$1,e,c,x}from'../chunk-YBNODS5R.mjs';import {a}from'../chunk-AQLZYNP7.mjs';import {a as a$3}from'../chunk-YE6RITJU.mjs';import {c as c$1}from'../chunk-TNHV5PHM.mjs';import'../chunk-2UHU76KF.mjs';import'../chunk-UY5CGRNN.mjs';import {a as a$1}from'../chunk-ZUEPNVVV.mjs';import {a as a$2}from'../chunk-JRU2FKRB.mjs';import'../chunk-H3OXPFD3.mjs';import {e as e$1}from'../chunk-CD27DYME.mjs';import'../chunk-DWXOYV4E.mjs';import {createContext,forwardRef,useContext,useState,useEffect,useCallback,useRef,useMemo}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';function Ye(){let[o,t]=useState(null),e=useCallback(r=>{let n=a(r);t(n);},[]);return useEffect(()=>()=>{o?.destroy();},[o]),{current:o,_registerEl:e}}function Qe(o){return o===null?null:"_registerEl"in o?o.current:o}function f(o,t,e){let r=useRef(e);r.current=e;let n=Qe(o);useEffect(()=>{if(!n)return;let i=s=>r.current(s);return n.on(t,i),()=>n.off(t,i)},[n,t]);}function V(o,t,e){let r=useRef(e);r.current=e,useEffect(()=>{let n=o.current;if(!n)return;let s=t(r.current).setup(n);return ()=>{s?.();}},[o.current,t]);}function tt(o,t){V(o,a$1,t??{});}function ot(o,t){V(o,a$2,t??{});}function rt(o,t){V(o,e$1,t);}function nt(o,t){V(o,a$3,t);}function it(o,t){V(o,c$1,t);}function st(o,t){V(o,d,t??{});}function at(o,t){V(o,x,t);}var y=createContext(null);function m(){let o=useContext(y);if(o===null)throw new Error("useVideContext must be used within <Vide.Root>");return o.player}function Ee(){let o=useContext(y);if(o===null)throw new Error("Vide.Video must be used within <Vide.Root>");return o}function z({player:o,children:t}){let e=useMemo(()=>({player:o.current,registerEl:o._registerEl}),[o.current,o._registerEl]);return jsx(y.Provider,{value:e,children:t})}function K(o){let{registerEl:t}=Ee(),e=useCallback(r=>{r&&t(r);},[t]);return jsx("video",{ref:e,...o})}function Se(...o){return o.filter(Boolean).join(" ")}var W=forwardRef(function({children:t,className:e,...r},n){let s=useContext(y)?.player??null,[a,l]=useState("");return useEffect(()=>{if(!s){l("");return}l(b$1(s.state));let d=({to:u})=>{l(b$1(u));};return s.on("statechange",d),()=>{s.off("statechange",d);}},[s]),jsx("section",{ref:n,className:Se("vide-ui",a,e),"aria-label":"Video player",...r,children:t})});function q({children:o,className:t,...e}){return useContext(y)?.player?jsx("div",{className:Se("vide-controls",t),...e,children:o}):null}function b(o,t){function e(r){let i=useContext(y)?.player??null,s=useRef(r);return s.current=r,useEffect(()=>{if(!i)return;let l=t(s.current).setup(i);return ()=>{l?.();}},[i,t]),null}return e.displayName=o,e}var G=b("HlsPlugin",a$1),X=b("DashPlugin",a$2),Y=b("DrmPlugin",e$1),$=b("VastPlugin",a$3),J=b("VmapPlugin",c$1),Q=b("SsaiPlugin",d);var g={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",width:24,height:24,fill:"currentColor","aria-hidden":true};function H(){return jsx("svg",{...g,"aria-hidden":"true",children:jsx("path",{d:"M8 5v14l11-7z"})})}function Le(){return jsx("svg",{...g,"aria-hidden":"true",children:jsx("path",{d:"M6 19h4V5H6v14zm8-14v14h4V5h-4z"})})}function D(){return jsx("svg",{...g,"aria-hidden":"true",children:jsx("path",{d:"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z"})})}function T(){return jsx("svg",{...g,"aria-hidden":"true",children:jsx("path",{d:"M18.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 9v6h4l5 5V4L9 9H5z"})})}function B(){return jsx("svg",{...g,"aria-hidden":"true",children:jsx("path",{d:"M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 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.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4l-1.88 1.88L12 7.76V4z"})})}function Re(){return jsx("svg",{...g,"aria-hidden":"true",children:jsx("path",{d:"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"})})}function Ae(){return jsx("svg",{...g,"aria-hidden":"true",children:jsx("path",{d:"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z"})})}function we(){return jsxs("svg",{...g,"aria-hidden":"true",children:[jsx("path",{d:"M14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"}),jsx("path",{d:"M19 19H5V5h7V3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7h-2v7z"})]})}function He(){return jsx("svg",{...g,"aria-hidden":"true",children:jsx("path",{d:"M5 18l10-6L5 6v12zm12-12v12h2V6h-2z"})})}function ee({className:o,children:t}){let e=m(),[r,n]=useState(false);f(e,"statechange",({to:s})=>{s==="playing"||s==="ad:playing"?n(true):(s==="paused"||s==="ready"||s==="ended"||s==="ad:paused")&&n(false);});let i=useCallback(()=>{e&&(e.state==="playing"||e.state==="ad:playing"?e.pause():e.play().catch(()=>{}));},[e]);return jsx("button",{type:"button",className:["vide-play",o].filter(Boolean).join(" "),"aria-label":r?"Pause":"Play",onClick:i,"data-playing":r||void 0,children:t??(r?jsx(Le,{}):jsx(H,{}))})}function te({className:o,children:t}){let e=m(),[r,n]=useState(false),[i,s]=useState(1);useEffect(()=>{if(!e)return;let d=()=>{n(e.muted||e.volume===0),s(e.volume);};return e.el.addEventListener("volumechange",d),d(),()=>{e.el.removeEventListener("volumechange",d);}},[e]);let a=useCallback(()=>{e&&(e.muted=!e.muted);},[e]),l;return r?l=jsx(B,{}):i<.5?l=jsx(T,{}):l=jsx(D,{}),jsx("button",{type:"button",className:["vide-mute",o].filter(Boolean).join(" "),"aria-label":r?"Unmute":"Mute",onClick:a,"data-muted":r||void 0,children:t??l})}function ne({className:o}){let t=m(),[e,r]=useState(0),[n,i]=useState(0),[s,a]=useState(false),l=useRef(false),d=useRef(null);f(t,"timeupdate",({currentTime:p,duration:c})=>{if(!l.current&&c>0&&r(p/c),t&&t.el.buffered.length>0&&c>0){let k=t.el.buffered.end(t.el.buffered.length-1);i(Math.min(1,k/c));}}),f(t,"statechange",({to:p})=>{a(p==="ad:loading"||p==="ad:playing"||p==="ad:paused");});let u=useCallback(p=>{if(!d.current)return 0;let c=d.current.getBoundingClientRect();return c.width===0?0:Math.max(0,Math.min(1,(p.clientX-c.left)/c.width))},[]),h=useCallback(p=>{!t||s||(l.current=true,d.current?.setPointerCapture(p.pointerId),r(u(p)));},[t,s,u]),I=useCallback(p=>{l.current&&r(u(p));},[u]),_=useCallback(p=>{if(!l.current||!t)return;l.current=false,d.current?.releasePointerCapture(p.pointerId);let c=u(p),k=t.el.duration;Number.isFinite(k)&&k>0&&(t.currentTime=c*k);},[t,u]);return jsxs("div",{ref:d,className:["vide-progress",o].filter(Boolean).join(" "),role:"slider",tabIndex:0,"aria-label":"Seek","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Math.round(e*100),"data-disabled":s||void 0,style:{"--vide-progress":e,"--vide-progress-buffered":n},onPointerDown:h,onPointerMove:I,onPointerUp:_,children:[jsx("div",{className:"vide-progress__buffered"}),jsx("div",{className:"vide-progress__bar"}),jsx("div",{className:"vide-progress__handle"})]})}function ie({className:o,children:t}){let e=m(),[r,n]=useState(1),[i,s]=useState(false),a=useRef(false),l=useRef(null);useEffect(()=>{if(!e)return;let p=()=>{a.current||n(e.muted?0:e.volume),s(e.muted||e.volume===0);};return e.el.addEventListener("volumechange",p),p(),()=>{e.el.removeEventListener("volumechange",p);}},[e]);let d=useCallback(()=>{e&&(e.muted=!e.muted);},[e]),u=useCallback(p=>{if(!l.current)return 0;let c=l.current.getBoundingClientRect();return c.width===0?0:Math.max(0,Math.min(1,(p.clientX-c.left)/c.width))},[]),h=useCallback(p=>{if(!e)return;a.current=true,l.current?.setPointerCapture(p.pointerId);let c=u(p);e.volume=c,e.muted&&c>0&&(e.muted=false),n(c),s(c===0);},[e,u]),I=useCallback(p=>{if(!a.current||!e)return;let c=u(p);e.volume=c,e.muted&&c>0&&(e.muted=false),n(c),s(c===0);},[e,u]),_=useCallback(p=>{a.current&&(a.current=false,l.current?.releasePointerCapture(p.pointerId));},[]);return jsxs("div",{className:["vide-volume",o].filter(Boolean).join(" "),"data-muted":i||void 0,style:{"--vide-volume":r},children:[jsx("button",{type:"button",className:"vide-volume__button","aria-label":i?"Unmute":"Mute",onClick:d,children:t??(i?jsx(B,{}):r<.5?jsx(T,{}):jsx(D,{}))}),jsxs("div",{ref:l,className:"vide-volume__slider",role:"slider",tabIndex:0,"aria-label":"Volume","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Math.round(r*100),onPointerDown:h,onPointerMove:I,onPointerUp:_,children:[jsx("div",{className:"vide-volume__track"}),jsx("div",{className:"vide-volume__filled"})]})]})}function ae({className:o,target:t,children:e}){let r=m(),[n,i]=useState(false);useEffect(()=>{let a=()=>{i(document.fullscreenElement!=null||document.webkitFullscreenElement!=null);};return document.addEventListener("fullscreenchange",a),document.addEventListener("webkitfullscreenchange",a),()=>{document.removeEventListener("fullscreenchange",a),document.removeEventListener("webkitfullscreenchange",a);}},[]);let s=useCallback(()=>{let a=t??r?.el.closest(".vide-ui")??r?.el.parentElement;a&&(document.fullscreenElement?document.exitFullscreen().catch(()=>{}):a.requestFullscreen().catch(()=>{}));},[r,t]);return jsx("button",{type:"button",className:["vide-fullscreen",o].filter(Boolean).join(" "),"aria-label":n?"Exit fullscreen":"Fullscreen",onClick:s,"data-fullscreen":n||void 0,children:e??(n?jsx(Ae,{}):jsx(Re,{}))})}function ue({className:o,separator:t="/"}){let e$1=m(),[r,n]=useState(0),[i,s]=useState(0);return f(e$1,"timeupdate",a=>{n(a.currentTime),s(a.duration);}),jsxs("div",{className:["vide-time",o].filter(Boolean).join(" "),"aria-label":"Time",children:[jsx("span",{className:"vide-time__current",children:e(r)}),jsx("span",{className:"vide-time__separator",children:t}),jsx("span",{className:"vide-time__duration",children:e(i)})]})}function pe({className:o,...t}){return jsx("div",{role:"status","aria-label":"Loading",className:["vide-loader",o].filter(Boolean).join(" "),...t,children:jsx("div",{className:"vide-loader__spinner"})})}function ce({src:o,alt:t="",className:e,...r}){return jsx("div",{className:["vide-poster",e].filter(Boolean).join(" "),...r,children:jsx("img",{className:"vide-poster__image",src:o,alt:t})})}function de({className:o}){let t=useContext(y)?.player??null,[e,r]=useState("");return f(t,"error",({message:n})=>{r(n);}),jsx("div",{role:"alert",className:["vide-error",o].filter(Boolean).join(" "),children:jsx("span",{className:"vide-error__message",children:e})})}function me({className:o,children:t}){let e=useContext(y)?.player??null,r=useCallback(()=>{if(e){if(e.state==="ended"){let s=function({to:a}){a==="ready"&&(i.off("statechange",s),i.play().catch(()=>{}));};let i=e;i.on("statechange",s),i.el.currentTime=0,i.el.load();return}e.play().catch(()=>{});}},[e]);return jsx("button",{type:"button",className:["vide-bigplay",o].filter(Boolean).join(" "),"aria-label":"Play video",onClick:r,children:t??jsx(H,{})})}var Bt=200;function ve({className:o,enableFullscreen:t=true}){let e=useContext(y)?.player??null,r=useRef(null),n=useCallback(()=>{e&&(e.state==="playing"||e.state==="ad:playing"?e.pause():e.play().catch(()=>{}));},[e]),i=useCallback(()=>{if(!t)return;let a=e?.el.closest(".vide-ui")??e?.el.parentElement;a&&(document.fullscreenElement!=null?document.exitFullscreen().catch(()=>{}):a.requestFullscreen&&a.requestFullscreen().catch(()=>{}));},[e,t]),s=useCallback(()=>{if(e){if(c(e.state)){e.el.click(),n();return}if(r.current!==null){clearTimeout(r.current),r.current=null,i();return}r.current=setTimeout(()=>{r.current=null,n();},Bt);}},[e,n,i]);return jsx("div",{className:["vide-clickplay",o].filter(Boolean).join(" "),onClick:s,onKeyDown:a=>{(a.key==="Enter"||a.key===" ")&&(a.preventDefault(),s());}})}function P(o){let[t,e]=useState({active:false,meta:null});return f(o,"ad:start",r=>{e({active:true,meta:{adId:r.adId,clickThrough:r.clickThrough,skipOffset:r.skipOffset,duration:r.duration,adTitle:r.adTitle,adStartTime:Date.now()}});}),f(o,"ad:end",()=>{e({active:false,meta:null});}),f(o,"ad:skip",()=>{e({active:false,meta:null});}),t}function ye({className:o,children:t}){let e=m(),{active:r,meta:n}=P(e),i=useCallback(()=>{if(!e)return;e.el.click();let s=n?.clickThrough;s?(window.open(s,"_blank"),e.el.pause()):e.el.paused?Promise.resolve(e.el.play()).catch(()=>{}):e.el.pause();},[e,n]);return !e||!r?null:jsx("div",{className:["vide-ad-overlay",o].filter(Boolean).join(" "),onClick:i,children:t})}function ge({className:o,children:t}){let e=m(),{active:r,meta:n}=P(e),[i,s]=useState(false),[a,l]=useState(0);f(e,"timeupdate",({currentTime:u})=>{!r||!n||n.skipOffset===void 0||(u>=n.skipOffset?s(true):(s(false),l(Math.max(0,Math.ceil(n.skipOffset-u)))));});let d=useCallback(()=>{!e||!i||!n||e.emit("ad:skip",{adId:n.adId});},[e,i,n]);return !e||!r||!n||n.skipOffset===void 0?null:jsx("button",{type:"button",className:["vide-skip",!i&&"vide-skip--disabled",o].filter(Boolean).join(" "),"aria-label":"Skip ad",onClick:d,disabled:!i,children:t??jsxs(Fragment,{children:[jsx("span",{className:"vide-skip__label",children:i?"Skip Ad":`Skip in ${a}s`}),jsx(He,{})]})})}function he({className:o,format:t}){let e=m(),{active:r,meta:n}=P(e),[i,s]=useState(0);return f(e,"timeupdate",({currentTime:a})=>{if(!r||!n)return;let l=n.duration??(e&&Number.isFinite(e.duration)?e.duration:0);s(Math.max(0,Math.ceil(l-a)));}),!e||!r?null:jsx("div",{"aria-label":"Ad countdown","aria-live":"off",className:["vide-ad-countdown",o].filter(Boolean).join(" "),children:t?t(i):`Ad \xB7 ${i}s`})}function xe({className:o,children:t}){let e=m(),{active:r}=P(e);return !e||!r?null:jsx("div",{className:["vide-ad-label",o].filter(Boolean).join(" "),children:t??"Ad"})}function Yt(o){try{return new URL(o).hostname}catch{return o}}function Ve({className:o,children:t}){let e=m(),{active:r,meta:n}=P(e),i=useCallback(()=>{!e||!n?.clickThrough||(e.el.click(),window.open(n.clickThrough,"_blank"),e.el.pause());},[e,n]),s=useMemo(()=>n?.clickThrough?Yt(n.clickThrough):"",[n?.clickThrough]);return !e||!r||!n?.clickThrough?null:jsx("button",{type:"button",className:["vide-ad-cta",o].filter(Boolean).join(" "),onClick:i,children:t??jsxs(Fragment,{children:[jsx("span",{className:"vide-ad-cta__icon",children:jsx(we,{})}),jsxs("span",{className:"vide-ad-cta__body",children:[n.adTitle&&jsx("span",{className:"vide-ad-cta__title",children:n.adTitle}),jsx("span",{className:"vide-ad-cta__url",children:s})]})]})})}var Zt=3e3;function eo(o,t){let e=useRef(null);useEffect(()=>{let r=o.current;if(!r||!t)return;function n(){if(!t)return true;let u=t.state;return u==="paused"||u==="ended"||u==="idle"||u==="ready"||c(u)}function i(){r?.classList.remove("vide-ui--autohide");}function s(){e.current!==null&&(clearTimeout(e.current),e.current=null);}function a(){s(),!n()&&(e.current=setTimeout(()=>{r?.classList.add("vide-ui--autohide");},Zt));}function l(){i(),a();}function d({to:u}){u==="paused"||u==="ended"||u==="idle"||u==="ready"||c(u)?(s(),i()):a();}return r.addEventListener("mousemove",l),r.addEventListener("touchstart",l),r.addEventListener("keydown",l),t.on("statechange",d),a(),()=>{s(),r.removeEventListener("mousemove",l),r.removeEventListener("touchstart",l),r.removeEventListener("keydown",l),r.classList.remove("vide-ui--autohide"),t.off("statechange",d);}},[o,t]);}function oo(o,t,e={}){useEffect(()=>{let r=o.current;if(!r||!t)return;r.setAttribute("tabindex","0");function n(i){if(!t)return;let s=!e.disableSeek,a=!e.disableVolume,l=!e.disableFullscreen,d=c(t.state);switch(i.key){case " ":case "k":case "K":i.preventDefault(),t.state==="playing"||t.state==="ad:playing"?t.pause():t.play().catch(()=>{});break;case "ArrowLeft":if(!s||d)return;i.preventDefault(),t.currentTime=Math.max(0,t.el.currentTime-5);break;case "ArrowRight":if(!s||d)return;i.preventDefault(),t.currentTime=Math.min(t.el.duration||0,t.el.currentTime+5);break;case "ArrowUp":if(!a)return;i.preventDefault(),t.volume=Math.min(1,t.volume+.1),t.muted&&(t.muted=false);break;case "ArrowDown":if(!a)return;i.preventDefault(),t.volume=Math.max(0,t.volume-.1);break;case "m":case "M":if(!a)return;i.preventDefault(),t.muted=!t.muted;break;case "f":case "F":if(!l)return;i.preventDefault(),document.fullscreenElement!=null?document.exitFullscreen().catch(()=>{}):(r?.closest(".vide-ui")??r)?.requestFullscreen().catch(()=>{});break;default:if(i.key.length===1&&i.key>="0"&&i.key<="9"&&s&&!d){i.preventDefault();let u=Number.parseInt(i.key,10)/10,h=t.el.duration;Number.isFinite(h)&&h>0&&(t.currentTime=u*h);}break}}return r.addEventListener("keydown",n),()=>{r.removeEventListener("keydown",n),r.removeAttribute("tabindex");}},[o,t,e.disableSeek,e.disableVolume,e.disableFullscreen]);}var Wn={Root:z,Video:K,UI:W,Controls:q,HlsPlugin:G,DashPlugin:X,DrmPlugin:Y,VastPlugin:$,VmapPlugin:J,SsaiPlugin:Q,PlayButton:ee,MuteButton:te,Progress:ne,Volume:ie,FullscreenButton:ae,TimeDisplay:ue,Loader:pe,Poster:ce,ErrorDisplay:de,BigPlayButton:me,ClickPlay:ve,AdOverlay:ye,AdSkip:ge,AdCountdown:he,AdLabel:xe,AdLearnMore:Ve};
2
+ export{he as AdCountdown,xe as AdLabel,Ve as AdLearnMore,ye as AdOverlay,ge as AdSkip,me as BigPlayButton,ve as ClickPlay,X as DashPlugin,Y as DrmPlugin,de as ErrorDisplay,ae as FullscreenButton,G as HlsPlugin,pe as Loader,te as MuteButton,ee as PlayButton,ce as Poster,ne as Progress,Q as SsaiPlugin,ue as TimeDisplay,$ as VastPlugin,Wn as Vide,y as VideContext,q as VideControls,z as VideRoot,W as VideUI,K as VideVideo,J as VmapPlugin,ie as Volume,P as useAdState,eo as useAutohide,ot as useDash,rt as useDrm,tt as useHls,oo as useKeyboard,st as useSsai,at as useUi,nt as useVast,m as useVideContext,f as useVideEvent,Ye as useVidePlayer,it as useVmap};
@@ -1,5 +1,5 @@
1
- import { A as AdPlugin } from '../types-COeag8fU.js';
2
- import '../types-BsEF8iWC.js';
1
+ import { A as AdPlugin } from '../types-JlkZYMyA.js';
2
+ import '../types-BD5ZFUAt.js';
3
3
 
4
4
  interface SimidPluginOptions {
5
5
  /** Container element to mount the SIMID iframe into. */
@@ -1,4 +1,4 @@
1
- import { f as Plugin } from '../types-BsEF8iWC.js';
1
+ import { f as Plugin } from '../types-BD5ZFUAt.js';
2
2
  import { A as AdBreakMetadata, S as SsaiPluginOptions } from '../types-DsixuzNX.js';
3
3
  export { a as AdTrackingMap, M as MetadataParser, R as RawMetadata } from '../types-DsixuzNX.js';
4
4
 
@@ -1 +1 @@
1
- export{b as parseDateRange,a as parseEventStream,c as parseId3Samples,d as ssai}from'../chunk-2OVLZ27V.mjs';import'../chunk-UY5CGRNN.mjs';
1
+ export{b as parseDateRange,a as parseEventStream,c as parseId3Samples,d as ssai}from'../chunk-7R6TO7ZE.mjs';import'../chunk-UY5CGRNN.mjs';
@@ -1 +1 @@
1
- export{b as parseDateRange,a as parseEventStream,c as parseId3Samples,d as ssai}from'../chunk-2OVLZ27V.mjs';import'../chunk-UY5CGRNN.mjs';
1
+ export{b as parseDateRange,a as parseEventStream,c as parseId3Samples,d as ssai}from'../chunk-7R6TO7ZE.mjs';import'../chunk-UY5CGRNN.mjs';
@@ -13,7 +13,8 @@ interface Props {
13
13
 
14
14
  const { class: className, children, onmount }: Props = $props();
15
15
 
16
- const rootEl: HTMLDivElement | undefined = $state();
16
+ // biome-ignore lint/style/useConst: bind:this requires let in Svelte 5
17
+ let rootEl: HTMLDivElement | undefined = $state();
17
18
 
18
19
  $effect(() => {
19
20
  if (rootEl && onmount) onmount(rootEl);
@@ -1,17 +1,15 @@
1
1
  <script lang="ts">
2
2
  import { getContext, onMount } from "svelte";
3
- import type { Snippet } from "svelte";
4
3
  import { type RegisterFn, VIDE_REGISTER_KEY } from "./context.js";
5
4
  import type { MediaElement } from "./helpers.js";
6
5
 
7
6
  interface Props {
8
7
  src?: string;
9
8
  class?: string;
10
- children?: Snippet;
11
9
  [key: string]: unknown;
12
10
  }
13
11
 
14
- const { class: className, children, ...videoAttrs }: Props = $props();
12
+ const { ...videoAttrs }: Props = $props();
15
13
  let videoEl: HTMLVideoElement;
16
14
 
17
15
  const registerEl = getContext<RegisterFn>(VIDE_REGISTER_KEY);
@@ -23,9 +21,4 @@ onMount(() => {
23
21
  });
24
22
  </script>
25
23
 
26
- <div class={className}>
27
- <video bind:this={videoEl} {...videoAttrs}></video>
28
- {#if children}
29
- {@render children()}
30
- {/if}
31
- </div>
24
+ <video bind:this={videoEl} {...videoAttrs}></video>
@@ -1,8 +1,6 @@
1
- import type { Snippet } from "svelte";
2
1
  interface Props {
3
2
  src?: string;
4
3
  class?: string;
5
- children?: Snippet;
6
4
  [key: string]: unknown;
7
5
  }
8
6
  declare const Video: import("svelte").Component<Props, {}, "">;
@@ -31,7 +31,7 @@ $effect(() => {
31
31
  </script>
32
32
 
33
33
  {#if adState.active}
34
- <div class={["vide-ad-countdown", className].filter(Boolean).join(" ")}>
34
+ <div aria-label="Ad countdown" aria-live="off" class={["vide-ad-countdown", className].filter(Boolean).join(" ")}>
35
35
  {format ? format(remaining) : `Ad \u00b7 ${remaining}s`}
36
36
  </div>
37
37
  {/if}
@@ -2,15 +2,23 @@
2
2
  import { getContext } from "svelte";
3
3
  import type { Snippet } from "svelte";
4
4
  import { type PlayerGetter, VIDE_PLAYER_KEY } from "../context.js";
5
+ import IconExternalLink from "../icons/IconExternalLink.svelte";
5
6
  import { useAdState } from "../use-ad-state.svelte.js";
6
7
 
8
+ function hostname(url: string): string {
9
+ try {
10
+ return new URL(url).hostname;
11
+ } catch {
12
+ return url;
13
+ }
14
+ }
15
+
7
16
  interface Props {
8
17
  class?: string;
9
18
  children?: Snippet;
10
- showTitle?: boolean;
11
19
  }
12
20
 
13
- const { class: className, children, showTitle = false }: Props = $props();
21
+ const { class: className, children }: Props = $props();
14
22
 
15
23
  const getPlayer = getContext<PlayerGetter>(VIDE_PLAYER_KEY);
16
24
  const adState = useAdState(getPlayer);
@@ -30,13 +38,18 @@ function onClick() {
30
38
  class={["vide-ad-cta", className].filter(Boolean).join(" ")}
31
39
  onclick={onClick}
32
40
  >
33
- {#if showTitle && adState.meta.adTitle}
34
- <span class="vide-ad-cta__title">{adState.meta.adTitle}</span>
35
- {/if}
36
41
  {#if children}
37
42
  {@render children()}
38
43
  {:else}
39
- Learn More
44
+ <span class="vide-ad-cta__icon">
45
+ <IconExternalLink />
46
+ </span>
47
+ <span class="vide-ad-cta__body">
48
+ {#if adState.meta.adTitle}
49
+ <span class="vide-ad-cta__title">{adState.meta.adTitle}</span>
50
+ {/if}
51
+ <span class="vide-ad-cta__url">{hostname(adState.meta.clickThrough)}</span>
52
+ </span>
40
53
  {/if}
41
54
  </button>
42
55
  {/if}
@@ -2,7 +2,6 @@ import type { Snippet } from "svelte";
2
2
  interface Props {
3
3
  class?: string;
4
4
  children?: Snippet;
5
- showTitle?: boolean;
6
5
  }
7
6
  declare const AdLearnMore: import("svelte").Component<Props, {}, "">;
8
7
  type AdLearnMore = ReturnType<typeof AdLearnMore>;
@@ -2,6 +2,7 @@
2
2
  import { getContext } from "svelte";
3
3
  import type { Snippet } from "svelte";
4
4
  import { type PlayerGetter, VIDE_PLAYER_KEY } from "../context.js";
5
+ import IconSkipForward from "../icons/IconSkipForward.svelte";
5
6
  import { useAdState } from "../use-ad-state.svelte.js";
6
7
 
7
8
  interface Props {
@@ -54,14 +55,13 @@ function onClick() {
54
55
  onclick={onClick}
55
56
  disabled={!canSkip}
56
57
  >
57
- {#if canSkip}
58
- {#if children}
59
- {@render children()}
60
- {:else}
61
- Skip Ad
62
- {/if}
58
+ {#if children}
59
+ {@render children()}
63
60
  {:else}
64
- Skip in {countdown}s
61
+ <span class="vide-skip__label">
62
+ {canSkip ? "Skip Ad" : `Skip in ${countdown}s`}
63
+ </span>
64
+ <IconSkipForward />
65
65
  {/if}
66
66
  </button>
67
67
  {/if}
@@ -22,6 +22,6 @@ $effect(() => {
22
22
  });
23
23
  </script>
24
24
 
25
- <div class={["vide-error", className].filter(Boolean).join(" ")}>
25
+ <div role="alert" class={["vide-error", className].filter(Boolean).join(" ")}>
26
26
  <span class="vide-error__message">{message}</span>
27
27
  </div>
@@ -6,6 +6,6 @@ interface Props {
6
6
  const { class: className }: Props = $props();
7
7
  </script>
8
8
 
9
- <div class={["vide-loader", className].filter(Boolean).join(" ")}>
9
+ <div role="status" aria-label="Loading" class={["vide-loader", className].filter(Boolean).join(" ")}>
10
10
  <div class="vide-loader__spinner"></div>
11
11
  </div>
@@ -0,0 +1,4 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" aria-hidden="true">
2
+ <path d="M14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z" />
3
+ <path d="M19 19H5V5h7V3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7h-2v7z" />
4
+ </svg>
@@ -0,0 +1,26 @@
1
+ export default IconExternalLink;
2
+ type IconExternalLink = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string;
8
+ };
9
+ declare const IconExternalLink: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
15
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
16
+ $$bindings?: Bindings;
17
+ } & Exports;
18
+ (internal: unknown, props: {
19
+ $$events?: Events;
20
+ $$slots?: Slots;
21
+ }): Exports & {
22
+ $set?: any;
23
+ $on?: any;
24
+ };
25
+ z_$$bindings?: Bindings;
26
+ }
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" aria-hidden="true">
2
+ <path d="M5 18l10-6L5 6v12zm12-12v12h2V6h-2z" />
3
+ </svg>
@@ -0,0 +1,26 @@
1
+ export default IconSkipForward;
2
+ type IconSkipForward = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string;
8
+ };
9
+ declare const IconSkipForward: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
15
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
16
+ $$bindings?: Bindings;
17
+ } & Exports;
18
+ (internal: unknown, props: {
19
+ $$events?: Events;
20
+ $$slots?: Slots;
21
+ }): Exports & {
22
+ $set?: any;
23
+ $on?: any;
24
+ };
25
+ z_$$bindings?: Bindings;
26
+ }
@@ -30,6 +30,8 @@ export { default as IconVolumeLow } from "./icons/IconVolumeLow.svelte";
30
30
  export { default as IconVolumeMute } from "./icons/IconVolumeMute.svelte";
31
31
  export { default as IconFullscreenEnter } from "./icons/IconFullscreenEnter.svelte";
32
32
  export { default as IconFullscreenExit } from "./icons/IconFullscreenExit.svelte";
33
+ export { default as IconExternalLink } from "./icons/IconExternalLink.svelte";
34
+ export { default as IconSkipForward } from "./icons/IconSkipForward.svelte";
33
35
  export { useAdState } from "./use-ad-state.svelte.js";
34
36
  export type { AdState } from "./use-ad-state.svelte.js";
35
37
  export { default as AdOverlay } from "./components/AdOverlay.svelte";
@@ -29,6 +29,8 @@ export { default as IconVolumeLow } from "./icons/IconVolumeLow.svelte";
29
29
  export { default as IconVolumeMute } from "./icons/IconVolumeMute.svelte";
30
30
  export { default as IconFullscreenEnter } from "./icons/IconFullscreenEnter.svelte";
31
31
  export { default as IconFullscreenExit } from "./icons/IconFullscreenExit.svelte";
32
+ export { default as IconExternalLink } from "./icons/IconExternalLink.svelte";
33
+ export { default as IconSkipForward } from "./icons/IconSkipForward.svelte";
32
34
  export { useAdState } from "./use-ad-state.svelte.js";
33
35
  export { default as AdOverlay } from "./components/AdOverlay.svelte";
34
36
  export { default as AdSkip } from "./components/AdSkip.svelte";
@@ -245,9 +245,13 @@ interface SourceHandler {
245
245
  /** Unload the source and clean up. */
246
246
  unload(mediaElement: MediaElement): void;
247
247
  }
248
+ /** Extended player interface exposed to plugins, includes state control. */
249
+ interface PluginPlayer extends Player {
250
+ setState(state: PlayerState): void;
251
+ }
248
252
  interface Plugin {
249
253
  name: string;
250
- setup(player: Player): (() => void) | undefined;
254
+ setup(player: PluginPlayer): (() => void) | undefined;
251
255
  }
252
256
  interface Player extends EventBus {
253
257
  readonly el: MediaElement;
@@ -313,4 +317,4 @@ interface Player extends EventBus {
313
317
  getPluginData(key: string): unknown;
314
318
  }
315
319
 
316
- export type { AdMeta as A, EventBus as E, MediaElement as M, Player as P, QualityLevel as Q, RecoveryConfig as R, SeekableRange as S, VideCue as V, AdQuartile as a, EventHandler as b, PlayerEvent as c, PlayerEventMap as d, PlayerState as e, Plugin as f, SourceHandler as g, VideTextTrack as h };
320
+ export type { AdMeta as A, EventBus as E, MediaElement as M, Player as P, QualityLevel as Q, RecoveryConfig as R, SeekableRange as S, VideCue as V, AdQuartile as a, EventHandler as b, PlayerEvent as c, PlayerEventMap as d, PlayerState as e, Plugin as f, PluginPlayer as g, SourceHandler as h, VideTextTrack as i };
@@ -1,4 +1,4 @@
1
- import { R as RecoveryConfig } from './types-BsEF8iWC.js';
1
+ import { R as RecoveryConfig } from './types-BD5ZFUAt.js';
2
2
 
3
3
  interface HlsPluginOptions {
4
4
  /** Configuration passed directly to the hls.js constructor. */
@@ -1,4 +1,4 @@
1
- import { P as Player } from './types-BsEF8iWC.js';
1
+ import { P as Player } from './types-BD5ZFUAt.js';
2
2
 
3
3
  /** A single UI component that can be independently mounted and connected. */
4
4
  interface UIComponent {
@@ -1,4 +1,4 @@
1
- import { R as RecoveryConfig } from './types-BsEF8iWC.js';
1
+ import { R as RecoveryConfig } from './types-BD5ZFUAt.js';
2
2
 
3
3
  interface DashPluginOptions {
4
4
  /** dash.js MediaPlayerSettingClass — passed to updateSettings(). */
@@ -1,4 +1,4 @@
1
- import { c as VastAd, A as AdPlugin } from './types-COeag8fU.js';
1
+ import { c as VastAd, A as AdPlugin } from './types-JlkZYMyA.js';
2
2
 
3
3
  interface VmapResponse {
4
4
  version: string;
@@ -1,4 +1,4 @@
1
- import { P as Player } from './types-BsEF8iWC.js';
1
+ import { P as Player } from './types-BD5ZFUAt.js';
2
2
 
3
3
  interface VastResponse {
4
4
  version: string;
@@ -1,7 +1,7 @@
1
- import { P as Player, e as PlayerState, f as Plugin } from '../types-BsEF8iWC.js';
2
- import { A as AdPlugin, c as VastAd } from '../types-COeag8fU.js';
3
- import { A as AdUIStateRef, U as UIComponent, a as UIComponentName, b as UiPluginOptions } from '../types-SuT99_Z3.js';
4
- export { c as AdUIState } from '../types-SuT99_Z3.js';
1
+ import { P as Player, e as PlayerState, f as Plugin } from '../types-BD5ZFUAt.js';
2
+ import { A as AdPlugin, c as VastAd } from '../types-JlkZYMyA.js';
3
+ import { A as AdUIStateRef, U as UIComponent, a as UIComponentName, b as UiPluginOptions } from '../types-CXi-EgbJ.js';
4
+ export { c as AdUIState } from '../types-CXi-EgbJ.js';
5
5
 
6
6
  declare function createAdCountdown(adState: AdUIStateRef): UIComponent;
7
7
 
package/dist/ui/index.js CHANGED
@@ -1 +1 @@
1
- export{d as connectStateClasses,g as createAdCountdown,h as createAdLabel,i as createAdLearnMore,j as createAdOverlay,k as createAdSkip,f as createAdUIState,l as createAutohide,m as createBigPlay,n as createClickPlay,o as createErrorDisplay,p as createFullscreen,q as createKeyboard,r as createLoader,s as createPlayButton,t as createPoster,u as createProgress,v as createTimeDisplay,w as createVolume,e as formatTime,c as isAdState,b as stateToClass,x as ui,a as uiAdPlugin}from'../chunk-LPSJOF2I.mjs';
1
+ export{d as connectStateClasses,g as createAdCountdown,h as createAdLabel,i as createAdLearnMore,j as createAdOverlay,k as createAdSkip,f as createAdUIState,l as createAutohide,m as createBigPlay,n as createClickPlay,o as createErrorDisplay,p as createFullscreen,q as createKeyboard,r as createLoader,s as createPlayButton,t as createPoster,u as createProgress,v as createTimeDisplay,w as createVolume,e as formatTime,c as isAdState,b as stateToClass,x as ui,a as uiAdPlugin}from'../chunk-YBNODS5R.mjs';
package/dist/ui/index.mjs CHANGED
@@ -1 +1 @@
1
- export{d as connectStateClasses,g as createAdCountdown,h as createAdLabel,i as createAdLearnMore,j as createAdOverlay,k as createAdSkip,f as createAdUIState,l as createAutohide,m as createBigPlay,n as createClickPlay,o as createErrorDisplay,p as createFullscreen,q as createKeyboard,r as createLoader,s as createPlayButton,t as createPoster,u as createProgress,v as createTimeDisplay,w as createVolume,e as formatTime,c as isAdState,b as stateToClass,x as ui,a as uiAdPlugin}from'../chunk-LPSJOF2I.mjs';
1
+ export{d as connectStateClasses,g as createAdCountdown,h as createAdLabel,i as createAdLearnMore,j as createAdOverlay,k as createAdSkip,f as createAdUIState,l as createAutohide,m as createBigPlay,n as createClickPlay,o as createErrorDisplay,p as createFullscreen,q as createKeyboard,r as createLoader,s as createPlayButton,t as createPoster,u as createProgress,v as createTimeDisplay,w as createVolume,e as formatTime,c as isAdState,b as stateToClass,x as ui,a as uiAdPlugin}from'../chunk-YBNODS5R.mjs';
package/dist/ui/theme.css CHANGED
@@ -137,6 +137,23 @@
137
137
  background: var(--vide-accent-ad);
138
138
  }
139
139
 
140
+ /* ═══════════════════════════════════════════
141
+ FOCUS
142
+ ═══════════════════════════════════════════ */
143
+
144
+ .vide-ui :focus-visible {
145
+ outline: 2px solid var(--vide-accent);
146
+ outline-offset: 2px;
147
+ }
148
+
149
+ .vide-bigplay:focus-visible {
150
+ outline-offset: 4px;
151
+ }
152
+
153
+ .vide-ui :focus:not(:focus-visible) {
154
+ outline: none;
155
+ }
156
+
140
157
  /* ═══════════════════════════════════════════
141
158
  AUTOHIDE (mouse-idle during playback)
142
159
  ═══════════════════════════════════════════ */
@@ -663,7 +680,7 @@
663
680
 
664
681
  .vide-ad-label {
665
682
  position: absolute;
666
- bottom: calc(var(--vide-controls-height) + var(--vide-ad-overlay-gap) + 52px);
683
+ bottom: calc(var(--vide-controls-height) + var(--vide-ad-overlay-gap));
667
684
  left: var(--vide-ad-overlay-gap);
668
685
  z-index: 4;
669
686
 
@@ -677,8 +694,13 @@
677
694
  letter-spacing: 0.03em;
678
695
  line-height: var(--vide-line-height);
679
696
  color: var(--vide-text-dim);
680
- text-shadow: 0 0 3px rgba(0, 0, 0, 0.6);
681
- transition: transform 0.25s var(--vide-ease);
697
+ text-shadow: 0 0 1px rgba(0, 0, 0, 0.6);
698
+ transition: transform 0.25s var(--vide-ease), bottom 0.25s var(--vide-ease);
699
+ }
700
+
701
+ /* Push label/countdown above CTA when it's visible */
702
+ .vide-ui:has(.vide-ad-cta:not([hidden])) .vide-ad-label {
703
+ bottom: calc(var(--vide-controls-height) + var(--vide-ad-overlay-gap) + 52px);
682
704
  }
683
705
 
684
706
  /* ─────────────────────────────────────────
@@ -688,7 +710,7 @@
688
710
 
689
711
  .vide-ad-countdown {
690
712
  position: absolute;
691
- bottom: calc(var(--vide-controls-height) + var(--vide-ad-overlay-gap) + 52px);
713
+ bottom: calc(var(--vide-controls-height) + var(--vide-ad-overlay-gap));
692
714
  left: calc(var(--vide-ad-overlay-gap) + 28px);
693
715
  z-index: 4;
694
716
 
@@ -701,10 +723,14 @@
701
723
  font-weight: 400;
702
724
  line-height: var(--vide-line-height);
703
725
  color: var(--vide-text-dim);
704
- text-shadow: 0 0 3px rgba(0, 0, 0, 0.6);
726
+ text-shadow: 0 0 1px rgba(0, 0, 0, 0.6);
705
727
  font-variant-numeric: tabular-nums;
706
728
  white-space: nowrap;
707
- transition: transform 0.25s var(--vide-ease);
729
+ transition: transform 0.25s var(--vide-ease), bottom 0.25s var(--vide-ease);
730
+ }
731
+
732
+ .vide-ui:has(.vide-ad-cta:not([hidden])) .vide-ad-countdown {
733
+ bottom: calc(var(--vide-controls-height) + var(--vide-ad-overlay-gap) + 52px);
708
734
  }
709
735
 
710
736
  .vide-ad-countdown::before {
@@ -918,12 +944,14 @@
918
944
  max-width: 60%;
919
945
  }
920
946
 
921
- /* Label/countdown → bottom-left (above controls) */
922
- .vide-ad-label {
947
+ /* Label/countdown → bottom-left (above controls, CTA moves to top) */
948
+ .vide-ad-label,
949
+ .vide-ui:has(.vide-ad-cta:not([hidden])) .vide-ad-label {
923
950
  bottom: calc(var(--vide-controls-height) + var(--vide-ad-overlay-gap));
924
951
  }
925
952
 
926
- .vide-ad-countdown {
953
+ .vide-ad-countdown,
954
+ .vide-ui:has(.vide-ad-cta:not([hidden])) .vide-ad-countdown {
927
955
  bottom: calc(var(--vide-controls-height) + var(--vide-ad-overlay-gap));
928
956
  }
929
957
 
@@ -954,3 +982,58 @@
954
982
  font-size: 13px;
955
983
  }
956
984
  }
985
+
986
+ /* ═══════════════════════════════════════════
987
+ SCREEN READER ONLY
988
+ ═══════════════════════════════════════════ */
989
+
990
+ .vide-sr-only {
991
+ position: absolute;
992
+ width: 1px;
993
+ height: 1px;
994
+ padding: 0;
995
+ margin: -1px;
996
+ overflow: hidden;
997
+ clip: rect(0, 0, 0, 0);
998
+ white-space: nowrap;
999
+ border: 0;
1000
+ }
1001
+
1002
+ /* ═══════════════════════════════════════════
1003
+ REDUCED MOTION
1004
+ ═══════════════════════════════════════════ */
1005
+
1006
+ @media (prefers-reduced-motion: reduce) {
1007
+ .vide-loader__spinner {
1008
+ animation-duration: 4s;
1009
+ }
1010
+
1011
+ .vide-controls,
1012
+ .vide-bigplay,
1013
+ .vide-progress__bar,
1014
+ .vide-progress__handle,
1015
+ .vide-progress__buffered,
1016
+ .vide-volume__slider,
1017
+ .vide-skip,
1018
+ .vide-ad-label,
1019
+ .vide-ad-countdown,
1020
+ .vide-ad-cta {
1021
+ transition-duration: 0.01ms !important;
1022
+ }
1023
+ }
1024
+
1025
+ /* ═══════════════════════════════════════════
1026
+ HIGH CONTRAST
1027
+ ═══════════════════════════════════════════ */
1028
+
1029
+ @media (prefers-contrast: more) {
1030
+ :root {
1031
+ --vide-text-mid: rgba(255, 255, 255, 0.9);
1032
+ --vide-text-dim: rgba(255, 255, 255, 0.7);
1033
+ --vide-skip-border: rgba(255, 255, 255, 0.5);
1034
+ }
1035
+
1036
+ .vide-ui :focus-visible {
1037
+ outline-width: 3px;
1038
+ }
1039
+ }