cloudinary-video-player 3.1.2-edge.1 → 3.1.2-edge.3

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 (43) hide show
  1. package/dist/adaptive-streaming.js +2 -2
  2. package/dist/adaptive-streaming.min.js +2 -2
  3. package/dist/chapters.js +2 -2
  4. package/dist/chapters.min.js +2 -2
  5. package/dist/cld-video-player.css +24 -2
  6. package/dist/cld-video-player.js +73 -13
  7. package/dist/cld-video-player.light.js +73 -13
  8. package/dist/cld-video-player.light.min.js +4 -4
  9. package/dist/cld-video-player.min.css +3 -3
  10. package/dist/cld-video-player.min.js +4 -4
  11. package/dist/colors.js +2 -2
  12. package/dist/colors.min.js +2 -2
  13. package/dist/dash.js +2 -2
  14. package/dist/dash.min.js +2 -2
  15. package/dist/debug.js +3 -2
  16. package/dist/debug.min.js +3 -3
  17. package/dist/ima.js +2 -2
  18. package/dist/ima.min.js +2 -2
  19. package/dist/interaction-areas.js +2 -2
  20. package/dist/interaction-areas.min.js +2 -2
  21. package/dist/node_modules_lodash_throttle_js.js +2 -2
  22. package/dist/playlist.js +2 -2
  23. package/dist/playlist.min.js +2 -2
  24. package/dist/recommendations-overlay.js +2 -2
  25. package/dist/recommendations-overlay.min.js +2 -2
  26. package/dist/schema.json +523 -0
  27. package/dist/share.js +228 -0
  28. package/dist/share.min.js +7 -0
  29. package/dist/shoppable.js +2 -2
  30. package/dist/shoppable.min.js +2 -2
  31. package/dist/srt-text-tracks.js +2 -2
  32. package/dist/srt-text-tracks.min.js +2 -2
  33. package/dist/visual-search.js +2 -2
  34. package/dist/visual-search.min.js +2 -2
  35. package/lib/all.js +1 -1
  36. package/lib/cld-video-player.js +1 -1
  37. package/lib/cld-video-player.min.css +1 -0
  38. package/lib/debug.js +1 -1
  39. package/lib/player.js +1 -1
  40. package/lib/schema.json +523 -0
  41. package/lib/share.js +2 -0
  42. package/lib/videoPlayer.js +1 -1
  43. package/package.json +1 -1
