js-cloudimage-360-view 4.0.0 → 4.1.1

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.
@@ -0,0 +1,2700 @@
1
+ var Qe = Object.defineProperty;
2
+ var ti = (e, t, i) => t in e ? Qe(e, t, { enumerable: !0, configurable: !0, writable: !0, value: i }) : e[t] = i;
3
+ var le = (e, t, i) => ti(e, typeof t != "symbol" ? t + "" : t, i);
4
+ var Mt = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {};
5
+ function ei(e) {
6
+ return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
7
+ }
8
+ var Ze = "Expected a function", ce = NaN, ii = "[object Symbol]", ni = /^\s+|\s+$/g, oi = /^[-+]0x[0-9a-f]+$/i, si = /^0b[01]+$/i, ri = /^0o[0-7]+$/i, ai = parseInt, li = typeof Mt == "object" && Mt && Mt.Object === Object && Mt, ci = typeof self == "object" && self && self.Object === Object && self, hi = li || ci || Function("return this")(), di = Object.prototype, ui = di.toString, pi = Math.max, fi = Math.min, Kt = function() {
9
+ return hi.Date.now();
10
+ };
11
+ function mi(e, t, i) {
12
+ var n, o, s, l, r, a, c = 0, h = !1, p = !1, f = !0;
13
+ if (typeof e != "function")
14
+ throw new TypeError(Ze);
15
+ t = he(t) || 0, Bt(i) && (h = !!i.leading, p = "maxWait" in i, s = p ? pi(he(i.maxWait) || 0, t) : s, f = "trailing" in i ? !!i.trailing : f);
16
+ function u(y) {
17
+ var O = n, S = o;
18
+ return n = o = void 0, c = y, l = e.apply(S, O), l;
19
+ }
20
+ function I(y) {
21
+ return c = y, r = setTimeout(m, t), h ? u(y) : l;
22
+ }
23
+ function g(y) {
24
+ var O = y - a, S = y - c, E = t - O;
25
+ return p ? fi(E, s - S) : E;
26
+ }
27
+ function v(y) {
28
+ var O = y - a, S = y - c;
29
+ return a === void 0 || O >= t || O < 0 || p && S >= s;
30
+ }
31
+ function m() {
32
+ var y = Kt();
33
+ if (v(y))
34
+ return b(y);
35
+ r = setTimeout(m, g(y));
36
+ }
37
+ function b(y) {
38
+ return r = void 0, f && n ? u(y) : (n = o = void 0, l);
39
+ }
40
+ function x() {
41
+ r !== void 0 && clearTimeout(r), c = 0, n = a = o = r = void 0;
42
+ }
43
+ function w() {
44
+ return r === void 0 ? l : b(Kt());
45
+ }
46
+ function C() {
47
+ var y = Kt(), O = v(y);
48
+ if (n = arguments, o = this, a = y, O) {
49
+ if (r === void 0)
50
+ return I(a);
51
+ if (p)
52
+ return r = setTimeout(m, t), u(a);
53
+ }
54
+ return r === void 0 && (r = setTimeout(m, t)), l;
55
+ }
56
+ return C.cancel = x, C.flush = w, C;
57
+ }
58
+ function vi(e, t, i) {
59
+ var n = !0, o = !0;
60
+ if (typeof e != "function")
61
+ throw new TypeError(Ze);
62
+ return Bt(i) && (n = "leading" in i ? !!i.leading : n, o = "trailing" in i ? !!i.trailing : o), mi(e, t, {
63
+ leading: n,
64
+ maxWait: t,
65
+ trailing: o
66
+ });
67
+ }
68
+ function Bt(e) {
69
+ var t = typeof e;
70
+ return !!e && (t == "object" || t == "function");
71
+ }
72
+ function gi(e) {
73
+ return !!e && typeof e == "object";
74
+ }
75
+ function yi(e) {
76
+ return typeof e == "symbol" || gi(e) && ui.call(e) == ii;
77
+ }
78
+ function he(e) {
79
+ if (typeof e == "number")
80
+ return e;
81
+ if (yi(e))
82
+ return ce;
83
+ if (Bt(e)) {
84
+ var t = typeof e.valueOf == "function" ? e.valueOf() : e;
85
+ e = Bt(t) ? t + "" : t;
86
+ }
87
+ if (typeof e != "string")
88
+ return e === 0 ? e : +e;
89
+ e = e.replace(ni, "");
90
+ var i = si.test(e);
91
+ return i || ri.test(e) ? ai(e.slice(2), i ? 2 : 8) : oi.test(e) ? ce : +e;
92
+ }
93
+ var bi = vi;
94
+ const de = /* @__PURE__ */ ei(bi), M = {
95
+ SPIN_X: "spin-x",
96
+ SPIN_Y: "spin-y",
97
+ SPIN_XY: "spin-xy",
98
+ SPIN_YX: "spin-yx"
99
+ }, wi = [!1, 0, null, void 0, "false", "0", "null", "undefined"], P = {
100
+ X: "x-axis",
101
+ Y: "y-axis"
102
+ }, Ii = [37, 39], xi = [38, 40], ue = 10, Ci = 150, pe = 800, Oi = 150, Ei = 200, fe = 50, Si = 50, Ai = 5, me = 5, Li = "https://scaleflex.cloudimg.io/v7/filerobot/js-cloudimage-360-view/360_view.svg", d = {
103
+ folder: "/",
104
+ apiVersion: "v7",
105
+ filenameX: "image-{index}.jpg",
106
+ filenameY: null,
107
+ imageListX: null,
108
+ imageListY: null,
109
+ indexZeroBase: 0,
110
+ amountX: 0,
111
+ amountY: 0,
112
+ speed: 80,
113
+ dragSpeed: 150,
114
+ draggable: !0,
115
+ swipeable: !0,
116
+ keys: !1,
117
+ keysReverse: !1,
118
+ autoplay: !1,
119
+ autoplayBehavior: M.SPIN_X,
120
+ playOnce: !1,
121
+ autoplayReverse: !1,
122
+ pointerZoom: 0,
123
+ fullscreen: !1,
124
+ magnifier: null,
125
+ bottomCircle: !0,
126
+ bottomCircleOffset: 5,
127
+ ciToken: null,
128
+ ciFilters: null,
129
+ ciTransformation: null,
130
+ lazyload: !0,
131
+ dragReverse: !1,
132
+ stopAtEdges: !1,
133
+ imageInfo: !1,
134
+ initialIconShown: !0,
135
+ hotspots: null,
136
+ hide360Logo: !1,
137
+ logoSrc: Li,
138
+ inertia: !1,
139
+ pinchZoom: !0,
140
+ hints: !0,
141
+ theme: null,
142
+ hotspotTimelineOnClick: !0,
143
+ // Event callbacks
144
+ onReady: null,
145
+ onLoad: null,
146
+ onSpin: null,
147
+ onAutoplayStart: null,
148
+ onAutoplayStop: null,
149
+ onFullscreenOpen: null,
150
+ onFullscreenClose: null,
151
+ onZoomIn: null,
152
+ onZoomOut: null,
153
+ onDragStart: null,
154
+ onDragEnd: null
155
+ }, ki = (e) => ({
156
+ folder: k(e, "folder", d.folder),
157
+ apiVersion: k(e, "api-version", d.apiVersion),
158
+ filenameX: k(e, "filename") || k(e, "filename-x") || d.filenameX,
159
+ filenameY: k(e, "filename-y", d.filenameY),
160
+ imageListX: k(e, "image-list-x", d.imageListX),
161
+ imageListY: k(e, "image-list-y", d.imageListY),
162
+ indexZeroBase: parseInt(k(e, "index-zero-base", d.indexZeroBase), 10),
163
+ amountX: parseInt(k(e, "amount-x", d.amountX), 10),
164
+ amountY: parseInt(k(e, "amount-y", d.amountY), 10),
165
+ speed: parseInt(k(e, "speed", d.speed), 10),
166
+ dragSpeed: parseInt(k(e, "drag-speed", d.dragSpeed), 10),
167
+ draggable: X(e, "draggable", d.draggable),
168
+ swipeable: X(e, "swipeable", d.swipeable),
169
+ keys: X(e, "keys", d.keys),
170
+ keysReverse: X(e, "keys-reverse", d.keysReverse),
171
+ autoplay: X(e, "autoplay", d.autoplay),
172
+ autoplayBehavior: k(e, "autoplay-behavior", d.autoplayBehavior),
173
+ playOnce: X(e, "play-once", d.playOnce),
174
+ autoplayReverse: X(e, "autoplay-reverse", d.autoplayReverse),
175
+ pointerZoom: parseFloat(k(e, "pointer-zoom", d.pointerZoom)),
176
+ fullscreen: X(e, "fullscreen") || X(e, "full-screen", d.fullscreen),
177
+ magnifier: parseFloat(k(e, "magnifier", d.magnifier)),
178
+ bottomCircleOffset: parseInt(
179
+ k(e, "bottom-circle-offset", d.bottomCircleOffset),
180
+ 10
181
+ ),
182
+ ciToken: k(e, "responsive", d.ciToken),
183
+ ciFilters: k(e, "filters", d.ciFilters),
184
+ ciTransformation: k(e, "transformation", d.ciTransformation),
185
+ lazyload: X(e, "lazyload", d.lazyload),
186
+ dragReverse: X(e, "drag-reverse", d.dragReverse),
187
+ stopAtEdges: X(e, "stop-at-edges", d.stopAtEdges),
188
+ imageInfo: X(e, "info", d.imageInfo),
189
+ initialIconShown: !Ht(e, "initial-icon"),
190
+ bottomCircle: !Ht(e, "bottom-circle"),
191
+ hide360Logo: X(e, "hide-360-logo", d.hide360Logo),
192
+ logoSrc: k(e, "logo-src", d.logoSrc),
193
+ inertia: X(e, "inertia", d.inertia),
194
+ pinchZoom: X(e, "pinch-zoom", d.pinchZoom),
195
+ hints: !Ht(e, "hints"),
196
+ theme: k(e, "theme", d.theme),
197
+ hotspotTimelineOnClick: !Ht(e, "hotspot-timeline-on-click")
198
+ }), Ti = (e) => {
199
+ const t = [];
200
+ e.amountX !== void 0 && e.amountX < 0 && t.push("amountX should be a positive number"), e.amountY !== void 0 && e.amountY < 0 && t.push("amountY should be a positive number"), e.speed !== void 0 && e.speed <= 0 && t.push("speed should be a positive number"), e.dragSpeed !== void 0 && e.dragSpeed <= 0 && t.push("dragSpeed should be a positive number"), e.pointerZoom !== void 0 && e.pointerZoom !== 0 && (e.pointerZoom < 1 || e.pointerZoom > 5) && t.push("pointerZoom should be between 1 and 5 (or 0 to disable)"), e.magnifier !== void 0 && e.magnifier !== null && e.magnifier !== 0 && (e.magnifier < 1 || e.magnifier > 5) && t.push("magnifier should be between 1 and 5 (or 0/null to disable)"), !e.folder && !e.imageListX && !e.imageListY && t.push("Either folder or imageListX/imageListY is required"), e.folder && !e.amountX && !e.imageListX && t.push("amountX is required when using folder (unless imageListX is provided)");
201
+ const i = ["spin-x", "spin-y", "spin-xy", "spin-yx"];
202
+ return e.autoplayBehavior && !i.includes(e.autoplayBehavior) && t.push(`autoplayBehavior should be one of: ${i.join(", ")}`), t.forEach((n) => {
203
+ console.warn(`CloudImage 360: ${n}`);
204
+ }), t.length === 0;
205
+ }, Yi = (e) => (Ti(e), {
206
+ folder: e.folder || d.folder,
207
+ apiVersion: e.apiVersion || d.apiVersion,
208
+ filenameX: e.filenameX || e.filename || d.filenameX,
209
+ filenameY: e.filenameY || d.filenameY,
210
+ imageListX: e.imageListX || d.imageListX,
211
+ imageListY: e.imageListY || d.imageListY,
212
+ indexZeroBase: parseInt(e.indexZeroBase ?? d.indexZeroBase, 10),
213
+ amountX: parseInt(e.amountX ?? d.amountX, 10),
214
+ amountY: parseInt(e.amountY ?? d.amountY, 10),
215
+ speed: parseInt(e.speed ?? d.speed, 10),
216
+ draggable: e.draggable ?? d.draggable,
217
+ swipeable: e.swipeable ?? d.swipeable,
218
+ dragSpeed: parseInt(e.dragSpeed ?? d.dragSpeed, 10),
219
+ keys: e.keys ?? d.keys,
220
+ keysReverse: e.keysReverse ?? d.keysReverse,
221
+ autoplay: e.autoplay ?? d.autoplay,
222
+ autoplayBehavior: e.autoplayBehavior || d.autoplayBehavior,
223
+ playOnce: e.playOnce ?? d.playOnce,
224
+ autoplayReverse: e.autoplayReverse ?? d.autoplayReverse,
225
+ pointerZoom: parseFloat(e.pointerZoom ?? d.pointerZoom),
226
+ fullscreen: e.fullscreen ?? d.fullscreen,
227
+ magnifier: parseFloat(e.magnifier ?? d.magnifier),
228
+ bottomCircleOffset: parseInt(e.bottomCircleOffset ?? d.bottomCircleOffset, 10),
229
+ ciToken: e.ciToken || d.ciToken,
230
+ ciFilters: e.ciFilters || d.ciFilters,
231
+ ciTransformation: e.ciTransformation || d.ciTransformation,
232
+ lazyload: e.lazyload ?? d.lazyload,
233
+ dragReverse: e.dragReverse ?? d.dragReverse,
234
+ stopAtEdges: e.stopAtEdges ?? d.stopAtEdges,
235
+ imageInfo: e.imageInfo ?? d.imageInfo,
236
+ initialIconShown: e.initialIconShown ?? d.initialIconShown,
237
+ bottomCircle: e.bottomCircle ?? d.bottomCircle,
238
+ hotspots: e.hotspots ?? d.hotspots,
239
+ hide360Logo: e.hide360Logo ?? d.hide360Logo,
240
+ logoSrc: e.logoSrc || d.logoSrc,
241
+ inertia: e.inertia ?? d.inertia,
242
+ pinchZoom: e.pinchZoom ?? d.pinchZoom,
243
+ hints: e.hints ?? d.hints,
244
+ theme: e.theme || d.theme,
245
+ hotspotTimelineOnClick: e.hotspotTimelineOnClick ?? d.hotspotTimelineOnClick,
246
+ // Event callbacks
247
+ onReady: e.onReady ?? d.onReady,
248
+ onLoad: e.onLoad ?? d.onLoad,
249
+ onSpin: e.onSpin ?? d.onSpin,
250
+ onAutoplayStart: e.onAutoplayStart ?? d.onAutoplayStart,
251
+ onAutoplayStop: e.onAutoplayStop ?? d.onAutoplayStop,
252
+ onFullscreenOpen: e.onFullscreenOpen ?? d.onFullscreenOpen,
253
+ onFullscreenClose: e.onFullscreenClose ?? d.onFullscreenClose,
254
+ onZoomIn: e.onZoomIn ?? d.onZoomIn,
255
+ onZoomOut: e.onZoomOut ?? d.onZoomOut,
256
+ onDragStart: e.onDragStart ?? d.onDragStart,
257
+ onDragEnd: e.onDragEnd ?? d.onDragEnd
258
+ }), k = (e, t, i) => e.getAttribute(t) || e.getAttribute(`data-${t}`) || i, X = (e, t, i) => {
259
+ if (!(e.hasAttribute(t) || e.hasAttribute(`data-${t}`))) return i;
260
+ const o = k(e, t, null);
261
+ return o !== "false" && o !== "0";
262
+ }, Ht = (e, t) => k(e, t, null) === "false", Xi = (e = 1) => {
263
+ const t = Math.round(window.devicePixelRatio || 1);
264
+ return parseInt(e) * t;
265
+ }, Pi = (e, t, i) => new URL(e).origin.includes("cloudimg") ? e : `https://${t}.cloudimg.io/${i}${e}`, Ri = ({ ciTransformation: e, responsiveWidth: t, ciFilters: i }) => {
266
+ const n = `width=${t}`, o = e || n, s = i ? `&f=${i}` : "";
267
+ return `${o}${s}`;
268
+ }, Ot = (e, t) => {
269
+ const { folder: i, apiVersion: n, filename: o = "", ciParams: s } = e, { ciToken: l, ciFilters: r, ciTransformation: a } = s || {}, c = `${i}${o}`;
270
+ if (!l) return c;
271
+ const h = wi.includes(n) ? null : n, p = h ? `${h}/` : "", f = Xi(t), u = Pi(c, l, p), I = Ri({
272
+ ciTransformation: a,
273
+ responsiveWidth: f,
274
+ ciFilters: r
275
+ });
276
+ return `${u}${I ? "?" : ""}${I}`;
277
+ }, Mi = (e, t, i) => {
278
+ const [n, o] = e.split("?"), s = `${t}=${encodeURIComponent(i)}`;
279
+ if (!o)
280
+ return `${n}?${s}`;
281
+ const l = new URLSearchParams(o);
282
+ return l.set(t, i), `${n}?${l.toString()}`;
283
+ }, Hi = (e, t) => Mi(e, "width", t), Be = (e, t = 0) => (e += "", e.length >= t ? e : new Array(t - e.length + 1).join("0") + e), Di = (e, { amount: t = 0, indexZeroBase: i = 0 } = {}) => Array.from({ length: t }, (n, o) => e.replace("{index}", Be(o + 1, i))), Zi = ({
284
+ imagesUrls: e,
285
+ onFirstImageLoad: t,
286
+ onImageLoad: i,
287
+ onAllImagesLoad: n,
288
+ onError: o,
289
+ autoplayReverse: s
290
+ }) => {
291
+ let l = 0, r = 0;
292
+ const a = e.length, c = [], h = [], p = (m, b, x = !1) => {
293
+ const w = {
294
+ message: `Failed to load image: ${m}`,
295
+ url: m,
296
+ index: b,
297
+ isFirstImage: x
298
+ };
299
+ h.push(w), r++, o == null || o({
300
+ error: w,
301
+ errorCount: r,
302
+ totalImages: a,
303
+ errors: h
304
+ });
305
+ }, f = () => {
306
+ l === a && (n == null || n(c, { errorCount: r, errors: h }));
307
+ }, u = (m, b) => {
308
+ const x = new Image();
309
+ x.crossOrigin = "anonymous", x.src = m, x.onload = async () => {
310
+ try {
311
+ const w = await createImageBitmap(x), C = {
312
+ src: m,
313
+ bitmapImage: w,
314
+ naturalWidth: x.naturalWidth,
315
+ naturalHeight: x.naturalHeight
316
+ };
317
+ l++, c[b] = C, i == null || i(C, b), f();
318
+ } catch {
319
+ l++, p(m, b), f();
320
+ }
321
+ }, x.onerror = () => {
322
+ l++, p(m, b), f();
323
+ };
324
+ }, I = new Image(), g = s ? e.length - 1 : 0, v = e[g];
325
+ I.crossOrigin = "anonymous", I.src = v, I.onload = async () => {
326
+ try {
327
+ const m = await createImageBitmap(I), b = {
328
+ src: v,
329
+ bitmapImage: m,
330
+ naturalWidth: I.naturalWidth,
331
+ naturalHeight: I.naturalHeight
332
+ };
333
+ c[g] = b, l++, t == null || t(b), i == null || i(b, g);
334
+ for (let x = 0; x < e.length; x++)
335
+ x !== g && u(e[x], x);
336
+ f();
337
+ } catch {
338
+ l++, p(v, g, !0);
339
+ for (let b = 0; b < e.length; b++)
340
+ b !== g && u(e[b], b);
341
+ f();
342
+ }
343
+ }, I.onerror = () => {
344
+ l++, p(v, g, !0);
345
+ for (let m = 0; m < e.length; m++)
346
+ m !== g && u(e[m], m);
347
+ f();
348
+ };
349
+ }, ve = ({
350
+ cdnPathX: e,
351
+ cdnPathY: t,
352
+ configX: i,
353
+ configY: n,
354
+ onFirstImageLoad: o,
355
+ onImageLoad: s,
356
+ onAllImagesLoad: l,
357
+ onError: r
358
+ }) => {
359
+ let a = { x: !1, y: !1 }, c = [], h = [], p = { errorCount: 0, errors: [] }, f = { errorCount: 0, errors: [] };
360
+ const u = e || i.imageList.length, I = t || n.imageList.length, g = () => {
361
+ if (a.x && a.y) {
362
+ const m = {
363
+ errorCount: p.errorCount + f.errorCount,
364
+ errors: [...p.errors, ...f.errors]
365
+ };
366
+ l == null || l(c, h, m);
367
+ }
368
+ }, v = ({ cdnPath: m, config: b, orientation: x, loadedImages: w, loadStats: C, onFirstImageLoad: y }) => {
369
+ const O = x === P.X, S = b.imageList.length ? b.imageList : Di(m, b);
370
+ Zi({
371
+ imagesUrls: S,
372
+ onFirstImageLoad: y,
373
+ onImageLoad: (E, A) => {
374
+ s == null || s(E, A, x), w[A] = E;
375
+ },
376
+ onError: (E) => {
377
+ r == null || r({ ...E, orientation: x });
378
+ },
379
+ onAllImagesLoad: (E, A) => {
380
+ w.length = 0, E.forEach((L, R) => {
381
+ L && (w[R] = L);
382
+ }), C.errorCount = A.errorCount, C.errors = A.errors.map((L) => ({ ...L, orientation: x })), a[O ? "x" : "y"] = !0, g();
383
+ },
384
+ autoplayReverse: b.autoplayReverse
385
+ });
386
+ };
387
+ u ? v({
388
+ cdnPath: e,
389
+ config: i,
390
+ orientation: P.X,
391
+ loadedImages: c,
392
+ loadStats: p,
393
+ onFirstImageLoad: o
394
+ }) : a.x = !0, I ? v({
395
+ cdnPath: t,
396
+ config: n,
397
+ orientation: P.Y,
398
+ loadedImages: h,
399
+ loadStats: f,
400
+ onFirstImageLoad: u ? void 0 : o
401
+ }) : a.y = !0, !u && !I && g();
402
+ }, Bi = `
403
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1052 156" aria-hidden="true">
404
+ <path fill="currentColor" d="M409.9,145.6c-42.7-1.7-85.5-4.4-128.1-8.4c-21.3-2-42.6-4.3-63.8-7.1c-21.2-2.8-42.4-5.9-63.4-9.7c-21.1-3.8-42-8.2-62.7-13.7c-10.3-2.8-20.6-5.8-30.7-9.4c-10.1-3.5-20.1-7.6-29.5-12.7c-4.7-2.6-9.3-5.4-13.5-8.8c-2.1-1.7-4-3.6-5.8-5.6c-1.8-2-3.3-4.3-4.3-6.8c-1.1-2.5-1.6-5.3-1.4-8c0.2-2.7,1.1-5.4,2.4-7.7c2.7-4.8,6.7-8.5,11-11.7c8.6-6.4,18.4-10.9,28.3-15c9.9-4,20.1-7.3,30.4-10.3c-10.2,3.1-20.4,6.5-30.3,10.5c-9.8,4.1-19.6,8.7-28.1,15.1c-4.2,3.2-8.2,6.9-10.7,11.6c-1.2,2.3-2.1,4.8-2.3,7.5c-0.1,2.6,0.4,5.2,1.4,7.6c2.1,4.8,5.9,8.7,10,12.1c4.1,3.3,8.7,6.1,13.4,8.6c9.4,5,19.4,8.9,29.4,12.4c10.1,3.5,20.4,6.4,30.7,9.1c20.7,5.3,41.6,9.5,62.7,13.2c21,3.6,42.2,6.6,63.4,9.2c21.2,2.6,42.5,4.8,63.7,6.6c42.6,3.7,85.2,6,127.9,7.4L409.9,145.6z"/>
405
+ <path fill="currentColor" d="M977.1,11.6c13.8,4.1,27.4,8.8,40.4,15.2c6.4,3.2,12.7,6.9,18.3,11.5c2.7,2.4,5.3,5,7.3,8c2,3,3.3,6.6,3.3,10.3c0,3.7-1.4,7.2-3.3,10.3c-2,3.1-4.5,5.7-7.3,8.1c-2.7,2.4-5.7,4.4-8.8,6.3c-1.6,0.9-3.1,1.9-4.7,2.7l-2.4,1.3l-2.4,1.2C1004.5,93,990.8,97.8,977,102c-6.9,2.1-13.8,4-20.8,5.8c-7,1.8-14,3.5-21,5c-14.1,3.1-28.2,5.9-42.4,8.3c-28.4,4.9-57,8.8-85.6,12c-57.3,6.4-114.8,10.2-172.4,12.2c-57.6,2-115.2,2.3-172.9,0.8l0.1-4c57.5,1.8,115.1,1.9,172.6,0.2c57.5-1.7,115-5.2,172.3-11.2c28.6-3.1,57.2-6.7,85.6-11.5c14.2-2.4,28.3-5,42.4-8.1c7-1.5,14-3.1,21-4.9c7-1.7,13.9-3.6,20.8-5.7c13.8-4.1,27.4-8.8,40.3-15.2l2.4-1.2l2.4-1.3c1.6-0.8,3.1-1.8,4.7-2.7c3-1.9,6-3.9,8.7-6.2c2.7-2.3,5.2-4.9,7.2-7.9c1.9-3,3.2-6.4,3.3-10c0-3.6-1.2-7-3.1-10c-1.9-3-4.4-5.6-7.1-8c-5.5-4.7-11.7-8.3-18.1-11.6C1004.5,20.6,990.8,15.8,977.1,11.6z"/>
406
+ <g transform="translate(415, 136)">
407
+ <path fill="currentColor" d="M18.1,11.2c-1.8,0-2.8-1.2-2.8-3V8c0.8-0.4,1.7-0.6,2.8-0.6c1.5,0,2.5,0.6,2.5,1.7C20.6,10.2,19.8,11.2,18.1,11.2L18.1,11.2z M18.3,5.7c-1.1,0-2,0.3-2.8,0.7c0.3-1.6,1.5-2.6,3.7-2.6c1.1,0,2.3,0.3,3.1,0.5V2.6c-0.8-0.3-1.9-0.5-3.1-0.5c-4.2,0-6.2,2.1-6.2,5.8c0,3.2,1.8,4.9,5.1,4.9c3.3,0,5-1.7,5-3.6C23,7,21.3,5.7,18.3,5.7L18.3,5.7z"/>
408
+ <path fill="currentColor" d="M39.3,1.8c0.9,0,1.6,0.7,1.6,1.5c0,0.8-0.7,1.6-1.6,1.6c-0.8,0-1.6-0.7-1.6-1.6C37.8,2.5,38.5,1.8,39.3,1.8L39.3,1.8z M39.3,6.3c1.7,0,3.1-1.3,3.1-3c0-1.6-1.4-3-3.1-3c-1.7,0-3.1,1.3-3.1,3C36.2,5,37.6,6.3,39.3,6.3L39.3,6.3z"/>
409
+ <path fill="currentColor" d="M30.3,3.8c2.1,0,2.9,1.4,2.9,3.6c0,2.2-0.8,3.6-2.9,3.6c-2.1,0-2.9-1.5-2.9-3.6C27.4,5.3,28.1,3.8,30.3,3.8L30.3,3.8z M30.2,12.8c3.9,0,5.2-2.6,5.2-5.4c0-2.8-1.3-5.3-5.2-5.3c-3.9,0-5.3,2.6-5.3,5.4C25,10.3,26.3,12.8,30.2,12.8L30.2,12.8z"/>
410
+ <path fill="currentColor" d="M10.9,9.7c0-1.1-0.8-2-2.5-2.5c1.3-0.5,1.9-1.3,1.9-2.3c0-1.7-1.7-2.8-4.6-2.8c-1.5,0-2.7,0.3-3.6,0.8v1.7c0.9-0.4,2.3-0.7,3.4-0.7C7,3.9,8,4.4,8,5.1c0,0.8-0.7,1.3-2.4,1.3H4.3v1.6h1.3c2,0,2.9,0.8,2.9,1.6c0,0.8-1,1.5-2.8,1.5c-1.5,0-2.8-0.3-3.7-0.6v1.7c0.9,0.3,2.1,0.6,3.8,0.6C9.2,12.8,10.9,11.4,10.9,9.7"/>
411
+ </g>
412
+ </svg>
413
+ `, Wi = (e) => {
414
+ const t = document.createElement("div");
415
+ return t.innerHTML = Bi, t.style.bottom = `${e}%`, t.className = "cloudimage-360-view-360-circle", t;
416
+ }, Fi = `
417
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
418
+ <!-- Circular arrows -->
419
+ <path d="M 75 50 A 25 25 0 1 1 50 25" stroke="currentColor" stroke-width="3"/>
420
+ <path d="M 25 50 A 25 25 0 1 1 50 75" stroke="currentColor" stroke-width="3"/>
421
+ <!-- Arrow heads -->
422
+ <path d="M 50 25 L 56 31 M 50 25 L 56 19" stroke="currentColor" stroke-width="3"/>
423
+ <path d="M 50 75 L 44 69 M 50 75 L 44 81" stroke="currentColor" stroke-width="3"/>
424
+ <!-- 360 text -->
425
+ <text x="50" y="54" text-anchor="middle" font-size="16" font-weight="600" fill="currentColor" stroke="none" font-family="system-ui, -apple-system, sans-serif">360°</text>
426
+ </svg>
427
+ `, Ni = (e) => {
428
+ const t = document.createElement("div");
429
+ return t.className = "cloudimage-initial-icon", t.setAttribute("aria-label", "360 degree view - drag to rotate"), e ? (t.style.backgroundImage = `url('${e}')`, t.style.backgroundPosition = "50% 50%", t.style.backgroundSize = "contain", t.style.backgroundRepeat = "no-repeat") : t.innerHTML = Fi, t;
430
+ }, Vi = (e, t) => {
431
+ const { width: i, height: n } = t, o = document.createElement("canvas");
432
+ return o.width = i, o.height = n, o.style.width = "100%", o.style.height = "auto", e.appendChild(o), o;
433
+ }, ji = () => {
434
+ const e = document.createElement("button");
435
+ return e.className = "cloudimage-360-button cloudimage-360-close-icon", e.setAttribute("aria-label", "Close fullscreen"), e.setAttribute("type", "button"), e.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg>', e;
436
+ }, $i = () => {
437
+ const e = document.createElement("button");
438
+ return e.className = "cloudimage-360-button cloudimage-360-fullscreen-button", e.setAttribute("aria-label", "View fullscreen"), e.setAttribute("type", "button"), e.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="15 3 21 3 21 9"/><polyline points="9 21 3 21 3 15"/><line x1="21" x2="14" y1="3" y2="10"/><line x1="3" x2="10" y1="21" y2="14"/></svg>', e;
439
+ }, ge = (e) => {
440
+ const t = document.createElement("div");
441
+ return t.className = "cloudimage-360-icons-container", e.appendChild(t), t;
442
+ }, zi = (e) => {
443
+ const t = document.createElement("div");
444
+ return t.className = "cloudimage-360-inner-box", t.setAttribute("role", "img"), t.setAttribute("aria-label", "360 degree product view. Use mouse drag or arrow keys to rotate."), e.appendChild(t), t;
445
+ }, Gi = () => {
446
+ const e = document.createElement("button");
447
+ return e.className = "cloudimage-360-button cloudimage-360-magnifier-button", e.setAttribute("aria-label", "Magnify image"), e.setAttribute("type", "button"), e.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/><path d="M11 8v6"/><path d="M8 11h6"/></svg>', e;
448
+ }, Ui = (e) => {
449
+ const t = document.createElement("div");
450
+ t.className = "cloudimage-initial-icon";
451
+ const i = document.createElement("span");
452
+ return i.className = "percentage", i.innerText = "0%", t.appendChild(i), e.appendChild(t), t;
453
+ }, Ki = (e) => {
454
+ const t = document.createElement("div");
455
+ t.className = "cloudimage-360-fullscreen-modal";
456
+ const i = e.cloneNode();
457
+ return i.style.width = "100%", i.style.maxWidth = "100%", i.style.height = "100vh", i.style.maxHeight = "100%", t.appendChild(i), window.document.body.appendChild(t), i;
458
+ }, Jt = (e, t) => {
459
+ const i = e.querySelector(t);
460
+ i && i.parentNode.removeChild(i);
461
+ }, _i = () => {
462
+ const e = document.createElement("div");
463
+ return e.className = "cloudimage-loading-spinner", e;
464
+ }, Ji = () => {
465
+ const e = document.createElement("div");
466
+ return e.className = "cloudimage-360-transition-overlay", e;
467
+ }, qi = (e) => {
468
+ const t = document.createElement("div");
469
+ return t.className = "cloudimage-360-hotspot-container", e.appendChild(t), t;
470
+ }, Qi = (e) => {
471
+ const t = document.createElement("div");
472
+ return t.className = "cloudimage-360-sr-only", t.setAttribute("role", "status"), t.setAttribute("aria-live", "polite"), t.setAttribute("aria-atomic", "true"), e.appendChild(t), t;
473
+ }, tn = (e, t) => {
474
+ e && (e.textContent = "", setTimeout(() => {
475
+ e.textContent = t;
476
+ }, 50));
477
+ }, We = {
478
+ drag: '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M18 11V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2"/><path d="M14 10V4a2 2 0 0 0-2-2a2 2 0 0 0-2 2v2"/><path d="M10 10.5V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2v8"/><path d="M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15"/></svg>',
479
+ swipe: '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m18 16 4-4-4-4"/><path d="m6 8-4 4 4 4"/><path d="M8 12h8"/></svg>',
480
+ click: '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 9 5 12 1.8-5.2L21 14Z"/><path d="M7.2 2.2 8 5.1"/><path d="m5.1 8-2.9-.8"/><path d="M14 4.1 12 6"/><path d="m6 12-1.9 2"/></svg>',
481
+ pinch: '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 6l4 4"/><path d="M18 6l-4 4"/><path d="M6 18l4-4"/><path d="M18 18l-4-4"/><circle cx="12" cy="12" r="2"/></svg>',
482
+ keys: '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="20" height="16" x="2" y="4" rx="2"/><path d="m9 10 3 3 3-3"/></svg>',
483
+ fullscreen: '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="15 3 21 3 21 9"/><polyline points="9 21 3 21 3 15"/><line x1="21" x2="14" y1="3" y2="10"/><line x1="3" x2="10" y1="21" y2="14"/></svg>'
484
+ }, en = {
485
+ drag: "Drag to rotate",
486
+ swipe: "Swipe to rotate",
487
+ click: "Click to zoom",
488
+ pinch: "Pinch to zoom",
489
+ keys: "Use arrow keys",
490
+ fullscreen: "Click for fullscreen"
491
+ }, nn = (e) => {
492
+ const t = document.createElement("div");
493
+ return t.className = "cloudimage-360-hint-item", t.innerHTML = `
494
+ ${We[e]}
495
+ <span>${en[e]}</span>
496
+ `, t;
497
+ }, ye = (e, t = []) => {
498
+ if (!t || t.length === 0) return null;
499
+ const i = document.createElement("div");
500
+ i.className = "cloudimage-360-hints-overlay", i.setAttribute("role", "tooltip"), i.setAttribute("aria-label", "Interaction hints");
501
+ const n = document.createElement("div");
502
+ return n.className = "cloudimage-360-hints-container", t.forEach((o) => {
503
+ We[o] && n.appendChild(nn(o));
504
+ }), i.appendChild(n), e.appendChild(i), i;
505
+ }, be = (e, t) => t ? ["swipe"] : ["drag", "click"], we = (e) => {
506
+ e && e.classList.add("visible");
507
+ }, on = (e) => {
508
+ e && (e.classList.remove("visible"), e.classList.add("hiding"), setTimeout(() => {
509
+ e.classList.remove("hiding");
510
+ }, 300));
511
+ }, sn = (e) => {
512
+ if (!e || typeof e != "object") return null;
513
+ const t = Object.keys(e).map((n) => parseInt(n, 10)).filter((n) => !isNaN(n)).sort((n, o) => n - o);
514
+ if (t.length === 0) return null;
515
+ const i = Math.floor(t.length / 2);
516
+ return t[i];
517
+ }, rn = (e) => {
518
+ const t = [];
519
+ return !e || !Array.isArray(e) || e.forEach((i, n) => {
520
+ const o = sn(i.positions);
521
+ o !== null && t.push({
522
+ id: i.id || `hotspot-${n}`,
523
+ frame: o,
524
+ label: i.label || null
525
+ });
526
+ }), t;
527
+ }, an = 400, ln = (e, t, i, n) => {
528
+ const o = document.createElement("button");
529
+ o.className = "cloudimage-360-hotspot-timeline-dot", o.setAttribute("type", "button"), o.setAttribute("aria-label", n || `Go to hotspot at frame ${t + 1}`), o.setAttribute("data-frame", t.toString()), o.setAttribute("data-hotspot-id", e);
530
+ const s = i > 1 ? t / (i - 1) * 100 : 0;
531
+ if (o.style.left = `${s}%`, n) {
532
+ const l = document.createElement("span");
533
+ l.className = "cloudimage-360-hotspot-timeline-tooltip", l.textContent = n, o.appendChild(l);
534
+ let r = null;
535
+ o.addEventListener("mouseenter", () => {
536
+ r = setTimeout(() => {
537
+ l.classList.add("visible");
538
+ }, an);
539
+ }), o.addEventListener("mouseleave", () => {
540
+ r && (clearTimeout(r), r = null), l.classList.remove("visible");
541
+ }), o.addEventListener("click", () => {
542
+ r && (clearTimeout(r), r = null), l.classList.remove("visible");
543
+ });
544
+ }
545
+ return o;
546
+ }, cn = (e, t, i) => {
547
+ const n = rn(i);
548
+ if (n.length === 0) return null;
549
+ const o = document.createElement("div");
550
+ o.className = "cloudimage-360-hotspot-timeline", o.setAttribute("role", "navigation"), o.setAttribute("aria-label", "Hotspot timeline navigation");
551
+ const s = document.createElement("div");
552
+ s.className = "cloudimage-360-hotspot-timeline-track";
553
+ const l = document.createElement("div");
554
+ return l.className = "cloudimage-360-hotspot-timeline-indicator", n.forEach(({ id: r, frame: a, label: c }) => {
555
+ const h = ln(r, a, t, c);
556
+ s.appendChild(h);
557
+ }), s.appendChild(l), o.appendChild(s), e.appendChild(o), {
558
+ element: o,
559
+ indicator: l,
560
+ hotspotFrames: n
561
+ };
562
+ }, hn = (e, t, i) => {
563
+ if (!e) return;
564
+ const n = i > 1 ? t / (i - 1) * 100 : 0;
565
+ e.style.left = `${n}%`;
566
+ }, dn = (e) => {
567
+ e && e.classList.add("visible");
568
+ }, un = (e) => {
569
+ e && e.classList.remove("visible");
570
+ }, qt = (e, t = []) => {
571
+ if (!e) return t;
572
+ try {
573
+ return JSON.parse(e);
574
+ } catch (i) {
575
+ return console.warn("CloudImage 360: Failed to parse JSON:", i.message), t;
576
+ }
577
+ }, pn = (e, t) => {
578
+ const [i, n] = e.split("?");
579
+ if (!n) return e;
580
+ const o = new RegExp(`^${t}=|&${t}=`), s = n.split("&").filter((l) => !o.test(l)).join("&");
581
+ return s ? `${i}?${s}` : i;
582
+ }, fn = (e) => {
583
+ const t = pn(e, "width"), i = t.includes("?") ? "&" : "?";
584
+ return `${t}${i}width=${150 * devicePixelRatio}`;
585
+ }, mn = (e) => {
586
+ const t = {
587
+ root: null,
588
+ rootMargin: "0px",
589
+ threshold: 0.1
590
+ }, i = (o) => {
591
+ const s = o.getAttribute("data-src");
592
+ s && (o.src = s);
593
+ };
594
+ new IntersectionObserver((o, s) => {
595
+ o.forEach((l) => {
596
+ l.isIntersecting && (i(l.target), s.unobserve(l.target));
597
+ });
598
+ }, t).observe(e);
599
+ }, vn = (e, t) => {
600
+ const i = Be(1, t);
601
+ return e.replace("{index}", i);
602
+ }, gn = (e, t) => {
603
+ const [i] = e, n = /(https?):\/\//i.test(i);
604
+ return Ot({
605
+ ...t,
606
+ folder: n ? "" : t.folder,
607
+ filename: i
608
+ });
609
+ }, yn = (e, t) => {
610
+ const { imageList: i, indexZeroBase: n } = t;
611
+ if (i.length) {
612
+ const o = qt(i, null);
613
+ if (o)
614
+ return gn(o, t);
615
+ }
616
+ return vn(e, n);
617
+ }, Ie = (e, t, i) => {
618
+ const n = new Image();
619
+ return n.setAttribute(t ? "data-src" : "src", e), n.className = i, n.style.cssText = `
620
+ position: ${t ? "absolute" : "static"};
621
+ width: 100%;
622
+ inset: 0;
623
+ height: 100%;
624
+ object-fit: contain;
625
+ object-position: center;
626
+ filter: blur(10px);
627
+ `, n;
628
+ }, xe = (e, t, i) => {
629
+ const { innerBox: n, imageList: o, lazyload: s } = t || {}, [l] = o, r = l || yn(e, t), a = fn(r), c = Ie(a, s, "cloudimage-lazy"), h = Ie(a, !1, "cloudimage-360-placeholder"), p = (f) => {
630
+ Jt(n, ".cloudimage-lazy"), i && i({
631
+ event: f,
632
+ width: c.width,
633
+ height: c.height,
634
+ naturalWidth: c.naturalWidth,
635
+ naturalHeight: c.naturalHeight,
636
+ src: a
637
+ });
638
+ };
639
+ c.onload = p, n.appendChild(c), n.appendChild(h), mn(c);
640
+ }, bn = (e, t, i) => {
641
+ const n = new Image();
642
+ n.src = e, n.onload = (o) => {
643
+ t && t({
644
+ event: o,
645
+ width: n.width,
646
+ height: n.height,
647
+ naturalWidth: n.naturalWidth,
648
+ naturalHeight: n.naturalHeight,
649
+ src: e
650
+ });
651
+ }, n.onerror = (o) => {
652
+ const s = new Error(`Failed to load image: ${e}`);
653
+ s.url = e, s.event = o, i ? i(s) : console.error(s.message);
654
+ };
655
+ }, wn = (e, t) => {
656
+ const i = t.getBoundingClientRect(), n = e.touches ? e.touches[0].clientX : e.clientX, o = e.touches ? e.touches[0].clientY : e.clientY;
657
+ return {
658
+ x: n - i.left,
659
+ y: o - i.top
660
+ };
661
+ }, _t = (e, t, i) => {
662
+ const { container: n, w: o, h: s, zoom: l, bw: r, offsetX: a, offsetY: c } = t, h = wn(e, n);
663
+ let p = h.x, f = h.y;
664
+ p = Math.max(o / l, Math.min(p, n.offsetWidth - o / l)), f = Math.max(s / l, Math.min(f, n.offsetHeight - s / l)), i.style.left = `${p - o}px`, i.style.top = `${f - s}px`;
665
+ const u = (p - a) * l - o + r, I = (f - c) * l - s + r;
666
+ i.style.backgroundPosition = `-${u}px -${I}px`;
667
+ }, In = (e, t, i, n, o, s) => {
668
+ const { x: l = 0, y: r = 0 } = i || {}, a = (t.offsetWidth - l * 2) * s, c = (t.offsetHeight - r * 2) * s;
669
+ if (!o) return;
670
+ o.setAttribute("class", "cloudimage-360-img-magnifier-glass"), t.prepend(o), o.style.backgroundImage = `url('${n.src}')`, o.style.backgroundSize = `${a}px ${c}px`;
671
+ const h = 3, p = o.offsetWidth / 2, f = o.offsetHeight / 2, u = {
672
+ container: t,
673
+ w: p,
674
+ h: f,
675
+ zoom: s,
676
+ bw: h,
677
+ offsetX: l,
678
+ offsetY: r
679
+ };
680
+ _t(e, u, o);
681
+ const I = (v) => {
682
+ _t(v, u, o);
683
+ }, g = (v) => {
684
+ v.preventDefault(), _t(v, u, o);
685
+ };
686
+ o.addEventListener("mousemove", I), t.addEventListener("mousemove", I), t.addEventListener("touchmove", g);
687
+ }, xn = (e, t, i) => {
688
+ const { clientX: n, clientY: o } = e, s = t.getBoundingClientRect(), l = t.width / (s.width * i), r = t.height / (s.height * i), a = (n - s.left) * l, c = (o - s.top) * r;
689
+ return { offsetX: a, offsetY: c };
690
+ }, Ce = (e, { bottom: t, top: i }) => {
691
+ e ? t() : i();
692
+ }, Oe = (e, { left: t, right: i }) => {
693
+ e ? t() : i();
694
+ }, Cn = ({ autoplayBehavior: e, spinY: t, reversed: i, loopTriggers: n }) => {
695
+ switch (e) {
696
+ case M.SPIN_XY:
697
+ case M.SPIN_YX:
698
+ t ? Ce(i, n) : Oe(i, n);
699
+ break;
700
+ case M.SPIN_Y:
701
+ Ce(i, n);
702
+ break;
703
+ case M.SPIN_X:
704
+ default:
705
+ Oe(i, n);
706
+ }
707
+ }, On = ({
708
+ autoplayBehavior: e,
709
+ activeImageX: t,
710
+ activeImageY: i,
711
+ amountX: n,
712
+ amountY: o,
713
+ autoplayReverse: s
714
+ }) => {
715
+ const l = (r, a) => {
716
+ const c = a - 1;
717
+ return s ? r === 0 : r === c;
718
+ };
719
+ switch (e) {
720
+ case M.SPIN_XY:
721
+ case M.SPIN_Y:
722
+ return l(i, o);
723
+ case M.SPIN_X:
724
+ case M.SPIN_YX:
725
+ default:
726
+ return l(t, n);
727
+ }
728
+ }, En = ({
729
+ autoplayBehavior: e,
730
+ activeImageX: t,
731
+ activeImageY: i,
732
+ amountX: n,
733
+ amountY: o,
734
+ autoplayReverse: s,
735
+ spinDirection: l
736
+ }) => {
737
+ const r = t === (s ? 0 : n - 1), a = i === (s ? 0 : o - 1);
738
+ return e === M.SPIN_XY || e === M.SPIN_YX ? l === "x" && r || l === "y" && a : !1;
739
+ }, Sn = (e, t, i) => {
740
+ if (!i) return "x";
741
+ if (!t) return "y";
742
+ switch (e) {
743
+ case M.SPIN_XY:
744
+ return "x";
745
+ case M.SPIN_YX:
746
+ return "y";
747
+ case M.SPIN_Y:
748
+ return "y";
749
+ case M.SPIN_X:
750
+ default:
751
+ return "x";
752
+ }
753
+ }, An = (e) => e === "x" ? "y" : "x", Ee = (e, t) => {
754
+ const i = [...Ii];
755
+ return t ? [...i, ...xi].includes(e) : i.includes(e);
756
+ }, Se = ({ deltaX: e, deltaY: t, reversed: i, allowSpinX: n, allowSpinY: o, threshold: s = 0 }) => {
757
+ const l = n && !o || o && !n ? 0 : s, r = Math.abs(e), a = Math.abs(t);
758
+ return n && r - l > a ? i ? e > 0 ? "left" : "right" : e > 0 ? "right" : "left" : o && a - l > r ? i ? t > 0 ? "up" : "down" : t > 0 ? "down" : "up" : null;
759
+ }, Ln = () => "ontouchstart" in window || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0, kn = (e, t = 150) => {
760
+ let i;
761
+ return function(...n) {
762
+ clearTimeout(i), i = setTimeout(() => {
763
+ e.apply(this, n);
764
+ }, t);
765
+ };
766
+ }, Fe = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NvbnN0IHY9KHQsYSxlKT0+e2NvbnN0IHM9dC9lLG49YS9lO3JldHVybnt6b29tZWRXaWR0aDpzLHpvb21lZEhlaWdodDpufX0sej0oe3BvaW50ZXJYOnQscG9pbnRlclk6YSxpbWFnZURhdGE6ZSx6b29tZWRXaWR0aDpzLHpvb21lZEhlaWdodDpuLGRyYXdXaWR0aDppLGRyYXdIZWlnaHQ6Y30pPT57Y29uc3R7bmF0dXJhbFdpZHRoOmcsbmF0dXJhbEhlaWdodDp1fT1lO2xldCBmPXQvaSpnLXMvMixtPWEvYyp1LW4vMjtjb25zdCB4PU1hdGgubWF4KDAsZy1zKSxPPU1hdGgubWF4KDAsdS1uKTtyZXR1cm4gZj1NYXRoLm1heCgwLE1hdGgubWluKGYseCkpLG09TWF0aC5tYXgoMCxNYXRoLm1pbihtLE8pKSx7em9vbU9mZnNldFg6Zix6b29tT2Zmc2V0WTptfX07bGV0IG8saCxyLGQsbCx3O3NlbGYub25tZXNzYWdlPWFzeW5jIHQ9Pntjb25zdHthY3Rpb246YSxvZmZzY3JlZW46ZSxkZXZpY2VQaXhlbFJhdGlvOnMsaW1hZ2VEYXRhOm4sem9vbVNjYWxlOmkscG9pbnRlclg6Yyxwb2ludGVyWTpnLGltYWdlQXNwZWN0UmF0aW86dSxjb250YWluZXJXaWR0aDpmLGNvbnRhaW5lckhlaWdodDptfT10LmRhdGE7c3dpdGNoKGEpe2Nhc2UiaW5pdENhbnZhcyI6QyhlLHMpO2JyZWFrO2Nhc2UiYWRhcHRDYW52YXNTaXplIjpwKHUsZixtKTticmVhaztjYXNlImRyYXdJbWFnZU9uQ2FudmFzIjpJKG4saSxjLGcpO2JyZWFrfX07Y29uc3QgQz0odCxhKT0+e289dCxoPW8uZ2V0Q29udGV4dCgiMmQiKSxyPWF9LHA9KHQsYSxlKT0+e2NvbnN0IHM9YS9lO3c9dD5zLG8ud2lkdGg9YSpyLG8uaGVpZ2h0PWUqcixoLnNjYWxlKHIsciksdz8oZD1hLGw9YS90KToobD1lLGQ9ZSp0KSxoLmltYWdlU21vb3RoaW5nRW5hYmxlZD0hMCxoLmltYWdlU21vb3RoaW5nUXVhbGl0eT0iaGlnaCJ9LEk9KHQ9e30sYT0xLGU9MCxzPTApPT57Y29uc3R7Yml0bWFwSW1hZ2U6bn09dDtpZighb3x8IW4pcmV0dXJuO2xldCBpLGM7aWYodz8oaT0wLGM9KG8uaGVpZ2h0L3ItbCkvMik6KGk9KG8ud2lkdGgvci1kKS8yLGM9MCksaC5jbGVhclJlY3QoMCwwLG8ud2lkdGgsby5oZWlnaHQpLGEhPT0xKXtjb25zdHtuYXR1cmFsV2lkdGg6ZyxuYXR1cmFsSGVpZ2h0OnV9PXQse3pvb21lZFdpZHRoOmYsem9vbWVkSGVpZ2h0Om19PXYoZyx1LGEpLHt6b29tT2Zmc2V0WDp4LHpvb21PZmZzZXRZOk99PXooe3BvaW50ZXJYOmUscG9pbnRlclk6cyxpbWFnZURhdGE6dCx6b29tZWRXaWR0aDpmLHpvb21lZEhlaWdodDptLGRyYXdXaWR0aDpkLGRyYXdIZWlnaHQ6bH0pO2guZHJhd0ltYWdlKG4seCxPLGYsbSxpLGMsZCxsKX1lbHNlIGguZHJhd0ltYWdlKG4saSxjLGQsbCl9fSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2FudmFzLndvcmtlci1DZzBma3BEMS5qcy5tYXAK", Tn = (e) => Uint8Array.from(atob(e), (t) => t.charCodeAt(0)), Ae = typeof self < "u" && self.Blob && new Blob([Tn(Fe)], { type: "text/javascript;charset=utf-8" });
767
+ function Yn(e) {
768
+ let t;
769
+ try {
770
+ if (t = Ae && (self.URL || self.webkitURL).createObjectURL(Ae), !t) throw "";
771
+ const i = new Worker(t, {
772
+ name: e == null ? void 0 : e.name
773
+ });
774
+ return i.addEventListener("error", () => {
775
+ (self.URL || self.webkitURL).revokeObjectURL(t);
776
+ }), i;
777
+ } catch {
778
+ return new Worker(
779
+ "data:text/javascript;base64," + Fe,
780
+ {
781
+ name: e == null ? void 0 : e.name
782
+ }
783
+ );
784
+ } finally {
785
+ t && (self.URL || self.webkitURL).revokeObjectURL(t);
786
+ }
787
+ }
788
+ const Xn = /* @__PURE__ */ new Set([
789
+ // Basic HTML
790
+ "p",
791
+ "span",
792
+ "div",
793
+ "br",
794
+ "hr",
795
+ "strong",
796
+ "em",
797
+ "b",
798
+ "i",
799
+ "u",
800
+ "s",
801
+ "h1",
802
+ "h2",
803
+ "h3",
804
+ "h4",
805
+ "h5",
806
+ "h6",
807
+ "ul",
808
+ "ol",
809
+ "li",
810
+ "a",
811
+ "img",
812
+ "button",
813
+ "table",
814
+ "thead",
815
+ "tbody",
816
+ "tr",
817
+ "th",
818
+ "td",
819
+ "blockquote",
820
+ "pre",
821
+ "code",
822
+ "label",
823
+ "input",
824
+ "select",
825
+ "option",
826
+ "textarea",
827
+ // SVG elements
828
+ "svg",
829
+ "path",
830
+ "circle",
831
+ "rect",
832
+ "line",
833
+ "polyline",
834
+ "polygon",
835
+ "ellipse",
836
+ "g",
837
+ "text",
838
+ "tspan",
839
+ "defs",
840
+ "use",
841
+ "symbol",
842
+ "clippath",
843
+ "mask",
844
+ "lineargradient",
845
+ "radialgradient",
846
+ "stop"
847
+ ]), Le = {
848
+ a: ["href", "title", "target", "rel"],
849
+ img: ["src", "alt", "title", "width", "height"],
850
+ button: ["type", "disabled", "name", "value"],
851
+ input: ["type", "name", "value", "placeholder", "disabled", "readonly", "checked", "min", "max", "step"],
852
+ select: ["name", "disabled", "multiple"],
853
+ option: ["value", "disabled", "selected"],
854
+ textarea: ["name", "placeholder", "disabled", "readonly", "rows", "cols"],
855
+ label: ["for"],
856
+ // SVG attributes
857
+ svg: ["viewbox", "width", "height", "fill", "stroke", "xmlns", "preserveaspectratio"],
858
+ path: ["d", "fill", "stroke", "stroke-width", "stroke-linecap", "stroke-linejoin", "transform"],
859
+ circle: ["cx", "cy", "r", "fill", "stroke", "stroke-width"],
860
+ rect: ["x", "y", "width", "height", "rx", "ry", "fill", "stroke", "stroke-width"],
861
+ line: ["x1", "y1", "x2", "y2", "stroke", "stroke-width"],
862
+ polyline: ["points", "fill", "stroke", "stroke-width"],
863
+ polygon: ["points", "fill", "stroke", "stroke-width"],
864
+ ellipse: ["cx", "cy", "rx", "ry", "fill", "stroke", "stroke-width"],
865
+ g: ["transform", "fill", "stroke"],
866
+ text: ["x", "y", "dx", "dy", "text-anchor", "fill", "font-size", "font-family", "font-weight"],
867
+ tspan: ["x", "y", "dx", "dy"],
868
+ use: ["href", "xlink:href", "x", "y", "width", "height"],
869
+ lineargradient: ["id", "x1", "y1", "x2", "y2", "gradientunits"],
870
+ radialgradient: ["id", "cx", "cy", "r", "fx", "fy", "gradientunits"],
871
+ stop: ["offset", "stop-color", "stop-opacity"],
872
+ clippath: ["id"],
873
+ mask: ["id"],
874
+ "*": ["class", "id", "style"]
875
+ }, Pn = [
876
+ /javascript:/gi,
877
+ /vbscript:/gi,
878
+ /data:/gi,
879
+ /on\w+\s*=/gi
880
+ ], Rn = (e) => {
881
+ if (typeof e != "string")
882
+ return "";
883
+ const t = document.createElement("template");
884
+ t.innerHTML = e;
885
+ const i = (n) => {
886
+ if (Array.from(n.childNodes).forEach(i), n.nodeType === Node.ELEMENT_NODE) {
887
+ const s = n.tagName.toLowerCase();
888
+ if (!Xn.has(s)) {
889
+ if (s === "script" || s === "style") {
890
+ n.remove();
891
+ return;
892
+ }
893
+ const a = document.createTextNode(n.textContent);
894
+ n.parentNode.replaceChild(a, n);
895
+ return;
896
+ }
897
+ const l = [
898
+ ...Le[s] || [],
899
+ ...Le["*"] || []
900
+ ];
901
+ if (Array.from(n.attributes).forEach((a) => {
902
+ const c = a.name.toLowerCase();
903
+ if (c.startsWith("on")) {
904
+ n.removeAttribute(a.name);
905
+ return;
906
+ }
907
+ if (!l.includes(c)) {
908
+ n.removeAttribute(a.name);
909
+ return;
910
+ }
911
+ let h = a.value;
912
+ Pn.forEach((p) => {
913
+ p.test(h) && n.removeAttribute(a.name);
914
+ });
915
+ }), s === "a") {
916
+ const a = n.getAttribute("href");
917
+ a && (/^(https?:|mailto:|tel:|#|\/)/i.test(a.trim()) || n.removeAttribute("href")), n.getAttribute("target") === "_blank" && n.setAttribute("rel", "noopener noreferrer");
918
+ }
919
+ if (s === "img") {
920
+ const a = n.getAttribute("src");
921
+ a && (/^(https?:|\/|data:image\/)/i.test(a.trim()) || n.removeAttribute("src"));
922
+ }
923
+ }
924
+ };
925
+ return i(t.content), t.innerHTML;
926
+ }, Mn = (e) => e === "x" ? P.X : P.Y, Hn = (e, t, i) => e.filter(
927
+ (n) => Mn(n.orientation) === i && t in n.positions
928
+ ), Dn = (e, t) => {
929
+ const i = document.createElement("button");
930
+ return i.id = e, i.className = "cloudimage-360-hotspot", i.dataset.hotspotId = e, i.setAttribute("type", "button"), i.setAttribute("aria-label", t || `Hotspot ${e}`), i.setAttribute("aria-haspopup", "true"), i.setAttribute("aria-expanded", "false"), i;
931
+ }, Zn = (e) => {
932
+ const t = Object.entries(e).sort(([s], [l]) => Number(s) - Number(l));
933
+ let i = null, n = null;
934
+ const o = {};
935
+ for (const [s, l] of t)
936
+ if (!l)
937
+ o[s] = { x: i, y: n };
938
+ else {
939
+ const { x: r, y: a } = l;
940
+ r != null && (i = r), a != null && (n = a), o[s] = {
941
+ x: r || i,
942
+ y: a || n
943
+ };
944
+ }
945
+ return o;
946
+ }, Bn = (e) => [
947
+ {
948
+ name: "offset",
949
+ options: {
950
+ offset: [0, 10]
951
+ }
952
+ },
953
+ {
954
+ name: "preventOverflow",
955
+ options: {
956
+ boundary: e
957
+ }
958
+ }
959
+ ], Wn = (e, t) => {
960
+ const i = document.createElement("div");
961
+ return i.className = "cloudimage-360-popper", i.id = `cloudimage-360-popper-${t}`, i.dataset.popperId = t, i.setAttribute("role", "tooltip"), i.setAttribute("aria-hidden", "false"), typeof e == "string" && /<\/?[a-z][\s\S]*>/i.test(e) ? i.innerHTML = Rn(e) : i.textContent = e, document.body.appendChild(i), i;
962
+ }, Fn = (e) => {
963
+ const t = [...e];
964
+ return t.forEach((i, n) => {
965
+ const o = { ...Zn(i.positions) };
966
+ t[n].initialPositions = o, t[n].positions = o;
967
+ }), t;
968
+ }, Nn = ({
969
+ newWidth: e,
970
+ newHeight: t,
971
+ initialContainerSize: i,
972
+ imageAspectRatio: n,
973
+ hotspotsConfig: o
974
+ }) => {
975
+ const [s, l] = i;
976
+ let r = e, a = t, c = 0, h = 0;
977
+ const p = e / t;
978
+ n > p ? (a = e / n, h = (t - a) / 2) : (r = t * n, c = (e - r) / 2);
979
+ const u = r / s, I = a / l;
980
+ return o.map((g) => {
981
+ const v = {};
982
+ return Object.entries(g.initialPositions).forEach(([m, b]) => {
983
+ v[m] = {
984
+ x: b.x * u + c,
985
+ y: b.y * I + h
986
+ };
987
+ }), { ...g, positions: v };
988
+ });
989
+ };
990
+ var H = "top", F = "bottom", N = "right", D = "left", ee = "auto", kt = [H, F, N, D], ut = "start", At = "end", Vn = "clippingParents", Ne = "viewport", Ct = "popper", jn = "reference", ke = /* @__PURE__ */ kt.reduce(function(e, t) {
991
+ return e.concat([t + "-" + ut, t + "-" + At]);
992
+ }, []), Ve = /* @__PURE__ */ [].concat(kt, [ee]).reduce(function(e, t) {
993
+ return e.concat([t, t + "-" + ut, t + "-" + At]);
994
+ }, []), $n = "beforeRead", zn = "read", Gn = "afterRead", Un = "beforeMain", Kn = "main", _n = "afterMain", Jn = "beforeWrite", qn = "write", Qn = "afterWrite", to = [$n, zn, Gn, Un, Kn, _n, Jn, qn, Qn];
995
+ function $(e) {
996
+ return e ? (e.nodeName || "").toLowerCase() : null;
997
+ }
998
+ function B(e) {
999
+ if (e == null)
1000
+ return window;
1001
+ if (e.toString() !== "[object Window]") {
1002
+ var t = e.ownerDocument;
1003
+ return t && t.defaultView || window;
1004
+ }
1005
+ return e;
1006
+ }
1007
+ function st(e) {
1008
+ var t = B(e).Element;
1009
+ return e instanceof t || e instanceof Element;
1010
+ }
1011
+ function W(e) {
1012
+ var t = B(e).HTMLElement;
1013
+ return e instanceof t || e instanceof HTMLElement;
1014
+ }
1015
+ function ie(e) {
1016
+ if (typeof ShadowRoot > "u")
1017
+ return !1;
1018
+ var t = B(e).ShadowRoot;
1019
+ return e instanceof t || e instanceof ShadowRoot;
1020
+ }
1021
+ function eo(e) {
1022
+ var t = e.state;
1023
+ Object.keys(t.elements).forEach(function(i) {
1024
+ var n = t.styles[i] || {}, o = t.attributes[i] || {}, s = t.elements[i];
1025
+ !W(s) || !$(s) || (Object.assign(s.style, n), Object.keys(o).forEach(function(l) {
1026
+ var r = o[l];
1027
+ r === !1 ? s.removeAttribute(l) : s.setAttribute(l, r === !0 ? "" : r);
1028
+ }));
1029
+ });
1030
+ }
1031
+ function io(e) {
1032
+ var t = e.state, i = {
1033
+ popper: {
1034
+ position: t.options.strategy,
1035
+ left: "0",
1036
+ top: "0",
1037
+ margin: "0"
1038
+ },
1039
+ arrow: {
1040
+ position: "absolute"
1041
+ },
1042
+ reference: {}
1043
+ };
1044
+ return Object.assign(t.elements.popper.style, i.popper), t.styles = i, t.elements.arrow && Object.assign(t.elements.arrow.style, i.arrow), function() {
1045
+ Object.keys(t.elements).forEach(function(n) {
1046
+ var o = t.elements[n], s = t.attributes[n] || {}, l = Object.keys(t.styles.hasOwnProperty(n) ? t.styles[n] : i[n]), r = l.reduce(function(a, c) {
1047
+ return a[c] = "", a;
1048
+ }, {});
1049
+ !W(o) || !$(o) || (Object.assign(o.style, r), Object.keys(s).forEach(function(a) {
1050
+ o.removeAttribute(a);
1051
+ }));
1052
+ });
1053
+ };
1054
+ }
1055
+ const no = {
1056
+ name: "applyStyles",
1057
+ enabled: !0,
1058
+ phase: "write",
1059
+ fn: eo,
1060
+ effect: io,
1061
+ requires: ["computeStyles"]
1062
+ };
1063
+ function j(e) {
1064
+ return e.split("-")[0];
1065
+ }
1066
+ var ot = Math.max, Wt = Math.min, pt = Math.round;
1067
+ function Qt() {
1068
+ var e = navigator.userAgentData;
1069
+ return e != null && e.brands && Array.isArray(e.brands) ? e.brands.map(function(t) {
1070
+ return t.brand + "/" + t.version;
1071
+ }).join(" ") : navigator.userAgent;
1072
+ }
1073
+ function je() {
1074
+ return !/^((?!chrome|android).)*safari/i.test(Qt());
1075
+ }
1076
+ function ft(e, t, i) {
1077
+ t === void 0 && (t = !1), i === void 0 && (i = !1);
1078
+ var n = e.getBoundingClientRect(), o = 1, s = 1;
1079
+ t && W(e) && (o = e.offsetWidth > 0 && pt(n.width) / e.offsetWidth || 1, s = e.offsetHeight > 0 && pt(n.height) / e.offsetHeight || 1);
1080
+ var l = st(e) ? B(e) : window, r = l.visualViewport, a = !je() && i, c = (n.left + (a && r ? r.offsetLeft : 0)) / o, h = (n.top + (a && r ? r.offsetTop : 0)) / s, p = n.width / o, f = n.height / s;
1081
+ return {
1082
+ width: p,
1083
+ height: f,
1084
+ top: h,
1085
+ right: c + p,
1086
+ bottom: h + f,
1087
+ left: c,
1088
+ x: c,
1089
+ y: h
1090
+ };
1091
+ }
1092
+ function ne(e) {
1093
+ var t = ft(e), i = e.offsetWidth, n = e.offsetHeight;
1094
+ return Math.abs(t.width - i) <= 1 && (i = t.width), Math.abs(t.height - n) <= 1 && (n = t.height), {
1095
+ x: e.offsetLeft,
1096
+ y: e.offsetTop,
1097
+ width: i,
1098
+ height: n
1099
+ };
1100
+ }
1101
+ function $e(e, t) {
1102
+ var i = t.getRootNode && t.getRootNode();
1103
+ if (e.contains(t))
1104
+ return !0;
1105
+ if (i && ie(i)) {
1106
+ var n = t;
1107
+ do {
1108
+ if (n && e.isSameNode(n))
1109
+ return !0;
1110
+ n = n.parentNode || n.host;
1111
+ } while (n);
1112
+ }
1113
+ return !1;
1114
+ }
1115
+ function J(e) {
1116
+ return B(e).getComputedStyle(e);
1117
+ }
1118
+ function oo(e) {
1119
+ return ["table", "td", "th"].indexOf($(e)) >= 0;
1120
+ }
1121
+ function Q(e) {
1122
+ return ((st(e) ? e.ownerDocument : (
1123
+ // $FlowFixMe[prop-missing]
1124
+ e.document
1125
+ )) || window.document).documentElement;
1126
+ }
1127
+ function Nt(e) {
1128
+ return $(e) === "html" ? e : (
1129
+ // this is a quicker (but less type safe) way to save quite some bytes from the bundle
1130
+ // $FlowFixMe[incompatible-return]
1131
+ // $FlowFixMe[prop-missing]
1132
+ e.assignedSlot || // step into the shadow DOM of the parent of a slotted node
1133
+ e.parentNode || // DOM Element detected
1134
+ (ie(e) ? e.host : null) || // ShadowRoot detected
1135
+ // $FlowFixMe[incompatible-call]: HTMLElement is a Node
1136
+ Q(e)
1137
+ );
1138
+ }
1139
+ function Te(e) {
1140
+ return !W(e) || // https://github.com/popperjs/popper-core/issues/837
1141
+ J(e).position === "fixed" ? null : e.offsetParent;
1142
+ }
1143
+ function so(e) {
1144
+ var t = /firefox/i.test(Qt()), i = /Trident/i.test(Qt());
1145
+ if (i && W(e)) {
1146
+ var n = J(e);
1147
+ if (n.position === "fixed")
1148
+ return null;
1149
+ }
1150
+ var o = Nt(e);
1151
+ for (ie(o) && (o = o.host); W(o) && ["html", "body"].indexOf($(o)) < 0; ) {
1152
+ var s = J(o);
1153
+ if (s.transform !== "none" || s.perspective !== "none" || s.contain === "paint" || ["transform", "perspective"].indexOf(s.willChange) !== -1 || t && s.willChange === "filter" || t && s.filter && s.filter !== "none")
1154
+ return o;
1155
+ o = o.parentNode;
1156
+ }
1157
+ return null;
1158
+ }
1159
+ function Tt(e) {
1160
+ for (var t = B(e), i = Te(e); i && oo(i) && J(i).position === "static"; )
1161
+ i = Te(i);
1162
+ return i && ($(i) === "html" || $(i) === "body" && J(i).position === "static") ? t : i || so(e) || t;
1163
+ }
1164
+ function oe(e) {
1165
+ return ["top", "bottom"].indexOf(e) >= 0 ? "x" : "y";
1166
+ }
1167
+ function Et(e, t, i) {
1168
+ return ot(e, Wt(t, i));
1169
+ }
1170
+ function ro(e, t, i) {
1171
+ var n = Et(e, t, i);
1172
+ return n > i ? i : n;
1173
+ }
1174
+ function ze() {
1175
+ return {
1176
+ top: 0,
1177
+ right: 0,
1178
+ bottom: 0,
1179
+ left: 0
1180
+ };
1181
+ }
1182
+ function Ge(e) {
1183
+ return Object.assign({}, ze(), e);
1184
+ }
1185
+ function Ue(e, t) {
1186
+ return t.reduce(function(i, n) {
1187
+ return i[n] = e, i;
1188
+ }, {});
1189
+ }
1190
+ var ao = function(t, i) {
1191
+ return t = typeof t == "function" ? t(Object.assign({}, i.rects, {
1192
+ placement: i.placement
1193
+ })) : t, Ge(typeof t != "number" ? t : Ue(t, kt));
1194
+ };
1195
+ function lo(e) {
1196
+ var t, i = e.state, n = e.name, o = e.options, s = i.elements.arrow, l = i.modifiersData.popperOffsets, r = j(i.placement), a = oe(r), c = [D, N].indexOf(r) >= 0, h = c ? "height" : "width";
1197
+ if (!(!s || !l)) {
1198
+ var p = ao(o.padding, i), f = ne(s), u = a === "y" ? H : D, I = a === "y" ? F : N, g = i.rects.reference[h] + i.rects.reference[a] - l[a] - i.rects.popper[h], v = l[a] - i.rects.reference[a], m = Tt(s), b = m ? a === "y" ? m.clientHeight || 0 : m.clientWidth || 0 : 0, x = g / 2 - v / 2, w = p[u], C = b - f[h] - p[I], y = b / 2 - f[h] / 2 + x, O = Et(w, y, C), S = a;
1199
+ i.modifiersData[n] = (t = {}, t[S] = O, t.centerOffset = O - y, t);
1200
+ }
1201
+ }
1202
+ function co(e) {
1203
+ var t = e.state, i = e.options, n = i.element, o = n === void 0 ? "[data-popper-arrow]" : n;
1204
+ o != null && (typeof o == "string" && (o = t.elements.popper.querySelector(o), !o) || $e(t.elements.popper, o) && (t.elements.arrow = o));
1205
+ }
1206
+ const ho = {
1207
+ name: "arrow",
1208
+ enabled: !0,
1209
+ phase: "main",
1210
+ fn: lo,
1211
+ effect: co,
1212
+ requires: ["popperOffsets"],
1213
+ requiresIfExists: ["preventOverflow"]
1214
+ };
1215
+ function mt(e) {
1216
+ return e.split("-")[1];
1217
+ }
1218
+ var uo = {
1219
+ top: "auto",
1220
+ right: "auto",
1221
+ bottom: "auto",
1222
+ left: "auto"
1223
+ };
1224
+ function po(e, t) {
1225
+ var i = e.x, n = e.y, o = t.devicePixelRatio || 1;
1226
+ return {
1227
+ x: pt(i * o) / o || 0,
1228
+ y: pt(n * o) / o || 0
1229
+ };
1230
+ }
1231
+ function Ye(e) {
1232
+ var t, i = e.popper, n = e.popperRect, o = e.placement, s = e.variation, l = e.offsets, r = e.position, a = e.gpuAcceleration, c = e.adaptive, h = e.roundOffsets, p = e.isFixed, f = l.x, u = f === void 0 ? 0 : f, I = l.y, g = I === void 0 ? 0 : I, v = typeof h == "function" ? h({
1233
+ x: u,
1234
+ y: g
1235
+ }) : {
1236
+ x: u,
1237
+ y: g
1238
+ };
1239
+ u = v.x, g = v.y;
1240
+ var m = l.hasOwnProperty("x"), b = l.hasOwnProperty("y"), x = D, w = H, C = window;
1241
+ if (c) {
1242
+ var y = Tt(i), O = "clientHeight", S = "clientWidth";
1243
+ if (y === B(i) && (y = Q(i), J(y).position !== "static" && r === "absolute" && (O = "scrollHeight", S = "scrollWidth")), y = y, o === H || (o === D || o === N) && s === At) {
1244
+ w = F;
1245
+ var E = p && y === C && C.visualViewport ? C.visualViewport.height : (
1246
+ // $FlowFixMe[prop-missing]
1247
+ y[O]
1248
+ );
1249
+ g -= E - n.height, g *= a ? 1 : -1;
1250
+ }
1251
+ if (o === D || (o === H || o === F) && s === At) {
1252
+ x = N;
1253
+ var A = p && y === C && C.visualViewport ? C.visualViewport.width : (
1254
+ // $FlowFixMe[prop-missing]
1255
+ y[S]
1256
+ );
1257
+ u -= A - n.width, u *= a ? 1 : -1;
1258
+ }
1259
+ }
1260
+ var L = Object.assign({
1261
+ position: r
1262
+ }, c && uo), R = h === !0 ? po({
1263
+ x: u,
1264
+ y: g
1265
+ }, B(i)) : {
1266
+ x: u,
1267
+ y: g
1268
+ };
1269
+ if (u = R.x, g = R.y, a) {
1270
+ var T;
1271
+ return Object.assign({}, L, (T = {}, T[w] = b ? "0" : "", T[x] = m ? "0" : "", T.transform = (C.devicePixelRatio || 1) <= 1 ? "translate(" + u + "px, " + g + "px)" : "translate3d(" + u + "px, " + g + "px, 0)", T));
1272
+ }
1273
+ return Object.assign({}, L, (t = {}, t[w] = b ? g + "px" : "", t[x] = m ? u + "px" : "", t.transform = "", t));
1274
+ }
1275
+ function fo(e) {
1276
+ var t = e.state, i = e.options, n = i.gpuAcceleration, o = n === void 0 ? !0 : n, s = i.adaptive, l = s === void 0 ? !0 : s, r = i.roundOffsets, a = r === void 0 ? !0 : r, c = {
1277
+ placement: j(t.placement),
1278
+ variation: mt(t.placement),
1279
+ popper: t.elements.popper,
1280
+ popperRect: t.rects.popper,
1281
+ gpuAcceleration: o,
1282
+ isFixed: t.options.strategy === "fixed"
1283
+ };
1284
+ t.modifiersData.popperOffsets != null && (t.styles.popper = Object.assign({}, t.styles.popper, Ye(Object.assign({}, c, {
1285
+ offsets: t.modifiersData.popperOffsets,
1286
+ position: t.options.strategy,
1287
+ adaptive: l,
1288
+ roundOffsets: a
1289
+ })))), t.modifiersData.arrow != null && (t.styles.arrow = Object.assign({}, t.styles.arrow, Ye(Object.assign({}, c, {
1290
+ offsets: t.modifiersData.arrow,
1291
+ position: "absolute",
1292
+ adaptive: !1,
1293
+ roundOffsets: a
1294
+ })))), t.attributes.popper = Object.assign({}, t.attributes.popper, {
1295
+ "data-popper-placement": t.placement
1296
+ });
1297
+ }
1298
+ const mo = {
1299
+ name: "computeStyles",
1300
+ enabled: !0,
1301
+ phase: "beforeWrite",
1302
+ fn: fo,
1303
+ data: {}
1304
+ };
1305
+ var Dt = {
1306
+ passive: !0
1307
+ };
1308
+ function vo(e) {
1309
+ var t = e.state, i = e.instance, n = e.options, o = n.scroll, s = o === void 0 ? !0 : o, l = n.resize, r = l === void 0 ? !0 : l, a = B(t.elements.popper), c = [].concat(t.scrollParents.reference, t.scrollParents.popper);
1310
+ return s && c.forEach(function(h) {
1311
+ h.addEventListener("scroll", i.update, Dt);
1312
+ }), r && a.addEventListener("resize", i.update, Dt), function() {
1313
+ s && c.forEach(function(h) {
1314
+ h.removeEventListener("scroll", i.update, Dt);
1315
+ }), r && a.removeEventListener("resize", i.update, Dt);
1316
+ };
1317
+ }
1318
+ const go = {
1319
+ name: "eventListeners",
1320
+ enabled: !0,
1321
+ phase: "write",
1322
+ fn: function() {
1323
+ },
1324
+ effect: vo,
1325
+ data: {}
1326
+ };
1327
+ var yo = {
1328
+ left: "right",
1329
+ right: "left",
1330
+ bottom: "top",
1331
+ top: "bottom"
1332
+ };
1333
+ function Zt(e) {
1334
+ return e.replace(/left|right|bottom|top/g, function(t) {
1335
+ return yo[t];
1336
+ });
1337
+ }
1338
+ var bo = {
1339
+ start: "end",
1340
+ end: "start"
1341
+ };
1342
+ function Xe(e) {
1343
+ return e.replace(/start|end/g, function(t) {
1344
+ return bo[t];
1345
+ });
1346
+ }
1347
+ function se(e) {
1348
+ var t = B(e), i = t.pageXOffset, n = t.pageYOffset;
1349
+ return {
1350
+ scrollLeft: i,
1351
+ scrollTop: n
1352
+ };
1353
+ }
1354
+ function re(e) {
1355
+ return ft(Q(e)).left + se(e).scrollLeft;
1356
+ }
1357
+ function wo(e, t) {
1358
+ var i = B(e), n = Q(e), o = i.visualViewport, s = n.clientWidth, l = n.clientHeight, r = 0, a = 0;
1359
+ if (o) {
1360
+ s = o.width, l = o.height;
1361
+ var c = je();
1362
+ (c || !c && t === "fixed") && (r = o.offsetLeft, a = o.offsetTop);
1363
+ }
1364
+ return {
1365
+ width: s,
1366
+ height: l,
1367
+ x: r + re(e),
1368
+ y: a
1369
+ };
1370
+ }
1371
+ function Io(e) {
1372
+ var t, i = Q(e), n = se(e), o = (t = e.ownerDocument) == null ? void 0 : t.body, s = ot(i.scrollWidth, i.clientWidth, o ? o.scrollWidth : 0, o ? o.clientWidth : 0), l = ot(i.scrollHeight, i.clientHeight, o ? o.scrollHeight : 0, o ? o.clientHeight : 0), r = -n.scrollLeft + re(e), a = -n.scrollTop;
1373
+ return J(o || i).direction === "rtl" && (r += ot(i.clientWidth, o ? o.clientWidth : 0) - s), {
1374
+ width: s,
1375
+ height: l,
1376
+ x: r,
1377
+ y: a
1378
+ };
1379
+ }
1380
+ function ae(e) {
1381
+ var t = J(e), i = t.overflow, n = t.overflowX, o = t.overflowY;
1382
+ return /auto|scroll|overlay|hidden/.test(i + o + n);
1383
+ }
1384
+ function Ke(e) {
1385
+ return ["html", "body", "#document"].indexOf($(e)) >= 0 ? e.ownerDocument.body : W(e) && ae(e) ? e : Ke(Nt(e));
1386
+ }
1387
+ function St(e, t) {
1388
+ var i;
1389
+ t === void 0 && (t = []);
1390
+ var n = Ke(e), o = n === ((i = e.ownerDocument) == null ? void 0 : i.body), s = B(n), l = o ? [s].concat(s.visualViewport || [], ae(n) ? n : []) : n, r = t.concat(l);
1391
+ return o ? r : (
1392
+ // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here
1393
+ r.concat(St(Nt(l)))
1394
+ );
1395
+ }
1396
+ function te(e) {
1397
+ return Object.assign({}, e, {
1398
+ left: e.x,
1399
+ top: e.y,
1400
+ right: e.x + e.width,
1401
+ bottom: e.y + e.height
1402
+ });
1403
+ }
1404
+ function xo(e, t) {
1405
+ var i = ft(e, !1, t === "fixed");
1406
+ return i.top = i.top + e.clientTop, i.left = i.left + e.clientLeft, i.bottom = i.top + e.clientHeight, i.right = i.left + e.clientWidth, i.width = e.clientWidth, i.height = e.clientHeight, i.x = i.left, i.y = i.top, i;
1407
+ }
1408
+ function Pe(e, t, i) {
1409
+ return t === Ne ? te(wo(e, i)) : st(t) ? xo(t, i) : te(Io(Q(e)));
1410
+ }
1411
+ function Co(e) {
1412
+ var t = St(Nt(e)), i = ["absolute", "fixed"].indexOf(J(e).position) >= 0, n = i && W(e) ? Tt(e) : e;
1413
+ return st(n) ? t.filter(function(o) {
1414
+ return st(o) && $e(o, n) && $(o) !== "body";
1415
+ }) : [];
1416
+ }
1417
+ function Oo(e, t, i, n) {
1418
+ var o = t === "clippingParents" ? Co(e) : [].concat(t), s = [].concat(o, [i]), l = s[0], r = s.reduce(function(a, c) {
1419
+ var h = Pe(e, c, n);
1420
+ return a.top = ot(h.top, a.top), a.right = Wt(h.right, a.right), a.bottom = Wt(h.bottom, a.bottom), a.left = ot(h.left, a.left), a;
1421
+ }, Pe(e, l, n));
1422
+ return r.width = r.right - r.left, r.height = r.bottom - r.top, r.x = r.left, r.y = r.top, r;
1423
+ }
1424
+ function _e(e) {
1425
+ var t = e.reference, i = e.element, n = e.placement, o = n ? j(n) : null, s = n ? mt(n) : null, l = t.x + t.width / 2 - i.width / 2, r = t.y + t.height / 2 - i.height / 2, a;
1426
+ switch (o) {
1427
+ case H:
1428
+ a = {
1429
+ x: l,
1430
+ y: t.y - i.height
1431
+ };
1432
+ break;
1433
+ case F:
1434
+ a = {
1435
+ x: l,
1436
+ y: t.y + t.height
1437
+ };
1438
+ break;
1439
+ case N:
1440
+ a = {
1441
+ x: t.x + t.width,
1442
+ y: r
1443
+ };
1444
+ break;
1445
+ case D:
1446
+ a = {
1447
+ x: t.x - i.width,
1448
+ y: r
1449
+ };
1450
+ break;
1451
+ default:
1452
+ a = {
1453
+ x: t.x,
1454
+ y: t.y
1455
+ };
1456
+ }
1457
+ var c = o ? oe(o) : null;
1458
+ if (c != null) {
1459
+ var h = c === "y" ? "height" : "width";
1460
+ switch (s) {
1461
+ case ut:
1462
+ a[c] = a[c] - (t[h] / 2 - i[h] / 2);
1463
+ break;
1464
+ case At:
1465
+ a[c] = a[c] + (t[h] / 2 - i[h] / 2);
1466
+ break;
1467
+ }
1468
+ }
1469
+ return a;
1470
+ }
1471
+ function Lt(e, t) {
1472
+ t === void 0 && (t = {});
1473
+ var i = t, n = i.placement, o = n === void 0 ? e.placement : n, s = i.strategy, l = s === void 0 ? e.strategy : s, r = i.boundary, a = r === void 0 ? Vn : r, c = i.rootBoundary, h = c === void 0 ? Ne : c, p = i.elementContext, f = p === void 0 ? Ct : p, u = i.altBoundary, I = u === void 0 ? !1 : u, g = i.padding, v = g === void 0 ? 0 : g, m = Ge(typeof v != "number" ? v : Ue(v, kt)), b = f === Ct ? jn : Ct, x = e.rects.popper, w = e.elements[I ? b : f], C = Oo(st(w) ? w : w.contextElement || Q(e.elements.popper), a, h, l), y = ft(e.elements.reference), O = _e({
1474
+ reference: y,
1475
+ element: x,
1476
+ placement: o
1477
+ }), S = te(Object.assign({}, x, O)), E = f === Ct ? S : y, A = {
1478
+ top: C.top - E.top + m.top,
1479
+ bottom: E.bottom - C.bottom + m.bottom,
1480
+ left: C.left - E.left + m.left,
1481
+ right: E.right - C.right + m.right
1482
+ }, L = e.modifiersData.offset;
1483
+ if (f === Ct && L) {
1484
+ var R = L[o];
1485
+ Object.keys(A).forEach(function(T) {
1486
+ var z = [N, F].indexOf(T) >= 0 ? 1 : -1, G = [H, F].indexOf(T) >= 0 ? "y" : "x";
1487
+ A[T] += R[G] * z;
1488
+ });
1489
+ }
1490
+ return A;
1491
+ }
1492
+ function Eo(e, t) {
1493
+ t === void 0 && (t = {});
1494
+ var i = t, n = i.placement, o = i.boundary, s = i.rootBoundary, l = i.padding, r = i.flipVariations, a = i.allowedAutoPlacements, c = a === void 0 ? Ve : a, h = mt(n), p = h ? r ? ke : ke.filter(function(I) {
1495
+ return mt(I) === h;
1496
+ }) : kt, f = p.filter(function(I) {
1497
+ return c.indexOf(I) >= 0;
1498
+ });
1499
+ f.length === 0 && (f = p);
1500
+ var u = f.reduce(function(I, g) {
1501
+ return I[g] = Lt(e, {
1502
+ placement: g,
1503
+ boundary: o,
1504
+ rootBoundary: s,
1505
+ padding: l
1506
+ })[j(g)], I;
1507
+ }, {});
1508
+ return Object.keys(u).sort(function(I, g) {
1509
+ return u[I] - u[g];
1510
+ });
1511
+ }
1512
+ function So(e) {
1513
+ if (j(e) === ee)
1514
+ return [];
1515
+ var t = Zt(e);
1516
+ return [Xe(e), t, Xe(t)];
1517
+ }
1518
+ function Ao(e) {
1519
+ var t = e.state, i = e.options, n = e.name;
1520
+ if (!t.modifiersData[n]._skip) {
1521
+ for (var o = i.mainAxis, s = o === void 0 ? !0 : o, l = i.altAxis, r = l === void 0 ? !0 : l, a = i.fallbackPlacements, c = i.padding, h = i.boundary, p = i.rootBoundary, f = i.altBoundary, u = i.flipVariations, I = u === void 0 ? !0 : u, g = i.allowedAutoPlacements, v = t.options.placement, m = j(v), b = m === v, x = a || (b || !I ? [Zt(v)] : So(v)), w = [v].concat(x).reduce(function(q, V) {
1522
+ return q.concat(j(V) === ee ? Eo(t, {
1523
+ placement: V,
1524
+ boundary: h,
1525
+ rootBoundary: p,
1526
+ padding: c,
1527
+ flipVariations: I,
1528
+ allowedAutoPlacements: g
1529
+ }) : V);
1530
+ }, []), C = t.rects.reference, y = t.rects.popper, O = /* @__PURE__ */ new Map(), S = !0, E = w[0], A = 0; A < w.length; A++) {
1531
+ var L = w[A], R = j(L), T = mt(L) === ut, z = [H, F].indexOf(R) >= 0, G = z ? "width" : "height", Y = Lt(t, {
1532
+ placement: L,
1533
+ boundary: h,
1534
+ rootBoundary: p,
1535
+ altBoundary: f,
1536
+ padding: c
1537
+ }), Z = z ? T ? N : D : T ? F : H;
1538
+ C[G] > y[G] && (Z = Zt(Z));
1539
+ var rt = Zt(Z), U = [];
1540
+ if (s && U.push(Y[R] <= 0), r && U.push(Y[Z] <= 0, Y[rt] <= 0), U.every(function(q) {
1541
+ return q;
1542
+ })) {
1543
+ E = L, S = !1;
1544
+ break;
1545
+ }
1546
+ O.set(L, U);
1547
+ }
1548
+ if (S)
1549
+ for (var at = I ? 3 : 1, vt = function(V) {
1550
+ var et = w.find(function(it) {
1551
+ var K = O.get(it);
1552
+ if (K)
1553
+ return K.slice(0, V).every(function(gt) {
1554
+ return gt;
1555
+ });
1556
+ });
1557
+ if (et)
1558
+ return E = et, "break";
1559
+ }, tt = at; tt > 0; tt--) {
1560
+ var lt = vt(tt);
1561
+ if (lt === "break") break;
1562
+ }
1563
+ t.placement !== E && (t.modifiersData[n]._skip = !0, t.placement = E, t.reset = !0);
1564
+ }
1565
+ }
1566
+ const Lo = {
1567
+ name: "flip",
1568
+ enabled: !0,
1569
+ phase: "main",
1570
+ fn: Ao,
1571
+ requiresIfExists: ["offset"],
1572
+ data: {
1573
+ _skip: !1
1574
+ }
1575
+ };
1576
+ function Re(e, t, i) {
1577
+ return i === void 0 && (i = {
1578
+ x: 0,
1579
+ y: 0
1580
+ }), {
1581
+ top: e.top - t.height - i.y,
1582
+ right: e.right - t.width + i.x,
1583
+ bottom: e.bottom - t.height + i.y,
1584
+ left: e.left - t.width - i.x
1585
+ };
1586
+ }
1587
+ function Me(e) {
1588
+ return [H, N, F, D].some(function(t) {
1589
+ return e[t] >= 0;
1590
+ });
1591
+ }
1592
+ function ko(e) {
1593
+ var t = e.state, i = e.name, n = t.rects.reference, o = t.rects.popper, s = t.modifiersData.preventOverflow, l = Lt(t, {
1594
+ elementContext: "reference"
1595
+ }), r = Lt(t, {
1596
+ altBoundary: !0
1597
+ }), a = Re(l, n), c = Re(r, o, s), h = Me(a), p = Me(c);
1598
+ t.modifiersData[i] = {
1599
+ referenceClippingOffsets: a,
1600
+ popperEscapeOffsets: c,
1601
+ isReferenceHidden: h,
1602
+ hasPopperEscaped: p
1603
+ }, t.attributes.popper = Object.assign({}, t.attributes.popper, {
1604
+ "data-popper-reference-hidden": h,
1605
+ "data-popper-escaped": p
1606
+ });
1607
+ }
1608
+ const To = {
1609
+ name: "hide",
1610
+ enabled: !0,
1611
+ phase: "main",
1612
+ requiresIfExists: ["preventOverflow"],
1613
+ fn: ko
1614
+ };
1615
+ function Yo(e, t, i) {
1616
+ var n = j(e), o = [D, H].indexOf(n) >= 0 ? -1 : 1, s = typeof i == "function" ? i(Object.assign({}, t, {
1617
+ placement: e
1618
+ })) : i, l = s[0], r = s[1];
1619
+ return l = l || 0, r = (r || 0) * o, [D, N].indexOf(n) >= 0 ? {
1620
+ x: r,
1621
+ y: l
1622
+ } : {
1623
+ x: l,
1624
+ y: r
1625
+ };
1626
+ }
1627
+ function Xo(e) {
1628
+ var t = e.state, i = e.options, n = e.name, o = i.offset, s = o === void 0 ? [0, 0] : o, l = Ve.reduce(function(h, p) {
1629
+ return h[p] = Yo(p, t.rects, s), h;
1630
+ }, {}), r = l[t.placement], a = r.x, c = r.y;
1631
+ t.modifiersData.popperOffsets != null && (t.modifiersData.popperOffsets.x += a, t.modifiersData.popperOffsets.y += c), t.modifiersData[n] = l;
1632
+ }
1633
+ const Po = {
1634
+ name: "offset",
1635
+ enabled: !0,
1636
+ phase: "main",
1637
+ requires: ["popperOffsets"],
1638
+ fn: Xo
1639
+ };
1640
+ function Ro(e) {
1641
+ var t = e.state, i = e.name;
1642
+ t.modifiersData[i] = _e({
1643
+ reference: t.rects.reference,
1644
+ element: t.rects.popper,
1645
+ placement: t.placement
1646
+ });
1647
+ }
1648
+ const Mo = {
1649
+ name: "popperOffsets",
1650
+ enabled: !0,
1651
+ phase: "read",
1652
+ fn: Ro,
1653
+ data: {}
1654
+ };
1655
+ function Ho(e) {
1656
+ return e === "x" ? "y" : "x";
1657
+ }
1658
+ function Do(e) {
1659
+ var t = e.state, i = e.options, n = e.name, o = i.mainAxis, s = o === void 0 ? !0 : o, l = i.altAxis, r = l === void 0 ? !1 : l, a = i.boundary, c = i.rootBoundary, h = i.altBoundary, p = i.padding, f = i.tether, u = f === void 0 ? !0 : f, I = i.tetherOffset, g = I === void 0 ? 0 : I, v = Lt(t, {
1660
+ boundary: a,
1661
+ rootBoundary: c,
1662
+ padding: p,
1663
+ altBoundary: h
1664
+ }), m = j(t.placement), b = mt(t.placement), x = !b, w = oe(m), C = Ho(w), y = t.modifiersData.popperOffsets, O = t.rects.reference, S = t.rects.popper, E = typeof g == "function" ? g(Object.assign({}, t.rects, {
1665
+ placement: t.placement
1666
+ })) : g, A = typeof E == "number" ? {
1667
+ mainAxis: E,
1668
+ altAxis: E
1669
+ } : Object.assign({
1670
+ mainAxis: 0,
1671
+ altAxis: 0
1672
+ }, E), L = t.modifiersData.offset ? t.modifiersData.offset[t.placement] : null, R = {
1673
+ x: 0,
1674
+ y: 0
1675
+ };
1676
+ if (y) {
1677
+ if (s) {
1678
+ var T, z = w === "y" ? H : D, G = w === "y" ? F : N, Y = w === "y" ? "height" : "width", Z = y[w], rt = Z + v[z], U = Z - v[G], at = u ? -S[Y] / 2 : 0, vt = b === ut ? O[Y] : S[Y], tt = b === ut ? -S[Y] : -O[Y], lt = t.elements.arrow, q = u && lt ? ne(lt) : {
1679
+ width: 0,
1680
+ height: 0
1681
+ }, V = t.modifiersData["arrow#persistent"] ? t.modifiersData["arrow#persistent"].padding : ze(), et = V[z], it = V[G], K = Et(0, O[Y], q[Y]), gt = x ? O[Y] / 2 - at - K - et - A.mainAxis : vt - K - et - A.mainAxis, Vt = x ? -O[Y] / 2 + at + K + it + A.mainAxis : tt + K + it + A.mainAxis, yt = t.elements.arrow && Tt(t.elements.arrow), jt = yt ? w === "y" ? yt.clientTop || 0 : yt.clientLeft || 0 : 0, Yt = (T = L == null ? void 0 : L[w]) != null ? T : 0, $t = Z + gt - Yt - jt, zt = Z + Vt - Yt, Xt = Et(u ? Wt(rt, $t) : rt, Z, u ? ot(U, zt) : U);
1682
+ y[w] = Xt, R[w] = Xt - Z;
1683
+ }
1684
+ if (r) {
1685
+ var Pt, Gt = w === "x" ? H : D, Ut = w === "x" ? F : N, _ = y[C], nt = C === "y" ? "height" : "width", ct = _ + v[Gt], ht = _ - v[Ut], dt = [H, D].indexOf(m) !== -1, bt = (Pt = L == null ? void 0 : L[C]) != null ? Pt : 0, wt = dt ? ct : _ - O[nt] - S[nt] - bt + A.altAxis, It = dt ? _ + O[nt] + S[nt] - bt - A.altAxis : ht, Rt = u && dt ? ro(wt, _, It) : Et(u ? wt : ct, _, u ? It : ht);
1686
+ y[C] = Rt, R[C] = Rt - _;
1687
+ }
1688
+ t.modifiersData[n] = R;
1689
+ }
1690
+ }
1691
+ const Zo = {
1692
+ name: "preventOverflow",
1693
+ enabled: !0,
1694
+ phase: "main",
1695
+ fn: Do,
1696
+ requiresIfExists: ["offset"]
1697
+ };
1698
+ function Bo(e) {
1699
+ return {
1700
+ scrollLeft: e.scrollLeft,
1701
+ scrollTop: e.scrollTop
1702
+ };
1703
+ }
1704
+ function Wo(e) {
1705
+ return e === B(e) || !W(e) ? se(e) : Bo(e);
1706
+ }
1707
+ function Fo(e) {
1708
+ var t = e.getBoundingClientRect(), i = pt(t.width) / e.offsetWidth || 1, n = pt(t.height) / e.offsetHeight || 1;
1709
+ return i !== 1 || n !== 1;
1710
+ }
1711
+ function No(e, t, i) {
1712
+ i === void 0 && (i = !1);
1713
+ var n = W(t), o = W(t) && Fo(t), s = Q(t), l = ft(e, o, i), r = {
1714
+ scrollLeft: 0,
1715
+ scrollTop: 0
1716
+ }, a = {
1717
+ x: 0,
1718
+ y: 0
1719
+ };
1720
+ return (n || !n && !i) && (($(t) !== "body" || // https://github.com/popperjs/popper-core/issues/1078
1721
+ ae(s)) && (r = Wo(t)), W(t) ? (a = ft(t, !0), a.x += t.clientLeft, a.y += t.clientTop) : s && (a.x = re(s))), {
1722
+ x: l.left + r.scrollLeft - a.x,
1723
+ y: l.top + r.scrollTop - a.y,
1724
+ width: l.width,
1725
+ height: l.height
1726
+ };
1727
+ }
1728
+ function Vo(e) {
1729
+ var t = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Set(), n = [];
1730
+ e.forEach(function(s) {
1731
+ t.set(s.name, s);
1732
+ });
1733
+ function o(s) {
1734
+ i.add(s.name);
1735
+ var l = [].concat(s.requires || [], s.requiresIfExists || []);
1736
+ l.forEach(function(r) {
1737
+ if (!i.has(r)) {
1738
+ var a = t.get(r);
1739
+ a && o(a);
1740
+ }
1741
+ }), n.push(s);
1742
+ }
1743
+ return e.forEach(function(s) {
1744
+ i.has(s.name) || o(s);
1745
+ }), n;
1746
+ }
1747
+ function jo(e) {
1748
+ var t = Vo(e);
1749
+ return to.reduce(function(i, n) {
1750
+ return i.concat(t.filter(function(o) {
1751
+ return o.phase === n;
1752
+ }));
1753
+ }, []);
1754
+ }
1755
+ function $o(e) {
1756
+ var t;
1757
+ return function() {
1758
+ return t || (t = new Promise(function(i) {
1759
+ Promise.resolve().then(function() {
1760
+ t = void 0, i(e());
1761
+ });
1762
+ })), t;
1763
+ };
1764
+ }
1765
+ function zo(e) {
1766
+ var t = e.reduce(function(i, n) {
1767
+ var o = i[n.name];
1768
+ return i[n.name] = o ? Object.assign({}, o, n, {
1769
+ options: Object.assign({}, o.options, n.options),
1770
+ data: Object.assign({}, o.data, n.data)
1771
+ }) : n, i;
1772
+ }, {});
1773
+ return Object.keys(t).map(function(i) {
1774
+ return t[i];
1775
+ });
1776
+ }
1777
+ var He = {
1778
+ placement: "bottom",
1779
+ modifiers: [],
1780
+ strategy: "absolute"
1781
+ };
1782
+ function De() {
1783
+ for (var e = arguments.length, t = new Array(e), i = 0; i < e; i++)
1784
+ t[i] = arguments[i];
1785
+ return !t.some(function(n) {
1786
+ return !(n && typeof n.getBoundingClientRect == "function");
1787
+ });
1788
+ }
1789
+ function Go(e) {
1790
+ e === void 0 && (e = {});
1791
+ var t = e, i = t.defaultModifiers, n = i === void 0 ? [] : i, o = t.defaultOptions, s = o === void 0 ? He : o;
1792
+ return function(r, a, c) {
1793
+ c === void 0 && (c = s);
1794
+ var h = {
1795
+ placement: "bottom",
1796
+ orderedModifiers: [],
1797
+ options: Object.assign({}, He, s),
1798
+ modifiersData: {},
1799
+ elements: {
1800
+ reference: r,
1801
+ popper: a
1802
+ },
1803
+ attributes: {},
1804
+ styles: {}
1805
+ }, p = [], f = !1, u = {
1806
+ state: h,
1807
+ setOptions: function(m) {
1808
+ var b = typeof m == "function" ? m(h.options) : m;
1809
+ g(), h.options = Object.assign({}, s, h.options, b), h.scrollParents = {
1810
+ reference: st(r) ? St(r) : r.contextElement ? St(r.contextElement) : [],
1811
+ popper: St(a)
1812
+ };
1813
+ var x = jo(zo([].concat(n, h.options.modifiers)));
1814
+ return h.orderedModifiers = x.filter(function(w) {
1815
+ return w.enabled;
1816
+ }), I(), u.update();
1817
+ },
1818
+ // Sync update – it will always be executed, even if not necessary. This
1819
+ // is useful for low frequency updates where sync behavior simplifies the
1820
+ // logic.
1821
+ // For high frequency updates (e.g. `resize` and `scroll` events), always
1822
+ // prefer the async Popper#update method
1823
+ forceUpdate: function() {
1824
+ if (!f) {
1825
+ var m = h.elements, b = m.reference, x = m.popper;
1826
+ if (De(b, x)) {
1827
+ h.rects = {
1828
+ reference: No(b, Tt(x), h.options.strategy === "fixed"),
1829
+ popper: ne(x)
1830
+ }, h.reset = !1, h.placement = h.options.placement, h.orderedModifiers.forEach(function(A) {
1831
+ return h.modifiersData[A.name] = Object.assign({}, A.data);
1832
+ });
1833
+ for (var w = 0; w < h.orderedModifiers.length; w++) {
1834
+ if (h.reset === !0) {
1835
+ h.reset = !1, w = -1;
1836
+ continue;
1837
+ }
1838
+ var C = h.orderedModifiers[w], y = C.fn, O = C.options, S = O === void 0 ? {} : O, E = C.name;
1839
+ typeof y == "function" && (h = y({
1840
+ state: h,
1841
+ options: S,
1842
+ name: E,
1843
+ instance: u
1844
+ }) || h);
1845
+ }
1846
+ }
1847
+ }
1848
+ },
1849
+ // Async and optimistically optimized update – it will not be executed if
1850
+ // not necessary (debounced to run at most once-per-tick)
1851
+ update: $o(function() {
1852
+ return new Promise(function(v) {
1853
+ u.forceUpdate(), v(h);
1854
+ });
1855
+ }),
1856
+ destroy: function() {
1857
+ g(), f = !0;
1858
+ }
1859
+ };
1860
+ if (!De(r, a))
1861
+ return u;
1862
+ u.setOptions(c).then(function(v) {
1863
+ !f && c.onFirstUpdate && c.onFirstUpdate(v);
1864
+ });
1865
+ function I() {
1866
+ h.orderedModifiers.forEach(function(v) {
1867
+ var m = v.name, b = v.options, x = b === void 0 ? {} : b, w = v.effect;
1868
+ if (typeof w == "function") {
1869
+ var C = w({
1870
+ state: h,
1871
+ name: m,
1872
+ instance: u,
1873
+ options: x
1874
+ }), y = function() {
1875
+ };
1876
+ p.push(C || y);
1877
+ }
1878
+ });
1879
+ }
1880
+ function g() {
1881
+ p.forEach(function(v) {
1882
+ return v();
1883
+ }), p = [];
1884
+ }
1885
+ return u;
1886
+ };
1887
+ }
1888
+ var Uo = [go, Mo, mo, no, Po, Lo, Zo, ho, To], Ko = /* @__PURE__ */ Go({
1889
+ defaultModifiers: Uo
1890
+ });
1891
+ class _o {
1892
+ constructor(t, i, n) {
1893
+ le(this, "updateHotspotPosition", (t, i) => {
1894
+ this.currentActiveIndex = t, this.currentOrientation = i;
1895
+ const n = Hn(this.hotspotsConfig, t, i);
1896
+ this.hideHotspots(), n.forEach((o) => this.updateAndShowHotspot(o, t));
1897
+ });
1898
+ this.container = i, this.popper = null, this.popperInstance = null, this.hotspotsContainer = qi(this.container), this.hotspotsConfig = Fn(t), this.shouldHidePopper = !0, this.hidePopper = this.hidePopper.bind(this), this.imageAspectRatio = n, this.hotspotElements = /* @__PURE__ */ new Map(), this.popperListeners = [];
1899
+ const { containerSize: o } = t[0];
1900
+ this.initialContainerSize = o || [i.offsetWidth, i.offsetHeight], this.initHotspots(), this.observeContainerResize();
1901
+ }
1902
+ observeContainerResize() {
1903
+ this.resizeObserver = new ResizeObserver(() => {
1904
+ const t = this.container.offsetWidth, i = this.container.offsetHeight;
1905
+ this.updateHotspotsForResize(t, i);
1906
+ }), this.resizeObserver.observe(this.container);
1907
+ }
1908
+ updateHotspotsForResize(t, i) {
1909
+ this.hotspotsConfig = Nn({
1910
+ newWidth: t,
1911
+ newHeight: i,
1912
+ initialContainerSize: this.initialContainerSize,
1913
+ imageAspectRatio: this.imageAspectRatio,
1914
+ hotspotsConfig: this.hotspotsConfig
1915
+ }), this.updateHotspotPosition(this.currentActiveIndex, this.currentOrientation);
1916
+ }
1917
+ cleanupPopperListeners() {
1918
+ this.popperListeners.forEach(({ element: t, event: i, handler: n }) => {
1919
+ t.removeEventListener(i, n);
1920
+ }), this.popperListeners = [];
1921
+ }
1922
+ showPopper({ hotspotElement: t, content: i, id: n, keepOpen: o }) {
1923
+ this.popperInstance && this.popperInstance.instanceId !== n && this.hidePopper();
1924
+ const s = {
1925
+ placement: "top",
1926
+ modifiers: Bn(this.container)
1927
+ };
1928
+ this.popper = Wn(i, n), this.popper.setAttribute("data-show", ""), this.currentHotspotElement = t, t.setAttribute("aria-expanded", "true"), t.setAttribute("aria-describedby", `cloudimage-360-popper-${n}`);
1929
+ const l = () => {
1930
+ this.shouldHidePopper = !1;
1931
+ }, r = () => {
1932
+ this.shouldHidePopper = !0, this.checkAndHidePopper();
1933
+ }, a = () => {
1934
+ this.shouldHidePopper = !0, this.checkAndHidePopper();
1935
+ }, c = () => {
1936
+ this.shouldHidePopper = !1, this.hidePopperTimeout && clearTimeout(this.hidePopperTimeout);
1937
+ };
1938
+ this.popper.addEventListener("mouseenter", l), this.popper.addEventListener("mouseleave", r), t.addEventListener("mouseleave", a), t.addEventListener("mouseenter", c), this.popperListeners.push(
1939
+ { element: this.popper, event: "mouseenter", handler: l },
1940
+ { element: this.popper, event: "mouseleave", handler: r },
1941
+ { element: t, event: "mouseleave", handler: a },
1942
+ { element: t, event: "mouseenter", handler: c }
1943
+ ), this.popperInstance = {
1944
+ ...Ko(t, this.popper, s),
1945
+ keepOpen: o,
1946
+ instanceId: n
1947
+ };
1948
+ }
1949
+ checkAndHidePopper() {
1950
+ var t;
1951
+ this.shouldHidePopper && !((t = this.popperInstance) != null && t.keepOpen) && (this.hidePopperTimeout = setTimeout(() => {
1952
+ this.shouldHidePopper && this.hidePopper();
1953
+ }, Oi));
1954
+ }
1955
+ hidePopper() {
1956
+ if (this.cleanupPopperListeners(), this.currentHotspotElement && (this.currentHotspotElement.setAttribute("aria-expanded", "false"), this.currentHotspotElement.removeAttribute("aria-describedby"), this.currentHotspotElement = null), this.popperInstance && (this.popperInstance.destroy(), this.popperInstance = null), this.popper) {
1957
+ this.popper.removeAttribute("data-show"), this.popper.setAttribute("aria-hidden", "true");
1958
+ const t = this.popper;
1959
+ this.popper = null, setTimeout(() => {
1960
+ t.remove();
1961
+ }, Ei);
1962
+ }
1963
+ }
1964
+ createHotspot(t) {
1965
+ const { id: i, content: n, keepOpen: o, onClick: s, label: l } = t, r = Dn(i, l);
1966
+ s && (r.style.cursor = "pointer"), r.onclick = (a) => {
1967
+ a.stopPropagation(), s == null || s(a, this.popperInstance, i);
1968
+ }, n && (r.addEventListener(
1969
+ "mouseenter",
1970
+ () => this.showPopper({ hotspotElement: r, content: n, id: i, keepOpen: o })
1971
+ ), r.addEventListener(
1972
+ "focus",
1973
+ () => this.showPopper({ hotspotElement: r, content: n, id: i, keepOpen: o })
1974
+ ), r.addEventListener("blur", () => {
1975
+ this.shouldHidePopper = !0, this.checkAndHidePopper();
1976
+ })), this.hotspotsContainer.appendChild(r);
1977
+ }
1978
+ hideHotspots() {
1979
+ this.hotspotsContainer.querySelectorAll(".cloudimage-360-hotspot").forEach((t) => {
1980
+ t.style.opacity = 0, t.style.pointerEvents = "none";
1981
+ });
1982
+ }
1983
+ updateAndShowHotspot(t, i) {
1984
+ const { positions: n, id: o } = t, { x: s, y: l } = n[i] ?? {}, r = this.hotspotsContainer.querySelector(`[data-hotspot-id="${o}"]`);
1985
+ r && (r.style.translate = `${s}px ${l}px`, r.style.opacity = 1, r.style.pointerEvents = "all");
1986
+ }
1987
+ /**
1988
+ * Shows the popper for a specific hotspot by ID
1989
+ * @param {string} hotspotId - The ID of the hotspot to show
1990
+ */
1991
+ showHotspotById(t) {
1992
+ const i = this.hotspotsConfig.find((o) => o.id === t);
1993
+ if (!i || !i.content) return;
1994
+ const n = this.hotspotsContainer.querySelector(`[data-hotspot-id="${t}"]`);
1995
+ n && n.style.opacity === "1" && this.showPopper({
1996
+ hotspotElement: n,
1997
+ content: i.content,
1998
+ id: t,
1999
+ keepOpen: i.keepOpen
2000
+ });
2001
+ }
2002
+ createAllHotspots() {
2003
+ this.hotspotsConfig.forEach((t) => this.createHotspot(t));
2004
+ }
2005
+ initHotspots() {
2006
+ this.createAllHotspots();
2007
+ }
2008
+ destroy() {
2009
+ this.hidePopperTimeout && clearTimeout(this.hidePopperTimeout), this.resizeObserver.disconnect(), this.hidePopper(), this.hotspotElements.clear(), this.hotspotsContainer.innerHTML = "";
2010
+ }
2011
+ }
2012
+ class Ft {
2013
+ constructor(t, i, n) {
2014
+ this.container = t, this.isClicked = !1, this.fullscreenView = !!n, this.imagesX = [], this.imagesY = [], this.devicePixelRatio = Math.round(window.devicePixelRatio || 1), this.id = t.id, this.movementStart = { x: 0, y: 0 }, this.draggingDirection = null, this.isReady = !1, this.velocityX = 0, this.velocityY = 0, this.lastDragTime = 0, this.lastDragX = 0, this.lastDragY = 0, this.inertiaAnimationId = null, this.hasInteracted = !1, this.currentZoomScale = 1, this.touchDevice = Ln(), this.dragJustEnded = !1, this.isPinching = !1, this.initialPinchDistance = 0, this.pinchZoomLevel = 1, this.pinchZoomEmitted = !1, this.lastEmittedZoom = 1, this.panOffsetX = 0, this.panOffsetY = 0, this.canvasWorker = new Yn(), this.hotspotTimeline = null, this.hotspotTimelineIndicator = null, this.isAnimatingToFrame = !1, this.onMoveHandler = this.onMoveHandler.bind(this), this.destroy = this.destroy.bind(this), this.init(this.container, i);
2015
+ }
2016
+ emit(t, i = {}) {
2017
+ const n = this[t];
2018
+ typeof n == "function" && n({ ...i, viewerId: this.id });
2019
+ }
2020
+ announce(t) {
2021
+ tn(this.ariaLiveRegion, t);
2022
+ }
2023
+ mouseDown(t) {
2024
+ if (!this.isReady || this.glass) return;
2025
+ const { pageX: i, pageY: n } = t;
2026
+ this.hideHints(), this.hideHotspotPopper(), this.inertiaAnimationId && (cancelAnimationFrame(this.inertiaAnimationId), this.inertiaAnimationId = null), this.autoplayJustStopped = !1, (this.autoplay || this.loopTimeoutId) && (this.stopAutoplay(), this.autoplay = !1, this.autoplayJustStopped = !0), this.movementStart = { x: i, y: n }, this.isClicked = !0, this.isDragging = !1, this.inertia && (this.velocityX = 0, this.velocityY = 0, this.lastDragTime = performance.now(), this.lastDragX = i, this.lastDragY = n);
2027
+ }
2028
+ mouseUp() {
2029
+ this.isReady && (!this.isZoomed && !this.autoplayJustStopped && this.showAllIcons(), this.inertia && this.isDragging && (Math.abs(this.velocityX) > 0.1 || Math.abs(this.velocityY) > 0.1) && this.startInertia(), this.isDragging && (this.emit("onDragEnd"), this.dragJustEnded = !0), this.movementStart = { x: 0, y: 0 }, this.isClicked = !1, this.isDragging = !1, this.innerBox.style.cursor = "grab");
2030
+ }
2031
+ startInertia() {
2032
+ const n = this.fullscreenView ? document.body : this.container, o = this.dragSpeed / fe, s = o * (this.amountX / n.offsetWidth), l = o * (this.amountY / n.offsetHeight), r = () => {
2033
+ if (this.velocityX *= 0.95, this.velocityY *= 0.95, Math.abs(this.velocityX) < 0.01 && Math.abs(this.velocityY) < 0.01) {
2034
+ this.inertiaAnimationId = null;
2035
+ return;
2036
+ }
2037
+ const a = this.velocityX * 16, c = this.velocityY * 16, h = Se({
2038
+ deltaX: a,
2039
+ deltaY: c,
2040
+ reversed: this.dragReverse,
2041
+ allowSpinX: this.allowSpinX,
2042
+ allowSpinY: this.allowSpinY
2043
+ });
2044
+ if (h) {
2045
+ const p = this.allowSpinX ? Math.max(1, Math.abs(Math.round(a * s))) : 0, f = this.allowSpinY ? Math.max(1, Math.abs(Math.round(c * l))) : 0;
2046
+ (p > 0 || f > 0) && this.onMoveHandler(h, p, f);
2047
+ }
2048
+ this.inertiaAnimationId = requestAnimationFrame(r);
2049
+ };
2050
+ this.inertiaAnimationId = requestAnimationFrame(r);
2051
+ }
2052
+ drag(t, i) {
2053
+ if (!this.isReady || !this.isClicked) return;
2054
+ const n = t - this.movementStart.x, o = i - this.movementStart.y;
2055
+ if (this.inertia) {
2056
+ const f = performance.now(), u = f - this.lastDragTime;
2057
+ u > 0 && u < 100 && (this.velocityX = (t - this.lastDragX) / u, this.velocityY = (i - this.lastDragY) / u), this.lastDragTime = f, this.lastDragX = t, this.lastDragY = i;
2058
+ }
2059
+ this.draggingDirection = Se({
2060
+ deltaX: n,
2061
+ deltaY: o,
2062
+ reversed: this.dragReverse,
2063
+ allowSpinX: this.allowSpinX,
2064
+ allowSpinY: this.allowSpinY
2065
+ }) || this.draggingDirection;
2066
+ const s = this.fullscreenView ? document.body : this.container, l = this.dragSpeed / fe, r = l * (this.amountX / s.offsetWidth), a = l * (this.amountY / s.offsetHeight), c = this.allowSpinX ? Math.abs(Math.round(n * r)) : 0, h = this.allowSpinY ? Math.abs(Math.round(o * a)) : 0;
2067
+ (this.allowSpinX && c !== 0 || this.allowSpinY && h !== 0) && (this.hasInteracted = !0, this.hideHotspotPopper(), this.onMoveHandler(this.draggingDirection, c, h), this.movementStart = { x: t, y: i }, setTimeout(() => {
2068
+ this.isDragging || (this.isDragging = !0, this.emit("onDragStart"));
2069
+ }, Ci));
2070
+ }
2071
+ mouseMove(t) {
2072
+ !this.isReady || !this.isClicked && !this.isZoomed || this.glass || (this.hideAllIcons(), this.drag(t.pageX, t.pageY), this.isZoomed && this.applyZoom(t));
2073
+ }
2074
+ mouseClick(t) {
2075
+ if (!(!this.isReady || this.isDragging)) {
2076
+ if (this.dragJustEnded) {
2077
+ this.dragJustEnded = !1;
2078
+ return;
2079
+ }
2080
+ if (this.autoplayJustStopped) {
2081
+ this.autoplayJustStopped = !1;
2082
+ return;
2083
+ }
2084
+ if (this.glass && this.magnified) {
2085
+ this.removeGlass();
2086
+ return;
2087
+ }
2088
+ this.pointerZoom && !this.glass && !this.touchDevice && this.toggleZoom(t);
2089
+ }
2090
+ }
2091
+ loadHigherQualityImages(t, i) {
2092
+ const n = Ot(this.srcXConfig, t), o = this.allowSpinY ? Ot(this.srcYConfig, t) : null;
2093
+ ve({
2094
+ cdnPathX: n,
2095
+ cdnPathY: o,
2096
+ configX: this.srcXConfig,
2097
+ configY: this.srcYConfig,
2098
+ onAllImagesLoad: (s, l) => {
2099
+ this.imagesX = s, this.imagesY = l, i();
2100
+ },
2101
+ onError: (s) => this.emit("onError", s)
2102
+ });
2103
+ }
2104
+ hideHotspots() {
2105
+ this.hotspotsInstance && this.hotspotsInstance.hideHotspots();
2106
+ }
2107
+ hideHotspotPopper() {
2108
+ this.hotspotsInstance && this.hotspotsInstance.hidePopper();
2109
+ }
2110
+ toggleZoom(t) {
2111
+ if (this.isZoomed)
2112
+ this.showTransitionOverlay(), setTimeout(() => {
2113
+ this.removeZoom();
2114
+ }, pe);
2115
+ else {
2116
+ let i = (this.fullscreenView || this.pointerZoom ? document.body : this.container).offsetWidth;
2117
+ this.hideHotspots(), this.showLoadingSpinner(), this.loadHigherQualityImages(i, () => {
2118
+ this.showTransitionOverlay(), setTimeout(() => {
2119
+ this.applyZoom(t);
2120
+ }, pe);
2121
+ });
2122
+ }
2123
+ }
2124
+ removeZoom() {
2125
+ this.isZoomed = !1, this.updateView(), this.showAllIcons(), this.hideTransitionOverlay(), this.emit("onZoomOut"), this.announce("Zoomed out");
2126
+ }
2127
+ mouseLeave() {
2128
+ this.isZoomed && this.removeZoom();
2129
+ }
2130
+ applyZoom(t) {
2131
+ const { offsetX: i, offsetY: n } = xn(t, this.canvas, this.devicePixelRatio);
2132
+ this.isZoomed = !0, this.hideAllIcons(), this.hideLoadingSpinner(), this.hideTransitionOverlay(), this.updateView(this.pointerZoom, i, n), this.emit("onZoomIn", { zoomLevel: this.pointerZoom }), this.announce("Zoomed in. Move mouse to pan. Click to zoom out.");
2133
+ }
2134
+ touchOutside(t) {
2135
+ if (!this.glass) return;
2136
+ !this.canvas.contains(t.target) && this.removeGlass();
2137
+ }
2138
+ touchStart(t) {
2139
+ if (!this.isReady || this.glass || !t.touches || !t.touches.length) return;
2140
+ const i = t.target;
2141
+ if (i && i.closest && i.closest(".cloudimage-360-button")) return;
2142
+ if (this.hideHints(), t.touches.length === 2 && this.pinchZoom && !this.isDragging) {
2143
+ t.preventDefault(), this.isPinching = !0, this.isClicked = !1, this.inertiaAnimationId && (cancelAnimationFrame(this.inertiaAnimationId), this.inertiaAnimationId = null);
2144
+ const s = t.touches[0], l = t.touches[1];
2145
+ if (this.initialPinchDistance = this.getPinchDistance(s, l), (this.autoplay || this.loopTimeoutId) && (this.stopAutoplay(), this.autoplay = !1), !this.isZoomed && this.pinchZoomLevel === 1) {
2146
+ const r = (this.fullscreenView ? document.body : this.container).offsetWidth;
2147
+ this.hideHotspots(), this.loadHigherQualityImages(r, () => {
2148
+ });
2149
+ }
2150
+ return;
2151
+ }
2152
+ if (t.touches.length > 1) return;
2153
+ const { pageX: n, pageY: o } = t.touches[0];
2154
+ this.inertiaAnimationId && (cancelAnimationFrame(this.inertiaAnimationId), this.inertiaAnimationId = null), (this.autoplay || this.loopTimeoutId) && (this.stopAutoplay(), this.autoplay = !1), this.hideAllIcons(), this.hideHotspotPopper(), this.movementStart = { x: n, y: o }, this.isClicked = !0, this.isDragging = !1, this.inertia && (this.velocityX = 0, this.velocityY = 0, this.lastDragTime = performance.now(), this.lastDragX = n, this.lastDragY = o);
2155
+ }
2156
+ getPinchDistance(t, i) {
2157
+ const n = t.pageX - i.pageX, o = t.pageY - i.pageY;
2158
+ return Math.sqrt(n * n + o * o);
2159
+ }
2160
+ getPinchCenter(t, i) {
2161
+ return {
2162
+ x: (t.pageX + i.pageX) / 2,
2163
+ y: (t.pageY + i.pageY) / 2
2164
+ };
2165
+ }
2166
+ touchEnd(t) {
2167
+ if (this.isReady) {
2168
+ if (this.isPinching) {
2169
+ if (!t.touches || t.touches.length < 2) {
2170
+ if (this.isPinching = !1, this.initialPinchDistance = 0, this.pinchZoomLevel <= 1) {
2171
+ const i = this.pinchZoomEmitted;
2172
+ this.pinchZoomLevel = 1, this.pinchZoomEmitted = !1, this.lastEmittedZoom = 1, this.isZoomed = !1, this.panOffsetX = 0, this.panOffsetY = 0, this.showAllIcons(), this.updateView(), i && this.emit("onZoomOut");
2173
+ } else if (this.canvas) {
2174
+ const i = this.canvas.getBoundingClientRect();
2175
+ this.panOffsetX = i.width / 2 * this.devicePixelRatio, this.panOffsetY = i.height / 2 * this.devicePixelRatio;
2176
+ }
2177
+ }
2178
+ return;
2179
+ }
2180
+ this.showAllIcons(), this.inertia && this.isDragging && (Math.abs(this.velocityX) > 0.1 || Math.abs(this.velocityY) > 0.1) && this.startInertia(), this.movementStart = { x: 0, y: 0 }, this.isClicked = !1, this.isDragging = !1;
2181
+ }
2182
+ }
2183
+ touchMove(t) {
2184
+ if (!this.isReady || this.glass) return;
2185
+ if (this.isPinching && t.touches.length === 2) {
2186
+ t.preventDefault();
2187
+ const o = t.touches[0], s = t.touches[1], l = this.getPinchDistance(o, s);
2188
+ if (this.initialPinchDistance === 0) {
2189
+ this.initialPinchDistance = l;
2190
+ return;
2191
+ }
2192
+ const r = l / this.initialPinchDistance, a = Math.max(1, Math.min(this.pinchZoomLevel * r, me));
2193
+ if (this.initialPinchDistance = l, this.pinchZoomLevel = a, !this.canvas) return;
2194
+ const c = this.canvas.getBoundingClientRect(), h = c.width / 2 * this.devicePixelRatio, p = c.height / 2 * this.devicePixelRatio;
2195
+ a > 1 ? (this.isZoomed = !0, this.hideAllIcons(), this.updateView(a, h, p), (!this.pinchZoomEmitted || a > this.lastEmittedZoom) && (this.emit("onZoomIn", { zoomLevel: a }), this.pinchZoomEmitted = !0, this.lastEmittedZoom = a)) : (this.isZoomed = !1, this.panOffsetX = 0, this.panOffsetY = 0, this.updateView());
2196
+ return;
2197
+ }
2198
+ if (!this.isClicked || !t.touches || !t.touches[0]) return;
2199
+ const { pageX: i, pageY: n } = t.touches[0];
2200
+ if (t.preventDefault(), this.isZoomed && this.pinchZoomLevel > 1) {
2201
+ const o = i - this.movementStart.x, s = n - this.movementStart.y;
2202
+ this.panOffsetX -= o * this.devicePixelRatio, this.panOffsetY -= s * this.devicePixelRatio, this.movementStart = { x: i, y: n }, this.updateView(this.pinchZoomLevel, this.panOffsetX, this.panOffsetY);
2203
+ return;
2204
+ }
2205
+ this.drag(i, n);
2206
+ }
2207
+ keyDown(t) {
2208
+ if (!this.isReady) return;
2209
+ const { keyCode: i } = t, n = this.keysReverse;
2210
+ switch (this.autoplay && this.stopAutoplay(), Ee(i, this.allowSpinY) && (this.hasInteracted = !0, this.hideAllIcons(), this.hideHints()), i) {
2211
+ case 37:
2212
+ n ? this.moveLeft() : this.moveRight();
2213
+ break;
2214
+ case 39:
2215
+ n ? this.moveRight() : this.moveLeft();
2216
+ break;
2217
+ case 38:
2218
+ this.allowSpinY && (t.preventDefault(), n ? this.moveTop() : this.moveBottom());
2219
+ break;
2220
+ case 40:
2221
+ this.allowSpinY && (t.preventDefault(), n ? this.moveBottom() : this.moveTop());
2222
+ break;
2223
+ }
2224
+ }
2225
+ keyUp(t) {
2226
+ const { keyCode: i } = t;
2227
+ Ee(i, this.allowSpinY) && this.showAllIcons();
2228
+ }
2229
+ moveActiveXIndexUp(t) {
2230
+ this.orientation = P.X, this.activeImageX = (this.activeImageX + t) % this.amountX;
2231
+ }
2232
+ moveActiveXIndexDown(t) {
2233
+ this.orientation = P.X, this.activeImageX = (this.activeImageX - t + this.amountX) % this.amountX;
2234
+ }
2235
+ moveActiveYIndexUp(t) {
2236
+ this.orientation = P.Y, this.activeImageY = (this.activeImageY + t) % this.amountY;
2237
+ }
2238
+ moveActiveYIndexDown(t) {
2239
+ this.orientation = P.Y, this.activeImageY = (this.activeImageY - t + this.amountY) % this.amountY;
2240
+ }
2241
+ moveRight(t, i = 1) {
2242
+ t && this.activeImageX >= this.imagesX.length - 1 || (this.moveActiveXIndexUp(i), this.isZoomed || this.updateView());
2243
+ }
2244
+ moveLeft(t, i = 1) {
2245
+ t && this.activeImageX <= 0 || (this.moveActiveXIndexDown(i), this.isZoomed || this.updateView());
2246
+ }
2247
+ moveTop(t, i = 1) {
2248
+ t && this.activeImageY >= this.imagesY.length - 1 || (this.moveActiveYIndexUp(i), this.isZoomed || this.updateView());
2249
+ }
2250
+ moveBottom(t, i = 1) {
2251
+ t && this.activeImageY <= 0 || (this.moveActiveYIndexDown(i), this.isZoomed || this.updateView());
2252
+ }
2253
+ onMoveHandler(t, i = 1, n = 1) {
2254
+ t === "right" ? this.moveRight(this.stopAtEdges, i) : t === "left" ? this.moveLeft(this.stopAtEdges, i) : t === "up" ? this.moveTop(this.stopAtEdges, n) : t === "down" && this.moveBottom(this.stopAtEdges, n), this.emit("onSpin", {
2255
+ direction: t,
2256
+ activeImageX: this.activeImageX,
2257
+ activeImageY: this.activeImageY,
2258
+ amountX: this.amountX,
2259
+ amountY: this.amountY
2260
+ });
2261
+ }
2262
+ updateView(t, i, n) {
2263
+ const o = this.orientation === P.X ? this.activeImageX : this.activeImageY, s = this.orientation === P.X ? this.imagesX[this.activeImageX] : this.imagesY[this.activeImageY];
2264
+ this.hotspotsInstance && !this.isZoomed && !this.autoplay && this.hotspotsInstance.updateHotspotPosition(o, this.orientation), this.hotspotTimelineIndicator && this.orientation === P.X && this.updateHotspotTimelinePosition(), this.drawImageOnCanvas(s, t, i, n);
2265
+ }
2266
+ updatePercentageInLoader(t = 0) {
2267
+ this.loader && (this.loader.innerText = t + "%");
2268
+ }
2269
+ adaptCanvasSize(t) {
2270
+ const { naturalWidth: i, naturalHeight: n } = t;
2271
+ this.imageAspectRatio = i / n;
2272
+ const o = this.fullscreenView ? window.innerWidth : this.canvas.clientWidth, s = this.fullscreenView ? window.innerHeight : this.canvas.clientHeight;
2273
+ this.canvasWorker.postMessage({
2274
+ action: "adaptCanvasSize",
2275
+ devicePixelRatio: this.devicePixelRatio,
2276
+ imageAspectRatio: this.imageAspectRatio,
2277
+ containerWidth: o,
2278
+ containerHeight: s
2279
+ });
2280
+ }
2281
+ drawImageOnCanvas(t, i = 1, n = 0, o = 0) {
2282
+ this.canvasWorker.postMessage({
2283
+ action: "drawImageOnCanvas",
2284
+ imageData: t,
2285
+ zoomScale: i,
2286
+ pointerX: n,
2287
+ pointerY: o
2288
+ });
2289
+ }
2290
+ pushImageToSet(t, i, n) {
2291
+ n === P.X ? this.imagesX[i] = t : this.imagesY[i] = t;
2292
+ }
2293
+ calculatePercentage() {
2294
+ const t = this.amountX + this.amountY, i = this.imagesX.length + this.imagesY.length;
2295
+ return Math.round(i / t * 100);
2296
+ }
2297
+ onImageLoad(t, i, n) {
2298
+ this.pushImageToSet(t, i, n), this.updatePercentageInLoader(this.calculatePercentage());
2299
+ }
2300
+ onFirstImageLoaded(t, i) {
2301
+ this.createContainers(t), this.adaptCanvasSize(i), this.drawImageOnCanvas(i);
2302
+ }
2303
+ onAllImagesLoaded() {
2304
+ if (this.addAllIcons(), this.isReady = !0, this.amountX = this.imagesX.length, this.amountY = this.imagesY.length, this.activeImageX = this.autoplayReverse ? this.amountX - 1 : 0, this.activeImageY = this.autoplayReverse ? this.amountY - 1 : 0, this.hotspots && (this.hotspotsInstance = new _o(this.hotspots, this.innerBox, this.imageAspectRatio), this.addHotspotTimeline(), this.showHotspotTimeline()), this.emit("onLoad", { imagesX: this.imagesX.length, imagesY: this.imagesY.length }), this.emit("onReady"), this.announce("360 degree view loaded. Use mouse drag or arrow keys to rotate."), this.hints !== !1 && !this.autoplay) {
2305
+ const t = this.hints === !0 || this.hints === void 0 ? be(this.viewerConfig, this.touchDevice) : this.hints;
2306
+ t && t.length > 0 && (this.hintsOverlay = ye(this.innerBox, t), we(this.hintsOverlay));
2307
+ }
2308
+ this.autoplay && (this.hideAllIcons(), kn(this.play.bind(this))());
2309
+ }
2310
+ magnify(t) {
2311
+ t.stopPropagation();
2312
+ const { src: i } = this.orientation === P.Y ? this.imagesY[this.activeImageY] : this.imagesX[this.activeImageX], o = (this.fullscreenView ? document.body : this.container).offsetWidth * this.magnifier, s = Hi(i, o);
2313
+ this.showLoadingSpinner(), this.createGlass(), bn(s, (a) => {
2314
+ this.hideLoadingSpinner(), this.magnified = !0, In(t, this.innerBox, this.offset, a, this.glass, this.magnifier);
2315
+ }, (a) => {
2316
+ this.hideLoadingSpinner(), this.removeGlass(), this.emit("onError", {
2317
+ error: { message: a.message, url: a.url },
2318
+ errorCount: 1,
2319
+ totalImages: 1,
2320
+ errors: [{ message: a.message, url: a.url }]
2321
+ });
2322
+ });
2323
+ }
2324
+ openFullscreenModal(t) {
2325
+ t.stopPropagation(), window.document.body.style.overflow = "hidden";
2326
+ const i = Ki(this.container);
2327
+ new Ft(i, this.viewerConfig, !0), this.emit("onFullscreenOpen"), this.announce("Opened fullscreen mode. Press Escape to exit.");
2328
+ }
2329
+ closeFullscreenModal(t) {
2330
+ t.stopPropagation(), document.body.removeChild(this.container.parentNode), window.document.body.style.overflow = "visible", this.emit("onFullscreenClose"), this.announce("Exited fullscreen mode");
2331
+ }
2332
+ play() {
2333
+ if (this.isClicked) return;
2334
+ this.hide360ViewCircleIcon(), this.emit("onAutoplayStart");
2335
+ const t = this.speed * 36 / (this.amountX + this.amountY), i = {
2336
+ left: this.moveLeft.bind(this),
2337
+ right: this.moveRight.bind(this),
2338
+ top: this.moveTop.bind(this),
2339
+ bottom: this.moveBottom.bind(this)
2340
+ };
2341
+ this.loopTimeoutId = window.setInterval(() => {
2342
+ if (this.playOnce && On({
2343
+ autoplayBehavior: this.autoplayBehavior,
2344
+ activeImageX: this.activeImageX,
2345
+ activeImageY: this.activeImageY,
2346
+ amountX: this.amountX,
2347
+ amountY: this.amountY,
2348
+ autoplayReverse: this.autoplayReverse
2349
+ })) {
2350
+ this.stopAutoplay();
2351
+ return;
2352
+ }
2353
+ En({
2354
+ autoplayBehavior: this.autoplayBehavior,
2355
+ activeImageX: this.activeImageX,
2356
+ activeImageY: this.activeImageY,
2357
+ amountX: this.amountX,
2358
+ amountY: this.amountY,
2359
+ autoplayReverse: this.autoplayReverse,
2360
+ spinDirection: this.spinDirection
2361
+ }) && (this.spinDirection = An(this.spinDirection));
2362
+ const s = this.spinDirection === "y";
2363
+ Cn({
2364
+ autoplayBehavior: this.autoplayBehavior,
2365
+ spinY: s,
2366
+ reversed: this.autoplayReverse,
2367
+ loopTriggers: i
2368
+ });
2369
+ }, t);
2370
+ }
2371
+ stopAutoplay() {
2372
+ if (this.showAllIcons(), this.autoplay = !1, window.clearTimeout(this.loopTimeoutId), this.loopTimeoutId = null, this.emit("onAutoplayStop"), this.hints !== !1 && !this.hintsOverlay && !this.hintsHidden) {
2373
+ const t = this.hints === !0 ? be(this.viewerConfig, this.touchDevice) : this.hints;
2374
+ t && t.length > 0 && (this.hintsOverlay = ye(this.innerBox, t), we(this.hintsOverlay));
2375
+ }
2376
+ }
2377
+ destroy() {
2378
+ this.stopAutoplay(), this.inertiaAnimationId && (cancelAnimationFrame(this.inertiaAnimationId), this.inertiaAnimationId = null), this.removeEvents(), this.canvasWorker && (this.canvasWorker.terminate(), this.canvasWorker = null), this.hotspotsInstance && this.hotspotsInstance.destroy(), this.hintsOverlay && this.hintsOverlay.parentNode && (this.hintsOverlay.parentNode.removeChild(this.hintsOverlay), this.hintsOverlay = null), this.hotspotTimeline && this.hotspotTimeline.parentNode && (this.hotspotTimeline.parentNode.removeChild(this.hotspotTimeline), this.hotspotTimeline = null, this.hotspotTimelineIndicator = null), this.container && (this.container.classList.remove("ci360-theme-dark"), this.container.innerHTML = "");
2379
+ }
2380
+ addInitialIcon() {
2381
+ this.initialIcon || this.hide360Logo || (this.initialIcon = Ni(this.logoSrc), this.innerBox.appendChild(this.initialIcon));
2382
+ }
2383
+ showInitialIcon() {
2384
+ !this.initialIcon || this.hasInteracted || (this.initialIcon.style.opacity = 1);
2385
+ }
2386
+ hideInitialIcon() {
2387
+ this.initialIcon && (this.initialIcon.style.opacity = 0);
2388
+ }
2389
+ createGlass() {
2390
+ this.hideAllIcons(), this.glass = document.createElement("div"), this.innerBox.appendChild(this.glass), this.innerBox.style.cursor = "default";
2391
+ }
2392
+ removeGlass() {
2393
+ this.showAllIcons(), this.innerBox.removeChild(this.glass), this.glass = null, this.magnified = !1;
2394
+ }
2395
+ addMagnifierIcon() {
2396
+ this.magnifier && (this.magnifierIcon = Gi(), this.magnifierIcon.onclick = this.magnify.bind(this), this.iconsContainer.appendChild(this.magnifierIcon));
2397
+ }
2398
+ showMagnifierIcon() {
2399
+ this.magnifierIcon && (this.magnifierIcon.style.visibility = "visible", this.magnifierIcon.style.opacity = 1);
2400
+ }
2401
+ hideMagnifierIcon() {
2402
+ this.magnifierIcon && (this.magnifierIcon.style.visibility = "hidden", this.magnifierIcon.style.opacity = 0);
2403
+ }
2404
+ addFullscreenIcon() {
2405
+ this.fullscreen && (this.fullscreenIcon = $i(), this.fullscreenIcon.onclick = this.openFullscreenModal.bind(this), this.iconsContainer.appendChild(this.fullscreenIcon));
2406
+ }
2407
+ addCloseFullscreenIcon() {
2408
+ this.fullscreenCloseIcon = ji(), this.fullscreenCloseIcon.onclick = this.closeFullscreenModal.bind(this), this.iconsContainer.appendChild(this.fullscreenCloseIcon);
2409
+ }
2410
+ showFullscreenIcon() {
2411
+ this.fullscreenIcon && (this.fullscreenIcon.style.opacity = 1);
2412
+ }
2413
+ hideFullscreenIcon() {
2414
+ this.fullscreenIcon && (this.fullscreenIcon.style.opacity = 0);
2415
+ }
2416
+ add360ViewCircleIcon() {
2417
+ this.view360CircleIcon || (this.view360CircleIcon = Wi(this.bottomCircleOffset), this.innerBox.appendChild(this.view360CircleIcon));
2418
+ }
2419
+ show360ViewCircleIcon() {
2420
+ this.view360CircleIcon && (this.view360CircleIcon.style.opacity = 1);
2421
+ }
2422
+ hide360ViewCircleIcon() {
2423
+ this.view360CircleIcon && (this.view360CircleIcon.style.opacity = 0);
2424
+ }
2425
+ addLoadingSpinner() {
2426
+ this.loadingSpinner = _i(), this.innerBox.appendChild(this.loadingSpinner);
2427
+ }
2428
+ showLoadingSpinner() {
2429
+ this.loadingSpinner && (this.hideAllIcons(), this.loadingSpinner.style.opacity = 1);
2430
+ }
2431
+ createTransitionOverlay() {
2432
+ this.transitionOverlay = Ji(), this.innerBox.appendChild(this.transitionOverlay);
2433
+ }
2434
+ showTransitionOverlay() {
2435
+ this.transitionOverlay && (this.hideAllIcons(), this.transitionOverlay.style.opacity = 1);
2436
+ }
2437
+ hideTransitionOverlay() {
2438
+ this.transitionOverlay && (this.transitionOverlay.style.opacity = 0);
2439
+ }
2440
+ hideLoadingSpinner() {
2441
+ this.loadingSpinner && (this.loadingSpinner.style.opacity = 0);
2442
+ }
2443
+ hideHints() {
2444
+ !this.hintsOverlay || this.hintsHidden || (this.hintsHidden = !0, on(this.hintsOverlay));
2445
+ }
2446
+ addHotspotTimeline() {
2447
+ if (!this.hotspots || this.hotspotTimeline) return;
2448
+ const t = cn(this.container, this.amountX, this.hotspots);
2449
+ if (!t) return;
2450
+ this.hotspotTimeline = t.element, this.hotspotTimelineIndicator = t.indicator, this.hotspotTimeline.querySelectorAll(".cloudimage-360-hotspot-timeline-dot").forEach((n) => {
2451
+ n.addEventListener("click", (o) => {
2452
+ o.stopPropagation();
2453
+ const s = parseInt(n.getAttribute("data-frame"), 10), l = n.getAttribute("data-hotspot-id");
2454
+ isNaN(s) || this.animateToFrame(s, l);
2455
+ });
2456
+ }), this.updateHotspotTimelinePosition();
2457
+ }
2458
+ showHotspotTimeline() {
2459
+ dn(this.hotspotTimeline);
2460
+ }
2461
+ hideHotspotTimeline() {
2462
+ un(this.hotspotTimeline);
2463
+ }
2464
+ updateHotspotTimelinePosition() {
2465
+ hn(this.hotspotTimelineIndicator, this.activeImageX, this.amountX);
2466
+ }
2467
+ /**
2468
+ * Animates the viewer to a target frame, optionally showing a hotspot popup on arrival
2469
+ * @param {number} targetFrame - The frame to animate to
2470
+ * @param {string} [hotspotId] - Optional hotspot ID to show popup for after animation
2471
+ */
2472
+ animateToFrame(t, i) {
2473
+ if (this.isAnimatingToFrame || t === this.activeImageX) {
2474
+ t === this.activeImageX && i && this.hotspotsInstance && this.hotspotTimelineOnClick && this.hotspotsInstance.showHotspotById(i);
2475
+ return;
2476
+ }
2477
+ this.isAnimatingToFrame = !0, this.hasInteracted = !0, (this.autoplay || this.loopTimeoutId) && (this.stopAutoplay(), this.autoplay = !1), this.inertiaAnimationId && (cancelAnimationFrame(this.inertiaAnimationId), this.inertiaAnimationId = null);
2478
+ const n = this.activeImageX, o = (t - n + this.amountX) % this.amountX, s = (n - t + this.amountX) % this.amountX, l = o <= s, r = l ? o : s;
2479
+ if (r === 0) {
2480
+ this.isAnimatingToFrame = !1;
2481
+ return;
2482
+ }
2483
+ const a = 30;
2484
+ let c = r;
2485
+ const h = () => {
2486
+ if (c <= 0) {
2487
+ this.isAnimatingToFrame = !1, i && this.hotspotsInstance && this.hotspotTimelineOnClick && setTimeout(() => {
2488
+ this.hotspotsInstance.showHotspotById(i);
2489
+ }, 50);
2490
+ return;
2491
+ }
2492
+ l ? this.moveRight() : this.moveLeft(), c--, c > 0 ? setTimeout(h, a) : (this.isAnimatingToFrame = !1, i && this.hotspotsInstance && this.hotspotTimelineOnClick && setTimeout(() => {
2493
+ this.hotspotsInstance.showHotspotById(i);
2494
+ }, 50));
2495
+ };
2496
+ h();
2497
+ }
2498
+ remove360ViewCircleIcon() {
2499
+ this.view360CircleIcon && (this.innerBox.removeChild(this.view360CircleIcon), this.view360CircleIcon = null);
2500
+ }
2501
+ addAllIcons() {
2502
+ this.removeLoader(), this.innerBox.style.cursor = "grab", this.pointerZoom && (this.createTransitionOverlay(), this.addLoadingSpinner()), !this.fullscreenView && !this.touchDevice && this.addMagnifierIcon(), this.fullscreenView || this.addFullscreenIcon(), this.initialIconShown && this.addInitialIcon(), this.bottomCircle && this.add360ViewCircleIcon();
2503
+ }
2504
+ showAllIcons() {
2505
+ this.showInitialIcon(), this.show360ViewCircleIcon(), this.showMagnifierIcon(), this.showFullscreenIcon(), this.showHotspotTimeline();
2506
+ }
2507
+ hideAllIcons() {
2508
+ this.hideInitialIcon(), this.hide360ViewCircleIcon(), this.hideMagnifierIcon(), this.hideFullscreenIcon(), this.hideHotspotTimeline();
2509
+ }
2510
+ removeLoader() {
2511
+ this.loader && (this.innerBox.removeChild(this.loader), this.loader = null);
2512
+ }
2513
+ attachEvents(t, i, n) {
2514
+ t && this.addMouseEvents(), i && this.addTouchEvents(), n && this.addKeyboardEvents(), this.addEscKeyHandler();
2515
+ }
2516
+ removeEvents() {
2517
+ this.removeMouseEvents(), this.removeTouchEvents(), this.removeKeyboardEvents(), this.removeEscKeyHandler();
2518
+ }
2519
+ addMouseEvents() {
2520
+ this.boundMouseClick = this.mouseClick.bind(this), this.boundMouseDown = this.mouseDown.bind(this), this.boundMouseMove = de(this.mouseMove.bind(this), ue), this.boundMouseUp = this.mouseUp.bind(this), this.boundMouseLeave = this.mouseLeave.bind(this), this.innerBox.addEventListener("click", this.boundMouseClick), this.innerBox.addEventListener("mousedown", this.boundMouseDown), this.innerBox.addEventListener("mouseleave", this.boundMouseLeave), document.addEventListener("mousemove", this.boundMouseMove), document.addEventListener("mouseup", this.boundMouseUp);
2521
+ }
2522
+ addTouchEvents() {
2523
+ this.boundTouchOutside = this.touchOutside.bind(this), this.boundTouchStart = this.touchStart.bind(this), this.boundTouchEnd = this.touchEnd.bind(this), this.boundTouchMove = de(this.touchMove.bind(this), ue), document.addEventListener("touchstart", this.boundTouchOutside), this.container.addEventListener("touchstart", this.boundTouchStart), this.container.addEventListener("touchend", this.boundTouchEnd), this.container.addEventListener("touchmove", this.boundTouchMove);
2524
+ }
2525
+ addKeyboardEvents() {
2526
+ this.boundKeyDown = this.keyDown.bind(this), this.boundKeyUp = this.keyUp.bind(this), document.addEventListener("keydown", this.boundKeyDown), document.addEventListener("keyup", this.boundKeyUp);
2527
+ }
2528
+ addEscKeyHandler() {
2529
+ this.boundEscHandler = (t) => {
2530
+ t.keyCode === 27 && (this.fullscreenView ? this.closeFullscreenModal(t) : this.isZoomed ? this.removeZoom() : this.glass && this.removeGlass());
2531
+ }, document.addEventListener("keydown", this.boundEscHandler);
2532
+ }
2533
+ removeEscKeyHandler() {
2534
+ document.removeEventListener("keydown", this.boundEscHandler);
2535
+ }
2536
+ removeMouseEvents() {
2537
+ this.innerBox.removeEventListener("click", this.boundMouseClick), this.innerBox.removeEventListener("mousedown", this.boundMouseDown), this.innerBox.removeEventListener("mouseleave", this.boundMouseLeave), document.removeEventListener("mousemove", this.boundMouseMove), document.removeEventListener("mouseup", this.boundMouseUp);
2538
+ }
2539
+ removeTouchEvents() {
2540
+ document.removeEventListener("touchstart", this.boundTouchOutside), this.container.removeEventListener("touchstart", this.boundTouchStart), this.container.removeEventListener("touchend", this.boundTouchEnd), this.container.removeEventListener("touchmove", this.boundTouchMove);
2541
+ }
2542
+ removeKeyboardEvents() {
2543
+ document.removeEventListener("keydown", this.boundKeyDown), document.removeEventListener("keyup", this.boundKeyUp);
2544
+ }
2545
+ createContainers(t) {
2546
+ this.iconsContainer = ge(this.innerBox), this.canvas = Vi(this.innerBox, t), this.loader = Ui(this.innerBox), this.ariaLiveRegion = Qi(this.innerBox);
2547
+ const i = this.canvas.transferControlToOffscreen();
2548
+ this.canvasWorker.postMessage(
2549
+ {
2550
+ action: "initCanvas",
2551
+ offscreen: i,
2552
+ devicePixelRatio: this.devicePixelRatio
2553
+ },
2554
+ [i]
2555
+ ), this.fullscreenView && this.addCloseFullscreenIcon(), Jt(this.innerBox, ".cloudimage-360-placeholder");
2556
+ }
2557
+ update(t) {
2558
+ this.isReady && (this.stopAutoplay(), Jt(this.innerBox, ".cloudimage-360-icons-container"), this.init(this.container, t, !0), this.iconsContainer = ge(this.innerBox), this.onAllImagesLoaded());
2559
+ }
2560
+ init(t, i, n) {
2561
+ const o = i ? Yi(i) : ki(t), {
2562
+ folder: s,
2563
+ apiVersion: l,
2564
+ filenameX: r,
2565
+ filenameY: a,
2566
+ imageListX: c,
2567
+ imageListY: h,
2568
+ indexZeroBase: p,
2569
+ amountX: f,
2570
+ amountY: u,
2571
+ draggable: I = !0,
2572
+ swipeable: g = !0,
2573
+ keys: v,
2574
+ keysReverse: m,
2575
+ bottomCircleOffset: b,
2576
+ autoplay: x,
2577
+ autoplayBehavior: w,
2578
+ playOnce: C,
2579
+ speed: y,
2580
+ autoplayReverse: O,
2581
+ fullscreen: S,
2582
+ magnifier: E,
2583
+ ciToken: A,
2584
+ ciFilters: L,
2585
+ ciTransformation: R,
2586
+ lazyload: T,
2587
+ dragSpeed: z,
2588
+ stopAtEdges: G,
2589
+ pointerZoom: Y,
2590
+ imageInfo: Z = "black",
2591
+ initialIconShown: rt,
2592
+ bottomCircle: U,
2593
+ hotspots: at,
2594
+ dragReverse: vt,
2595
+ hide360Logo: tt,
2596
+ logoSrc: lt,
2597
+ inertia: q,
2598
+ pinchZoom: V,
2599
+ hints: et,
2600
+ theme: it,
2601
+ hotspotTimelineOnClick: K = !0,
2602
+ // Event callbacks
2603
+ onReady: gt,
2604
+ onLoad: Vt,
2605
+ onSpin: yt,
2606
+ onAutoplayStart: jt,
2607
+ onAutoplayStop: Yt,
2608
+ onFullscreenOpen: $t,
2609
+ onFullscreenClose: zt,
2610
+ onZoomIn: Xt,
2611
+ onZoomOut: Pt,
2612
+ onDragStart: Gt,
2613
+ onDragEnd: Ut,
2614
+ onError: _
2615
+ } = o, nt = { ciToken: A, ciFilters: L, ciTransformation: R }, ct = qt(c, []), ht = qt(h, []);
2616
+ if (this.viewerConfig = o, this.amountX = ct.length || f, this.amountY = ht.length || u, this.allowSpinX = !!this.amountX, this.allowSpinY = !!this.amountY, this.activeImageX = O ? this.amountX - 1 : 0, this.activeImageY = O ? this.amountY - 1 : 0, this.bottomCircleOffset = b, this.autoplay = x, this.autoplayBehavior = w, this.playOnce = C, this.speed = y, this.autoplayReverse = O, this.fullscreen = S, this.magnifier = E > 1 ? Math.min(E, Ai) : 0, this.dragSpeed = Math.max(z, Si), this.stopAtEdges = G, this.ciParams = nt, this.apiVersion = l, this.pointerZoom = Y > 1 ? Math.min(Y, me) : null, this.keysReverse = m, this.info = Z, this.keys = v, this.innerBox = this.innerBox ?? zi(this.container), this.initialIconShown = rt, this.bottomCircle = U, this.spinDirection = Sn(this.autoplayBehavior, this.allowSpinX, this.allowSpinY), this.dragReverse = vt, this.hotspots = at, this.hide360Logo = tt, this.logoSrc = lt, this.inertia = q, this.pinchZoom = V, this.hints = et, this.hotspotTimelineOnClick = K, it === "dark" ? this.container.classList.add("ci360-theme-dark") : it === "light" && this.container.classList.remove("ci360-theme-dark"), this.onReady = gt, this.onLoad = Vt, this.onSpin = yt, this.onAutoplayStart = jt, this.onAutoplayStop = Yt, this.onFullscreenOpen = $t, this.onFullscreenClose = zt, this.onZoomIn = Xt, this.onZoomOut = Pt, this.onDragStart = Gt, this.onDragEnd = Ut, this.onError = _, this.srcXConfig = {
2617
+ folder: s,
2618
+ filename: r,
2619
+ imageList: ct,
2620
+ container: t,
2621
+ innerBox: this.innerBox,
2622
+ apiVersion: l,
2623
+ ciParams: nt,
2624
+ lazyload: T,
2625
+ amount: this.amountX,
2626
+ indexZeroBase: p,
2627
+ autoplayReverse: O,
2628
+ orientation: P.X
2629
+ }, this.srcYConfig = {
2630
+ ...this.srcXConfig,
2631
+ filename: a,
2632
+ imageList: ht,
2633
+ orientation: P.Y,
2634
+ amount: this.amountY
2635
+ }, n && this.removeEvents(), this.attachEvents(I, g, v), n) return;
2636
+ const dt = (this.fullscreenView ? document.body : this.container).offsetWidth, bt = this.allowSpinX && !ct.length ? Ot(this.srcXConfig, dt) : null, wt = this.allowSpinY && !ht.length ? Ot(this.srcYConfig, dt) : null, It = (Rt) => {
2637
+ ve({
2638
+ cdnPathX: bt,
2639
+ cdnPathY: wt,
2640
+ configX: this.srcXConfig,
2641
+ configY: this.srcYConfig,
2642
+ onImageLoad: (xt, Je, qe) => this.onImageLoad(xt, Je, qe),
2643
+ onFirstImageLoad: (xt) => this.onFirstImageLoaded(Rt, xt),
2644
+ onAllImagesLoad: this.onAllImagesLoaded.bind(this),
2645
+ onError: (xt) => this.emit("onError", xt)
2646
+ });
2647
+ };
2648
+ this.allowSpinX ? xe(bt, this.srcXConfig, It) : this.allowSpinY && xe(wt, this.srcYConfig, It);
2649
+ }
2650
+ }
2651
+ class qo {
2652
+ constructor() {
2653
+ this.views = /* @__PURE__ */ new Map(), this.initAll = this.initAll.bind(this), this.getViews = this.getViews.bind(this);
2654
+ }
2655
+ generateId() {
2656
+ return `ci360-${Math.random().toString(36).slice(2, 11)}`;
2657
+ }
2658
+ init(t, i, n) {
2659
+ if (!t) return;
2660
+ const o = t.id || this.generateId();
2661
+ t.id || (t.id = o);
2662
+ const s = new Ft(t, i, n);
2663
+ return this.views.set(o, s), s;
2664
+ }
2665
+ initAll(t = "cloudimage-360") {
2666
+ [...document.querySelectorAll(`.${t}`)].filter(Boolean).forEach((n) => {
2667
+ const o = n.id || this.generateId();
2668
+ n.id || (n.id = o);
2669
+ const s = new Ft(n);
2670
+ this.views.set(o, s);
2671
+ });
2672
+ }
2673
+ destroy(t) {
2674
+ const i = this.getViewById(t);
2675
+ i && (i.destroy(), this.views.delete(t));
2676
+ }
2677
+ destroyAll() {
2678
+ this.views.forEach((t) => {
2679
+ t.destroy();
2680
+ }), this.views.clear();
2681
+ }
2682
+ getViewById(t) {
2683
+ return this.views.get(t);
2684
+ }
2685
+ getViews() {
2686
+ return Array.from(this.views.values());
2687
+ }
2688
+ updateView(t, i) {
2689
+ const n = this.getViewById(t);
2690
+ if (!n) return null;
2691
+ const o = { ...n.viewerConfig, ...i };
2692
+ n.destroy();
2693
+ const s = document.getElementById(t);
2694
+ return this.init(s, o);
2695
+ }
2696
+ }
2697
+ export {
2698
+ qo as default
2699
+ };
2700
+ //# sourceMappingURL=ci360-CbNlMnNZ.mjs.map