@frybynite/image-cloud 0.7.4 → 0.7.5

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.
@@ -1,19 +1,19 @@
1
- const mt = Object.freeze({
1
+ const gt = Object.freeze({
2
2
  none: "none",
3
3
  sm: "0 2px 4px rgba(0,0,0,0.1)",
4
4
  md: "0 4px 16px rgba(0,0,0,0.4)",
5
5
  lg: "0 8px 32px rgba(0,0,0,0.5)",
6
6
  glow: "0 0 30px rgba(255,255,255,0.6)"
7
- }), Et = Object.freeze({
7
+ }), St = Object.freeze({
8
8
  energetic: Object.freeze({ overshoot: 0.25, bounces: 2, decayRatio: 0.5 }),
9
9
  playful: Object.freeze({ overshoot: 0.15, bounces: 1, decayRatio: 0.5 }),
10
10
  subtle: Object.freeze({ overshoot: 0.08, bounces: 1, decayRatio: 0.5 })
11
- }), St = Object.freeze({
11
+ }), It = Object.freeze({
12
12
  gentle: Object.freeze({ stiffness: 150, damping: 30, mass: 1, oscillations: 2 }),
13
13
  bouncy: Object.freeze({ stiffness: 300, damping: 15, mass: 1, oscillations: 4 }),
14
14
  wobbly: Object.freeze({ stiffness: 180, damping: 12, mass: 1.5, oscillations: 5 }),
15
15
  snappy: Object.freeze({ stiffness: 400, damping: 25, mass: 0.8, oscillations: 2 })
16
- }), It = Object.freeze({
16
+ }), At = Object.freeze({
17
17
  gentle: Object.freeze({ amplitude: 30, frequency: 1.5, decay: !0, decayRate: 0.9, phase: 0 }),
18
18
  playful: Object.freeze({ amplitude: 50, frequency: 2.5, decay: !0, decayRate: 0.7, phase: 0 }),
19
19
  serpentine: Object.freeze({ amplitude: 60, frequency: 3, decay: !1, decayRate: 1, phase: 0 }),
@@ -24,7 +24,7 @@ const mt = Object.freeze({
24
24
  mode: "none"
25
25
  }), vt = Object.freeze({
26
26
  mode: "none"
27
- }), Rt = Object.freeze({
27
+ }), Mt = Object.freeze({
28
28
  default: Object.freeze({
29
29
  border: Object.freeze({
30
30
  width: 0,
@@ -78,15 +78,15 @@ const mt = Object.freeze({
78
78
  min: -15,
79
79
  max: 15
80
80
  })
81
- }), Mt = Object.freeze({
81
+ }), Lt = Object.freeze({
82
82
  sizing: Ut,
83
83
  rotation: Ht
84
- }), Lt = Object.freeze({
84
+ }), zt = Object.freeze({
85
85
  validateUrls: !0,
86
86
  validationTimeout: 5e3,
87
87
  validationMethod: "head",
88
88
  allowedExtensions: ["jpg", "jpeg", "png", "gif", "webp", "bmp"]
89
- }), zt = Object.freeze({
89
+ }), Ft = Object.freeze({
90
90
  enabled: !1,
91
91
  centers: !1,
92
92
  loaders: !1
@@ -95,11 +95,11 @@ const mt = Object.freeze({
95
95
  loaders: [],
96
96
  // Shared loader settings and debug config
97
97
  config: Object.freeze({
98
- loaders: Lt,
99
- debug: zt
98
+ loaders: zt,
99
+ debug: Ft
100
100
  }),
101
101
  // Image sizing and rotation configuration
102
- image: Mt,
102
+ image: Lt,
103
103
  // Pattern-based layout configuration
104
104
  layout: Object.freeze({
105
105
  algorithm: "radial",
@@ -216,7 +216,7 @@ const mt = Object.freeze({
216
216
  })
217
217
  }),
218
218
  // Image styling
219
- styling: Rt
219
+ styling: Mt
220
220
  });
221
221
  function Z(n, t) {
222
222
  if (!n) return t || {};
@@ -246,15 +246,15 @@ function jt(n, t) {
246
246
  ...n.sizing,
247
247
  ...t.sizing
248
248
  }, t.sizing.variance)) {
249
- const i = t.sizing.variance, o = i.min !== void 0 && i.min >= 0.25 && i.min <= 1 ? i.min : n.sizing?.variance?.min ?? 1, s = i.max !== void 0 && i.max >= 1 && i.max <= 1.75 ? i.max : n.sizing?.variance?.max ?? 1;
250
- e.sizing.variance = { min: o, max: s };
249
+ const i = t.sizing.variance, o = i.min !== void 0 && i.min >= 0.25 && i.min <= 1 ? i.min : n.sizing?.variance?.min ?? 1, a = i.max !== void 0 && i.max >= 1 && i.max <= 1.75 ? i.max : n.sizing?.variance?.max ?? 1;
250
+ e.sizing.variance = { min: o, max: a };
251
251
  }
252
252
  if (t.rotation !== void 0 && (e.rotation = {
253
253
  ...n.rotation,
254
254
  ...t.rotation
255
255
  }, t.rotation.range)) {
256
- const i = t.rotation.range, o = i.min !== void 0 && i.min >= -180 && i.min <= 0 ? i.min : n.rotation?.range?.min ?? -15, s = i.max !== void 0 && i.max >= 0 && i.max <= 180 ? i.max : n.rotation?.range?.max ?? 15;
257
- e.rotation.range = { min: o, max: s };
256
+ const i = t.rotation.range, o = i.min !== void 0 && i.min >= -180 && i.min <= 0 ? i.min : n.rotation?.range?.min ?? -15, a = i.max !== void 0 && i.max >= 0 && i.max <= 180 ? i.max : n.rotation?.range?.max ?? 15;
257
+ e.rotation.range = { min: o, max: a };
258
258
  }
259
259
  return e;
260
260
  }
@@ -298,42 +298,42 @@ function Gt(n = {}) {
298
298
  });
299
299
  const r = {
300
300
  loaders: {
301
- ...Lt,
301
+ ...zt,
302
302
  ...n.config?.loaders ?? {}
303
303
  }
304
- }, a = {
304
+ }, s = {
305
305
  loaders: o,
306
306
  config: r,
307
- image: jt(Mt, i),
307
+ image: jt(Lt, i),
308
308
  layout: { ...y.layout },
309
309
  animation: { ...y.animation },
310
310
  interaction: { ...y.interaction },
311
311
  rendering: { ...y.rendering },
312
- styling: Nt(Rt, n.styling)
312
+ styling: Nt(Mt, n.styling)
313
313
  };
314
- return n.layout && (a.layout = {
314
+ return n.layout && (s.layout = {
315
315
  ...y.layout,
316
316
  ...n.layout
317
- }, n.layout.responsive && (a.layout.responsive = {
317
+ }, n.layout.responsive && (s.layout.responsive = {
318
318
  ...y.layout.responsive,
319
319
  mobile: n.layout.responsive.mobile ? { ...y.layout.responsive.mobile, ...n.layout.responsive.mobile } : y.layout.responsive.mobile,
320
320
  tablet: n.layout.responsive.tablet ? { ...y.layout.responsive.tablet, ...n.layout.responsive.tablet } : y.layout.responsive.tablet
321
- }), n.layout.spacing && (a.layout.spacing = {
321
+ }), n.layout.spacing && (s.layout.spacing = {
322
322
  ...y.layout.spacing,
323
323
  ...n.layout.spacing
324
- })), n.animation && (a.animation = {
324
+ })), n.animation && (s.animation = {
325
325
  ...y.animation,
326
326
  ...n.animation
327
- }, n.animation.easing && (a.animation.easing = {
327
+ }, n.animation.easing && (s.animation.easing = {
328
328
  ...y.animation.easing,
329
329
  ...n.animation.easing
330
- }), n.animation.queue && (a.animation.queue = {
330
+ }), n.animation.queue && (s.animation.queue = {
331
331
  ...y.animation.queue,
332
332
  ...n.animation.queue
333
- }), n.animation.performance && (a.animation.performance = {
333
+ }), n.animation.performance && (s.animation.performance = {
334
334
  ...y.animation.performance,
335
335
  ...n.animation.performance
336
- }), n.animation.entry && (a.animation.entry = {
336
+ }), n.animation.entry && (s.animation.entry = {
337
337
  ...y.animation.entry,
338
338
  ...n.animation.entry,
339
339
  start: n.animation.entry.start ? {
@@ -345,45 +345,45 @@ function Gt(n = {}) {
345
345
  path: n.animation.entry.path ? { ...bt, ...n.animation.entry.path } : y.animation.entry.path,
346
346
  rotation: n.animation.entry.rotation ? { ...yt, ...n.animation.entry.rotation } : y.animation.entry.rotation,
347
347
  scale: n.animation.entry.scale ? { ...vt, ...n.animation.entry.scale } : y.animation.entry.scale
348
- })), n.interaction && (a.interaction = {
348
+ })), n.interaction && (s.interaction = {
349
349
  ...y.interaction,
350
350
  ...n.interaction
351
- }, n.interaction.focus && (a.interaction.focus = {
351
+ }, n.interaction.focus && (s.interaction.focus = {
352
352
  ...y.interaction.focus,
353
353
  ...n.interaction.focus
354
- }), n.interaction.navigation && (a.interaction.navigation = {
354
+ }), n.interaction.navigation && (s.interaction.navigation = {
355
355
  ...y.interaction.navigation,
356
356
  ...n.interaction.navigation
357
- }), n.interaction.gestures && (a.interaction.gestures = {
357
+ }), n.interaction.gestures && (s.interaction.gestures = {
358
358
  ...y.interaction.gestures,
359
359
  ...n.interaction.gestures
360
- })), n.rendering && (a.rendering = {
360
+ })), n.rendering && (s.rendering = {
361
361
  ...y.rendering,
362
362
  ...n.rendering
363
- }, n.rendering.responsive && (a.rendering.responsive = {
363
+ }, n.rendering.responsive && (s.rendering.responsive = {
364
364
  ...y.rendering.responsive,
365
365
  ...n.rendering.responsive,
366
366
  breakpoints: n.rendering.responsive.breakpoints ? { ...y.rendering.responsive.breakpoints, ...n.rendering.responsive.breakpoints } : y.rendering.responsive.breakpoints,
367
367
  mobileDetection: n.rendering.responsive.mobileDetection ? n.rendering.responsive.mobileDetection : y.rendering.responsive.mobileDetection
368
- }), n.rendering.ui && (a.rendering.ui = {
368
+ }), n.rendering.ui && (s.rendering.ui = {
369
369
  ...y.rendering.ui,
370
370
  ...n.rendering.ui
371
- }), n.rendering.performance && (a.rendering.performance = {
371
+ }), n.rendering.performance && (s.rendering.performance = {
372
372
  ...y.rendering.performance,
373
373
  ...n.rendering.performance
374
- })), a.config.debug = {
375
- ...zt,
374
+ })), s.config.debug = {
375
+ ...Ft,
376
376
  ...n.config?.debug ?? {}
377
- }, a;
377
+ }, s;
378
378
  }
379
379
  function qt(n, t) {
380
- return { ...n ? Et[n] : Et.playful, ...t };
380
+ return { ...n ? St[n] : St.playful, ...t };
381
381
  }
382
382
  function Yt(n, t) {
383
- return { ...n ? St[n] : St.gentle, ...t };
383
+ return { ...n ? It[n] : It.gentle, ...t };
384
384
  }
385
385
  function Xt(n, t) {
386
- return { ...n ? It[n] : It.gentle, ...t };
386
+ return { ...n ? At[n] : At.gentle, ...t };
387
387
  }
388
388
  class Bt {
389
389
  constructor(t) {
@@ -410,31 +410,31 @@ class Bt {
410
410
  * @param easing - CSS easing function (optional)
411
411
  * @returns AnimationHandle that can be used to cancel or query the animation
412
412
  */
413
- animateTransformCancellable(t, e, i, o = null, s = null) {
413
+ animateTransformCancellable(t, e, i, o = null, a = null) {
414
414
  this.cancelAllAnimations(t);
415
- const r = o ?? this.config.duration, a = s ?? this.config.easing.default, h = this.buildTransformString(e), c = this.buildTransformString(i);
415
+ const r = o ?? this.config.duration, s = a ?? this.config.easing.default, h = this.buildTransformString(e), c = this.buildTransformString(i);
416
416
  t.style.transition = "none";
417
- const u = t.animate(
417
+ const d = t.animate(
418
418
  [
419
419
  { transform: h },
420
420
  { transform: c }
421
421
  ],
422
422
  {
423
423
  duration: r,
424
- easing: a,
424
+ easing: s,
425
425
  fill: "forwards"
426
426
  // Keep final state after animation
427
427
  }
428
428
  ), l = {
429
429
  id: `anim-${++this.animationIdCounter}`,
430
430
  element: t,
431
- animation: u,
431
+ animation: d,
432
432
  fromState: e,
433
433
  toState: i,
434
434
  startTime: performance.now(),
435
435
  duration: r
436
436
  };
437
- return this.activeAnimations.set(t, l), u.finished.then(() => {
437
+ return this.activeAnimations.set(t, l), d.finished.then(() => {
438
438
  t.style.transform = c, this.activeAnimations.delete(t);
439
439
  }).catch(() => {
440
440
  this.activeAnimations.delete(t);
@@ -481,8 +481,8 @@ class Bt {
481
481
  const i = getComputedStyle(t).transform;
482
482
  if (i === "none" || !i)
483
483
  return { x: 0, y: 0, rotation: 0, scale: 1 };
484
- const o = new DOMMatrix(i), s = Math.sqrt(o.a * o.a + o.b * o.b), r = Math.atan2(o.b, o.a) * (180 / Math.PI), a = o.e, h = o.f;
485
- return { x: a, y: h, rotation: r, scale: s };
484
+ const o = new DOMMatrix(i), a = Math.sqrt(o.a * o.a + o.b * o.b), r = Math.atan2(o.b, o.a) * (180 / Math.PI), s = o.e, h = o.f;
485
+ return { x: s, y: h, rotation: r, scale: a };
486
486
  }
487
487
  /**
488
488
  * Check if an element has an active animation
@@ -509,10 +509,10 @@ class Bt {
509
509
  * @returns Promise that resolves when animation completes
510
510
  */
511
511
  animateTransform(t, e, i = null, o = null) {
512
- return new Promise((s) => {
513
- const r = i ?? this.config.duration, a = o ?? this.config.easing.default;
514
- t.style.transition = `transform ${r}ms ${a}, box-shadow ${r}ms ${a}`, t.style.transform = this.buildTransformString(e), setTimeout(() => {
515
- s();
512
+ return new Promise((a) => {
513
+ const r = i ?? this.config.duration, s = o ?? this.config.easing.default;
514
+ t.style.transition = `transform ${r}ms ${s}, box-shadow ${r}ms ${s}`, t.style.transform = this.buildTransformString(e), setTimeout(() => {
515
+ a();
516
516
  }, r);
517
517
  });
518
518
  }
@@ -545,27 +545,27 @@ function V(n, t, e) {
545
545
  return n + (t - n) * e;
546
546
  }
547
547
  function Jt(n, t, e, i) {
548
- const { overshoot: o, bounces: s, decayRatio: r } = i, a = e.x - t.x, h = e.y - t.y, c = Vt(s, r);
549
- let u = 0, l = 0, d = 1, m = o, b = !1;
550
- for (let g = 0; g < c.length; g++)
551
- if (n <= c[g].time) {
552
- l = g === 0 ? 0 : c[g - 1].time, d = c[g].time, m = c[g].overshoot, b = c[g].isOvershoot;
548
+ const { overshoot: o, bounces: a, decayRatio: r } = i, s = e.x - t.x, h = e.y - t.y, c = Vt(a, r);
549
+ let d = 0, l = 0, u = 1, g = o, p = !1;
550
+ for (let f = 0; f < c.length; f++)
551
+ if (n <= c[f].time) {
552
+ l = f === 0 ? 0 : c[f - 1].time, u = c[f].time, g = c[f].overshoot, p = c[f].isOvershoot;
553
553
  break;
554
554
  }
555
- const p = (n - l) / (d - l);
556
- if (b)
557
- u = 1 + m * ot(p);
555
+ const b = (n - l) / (u - l);
556
+ if (p)
557
+ d = 1 + g * it(b);
558
558
  else if (l === 0)
559
- u = ot(p);
559
+ d = it(b);
560
560
  else {
561
- const f = 1 + (c.find(
561
+ const m = 1 + (c.find(
562
562
  (E, v) => E.time > l && v > 0 && c[v - 1].isOvershoot
563
- )?.overshoot || m);
564
- u = V(f, 1, ot(p));
563
+ )?.overshoot || g);
564
+ d = V(m, 1, it(b));
565
565
  }
566
566
  return {
567
- x: t.x + a * u,
568
- y: t.y + h * u
567
+ x: t.x + s * d,
568
+ y: t.y + h * d
569
569
  };
570
570
  }
571
571
  function Vt(n, t) {
@@ -574,56 +574,56 @@ function Vt(n, t) {
574
574
  e.push({ time: i, overshoot: 0, isOvershoot: !1 });
575
575
  let o = 0.15;
576
576
  const r = 0.4 / (n * 2);
577
- for (let a = 0; a < n; a++)
577
+ for (let s = 0; s < n; s++)
578
578
  i += r, e.push({ time: i, overshoot: o, isOvershoot: !0 }), i += r, e.push({ time: i, overshoot: o * t, isOvershoot: !1 }), o *= t;
579
579
  return e.push({ time: 1, overshoot: 0, isOvershoot: !1 }), e;
580
580
  }
581
581
  function Kt(n, t, e, i) {
582
- const { stiffness: o, damping: s, mass: r, oscillations: a } = i, h = e.x - t.x, c = e.y - t.y, u = Math.sqrt(o / r), l = s / (2 * Math.sqrt(o * r));
583
- let d;
582
+ const { stiffness: o, damping: a, mass: r, oscillations: s } = i, h = e.x - t.x, c = e.y - t.y, d = Math.sqrt(o / r), l = a / (2 * Math.sqrt(o * r));
583
+ let u;
584
584
  if (l < 1) {
585
- const m = u * Math.sqrt(1 - l * l), b = Math.exp(-l * u * n * 3), p = Math.cos(m * n * a * Math.PI);
586
- d = 1 - b * p;
585
+ const g = d * Math.sqrt(1 - l * l), p = Math.exp(-l * d * n * 3), b = Math.cos(g * n * s * Math.PI);
586
+ u = 1 - p * b;
587
587
  } else
588
- d = 1 - Math.exp(-u * n * 3);
589
- return d = Math.max(0, Math.min(d, 1.3)), {
590
- x: t.x + h * d,
591
- y: t.y + c * d
588
+ u = 1 - Math.exp(-d * n * 3);
589
+ return u = Math.max(0, Math.min(u, 1.3)), {
590
+ x: t.x + h * u,
591
+ y: t.y + c * u
592
592
  };
593
593
  }
594
594
  function Zt(n, t, e, i) {
595
- const { amplitude: o, frequency: s, decay: r, decayRate: a, phase: h } = i, c = e.x - t.x, u = e.y - t.y, l = Math.sqrt(c * c + u * u), d = l > 0 ? -u / l : 0, m = l > 0 ? c / l : 1, b = s * Math.PI * 2 * n + h, p = r ? Math.pow(1 - n, a) : 1, g = o * Math.sin(b) * p, f = Qt(n);
595
+ const { amplitude: o, frequency: a, decay: r, decayRate: s, phase: h } = i, c = e.x - t.x, d = e.y - t.y, l = Math.sqrt(c * c + d * d), u = l > 0 ? -d / l : 0, g = l > 0 ? c / l : 1, p = a * Math.PI * 2 * n + h, b = r ? Math.pow(1 - n, s) : 1, f = o * Math.sin(p) * b, m = Qt(n);
596
596
  return {
597
- x: V(t.x, e.x, f) + g * d,
598
- y: V(t.y, e.y, f) + g * m
597
+ x: V(t.x, e.x, m) + f * u,
598
+ y: V(t.y, e.y, m) + f * g
599
599
  };
600
600
  }
601
- function ot(n) {
601
+ function it(n) {
602
602
  return 1 - (1 - n) * (1 - n);
603
603
  }
604
604
  function Qt(n) {
605
605
  return 1 - Math.pow(1 - n, 3);
606
606
  }
607
607
  function te(n, t, e) {
608
- const { amplitude: i, frequency: o, decay: s } = e, r = Math.sin(n * o * Math.PI * 2), a = s ? Math.pow(1 - n, 2) : 1, h = i * r * a;
608
+ const { amplitude: i, frequency: o, decay: a } = e, r = Math.sin(n * o * Math.PI * 2), s = a ? Math.pow(1 - n, 2) : 1, h = i * r * s;
609
609
  return t + h;
610
610
  }
611
611
  function ee(n, t, e) {
612
- const { overshoot: i, bounces: o } = e, s = [];
613
- s.push({ time: 0.5, scale: i });
612
+ const { overshoot: i, bounces: o } = e, a = [];
613
+ a.push({ time: 0.5, scale: i });
614
614
  let r = i;
615
- const a = 0.5, c = 0.5 / (o * 2);
616
- let u = 0.5;
617
- for (let d = 0; d < o; d++) {
618
- const m = 1 - (r - 1) * a;
619
- u += c, s.push({ time: u, scale: m }), r = 1 + (r - 1) * a * a, u += c, d < o - 1 && s.push({ time: u, scale: r });
615
+ const s = 0.5, c = 0.5 / (o * 2);
616
+ let d = 0.5;
617
+ for (let u = 0; u < o; u++) {
618
+ const g = 1 - (r - 1) * s;
619
+ d += c, a.push({ time: d, scale: g }), r = 1 + (r - 1) * s * s, d += c, u < o - 1 && a.push({ time: d, scale: r });
620
620
  }
621
- s.push({ time: 1, scale: 1 });
621
+ a.push({ time: 1, scale: 1 });
622
622
  let l = 1;
623
- for (let d = 0; d < s.length; d++)
624
- if (n <= s[d].time) {
625
- const m = d === 0 ? 0 : s[d - 1].time, b = d === 0 ? 1 : s[d - 1].scale, p = (n - m) / (s[d].time - m), g = ot(p);
626
- l = b + (s[d].scale - b) * g;
623
+ for (let u = 0; u < a.length; u++)
624
+ if (n <= a[u].time) {
625
+ const g = u === 0 ? 0 : a[u - 1].time, p = u === 0 ? 1 : a[u - 1].scale, b = (n - g) / (a[u].time - g), f = it(b);
626
+ l = p + (a[u].scale - p) * f;
627
627
  break;
628
628
  }
629
629
  return l * t;
@@ -634,61 +634,61 @@ function ie(n) {
634
634
  startPosition: e,
635
635
  endPosition: i,
636
636
  pathConfig: o,
637
- duration: s,
637
+ duration: a,
638
638
  imageWidth: r,
639
- imageHeight: a,
639
+ imageHeight: s,
640
640
  rotation: h,
641
641
  scale: c,
642
- onComplete: u,
642
+ onComplete: d,
643
643
  rotationConfig: l,
644
- startRotation: d,
645
- scaleConfig: m,
646
- startScale: b
647
- } = n, p = o.type, g = d !== void 0 && d !== h, f = l?.mode === "wobble", E = l?.wobble || { amplitude: 15, frequency: 3, decay: !0 }, v = g || f, w = b !== void 0 && b !== c, S = m?.mode === "pop", x = m?.pop || { overshoot: 1.2, bounces: 1 };
648
- if ((p === "linear" || p === "arc") && !v && !(w || S)) {
649
- u && u();
644
+ startRotation: u,
645
+ scaleConfig: g,
646
+ startScale: p
647
+ } = n, b = o.type, f = u !== void 0 && u !== h, m = l?.mode === "wobble", E = l?.wobble || { amplitude: 15, frequency: 3, decay: !0 }, v = f || m, w = p !== void 0 && p !== c, S = g?.mode === "pop", x = g?.pop || { overshoot: 1.2, bounces: 1 };
648
+ if ((b === "linear" || b === "arc") && !v && !(w || S)) {
649
+ d && d();
650
650
  return;
651
651
  }
652
- const L = performance.now(), z = -r / 2, _ = -a / 2;
652
+ const L = performance.now(), z = -r / 2, _ = -s / 2;
653
653
  function U(Y) {
654
- const N = Y - L, T = Math.min(N / s, 1);
654
+ const N = Y - L, C = Math.min(N / a, 1);
655
655
  let O;
656
- switch (p) {
656
+ switch (b) {
657
657
  case "bounce": {
658
- const D = qt(
658
+ const $ = qt(
659
659
  o.bouncePreset,
660
660
  o.bounce
661
661
  );
662
- O = Jt(T, e, i, D);
662
+ O = Jt(C, e, i, $);
663
663
  break;
664
664
  }
665
665
  case "elastic": {
666
- const D = Yt(
666
+ const $ = Yt(
667
667
  o.elasticPreset,
668
668
  o.elastic
669
669
  );
670
- O = Kt(T, e, i, D);
670
+ O = Kt(C, e, i, $);
671
671
  break;
672
672
  }
673
673
  case "wave": {
674
- const D = Xt(
674
+ const $ = Xt(
675
675
  o.wavePreset,
676
676
  o.wave
677
677
  );
678
- O = Zt(T, e, i, D);
678
+ O = Zt(C, e, i, $);
679
679
  break;
680
680
  }
681
681
  default:
682
682
  O = {
683
- x: V(e.x, i.x, T),
684
- y: V(e.y, i.y, T)
683
+ x: V(e.x, i.x, C),
684
+ y: V(e.y, i.y, C)
685
685
  };
686
686
  }
687
687
  const k = O.x - i.x, H = O.y - i.y;
688
688
  let R;
689
- f ? R = te(T, h, E) : g ? R = V(d, h, T) : R = h;
690
- let C;
691
- S ? C = ee(T, c, x) : w ? C = V(b, c, T) : C = c, t.style.transform = `translate(${z}px, ${_}px) translate(${k}px, ${H}px) rotate(${R}deg) scale(${C})`, T < 1 ? requestAnimationFrame(U) : (t.style.transform = `translate(${z}px, ${_}px) rotate(${h}deg) scale(${c})`, u && u());
689
+ m ? R = te(C, h, E) : f ? R = V(u, h, C) : R = h;
690
+ let T;
691
+ S ? T = ee(C, c, x) : w ? T = V(p, c, C) : T = c, t.style.transform = `translate(${z}px, ${_}px) translate(${k}px, ${H}px) rotate(${R}deg) scale(${T})`, C < 1 ? requestAnimationFrame(U) : (t.style.transform = `translate(${z}px, ${_}px) rotate(${h}deg) scale(${c})`, d && d());
692
692
  }
693
693
  requestAnimationFrame(U);
694
694
  }
@@ -716,72 +716,72 @@ class se {
716
716
  /**
717
717
  * Calculate the starting position for an image's entry animation
718
718
  */
719
- calculateStartPosition(t, e, i, o, s) {
720
- const r = this.resolvedStartPosition, a = this.config.start.offset ?? 100;
719
+ calculateStartPosition(t, e, i, o, a) {
720
+ const r = this.resolvedStartPosition, s = this.config.start.offset ?? 100;
721
721
  switch (r) {
722
722
  case "nearest-edge":
723
- return this.calculateNearestEdge(t, e, i, a);
723
+ return this.calculateNearestEdge(t, e, i, s);
724
724
  case "top":
725
- return this.calculateEdgePosition("top", t, e, i, a);
725
+ return this.calculateEdgePosition("top", t, e, i, s);
726
726
  case "bottom":
727
- return this.calculateEdgePosition("bottom", t, e, i, a);
727
+ return this.calculateEdgePosition("bottom", t, e, i, s);
728
728
  case "left":
729
- return this.calculateEdgePosition("left", t, e, i, a);
729
+ return this.calculateEdgePosition("left", t, e, i, s);
730
730
  case "right":
731
- return this.calculateEdgePosition("right", t, e, i, a);
731
+ return this.calculateEdgePosition("right", t, e, i, s);
732
732
  case "center":
733
733
  return this.calculateCenterPosition(i, t, e);
734
734
  case "random-edge":
735
- return this.calculateRandomEdge(t, e, i, a);
735
+ return this.calculateRandomEdge(t, e, i, s);
736
736
  case "circular":
737
737
  return this.calculateCircularPosition(
738
738
  t,
739
739
  e,
740
740
  i,
741
741
  o,
742
- s
742
+ a
743
743
  );
744
744
  default:
745
- return this.calculateNearestEdge(t, e, i, a);
745
+ return this.calculateNearestEdge(t, e, i, s);
746
746
  }
747
747
  }
748
748
  /**
749
749
  * Calculate start position from the nearest edge (current default behavior)
750
750
  */
751
751
  calculateNearestEdge(t, e, i, o) {
752
- const s = t.x, r = t.y, a = s, h = i.width - s, c = r, u = i.height - r, l = Math.min(a, h, c, u);
753
- let d = t.x, m = t.y;
754
- return l === a ? d = -(e.width + o) : l === h ? d = i.width + o : l === c ? m = -(e.height + o) : m = i.height + o, { x: d, y: m };
752
+ const a = t.x, r = t.y, s = a, h = i.width - a, c = r, d = i.height - r, l = Math.min(s, h, c, d);
753
+ let u = t.x, g = t.y;
754
+ return l === s ? u = -(e.width + o) : l === h ? u = i.width + o : l === c ? g = -(e.height + o) : g = i.height + o, { x: u, y: g };
755
755
  }
756
756
  /**
757
757
  * Calculate start position from a specific edge
758
758
  */
759
- calculateEdgePosition(t, e, i, o, s) {
760
- let r = e.x, a = e.y;
759
+ calculateEdgePosition(t, e, i, o, a) {
760
+ let r = e.x, s = e.y;
761
761
  switch (t) {
762
762
  case "top":
763
- a = -(i.height + s);
763
+ s = -(i.height + a);
764
764
  break;
765
765
  case "bottom":
766
- a = o.height + s;
766
+ s = o.height + a;
767
767
  break;
768
768
  case "left":
769
- r = -(i.width + s);
769
+ r = -(i.width + a);
770
770
  break;
771
771
  case "right":
772
- r = o.width + s;
772
+ r = o.width + a;
773
773
  break;
774
774
  }
775
- return { x: r, y: a };
775
+ return { x: r, y: s };
776
776
  }
777
777
  /**
778
778
  * Calculate start position from center with scale animation
779
779
  */
780
780
  calculateCenterPosition(t, e, i) {
781
- const o = t.width / 2, s = t.height / 2;
781
+ const o = t.width / 2, a = t.height / 2;
782
782
  return {
783
783
  x: o,
784
- y: s,
784
+ y: a,
785
785
  useScale: !0
786
786
  // Signal to use scale animation from 0
787
787
  };
@@ -790,27 +790,27 @@ class se {
790
790
  * Calculate start position from a random edge
791
791
  */
792
792
  calculateRandomEdge(t, e, i, o) {
793
- const s = ["top", "bottom", "left", "right"], r = s[Math.floor(Math.random() * s.length)];
793
+ const a = ["top", "bottom", "left", "right"], r = a[Math.floor(Math.random() * a.length)];
794
794
  return this.calculateEdgePosition(r, t, e, i, o);
795
795
  }
796
796
  /**
797
797
  * Calculate start position on a circle around the container
798
798
  */
799
- calculateCircularPosition(t, e, i, o, s) {
800
- const r = this.config.start.circular || {}, a = r.distribution || "even";
799
+ calculateCircularPosition(t, e, i, o, a) {
800
+ const r = this.config.start.circular || {}, s = r.distribution || "even";
801
801
  let h;
802
802
  const c = r.radius || "120%";
803
803
  if (typeof c == "string" && c.endsWith("%")) {
804
- const p = parseFloat(c) / 100;
804
+ const b = parseFloat(c) / 100;
805
805
  h = Math.sqrt(
806
806
  i.width ** 2 + i.height ** 2
807
- ) * p / 2;
807
+ ) * b / 2;
808
808
  } else
809
809
  h = typeof c == "number" ? c : 500;
810
- let u;
811
- a === "even" ? u = o / s * 2 * Math.PI : u = Math.random() * 2 * Math.PI;
812
- const l = i.width / 2, d = i.height / 2, m = l + Math.cos(u) * h, b = d + Math.sin(u) * h;
813
- return { x: m, y: b };
810
+ let d;
811
+ s === "even" ? d = o / a * 2 * Math.PI : d = Math.random() * 2 * Math.PI;
812
+ const l = i.width / 2, u = i.height / 2, g = l + Math.cos(d) * h, p = u + Math.sin(d) * h;
813
+ return { x: g, y: p };
814
814
  }
815
815
  /**
816
816
  * Get animation parameters for an image
@@ -829,9 +829,9 @@ class se {
829
829
  * Build a CSS transform string for the start position
830
830
  * Uses pixel-based centering offset for reliable cross-browser behavior
831
831
  */
832
- buildStartTransform(t, e, i, o, s, r, a, h) {
833
- const c = t.x - e.x, u = t.y - e.y, l = a !== void 0 ? a : i, d = h !== void 0 ? h : o, m = s !== void 0 ? -s / 2 : 0, b = r !== void 0 ? -r / 2 : 0, p = s !== void 0 ? `translate(${m}px, ${b}px)` : "translate(-50%, -50%)";
834
- return t.useScale ? `${p} translate(${c}px, ${u}px) rotate(${l}deg) scale(0)` : `${p} translate(${c}px, ${u}px) rotate(${l}deg) scale(${d})`;
832
+ buildStartTransform(t, e, i, o, a, r, s, h) {
833
+ const c = t.x - e.x, d = t.y - e.y, l = s !== void 0 ? s : i, u = h !== void 0 ? h : o, g = a !== void 0 ? -a / 2 : 0, p = r !== void 0 ? -r / 2 : 0, b = a !== void 0 ? `translate(${g}px, ${p}px)` : "translate(-50%, -50%)";
834
+ return t.useScale ? `${b} translate(${c}px, ${d}px) rotate(${l}deg) scale(0)` : `${b} translate(${c}px, ${d}px) rotate(${l}deg) scale(${u})`;
835
835
  }
836
836
  /**
837
837
  * Build the final CSS transform string
@@ -839,8 +839,8 @@ class se {
839
839
  */
840
840
  buildFinalTransform(t, e, i, o) {
841
841
  if (i !== void 0 && o !== void 0) {
842
- const s = -i / 2, r = -o / 2;
843
- return `translate(${s}px, ${r}px) rotate(${t}deg) scale(${e})`;
842
+ const a = -i / 2, r = -o / 2;
843
+ return `translate(${a}px, ${r}px) rotate(${t}deg) scale(${e})`;
844
844
  }
845
845
  return `translate(-50%, -50%) rotate(${t}deg) scale(${e})`;
846
846
  }
@@ -958,7 +958,7 @@ class se {
958
958
  amplitude: 15,
959
959
  frequency: 3,
960
960
  decay: !0
961
- }, { amplitude: o, frequency: s, decay: r } = i, a = Math.sin(t * s * Math.PI * 2), h = r ? Math.pow(1 - t, 2) : 1, c = o * a * h;
961
+ }, { amplitude: o, frequency: a, decay: r } = i, s = Math.sin(t * a * Math.PI * 2), h = r ? Math.pow(1 - t, 2) : 1, c = o * s * h;
962
962
  return e + c;
963
963
  }
964
964
  /**
@@ -1015,15 +1015,15 @@ class se {
1015
1015
  const i = this.scaleConfig.pop || {
1016
1016
  overshoot: 1.2,
1017
1017
  bounces: 1
1018
- }, { overshoot: o, bounces: s } = i, r = this.generateScaleBounceKeyframes(s, o);
1019
- let a = e;
1018
+ }, { overshoot: o, bounces: a } = i, r = this.generateScaleBounceKeyframes(a, o);
1019
+ let s = e;
1020
1020
  for (let h = 0; h < r.length; h++)
1021
1021
  if (t <= r[h].time) {
1022
- const c = h === 0 ? 0 : r[h - 1].time, u = h === 0 ? e : r[h - 1].scale, l = (t - c) / (r[h].time - c), d = this.easeOutQuad(l);
1023
- a = u + (r[h].scale - u) * d;
1022
+ const c = h === 0 ? 0 : r[h - 1].time, d = h === 0 ? e : r[h - 1].scale, l = (t - c) / (r[h].time - c), u = this.easeOutQuad(l);
1023
+ s = d + (r[h].scale - d) * u;
1024
1024
  break;
1025
1025
  }
1026
- return a * e;
1026
+ return s * e;
1027
1027
  }
1028
1028
  /**
1029
1029
  * Generate keyframes for scale bounce animation
@@ -1032,11 +1032,11 @@ class se {
1032
1032
  const i = [];
1033
1033
  i.push({ time: 0.5, scale: e });
1034
1034
  let o = e;
1035
- const s = 0.5, a = 0.5 / (t * 2);
1035
+ const a = 0.5, s = 0.5 / (t * 2);
1036
1036
  let h = 0.5;
1037
1037
  for (let c = 0; c < t; c++) {
1038
- const u = 1 - (o - 1) * s;
1039
- h += a, i.push({ time: h, scale: u }), o = 1 + (o - 1) * s * s, h += a, c < t - 1 && i.push({ time: h, scale: o });
1038
+ const d = 1 - (o - 1) * a;
1039
+ h += s, i.push({ time: h, scale: d }), o = 1 + (o - 1) * a * a, h += s, c < t - 1 && i.push({ time: h, scale: o });
1040
1040
  }
1041
1041
  return i.push({ time: 1, scale: 1 }), i;
1042
1042
  }
@@ -1059,9 +1059,9 @@ class ae {
1059
1059
  * @returns Array of layout objects with position, rotation, scale
1060
1060
  */
1061
1061
  generate(t, e, i = {}) {
1062
- const o = [], { width: s, height: r } = e, a = this.config.spacing.padding, h = i.fixedHeight ?? 200, c = this.imageConfig.rotation?.mode ?? "none", u = this.imageConfig.rotation?.range?.min ?? -15, l = this.imageConfig.rotation?.range?.max ?? 15, d = this.imageConfig.sizing?.variance?.min ?? 1, m = this.imageConfig.sizing?.variance?.max ?? 1, b = d !== 1 || m !== 1, g = h * 1.5 / 2, f = h / 2, E = s - a - g, v = r - a - f, w = a + g, S = a + f;
1062
+ const o = [], { width: a, height: r } = e, s = this.config.spacing.padding, h = i.fixedHeight ?? 200, c = this.imageConfig.rotation?.mode ?? "none", d = this.imageConfig.rotation?.range?.min ?? -15, l = this.imageConfig.rotation?.range?.max ?? 15, u = this.imageConfig.sizing?.variance?.min ?? 1, g = this.imageConfig.sizing?.variance?.max ?? 1, p = u !== 1 || g !== 1, f = h * 1.5 / 2, m = h / 2, E = a - s - f, v = r - s - m, w = s + f, S = s + m;
1063
1063
  for (let x = 0; x < t; x++) {
1064
- const A = this.random(w, E), L = this.random(S, v), z = c === "random" ? this.random(u, l) : 0, _ = b ? this.random(d, m) : 1, U = h * _, Y = {
1064
+ const A = this.random(w, E), L = this.random(S, v), z = c === "random" ? this.random(d, l) : 0, _ = p ? this.random(u, g) : 1, U = h * _, Y = {
1065
1065
  id: x,
1066
1066
  x: A,
1067
1067
  y: L,
@@ -1095,14 +1095,14 @@ class re {
1095
1095
  * @returns Array of layout objects with position, rotation, scale
1096
1096
  */
1097
1097
  generate(t, e, i = {}) {
1098
- const o = [], { width: s, height: r } = e, a = i.fixedHeight ?? 200, h = this.imageConfig.rotation?.mode ?? "none", c = this.imageConfig.rotation?.range?.min ?? -15, u = this.imageConfig.rotation?.range?.max ?? 15, l = this.imageConfig.sizing?.variance?.min ?? 1, d = this.imageConfig.sizing?.variance?.max ?? 1, m = l !== 1 || d !== 1, b = this.config.scaleDecay ?? 0, p = i.fixedHeight ?? a, g = s / 2, f = r / 2, E = Math.ceil(Math.sqrt(t));
1098
+ const o = [], { width: a, height: r } = e, s = i.fixedHeight ?? 200, h = this.imageConfig.rotation?.mode ?? "none", c = this.imageConfig.rotation?.range?.min ?? -15, d = this.imageConfig.rotation?.range?.max ?? 15, l = this.imageConfig.sizing?.variance?.min ?? 1, u = this.imageConfig.sizing?.variance?.max ?? 1, g = l !== 1 || u !== 1, p = this.config.scaleDecay ?? 0, b = i.fixedHeight ?? s, f = a / 2, m = r / 2, E = Math.ceil(Math.sqrt(t));
1099
1099
  if (t > 0) {
1100
- const S = m ? this.random(l, d) : 1, x = p * S;
1100
+ const S = g ? this.random(l, u) : 1, x = b * S;
1101
1101
  o.push({
1102
1102
  id: 0,
1103
- x: g,
1104
- y: f,
1105
- rotation: h === "random" ? this.random(c * 0.33, u * 0.33) : 0,
1103
+ x: f,
1104
+ y: m,
1105
+ rotation: h === "random" ? this.random(c * 0.33, d * 0.33) : 0,
1106
1106
  // Less rotation for center
1107
1107
  scale: S,
1108
1108
  baseSize: x,
@@ -1112,22 +1112,22 @@ class re {
1112
1112
  }
1113
1113
  let v = 1, w = 1;
1114
1114
  for (; v < t; ) {
1115
- const S = w / E, x = b > 0 ? 1 - S * b * 0.5 : 1, A = w * (p * 0.8), L = A * 1.5, z = Math.PI * (3 * (L + A) - Math.sqrt((3 * L + A) * (L + 3 * A))), _ = this.estimateWidth(p), U = Math.floor(z / (_ * 0.7));
1115
+ const S = w / E, x = p > 0 ? 1 - S * p * 0.5 : 1, A = w * (b * 0.8), L = A * 1.5, z = Math.PI * (3 * (L + A) - Math.sqrt((3 * L + A) * (L + 3 * A))), _ = this.estimateWidth(b), U = Math.floor(z / (_ * 0.7));
1116
1116
  if (U === 0) {
1117
1117
  w++;
1118
1118
  continue;
1119
1119
  }
1120
1120
  const Y = 2 * Math.PI / U, N = w * (20 * Math.PI / 180);
1121
- for (let T = 0; T < U && v < t; T++) {
1122
- const O = T * Y + N, k = m ? this.random(l, d) : 1, H = x * k, R = p * H;
1123
- let C = g + Math.cos(O) * L, D = f + Math.sin(O) * A;
1124
- const $ = this.config.spacing.padding ?? 50, P = R * 1.5 / 2, M = R / 2;
1125
- C - P < $ ? C = $ + P : C + P > s - $ && (C = s - $ - P), D - M < $ ? D = $ + M : D + M > r - $ && (D = r - $ - M);
1126
- const W = h === "random" ? this.random(c, u) : 0;
1121
+ for (let C = 0; C < U && v < t; C++) {
1122
+ const O = C * Y + N, k = g ? this.random(l, u) : 1, H = x * k, R = b * H;
1123
+ let T = f + Math.cos(O) * L, $ = m + Math.sin(O) * A;
1124
+ const D = this.config.spacing.padding ?? 50, P = R * 1.5 / 2, M = R / 2;
1125
+ T - P < D ? T = D + P : T + P > a - D && (T = a - D - P), $ - M < D ? $ = D + M : $ + M > r - D && ($ = r - D - M);
1126
+ const W = h === "random" ? this.random(c, d) : 0;
1127
1127
  o.push({
1128
1128
  id: v,
1129
- x: C,
1130
- y: D,
1129
+ x: T,
1130
+ y: $,
1131
1131
  rotation: W,
1132
1132
  scale: H,
1133
1133
  baseSize: R,
@@ -1168,7 +1168,7 @@ const ce = {
1168
1168
  alignment: "center",
1169
1169
  gap: 10,
1170
1170
  overflowOffset: 0.25
1171
- }, At = [
1171
+ }, Ct = [
1172
1172
  { x: 1, y: 1 },
1173
1173
  // bottom-right
1174
1174
  { x: -1, y: -1 },
@@ -1198,65 +1198,65 @@ class le {
1198
1198
  * @returns Array of layout objects with position, rotation, scale
1199
1199
  */
1200
1200
  generate(t, e, i = {}) {
1201
- const o = [], { width: s, height: r } = e, a = { ...ce, ...this.config.grid }, h = this.config.spacing.padding, c = i.fixedHeight ?? 200, u = this.imageConfig.rotation?.mode ?? "none", l = this.imageConfig.sizing?.variance?.min ?? 1, d = this.imageConfig.sizing?.variance?.max ?? 1, m = l !== 1 || d !== 1, b = s - 2 * h, p = r - 2 * h, { columns: g, rows: f } = this.calculateGridDimensions(
1201
+ const o = [], { width: a, height: r } = e, s = { ...ce, ...this.config.grid }, h = this.config.spacing.padding, c = i.fixedHeight ?? 200, d = this.imageConfig.rotation?.mode ?? "none", l = this.imageConfig.sizing?.variance?.min ?? 1, u = this.imageConfig.sizing?.variance?.max ?? 1, g = l !== 1 || u !== 1, p = a - 2 * h, b = r - 2 * h, { columns: f, rows: m } = this.calculateGridDimensions(
1202
1202
  t,
1203
- b,
1204
1203
  p,
1204
+ b,
1205
1205
  c,
1206
- a
1207
- ), E = a.stagger === "row", v = a.stagger === "column", w = E ? g + 0.5 : g, S = v ? f + 0.5 : f, x = (b - a.gap * (g - 1)) / w, A = (p - a.gap * (f - 1)) / S, L = E ? x / 2 : 0, z = v ? A / 2 : 0, _ = 1 + a.overlap, U = Math.min(x, A) * _, Y = i.fixedHeight ? Math.min(i.fixedHeight, U) : U, N = g * x + (g - 1) * a.gap + L, T = f * A + (f - 1) * a.gap + z, O = h + (b - N) / 2, k = h + (p - T) / 2, H = g * f, R = a.columns !== "auto" && a.rows !== "auto", C = R && t > H;
1206
+ s
1207
+ ), E = s.stagger === "row", v = s.stagger === "column", w = E ? f + 0.5 : f, S = v ? m + 0.5 : m, x = (p - s.gap * (f - 1)) / w, A = (b - s.gap * (m - 1)) / S, L = E ? x / 2 : 0, z = v ? A / 2 : 0, _ = 1 + s.overlap, U = Math.min(x, A) * _, Y = i.fixedHeight ? Math.min(i.fixedHeight, U) : U, N = f * x + (f - 1) * s.gap + L, C = m * A + (m - 1) * s.gap + z, O = h + (p - N) / 2, k = h + (b - C) / 2, H = f * m, R = s.columns !== "auto" && s.rows !== "auto", T = R && t > H;
1208
1208
  typeof window < "u" && (window.__gridOverflowDebug = {
1209
- gridConfigColumns: a.columns,
1210
- gridConfigRows: a.rows,
1211
- columns: g,
1212
- rows: f,
1209
+ gridConfigColumns: s.columns,
1210
+ gridConfigRows: s.rows,
1211
+ columns: f,
1212
+ rows: m,
1213
1213
  cellCount: H,
1214
1214
  hasFixedGrid: R,
1215
1215
  imageCount: t,
1216
- isOverflowMode: C
1216
+ isOverflowMode: T
1217
1217
  });
1218
- const D = C ? new Array(H).fill(0) : [], $ = Math.min(x, A) * a.overflowOffset;
1218
+ const $ = T ? new Array(H).fill(0) : [], D = Math.min(x, A) * s.overflowOffset;
1219
1219
  for (let F = 0; F < t; F++) {
1220
1220
  let P, M, W = 0;
1221
- if (C && F >= H) {
1221
+ if (T && F >= H) {
1222
1222
  const q = F - H, j = q % H;
1223
- W = Math.floor(q / H) + 1, D[j]++, a.fillDirection === "row" ? (P = j % g, M = Math.floor(j / g)) : (M = j % f, P = Math.floor(j / f));
1223
+ W = Math.floor(q / H) + 1, $[j]++, s.fillDirection === "row" ? (P = j % f, M = Math.floor(j / f)) : (M = j % m, P = Math.floor(j / m));
1224
1224
  } else
1225
- a.fillDirection === "row" ? (P = F % g, M = Math.floor(F / g)) : (M = F % f, P = Math.floor(F / f));
1226
- let G = O + P * (x + a.gap) + x / 2, X = k + M * (A + a.gap) + A / 2;
1227
- if (a.stagger === "row" && M % 2 === 1 ? G += x / 2 : a.stagger === "column" && P % 2 === 1 && (X += A / 2), W > 0) {
1228
- const q = (W - 1) % At.length, j = At[q];
1229
- G += j.x * $, X += j.y * $;
1225
+ s.fillDirection === "row" ? (P = F % f, M = Math.floor(F / f)) : (M = F % m, P = Math.floor(F / m));
1226
+ let G = O + P * (x + s.gap) + x / 2, X = k + M * (A + s.gap) + A / 2;
1227
+ if (s.stagger === "row" && M % 2 === 1 ? G += x / 2 : s.stagger === "column" && P % 2 === 1 && (X += A / 2), W > 0) {
1228
+ const q = (W - 1) % Ct.length, j = Ct[q];
1229
+ G += j.x * D, X += j.y * D;
1230
1230
  }
1231
- if (a.jitter > 0) {
1232
- const q = x / 2 * a.jitter, j = A / 2 * a.jitter;
1231
+ if (s.jitter > 0) {
1232
+ const q = x / 2 * s.jitter, j = A / 2 * s.jitter;
1233
1233
  G += this.random(-q, q), X += this.random(-j, j);
1234
1234
  }
1235
1235
  let B = G, J = X;
1236
- if (!C && a.fillDirection === "row") {
1237
- const q = t % g || g;
1238
- if (M === Math.floor((t - 1) / g) && q < g) {
1239
- const xt = q * x + (q - 1) * a.gap;
1240
- let gt = 0;
1241
- a.alignment === "center" ? gt = (N - xt) / 2 : a.alignment === "end" && (gt = N - xt), B += gt;
1236
+ if (!T && s.fillDirection === "row") {
1237
+ const q = t % f || f;
1238
+ if (M === Math.floor((t - 1) / f) && q < f) {
1239
+ const Et = q * x + (q - 1) * s.gap;
1240
+ let dt = 0;
1241
+ s.alignment === "center" ? dt = (N - Et) / 2 : s.alignment === "end" && (dt = N - Et), B += dt;
1242
1242
  }
1243
1243
  }
1244
- const rt = m ? this.random(l, d) : 1, K = Y * rt, it = K * 1.5 / 2, nt = K / 2, lt = h + it, ht = s - h - it, Dt = h + nt, $t = r - h - nt;
1245
- B = Math.max(lt, Math.min(B, ht)), J = Math.max(Dt, Math.min(J, $t));
1246
- let dt = 0;
1247
- if (u === "random") {
1244
+ const st = g ? this.random(l, u) : 1, K = Y * st, tt = K * 1.5 / 2, et = K / 2, rt = h + tt, ct = a - h - tt, $t = h + et, Dt = r - h - et;
1245
+ B = Math.max(rt, Math.min(B, ct)), J = Math.max($t, Math.min(J, Dt));
1246
+ let lt = 0;
1247
+ if (d === "random") {
1248
1248
  const q = this.imageConfig.rotation?.range?.min ?? -15, j = this.imageConfig.rotation?.range?.max ?? 15;
1249
- a.jitter > 0 ? dt = this.random(q * a.jitter, j * a.jitter) : dt = this.random(q, j);
1249
+ s.jitter > 0 ? lt = this.random(q * s.jitter, j * s.jitter) : lt = this.random(q, j);
1250
1250
  }
1251
- let ut;
1252
- C && W > 0 ? ut = 50 - W : ut = C ? 100 + F : F + 1, o.push({
1251
+ let ht;
1252
+ T && W > 0 ? ht = 50 - W : ht = T ? 100 + F : F + 1, o.push({
1253
1253
  id: F,
1254
1254
  x: B,
1255
1255
  y: J,
1256
- rotation: dt,
1257
- scale: rt,
1256
+ rotation: lt,
1257
+ scale: st,
1258
1258
  baseSize: K,
1259
- zIndex: ut
1259
+ zIndex: ht
1260
1260
  });
1261
1261
  }
1262
1262
  return o;
@@ -1264,20 +1264,20 @@ class le {
1264
1264
  /**
1265
1265
  * Calculate optimal grid dimensions based on image count and container
1266
1266
  */
1267
- calculateGridDimensions(t, e, i, o, s) {
1268
- let r, a;
1269
- if (s.columns !== "auto" && s.rows !== "auto")
1270
- r = s.columns, a = s.rows;
1271
- else if (s.columns !== "auto")
1272
- r = s.columns, a = Math.ceil(t / r);
1273
- else if (s.rows !== "auto")
1274
- a = s.rows, r = Math.ceil(t / a);
1267
+ calculateGridDimensions(t, e, i, o, a) {
1268
+ let r, s;
1269
+ if (a.columns !== "auto" && a.rows !== "auto")
1270
+ r = a.columns, s = a.rows;
1271
+ else if (a.columns !== "auto")
1272
+ r = a.columns, s = Math.ceil(t / r);
1273
+ else if (a.rows !== "auto")
1274
+ s = a.rows, r = Math.ceil(t / s);
1275
1275
  else {
1276
1276
  const h = e / i;
1277
- for (r = Math.max(1, Math.round(Math.sqrt(t * h / 1.4))), a = Math.ceil(t / r); r > 1 && (r - 1) * a >= t; )
1277
+ for (r = Math.max(1, Math.round(Math.sqrt(t * h / 1.4))), s = Math.ceil(t / r); r > 1 && (r - 1) * s >= t; )
1278
1278
  r--;
1279
1279
  }
1280
- return { columns: Math.max(1, r), rows: Math.max(1, a) };
1280
+ return { columns: Math.max(1, r), rows: Math.max(1, s) };
1281
1281
  }
1282
1282
  /**
1283
1283
  * Utility: Generate random number between min and max
@@ -1305,27 +1305,27 @@ class ue {
1305
1305
  * @returns Array of layout objects with position, rotation, scale
1306
1306
  */
1307
1307
  generate(t, e, i = {}) {
1308
- const o = [], { width: s, height: r } = e, a = { ...de, ...this.config.spiral }, h = this.config.spacing.padding, c = i.fixedHeight ?? 200, u = this.imageConfig.rotation?.mode ?? "none", l = this.imageConfig.rotation?.range?.min ?? -15, d = this.imageConfig.rotation?.range?.max ?? 15, m = this.imageConfig.sizing?.variance?.min ?? 1, b = this.imageConfig.sizing?.variance?.max ?? 1, p = m !== 1 || b !== 1, g = this.config.scaleDecay ?? a.scaleDecay, f = s / 2, E = r / 2, v = Math.min(
1309
- f - h - c / 2,
1308
+ const o = [], { width: a, height: r } = e, s = { ...de, ...this.config.spiral }, h = this.config.spacing.padding, c = i.fixedHeight ?? 200, d = this.imageConfig.rotation?.mode ?? "none", l = this.imageConfig.rotation?.range?.min ?? -15, u = this.imageConfig.rotation?.range?.max ?? 15, g = this.imageConfig.sizing?.variance?.min ?? 1, p = this.imageConfig.sizing?.variance?.max ?? 1, b = g !== 1 || p !== 1, f = this.config.scaleDecay ?? s.scaleDecay, m = a / 2, E = r / 2, v = Math.min(
1309
+ m - h - c / 2,
1310
1310
  E - h - c / 2
1311
- ), w = a.direction === "clockwise" ? -1 : 1;
1311
+ ), w = s.direction === "clockwise" ? -1 : 1;
1312
1312
  for (let S = 0; S < t; S++) {
1313
1313
  let x, A;
1314
- if (a.spiralType === "golden")
1315
- x = S * he * w + a.startAngle, A = this.calculateGoldenRadius(S, t, v, a.tightness);
1316
- else if (a.spiralType === "archimedean") {
1317
- const G = S * 0.5 * a.tightness;
1318
- x = G * w + a.startAngle, A = this.calculateArchimedeanRadius(G, t, v, a.tightness);
1314
+ if (s.spiralType === "golden")
1315
+ x = S * he * w + s.startAngle, A = this.calculateGoldenRadius(S, t, v, s.tightness);
1316
+ else if (s.spiralType === "archimedean") {
1317
+ const G = S * 0.5 * s.tightness;
1318
+ x = G * w + s.startAngle, A = this.calculateArchimedeanRadius(G, t, v, s.tightness);
1319
1319
  } else {
1320
- const G = S * 0.3 * a.tightness;
1321
- x = G * w + a.startAngle, A = this.calculateLogarithmicRadius(G, t, v, a.tightness);
1320
+ const G = S * 0.3 * s.tightness;
1321
+ x = G * w + s.startAngle, A = this.calculateLogarithmicRadius(G, t, v, s.tightness);
1322
1322
  }
1323
- const L = f + Math.cos(x) * A, z = E + Math.sin(x) * A, _ = A / v, U = g > 0 ? 1 - _ * g * 0.5 : 1, Y = p ? this.random(m, b) : 1, N = U * Y, T = c * N, k = T * 1.5 / 2, H = T / 2, R = h + k, C = s - h - k, D = h + H, $ = r - h - H, F = Math.max(R, Math.min(L, C)), P = Math.max(D, Math.min(z, $));
1323
+ const L = m + Math.cos(x) * A, z = E + Math.sin(x) * A, _ = A / v, U = f > 0 ? 1 - _ * f * 0.5 : 1, Y = b ? this.random(g, p) : 1, N = U * Y, C = c * N, k = C * 1.5 / 2, H = C / 2, R = h + k, T = a - h - k, $ = h + H, D = r - h - H, F = Math.max(R, Math.min(L, T)), P = Math.max($, Math.min(z, D));
1324
1324
  let M = 0;
1325
- if (u === "random") {
1326
- const G = x * 180 / Math.PI % 360, X = this.random(l, d);
1327
- M = a.spiralType === "golden" ? X : G * 0.1 + X * 0.9;
1328
- } else u === "tangent" && (M = this.calculateSpiralTangent(x, A, a));
1325
+ if (d === "random") {
1326
+ const G = x * 180 / Math.PI % 360, X = this.random(l, u);
1327
+ M = s.spiralType === "golden" ? X : G * 0.1 + X * 0.9;
1328
+ } else d === "tangent" && (M = this.calculateSpiralTangent(x, A, s));
1329
1329
  const W = t - S;
1330
1330
  o.push({
1331
1331
  id: S,
@@ -1333,7 +1333,7 @@ class ue {
1333
1333
  y: P,
1334
1334
  rotation: M,
1335
1335
  scale: N,
1336
- baseSize: T,
1336
+ baseSize: C,
1337
1337
  zIndex: W
1338
1338
  });
1339
1339
  }
@@ -1348,11 +1348,11 @@ class ue {
1348
1348
  if (i.spiralType === "golden")
1349
1349
  o = t + Math.PI / 2;
1350
1350
  else if (i.spiralType === "archimedean") {
1351
- const r = 1 / i.tightness, a = Math.atan(e / r);
1352
- o = t + a;
1351
+ const r = 1 / i.tightness, s = Math.atan(e / r);
1352
+ o = t + s;
1353
1353
  } else {
1354
- const r = 0.15 / i.tightness, a = Math.atan(1 / r);
1355
- o = t + a;
1354
+ const r = 0.15 / i.tightness, s = Math.atan(1 / r);
1355
+ o = t + s;
1356
1356
  }
1357
1357
  return o * 180 / Math.PI % 360 - 90;
1358
1358
  }
@@ -1369,16 +1369,16 @@ class ue {
1369
1369
  * r = a + b*θ (constant spacing between arms)
1370
1370
  */
1371
1371
  calculateArchimedeanRadius(t, e, i, o) {
1372
- const s = e * 0.5 * o;
1373
- return t / s * i;
1372
+ const a = e * 0.5 * o;
1373
+ return t / a * i;
1374
1374
  }
1375
1375
  /**
1376
1376
  * Calculate radius for logarithmic (equiangular) spiral
1377
1377
  * r = a * e^(b*θ)
1378
1378
  */
1379
1379
  calculateLogarithmicRadius(t, e, i, o) {
1380
- const s = i * 0.05, r = 0.15 / o, a = s * Math.exp(r * t), h = e * 0.3 * o, c = s * Math.exp(r * h);
1381
- return a / c * i;
1380
+ const a = i * 0.05, r = 0.15 / o, s = a * Math.exp(r * t), h = e * 0.3 * o, c = a * Math.exp(r * h);
1381
+ return s / c * i;
1382
1382
  }
1383
1383
  /**
1384
1384
  * Utility: Generate random number between min and max
@@ -1395,7 +1395,7 @@ const ge = {
1395
1395
  overlap: 0.3,
1396
1396
  distribution: "gaussian"
1397
1397
  };
1398
- class me {
1398
+ class fe {
1399
1399
  constructor(t, e = {}) {
1400
1400
  this.config = t, this.imageConfig = e;
1401
1401
  }
@@ -1407,46 +1407,46 @@ class me {
1407
1407
  * @returns Array of layout objects with position, rotation, scale
1408
1408
  */
1409
1409
  generate(t, e, i = {}) {
1410
- const o = [], { width: s, height: r } = e, a = { ...ge, ...this.config.cluster }, h = this.config.spacing.padding, c = i.fixedHeight ?? 200, u = this.imageConfig.rotation?.mode ?? "none", l = this.imageConfig.rotation?.range?.min ?? -15, d = this.imageConfig.rotation?.range?.max ?? 15, m = this.imageConfig.sizing?.variance?.min ?? 1, b = this.imageConfig.sizing?.variance?.max ?? 1, p = m !== 1 || b !== 1, g = this.calculateClusterCount(
1410
+ const o = [], { width: a, height: r } = e, s = { ...ge, ...this.config.cluster }, h = this.config.spacing.padding, c = i.fixedHeight ?? 200, d = this.imageConfig.rotation?.mode ?? "none", l = this.imageConfig.rotation?.range?.min ?? -15, u = this.imageConfig.rotation?.range?.max ?? 15, g = this.imageConfig.sizing?.variance?.min ?? 1, p = this.imageConfig.sizing?.variance?.max ?? 1, b = g !== 1 || p !== 1, f = this.calculateClusterCount(
1411
1411
  t,
1412
- a.clusterCount,
1413
- s,
1412
+ s.clusterCount,
1413
+ a,
1414
1414
  r,
1415
- a.clusterSpacing
1416
- ), f = this.generateClusterCenters(
1417
- g,
1418
- s,
1415
+ s.clusterSpacing
1416
+ ), m = this.generateClusterCenters(
1417
+ f,
1418
+ a,
1419
1419
  r,
1420
1420
  h,
1421
- a
1422
- ), E = new Array(g).fill(0);
1421
+ s
1422
+ ), E = new Array(f).fill(0);
1423
1423
  for (let w = 0; w < t; w++)
1424
- E[w % g]++;
1424
+ E[w % f]++;
1425
1425
  let v = 0;
1426
- for (let w = 0; w < g; w++) {
1427
- const S = f[w], x = E[w];
1426
+ for (let w = 0; w < f; w++) {
1427
+ const S = m[w], x = E[w];
1428
1428
  for (let A = 0; A < x; A++) {
1429
1429
  let L, z;
1430
- if (a.distribution === "gaussian")
1430
+ if (s.distribution === "gaussian")
1431
1431
  L = this.gaussianRandom() * S.spread, z = this.gaussianRandom() * S.spread;
1432
1432
  else {
1433
1433
  const M = this.random(0, Math.PI * 2), W = this.random(0, S.spread);
1434
1434
  L = Math.cos(M) * W, z = Math.sin(M) * W;
1435
1435
  }
1436
- const _ = 1 + a.overlap * 0.5, U = 1 + a.overlap * 0.3;
1436
+ const _ = 1 + s.overlap * 0.5, U = 1 + s.overlap * 0.3;
1437
1437
  L /= _, z /= _;
1438
- const Y = p ? this.random(m, b) : 1, N = U * Y, T = c * N;
1438
+ const Y = b ? this.random(g, p) : 1, N = U * Y, C = c * N;
1439
1439
  let O = S.x + L, k = S.y + z;
1440
- const R = T * 1.5 / 2, C = T / 2;
1441
- O = Math.max(h + R, Math.min(O, s - h - R)), k = Math.max(h + C, Math.min(k, r - h - C));
1442
- const D = u === "random" ? this.random(l, d) : 0, F = Math.sqrt(L * L + z * z) / S.spread, P = Math.round((1 - F) * 50) + 1;
1440
+ const R = C * 1.5 / 2, T = C / 2;
1441
+ O = Math.max(h + R, Math.min(O, a - h - R)), k = Math.max(h + T, Math.min(k, r - h - T));
1442
+ const $ = d === "random" ? this.random(l, u) : 0, F = Math.sqrt(L * L + z * z) / S.spread, P = Math.round((1 - F) * 50) + 1;
1443
1443
  o.push({
1444
1444
  id: v,
1445
1445
  x: O,
1446
1446
  y: k,
1447
- rotation: D,
1447
+ rotation: $,
1448
1448
  scale: N,
1449
- baseSize: T,
1449
+ baseSize: C,
1450
1450
  zIndex: P
1451
1451
  }), v++;
1452
1452
  }
@@ -1456,36 +1456,36 @@ class me {
1456
1456
  /**
1457
1457
  * Calculate optimal number of clusters based on image count and container
1458
1458
  */
1459
- calculateClusterCount(t, e, i, o, s) {
1459
+ calculateClusterCount(t, e, i, o, a) {
1460
1460
  if (e !== "auto")
1461
1461
  return Math.max(1, Math.min(e, t));
1462
- const a = Math.max(1, Math.ceil(t / 8)), h = Math.floor(
1463
- i / s * (o / s) * 0.6
1462
+ const s = Math.max(1, Math.ceil(t / 8)), h = Math.floor(
1463
+ i / a * (o / a) * 0.6
1464
1464
  );
1465
- return Math.max(1, Math.min(a, h, 10));
1465
+ return Math.max(1, Math.min(s, h, 10));
1466
1466
  }
1467
1467
  /**
1468
1468
  * Generate cluster center positions with spacing constraints
1469
1469
  */
1470
- generateClusterCenters(t, e, i, o, s) {
1471
- const r = [], h = o + s.clusterSpread, c = e - o - s.clusterSpread, u = o + s.clusterSpread, l = i - o - s.clusterSpread;
1472
- for (let d = 0; d < t; d++) {
1473
- let m = null, b = -1;
1474
- for (let p = 0; p < 100; p++) {
1475
- const g = {
1470
+ generateClusterCenters(t, e, i, o, a) {
1471
+ const r = [], h = o + a.clusterSpread, c = e - o - a.clusterSpread, d = o + a.clusterSpread, l = i - o - a.clusterSpread;
1472
+ for (let u = 0; u < t; u++) {
1473
+ let g = null, p = -1;
1474
+ for (let b = 0; b < 100; b++) {
1475
+ const f = {
1476
1476
  x: this.random(h, c),
1477
- y: this.random(u, l),
1478
- spread: this.calculateClusterSpread(s)
1477
+ y: this.random(d, l),
1478
+ spread: this.calculateClusterSpread(a)
1479
1479
  };
1480
- let f = 1 / 0;
1480
+ let m = 1 / 0;
1481
1481
  for (const E of r) {
1482
- const v = g.x - E.x, w = g.y - E.y, S = Math.sqrt(v * v + w * w);
1483
- f = Math.min(f, S);
1482
+ const v = f.x - E.x, w = f.y - E.y, S = Math.sqrt(v * v + w * w);
1483
+ m = Math.min(m, S);
1484
1484
  }
1485
- if ((r.length === 0 || f > b) && (m = g, b = f), f >= s.clusterSpacing)
1485
+ if ((r.length === 0 || m > p) && (g = f, p = m), m >= a.clusterSpacing)
1486
1486
  break;
1487
1487
  }
1488
- m && r.push(m);
1488
+ g && r.push(g);
1489
1489
  }
1490
1490
  return r;
1491
1491
  }
@@ -1513,7 +1513,7 @@ class me {
1513
1513
  return Math.random() * (e - t) + t;
1514
1514
  }
1515
1515
  }
1516
- class fe {
1516
+ class me {
1517
1517
  constructor(t, e = {}) {
1518
1518
  this.config = t, this.imageConfig = e;
1519
1519
  }
@@ -1525,24 +1525,24 @@ class fe {
1525
1525
  * @returns Array of layout objects with position, rotation, scale
1526
1526
  */
1527
1527
  generate(t, e, i = {}) {
1528
- const o = [], { width: s, height: r } = e, a = i.fixedHeight ?? 200, h = this.config.spacing.padding ?? 50, c = this.imageConfig.rotation?.mode ?? "none", u = this.imageConfig.rotation?.range?.min ?? -15, l = this.imageConfig.rotation?.range?.max ?? 15, d = this.imageConfig.sizing?.variance?.min ?? 1, m = this.imageConfig.sizing?.variance?.max ?? 1, b = d !== 1 || m !== 1, p = i.fixedHeight ?? a, g = {
1528
+ const o = [], { width: a, height: r } = e, s = i.fixedHeight ?? 200, h = this.config.spacing.padding ?? 50, c = this.imageConfig.rotation?.mode ?? "none", d = this.imageConfig.rotation?.range?.min ?? -15, l = this.imageConfig.rotation?.range?.max ?? 15, u = this.imageConfig.sizing?.variance?.min ?? 1, g = this.imageConfig.sizing?.variance?.max ?? 1, p = u !== 1 || g !== 1, b = i.fixedHeight ?? s, f = {
1529
1529
  ...Pt,
1530
1530
  ...this.config.wave
1531
- }, { rows: f, amplitude: E, frequency: v, phaseShift: w, synchronization: S } = g, x = Math.ceil(t / f), z = p * 1.5 / 2, _ = h + z, U = s - h - z, Y = U - _, N = x > 1 ? Y / (x - 1) : 0, T = h + E + p / 2, O = r - h - E - p / 2, k = O - T, H = f > 1 ? k / (f - 1) : 0;
1531
+ }, { rows: m, amplitude: E, frequency: v, phaseShift: w, synchronization: S } = f, x = Math.ceil(t / m), z = b * 1.5 / 2, _ = h + z, U = a - h - z, Y = U - _, N = x > 1 ? Y / (x - 1) : 0, C = h + E + b / 2, O = r - h - E - b / 2, k = O - C, H = m > 1 ? k / (m - 1) : 0;
1532
1532
  let R = 0;
1533
- for (let C = 0; C < f && R < t; C++) {
1534
- const D = f === 1 ? (T + O) / 2 : T + C * H;
1535
- let $ = 0;
1536
- S === "offset" ? $ = C * w : S === "alternating" && ($ = C * Math.PI);
1533
+ for (let T = 0; T < m && R < t; T++) {
1534
+ const $ = m === 1 ? (C + O) / 2 : C + T * H;
1535
+ let D = 0;
1536
+ S === "offset" ? D = T * w : S === "alternating" && (D = T * Math.PI);
1537
1537
  for (let F = 0; F < x && R < t; F++) {
1538
- const P = x === 1 ? (_ + U) / 2 : _ + F * N, M = this.calculateWaveY(P, s, E, v, $), W = P, G = D + M, X = b ? this.random(d, m) : 1, B = p * X;
1538
+ const P = x === 1 ? (_ + U) / 2 : _ + F * N, M = this.calculateWaveY(P, a, E, v, D), W = P, G = $ + M, X = p ? this.random(u, g) : 1, B = b * X;
1539
1539
  let J = 0;
1540
- c === "tangent" ? J = this.calculateRotation(P, s, E, v, $) : c === "random" && (J = this.random(u, l));
1541
- const K = B * 1.5 / 2, ct = B / 2, it = h + K, nt = s - h - K, lt = h + ct, ht = r - h - ct;
1540
+ c === "tangent" ? J = this.calculateRotation(P, a, E, v, D) : c === "random" && (J = this.random(d, l));
1541
+ const K = B * 1.5 / 2, at = B / 2, tt = h + K, et = a - h - K, rt = h + at, ct = r - h - at;
1542
1542
  o.push({
1543
1543
  id: R,
1544
- x: Math.max(it, Math.min(W, nt)),
1545
- y: Math.max(lt, Math.min(G, ht)),
1544
+ x: Math.max(tt, Math.min(W, et)),
1545
+ y: Math.max(rt, Math.min(G, ct)),
1546
1546
  rotation: J,
1547
1547
  scale: X,
1548
1548
  baseSize: B,
@@ -1561,9 +1561,9 @@ class fe {
1561
1561
  * @param phase - Phase offset
1562
1562
  * @returns Y displacement from baseline
1563
1563
  */
1564
- calculateWaveY(t, e, i, o, s) {
1564
+ calculateWaveY(t, e, i, o, a) {
1565
1565
  const r = t / e;
1566
- return i * Math.sin(o * r * 2 * Math.PI + s);
1566
+ return i * Math.sin(o * r * 2 * Math.PI + a);
1567
1567
  }
1568
1568
  /**
1569
1569
  * Calculate rotation based on wave tangent
@@ -1574,9 +1574,9 @@ class fe {
1574
1574
  * @param phase - Phase offset
1575
1575
  * @returns Rotation angle in degrees
1576
1576
  */
1577
- calculateRotation(t, e, i, o, s) {
1578
- const r = t / e, a = i * o * 2 * Math.PI * Math.cos(o * r * 2 * Math.PI + s) / e;
1579
- return Math.atan(a) * (180 / Math.PI);
1577
+ calculateRotation(t, e, i, o, a) {
1578
+ const r = t / e, s = i * o * 2 * Math.PI * Math.cos(o * r * 2 * Math.PI + a) / e;
1579
+ return Math.atan(s) * (180 / Math.PI);
1580
1580
  }
1581
1581
  /**
1582
1582
  * Estimate image width based on height
@@ -1607,9 +1607,9 @@ class pe {
1607
1607
  case "spiral":
1608
1608
  return new ue(this.config, this.imageConfig);
1609
1609
  case "cluster":
1610
- return new me(this.config, this.imageConfig);
1611
- case "wave":
1612
1610
  return new fe(this.config, this.imageConfig);
1611
+ case "wave":
1612
+ return new me(this.config, this.imageConfig);
1613
1613
  default:
1614
1614
  return new ae(this.config, this.imageConfig);
1615
1615
  }
@@ -1623,8 +1623,8 @@ class pe {
1623
1623
  */
1624
1624
  generateLayout(t, e, i = {}) {
1625
1625
  const o = this.placementLayout.generate(t, e, i);
1626
- return o.forEach((s) => {
1627
- this.layouts.set(s.id, s);
1626
+ return o.forEach((a) => {
1627
+ this.layouts.set(a.id, a);
1628
1628
  }), o;
1629
1629
  }
1630
1630
  /**
@@ -1678,8 +1678,8 @@ class pe {
1678
1678
  return;
1679
1679
  if (typeof i == "number")
1680
1680
  return i;
1681
- const o = i, s = this.resolveBreakpoint(t);
1682
- return s === "mobile" ? o.mobile ?? o.tablet ?? o.screen : s === "tablet" ? o.tablet ?? o.screen ?? o.mobile : o.screen ?? o.tablet ?? o.mobile;
1681
+ const o = i, a = this.resolveBreakpoint(t);
1682
+ return a === "mobile" ? o.mobile ?? o.tablet ?? o.screen : a === "tablet" ? o.tablet ?? o.screen ?? o.mobile : o.screen ?? o.tablet ?? o.mobile;
1683
1683
  }
1684
1684
  /**
1685
1685
  * Calculate adaptive image size based on container dimensions and image count
@@ -1690,16 +1690,16 @@ class pe {
1690
1690
  * @returns Calculated sizing result with height
1691
1691
  */
1692
1692
  calculateAdaptiveSize(t, e, i, o) {
1693
- const s = this.imageConfig.sizing, r = this.resolveBaseHeight(o);
1693
+ const a = this.imageConfig.sizing, r = this.resolveBaseHeight(o);
1694
1694
  if (r !== void 0)
1695
1695
  return { height: r };
1696
- const a = s?.minSize ?? 50, h = s?.maxSize ?? 400, c = this.config.targetCoverage ?? 0.6, u = this.config.densityFactor ?? 1, { width: l, height: d } = t, p = l * d * c / e;
1697
- let f = Math.sqrt(p / 1.4);
1698
- f *= u, f = Math.min(f, i);
1699
- let E = this.clamp(f, a, h);
1700
- if (E === a && f < a) {
1701
- const v = Math.max(a * 0.05, 20);
1702
- E = Math.max(v, f);
1696
+ const s = a?.minSize ?? 50, h = a?.maxSize ?? 400, c = this.config.targetCoverage ?? 0.6, d = this.config.densityFactor ?? 1, { width: l, height: u } = t, b = l * u * c / e;
1697
+ let m = Math.sqrt(b / 1.4);
1698
+ m *= d, m = Math.min(m, i);
1699
+ let E = this.clamp(m, s, h);
1700
+ if (E === s && m < s) {
1701
+ const v = Math.max(s * 0.05, 20);
1702
+ E = Math.max(v, m);
1703
1703
  }
1704
1704
  return { height: E };
1705
1705
  }
@@ -1720,18 +1720,67 @@ const Tt = {
1720
1720
  hexagon: "polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%)",
1721
1721
  octagon: "polygon(30% 0%, 70% 0%, 100% 30%, 100% 70%, 70% 100%, 30% 100%, 0% 70%, 0% 30%)",
1722
1722
  diamond: "polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%)"
1723
+ }, be = {
1724
+ // Circle - uses radius in pixels (refHeight of 100px = 50px radius)
1725
+ circle: {
1726
+ refHeight: 100,
1727
+ points: []
1728
+ // Special case: handled separately
1729
+ },
1730
+ // Square - maintains perfect aspect ratio (always 1:1)
1731
+ square: {
1732
+ refHeight: 100,
1733
+ points: [[0, 0], [100, 0], [100, 100], [0, 100]]
1734
+ },
1735
+ // Triangle - isosceles triangle
1736
+ triangle: {
1737
+ refHeight: 100,
1738
+ points: [[50, 0], [100, 100], [0, 100]]
1739
+ },
1740
+ // Pentagon - regular pentagon
1741
+ pentagon: {
1742
+ refHeight: 100,
1743
+ points: [[50, 0], [100, 38], [82, 100], [18, 100], [0, 38]]
1744
+ },
1745
+ // Hexagon - regular hexagon
1746
+ hexagon: {
1747
+ refHeight: 100,
1748
+ points: [[25, 0], [75, 0], [100, 50], [75, 100], [25, 100], [0, 50]]
1749
+ },
1750
+ // Octagon - regular octagon
1751
+ octagon: {
1752
+ refHeight: 100,
1753
+ points: [[30, 0], [70, 0], [100, 30], [100, 70], [70, 100], [30, 100], [0, 70], [0, 30]]
1754
+ },
1755
+ // Diamond - 45-degree rotated square
1756
+ diamond: {
1757
+ refHeight: 100,
1758
+ points: [[50, 0], [100, 50], [50, 100], [0, 50]]
1759
+ }
1723
1760
  };
1724
- function be(n) {
1761
+ function ye(n) {
1725
1762
  if (n)
1726
1763
  return n in Tt ? Tt[n] : n;
1727
1764
  }
1728
- function ye(n) {
1729
- return n in mt;
1730
- }
1731
- function ve(n) {
1732
- return n ? ye(n) ? mt[n] : n : mt.md;
1765
+ function ve(n, t, e) {
1766
+ const i = be[n];
1767
+ if (!i) return "";
1768
+ const o = t / i.refHeight;
1769
+ if (n === "circle")
1770
+ return `circle(${Math.round(50 * o * 100) / 100}px)`;
1771
+ const a = i.refHeight * o, r = a / 2, s = a / 2, h = (e ?? a) / 2, c = t / 2, d = h - r, l = c - s;
1772
+ return `polygon(${i.points.map(([g, p]) => {
1773
+ const b = Math.round((g * o + d) * 100) / 100, f = Math.round((p * o + l) * 100) / 100;
1774
+ return `${b}px ${f}px`;
1775
+ }).join(", ")})`;
1733
1776
  }
1734
1777
  function we(n) {
1778
+ return n in gt;
1779
+ }
1780
+ function xe(n) {
1781
+ return n ? we(n) ? gt[n] : n : gt.md;
1782
+ }
1783
+ function Ee(n) {
1735
1784
  if (!n) return "";
1736
1785
  const t = [];
1737
1786
  if (n.grayscale !== void 0 && t.push(`grayscale(${n.grayscale})`), n.blur !== void 0 && t.push(`blur(${n.blur}px)`), n.brightness !== void 0 && t.push(`brightness(${n.brightness})`), n.contrast !== void 0 && t.push(`contrast(${n.contrast})`), n.saturate !== void 0 && t.push(`saturate(${n.saturate})`), n.opacity !== void 0 && t.push(`opacity(${n.opacity})`), n.sepia !== void 0 && t.push(`sepia(${n.sepia})`), n.hueRotate !== void 0 && t.push(`hue-rotate(${n.hueRotate}deg)`), n.invert !== void 0 && t.push(`invert(${n.invert})`), n.dropShadow !== void 0)
@@ -1749,54 +1798,65 @@ function Q(n) {
1749
1798
  const t = n.width ?? 0, e = n.style ?? "solid", i = n.color ?? "#000000";
1750
1799
  return `${t}px ${e} ${i}`;
1751
1800
  }
1752
- function st(n) {
1801
+ function wt(n, t, e) {
1753
1802
  if (!n) return {};
1754
- const t = {};
1803
+ const i = {};
1755
1804
  if (n.borderRadiusTopLeft !== void 0 || n.borderRadiusTopRight !== void 0 || n.borderRadiusBottomRight !== void 0 || n.borderRadiusBottomLeft !== void 0) {
1756
1805
  const s = n.border?.radius ?? 0;
1757
- n.borderRadiusTopLeft !== void 0 ? t.borderTopLeftRadius = `${n.borderRadiusTopLeft}px` : s && (t.borderTopLeftRadius = `${s}px`), n.borderRadiusTopRight !== void 0 ? t.borderTopRightRadius = `${n.borderRadiusTopRight}px` : s && (t.borderTopRightRadius = `${s}px`), n.borderRadiusBottomRight !== void 0 ? t.borderBottomRightRadius = `${n.borderRadiusBottomRight}px` : s && (t.borderBottomRightRadius = `${s}px`), n.borderRadiusBottomLeft !== void 0 ? t.borderBottomLeftRadius = `${n.borderRadiusBottomLeft}px` : s && (t.borderBottomLeftRadius = `${s}px`);
1758
- } else n.border?.radius !== void 0 && (t.borderRadius = `${n.border.radius}px`);
1806
+ n.borderRadiusTopLeft !== void 0 ? i.borderTopLeftRadius = `${n.borderRadiusTopLeft}px` : s && (i.borderTopLeftRadius = `${s}px`), n.borderRadiusTopRight !== void 0 ? i.borderTopRightRadius = `${n.borderRadiusTopRight}px` : s && (i.borderTopRightRadius = `${s}px`), n.borderRadiusBottomRight !== void 0 ? i.borderBottomRightRadius = `${n.borderRadiusBottomRight}px` : s && (i.borderBottomRightRadius = `${s}px`), n.borderRadiusBottomLeft !== void 0 ? i.borderBottomLeftRadius = `${n.borderRadiusBottomLeft}px` : s && (i.borderBottomLeftRadius = `${s}px`);
1807
+ } else n.border?.radius !== void 0 && (i.borderRadius = `${n.border.radius}px`);
1759
1808
  if (n.borderTop || n.borderRight || n.borderBottom || n.borderLeft) {
1760
- const s = n.border || {}, r = { ...s, ...n.borderTop }, a = { ...s, ...n.borderRight }, h = { ...s, ...n.borderBottom }, c = { ...s, ...n.borderLeft };
1761
- t.borderTop = Q(r), t.borderRight = Q(a), t.borderBottom = Q(h), t.borderLeft = Q(c);
1762
- } else n.border && (t.border = Q(n.border));
1763
- n.shadow !== void 0 && (t.boxShadow = ve(n.shadow));
1764
- const o = we(n.filter);
1765
- if (t.filter = o || "none", n.opacity !== void 0 && (t.opacity = String(n.opacity)), n.cursor !== void 0 && (t.cursor = n.cursor), n.outline && n.outline.style !== "none" && (n.outline.width ?? 0) > 0) {
1766
- const s = n.outline.width ?? 0, r = n.outline.style ?? "solid", a = n.outline.color ?? "#000000";
1767
- t.outline = `${s}px ${r} ${a}`, n.outline.offset !== void 0 && (t.outlineOffset = `${n.outline.offset}px`);
1768
- }
1769
- if (n.objectFit !== void 0 && (t.objectFit = n.objectFit), n.aspectRatio !== void 0 && (t.aspectRatio = n.aspectRatio), n.clipPath !== void 0) {
1770
- const s = be(n.clipPath);
1771
- s && (s === "none" ? t.clipPath = "unset" : (t.clipPath = s, t.overflow = "hidden"));
1772
- }
1773
- return t;
1809
+ const s = n.border || {}, h = { ...s, ...n.borderTop }, c = { ...s, ...n.borderRight }, d = { ...s, ...n.borderBottom }, l = { ...s, ...n.borderLeft };
1810
+ i.borderTop = Q(h), i.borderRight = Q(c), i.borderBottom = Q(d), i.borderLeft = Q(l);
1811
+ } else n.border && (i.border = Q(n.border));
1812
+ n.shadow !== void 0 && (i.boxShadow = xe(n.shadow));
1813
+ const r = Ee(n.filter);
1814
+ if (i.filter = r || "none", n.opacity !== void 0 && (i.opacity = String(n.opacity)), n.cursor !== void 0 && (i.cursor = n.cursor), n.outline && n.outline.style !== "none" && (n.outline.width ?? 0) > 0) {
1815
+ const s = n.outline.width ?? 0, h = n.outline.style ?? "solid", c = n.outline.color ?? "#000000";
1816
+ i.outline = `${s}px ${h} ${c}`, n.outline.offset !== void 0 && (i.outlineOffset = `${n.outline.offset}px`);
1817
+ }
1818
+ if (n.objectFit !== void 0 && (i.objectFit = n.objectFit), n.aspectRatio !== void 0 && (i.aspectRatio = n.aspectRatio), n.clipPath !== void 0) {
1819
+ let s;
1820
+ const h = typeof n.clipPath == "object" && n.clipPath !== null && "shape" in n.clipPath, c = h ? n.clipPath : void 0;
1821
+ if (c?.mode === "height-relative" && t)
1822
+ s = ve(c.shape, t, e);
1823
+ else {
1824
+ const d = h && c ? c.shape : n.clipPath;
1825
+ s = ye(d);
1826
+ }
1827
+ s && (s === "none" ? i.clipPath = "unset" : (i.clipPath = s, i.overflow = "hidden"));
1828
+ }
1829
+ return i;
1774
1830
  }
1775
- function tt(n, t) {
1831
+ function Se(n, t) {
1776
1832
  t.borderRadius !== void 0 && (n.style.borderRadius = t.borderRadius), t.borderTopLeftRadius !== void 0 && (n.style.borderTopLeftRadius = t.borderTopLeftRadius), t.borderTopRightRadius !== void 0 && (n.style.borderTopRightRadius = t.borderTopRightRadius), t.borderBottomRightRadius !== void 0 && (n.style.borderBottomRightRadius = t.borderBottomRightRadius), t.borderBottomLeftRadius !== void 0 && (n.style.borderBottomLeftRadius = t.borderBottomLeftRadius), t.border !== void 0 && (n.style.border = t.border), t.borderTop !== void 0 && (n.style.borderTop = t.borderTop), t.borderRight !== void 0 && (n.style.borderRight = t.borderRight), t.borderBottom !== void 0 && (n.style.borderBottom = t.borderBottom), t.borderLeft !== void 0 && (n.style.borderLeft = t.borderLeft), t.boxShadow !== void 0 && (n.style.boxShadow = t.boxShadow), t.filter !== void 0 && (n.style.filter = t.filter), t.opacity !== void 0 && (n.style.opacity = t.opacity), t.cursor !== void 0 && (n.style.cursor = t.cursor), t.outline !== void 0 && (n.style.outline = t.outline), t.outlineOffset !== void 0 && (n.style.outlineOffset = t.outlineOffset), t.objectFit !== void 0 && (n.style.objectFit = t.objectFit), t.aspectRatio !== void 0 && (n.style.aspectRatio = t.aspectRatio), t.clipPath !== void 0 && (n.style.clipPath = t.clipPath), t.overflow !== void 0 && (n.style.overflow = t.overflow);
1777
1833
  }
1778
- function Ft(n) {
1834
+ function ut(n, t, e, i) {
1835
+ const o = wt(t, e, i);
1836
+ Se(n, o);
1837
+ }
1838
+ function Ot(n) {
1779
1839
  return n ? Array.isArray(n) ? n.join(" ") : n : "";
1780
1840
  }
1781
- function et(n, t) {
1782
- const e = Ft(t);
1841
+ function nt(n, t) {
1842
+ const e = Ot(t);
1783
1843
  e && e.split(" ").forEach((i) => {
1784
1844
  i.trim() && n.classList.add(i.trim());
1785
1845
  });
1786
1846
  }
1787
- function Ot(n, t) {
1788
- const e = Ft(t);
1847
+ function ft(n, t) {
1848
+ const e = Ot(t);
1789
1849
  e && e.split(" ").forEach((i) => {
1790
1850
  i.trim() && n.classList.remove(i.trim());
1791
1851
  });
1792
1852
  }
1793
- const Ct = {
1853
+ const Rt = {
1794
1854
  UNFOCUSING: 999,
1795
1855
  FOCUSING: 1e3
1796
1856
  };
1797
- class xe {
1857
+ class Ie {
1798
1858
  constructor(t, e, i) {
1799
- this.state = I.IDLE, this.currentFocus = null, this.focusData = null, this.outgoing = null, this.incoming = null, this.focusGeneration = 0, this.config = t, this.animationEngine = e, this.defaultStyles = st(i?.default), this.focusedStyles = st(i?.focused), this.defaultClassName = i?.default?.className, this.focusedClassName = i?.focused?.className;
1859
+ this.state = I.IDLE, this.currentFocus = null, this.focusData = null, this.outgoing = null, this.incoming = null, this.focusGeneration = 0, this.config = t, this.animationEngine = e, this.styling = i, this.focusedClassName = i?.focused?.className;
1800
1860
  }
1801
1861
  /**
1802
1862
  * Get current state machine state
@@ -1821,19 +1881,19 @@ class xe {
1821
1881
  * Returns actual pixel dimensions instead of scale factor for sharper rendering
1822
1882
  */
1823
1883
  calculateFocusDimensions(t, e, i) {
1824
- const o = this.normalizeScalePercent(this.config.scalePercent), s = i.height * o, r = t / e;
1825
- let a = s, h = a * r;
1884
+ const o = this.normalizeScalePercent(this.config.scalePercent), a = i.height * o, r = t / e;
1885
+ let s = a, h = s * r;
1826
1886
  const c = i.width * o;
1827
- return h > c && (h = c, a = h / r), { width: h, height: a };
1887
+ return h > c && (h = c, s = h / r), { width: h, height: s };
1828
1888
  }
1829
1889
  /**
1830
1890
  * Calculate the transform needed to center an image (position only, no scale)
1831
1891
  * Scale is handled by animating actual dimensions for sharper rendering
1832
1892
  */
1833
1893
  calculateFocusTransform(t, e) {
1834
- const i = t.width / 2, o = t.height / 2, s = i - e.x, r = o - e.y;
1894
+ const i = t.width / 2, o = t.height / 2, a = i - e.x, r = o - e.y;
1835
1895
  return {
1836
- x: s,
1896
+ x: a,
1837
1897
  y: r,
1838
1898
  rotation: 0,
1839
1899
  scale: 1
@@ -1855,19 +1915,19 @@ class xe {
1855
1915
  * Create a Web Animation that animates both transform (position) and dimensions
1856
1916
  * This provides sharper zoom by re-rendering at target size instead of scaling pixels
1857
1917
  */
1858
- animateWithDimensions(t, e, i, o, s, r, a, h) {
1859
- const c = this.buildDimensionZoomTransform(e), u = this.buildDimensionZoomTransform(i);
1918
+ animateWithDimensions(t, e, i, o, a, r, s, h) {
1919
+ const c = this.buildDimensionZoomTransform(e), d = this.buildDimensionZoomTransform(i);
1860
1920
  return t.style.transition = "none", t.animate(
1861
1921
  [
1862
1922
  {
1863
1923
  transform: c,
1864
1924
  width: `${o}px`,
1865
- height: `${s}px`
1925
+ height: `${a}px`
1866
1926
  },
1867
1927
  {
1868
- transform: u,
1928
+ transform: d,
1869
1929
  width: `${r}px`,
1870
- height: `${a}px`
1930
+ height: `${s}px`
1871
1931
  }
1872
1932
  ],
1873
1933
  {
@@ -1879,15 +1939,30 @@ class xe {
1879
1939
  }
1880
1940
  /**
1881
1941
  * Apply focused styling to an element
1942
+ * Applies non-clip-path styles immediately, clip-path will be updated during animation via startClipPathAnimation
1882
1943
  */
1883
1944
  applyFocusedStyling(t, e) {
1884
- t.style.zIndex = String(e), t.classList.add("fbn-ic-focused"), tt(t, this.focusedStyles), et(t, this.focusedClassName);
1945
+ t.style.zIndex = String(e), t.classList.add("fbn-ic-focused"), nt(t, this.focusedClassName);
1885
1946
  }
1886
1947
  /**
1887
1948
  * Remove focused styling from an element
1949
+ * Removes classes and z-index, clip-path will be updated during animation via startClipPathAnimation
1888
1950
  */
1889
1951
  removeFocusedStyling(t, e) {
1890
- t.style.zIndex = e, t.classList.remove("fbn-ic-focused"), Ot(t, this.focusedClassName), tt(t, this.defaultStyles), et(t, this.defaultClassName);
1952
+ t.style.zIndex = e, t.classList.remove("fbn-ic-focused"), ft(t, this.focusedClassName);
1953
+ }
1954
+ /**
1955
+ * Continuously update clip-path during animation based on current element dimensions
1956
+ * This ensures clip-path changes smoothly as width/height animate
1957
+ */
1958
+ startClipPathAnimation(t, e, i) {
1959
+ let o = i ? this.styling?.focused ?? this.styling?.default : this.styling?.default;
1960
+ i && this.styling?.focused && this.styling.focused.clipPath === void 0 && (o = { ...o, clipPath: void 0 });
1961
+ const a = () => {
1962
+ const r = t.offsetHeight, s = t.offsetWidth, h = wt(o, r, s);
1963
+ h.clipPath !== void 0 ? t.style.clipPath = h.clipPath : t.style.clipPath = "unset", h.overflow !== void 0 && (t.style.overflow = h.overflow), e.animation.playState === "running" && requestAnimationFrame(a);
1964
+ };
1965
+ requestAnimationFrame(a);
1891
1966
  }
1892
1967
  /**
1893
1968
  * Start focus animation for an image using dimension-based zoom
@@ -1895,48 +1970,50 @@ class xe {
1895
1970
  * @param fromTransform - Optional starting transform (for mid-animation reversals)
1896
1971
  * @param fromDimensions - Optional starting dimensions (for mid-animation reversals)
1897
1972
  */
1898
- startFocusAnimation(t, e, i, o, s) {
1899
- const r = t.style.zIndex || "", a = t.offsetWidth, h = t.offsetHeight, c = this.calculateFocusDimensions(a, h, e), u = this.calculateFocusTransform(e, i);
1900
- this.applyFocusedStyling(t, Ct.FOCUSING), this.animationEngine.cancelAllAnimations(t);
1901
- const l = o ?? {
1973
+ startFocusAnimation(t, e, i, o, a) {
1974
+ const r = t.style.zIndex || "", s = t.offsetWidth, h = t.offsetHeight, c = this.calculateFocusDimensions(s, h, e), d = this.calculateFocusTransform(e, i);
1975
+ this.animationEngine.cancelAllAnimations(t);
1976
+ const l = this.config.animationDuration ?? 600;
1977
+ this.applyFocusedStyling(t, Rt.FOCUSING);
1978
+ const u = o ?? {
1902
1979
  x: 0,
1903
1980
  y: 0,
1904
1981
  rotation: i.rotation,
1905
1982
  scale: 1
1906
1983
  // No scale - using dimensions
1907
- }, d = s?.width ?? a, m = s?.height ?? h, b = this.config.animationDuration ?? 600, p = this.animateWithDimensions(
1984
+ }, g = a?.width ?? s, p = a?.height ?? h, b = this.animateWithDimensions(
1908
1985
  t,
1909
- l,
1910
1986
  u,
1911
1987
  d,
1912
- m,
1988
+ g,
1989
+ p,
1913
1990
  c.width,
1914
1991
  c.height,
1915
- b
1916
- ), g = {
1992
+ l
1993
+ ), f = {
1917
1994
  id: `focus-${Date.now()}`,
1918
1995
  element: t,
1919
- animation: p,
1920
- fromState: l,
1921
- toState: u,
1996
+ animation: b,
1997
+ fromState: u,
1998
+ toState: d,
1922
1999
  startTime: performance.now(),
1923
- duration: b
2000
+ duration: l
1924
2001
  };
1925
2002
  return this.focusData = {
1926
2003
  element: t,
1927
2004
  originalState: i,
1928
- focusTransform: u,
2005
+ focusTransform: d,
1929
2006
  originalZIndex: r,
1930
- originalWidth: a,
2007
+ originalWidth: s,
1931
2008
  originalHeight: h,
1932
2009
  focusWidth: c.width,
1933
2010
  focusHeight: c.height
1934
- }, {
2011
+ }, this.startClipPathAnimation(t, f, !0), {
1935
2012
  element: t,
1936
2013
  originalState: i,
1937
- animationHandle: g,
2014
+ animationHandle: f,
1938
2015
  direction: "in",
1939
- originalWidth: a,
2016
+ originalWidth: s,
1940
2017
  originalHeight: h
1941
2018
  };
1942
2019
  }
@@ -1946,38 +2023,40 @@ class xe {
1946
2023
  * @param fromDimensions - Optional starting dimensions (for mid-animation reversals)
1947
2024
  */
1948
2025
  startUnfocusAnimation(t, e, i, o) {
1949
- t.style.zIndex = String(Ct.UNFOCUSING), this.animationEngine.cancelAllAnimations(t);
1950
- const s = i ?? this.focusData?.focusTransform ?? { x: 0, y: 0, rotation: 0, scale: 1 }, r = o?.width ?? this.focusData?.focusWidth ?? t.offsetWidth, a = o?.height ?? this.focusData?.focusHeight ?? t.offsetHeight, h = {
2026
+ t.style.zIndex = String(Rt.UNFOCUSING), this.animationEngine.cancelAllAnimations(t);
2027
+ const a = this.config.animationDuration ?? 600;
2028
+ t.classList.remove("fbn-ic-focused"), ft(t, this.focusedClassName);
2029
+ const r = i ?? this.focusData?.focusTransform ?? { x: 0, y: 0, rotation: 0, scale: 1 }, s = o?.width ?? this.focusData?.focusWidth ?? t.offsetWidth, h = o?.height ?? this.focusData?.focusHeight ?? t.offsetHeight, c = {
1951
2030
  x: 0,
1952
2031
  y: 0,
1953
2032
  rotation: e.rotation,
1954
2033
  scale: 1
1955
2034
  // No scale - using dimensions
1956
- }, c = this.focusData?.originalWidth ?? t.offsetWidth, u = this.focusData?.originalHeight ?? t.offsetHeight, l = this.config.animationDuration ?? 600, d = this.animateWithDimensions(
2035
+ }, d = this.focusData?.originalWidth ?? t.offsetWidth, l = this.focusData?.originalHeight ?? t.offsetHeight, u = this.animateWithDimensions(
1957
2036
  t,
1958
- s,
1959
- h,
1960
2037
  r,
1961
- a,
1962
2038
  c,
1963
- u,
1964
- l
1965
- ), m = {
2039
+ s,
2040
+ h,
2041
+ d,
2042
+ l,
2043
+ a
2044
+ ), g = {
1966
2045
  id: `unfocus-${Date.now()}`,
1967
2046
  element: t,
1968
- animation: d,
1969
- fromState: s,
1970
- toState: h,
2047
+ animation: u,
2048
+ fromState: r,
2049
+ toState: c,
1971
2050
  startTime: performance.now(),
1972
- duration: l
2051
+ duration: a
1973
2052
  };
1974
- return {
2053
+ return this.startClipPathAnimation(t, g, !1), {
1975
2054
  element: t,
1976
2055
  originalState: e,
1977
- animationHandle: m,
2056
+ animationHandle: g,
1978
2057
  direction: "out",
1979
- originalWidth: c,
1980
- originalHeight: u
2058
+ originalWidth: d,
2059
+ originalHeight: l
1981
2060
  };
1982
2061
  }
1983
2062
  /**
@@ -1995,10 +2074,10 @@ class xe {
1995
2074
  * Caller is responsible for calling animationEngine.cancelAllAnimations() afterwards.
1996
2075
  */
1997
2076
  captureMidAnimationState(t) {
1998
- const e = getComputedStyle(t), i = new DOMMatrix(e.transform), o = t.offsetWidth, s = t.offsetHeight, r = i.e + o * 0.5, a = i.f + s * 0.5, h = Math.atan2(i.b, i.a) * (180 / Math.PI);
1999
- return t.style.width = `${o}px`, t.style.height = `${s}px`, t.style.transform = `translate(-50%, -50%) translate(${r}px, ${a}px) rotate(${h}deg)`, t.style.transition = "none", {
2000
- transform: { x: r, y: a, rotation: h, scale: 1 },
2001
- dimensions: { width: o, height: s }
2077
+ const e = getComputedStyle(t), i = new DOMMatrix(e.transform), o = t.offsetWidth, a = t.offsetHeight, r = i.e + o * 0.5, s = i.f + a * 0.5, h = Math.atan2(i.b, i.a) * (180 / Math.PI);
2078
+ return t.style.width = `${o}px`, t.style.height = `${a}px`, t.style.transform = `translate(-50%, -50%) translate(${r}px, ${s}px) rotate(${h}deg)`, t.style.transition = "none", {
2079
+ transform: { x: r, y: s, rotation: h, scale: 1 },
2080
+ dimensions: { width: o, height: a }
2002
2081
  };
2003
2082
  }
2004
2083
  /**
@@ -2013,10 +2092,10 @@ class xe {
2013
2092
  /**
2014
2093
  * Reset an element instantly to its original position and dimensions (no animation)
2015
2094
  */
2016
- resetElementInstantly(t, e, i, o, s) {
2095
+ resetElementInstantly(t, e, i, o, a) {
2017
2096
  this.animationEngine.cancelAllAnimations(t);
2018
2097
  const r = ["translate(-50%, -50%)"];
2019
- r.push("translate(0px, 0px)"), r.push(`rotate(${e.rotation}deg)`), t.style.transition = "none", t.style.transform = r.join(" "), o !== void 0 && s !== void 0 && (t.style.width = `${o}px`, t.style.height = `${s}px`), this.removeFocusedStyling(t, i);
2098
+ r.push("translate(0px, 0px)"), r.push(`rotate(${e.rotation}deg)`), t.style.transition = "none", t.style.transform = r.join(" "), o !== void 0 && a !== void 0 && (t.style.width = `${o}px`, t.style.height = `${a}px`), this.removeFocusedStyling(t, i);
2020
2099
  }
2021
2100
  /**
2022
2101
  * Focus (zoom) an image to center of container
@@ -2026,11 +2105,11 @@ class xe {
2026
2105
  if (this.currentFocus === t && this.state === I.FOCUSED)
2027
2106
  return this.unfocusImage();
2028
2107
  if (this.incoming?.element === t && this.state === I.FOCUSING) {
2029
- const { transform: s, dimensions: r } = this.captureMidAnimationState(t);
2108
+ const { transform: a, dimensions: r } = this.captureMidAnimationState(t);
2030
2109
  this.animationEngine.cancelAllAnimations(t), this.outgoing = this.startUnfocusAnimation(
2031
2110
  t,
2032
2111
  this.incoming.originalState,
2033
- s,
2112
+ a,
2034
2113
  r
2035
2114
  ), this.incoming = null, this.state = I.UNFOCUSING, await this.waitForAnimation(this.outgoing.animationHandle), this.removeFocusedStyling(this.outgoing.element, this.focusData?.originalZIndex || ""), this.outgoing = null, this.currentFocus = null, this.focusData = null, this.state = I.IDLE;
2036
2115
  return;
@@ -2073,18 +2152,18 @@ class xe {
2073
2152
  if (this.incoming?.element === t)
2074
2153
  return;
2075
2154
  if (this.outgoing?.element === t) {
2076
- const { transform: s, dimensions: r } = this.captureMidAnimationState(t);
2155
+ const { transform: a, dimensions: r } = this.captureMidAnimationState(t);
2077
2156
  if (this.animationEngine.cancelAllAnimations(t), this.incoming) {
2078
- const { transform: a, dimensions: h } = this.captureMidAnimationState(this.incoming.element);
2157
+ const { transform: s, dimensions: h } = this.captureMidAnimationState(this.incoming.element);
2079
2158
  this.animationEngine.cancelAllAnimations(this.incoming.element), this.outgoing = this.startUnfocusAnimation(
2080
2159
  this.incoming.element,
2081
2160
  this.incoming.originalState,
2082
- a,
2161
+ s,
2083
2162
  h
2084
2163
  );
2085
2164
  } else
2086
2165
  this.outgoing = null;
2087
- if (this.incoming = this.startFocusAnimation(t, e, i, s, r), await Promise.all([
2166
+ if (this.incoming = this.startFocusAnimation(t, e, i, a, r), await Promise.all([
2088
2167
  this.outgoing ? this.waitForAnimation(this.outgoing.animationHandle) : Promise.resolve(),
2089
2168
  this.waitForAnimation(this.incoming.animationHandle)
2090
2169
  ]), this.focusGeneration !== o) return;
@@ -2098,11 +2177,11 @@ class xe {
2098
2177
  this.outgoing.originalWidth,
2099
2178
  this.outgoing.originalHeight
2100
2179
  ), this.outgoing = null), this.incoming) {
2101
- const { transform: s, dimensions: r } = this.captureMidAnimationState(this.incoming.element);
2180
+ const { transform: a, dimensions: r } = this.captureMidAnimationState(this.incoming.element);
2102
2181
  this.animationEngine.cancelAllAnimations(this.incoming.element), this.outgoing = this.startUnfocusAnimation(
2103
2182
  this.incoming.element,
2104
2183
  this.incoming.originalState,
2105
- s,
2184
+ a,
2106
2185
  r
2107
2186
  );
2108
2187
  }
@@ -2123,11 +2202,11 @@ class xe {
2123
2202
  const t = ++this.focusGeneration;
2124
2203
  if (!this.currentFocus || !this.focusData) {
2125
2204
  if (this.incoming && this.state === I.FOCUSING) {
2126
- const { transform: s, dimensions: r } = this.captureMidAnimationState(this.incoming.element);
2205
+ const { transform: a, dimensions: r } = this.captureMidAnimationState(this.incoming.element);
2127
2206
  if (this.animationEngine.cancelAllAnimations(this.incoming.element), this.outgoing = this.startUnfocusAnimation(
2128
2207
  this.incoming.element,
2129
2208
  this.incoming.originalState,
2130
- s,
2209
+ a,
2131
2210
  r
2132
2211
  ), this.incoming = null, this.state = I.UNFOCUSING, await this.waitForAnimation(this.outgoing.animationHandle), this.focusGeneration !== t) return;
2133
2212
  this.removeFocusedStyling(this.outgoing.element, this.focusData?.originalZIndex || ""), this.outgoing = null, this.focusData = null, this.state = I.IDLE;
@@ -2135,19 +2214,19 @@ class xe {
2135
2214
  return;
2136
2215
  }
2137
2216
  if (this.state === I.CROSS_ANIMATING && this.incoming) {
2138
- const { transform: s, dimensions: r } = this.captureMidAnimationState(this.incoming.element);
2217
+ const { transform: a, dimensions: r } = this.captureMidAnimationState(this.incoming.element);
2139
2218
  this.animationEngine.cancelAllAnimations(this.incoming.element);
2140
- const a = this.startUnfocusAnimation(
2219
+ const s = this.startUnfocusAnimation(
2141
2220
  this.incoming.element,
2142
2221
  this.incoming.originalState,
2143
- s,
2222
+ a,
2144
2223
  r
2145
2224
  );
2146
2225
  if (await Promise.all([
2147
2226
  this.outgoing ? this.waitForAnimation(this.outgoing.animationHandle) : Promise.resolve(),
2148
- this.waitForAnimation(a.animationHandle)
2227
+ this.waitForAnimation(s.animationHandle)
2149
2228
  ]), this.focusGeneration !== t) return;
2150
- this.outgoing && this.removeFocusedStyling(this.outgoing.element, this.outgoing.originalState.zIndex?.toString() || ""), this.removeFocusedStyling(a.element, this.incoming.originalState.zIndex?.toString() || ""), this.outgoing = null, this.incoming = null, this.currentFocus = null, this.focusData = null, this.state = I.IDLE;
2229
+ this.outgoing && this.removeFocusedStyling(this.outgoing.element, this.outgoing.originalState.zIndex?.toString() || ""), this.removeFocusedStyling(s.element, this.incoming.originalState.zIndex?.toString() || ""), this.outgoing = null, this.incoming = null, this.currentFocus = null, this.focusData = null, this.state = I.IDLE;
2151
2230
  return;
2152
2231
  }
2153
2232
  this.state = I.UNFOCUSING;
@@ -2192,8 +2271,8 @@ class xe {
2192
2271
  */
2193
2272
  setDragOffset(t) {
2194
2273
  if (!this.currentFocus || !this.focusData || this.state !== I.FOCUSED) return;
2195
- const e = this.currentFocus, i = this.focusData.focusTransform, o = ["translate(-50%, -50%)"], s = (i.x ?? 0) + t, r = i.y ?? 0;
2196
- o.push(`translate(${s}px, ${r}px)`), i.rotation !== void 0 && o.push(`rotate(${i.rotation}deg)`), e.style.transition = "none", e.style.transform = o.join(" ");
2274
+ const e = this.currentFocus, i = this.focusData.focusTransform, o = ["translate(-50%, -50%)"], a = (i.x ?? 0) + t, r = i.y ?? 0;
2275
+ o.push(`translate(${a}px, ${r}px)`), i.rotation !== void 0 && o.push(`rotate(${i.rotation}deg)`), e.style.transition = "none", e.style.transform = o.join(" ");
2197
2276
  }
2198
2277
  /**
2199
2278
  * Clear the drag offset, optionally animating back to center
@@ -2202,9 +2281,9 @@ class xe {
2202
2281
  */
2203
2282
  clearDragOffset(t, e = 150) {
2204
2283
  if (!this.currentFocus || !this.focusData || this.state !== I.FOCUSED) return;
2205
- const i = this.currentFocus, o = this.focusData.focusTransform, s = ["translate(-50%, -50%)"], r = o.x ?? 0, a = o.y ?? 0;
2206
- s.push(`translate(${r}px, ${a}px)`), o.rotation !== void 0 && s.push(`rotate(${o.rotation}deg)`);
2207
- const h = s.join(" ");
2284
+ const i = this.currentFocus, o = this.focusData.focusTransform, a = ["translate(-50%, -50%)"], r = o.x ?? 0, s = o.y ?? 0;
2285
+ a.push(`translate(${r}px, ${s}px)`), o.rotation !== void 0 && a.push(`rotate(${o.rotation}deg)`);
2286
+ const h = a.join(" ");
2208
2287
  t ? (i.style.transition = `transform ${e}ms ease-out`, i.style.transform = h, setTimeout(() => {
2209
2288
  this.currentFocus === i && (i.style.transition = "none");
2210
2289
  }, e)) : (i.style.transition = "none", i.style.transform = h);
@@ -2234,7 +2313,7 @@ class xe {
2234
2313
  ), this.state = I.IDLE, this.currentFocus = null, this.focusData = null, this.outgoing = null, this.incoming = null;
2235
2314
  }
2236
2315
  }
2237
- const Ee = 50, Se = 0.5, Ie = 20, Ae = 0.3, Te = 150, Ce = 30, at = class at {
2316
+ const Ae = 50, Ce = 0.5, Te = 20, Re = 0.3, Me = 150, Le = 30, ot = class ot {
2238
2317
  constructor(t, e) {
2239
2318
  this.enabled = !1, this.touchState = null, this.recentTouchTimestamp = 0, this.container = t, this.callbacks = e, this.boundTouchStart = this.handleTouchStart.bind(this), this.boundTouchMove = this.handleTouchMove.bind(this), this.boundTouchEnd = this.handleTouchEnd.bind(this), this.boundTouchCancel = this.handleTouchCancel.bind(this);
2240
2319
  }
@@ -2261,7 +2340,7 @@ const Ee = 50, Se = 0.5, Ie = 20, Ae = 0.3, Te = 150, Ce = 30, at = class at {
2261
2340
  * Used to prevent click-outside from unfocusing immediately after touch
2262
2341
  */
2263
2342
  hadRecentTouch() {
2264
- return Date.now() - this.recentTouchTimestamp < at.TOUCH_CLICK_DELAY;
2343
+ return Date.now() - this.recentTouchTimestamp < ot.TOUCH_CLICK_DELAY;
2265
2344
  }
2266
2345
  handleTouchStart(t) {
2267
2346
  if (t.touches.length !== 1) return;
@@ -2280,29 +2359,29 @@ const Ee = 50, Se = 0.5, Ie = 20, Ae = 0.3, Te = 150, Ce = 30, at = class at {
2280
2359
  if (!this.touchState || t.touches.length !== 1) return;
2281
2360
  const e = t.touches[0], i = e.clientX - this.touchState.startX, o = e.clientY - this.touchState.startY;
2282
2361
  if (this.touchState.isHorizontalSwipe === null && Math.sqrt(i * i + o * o) > 10) {
2283
- const a = Math.atan2(Math.abs(o), Math.abs(i)) * (180 / Math.PI);
2284
- this.touchState.isHorizontalSwipe = a <= Ce;
2362
+ const s = Math.atan2(Math.abs(o), Math.abs(i)) * (180 / Math.PI);
2363
+ this.touchState.isHorizontalSwipe = s <= Le;
2285
2364
  }
2286
2365
  if (this.touchState.isHorizontalSwipe !== !1 && this.touchState.isHorizontalSwipe === !0) {
2287
2366
  t.preventDefault(), this.touchState.isDragging = !0, this.touchState.currentX = e.clientX;
2288
- const s = i * Ae;
2289
- this.callbacks.onDragOffset(s);
2367
+ const a = i * Re;
2368
+ this.callbacks.onDragOffset(a);
2290
2369
  }
2291
2370
  }
2292
2371
  handleTouchEnd(t) {
2293
2372
  if (!this.touchState) return;
2294
2373
  this.recentTouchTimestamp = Date.now();
2295
- const e = this.touchState.currentX - this.touchState.startX, i = performance.now() - this.touchState.startTime, o = Math.abs(e) / i, s = Math.abs(e);
2374
+ const e = this.touchState.currentX - this.touchState.startX, i = performance.now() - this.touchState.startTime, o = Math.abs(e) / i, a = Math.abs(e);
2296
2375
  let r = !1;
2297
- this.touchState.isHorizontalSwipe === !0 && this.touchState.isDragging && (s >= Ee || o >= Se && s >= Ie) && (r = !0, e < 0 ? this.callbacks.onNext() : this.callbacks.onPrev()), this.touchState.isDragging && this.callbacks.onDragEnd(r), this.touchState = null;
2376
+ this.touchState.isHorizontalSwipe === !0 && this.touchState.isDragging && (a >= Ae || o >= Ce && a >= Te) && (r = !0, e < 0 ? this.callbacks.onNext() : this.callbacks.onPrev()), this.touchState.isDragging && this.callbacks.onDragEnd(r), this.touchState = null;
2298
2377
  }
2299
2378
  handleTouchCancel(t) {
2300
2379
  this.touchState?.isDragging && this.callbacks.onDragEnd(!1), this.touchState = null;
2301
2380
  }
2302
2381
  };
2303
- at.TOUCH_CLICK_DELAY = 300;
2304
- let ft = at;
2305
- class Re {
2382
+ ot.TOUCH_CLICK_DELAY = 300;
2383
+ let mt = ot;
2384
+ class ze {
2306
2385
  constructor(t) {
2307
2386
  if (this._prepared = !1, this._discoveredUrls = [], this.apiKey = t.apiKey ?? "", this.apiEndpoint = t.apiEndpoint ?? "https://www.googleapis.com/drive/v3/files", this.debugLogging = t.debugLogging ?? !1, this.sources = t.sources ?? [], !this.sources || this.sources.length === 0)
2308
2387
  throw new Error("GoogleDriveLoader requires at least one source to be configured");
@@ -2316,8 +2395,8 @@ class Re {
2316
2395
  for (const e of this.sources)
2317
2396
  if ("folders" in e)
2318
2397
  for (const i of e.folders) {
2319
- const o = e.recursive !== void 0 ? e.recursive : !0, s = await this.loadFromFolder(i, t, o);
2320
- this._discoveredUrls.push(...s);
2398
+ const o = e.recursive !== void 0 ? e.recursive : !0, a = await this.loadFromFolder(i, t, o);
2399
+ this._discoveredUrls.push(...a);
2321
2400
  }
2322
2401
  else if ("files" in e) {
2323
2402
  const i = await this.loadFiles(e.files, t);
@@ -2383,8 +2462,8 @@ class Re {
2383
2462
  return this.loadImagesDirectly(o, e);
2384
2463
  try {
2385
2464
  return i ? await this.loadImagesRecursively(o, e) : await this.loadImagesFromSingleFolder(o, e);
2386
- } catch (s) {
2387
- return console.error("Error loading from Google Drive API:", s), this.loadImagesDirectly(o, e);
2465
+ } catch (a) {
2466
+ return console.error("Error loading from Google Drive API:", a), this.loadImagesDirectly(o, e);
2388
2467
  }
2389
2468
  }
2390
2469
  /**
@@ -2394,14 +2473,14 @@ class Re {
2394
2473
  * @returns Promise resolving to array of image URLs
2395
2474
  */
2396
2475
  async loadImagesFromSingleFolder(t, e) {
2397
- const i = [], o = `'${t}' in parents and trashed=false`, r = `${this.apiEndpoint}?q=${encodeURIComponent(o)}&fields=files(id,name,mimeType,thumbnailLink)&key=${this.apiKey}`, a = await fetch(r);
2398
- if (!a.ok)
2399
- throw new Error(`API request failed: ${a.status} ${a.statusText}`);
2400
- const c = (await a.json()).files.filter(
2401
- (u) => u.mimeType.startsWith("image/") && e.isAllowed(u.name)
2476
+ const i = [], o = `'${t}' in parents and trashed=false`, r = `${this.apiEndpoint}?q=${encodeURIComponent(o)}&fields=files(id,name,mimeType,thumbnailLink)&key=${this.apiKey}`, s = await fetch(r);
2477
+ if (!s.ok)
2478
+ throw new Error(`API request failed: ${s.status} ${s.statusText}`);
2479
+ const c = (await s.json()).files.filter(
2480
+ (d) => d.mimeType.startsWith("image/") && e.isAllowed(d.name)
2402
2481
  );
2403
- return this.log(`Found ${c.length} images in folder ${t} (non-recursive)`), c.forEach((u) => {
2404
- i.push(`https://lh3.googleusercontent.com/d/${u.id}=s1600`), this.log(`Added file: ${u.name}`);
2482
+ return this.log(`Found ${c.length} images in folder ${t} (non-recursive)`), c.forEach((d) => {
2483
+ i.push(`https://lh3.googleusercontent.com/d/${d.id}=s1600`), this.log(`Added file: ${d.name}`);
2405
2484
  }), i;
2406
2485
  }
2407
2486
  /**
@@ -2413,24 +2492,24 @@ class Re {
2413
2492
  async loadFiles(t, e) {
2414
2493
  const i = [];
2415
2494
  for (const o of t) {
2416
- const s = this.extractFileId(o);
2417
- if (!s) {
2495
+ const a = this.extractFileId(o);
2496
+ if (!a) {
2418
2497
  this.log(`Skipping invalid file URL: ${o}`);
2419
2498
  continue;
2420
2499
  }
2421
2500
  if (this.apiKey && this.apiKey !== "YOUR_API_KEY_HERE")
2422
2501
  try {
2423
- const r = `${this.apiEndpoint}/${s}?fields=name,mimeType&key=${this.apiKey}`, a = await fetch(r);
2424
- if (a.ok) {
2425
- const h = await a.json();
2426
- h.mimeType.startsWith("image/") && e.isAllowed(h.name) ? (i.push(`https://lh3.googleusercontent.com/d/${s}=s1600`), this.log(`Added file: ${h.name}`)) : this.log(`Skipping non-image file: ${h.name} (${h.mimeType})`);
2502
+ const r = `${this.apiEndpoint}/${a}?fields=name,mimeType&key=${this.apiKey}`, s = await fetch(r);
2503
+ if (s.ok) {
2504
+ const h = await s.json();
2505
+ h.mimeType.startsWith("image/") && e.isAllowed(h.name) ? (i.push(`https://lh3.googleusercontent.com/d/${a}=s1600`), this.log(`Added file: ${h.name}`)) : this.log(`Skipping non-image file: ${h.name} (${h.mimeType})`);
2427
2506
  } else
2428
- this.log(`Failed to fetch metadata for file ${s}: ${a.status}`);
2507
+ this.log(`Failed to fetch metadata for file ${a}: ${s.status}`);
2429
2508
  } catch (r) {
2430
- this.log(`Error fetching metadata for file ${s}:`, r);
2509
+ this.log(`Error fetching metadata for file ${a}:`, r);
2431
2510
  }
2432
2511
  else
2433
- i.push(`https://lh3.googleusercontent.com/d/${s}=s1600`);
2512
+ i.push(`https://lh3.googleusercontent.com/d/${a}=s1600`);
2434
2513
  }
2435
2514
  return i;
2436
2515
  }
@@ -2464,21 +2543,21 @@ class Re {
2464
2543
  * @returns Promise resolving to array of image URLs
2465
2544
  */
2466
2545
  async loadImagesRecursively(t, e) {
2467
- const i = [], o = `'${t}' in parents and trashed=false`, r = `${this.apiEndpoint}?q=${encodeURIComponent(o)}&fields=files(id,name,mimeType,thumbnailLink)&key=${this.apiKey}`, a = await fetch(r);
2468
- if (!a.ok)
2469
- throw new Error(`API request failed: ${a.status} ${a.statusText}`);
2470
- const h = await a.json(), c = h.files.filter(
2546
+ const i = [], o = `'${t}' in parents and trashed=false`, r = `${this.apiEndpoint}?q=${encodeURIComponent(o)}&fields=files(id,name,mimeType,thumbnailLink)&key=${this.apiKey}`, s = await fetch(r);
2547
+ if (!s.ok)
2548
+ throw new Error(`API request failed: ${s.status} ${s.statusText}`);
2549
+ const h = await s.json(), c = h.files.filter(
2471
2550
  (l) => l.mimeType.startsWith("image/") && e.isAllowed(l.name)
2472
- ), u = h.files.filter(
2551
+ ), d = h.files.filter(
2473
2552
  (l) => l.mimeType === "application/vnd.google-apps.folder"
2474
2553
  );
2475
- this.log(`Found ${h.files.length} total items in folder ${t}`), h.files.forEach((l) => this.log(` - File: ${l.name} (${l.mimeType})`)), this.log(`- ${c.length} valid files (images only)`), this.log(`- ${u.length} subfolders`), c.forEach((l) => {
2554
+ this.log(`Found ${h.files.length} total items in folder ${t}`), h.files.forEach((l) => this.log(` - File: ${l.name} (${l.mimeType})`)), this.log(`- ${c.length} valid files (images only)`), this.log(`- ${d.length} subfolders`), c.forEach((l) => {
2476
2555
  i.push(`https://lh3.googleusercontent.com/d/${l.id}=s1600`), this.log(`Added file: ${l.name}`);
2477
2556
  });
2478
- for (const l of u) {
2557
+ for (const l of d) {
2479
2558
  this.log(`Loading images from subfolder: ${l.name}`);
2480
- const d = await this.loadImagesRecursively(l.id, e);
2481
- i.push(...d);
2559
+ const u = await this.loadImagesRecursively(l.id, e);
2560
+ i.push(...u);
2482
2561
  }
2483
2562
  return i;
2484
2563
  }
@@ -2494,9 +2573,9 @@ class Re {
2494
2573
  const i = `https://drive.google.com/embeddedfolderview?id=${t}`, o = await fetch(i, { mode: "cors" });
2495
2574
  if (!o.ok)
2496
2575
  throw new Error("Cannot access folder directly (CORS or permissions issue)");
2497
- const s = await o.text(), r = /\/file\/d\/([a-zA-Z0-9_-]+)/g, a = [...s.matchAll(r)];
2498
- return [...new Set(a.map((u) => u[1]))].map(
2499
- (u) => `https://drive.google.com/uc?export=view&id=${u}`
2576
+ const a = await o.text(), r = /\/file\/d\/([a-zA-Z0-9_-]+)/g, s = [...a.matchAll(r)];
2577
+ return [...new Set(s.map((d) => d[1]))].map(
2578
+ (d) => `https://drive.google.com/uc?export=view&id=${d}`
2500
2579
  );
2501
2580
  } catch (i) {
2502
2581
  throw console.error("Direct loading failed:", i), new Error(
@@ -2523,7 +2602,7 @@ class Re {
2523
2602
  this.debugLogging && typeof console < "u" && console.log(...t);
2524
2603
  }
2525
2604
  }
2526
- class Me {
2605
+ class Fe {
2527
2606
  constructor(t) {
2528
2607
  if (this._prepared = !1, this._discoveredUrls = [], this.validateUrls = t.validateUrls !== !1, this.validationTimeout = t.validationTimeout ?? 5e3, this.validationMethod = t.validationMethod ?? "head", this.debugLogging = t.debugLogging ?? !1, this.sources = t.sources ?? [], !this.sources || this.sources.length === 0)
2529
2608
  throw new Error("StaticImageLoader requires at least one source to be configured");
@@ -2588,8 +2667,8 @@ class Me {
2588
2667
  return console.warn("URLs must be an array:", t), [];
2589
2668
  const i = [];
2590
2669
  for (const o of t) {
2591
- const s = o.split("/").pop() || o;
2592
- if (!e.isAllowed(s)) {
2670
+ const a = o.split("/").pop() || o;
2671
+ if (!e.isAllowed(a)) {
2593
2672
  this.log(`Skipping filtered URL: ${o}`);
2594
2673
  continue;
2595
2674
  }
@@ -2608,12 +2687,12 @@ class Me {
2608
2687
  if (!Array.isArray(e))
2609
2688
  return console.warn("files must be an array:", e), [];
2610
2689
  const o = [];
2611
- for (const s of e) {
2612
- if (!i.isAllowed(s)) {
2613
- this.log(`Skipping filtered file: ${s}`);
2690
+ for (const a of e) {
2691
+ if (!i.isAllowed(a)) {
2692
+ this.log(`Skipping filtered file: ${a}`);
2614
2693
  continue;
2615
2694
  }
2616
- const r = this.constructUrl(t, s);
2695
+ const r = this.constructUrl(t, a);
2617
2696
  this.validateUrls ? await this.validateUrl(r) ? o.push(r) : console.warn(`Skipping invalid/missing file: ${r}`) : o.push(r);
2618
2697
  }
2619
2698
  return o;
@@ -2629,15 +2708,15 @@ class Me {
2629
2708
  this.log(`Fetching JSON endpoint: ${t}`);
2630
2709
  const i = new AbortController(), o = setTimeout(() => i.abort(), 1e4);
2631
2710
  try {
2632
- const s = await fetch(t, { signal: i.signal });
2633
- if (clearTimeout(o), !s.ok)
2634
- throw new Error(`HTTP ${s.status} fetching ${t}`);
2635
- const r = await s.json();
2711
+ const a = await fetch(t, { signal: i.signal });
2712
+ if (clearTimeout(o), !a.ok)
2713
+ throw new Error(`HTTP ${a.status} fetching ${t}`);
2714
+ const r = await a.json();
2636
2715
  if (!r || !Array.isArray(r.images))
2637
2716
  throw new Error('JSON source must return JSON with shape { "images": ["url1", "url2", ...] }');
2638
2717
  return this.log(`JSON endpoint returned ${r.images.length} image(s)`), await this.processUrls(r.images, e);
2639
- } catch (s) {
2640
- throw clearTimeout(o), s instanceof Error && s.name === "AbortError" ? new Error(`Timeout fetching JSON endpoint: ${t}`) : s;
2718
+ } catch (a) {
2719
+ throw clearTimeout(o), a instanceof Error && a.name === "AbortError" ? new Error(`Timeout fetching JSON endpoint: ${t}`) : a;
2641
2720
  }
2642
2721
  }
2643
2722
  /**
@@ -2659,11 +2738,11 @@ class Me {
2659
2738
  if (!(t.startsWith(window.location.origin) || t.startsWith("/")))
2660
2739
  return this.log(`Skipping validation for cross-origin URL: ${t}`), !0;
2661
2740
  try {
2662
- const i = new AbortController(), o = setTimeout(() => i.abort(), this.validationTimeout), s = await fetch(t, {
2741
+ const i = new AbortController(), o = setTimeout(() => i.abort(), this.validationTimeout), a = await fetch(t, {
2663
2742
  method: "HEAD",
2664
2743
  signal: i.signal
2665
2744
  });
2666
- return clearTimeout(o), s.ok ? !0 : (this.log(`Validation failed for ${t}: HTTP ${s.status}`), !1);
2745
+ return clearTimeout(o), a.ok ? !0 : (this.log(`Validation failed for ${t}: HTTP ${a.status}`), !1);
2667
2746
  } catch (i) {
2668
2747
  return i instanceof Error && (i.name === "AbortError" ? this.log(`Validation timeout for ${t}`) : this.log(`Validation failed for ${t}:`, i.message)), !1;
2669
2748
  }
@@ -2703,7 +2782,7 @@ class Me {
2703
2782
  this.debugLogging && typeof console < "u" && console.log(...t);
2704
2783
  }
2705
2784
  }
2706
- class Le {
2785
+ class Oe {
2707
2786
  constructor(t) {
2708
2787
  if (this._prepared = !1, this._discoveredUrls = [], this.loaders = t.loaders, this.debugLogging = t.debugLogging ?? !1, !this.loaders || this.loaders.length === 0)
2709
2788
  throw new Error("CompositeLoader requires at least one loader to be configured");
@@ -2717,8 +2796,8 @@ class Le {
2717
2796
  this._discoveredUrls = [], this.log(`Preparing ${this.loaders.length} loader(s) in parallel`);
2718
2797
  const e = this.loaders.map((i, o) => i.prepare(t).then(() => {
2719
2798
  this.log(`Loader ${o} prepared with ${i.imagesLength()} images`);
2720
- }).catch((s) => {
2721
- console.warn(`Loader ${o} failed to prepare:`, s);
2799
+ }).catch((a) => {
2800
+ console.warn(`Loader ${o} failed to prepare:`, a);
2722
2801
  }));
2723
2802
  await Promise.all(e);
2724
2803
  for (const i of this.loaders)
@@ -2760,7 +2839,7 @@ class Le {
2760
2839
  this.debugLogging && typeof console < "u" && console.log("[CompositeLoader]", ...t);
2761
2840
  }
2762
2841
  }
2763
- class ze {
2842
+ class $e {
2764
2843
  /**
2765
2844
  * Create a new ImageFilter
2766
2845
  * @param extensions - Array of allowed file extensions (without dots)
@@ -2797,7 +2876,7 @@ class ze {
2797
2876
  // isAllowedDate(date: Date): boolean
2798
2877
  // isAllowedDimensions(width: number, height: number): boolean
2799
2878
  }
2800
- const Fe = `
2879
+ const De = `
2801
2880
  .fbn-ic-gallery {
2802
2881
  position: relative;
2803
2882
  width: 100%;
@@ -2847,19 +2926,19 @@ const Fe = `
2847
2926
  display: none !important;
2848
2927
  }
2849
2928
  `;
2850
- function Oe() {
2929
+ function Pe() {
2851
2930
  if (typeof document > "u") return;
2852
2931
  const n = "fbn-ic-functional-styles";
2853
2932
  if (document.getElementById(n)) return;
2854
2933
  const t = document.createElement("style");
2855
- t.id = n, t.textContent = Fe, document.head.appendChild(t);
2934
+ t.id = n, t.textContent = De, document.head.appendChild(t);
2856
2935
  }
2857
- class De {
2936
+ class _e {
2858
2937
  constructor(t = {}) {
2859
2938
  this.fullConfig = Gt(t), t.container instanceof HTMLElement ? (this.containerRef = t.container, this.containerId = null) : (this.containerRef = null, this.containerId = t.container || "imageCloud"), this.imagesLoaded = !1, this.imageElements = [], this.imageLayouts = [], this.currentImageHeight = 225, this.currentFocusIndex = null, this.hoveredImage = null, this.resizeTimeout = null, this.displayQueue = [], this.queueInterval = null, this.loadGeneration = 0, this.loadingElAutoCreated = !1, this.errorElAutoCreated = !1, this.counterEl = null, this.counterElAutoCreated = !1, this.animationEngine = new Bt(this.fullConfig.animation), this.layoutEngine = new pe({
2860
2939
  layout: this.fullConfig.layout,
2861
2940
  image: this.fullConfig.image
2862
- }), this.zoomEngine = new xe(this.fullConfig.interaction.focus, this.animationEngine, this.fullConfig.styling), this.defaultStyles = st(this.fullConfig.styling?.default), this.hoverStyles = st(this.fullConfig.styling?.hover), this.defaultClassName = this.fullConfig.styling?.default?.className, this.hoverClassName = this.fullConfig.styling?.hover?.className;
2941
+ }), this.zoomEngine = new Ie(this.fullConfig.interaction.focus, this.animationEngine, this.fullConfig.styling), this.defaultStyles = wt(this.fullConfig.styling?.default), this.defaultClassName = this.fullConfig.styling?.default?.className, this.hoverClassName = this.fullConfig.styling?.hover?.className;
2863
2942
  const e = this.fullConfig.animation.entry || y.animation.entry;
2864
2943
  this.entryAnimationEngine = new se(
2865
2944
  e,
@@ -2871,7 +2950,7 @@ class De {
2871
2950
  */
2872
2951
  createImageFilter() {
2873
2952
  const t = this.fullConfig.config.loaders?.allowedExtensions;
2874
- return new ze(t);
2953
+ return new $e(t);
2875
2954
  }
2876
2955
  /**
2877
2956
  * Create appropriate image loader based on config
@@ -2882,7 +2961,7 @@ class De {
2882
2961
  if (!t || t.length === 0)
2883
2962
  throw new Error("No loaders configured. Provide `images`, `loaders`, or both.");
2884
2963
  const i = t.map((o) => this.createLoaderFromEntry(o, e));
2885
- return i.length === 1 ? i[0] : new Le({
2964
+ return i.length === 1 ? i[0] : new Oe({
2886
2965
  loaders: i,
2887
2966
  debugLogging: this.fullConfig.config.debug?.loaders
2888
2967
  });
@@ -2900,14 +2979,14 @@ class De {
2900
2979
  allowedExtensions: i.allowedExtensions ?? e.allowedExtensions,
2901
2980
  debugLogging: i.debugLogging ?? this.fullConfig.config.debug?.loaders
2902
2981
  };
2903
- return new Me(o);
2982
+ return new Fe(o);
2904
2983
  } else if ("googleDrive" in t) {
2905
2984
  const i = t.googleDrive, o = {
2906
2985
  ...i,
2907
2986
  allowedExtensions: i.allowedExtensions ?? e.allowedExtensions,
2908
2987
  debugLogging: i.debugLogging ?? this.fullConfig.config.debug?.loaders
2909
2988
  };
2910
- return new Re(o);
2989
+ return new ze(o);
2911
2990
  } else
2912
2991
  throw new Error(`Unknown loader entry: ${JSON.stringify(t)}`);
2913
2992
  }
@@ -2916,16 +2995,16 @@ class De {
2916
2995
  */
2917
2996
  async init() {
2918
2997
  try {
2919
- if (Oe(), this.containerRef)
2998
+ if (Pe(), this.containerRef)
2920
2999
  this.containerEl = this.containerRef;
2921
3000
  else if (this.containerEl = document.getElementById(this.containerId), !this.containerEl)
2922
3001
  throw new Error(`Container #${this.containerId} not found`);
2923
- this.containerEl.classList.add("fbn-ic-gallery"), this.swipeEngine = new ft(this.containerEl, {
3002
+ this.containerEl.classList.add("fbn-ic-gallery"), this.swipeEngine = new mt(this.containerEl, {
2924
3003
  onNext: () => this.navigateToNextImage(),
2925
3004
  onPrev: () => this.navigateToPreviousImage(),
2926
3005
  onDragOffset: (t) => this.zoomEngine.setDragOffset(t),
2927
3006
  onDragEnd: (t) => {
2928
- t ? this.zoomEngine.clearDragOffset(!1) : this.zoomEngine.clearDragOffset(!0, Te);
3007
+ t ? this.zoomEngine.clearDragOffset(!1) : this.zoomEngine.clearDragOffset(!0, Me);
2929
3008
  }
2930
3009
  }), this.setupUI(), this.setupEventListeners(), this.logDebug("ImageCloud initialized"), await this.loadImages();
2931
3010
  } catch (t) {
@@ -3020,13 +3099,13 @@ class De {
3020
3099
  this.showError("No images found."), this.showLoading(!1);
3021
3100
  return;
3022
3101
  }
3023
- const i = this.getContainerBounds(), o = this.getImageHeight(), s = window.innerWidth;
3102
+ const i = this.getContainerBounds(), o = this.getImageHeight(), a = window.innerWidth;
3024
3103
  this.logDebug(`Adaptive sizing input: container=${i.width}x${i.height}px, images=${t}, responsiveMax=${o}px`);
3025
3104
  const r = this.layoutEngine.calculateAdaptiveSize(
3026
3105
  i,
3027
3106
  t,
3028
3107
  o,
3029
- s
3108
+ a
3030
3109
  );
3031
3110
  this.logDebug(`Adaptive sizing result: height=${r.height}px`), await this.createImageCloud(e, r.height), this.showLoading(!1), this.imagesLoaded = !0;
3032
3111
  } catch (t) {
@@ -3043,41 +3122,41 @@ class De {
3043
3122
  if (!this.containerEl) return;
3044
3123
  const i = this.getContainerBounds();
3045
3124
  this.currentImageHeight = e;
3046
- const o = this.loadGeneration, s = this.layoutEngine.generateLayout(t.length, i, { fixedHeight: e });
3047
- this.imageLayouts = s, this.displayQueue = [];
3125
+ const o = this.loadGeneration, a = this.layoutEngine.generateLayout(t.length, i, { fixedHeight: e });
3126
+ this.imageLayouts = a, this.displayQueue = [];
3048
3127
  let r = 0;
3049
- const a = (c) => {
3128
+ const s = (c) => {
3050
3129
  this.containerEl && (this.containerEl.appendChild(c), this.imageElements.push(c), requestAnimationFrame(() => {
3051
3130
  if (c.offsetWidth, c.style.opacity = this.defaultStyles.opacity ?? "1", c.dataset.startX && (this.entryAnimationEngine.requiresJSAnimation() || this.entryAnimationEngine.requiresJSRotation() || this.entryAnimationEngine.requiresJSScale() || c.dataset.startRotation !== c.dataset.rotation || c.dataset.startScale !== c.dataset.scale)) {
3052
- const d = {
3131
+ const u = {
3053
3132
  x: parseFloat(c.dataset.startX),
3054
3133
  y: parseFloat(c.dataset.startY)
3055
- }, m = {
3134
+ }, g = {
3056
3135
  x: parseFloat(c.dataset.endX),
3057
3136
  y: parseFloat(c.dataset.endY)
3058
- }, b = parseFloat(c.dataset.imageWidth), p = parseFloat(c.dataset.imageHeight), g = parseFloat(c.dataset.rotation), f = parseFloat(c.dataset.scale), E = c.dataset.startRotation ? parseFloat(c.dataset.startRotation) : g, v = c.dataset.startScale ? parseFloat(c.dataset.startScale) : f, w = this.entryAnimationEngine.getTiming();
3137
+ }, p = parseFloat(c.dataset.imageWidth), b = parseFloat(c.dataset.imageHeight), f = parseFloat(c.dataset.rotation), m = parseFloat(c.dataset.scale), E = c.dataset.startRotation ? parseFloat(c.dataset.startRotation) : f, v = c.dataset.startScale ? parseFloat(c.dataset.startScale) : m, w = this.entryAnimationEngine.getTiming();
3059
3138
  ie({
3060
3139
  element: c,
3061
- startPosition: d,
3062
- endPosition: m,
3140
+ startPosition: u,
3141
+ endPosition: g,
3063
3142
  pathConfig: this.entryAnimationEngine.getPathConfig(),
3064
3143
  duration: w.duration,
3065
- imageWidth: b,
3066
- imageHeight: p,
3067
- rotation: g,
3068
- scale: f,
3144
+ imageWidth: p,
3145
+ imageHeight: b,
3146
+ rotation: f,
3147
+ scale: m,
3069
3148
  rotationConfig: this.entryAnimationEngine.getRotationConfig(),
3070
3149
  startRotation: E,
3071
3150
  scaleConfig: this.entryAnimationEngine.getScaleConfig(),
3072
3151
  startScale: v
3073
3152
  });
3074
3153
  } else {
3075
- const d = c.dataset.finalTransform || "";
3076
- c.style.transform = d;
3154
+ const u = c.dataset.finalTransform || "";
3155
+ c.style.transform = u;
3077
3156
  }
3078
3157
  const l = parseInt(c.dataset.imageId || "0");
3079
3158
  if (this.fullConfig.config.debug?.enabled && l < 3) {
3080
- const d = c.dataset.finalTransform || "";
3159
+ const u = c.dataset.finalTransform || "";
3081
3160
  console.log(`Image ${l} final state:`, {
3082
3161
  left: c.style.left,
3083
3162
  top: c.style.top,
@@ -3085,7 +3164,7 @@ class De {
3085
3164
  height: c.style.height,
3086
3165
  computedWidth: c.offsetWidth,
3087
3166
  computedHeight: c.offsetHeight,
3088
- transform: d,
3167
+ transform: u,
3089
3168
  pathType: this.entryAnimationEngine.getPathType()
3090
3169
  });
3091
3170
  }
@@ -3094,7 +3173,7 @@ class De {
3094
3173
  if (this.logDebug("Starting queue processing, enabled:", this.fullConfig.animation.queue.enabled), !this.fullConfig.animation.queue.enabled) {
3095
3174
  for (; this.displayQueue.length > 0; ) {
3096
3175
  const c = this.displayQueue.shift();
3097
- c && a(c);
3176
+ c && s(c);
3098
3177
  }
3099
3178
  return;
3100
3179
  }
@@ -3105,70 +3184,76 @@ class De {
3105
3184
  }
3106
3185
  if (this.displayQueue.length > 0) {
3107
3186
  const c = this.displayQueue.shift();
3108
- c && a(c);
3187
+ c && s(c);
3109
3188
  }
3110
3189
  r >= t.length && this.displayQueue.length === 0 && this.queueInterval !== null && (clearInterval(this.queueInterval), this.queueInterval = null);
3111
3190
  }, this.fullConfig.animation.queue.interval);
3112
3191
  };
3113
3192
  if ("IntersectionObserver" in window && this.containerEl) {
3114
- const c = new IntersectionObserver((u) => {
3115
- u.forEach((l) => {
3193
+ const c = new IntersectionObserver((d) => {
3194
+ d.forEach((l) => {
3116
3195
  l.isIntersecting && (h(), c.disconnect());
3117
3196
  });
3118
3197
  }, { threshold: 0.1, rootMargin: "50px" });
3119
3198
  c.observe(this.containerEl);
3120
3199
  } else
3121
3200
  h();
3122
- this.fullConfig.config.debug?.centers && this.containerEl && (this.containerEl.querySelectorAll(".fbn-ic-debug-center").forEach((c) => c.remove()), s.forEach((c, u) => {
3201
+ this.fullConfig.config.debug?.centers && this.containerEl && (this.containerEl.querySelectorAll(".fbn-ic-debug-center").forEach((c) => c.remove()), a.forEach((c, d) => {
3123
3202
  const l = document.createElement("div");
3124
3203
  l.className = "fbn-ic-debug-center", l.style.position = "absolute", l.style.width = "12px", l.style.height = "12px", l.style.borderRadius = "50%", l.style.backgroundColor = "red", l.style.border = "2px solid yellow", l.style.zIndex = "9999", l.style.pointerEvents = "none";
3125
- const d = c.x, m = c.y;
3126
- l.style.left = `${d - 6}px`, l.style.top = `${m - 6}px`, l.title = `Image ${u}: center (${Math.round(d)}, ${Math.round(m)})`, this.containerEl.appendChild(l);
3127
- })), t.forEach((c, u) => {
3204
+ const u = c.x, g = c.y;
3205
+ l.style.left = `${u - 6}px`, l.style.top = `${g - 6}px`, l.title = `Image ${d}: center (${Math.round(u)}, ${Math.round(g)})`, this.containerEl.appendChild(l);
3206
+ })), t.forEach((c, d) => {
3128
3207
  const l = document.createElement("img");
3129
- l.referrerPolicy = "no-referrer", l.classList.add("fbn-ic-image"), l.dataset.imageId = String(u);
3130
- const d = s[u];
3131
- l.style.position = "absolute", l.style.width = "auto", l.style.height = `${e}px`, l.style.left = `${d.x}px`, l.style.top = `${d.y}px`, d.zIndex && (l.style.zIndex = String(d.zIndex)), tt(l, this.defaultStyles), et(l, this.defaultClassName), l.addEventListener("mouseenter", () => {
3132
- this.hoveredImage = { element: l, layout: d }, this.zoomEngine.isInvolved(l) || (tt(l, this.hoverStyles), et(l, this.hoverClassName));
3208
+ l.referrerPolicy = "no-referrer", l.classList.add("fbn-ic-image"), l.dataset.imageId = String(d), l.dataset.createdFlag = "true";
3209
+ const u = a[d];
3210
+ l.style.position = "absolute", l.style.width = "auto", l.style.height = `${e}px`, l.style.left = `${u.x}px`, l.style.top = `${u.y}px`, u.zIndex && (l.style.zIndex = String(u.zIndex)), nt(l, this.defaultClassName), l.addEventListener("mouseenter", () => {
3211
+ if (this.hoveredImage = { element: l, layout: u }, !this.zoomEngine.isInvolved(l)) {
3212
+ const g = l.cachedRenderedWidth;
3213
+ ut(l, this.fullConfig.styling?.hover, e, g), nt(l, this.hoverClassName);
3214
+ }
3133
3215
  }), l.addEventListener("mouseleave", () => {
3134
- this.hoveredImage = null, this.zoomEngine.isInvolved(l) || (tt(l, this.defaultStyles), Ot(l, this.hoverClassName), et(l, this.defaultClassName));
3135
- }), l.addEventListener("click", (m) => {
3136
- m.stopPropagation(), this.handleImageClick(l, d);
3216
+ if (this.hoveredImage = null, !this.zoomEngine.isInvolved(l)) {
3217
+ const g = l.cachedRenderedWidth;
3218
+ ut(l, this.fullConfig.styling?.default, e, g), ft(l, this.hoverClassName), nt(l, this.defaultClassName);
3219
+ }
3220
+ }), l.addEventListener("click", (g) => {
3221
+ g.stopPropagation(), this.handleImageClick(l, u);
3137
3222
  }), l.style.opacity = "0", l.style.transition = this.entryAnimationEngine.getTransitionCSS(), l.onload = () => {
3138
3223
  if (o !== this.loadGeneration)
3139
3224
  return;
3140
- const m = l.naturalWidth / l.naturalHeight, b = e * m;
3141
- l.style.width = `${b}px`;
3142
- const p = { x: d.x, y: d.y }, g = { width: b, height: e }, f = this.entryAnimationEngine.calculateStartPosition(
3143
- p,
3144
- g,
3225
+ const g = l.naturalWidth / l.naturalHeight, p = e * g;
3226
+ l.dataset.onloadCalled = "true", window.DEBUG_CLIPPATH && console.log(`[onload #${d}] Called with imageHeight=${e}, renderedWidth=${p}`), l.style.width = `${p}px`, l.cachedRenderedWidth = p, l.aspectRatio = g, ut(l, this.fullConfig.styling?.default, e, p);
3227
+ const b = { x: u.x, y: u.y }, f = { width: p, height: e }, m = this.entryAnimationEngine.calculateStartPosition(
3228
+ b,
3229
+ f,
3145
3230
  i,
3146
- u,
3231
+ d,
3147
3232
  t.length
3148
- ), E = this.entryAnimationEngine.calculateStartRotation(d.rotation), v = this.entryAnimationEngine.calculateStartScale(d.scale), w = this.entryAnimationEngine.buildFinalTransform(
3149
- d.rotation,
3150
- d.scale,
3151
- b,
3233
+ ), E = this.entryAnimationEngine.calculateStartRotation(u.rotation), v = this.entryAnimationEngine.calculateStartScale(u.scale), w = this.entryAnimationEngine.buildFinalTransform(
3234
+ u.rotation,
3235
+ u.scale,
3236
+ p,
3152
3237
  e
3153
3238
  ), S = this.entryAnimationEngine.buildStartTransform(
3154
- f,
3155
- p,
3156
- d.rotation,
3157
- d.scale,
3239
+ m,
3158
3240
  b,
3241
+ u.rotation,
3242
+ u.scale,
3243
+ p,
3159
3244
  e,
3160
3245
  E,
3161
3246
  v
3162
3247
  );
3163
- this.fullConfig.config.debug?.enabled && u < 3 && console.log(`Image ${u}:`, {
3164
- finalPosition: p,
3165
- imageSize: g,
3166
- left: d.x,
3167
- top: d.y,
3248
+ this.fullConfig.config.debug?.enabled && d < 3 && console.log(`Image ${d}:`, {
3249
+ finalPosition: b,
3250
+ imageSize: f,
3251
+ left: u.x,
3252
+ top: u.y,
3168
3253
  finalTransform: w,
3169
- renderedWidth: b,
3254
+ renderedWidth: p,
3170
3255
  renderedHeight: e
3171
- }), l.style.transform = S, l.dataset.finalTransform = w, (this.entryAnimationEngine.requiresJSAnimation() || this.entryAnimationEngine.requiresJSRotation() || this.entryAnimationEngine.requiresJSScale() || E !== d.rotation || v !== d.scale) && (l.dataset.startX = String(f.x), l.dataset.startY = String(f.y), l.dataset.endX = String(p.x), l.dataset.endY = String(p.y), l.dataset.imageWidth = String(b), l.dataset.imageHeight = String(e), l.dataset.rotation = String(d.rotation), l.dataset.scale = String(d.scale), l.dataset.startRotation = String(E), l.dataset.startScale = String(v)), this.displayQueue.push(l);
3256
+ }), l.style.transform = S, l.dataset.finalTransform = w, (this.entryAnimationEngine.requiresJSAnimation() || this.entryAnimationEngine.requiresJSRotation() || this.entryAnimationEngine.requiresJSScale() || E !== u.rotation || v !== u.scale) && (l.dataset.startX = String(m.x), l.dataset.startY = String(m.y), l.dataset.endX = String(b.x), l.dataset.endY = String(b.y), l.dataset.imageWidth = String(p), l.dataset.imageHeight = String(e), l.dataset.rotation = String(u.rotation), l.dataset.scale = String(u.scale), l.dataset.startRotation = String(E), l.dataset.startScale = String(v)), this.displayQueue.push(l);
3172
3257
  }, l.onerror = () => r++, l.src = c;
3173
3258
  });
3174
3259
  }
@@ -3181,8 +3266,8 @@ class De {
3181
3266
  if (i)
3182
3267
  await this.zoomEngine.unfocusImage(), this.currentFocusIndex = null, this.swipeEngine?.disable(), this.hideCounter();
3183
3268
  else {
3184
- const s = t.dataset.imageId;
3185
- this.currentFocusIndex = s !== void 0 ? parseInt(s, 10) : null, this.swipeEngine?.enable(), await this.zoomEngine.focusImage(t, o, e), this.currentFocusIndex !== null && this.updateCounter(this.currentFocusIndex);
3269
+ const a = t.dataset.imageId;
3270
+ this.currentFocusIndex = a !== void 0 ? parseInt(a, 10) : null, this.swipeEngine?.enable(), await this.zoomEngine.focusImage(t, o, e), this.currentFocusIndex !== null && this.updateCounter(this.currentFocusIndex);
3186
3271
  }
3187
3272
  }
3188
3273
  /**
@@ -3213,7 +3298,7 @@ class De {
3213
3298
  this.clearImageCloud(), this.loadingElAutoCreated && this.loadingEl && (this.loadingEl.remove(), this.loadingEl = null), this.errorElAutoCreated && this.errorEl && (this.errorEl.remove(), this.errorEl = null), this.counterElAutoCreated && this.counterEl && (this.counterEl.remove(), this.counterEl = null), this.resizeTimeout !== null && clearTimeout(this.resizeTimeout), this.swipeEngine?.destroy();
3214
3299
  }
3215
3300
  }
3216
- const wt = class wt extends HTMLElement {
3301
+ const xt = class xt extends HTMLElement {
3217
3302
  constructor() {
3218
3303
  super(...arguments), this._instance = null, this._container = null;
3219
3304
  }
@@ -3233,17 +3318,17 @@ const wt = class wt extends HTMLElement {
3233
3318
  const t = {}, e = this.getAttribute("config");
3234
3319
  if (e)
3235
3320
  try {
3236
- const s = JSON.parse(e), { container: r, ...a } = s;
3237
- Object.assign(t, a);
3238
- } catch (s) {
3239
- console.error("<image-cloud> invalid config JSON:", s);
3321
+ const a = JSON.parse(e), { container: r, ...s } = a;
3322
+ Object.assign(t, s);
3323
+ } catch (a) {
3324
+ console.error("<image-cloud> invalid config JSON:", a);
3240
3325
  }
3241
3326
  const i = this.getAttribute("images");
3242
3327
  if (i)
3243
3328
  try {
3244
3329
  t.images = JSON.parse(i);
3245
- } catch (s) {
3246
- console.error("<image-cloud> invalid images JSON:", s);
3330
+ } catch (a) {
3331
+ console.error("<image-cloud> invalid images JSON:", a);
3247
3332
  }
3248
3333
  const o = this.getAttribute("layout");
3249
3334
  return o && (t.layout = {
@@ -3255,7 +3340,7 @@ const wt = class wt extends HTMLElement {
3255
3340
  if (this._container)
3256
3341
  try {
3257
3342
  const t = this._getOptions();
3258
- this._instance = new De({
3343
+ this._instance = new _e({
3259
3344
  container: this._container,
3260
3345
  ...t
3261
3346
  }), this._instance.init().then(() => {
@@ -3271,8 +3356,8 @@ const wt = class wt extends HTMLElement {
3271
3356
  this._instance?.destroy(), this._instance = null;
3272
3357
  }
3273
3358
  };
3274
- wt.observedAttributes = ["config", "images", "layout"];
3275
- let pt = wt;
3359
+ xt.observedAttributes = ["config", "images", "layout"];
3360
+ let pt = xt;
3276
3361
  typeof customElements < "u" && !customElements.get("image-cloud") && customElements.define("image-cloud", pt);
3277
3362
  export {
3278
3363
  pt as ImageCloudElement