package/dist/share.js ADDED
@@ -0,0 +1,228 @@
1
+ /*!
2
+ * Cloudinary Video Player v3.1.2-edge.3
3
+ * Built on 2025-08-06T14:15:40.534Z
4
+ * https://github.com/cloudinary/cloudinary-video-player
5
+ */
6
+ "use strict";
7
+ (self["cloudinaryVideoPlayerChunkLoading"] = self["cloudinaryVideoPlayerChunkLoading"] || []).push([["share"],{
8
+
9
+ /***/ "./plugins/share/components/download-button.js":
10
+ /*!*****************************************************!*\
11
+ !*** ./plugins/share/components/download-button.js ***!
12
+ \*****************************************************/
13
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
14
+
15
+ __webpack_require__.r(__webpack_exports__);
16
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
17
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
18
+ /* harmony export */ });
19
+ /* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! video.js */ "../node_modules/video.js/dist/alt/video.core-exposed.js");
20
+ /* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(video_js__WEBPACK_IMPORTED_MODULE_0__);
21
+
22
+ const ClickableComponent = video_js__WEBPACK_IMPORTED_MODULE_0___default().getComponent('ClickableComponent');
23
+ class ShareDownloadButton extends ClickableComponent {
24
+ constructor(player) {
25
+ let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
26
+ super(player, options);
27
+ }
28
+ handleClick(event) {
29
+ super.handleClick(event);
30
+ // Delegate the actual download to the plugin API if present
31
+ if (this.player().share && typeof this.player().share.download === 'function') {
32
+ this.player().share.download();
33
+ }
34
+ }
35
+ createEl() {
36
+ const button = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('button', {
37
+ className: 'vjs-control vjs-share-download-button vjs-button',
38
+ ariaLabel: 'Download video',
39
+ title: 'Download video'
40
+ });
41
+ const iconSpan = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('span', {
42
+ className: 'vjs-icon-file-download vjs-icon-placeholder'
43
+ });
44
+ button.appendChild(iconSpan);
45
+ const spinnerSpan = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('span', {
46
+ className: 'vjs-loading-spinner'
47
+ });
48
+ button.appendChild(spinnerSpan);
49
+ return button;
50
+ }
51
+
52
+ /**
53
+ * Toggles the "preparing download" visual state (spinner + title).
54
+ * @param {boolean} isPreparing
55
+ */
56
+ setPreparing(isPreparing) {
57
+ const el = this.el();
58
+ if (isPreparing) {
59
+ el.classList.add('vjs-waiting');
60
+ el.setAttribute('title', 'Download is being prepared');
61
+ } else {
62
+ el.classList.remove('vjs-waiting');
63
+ el.setAttribute('title', 'Download video');
64
+ }
65
+ }
66
+ }
67
+ video_js__WEBPACK_IMPORTED_MODULE_0___default().registerComponent('ShareDownloadButton', ShareDownloadButton);
68
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ShareDownloadButton);
69
+
70
+ /***/ }),
71
+
72
+ /***/ "./plugins/share/share.js":
73
+ /*!********************************!*\
74
+ !*** ./plugins/share/share.js ***!
75
+ \********************************/
76
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
77
+
78
+ __webpack_require__.r(__webpack_exports__);
79
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
80
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
81
+ /* harmony export */ });
82
+ /* harmony import */ var _components_download_button__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./components/download-button */ "./plugins/share/components/download-button.js");
83
+ /* harmony import */ var _share_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./share.scss */ "./plugins/share/share.scss");
84
+ /* harmony import */ var plugins_cloudinary_common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! plugins/cloudinary/common */ "./plugins/cloudinary/common.js");
85
+ /* harmony import */ var lodash_omit__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash/omit */ "../node_modules/lodash/omit.js");
86
+ /* harmony import */ var lodash_omit__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_omit__WEBPACK_IMPORTED_MODULE_3__);
87
+
88
+
89
+
90
+
91
+ const SharePlugin = function () {
92
+ let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
93
+ let playerInstance = arguments.length > 1 ? arguments[1] : undefined;
94
+ const player = playerInstance || this;
95
+ player.addClass('vjs-share');
96
+ const addDownloadButton = () => {
97
+ const controlBar = player.getChild('ControlBar');
98
+ if (!controlBar || controlBar.getChild('ShareDownloadButton')) {
99
+ return;
100
+ }
101
+ const children = controlBar.children();
102
+ const insertBeforeIndex = children.findIndex(c => c.name_ === 'FullscreenToggle');
103
+ controlBar.addChild('ShareDownloadButton', {}, insertBeforeIndex !== -1 ? insertBeforeIndex : undefined);
104
+ };
105
+ const removeDownloadButton = () => {
106
+ if (!player.controlBar) {
107
+ return;
108
+ }
109
+ const btn = player.controlBar.getChild('ShareDownloadButton');
110
+ if (btn) {
111
+ player.controlBar.removeChild(btn);
112
+ }
113
+ };
114
+ const getDownloadUrl = () => {
115
+ const source = player.currentSource?.();
116
+ if (!source) {
117
+ return null;
118
+ }
119
+
120
+ // Strip format / codec related transformation arrays
121
+ const STRIP_KEYS = ['format', 'video_codec', 'streaming_profile'];
122
+ const stripKeysDeep = value => {
123
+ if (Array.isArray(value)) {
124
+ return value.map(stripKeysDeep);
125
+ }
126
+ if (value && typeof value === 'object') {
127
+ const cleaned = lodash_omit__WEBPACK_IMPORTED_MODULE_3___default()(value, STRIP_KEYS);
128
+ Object.keys(cleaned).forEach(k => {
129
+ cleaned[k] = stripKeysDeep(cleaned[k]);
130
+ });
131
+ return cleaned;
132
+ }
133
+ return value;
134
+ };
135
+ const transformations = stripKeysDeep(player.cloudinary.transformation() || {});
136
+ const baseOptions = {
137
+ ...player.cloudinary.cloudinaryConfig(),
138
+ ...transformations,
139
+ resource_type: 'video',
140
+ format: 'mp4',
141
+ video_codec: 'h264',
142
+ flags: `streaming_attachment:${player.cloudinary.currentPublicId()}`
143
+ };
144
+
145
+ // For ABR - download a limited-size video
146
+ if (source.isAdaptive) {
147
+ Object.assign(baseOptions, {
148
+ crop: 'limit',
149
+ width: 1920,
150
+ height: 1920
151
+ });
152
+ }
153
+
154
+ // For audio sources, set the format to mp3
155
+ if (player.cloudinary.source()?.getType() === 'AudioSource') {
156
+ Object.assign(baseOptions, {
157
+ format: 'mp3',
158
+ video_codec: undefined
159
+ });
160
+ }
161
+ return (0,plugins_cloudinary_common__WEBPACK_IMPORTED_MODULE_2__.getCloudinaryUrl)(player.cloudinary.currentPublicId(), baseOptions);
162
+ };
163
+ const download = () => {
164
+ const url = getDownloadUrl();
165
+ if (!url) {
166
+ console.warn('Share plugin: Unable to resolve download URL.');
167
+ return;
168
+ }
169
+ const MAX_ATTEMPTS = 60; // 60 tries / 10s interval
170
+ const INTERVAL_MS = 10000;
171
+ const RETRY_STATUS_CODES = [423];
172
+ const triggerDownload = () => {
173
+ const a = document.createElement('a');
174
+ a.href = url;
175
+ a.download = '';
176
+ document.body.appendChild(a);
177
+ a.click();
178
+ document.body.removeChild(a);
179
+ };
180
+ const btn = player.controlBar?.getChild('ShareDownloadButton');
181
+ const setPreparingState = isPreparing => {
182
+ btn?.setPreparing?.(isPreparing);
183
+ };
184
+ const wait = ms => new Promise(resolve => setTimeout(resolve, ms));
185
+ const fetchDownload = async function () {
186
+ let attempt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
187
+ const response = await fetch(url, {
188
+ method: 'HEAD'
189
+ });
190
+ if (RETRY_STATUS_CODES.includes(response.status) && attempt < MAX_ATTEMPTS) {
191
+ if (attempt === 0) {
192
+ setPreparingState(true);
193
+ }
194
+ await wait(INTERVAL_MS);
195
+ return fetchDownload(attempt + 1);
196
+ }
197
+ setPreparingState(false);
198
+ triggerDownload();
199
+ };
200
+ fetchDownload();
201
+ };
202
+ if (options.download) {
203
+ addDownloadButton();
204
+ }
205
+ player.share = {
206
+ download,
207
+ addDownloadButton,
208
+ removeDownloadButton
209
+ };
210
+ };
211
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SharePlugin);
212
+
213
+ /***/ }),
214
+
215
+ /***/ "./plugins/share/share.scss":
216
+ /*!**********************************!*\
217
+ !*** ./plugins/share/share.scss ***!
218
+ \**********************************/
219
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
220
+
221
+ __webpack_require__.r(__webpack_exports__);
222
+ // extracted by mini-css-extract-plugin
223
+
224
+
225
+ /***/ })
226
+
227
+ }]);
228
+ //# sourceMappingURL=share.js.map
@@ -0,0 +1,7 @@
1
+ /*!
2
+ * Cloudinary Video Player v3.1.2-edge.3
3
+ * Built on 2025-08-06T14:15:21.113Z
4
+ * https://github.com/cloudinary/cloudinary-video-player
5
+ */
6
+ "use strict";(self.cloudinaryVideoPlayerChunkLoading=self.cloudinaryVideoPlayerChunkLoading||[]).push([[976],{2130:(e,o,t)=>{t.d(o,{default:()=>c});var n=t(6673),a=t.n(n);const r=a().getComponent("ClickableComponent");class d extends r{constructor(e){super(e,arguments.length>1&&void 0!==arguments[1]?arguments[1]:{})}handleClick(e){super.handleClick(e),this.player().share&&"function"==typeof this.player().share.download&&this.player().share.download()}createEl(){const e=a().dom.createEl("button",{className:"vjs-control vjs-share-download-button vjs-button",ariaLabel:"Download video",title:"Download video"}),o=a().dom.createEl("span",{className:"vjs-icon-file-download vjs-icon-placeholder"});e.appendChild(o);const t=a().dom.createEl("span",{className:"vjs-loading-spinner"});return e.appendChild(t),e}setPreparing(e){const o=this.el();e?(o.classList.add("vjs-waiting"),o.setAttribute("title","Download is being prepared")):(o.classList.remove("vjs-waiting"),o.setAttribute("title","Download video"))}}a().registerComponent("ShareDownloadButton",d);var i=t(8033),l=t(4319),s=t.n(l);const c=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const o=(arguments.length>1?arguments[1]:void 0)||this;o.addClass("vjs-share");const t=()=>{const e=o.getChild("ControlBar");if(!e||e.getChild("ShareDownloadButton"))return;const t=e.children().findIndex((e=>"FullscreenToggle"===e.name_));e.addChild("ShareDownloadButton",{},-1!==t?t:void 0)};e.download&&t(),o.share={download:()=>{const e=(()=>{const e=o.currentSource?.();if(!e)return null;const t=["format","video_codec","streaming_profile"],n=e=>{if(Array.isArray(e))return e.map(n);if(e&&"object"==typeof e){const o=s()(e,t);return Object.keys(o).forEach((e=>{o[e]=n(o[e])})),o}return e},a=n(o.cloudinary.transformation()||{}),r={...o.cloudinary.cloudinaryConfig(),...a,resource_type:"video",format:"mp4",video_codec:"h264",flags:`streaming_attachment:${o.cloudinary.currentPublicId()}`};return e.isAdaptive&&Object.assign(r,{crop:"limit",width:1920,height:1920}),"AudioSource"===o.cloudinary.source()?.getType()&&Object.assign(r,{format:"mp3",video_codec:void 0}),(0,i.KA)(o.cloudinary.currentPublicId(),r)})();if(!e)return void console.warn("Share plugin: Unable to resolve download URL.");const t=[423],n=o.controlBar?.getChild("ShareDownloadButton"),a=e=>{n?.setPreparing?.(e)},r=async function(){let o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;const n=await fetch(e,{method:"HEAD"});if(t.includes(n.status)&&o<60)return 0===o&&a(!0),await(d=1e4,new Promise((e=>setTimeout(e,d)))),r(o+1);var d;a(!1),(()=>{const o=document.createElement("a");o.href=e,o.download="",document.body.appendChild(o),o.click(),document.body.removeChild(o)})()};r()},addDownloadButton:t,removeDownloadButton:()=>{if(!o.controlBar)return;const e=o.controlBar.getChild("ShareDownloadButton");e&&o.controlBar.removeChild(e)}}}}}]);
7
+ //# sourceMappingURL=share.min.js.map
package/dist/shoppable.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * Cloudinary Video Player v3.1.2-edge.1
3
- * Built on 2025-07-22T11:12:21.313Z
2
+ * Cloudinary Video Player v3.1.2-edge.3
3
+ * Built on 2025-08-06T14:15:40.534Z
4
4
  * https://github.com/cloudinary/cloudinary-video-player
5
5
  */
6
6
  "use strict";
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * Cloudinary Video Player v3.1.2-edge.1
3
- * Built on 2025-07-22T11:12:02.081Z
2
+ * Cloudinary Video Player v3.1.2-edge.3
3
+ * Built on 2025-08-06T14:15:21.113Z
4
4
  * https://github.com/cloudinary/cloudinary-video-player
5
5
  */
6
6
  (self.cloudinaryVideoPlayerChunkLoading=self.cloudinaryVideoPlayerChunkLoading||[]).push([[525],{9987:(t,e,s)=>{"use strict";s.d(e,{default:()=>Z});var o=s(6673),a=s.n(o);const i=function(t){const[e,s,o]=t.split(":").reverse();let a=null;return isNaN(e)||(a=60*(+o||0)*60+60*(+s||0)+ +e),a};var r=s(9339);const n={location:"right",toggleIcon:"",width:"20%",startState:"openOnPlay",autoClose:2,transformation:{quality:"auto",width:"auto",fetch_format:"auto",crop:"scale"},products:[],showPostPlayOverlay:!1},l="goto",c="seek",p="overlay",d="shoppable-panel-visible",h="shoppable-panel-hidden",u="shoppable-products-overlay",m="cld-spbl-panel",g="cld-spbl-toggle",_="cld-spbl-toggle-icon",y="cld-spbl-bar-inner",f="animate",v="cld-spbl-item",b="cld-spbl-img";var C=s(1104);const E=a().dom||a(),T=a().getComponent("Component");class N extends T{constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(t,e),this.options_=e,this.player_=t,this.player_.on(C.f.SHOW_PRODUCTS_OVERLAY,this.renderProducts),this.dispose=()=>{this.layout_.dispose()}}renderProducts=()=>{this.player_.removeClass(d),this.player_.addClass(h),this.player_.addClass(u),this.layout_.innerHTML="";const t=this.player_.currentTime();this.options_.products.filter((e=>e.hotspots&&e.hotspots.some((e=>i(e.time)===t)))).forEach((e=>{const s=(0,r.I)(e.hotspots,(e=>i(e.time)===t)),o=E.createEl("div",{className:"cld-spbl-product-hotspot-name"},{},e.productName),a=E.createEl("div",{className:"cld-spbl-product-tooltip cld-spbl-product-tooltip-"+s.tooltipPosition},{},o),n=E.createEl("a",{className:"cld-spbl-product-hotspot accent-color-text",href:s.clickUrl,target:"_blank"},{style:"left:"+s.x+"; top:"+s.y+";"},a);this.layout_.appendChild(n)})),this.player_.one(C.f.SEEKING,this.clearLayout),this.player_.one(C.f.PLAY,this.clearLayout)};clearLayout=()=>{this.layout_.innerHTML="",this.player_.removeClass(u)};createEl(){const t=this.player_.currentDimensions();return this.layout_=E.createEl("div",{className:"cld-spbl-products-overlay",style:`padding-top: ${t.height/t.width*100}%;`}),this.layout_}}a().registerComponent("ShoppableProductsOverlay",N);const P=N,L=a().dom||a(),x=a().getComponent("ClickableComponent");class w extends x{constructor(t,e){super(t,e),this.options_=e}handleClick(t){t.preventDefault(),t.stopPropagation(),this.options_.clickHandler()}createEl(){let t={},e={};this.options_.toggleIcon?(t={className:`${_} cld-spbl-toggle-custom-icon vjs-icon-close`},e={style:`background-image: url(${this.options_.toggleIcon})`}):t={className:`${_} vjs-icon-cart`};const s=L.createEl("span",t,e),o=super.createEl("a",{className:`${g} base-color-bg`});return o.appendChild(s),this.player_.on(C.f.PRODUCT_BAR_MIN,(()=>{setTimeout((()=>{s.classList.add(f),setTimeout((()=>{s.classList.remove(f)}),1e3)}),500)})),o}}a().registerComponent("shoppablePanelToggle",w);const k=w,I=a().dom||a(),A=a().getComponent("Component");class H extends A{constructor(t,e){super(t,e),this.player_=t,this.player().addClass("cld-shoppable-panel"),this.player().addClass(h),this.contentWrpEl_=I.createEl("div",{className:"cld-spbl-bar"}),this.contentBannerEl_=I.createEl("div",{className:"cld-spbl-banner-msg base-color-text"},{},this.options_.bannerMsg||"Shop the Video"),this.contentWrpEl_.appendChild(this.contentBannerEl_);const s=new P(this.player_,this.options_);this.contentWrpEl_.appendChild(s.el_),this.contentEl_=I.createEl("div",{className:y}),this.contentWrpEl_.appendChild(this.contentEl_),this.player().el().appendChild(this.contentWrpEl_),this.addChild(new k(this.player_,{toggleIcon:this.options_.toggleIcon,clickHandler:()=>{this.togglePanel()}})),this.addChild("ShoppablePanel",this.options_),this.dispose=()=>{this.removeLayout(),super.dispose()},this.togglePanel=t=>{!0===t?(this.player().removeClass(h),this.player().addClass(d)):!1===t?(this.player().removeClass(d),this.player().addClass(h)):(this.player().toggleClass(h),this.player().toggleClass(d));let e=this.player().hasClass(d)?"productBarMax":"productBarMin";this.player().trigger(e)},"open"===this.options_.startState&&this.togglePanel(!0),this.player_.on(C.f.PLAY,(()=>{this.player_.currentTime()<.01&&("openOnPlay"===this.options_.startState&&this.togglePanel(!0,this.options_.autoClose),this.options_.autoClose&&-1!==this.options_.startState.indexOf("open")&&setTimeout((()=>{this.contentEl_.matches(":hover")?this.contentEl_.addEventListener("mouseleave",(()=>{this.togglePanel(!1)}),{once:!0}):this.togglePanel(!1)}),1e3*this.options_.autoClose))}))}createEl(){return super.createEl("div")}}a().registerComponent("shoppableBarLayout",H);const M=H;var S=s(2858),$=s.n(S),O=s(4650);const D=a().getComponent("ClickableComponent"),W=a().dom||a(),j={width:132};class B extends D{constructor(t,e){super(t,e),this.options_=e,this.isDragged=!1}handleClick(t){t.preventDefault(),t.stopPropagation(),this.el_.matches(`.dragged .${v}`)||this.options_.clickHandler(t),this.isDragged=!1}getTitle(){return this.options_.conf.title}createEl(){const t=super.createEl("a",{className:`${v} base-color-bg accent-color-text`,href:"#"});t.setAttribute("data-product-id",this.options_.conf.productId||""),t.setAttribute("data-product-name",this.options_.conf.productName||""),this.options_.conf.onHover&&R(t,this.options_.conf.onHover,this.options_.item.cloudinaryConfig()),this.options_.conf.onClick&&z(t,this.options_.conf.onClick);const e=super.createEl("img",{className:b},{src:this.options_.item.url(j)});if(t.appendChild(e),this.getTitle()){const e=W.createEl("div",{className:"cld-spbl-item-info base-color-semi-bg text-color-text"}),s=W.createEl("span",{className:"cld-spbl-item-title"},{},this.getTitle());e.appendChild(s),t.appendChild(e)}return t}}const R=(t,e,s)=>{if(t.setAttribute("data-hover-action",e.action),e.action===p){const s=W.createEl("span",{className:"cld-spbl-overlay-text base-color-text"},{},e.args),o=W.createEl("span",{className:"cld-spbl-overlay text-color-semi-bg base-color-text"},{title:e.args},s);t.appendChild(o)}else{const o=new O.A(e.args.publicId,{cloudinaryConfig:s,transformation:e.args.transformation}),a=W.createEl("img",{className:`${b} cld-spbl-hover-img`},{src:o.url(j)});t.appendChild(a)}},z=(t,e)=>{t.setAttribute("data-click-action",e.action),t.setAttribute("data-pause",e.pause),e.action===c?t.setAttribute("data-seek",e.args.time):e.action===l&&t.setAttribute("data-goto-url",e.args.url)};a().registerComponent("shoppablePanelItem",B);const U=B,V=a().getComponent("Component");class X extends V{constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(t,e),this.options=e;const s=()=>{this.render()};t.on(C.f.SHOPPABLE_ITEM_CHANGED,s),this.render(),this.dispose=()=>{super.dispose(),t.off(C.f.SHOPPABLE_ITEM_CHANGED,s)}}createEl(){const t=super.createEl();return[m,"base-color-bg"].map((e=>t.classList.add(e))),t}removeAll(){const t=this.children();for(let e=t.length-1;e>=0;--e)this.removeChild(t[e])}getItems(){const t=this.player_.cloudinary.cloudinaryConfig();return this.options.products.map((e=>{e.onHover&&"object"==typeof e.onHover.args&&(e.onHover.args.transformation=Object.assign({},this.options.transformation,e.onHover.args.transformation));const s={productId:e.productId,productName:e.productName,title:e.title,onHover:e.onHover,onClick:e.onClick,startTime:e.startTime,endTime:e.endTime};return{imageSrc:new O.A(e.publicId,{cloudinaryConfig:t,transformation:Object.assign({},this.options.transformation,e.transformation)}),conf:s}}))}scrollToActiveItem(){const t=this.el_.getElementsByClassName("active");if(t.length>0){const e=t[0].offsetTop-12;"scrollBehavior"in document.documentElement.style?this.el_.scrollTo({top:e,behavior:"smooth"}):this.el_.scrollTop=e}}render(){this.removeAll();const t=this.getItems(),e=$()((()=>this.scrollToActiveItem()),1e3);t.forEach(((t,s)=>{const o=new U(this.player(),{item:t.imageSrc,conf:t.conf,next:1===s,current:0===s,clickHandler:t=>{let e=t.currentTarget||t.target,s=this.player_.ended()?"productClickPost":"productClick";if(this.player_.trigger(s,{productId:e.dataset.productId,productName:e.dataset.productName}),e.dataset.clickAction===l)window.open(e.dataset.gotoUrl,"_blank");else if(e.dataset.clickAction===c){const t=i(e.dataset.seek);null!==t&&(this.player_.addClass("vjs-has-started"),this.player_.postModal&&this.player_.postModal.close(),this.player_.currentTime(t),this.player_.removeClass(d),this.player_.addClass(h),this.player_.addClass(u),this.player_.one("seeked",(()=>this.player_.trigger("showProductsOverlay"))))}"false"!==e.dataset.pause&&(this.player_.pause(),i(e.dataset.pause)&&setTimeout((()=>{this.player_.play()}),1e3*i(e.dataset.pause)))}});o.on("mouseover",(t=>{let e=t.currentTarget||t.target,s=this.player_.ended()?"productHoverPost":"productHover";this.player_.trigger(s,{productId:e.dataset.productId,productName:e.dataset.productName})})),void 0!==t.conf.startTime&&void 0!==t.conf.endTime&&this.player_.on(C.f.TIME_UPDATE,(()=>{const s=this.player_.currentTime();s>=t.conf.startTime&&s<t.conf.endTime?(o.el_.classList.add("active"),e()):o.el_.classList.contains("active")&&o.el_.classList.remove("active")})),this.addChild(o)}))}}a().registerComponent("shoppablePanel",X);const G=X,Y=a().dom||a();const q=class{constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.options_={...e,postPlay:!0},this.player_=t,this.render(),this.handleDragToScroll(),this.dispose=()=>{this.layout_.dispose()}}handleDragToScroll(){const t=this.player_.postModal.el_.querySelector(`.${m}`);let e=!1,s=0,o=0;t.addEventListener("mousedown",(a=>{e=!0,s=a.pageX-t.offsetLeft,o=t.scrollLeft})),document.addEventListener("mouseup",(o=>{e=!1,setTimeout((()=>{t.classList.remove("dragged")}),300);const a=o.pageX-t.offsetLeft-s;Math.abs(a)>5&&o.preventDefault()})),document.addEventListener("mousemove",(a=>{if(!e)return;a.preventDefault();const i=a.pageX-t.offsetLeft-s;t.scrollLeft=o-i,Math.abs(i)>5&&!t.classList.contains("dragged")&&t.classList.add("dragged")}))}render(){this.player_.postModal=null;const t=Y.createEl("div",{className:"cld-spbl-post-play"}),e=new G(this.player_,this.options_),s=Y.createEl("div",{className:"cld-spbl-post-title base-color-text"},{},this.options_.bannerMsg||"Shop the Video"),o=this.player_.cloudinary.currentPoster();o.transformation([o.transformation().toOptions?o.transformation().toOptions():{},{effect:"blur:3000"}]);const a=Y.createEl("div",{className:"cld-spbl-post-play-bg",style:`background-image: url("${o.url()}")`}),i=Y.createEl("button",{className:"cld-spbl-replay-btn base-color-bg vjs-icon-replay",onclick:()=>{this.player_.trigger("replay"),this.player_.postModal.close(),this.player_.play()}},{},"Replay");t.appendChild(a),t.appendChild(s),t.appendChild(e.el()),t.appendChild(i),this.player_.postModal=this.player_.createModal(t,{name:"postModal",uncloseable:!0}),this.player_.addClass("cld-spbl-post-modal"),this.player_.postModal.on("beforemodalclose",(()=>{this.player_.removeClass("cld-spbl-post-modal")}))}};const Z=class{constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.options_=a().obj.merge(n,e),this.player_=t,this.options_.showPostPlayOverlay&&this.player_.on(C.f.ENDED,(()=>{this.player_.addChild(new q(this.player_,this.options_))}));const s=this.options_.width;this._injectCSS(`\n .${y} {\n transform: translateX(${s});\n }\n .${d} .vjs-control-bar {\n width: calc(100% - ${s});\n }\n .${g} {\n right: ${s};\n }\n .${m}{\n width: ${s};\n }\n `),this._setListeners()}_setListeners(){const t=this._resizeHandler.bind(this);this.player_.on(C.f.RESIZE,t),window.addEventListener("resize",t),this.dispose=()=>{this.player_.off(C.f.RESIZE,t),window.removeEventListener("resize",t),this.layout_.dispose()}}_injectCSS(t){const e=document.createElement("style");e.innerHTML=t,this.player_.el_.appendChild(e)}_resizeHandler(){const t=[["sm",0,80],["md",81,110],["lg",111,170]],e=parseFloat(this.options_.width)/100*this.player_.el_.clientWidth;let s=!1;if(e){for(const[o,a,i]of t)e>a&&e<=i&&(this.layout_.contentWrpEl_.setAttribute("size",o),s=o);s||this.layout_.contentWrpEl_.removeAttribute("size")}}init(){this.render()}render(){this.layout_=new M(this.player_,this.options_)}}},8812:(t,e,s)=>{var o=s(2140),a=/^\s+/;t.exports=function(t){return t?t.slice(0,o(t)+1).replace(a,""):t}},2140:t=>{var e=/\s/;t.exports=function(t){for(var s=t.length;s--&&e.test(t.charAt(s)););return s}},6177:(t,e,s)=>{var o=s(8953),a=s(3664),i=s(5378),r=Math.max,n=Math.min;t.exports=function(t,e,s){var l,c,p,d,h,u,m=0,g=!1,_=!1,y=!0;if("function"!=typeof t)throw new TypeError("Expected a function");function f(e){var s=l,o=c;return l=c=void 0,m=e,d=t.apply(o,s)}function v(t){var s=t-u;return void 0===u||s>=e||s<0||_&&t-m>=p}function b(){var t=a();if(v(t))return C(t);h=setTimeout(b,function(t){var s=e-(t-u);return _?n(s,p-(t-m)):s}(t))}function C(t){return h=void 0,y&&l?f(t):(l=c=void 0,d)}function E(){var t=a(),s=v(t);if(l=arguments,c=this,u=t,s){if(void 0===h)return function(t){return m=t,h=setTimeout(b,e),g?f(t):d}(u);if(_)return clearTimeout(h),h=setTimeout(b,e),f(u)}return void 0===h&&(h=setTimeout(b,e)),d}return e=i(e)||0,o(s)&&(g=!!s.leading,p=(_="maxWait"in s)?r(i(s.maxWait)||0,e):p,y="trailing"in s?!!s.trailing:y),E.cancel=function(){void 0!==h&&clearTimeout(h),m=0,l=u=c=h=void 0},E.flush=function(){return void 0===h?d:C(a())},E}},3664:(t,e,s)=>{var o=s(1433);t.exports=function(){return o.Date.now()}},2858:(t,e,s)=>{var o=s(6177),a=s(8953);t.exports=function(t,e,s){var i=!0,r=!0;if("function"!=typeof t)throw new TypeError("Expected a function");return a(s)&&(i="leading"in s?!!s.leading:i,r="trailing"in s?!!s.trailing:r),o(t,e,{leading:i,maxWait:e,trailing:r})}},5378:(t,e,s)=>{var o=s(8812),a=s(8953),i=s(5414),r=/^[-+]0x[0-9a-f]+$/i,n=/^0b[01]+$/i,l=/^0o[0-7]+$/i,c=parseInt;t.exports=function(t){if("number"==typeof t)return t;if(i(t))return NaN;if(a(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=a(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=o(t);var s=n.test(t);return s||l.test(t)?c(t.slice(2),s?2:8):r.test(t)?NaN:+t}}}]);
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * Cloudinary Video Player v3.1.2-edge.1
3
- * Built on 2025-07-22T11:12:21.313Z
2
+ * Cloudinary Video Player v3.1.2-edge.3
3
+ * Built on 2025-08-06T14:15:40.534Z
4
4
  * https://github.com/cloudinary/cloudinary-video-player
5
5
  */
6
6
  "use strict";
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * Cloudinary Video Player v3.1.2-edge.1
3
- * Built on 2025-07-22T11:12:02.081Z
2
+ * Cloudinary Video Player v3.1.2-edge.3
3
+ * Built on 2025-08-06T14:15:21.113Z
4
4
  * https://github.com/cloudinary/cloudinary-video-player
5
5
  */
6
6
  "use strict";(self.cloudinaryVideoPlayerChunkLoading=self.cloudinaryVideoPlayerChunkLoading||[]).push([[6],{3565:(t,e,r)=>{r.d(e,{default:()=>d});const i=class{seperator=",";timestampToSeconds(t){const[e,r]=t.split(","),i=parseInt(r),[s,d,a]=e.split(":").map((t=>parseInt(t))),n=.001*i+a+60*d+3600*s;return Math.round(1e3*n)/1e3}correctFormat(t){let e=t.replace(".",",");var r,[i,s]=e.split(",");r=this.fixed_str_digit(3,s);var[d,a,n]=i.split(":");return`${this.fixed_str_digit(2,d,!1)}:${this.fixed_str_digit(2,a,!1)}:${this.fixed_str_digit(2,n,!1)},${r}`}fixed_str_digit(t,e,r=!0){return e.length==t?e:e.length>t?e.slice(0,t):e.length<t?r?e.padEnd(t,"0"):e.padStart(t,"0"):void 0}tryComma(t){let e=(t=t.replace(/\r/g,"")).split(/(\d+)\n(\d{1,2}:\d{2}:\d{2},\d{1,3}) --> (\d{1,2}:\d{2}:\d{2},\d{1,3})/g);return e.shift(),e}tryDot(t){let e=(t=t.replace(/\r/g,"")).split(/(\d+)\n(\d{1,2}:\d{2}:\d{2}\.\d{1,3}) --> (\d{1,2}:\d{2}:\d{2}\.\d{1,3})/g);return e.shift(),this.seperator=".",e}fromSrt(t){var e=t,r=this.tryComma(e);0==r.length&&(r=this.tryDot(e));for(var i=[],s=0;s<r.length;s+=4){const t=this.correctFormat(r[s+1].trim()),e=this.correctFormat(r[s+2].trim());var d={id:r[s].trim(),startTime:t,startSeconds:this.timestampToSeconds(t),endTime:e,endSeconds:this.timestampToSeconds(e),text:r[s+3].trim()};i.push(d)}return i}toSrt(t){var e="";const r="\r\n";for(var i=0;i<t.length;i++){var s=t[i];e+=s.id+r,e+=s.startTime+" --\x3e "+s.endTime+r,e+=s.text.replace("\n",r)+r+r}return e}};const s=t=>(new i).fromSrt(t).map((t=>({startTime:t.startSeconds,endTime:t.endSeconds,text:t.text}))),d=function(t,e){e.one("loadedmetadata",(()=>{(async()=>{let r;if(t.src)try{if(r=await fetch(t.src),!r.ok)throw new Error(`Failed fetching from ${t.src} with status code ${r.status}`)}catch(t){console.error(t)}if(!r.ok)return;const i=await r.text(),d=s(i),a=e.addRemoteTextTrack({kind:t.kind||"subtitles",label:t.label||"Subtitles",srclang:t.srclang,default:t.default,mode:t.default?"showing":"disabled"});d.forEach((t=>{t&&a.track.addCue(new VTTCue(t.startTime,t.endTime,t.text))}))})()}))}}}]);
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * Cloudinary Video Player v3.1.2-edge.1
3
- * Built on 2025-07-22T11:12:21.313Z
2
+ * Cloudinary Video Player v3.1.2-edge.3
3
+ * Built on 2025-08-06T14:15:40.534Z
4
4
  * https://github.com/cloudinary/cloudinary-video-player
5
5
  */
6
6
  "use strict";
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * Cloudinary Video Player v3.1.2-edge.1
3
- * Built on 2025-07-22T11:12:02.081Z
2
+ * Cloudinary Video Player v3.1.2-edge.3
3
+ * Built on 2025-08-06T14:15:21.113Z
4
4
  * https://github.com/cloudinary/cloudinary-video-player
5
5
  */
6
6
  "use strict";(self.cloudinaryVideoPlayerChunkLoading=self.cloudinaryVideoPlayerChunkLoading||[]).push([[728],{9148:(e,a,s)=>{s.d(a,{default:()=>l});var t=s(6673),r=s.n(t);const l=(e,a)=>{a.addClass("vjs-visual-search");let s=!1;const t=(e=>{const a=()=>{e.$$(".vjs-visual-search-marker").forEach((e=>e.remove())),e.$$(".vjs-visual-search-results-wrapper").forEach((e=>e.remove())),e.removeClass("vjs-visual-search-results-active")};return{displayResults:s=>{a();const t=e.duration(),l=e.controlBar.progressControl.seekBar,n=r().dom.createEl("div",{className:"vjs-visual-search-results-wrapper",role:"presentation"});s.forEach((a=>{const{start_time:s,end_time:l}=a,c=s/t*100,o=(l-s)/t*100,i=`${Math.floor(s/60)}:${Math.floor(s%60).toString().padStart(2,"0")}`,d=r().dom.createEl("div",{className:"vjs-control vjs-visual-search-marker",style:`left: ${c}%; width: ${o}%`,tabIndex:0,role:"button",title:`Search result at ${i}`,ariaLabel:`Search result at ${i}`});n.appendChild(d),d.addEventListener("click",(()=>{e.currentTime(s)})),d.addEventListener("keydown",(a=>{"Enter"!==a.key&&" "!==a.key||(a.preventDefault(),e.currentTime(s))}))})),l.el().appendChild(n),s.length>0&&e.addClass("vjs-visual-search-results-active")},clearMarkers:a}})(a),l=async e=>{const s=a.$(".vjs-visual-search-button");s.classList.add("vjs-waiting");try{const s=a.cloudinary.source(),r=s.publicId(),l=Object.assign({},s.transformation());l.flags=l.flags||[],l.flags.push(`getinfo:search_b64_${btoa(e)}`);const n=s.config().url(`${r}`,{transformation:l}),c=await fetch(n,{method:"GET",headers:{"Content-Type":"application/json"}});if(!c.ok)throw new Error(`Search request failed with status: ${c.status}`);const o=await c.json();t.displayResults(o.timestamps),o&&!a.hasStarted()&&a.play().then((()=>a.pause()))}catch(e){console.error("Error performing visual search:",e)}finally{s.classList.remove("vjs-waiting")}},n=()=>{s=!1,t.clearMarkers(),a.$(".vjs-visual-search-wrapper")?.remove()},c=()=>{n();const e=a.$(".vjs-title-bar");e&&e.classList.remove("vjs-hidden");const c=r().dom.createEl("div",{className:"vjs-visual-search-wrapper"}),o=()=>{s&&(s=!1,c.classList.remove("vjs-visual-search-active"),d.input.value="",d.input.tabIndex=-1,d.closeButton.tabIndex=-1,t.clearMarkers())},i=(e=>{const a=r().dom.createEl("button",{className:"vjs-control vjs-button vjs-visual-search-button",title:"Search video content",ariaLabel:"Search video content"}),s=r().dom.createEl("span",{className:"vjs-icon-search"});a.appendChild(s);const t=r().dom.createEl("span",{className:"vjs-loading-spinner"});return a.appendChild(t),a.addEventListener("click",e),a})((()=>{if(s){const e=d.input.value.trim();e&&l(e)}else s=!0,c.classList.add("vjs-visual-search-active"),d.input.tabIndex=0,d.closeButton.tabIndex=0,d.input.focus()})),d=((e,a)=>{const s=r().dom.createEl("form",{className:"vjs-visual-search-form"}),t=r().dom.createEl("input",{className:"vjs-visual-search-input",type:"text",ariaLabel:"Search input",tabIndex:-1}),l=r().dom.createEl("button",{className:"vjs-control vjs-button vjs-visual-search-close",type:"button",title:"Close search",ariaLabel:"Close search",tabIndex:-1}),n=r().dom.createEl("span",{className:"vjs-icon-close"});return l.appendChild(n),s.appendChild(t),s.appendChild(l),s.addEventListener("submit",(a=>{a.preventDefault();const s=t.value.trim();s&&e(s)})),l.addEventListener("click",(e=>{e.preventDefault(),a&&a()})),{element:s,input:t,closeButton:l}})(l,o);c.appendChild(i),c.appendChild(d.element),e.prepend(c),a.on("keydown",(e=>{"Escape"===e.key&&s&&o()}))};c(),a.visualSearch={createSearchUI:c,clearUI:n}}}}]);