@frybynite/image-cloud 0.10.3 → 0.11.0

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.
@@ -4,16 +4,16 @@ const mt = Object.freeze({
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
- }), Ct = Object.freeze({
7
+ }), Rt = 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
- }), Rt = Object.freeze({
11
+ }), Tt = 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
- }), Tt = 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 }),
@@ -22,7 +22,7 @@ const mt = Object.freeze({
22
22
  type: "linear"
23
23
  }), Et = Object.freeze({
24
24
  mode: "none"
25
- }), wt = Object.freeze({
25
+ }), xt = Object.freeze({
26
26
  mode: "none"
27
27
  }), Ot = Object.freeze({
28
28
  default: Object.freeze({
@@ -50,9 +50,9 @@ const mt = Object.freeze({
50
50
  focused: Object.freeze({
51
51
  shadow: "none"
52
52
  })
53
- }), Nt = Object.freeze({
53
+ }), Ht = Object.freeze({
54
54
  tightness: 1
55
- }), kt = Object.freeze({
55
+ }), Nt = Object.freeze({
56
56
  rows: 1,
57
57
  amplitude: 100,
58
58
  frequency: 2,
@@ -94,7 +94,7 @@ const mt = Object.freeze({
94
94
  enabled: !1,
95
95
  centers: !1,
96
96
  loaders: !1
97
- }), qt = Object.freeze({ maxAngle: 5, speed: 2e3, sync: "random" }), Xt = Object.freeze({ minScale: 0.95, maxScale: 1.05, speed: 2400, sync: "random" }), Yt = Object.freeze({ onRatio: 0.7, speed: 3e3, style: "snap" }), Jt = Object.freeze({ speed: 4e3, direction: "clockwise" }), $t = Object.freeze({ type: "none" }), A = Object.freeze({
97
+ }), qt = Object.freeze({ maxAngle: 5, speed: 2e3, sync: "random" }), Yt = Object.freeze({ minScale: 0.95, maxScale: 1.05, speed: 2400, sync: "random" }), Xt = Object.freeze({ onRatio: 0.7, speed: 3e3, style: "snap" }), Jt = Object.freeze({ speed: 4e3, direction: "clockwise" }), $t = Object.freeze({ type: "none" }), L = Object.freeze({
98
98
  // Loader configuration (always an array, composite behavior is implicit)
99
99
  loaders: [],
100
100
  // Shared loader settings and debug config
@@ -157,7 +157,7 @@ const mt = Object.freeze({
157
157
  // smooth deceleration
158
158
  path: vt,
159
159
  rotation: Et,
160
- scale: wt
160
+ scale: xt
161
161
  }),
162
162
  idle: $t
163
163
  }),
@@ -242,57 +242,57 @@ function Zt(o = {}) {
242
242
  loaders: i,
243
243
  config: n,
244
244
  image: Kt(zt, t),
245
- layout: { ...A.layout },
246
- animation: { ...A.animation },
247
- interaction: { ...A.interaction },
248
- ui: { ...A.ui },
245
+ layout: { ...L.layout },
246
+ animation: { ...L.animation },
247
+ interaction: { ...L.interaction },
248
+ ui: { ...L.ui },
249
249
  styling: Vt(Ot, o.styling)
250
250
  };
251
251
  if (o.layout && (s.layout = {
252
- ...A.layout,
252
+ ...L.layout,
253
253
  ...o.layout
254
254
  }, o.layout.responsive && (s.layout.responsive = {
255
- ...A.layout.responsive,
256
- mobile: o.layout.responsive.mobile ? { ...A.layout.responsive.mobile, ...o.layout.responsive.mobile } : A.layout.responsive.mobile,
257
- tablet: o.layout.responsive.tablet ? { ...A.layout.responsive.tablet, ...o.layout.responsive.tablet } : A.layout.responsive.tablet
255
+ ...L.layout.responsive,
256
+ mobile: o.layout.responsive.mobile ? { ...L.layout.responsive.mobile, ...o.layout.responsive.mobile } : L.layout.responsive.mobile,
257
+ tablet: o.layout.responsive.tablet ? { ...L.layout.responsive.tablet, ...o.layout.responsive.tablet } : L.layout.responsive.tablet
258
258
  }), o.layout.spacing && (s.layout.spacing = {
259
- ...A.layout.spacing,
259
+ ...L.layout.spacing,
260
260
  ...o.layout.spacing
261
261
  })), o.animation && (s.animation = {
262
- ...A.animation,
262
+ ...L.animation,
263
263
  ...o.animation
264
264
  }, o.animation.easing && (s.animation.easing = {
265
- ...A.animation.easing,
265
+ ...L.animation.easing,
266
266
  ...o.animation.easing
267
267
  }), o.animation.queue && (s.animation.queue = {
268
- ...A.animation.queue,
268
+ ...L.animation.queue,
269
269
  ...o.animation.queue
270
270
  }), o.animation.entry && (s.animation.entry = {
271
- ...A.animation.entry,
271
+ ...L.animation.entry,
272
272
  ...o.animation.entry,
273
273
  start: o.animation.entry.start ? {
274
- ...A.animation.entry.start,
274
+ ...L.animation.entry.start,
275
275
  ...o.animation.entry.start,
276
- circular: o.animation.entry.start.circular ? { ...A.animation.entry.start.circular, ...o.animation.entry.start.circular } : A.animation.entry.start.circular
277
- } : A.animation.entry.start,
278
- timing: o.animation.entry.timing ? { ...A.animation.entry.timing, ...o.animation.entry.timing } : A.animation.entry.timing,
279
- path: o.animation.entry.path ? { ...vt, ...o.animation.entry.path } : A.animation.entry.path,
280
- rotation: o.animation.entry.rotation ? { ...Et, ...o.animation.entry.rotation } : A.animation.entry.rotation,
281
- scale: o.animation.entry.scale ? { ...wt, ...o.animation.entry.scale } : A.animation.entry.scale
276
+ circular: o.animation.entry.start.circular ? { ...L.animation.entry.start.circular, ...o.animation.entry.start.circular } : L.animation.entry.start.circular
277
+ } : L.animation.entry.start,
278
+ timing: o.animation.entry.timing ? { ...L.animation.entry.timing, ...o.animation.entry.timing } : L.animation.entry.timing,
279
+ path: o.animation.entry.path ? { ...vt, ...o.animation.entry.path } : L.animation.entry.path,
280
+ rotation: o.animation.entry.rotation ? { ...Et, ...o.animation.entry.rotation } : L.animation.entry.rotation,
281
+ scale: o.animation.entry.scale ? { ...xt, ...o.animation.entry.scale } : L.animation.entry.scale
282
282
  }), o.animation.idle && (s.animation.idle = {
283
283
  ...$t,
284
284
  ...o.animation.idle
285
285
  })), o.interaction && (s.interaction = {
286
- ...A.interaction,
286
+ ...L.interaction,
287
287
  ...o.interaction
288
288
  }, o.interaction.focus && (s.interaction.focus = {
289
- ...A.interaction.focus,
289
+ ...L.interaction.focus,
290
290
  ...o.interaction.focus
291
291
  }), o.interaction.navigation && (s.interaction.navigation = {
292
- ...A.interaction.navigation,
292
+ ...L.interaction.navigation,
293
293
  ...o.interaction.navigation
294
294
  })), s.ui = {
295
- ...A.ui,
295
+ ...L.ui,
296
296
  ...o.ui
297
297
  }, s.config.debug = {
298
298
  ..._t,
@@ -309,13 +309,13 @@ function Zt(o = {}) {
309
309
  return s;
310
310
  }
311
311
  function Qt(o, t) {
312
- return { ...o ? Ct[o] : Ct.playful, ...t };
312
+ return { ...o ? Rt[o] : Rt.playful, ...t };
313
313
  }
314
314
  function te(o, t) {
315
- return { ...o ? Rt[o] : Rt.gentle, ...t };
315
+ return { ...o ? Tt[o] : Tt.gentle, ...t };
316
316
  }
317
317
  function ee(o, t) {
318
- return { ...o ? Tt[o] : Tt.gentle, ...t };
318
+ return { ...o ? At[o] : At.gentle, ...t };
319
319
  }
320
320
  class ie {
321
321
  constructor(t) {
@@ -344,12 +344,12 @@ class ie {
344
344
  */
345
345
  animateTransformCancellable(t, i, e, n = null, s = null) {
346
346
  this.cancelAllAnimations(t);
347
- const r = n ?? this.config.duration, a = s ?? this.config.easing.default, c = this.buildTransformString(i), l = this.buildTransformString(e);
347
+ const r = n ?? this.config.duration, a = s ?? this.config.easing.default, c = this.buildTransformString(i), d = this.buildTransformString(e);
348
348
  t.style.transition = "none";
349
349
  const u = t.animate(
350
350
  [
351
351
  { transform: c },
352
- { transform: l }
352
+ { transform: d }
353
353
  ],
354
354
  {
355
355
  duration: r,
@@ -357,7 +357,7 @@ class ie {
357
357
  fill: "forwards"
358
358
  // Keep final state after animation
359
359
  }
360
- ), h = {
360
+ ), f = {
361
361
  id: `anim-${++this.animationIdCounter}`,
362
362
  element: t,
363
363
  animation: u,
@@ -366,11 +366,11 @@ class ie {
366
366
  startTime: performance.now(),
367
367
  duration: r
368
368
  };
369
- return this.activeAnimations.set(t, h), u.finished.then(() => {
370
- t.style.transform = l, this.activeAnimations.delete(t);
369
+ return this.activeAnimations.set(t, f), u.finished.then(() => {
370
+ t.style.transform = d, this.activeAnimations.delete(t);
371
371
  }).catch(() => {
372
372
  this.activeAnimations.delete(t);
373
- }), h;
373
+ }), f;
374
374
  }
375
375
  /**
376
376
  * Cancel an active animation
@@ -477,23 +477,23 @@ function V(o, t, i) {
477
477
  return o + (t - o) * i;
478
478
  }
479
479
  function ne(o, t, i, e) {
480
- const { overshoot: n, bounces: s, decayRatio: r } = e, a = i.x - t.x, c = i.y - t.y, l = oe(s, r);
481
- let u = 0, h = 0, d = 1, g = n, p = !1;
482
- for (let f = 0; f < l.length; f++)
483
- if (o <= l[f].time) {
484
- h = f === 0 ? 0 : l[f - 1].time, d = l[f].time, g = l[f].overshoot, p = l[f].isOvershoot;
480
+ const { overshoot: n, bounces: s, decayRatio: r } = e, a = i.x - t.x, c = i.y - t.y, d = oe(s, r);
481
+ let u = 0, f = 0, m = 1, p = n, w = !1;
482
+ for (let l = 0; l < d.length; l++)
483
+ if (o <= d[l].time) {
484
+ f = l === 0 ? 0 : d[l - 1].time, m = d[l].time, p = d[l].overshoot, w = d[l].isOvershoot;
485
485
  break;
486
486
  }
487
- const b = (o - h) / (d - h);
488
- if (p)
489
- u = 1 + g * at(b);
490
- else if (h === 0)
491
- u = at(b);
487
+ const v = (o - f) / (m - f);
488
+ if (w)
489
+ u = 1 + p * at(v);
490
+ else if (f === 0)
491
+ u = at(v);
492
492
  else {
493
- const m = 1 + (l.find(
494
- (y, E) => y.time > h && E > 0 && l[E - 1].isOvershoot
495
- )?.overshoot || g);
496
- u = V(m, 1, at(b));
493
+ const g = 1 + (d.find(
494
+ (h, b) => h.time > f && b > 0 && d[b - 1].isOvershoot
495
+ )?.overshoot || p);
496
+ u = V(g, 1, at(v));
497
497
  }
498
498
  return {
499
499
  x: t.x + a * u,
@@ -511,23 +511,23 @@ function oe(o, t) {
511
511
  return i.push({ time: 1, overshoot: 0, isOvershoot: !1 }), i;
512
512
  }
513
513
  function se(o, t, i, e) {
514
- const { stiffness: n, damping: s, mass: r, oscillations: a } = e, c = i.x - t.x, l = i.y - t.y, u = Math.sqrt(n / r), h = s / (2 * Math.sqrt(n * r));
515
- let d;
516
- if (h < 1) {
517
- const g = u * Math.sqrt(1 - h * h), p = Math.exp(-h * u * o * 3), b = Math.cos(g * o * a * Math.PI);
518
- d = 1 - p * b;
514
+ const { stiffness: n, damping: s, mass: r, oscillations: a } = e, c = i.x - t.x, d = i.y - t.y, u = Math.sqrt(n / r), f = s / (2 * Math.sqrt(n * r));
515
+ let m;
516
+ if (f < 1) {
517
+ const p = u * Math.sqrt(1 - f * f), w = Math.exp(-f * u * o * 3), v = Math.cos(p * o * a * Math.PI);
518
+ m = 1 - w * v;
519
519
  } else
520
- d = 1 - Math.exp(-u * o * 3);
521
- return d = Math.max(0, Math.min(d, 1.3)), {
522
- x: t.x + c * d,
523
- y: t.y + l * d
520
+ m = 1 - Math.exp(-u * o * 3);
521
+ return m = Math.max(0, Math.min(m, 1.3)), {
522
+ x: t.x + c * m,
523
+ y: t.y + d * m
524
524
  };
525
525
  }
526
526
  function ae(o, t, i, e) {
527
- const { amplitude: n, frequency: s, decay: r, decayRate: a, phase: c } = e, l = i.x - t.x, u = i.y - t.y, h = Math.sqrt(l * l + u * u), d = h > 0 ? -u / h : 0, g = h > 0 ? l / h : 1, p = s * Math.PI * 2 * o + c, b = r ? Math.pow(1 - o, a) : 1, f = n * Math.sin(p) * b, m = re(o);
527
+ const { amplitude: n, frequency: s, decay: r, decayRate: a, phase: c } = e, d = i.x - t.x, u = i.y - t.y, f = Math.sqrt(d * d + u * u), m = f > 0 ? -u / f : 0, p = f > 0 ? d / f : 1, w = s * Math.PI * 2 * o + c, v = r ? Math.pow(1 - o, a) : 1, l = n * Math.sin(w) * v, g = re(o);
528
528
  return {
529
- x: V(t.x, i.x, m) + f * d,
530
- y: V(t.y, i.y, m) + f * g
529
+ x: V(t.x, i.x, g) + l * m,
530
+ y: V(t.y, i.y, g) + l * p
531
531
  };
532
532
  }
533
533
  function at(o) {
@@ -544,21 +544,21 @@ function le(o, t, i) {
544
544
  const { overshoot: e, bounces: n } = i, s = [];
545
545
  s.push({ time: 0.5, scale: e });
546
546
  let r = e;
547
- const a = 0.5, l = 0.5 / (n * 2);
547
+ const a = 0.5, d = 0.5 / (n * 2);
548
548
  let u = 0.5;
549
- for (let d = 0; d < n; d++) {
550
- const g = 1 - (r - 1) * a;
551
- u += l, s.push({ time: u, scale: g }), r = 1 + (r - 1) * a * a, u += l, d < n - 1 && s.push({ time: u, scale: r });
549
+ for (let m = 0; m < n; m++) {
550
+ const p = 1 - (r - 1) * a;
551
+ u += d, s.push({ time: u, scale: p }), r = 1 + (r - 1) * a * a, u += d, m < n - 1 && s.push({ time: u, scale: r });
552
552
  }
553
553
  s.push({ time: 1, scale: 1 });
554
- let h = 1;
555
- for (let d = 0; d < s.length; d++)
556
- if (o <= s[d].time) {
557
- const g = d === 0 ? 0 : s[d - 1].time, p = d === 0 ? 1 : s[d - 1].scale, b = (o - g) / (s[d].time - g), f = at(b);
558
- h = p + (s[d].scale - p) * f;
554
+ let f = 1;
555
+ for (let m = 0; m < s.length; m++)
556
+ if (o <= s[m].time) {
557
+ const p = m === 0 ? 0 : s[m - 1].time, w = m === 0 ? 1 : s[m - 1].scale, v = (o - p) / (s[m].time - p), l = at(v);
558
+ f = w + (s[m].scale - w) * l;
559
559
  break;
560
560
  }
561
- return h * t;
561
+ return f * t;
562
562
  }
563
563
  function he(o) {
564
564
  const {
@@ -570,57 +570,63 @@ function he(o) {
570
570
  imageWidth: r,
571
571
  imageHeight: a,
572
572
  rotation: c,
573
- scale: l,
573
+ scale: d,
574
574
  onComplete: u,
575
- rotationConfig: h,
576
- startRotation: d,
577
- scaleConfig: g,
578
- startScale: p
579
- } = o, b = n.type, f = d !== void 0 && d !== c, m = h?.mode === "wobble", y = h?.wobble || { amplitude: 15, frequency: 3, decay: !0 }, E = f || m, v = p !== void 0 && p !== l, S = g?.mode === "pop", w = g?.pop || { overshoot: 1.2, bounces: 1 };
580
- if (b === "linear" && !E && !(v || S)) {
575
+ onProgress: f,
576
+ rotationConfig: m,
577
+ startRotation: p,
578
+ scaleConfig: w,
579
+ startScale: v
580
+ } = o, l = n.type, g = p !== void 0 && p !== c, h = m?.mode === "wobble", b = m?.wobble || { amplitude: 15, frequency: 3, decay: !0 }, I = g || h, y = v !== void 0 && v !== d, E = w?.mode === "pop", x = w?.pop || { overshoot: 1.2, bounces: 1 };
581
+ if (l === "linear" && !I && !(y || E)) {
581
582
  u && u();
582
583
  return;
583
584
  }
584
- const O = performance.now(), L = -r / 2, P = -a / 2;
585
- function z(H) {
586
- const N = H - O, C = Math.min(N / s, 1);
587
- let D;
588
- switch (b) {
585
+ const R = performance.now(), M = -r / 2, T = -a / 2;
586
+ function z(k) {
587
+ const D = k - R, O = Math.min(D / s, 1);
588
+ let S;
589
+ switch (l) {
589
590
  case "bounce": {
590
- const k = Qt(
591
+ const N = Qt(
591
592
  n.bouncePreset,
592
593
  n.bounce
593
594
  );
594
- D = ne(C, i, e, k);
595
+ S = ne(O, i, e, N);
595
596
  break;
596
597
  }
597
598
  case "elastic": {
598
- const k = te(
599
+ const N = te(
599
600
  n.elasticPreset,
600
601
  n.elastic
601
602
  );
602
- D = se(C, i, e, k);
603
+ S = se(O, i, e, N);
603
604
  break;
604
605
  }
605
606
  case "wave": {
606
- const k = ee(
607
+ const N = ee(
607
608
  n.wavePreset,
608
609
  n.wave
609
610
  );
610
- D = ae(C, i, e, k);
611
+ S = ae(O, i, e, N);
611
612
  break;
612
613
  }
613
614
  default:
614
- D = {
615
- x: V(i.x, e.x, C),
616
- y: V(i.y, e.y, C)
615
+ S = {
616
+ x: V(i.x, e.x, O),
617
+ y: V(i.y, e.y, O)
617
618
  };
618
619
  }
619
- const W = D.x - e.x, U = D.y - e.y;
620
- let M;
621
- m ? M = ce(C, c, y) : f ? M = V(d, c, C) : M = c;
622
- let R;
623
- S ? R = le(C, l, w) : v ? R = V(p, l, C) : R = l, t.style.transform = `translate(${L}px, ${P}px) translate(${W}px, ${U}px) rotate(${M}deg) scale(${R})`, C < 1 ? requestAnimationFrame(z) : (t.style.transform = `translate(${L}px, ${P}px) rotate(${c}deg) scale(${l})`, u && u());
620
+ const P = S.x - e.x, _ = S.y - e.y;
621
+ let A;
622
+ h ? A = ce(O, c, b) : g ? A = V(p, c, O) : A = c;
623
+ let j;
624
+ E ? j = le(O, d, x) : y ? j = V(v, d, O) : j = d, t.style.transform = `translate(${M}px, ${T}px) translate(${P}px, ${_}px) rotate(${A}deg) scale(${j})`, f && O < 1 && f(O, D, {
625
+ x: S.x,
626
+ y: S.y,
627
+ rotation: A,
628
+ scale: j
629
+ }), O < 1 ? requestAnimationFrame(z) : (t.style.transform = `translate(${M}px, ${T}px) rotate(${c}deg) scale(${d})`, u && u());
624
630
  }
625
631
  requestAnimationFrame(z);
626
632
  }
@@ -638,7 +644,7 @@ const ue = {
638
644
  };
639
645
  class fe {
640
646
  constructor(t, i) {
641
- this.config = t, this.layoutAlgorithm = i, this.resolvedStartPosition = this.resolveStartPosition(), this.pathConfig = t.path || vt, this.rotationConfig = t.rotation || Et, this.scaleConfig = t.scale || wt;
647
+ this.config = t, this.layoutAlgorithm = i, this.resolvedStartPosition = this.resolveStartPosition(), this.pathConfig = t.path || vt, this.rotationConfig = t.rotation || Et, this.scaleConfig = t.scale || xt;
642
648
  }
643
649
  /**
644
650
  * Get the effective start position, considering layout-aware defaults
@@ -682,9 +688,9 @@ class fe {
682
688
  * Calculate start position from the nearest edge (current default behavior)
683
689
  */
684
690
  calculateNearestEdge(t, i, e, n) {
685
- const s = t.x, r = t.y, a = s, c = e.width - s, l = r, u = e.height - r, h = Math.min(a, c, l, u);
686
- let d = t.x, g = t.y;
687
- return h === a ? d = -(i.width + n) : h === c ? d = e.width + n : h === l ? g = -(i.height + n) : g = e.height + n, { x: d, y: g };
691
+ const s = t.x, r = t.y, a = s, c = e.width - s, d = r, u = e.height - r, f = Math.min(a, c, d, u);
692
+ let m = t.x, p = t.y;
693
+ return f === a ? m = -(i.width + n) : f === c ? m = e.width + n : f === d ? p = -(i.height + n) : p = e.height + n, { x: m, y: p };
688
694
  }
689
695
  /**
690
696
  * Calculate start position from a specific edge
@@ -732,18 +738,18 @@ class fe {
732
738
  calculateCircularPosition(t, i, e, n, s) {
733
739
  const r = this.config.start.circular || {}, a = r.distribution || "even";
734
740
  let c;
735
- const l = r.radius || "120%";
736
- if (typeof l == "string" && l.endsWith("%")) {
737
- const b = parseFloat(l) / 100;
741
+ const d = r.radius || "120%";
742
+ if (typeof d == "string" && d.endsWith("%")) {
743
+ const v = parseFloat(d) / 100;
738
744
  c = Math.sqrt(
739
745
  e.width ** 2 + e.height ** 2
740
- ) * b / 2;
746
+ ) * v / 2;
741
747
  } else
742
- c = typeof l == "number" ? l : 500;
748
+ c = typeof d == "number" ? d : 500;
743
749
  let u;
744
750
  a === "even" ? u = n / s * 2 * Math.PI : u = Math.random() * 2 * Math.PI;
745
- const h = e.width / 2, d = e.height / 2, g = h + Math.cos(u) * c, p = d + Math.sin(u) * c;
746
- return { x: g, y: p };
751
+ const f = e.width / 2, m = e.height / 2, p = f + Math.cos(u) * c, w = m + Math.sin(u) * c;
752
+ return { x: p, y: w };
747
753
  }
748
754
  /**
749
755
  * Get animation parameters for an image
@@ -763,8 +769,8 @@ class fe {
763
769
  * Uses pixel-based centering offset for reliable cross-browser behavior
764
770
  */
765
771
  buildStartTransform(t, i, e, n, s, r, a, c) {
766
- const l = t.x - i.x, u = t.y - i.y, h = a !== void 0 ? a : e, d = c !== void 0 ? c : n, g = s !== void 0 ? -s / 2 : 0, p = r !== void 0 ? -r / 2 : 0, b = s !== void 0 ? `translate(${g}px, ${p}px)` : "translate(-50%, -50%)";
767
- return t.useScale ? `${b} translate(${l}px, ${u}px) rotate(${h}deg) scale(0)` : `${b} translate(${l}px, ${u}px) rotate(${h}deg) scale(${d})`;
772
+ const d = t.x - i.x, u = t.y - i.y, f = a !== void 0 ? a : e, m = c !== void 0 ? c : n, p = s !== void 0 ? -s / 2 : 0, w = r !== void 0 ? -r / 2 : 0, v = s !== void 0 ? `translate(${p}px, ${w}px)` : "translate(-50%, -50%)";
773
+ return t.useScale ? `${v} translate(${d}px, ${u}px) rotate(${f}deg) scale(0)` : `${v} translate(${d}px, ${u}px) rotate(${f}deg) scale(${m})`;
768
774
  }
769
775
  /**
770
776
  * Build the final CSS transform string
@@ -891,8 +897,8 @@ class fe {
891
897
  amplitude: 15,
892
898
  frequency: 3,
893
899
  decay: !0
894
- }, { amplitude: n, frequency: s, decay: r } = e, a = Math.sin(t * s * Math.PI * 2), c = r ? Math.pow(1 - t, 2) : 1, l = n * a * c;
895
- return i + l;
900
+ }, { amplitude: n, frequency: s, decay: r } = e, a = Math.sin(t * s * Math.PI * 2), c = r ? Math.pow(1 - t, 2) : 1, d = n * a * c;
901
+ return i + d;
896
902
  }
897
903
  /**
898
904
  * Get the scale configuration
@@ -952,8 +958,8 @@ class fe {
952
958
  let a = i;
953
959
  for (let c = 0; c < r.length; c++)
954
960
  if (t <= r[c].time) {
955
- const l = c === 0 ? 0 : r[c - 1].time, u = c === 0 ? i : r[c - 1].scale, h = (t - l) / (r[c].time - l), d = this.easeOutQuad(h);
956
- a = u + (r[c].scale - u) * d;
961
+ const d = c === 0 ? 0 : r[c - 1].time, u = c === 0 ? i : r[c - 1].scale, f = (t - d) / (r[c].time - d), m = this.easeOutQuad(f);
962
+ a = u + (r[c].scale - u) * m;
957
963
  break;
958
964
  }
959
965
  return a * i;
@@ -967,9 +973,9 @@ class fe {
967
973
  let n = i;
968
974
  const s = 0.5, a = 0.5 / (t * 2);
969
975
  let c = 0.5;
970
- for (let l = 0; l < t; l++) {
976
+ for (let d = 0; d < t; d++) {
971
977
  const u = 1 - (n - 1) * s;
972
- c += a, e.push({ time: c, scale: u }), n = 1 + (n - 1) * s * s, c += a, l < t - 1 && e.push({ time: c, scale: n });
978
+ c += a, e.push({ time: c, scale: u }), n = 1 + (n - 1) * s * s, c += a, d < t - 1 && e.push({ time: c, scale: n });
973
979
  }
974
980
  return e.push({ time: 1, scale: 1 }), e;
975
981
  }
@@ -1085,7 +1091,7 @@ class ge {
1085
1091
  });
1086
1092
  }
1087
1093
  _startPulse(t) {
1088
- const i = { ...Xt, ...this.config.pulse }, e = [
1094
+ const i = { ...Yt, ...this.config.pulse }, e = [
1089
1095
  { transform: "scale(1)", offset: 0 },
1090
1096
  { transform: `scale(${i.maxScale})`, offset: 0.25 },
1091
1097
  { transform: "scale(1)", offset: 0.5 },
@@ -1105,7 +1111,7 @@ class ge {
1105
1111
  });
1106
1112
  }
1107
1113
  _startBlink(t) {
1108
- const i = { ...Yt, ...this.config.blink }, e = -(Math.random() * i.speed), n = parseFloat(getComputedStyle(t.element).opacity) || 1;
1114
+ const i = { ...Xt, ...this.config.blink }, e = -(Math.random() * i.speed), n = parseFloat(getComputedStyle(t.element).opacity) || 1;
1109
1115
  let s, r;
1110
1116
  i.style === "fade" ? (s = [
1111
1117
  { opacity: n, offset: 0 },
@@ -1178,17 +1184,17 @@ class me {
1178
1184
  * @returns Array of layout objects with position, rotation, scale
1179
1185
  */
1180
1186
  generate(t, i, e = {}) {
1181
- const n = [], { width: s, height: r } = i, a = this.config.spacing.padding, c = e.fixedHeight ?? 200, l = this.imageConfig.rotation?.mode ?? "none", u = this.imageConfig.rotation?.range?.min ?? -15, h = this.imageConfig.rotation?.range?.max ?? 15, d = this.imageConfig.sizing?.variance?.min ?? 1, g = this.imageConfig.sizing?.variance?.max ?? 1, p = d !== 1 || g !== 1, f = c * 1.5 / 2, m = c / 2, y = s - a - f, E = r - a - m, v = a + f, S = a + m;
1182
- for (let w = 0; w < t; w++) {
1183
- const I = this.random(v, y), O = this.random(S, E), L = l === "random" ? this.random(u, h) : 0, P = p ? this.random(d, g) : 1, z = c * P, H = {
1184
- id: w,
1185
- x: I,
1186
- y: O,
1187
- rotation: L,
1188
- scale: P,
1189
- baseSize: z
1187
+ const n = [], { width: s, height: r } = i, a = this.config.spacing.padding, c = e.fixedHeight ?? 200, d = this.imageConfig.rotation?.mode ?? "none", u = this.imageConfig.rotation?.range?.min ?? -15, f = this.imageConfig.rotation?.range?.max ?? 15, m = this.imageConfig.sizing?.variance?.min ?? 1, p = this.imageConfig.sizing?.variance?.max ?? 1, w = m !== 1 || p !== 1, l = c * 1.5 / 2, g = c / 2, h = s - a - l, b = r - a - g, I = a + l, y = a + g;
1188
+ for (let E = 0; E < t; E++) {
1189
+ const x = this.random(I, h), F = this.random(y, b), R = d === "random" ? this.random(u, f) : 0, M = w ? this.random(m, p) : 1, T = c * M, z = {
1190
+ id: E,
1191
+ x,
1192
+ y: F,
1193
+ rotation: R,
1194
+ scale: M,
1195
+ baseSize: T
1190
1196
  };
1191
- n.push(H);
1197
+ n.push(z);
1192
1198
  }
1193
1199
  return n;
1194
1200
  }
@@ -1214,53 +1220,53 @@ class pe {
1214
1220
  * @returns Array of layout objects with position, rotation, scale
1215
1221
  */
1216
1222
  generate(t, i, e = {}) {
1217
- const n = [], { width: s, height: r } = i, a = e.fixedHeight ?? 200, c = this.imageConfig.rotation?.mode ?? "none", l = this.imageConfig.rotation?.range?.min ?? -15, u = this.imageConfig.rotation?.range?.max ?? 15, h = this.imageConfig.sizing?.variance?.min ?? 1, d = this.imageConfig.sizing?.variance?.max ?? 1, g = h !== 1 || d !== 1, p = this.config.scaleDecay ?? 0, b = {
1218
- ...Nt,
1223
+ const n = [], { width: s, height: r } = i, a = e.fixedHeight ?? 200, c = this.imageConfig.rotation?.mode ?? "none", d = this.imageConfig.rotation?.range?.min ?? -15, u = this.imageConfig.rotation?.range?.max ?? 15, f = this.imageConfig.sizing?.variance?.min ?? 1, m = this.imageConfig.sizing?.variance?.max ?? 1, p = f !== 1 || m !== 1, w = this.config.scaleDecay ?? 0, v = {
1224
+ ...Ht,
1219
1225
  ...this.config.radial
1220
- }, f = e.fixedHeight ?? a, m = s / 2, y = r / 2, E = Math.ceil(Math.sqrt(t)), v = this.config.spacing.padding ?? 50, S = Math.max(f * 0.8, Math.min(
1221
- m - v - f / 2,
1222
- y - v - f / 2
1226
+ }, l = e.fixedHeight ?? a, g = s / 2, h = r / 2, b = Math.ceil(Math.sqrt(t)), I = this.config.spacing.padding ?? 50, y = Math.max(l * 0.8, Math.min(
1227
+ g - I - l / 2,
1228
+ h - I - l / 2
1223
1229
  ));
1224
1230
  if (t > 0) {
1225
- const O = g ? this.random(h, d) : 1, L = f * O;
1231
+ const F = p ? this.random(f, m) : 1, R = l * F;
1226
1232
  n.push({
1227
1233
  id: 0,
1228
- x: m,
1229
- y,
1230
- rotation: c === "random" ? this.random(l * 0.33, u * 0.33) : 0,
1234
+ x: g,
1235
+ y: h,
1236
+ rotation: c === "random" ? this.random(d * 0.33, u * 0.33) : 0,
1231
1237
  // Less rotation for center
1232
- scale: O,
1233
- baseSize: L,
1238
+ scale: F,
1239
+ baseSize: R,
1234
1240
  zIndex: 100
1235
1241
  // Center image is highest
1236
1242
  });
1237
1243
  }
1238
- let w = 1, I = 1;
1239
- for (; w < t; ) {
1240
- const O = I / E, L = p > 0 ? 1 - O * p * 0.5 : 1, P = Math.max(f * 0.8, S / E * 1.5 / b.tightness), z = I * P, H = z * 1.5, N = Math.PI * (3 * (H + z) - Math.sqrt((3 * H + z) * (H + 3 * z))), C = this.estimateWidth(f), D = Math.floor(N / (C * 0.7));
1241
- if (D === 0) {
1242
- I++;
1244
+ let E = 1, x = 1;
1245
+ for (; E < t; ) {
1246
+ const F = x / b, R = w > 0 ? 1 - F * w * 0.5 : 1, M = Math.max(l * 0.8, y / b * 1.5 / v.tightness), T = x * M, z = T * 1.5, k = Math.PI * (3 * (z + T) - Math.sqrt((3 * z + T) * (z + 3 * T))), D = this.estimateWidth(l), O = Math.floor(k / (D * 0.7));
1247
+ if (O === 0) {
1248
+ x++;
1243
1249
  continue;
1244
1250
  }
1245
- const W = 2 * Math.PI / D, U = I * (20 * Math.PI / 180);
1246
- for (let M = 0; M < D && w < t; M++) {
1247
- const R = M * W + U, k = g ? this.random(h, d) : 1, q = L * k, T = f * q;
1248
- let _ = m + Math.cos(R) * H, F = y + Math.sin(R) * z;
1249
- const $ = T * 1.5 / 2, B = T / 2;
1250
- _ - $ < v ? _ = v + $ : _ + $ > s - v && (_ = s - v - $), F - B < v ? F = v + B : F + B > r - v && (F = r - v - B);
1251
- const Y = c === "random" ? this.random(l, u) : 0;
1251
+ const S = 2 * Math.PI / O, P = x * (20 * Math.PI / 180);
1252
+ for (let _ = 0; _ < O && E < t; _++) {
1253
+ const A = _ * S + P, j = p ? this.random(f, m) : 1, N = R * j, $ = l * N;
1254
+ let H = g + Math.cos(A) * z, U = h + Math.sin(A) * T;
1255
+ const B = $ * 1.5 / 2, W = $ / 2;
1256
+ H - B < I ? H = I + B : H + B > s - I && (H = s - I - B), U - W < I ? U = I + W : U + W > r - I && (U = r - I - W);
1257
+ const X = c === "random" ? this.random(d, u) : 0;
1252
1258
  n.push({
1253
- id: w,
1254
- x: _,
1255
- y: F,
1256
- rotation: Y,
1257
- scale: q,
1258
- baseSize: T,
1259
- zIndex: Math.max(1, 100 - I)
1259
+ id: E,
1260
+ x: H,
1261
+ y: U,
1262
+ rotation: X,
1263
+ scale: N,
1264
+ baseSize: $,
1265
+ zIndex: Math.max(1, 100 - x)
1260
1266
  // Outer rings have lower z-index
1261
- }), w++;
1267
+ }), E++;
1262
1268
  }
1263
- I++;
1269
+ x++;
1264
1270
  }
1265
1271
  return n;
1266
1272
  }
@@ -1323,60 +1329,60 @@ class ye {
1323
1329
  * @returns Array of layout objects with position, rotation, scale
1324
1330
  */
1325
1331
  generate(t, i, e = {}) {
1326
- const n = [], { width: s, height: r } = i, a = { ...be, ...this.config.grid }, c = this.config.spacing.padding, l = e.fixedHeight ?? 200, u = this.imageConfig.rotation?.mode ?? "none", h = this.imageConfig.sizing?.variance?.min ?? 1, d = this.imageConfig.sizing?.variance?.max ?? 1, g = h !== 1 || d !== 1, p = s - 2 * c, b = r - 2 * c, { columns: f, rows: m } = this.calculateGridDimensions(
1332
+ const n = [], { width: s, height: r } = i, a = { ...be, ...this.config.grid }, c = this.config.spacing.padding, d = e.fixedHeight ?? 200, u = this.imageConfig.rotation?.mode ?? "none", f = this.imageConfig.sizing?.variance?.min ?? 1, m = this.imageConfig.sizing?.variance?.max ?? 1, p = f !== 1 || m !== 1, w = s - 2 * c, v = r - 2 * c, { columns: l, rows: g } = this.calculateGridDimensions(
1327
1333
  t,
1328
- p,
1329
- b,
1330
- l,
1334
+ w,
1335
+ v,
1336
+ d,
1331
1337
  a
1332
- ), y = a.stagger === "row", E = a.stagger === "column", v = y ? f + 0.5 : f, S = E ? m + 0.5 : m, w = (p - a.gap * (f - 1)) / v, I = (b - a.gap * (m - 1)) / S, O = y ? w / 2 : 0, L = E ? I / 2 : 0, P = 1 + a.overlap, z = Math.min(w, I) * P, H = e.fixedHeight ? Math.min(e.fixedHeight, z) : z, N = f * w + (f - 1) * a.gap + O, C = m * I + (m - 1) * a.gap + L, D = c + (p - N) / 2, W = c + (b - C) / 2, U = f * m, M = a.columns !== "auto" && a.rows !== "auto", R = M && t > U;
1338
+ ), h = a.stagger === "row", b = a.stagger === "column", I = h ? l + 0.5 : l, y = b ? g + 0.5 : g, E = (w - a.gap * (l - 1)) / I, x = (v - a.gap * (g - 1)) / y, F = h ? E / 2 : 0, R = b ? x / 2 : 0, M = 1 + a.overlap, T = Math.min(E, x) * M, z = e.fixedHeight ? Math.min(e.fixedHeight, T) : T, k = l * E + (l - 1) * a.gap + F, D = g * x + (g - 1) * a.gap + R, O = c + (w - k) / 2, S = c + (v - D) / 2, P = l * g, _ = a.columns !== "auto" && a.rows !== "auto", A = _ && t > P;
1333
1339
  typeof window < "u" && (window.__gridOverflowDebug = {
1334
1340
  gridConfigColumns: a.columns,
1335
1341
  gridConfigRows: a.rows,
1336
- columns: f,
1337
- rows: m,
1338
- cellCount: U,
1339
- hasFixedGrid: M,
1342
+ columns: l,
1343
+ rows: g,
1344
+ cellCount: P,
1345
+ hasFixedGrid: _,
1340
1346
  imageCount: t,
1341
- isOverflowMode: R
1347
+ isOverflowMode: A
1342
1348
  });
1343
- const k = R ? new Array(U).fill(0) : [], q = Math.min(w, I) * a.overflowOffset;
1344
- for (let T = 0; T < t; T++) {
1345
- let _, F, X = 0;
1346
- if (R && T >= U) {
1347
- const G = T - U, j = G % U;
1348
- X = Math.floor(G / U) + 1, k[j]++, a.fillDirection === "row" ? (_ = j % f, F = Math.floor(j / f)) : (F = j % m, _ = Math.floor(j / m));
1349
+ const j = A ? new Array(P).fill(0) : [], N = Math.min(E, x) * a.overflowOffset;
1350
+ for (let $ = 0; $ < t; $++) {
1351
+ let H, U, Y = 0;
1352
+ if (A && $ >= P) {
1353
+ const q = $ - P, G = q % P;
1354
+ Y = Math.floor(q / P) + 1, j[G]++, a.fillDirection === "row" ? (H = G % l, U = Math.floor(G / l)) : (U = G % g, H = Math.floor(G / g));
1349
1355
  } else
1350
- a.fillDirection === "row" ? (_ = T % f, F = Math.floor(T / f)) : (F = T % m, _ = Math.floor(T / m));
1351
- let $ = D + _ * (w + a.gap) + w / 2, B = W + F * (I + a.gap) + I / 2;
1352
- if (a.stagger === "row" && F % 2 === 1 ? $ += w / 2 : a.stagger === "column" && _ % 2 === 1 && (B += I / 2), X > 0) {
1353
- const G = (X - 1) % Lt.length, j = Lt[G];
1354
- $ += j.x * q, B += j.y * q;
1356
+ a.fillDirection === "row" ? (H = $ % l, U = Math.floor($ / l)) : (U = $ % g, H = Math.floor($ / g));
1357
+ let B = O + H * (E + a.gap) + E / 2, W = S + U * (x + a.gap) + x / 2;
1358
+ if (a.stagger === "row" && U % 2 === 1 ? B += E / 2 : a.stagger === "column" && H % 2 === 1 && (W += x / 2), Y > 0) {
1359
+ const q = (Y - 1) % Lt.length, G = Lt[q];
1360
+ B += G.x * N, W += G.y * N;
1355
1361
  }
1356
1362
  if (a.jitter > 0) {
1357
- const G = w / 2 * a.jitter, j = I / 2 * a.jitter;
1358
- $ += this.random(-G, G), B += this.random(-j, j);
1363
+ const q = E / 2 * a.jitter, G = x / 2 * a.jitter;
1364
+ B += this.random(-q, q), W += this.random(-G, G);
1359
1365
  }
1360
- let Y = $, J = B;
1361
- if (!R && a.fillDirection === "row") {
1362
- const G = t % f || f;
1363
- if (F === Math.floor((t - 1) / f) && G < f) {
1364
- const At = G * w + (G - 1) * a.gap;
1366
+ let X = B, J = W;
1367
+ if (!A && a.fillDirection === "row") {
1368
+ const q = t % l || l;
1369
+ if (U === Math.floor((t - 1) / l) && q < l) {
1370
+ const Ct = q * E + (q - 1) * a.gap;
1365
1371
  let gt = 0;
1366
- a.alignment === "center" ? gt = (N - At) / 2 : a.alignment === "end" && (gt = N - At), Y += gt;
1372
+ a.alignment === "center" ? gt = (k - Ct) / 2 : a.alignment === "end" && (gt = k - Ct), X += gt;
1367
1373
  }
1368
1374
  }
1369
- const ct = g ? this.random(h, d) : 1, K = H * ct, nt = K * 1.5 / 2, ot = K / 2, ht = c + nt, dt = s - c - nt, Ut = c + ot, Ht = r - c - ot;
1370
- Y = Math.max(ht, Math.min(Y, dt)), J = Math.max(Ut, Math.min(J, Ht));
1375
+ const ct = p ? this.random(f, m) : 1, K = z * ct, nt = K * 1.5 / 2, ot = K / 2, ht = c + nt, dt = s - c - nt, Ut = c + ot, kt = r - c - ot;
1376
+ X = Math.max(ht, Math.min(X, dt)), J = Math.max(Ut, Math.min(J, kt));
1371
1377
  let ut = 0;
1372
1378
  if (u === "random") {
1373
- const G = this.imageConfig.rotation?.range?.min ?? -15, j = this.imageConfig.rotation?.range?.max ?? 15;
1374
- a.jitter > 0 ? ut = this.random(G * a.jitter, j * a.jitter) : ut = this.random(G, j);
1379
+ const q = this.imageConfig.rotation?.range?.min ?? -15, G = this.imageConfig.rotation?.range?.max ?? 15;
1380
+ a.jitter > 0 ? ut = this.random(q * a.jitter, G * a.jitter) : ut = this.random(q, G);
1375
1381
  }
1376
1382
  let ft;
1377
- R && X > 0 ? ft = 50 - X : ft = R ? 100 + T : T + 1, n.push({
1378
- id: T,
1379
- x: Y,
1383
+ A && Y > 0 ? ft = 50 - Y : ft = A ? 100 + $ : $ + 1, n.push({
1384
+ id: $,
1385
+ x: X,
1380
1386
  y: J,
1381
1387
  rotation: ut,
1382
1388
  scale: ct,
@@ -1418,7 +1424,7 @@ const ve = Math.PI * (3 - Math.sqrt(5)), Ee = {
1418
1424
  scaleDecay: 0,
1419
1425
  startAngle: 0
1420
1426
  };
1421
- class we {
1427
+ class xe {
1422
1428
  constructor(t, i = {}) {
1423
1429
  this.config = t, this.imageConfig = i;
1424
1430
  }
@@ -1430,36 +1436,36 @@ class we {
1430
1436
  * @returns Array of layout objects with position, rotation, scale
1431
1437
  */
1432
1438
  generate(t, i, e = {}) {
1433
- const n = [], { width: s, height: r } = i, a = { ...Ee, ...this.config.spiral }, c = this.config.spacing.padding, l = e.fixedHeight ?? 200, u = this.imageConfig.rotation?.mode ?? "none", h = this.imageConfig.rotation?.range?.min ?? -15, d = 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 ?? a.scaleDecay, m = s / 2, y = r / 2, E = Math.min(
1434
- m - c - l / 2,
1435
- y - c - l / 2
1436
- ), v = a.direction === "clockwise" ? -1 : 1;
1437
- for (let S = 0; S < t; S++) {
1438
- let w, I;
1439
+ const n = [], { width: s, height: r } = i, a = { ...Ee, ...this.config.spiral }, c = this.config.spacing.padding, d = e.fixedHeight ?? 200, u = this.imageConfig.rotation?.mode ?? "none", f = this.imageConfig.rotation?.range?.min ?? -15, m = this.imageConfig.rotation?.range?.max ?? 15, p = this.imageConfig.sizing?.variance?.min ?? 1, w = this.imageConfig.sizing?.variance?.max ?? 1, v = p !== 1 || w !== 1, l = this.config.scaleDecay ?? a.scaleDecay, g = s / 2, h = r / 2, b = Math.min(
1440
+ g - c - d / 2,
1441
+ h - c - d / 2
1442
+ ), I = a.direction === "clockwise" ? -1 : 1;
1443
+ for (let y = 0; y < t; y++) {
1444
+ let E, x;
1439
1445
  if (a.spiralType === "golden")
1440
- w = S * ve * v + a.startAngle, I = this.calculateGoldenRadius(S, t, E, a.tightness);
1446
+ E = y * ve * I + a.startAngle, x = this.calculateGoldenRadius(y, t, b, a.tightness);
1441
1447
  else if (a.spiralType === "archimedean") {
1442
- const $ = S * 0.5 * a.tightness;
1443
- w = $ * v + a.startAngle, I = this.calculateArchimedeanRadius($, t, E, a.tightness);
1448
+ const B = y * 0.5 * a.tightness;
1449
+ E = B * I + a.startAngle, x = this.calculateArchimedeanRadius(B, t, b, a.tightness);
1444
1450
  } else {
1445
- const $ = S * 0.3 * a.tightness;
1446
- w = $ * v + a.startAngle, I = this.calculateLogarithmicRadius($, t, E, a.tightness);
1451
+ const B = y * 0.3 * a.tightness;
1452
+ E = B * I + a.startAngle, x = this.calculateLogarithmicRadius(B, t, b, a.tightness);
1447
1453
  }
1448
- const O = m + Math.cos(w) * I, L = y + Math.sin(w) * I, P = I / E, z = f > 0 ? 1 - P * f * 0.5 : 1, H = b ? this.random(g, p) : 1, N = z * H, C = l * N, W = C * 1.5 / 2, U = C / 2, M = c + W, R = s - c - W, k = c + U, q = r - c - U, T = Math.max(M, Math.min(O, R)), _ = Math.max(k, Math.min(L, q));
1449
- let F = 0;
1454
+ const F = g + Math.cos(E) * x, R = h + Math.sin(E) * x, M = x / b, T = l > 0 ? 1 - M * l * 0.5 : 1, z = v ? this.random(p, w) : 1, k = T * z, D = d * k, S = D * 1.5 / 2, P = D / 2, _ = c + S, A = s - c - S, j = c + P, N = r - c - P, $ = Math.max(_, Math.min(F, A)), H = Math.max(j, Math.min(R, N));
1455
+ let U = 0;
1450
1456
  if (u === "random") {
1451
- const $ = w * 180 / Math.PI % 360, B = this.random(h, d);
1452
- F = a.spiralType === "golden" ? B : $ * 0.1 + B * 0.9;
1453
- } else u === "tangent" && (F = this.calculateSpiralTangent(w, I, a));
1454
- const X = t - S;
1457
+ const B = E * 180 / Math.PI % 360, W = this.random(f, m);
1458
+ U = a.spiralType === "golden" ? W : B * 0.1 + W * 0.9;
1459
+ } else u === "tangent" && (U = this.calculateSpiralTangent(E, x, a));
1460
+ const Y = t - y;
1455
1461
  n.push({
1456
- id: S,
1457
- x: T,
1458
- y: _,
1459
- rotation: F,
1460
- scale: N,
1461
- baseSize: C,
1462
- zIndex: X
1462
+ id: y,
1463
+ x: $,
1464
+ y: H,
1465
+ rotation: U,
1466
+ scale: k,
1467
+ baseSize: D,
1468
+ zIndex: Y
1463
1469
  });
1464
1470
  }
1465
1471
  return n;
@@ -1502,8 +1508,8 @@ class we {
1502
1508
  * r = a * e^(b*θ)
1503
1509
  */
1504
1510
  calculateLogarithmicRadius(t, i, e, n) {
1505
- const s = e * 0.05, r = 0.15 / n, a = s * Math.exp(r * t), c = i * 0.3 * n, l = s * Math.exp(r * c);
1506
- return a / l * e;
1511
+ const s = e * 0.05, r = 0.15 / n, a = s * Math.exp(r * t), c = i * 0.3 * n, d = s * Math.exp(r * c);
1512
+ return a / d * e;
1507
1513
  }
1508
1514
  /**
1509
1515
  * Utility: Generate random number between min and max
@@ -1512,7 +1518,7 @@ class we {
1512
1518
  return Math.random() * (i - t) + t;
1513
1519
  }
1514
1520
  }
1515
- const xe = {
1521
+ const we = {
1516
1522
  clusterCount: "auto",
1517
1523
  clusterSpread: 150,
1518
1524
  clusterSpacing: 200,
@@ -1520,7 +1526,7 @@ const xe = {
1520
1526
  overlap: 0.3,
1521
1527
  distribution: "gaussian"
1522
1528
  };
1523
- class Se {
1529
+ class Ie {
1524
1530
  constructor(t, i = {}) {
1525
1531
  this.config = t, this.imageConfig = i;
1526
1532
  }
@@ -1532,48 +1538,48 @@ class Se {
1532
1538
  * @returns Array of layout objects with position, rotation, scale
1533
1539
  */
1534
1540
  generate(t, i, e = {}) {
1535
- const n = [], { width: s, height: r } = i, a = { ...xe, ...this.config.cluster }, c = this.config.spacing.padding, l = e.fixedHeight ?? 200, u = this.imageConfig.rotation?.mode ?? "none", h = this.imageConfig.rotation?.range?.min ?? -15, d = 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(
1541
+ const n = [], { width: s, height: r } = i, a = { ...we, ...this.config.cluster }, c = this.config.spacing.padding, d = e.fixedHeight ?? 200, u = this.imageConfig.rotation?.mode ?? "none", f = this.imageConfig.rotation?.range?.min ?? -15, m = this.imageConfig.rotation?.range?.max ?? 15, p = this.imageConfig.sizing?.variance?.min ?? 1, w = this.imageConfig.sizing?.variance?.max ?? 1, v = p !== 1 || w !== 1, l = this.calculateClusterCount(
1536
1542
  t,
1537
1543
  a.clusterCount,
1538
1544
  s,
1539
1545
  r,
1540
1546
  a.clusterSpacing
1541
- ), m = this.generateClusterCenters(
1542
- f,
1547
+ ), g = this.generateClusterCenters(
1548
+ l,
1543
1549
  s,
1544
1550
  r,
1545
1551
  c,
1546
1552
  a
1547
- ), y = new Array(f).fill(0);
1548
- for (let v = 0; v < t; v++)
1549
- y[v % f]++;
1550
- let E = 0;
1551
- for (let v = 0; v < f; v++) {
1552
- const S = m[v], w = y[v];
1553
- for (let I = 0; I < w; I++) {
1554
- let O, L;
1553
+ ), h = new Array(l).fill(0);
1554
+ for (let I = 0; I < t; I++)
1555
+ h[I % l]++;
1556
+ let b = 0;
1557
+ for (let I = 0; I < l; I++) {
1558
+ const y = g[I], E = h[I];
1559
+ for (let x = 0; x < E; x++) {
1560
+ let F, R;
1555
1561
  if (a.distribution === "gaussian")
1556
- O = this.gaussianRandom() * S.spread, L = this.gaussianRandom() * S.spread;
1562
+ F = this.gaussianRandom() * y.spread, R = this.gaussianRandom() * y.spread;
1557
1563
  else {
1558
- const F = this.random(0, Math.PI * 2), X = this.random(0, S.spread);
1559
- O = Math.cos(F) * X, L = Math.sin(F) * X;
1564
+ const U = this.random(0, Math.PI * 2), Y = this.random(0, y.spread);
1565
+ F = Math.cos(U) * Y, R = Math.sin(U) * Y;
1560
1566
  }
1561
- const P = 1 + a.overlap * 0.5, z = 1 + a.overlap * 0.3;
1562
- O /= P, L /= P;
1563
- const H = b ? this.random(g, p) : 1, N = z * H, C = l * N;
1564
- let D = S.x + O, W = S.y + L;
1565
- const M = C * 1.5 / 2, R = C / 2;
1566
- D = Math.max(c + M, Math.min(D, s - c - M)), W = Math.max(c + R, Math.min(W, r - c - R));
1567
- const k = u === "random" ? this.random(h, d) : 0, T = Math.sqrt(O * O + L * L) / S.spread, _ = Math.round((1 - T) * 50) + 1;
1567
+ const M = 1 + a.overlap * 0.5, T = 1 + a.overlap * 0.3;
1568
+ F /= M, R /= M;
1569
+ const z = v ? this.random(p, w) : 1, k = T * z, D = d * k;
1570
+ let O = y.x + F, S = y.y + R;
1571
+ const _ = D * 1.5 / 2, A = D / 2;
1572
+ O = Math.max(c + _, Math.min(O, s - c - _)), S = Math.max(c + A, Math.min(S, r - c - A));
1573
+ const j = u === "random" ? this.random(f, m) : 0, $ = Math.sqrt(F * F + R * R) / y.spread, H = Math.round((1 - $) * 50) + 1;
1568
1574
  n.push({
1569
- id: E,
1570
- x: D,
1571
- y: W,
1572
- rotation: k,
1573
- scale: N,
1574
- baseSize: C,
1575
- zIndex: _
1576
- }), E++;
1575
+ id: b,
1576
+ x: O,
1577
+ y: S,
1578
+ rotation: j,
1579
+ scale: k,
1580
+ baseSize: D,
1581
+ zIndex: H
1582
+ }), b++;
1577
1583
  }
1578
1584
  }
1579
1585
  return n;
@@ -1593,24 +1599,24 @@ class Se {
1593
1599
  * Generate cluster center positions with spacing constraints
1594
1600
  */
1595
1601
  generateClusterCenters(t, i, e, n, s) {
1596
- const r = [], c = n + s.clusterSpread, l = i - n - s.clusterSpread, u = n + s.clusterSpread, h = e - n - s.clusterSpread;
1597
- for (let d = 0; d < t; d++) {
1598
- let g = null, p = -1;
1599
- for (let b = 0; b < 100; b++) {
1600
- const f = {
1601
- x: this.random(c, l),
1602
- y: this.random(u, h),
1602
+ const r = [], c = n + s.clusterSpread, d = i - n - s.clusterSpread, u = n + s.clusterSpread, f = e - n - s.clusterSpread;
1603
+ for (let m = 0; m < t; m++) {
1604
+ let p = null, w = -1;
1605
+ for (let v = 0; v < 100; v++) {
1606
+ const l = {
1607
+ x: this.random(c, d),
1608
+ y: this.random(u, f),
1603
1609
  spread: this.calculateClusterSpread(s)
1604
1610
  };
1605
- let m = 1 / 0;
1606
- for (const y of r) {
1607
- const E = f.x - y.x, v = f.y - y.y, S = Math.sqrt(E * E + v * v);
1608
- m = Math.min(m, S);
1611
+ let g = 1 / 0;
1612
+ for (const h of r) {
1613
+ const b = l.x - h.x, I = l.y - h.y, y = Math.sqrt(b * b + I * I);
1614
+ g = Math.min(g, y);
1609
1615
  }
1610
- if ((r.length === 0 || m > p) && (g = f, p = m), m >= s.clusterSpacing)
1616
+ if ((r.length === 0 || g > w) && (p = l, w = g), g >= s.clusterSpacing)
1611
1617
  break;
1612
1618
  }
1613
- g && r.push(g);
1619
+ p && r.push(p);
1614
1620
  }
1615
1621
  return r;
1616
1622
  }
@@ -1638,7 +1644,7 @@ class Se {
1638
1644
  return Math.random() * (i - t) + t;
1639
1645
  }
1640
1646
  }
1641
- class Ie {
1647
+ class Se {
1642
1648
  constructor(t, i = {}) {
1643
1649
  this.config = t, this.imageConfig = i;
1644
1650
  }
@@ -1650,29 +1656,29 @@ class Ie {
1650
1656
  * @returns Array of layout objects with position, rotation, scale
1651
1657
  */
1652
1658
  generate(t, i, e = {}) {
1653
- const n = [], { width: s, height: r } = i, a = e.fixedHeight ?? 200, c = this.config.spacing.padding ?? 50, l = this.imageConfig.rotation?.mode ?? "none", u = this.imageConfig.rotation?.range?.min ?? -15, h = this.imageConfig.rotation?.range?.max ?? 15, d = this.imageConfig.sizing?.variance?.min ?? 1, g = this.imageConfig.sizing?.variance?.max ?? 1, p = d !== 1 || g !== 1, b = e.fixedHeight ?? a, f = {
1654
- ...kt,
1659
+ const n = [], { width: s, height: r } = i, a = e.fixedHeight ?? 200, c = this.config.spacing.padding ?? 50, d = this.imageConfig.rotation?.mode ?? "none", u = this.imageConfig.rotation?.range?.min ?? -15, f = this.imageConfig.rotation?.range?.max ?? 15, m = this.imageConfig.sizing?.variance?.min ?? 1, p = this.imageConfig.sizing?.variance?.max ?? 1, w = m !== 1 || p !== 1, v = e.fixedHeight ?? a, l = {
1660
+ ...Nt,
1655
1661
  ...this.config.wave
1656
- }, { rows: m, amplitude: y, frequency: E, phaseShift: v, synchronization: S } = f, w = Math.ceil(t / m), L = b * 1.5 / 2, P = c + L, z = s - c - L, H = z - P, N = w > 1 ? H / (w - 1) : 0, C = c + y + b / 2, D = r - c - y - b / 2, W = D - C, U = m > 1 ? W / (m - 1) : 0;
1657
- let M = 0;
1658
- for (let R = 0; R < m && M < t; R++) {
1659
- const k = m === 1 ? (C + D) / 2 : C + R * U;
1660
- let q = 0;
1661
- S === "offset" ? q = R * v : S === "alternating" && (q = R * Math.PI);
1662
- for (let T = 0; T < w && M < t; T++) {
1663
- const _ = w === 1 ? (P + z) / 2 : P + T * N, F = this.calculateWaveY(_, s, y, E, q), X = _, $ = k + F, B = p ? this.random(d, g) : 1, Y = b * B;
1662
+ }, { rows: g, amplitude: h, frequency: b, phaseShift: I, synchronization: y } = l, E = Math.ceil(t / g), R = v * 1.5 / 2, M = c + R, T = s - c - R, z = T - M, k = E > 1 ? z / (E - 1) : 0, D = c + h + v / 2, O = r - c - h - v / 2, S = O - D, P = g > 1 ? S / (g - 1) : 0;
1663
+ let _ = 0;
1664
+ for (let A = 0; A < g && _ < t; A++) {
1665
+ const j = g === 1 ? (D + O) / 2 : D + A * P;
1666
+ let N = 0;
1667
+ y === "offset" ? N = A * I : y === "alternating" && (N = A * Math.PI);
1668
+ for (let $ = 0; $ < E && _ < t; $++) {
1669
+ const H = E === 1 ? (M + T) / 2 : M + $ * k, U = this.calculateWaveY(H, s, h, b, N), Y = H, B = j + U, W = w ? this.random(m, p) : 1, X = v * W;
1664
1670
  let J = 0;
1665
- l === "tangent" ? J = this.calculateRotation(_, s, y, E, q) : l === "random" && (J = this.random(u, h));
1666
- const K = Y * 1.5 / 2, lt = Y / 2, nt = c + K, ot = s - c - K, ht = c + lt, dt = r - c - lt;
1671
+ d === "tangent" ? J = this.calculateRotation(H, s, h, b, N) : d === "random" && (J = this.random(u, f));
1672
+ const K = X * 1.5 / 2, lt = X / 2, nt = c + K, ot = s - c - K, ht = c + lt, dt = r - c - lt;
1667
1673
  n.push({
1668
- id: M,
1669
- x: Math.max(nt, Math.min(X, ot)),
1670
- y: Math.max(ht, Math.min($, dt)),
1674
+ id: _,
1675
+ x: Math.max(nt, Math.min(Y, ot)),
1676
+ y: Math.max(ht, Math.min(B, dt)),
1671
1677
  rotation: J,
1672
- scale: B,
1673
- baseSize: Y,
1674
- zIndex: M + 1
1675
- }), M++;
1678
+ scale: W,
1679
+ baseSize: X,
1680
+ zIndex: _ + 1
1681
+ }), _++;
1676
1682
  }
1677
1683
  }
1678
1684
  return n;
@@ -1715,7 +1721,7 @@ class Ie {
1715
1721
  return Math.random() * (i - t) + t;
1716
1722
  }
1717
1723
  }
1718
- const xt = 100, Q = 100 / Math.sqrt(3), St = [
1724
+ const wt = 100, Q = 100 / Math.sqrt(3), It = [
1719
1725
  [Q / 2, 0],
1720
1726
  // upper-left
1721
1727
  [3 * Q / 2, 0],
@@ -1728,15 +1734,15 @@ const xt = 100, Q = 100 / Math.sqrt(3), St = [
1728
1734
  // lower-left
1729
1735
  [0, 50]
1730
1736
  // left
1731
- ], Ae = St[1][0] / xt, Ce = St[2][1] / xt;
1732
- function Re(o) {
1737
+ ], Ce = It[1][0] / wt, Re = It[2][1] / wt;
1738
+ function Te(o) {
1733
1739
  return {
1734
- colStep: Ae * o,
1735
- rowOffset: Ce * o
1740
+ colStep: Ce * o,
1741
+ rowOffset: Re * o
1736
1742
  };
1737
1743
  }
1738
- function Te(o, t, i, e, n, s) {
1739
- const { colStep: r } = Re(s);
1744
+ function Ae(o, t, i, e, n, s) {
1745
+ const { colStep: r } = Te(s);
1740
1746
  return {
1741
1747
  px: e + r * o,
1742
1748
  py: n + s * (t + o / 2)
@@ -1750,7 +1756,7 @@ const Le = [
1750
1756
  [0, -1, 1],
1751
1757
  [1, -1, 0]
1752
1758
  ];
1753
- function Me(o) {
1759
+ function Fe(o) {
1754
1760
  if (o === 0) return [[0, 0, 0]];
1755
1761
  const t = [];
1756
1762
  let [i, e, n] = [0, -o, o];
@@ -1759,35 +1765,35 @@ function Me(o) {
1759
1765
  t.push([i, e, n]), i += s, e += r, n += a;
1760
1766
  return t;
1761
1767
  }
1762
- class Fe {
1768
+ class Me {
1763
1769
  // imageConfig intentionally not stored — honeycomb forces uniform sizing (rotation/variance
1764
1770
  // would break hex tiling). Kept as parameter for interface compatibility.
1765
1771
  constructor(t, i = {}) {
1766
1772
  this.config = t;
1767
1773
  }
1768
1774
  generate(t, i, e = {}) {
1769
- const n = [], { width: s, height: r } = i, a = s / 2, c = r / 2, l = e.fixedHeight ?? 200, h = {
1775
+ const n = [], { width: s, height: r } = i, a = s / 2, c = r / 2, d = e.fixedHeight ?? 200, f = {
1770
1776
  ...Bt,
1771
1777
  ...this.config.honeycomb
1772
- }.spacing ?? 0, d = l + h;
1773
- let g = 0, p = 0;
1774
- for (; g < t; ) {
1775
- const b = Me(p);
1776
- for (const [f, m, y] of b) {
1777
- if (g >= t) break;
1778
- const { px: E, py: v } = Te(f, m, y, a, c, d);
1778
+ }.spacing ?? 0, m = d + f;
1779
+ let p = 0, w = 0;
1780
+ for (; p < t; ) {
1781
+ const v = Fe(w);
1782
+ for (const [l, g, h] of v) {
1783
+ if (p >= t) break;
1784
+ const { px: b, py: I } = Ae(l, g, h, a, c, m);
1779
1785
  n.push({
1780
- id: g,
1781
- x: E,
1782
- y: v,
1786
+ id: p,
1787
+ x: b,
1788
+ y: I,
1783
1789
  rotation: 0,
1784
1790
  scale: 1,
1785
- baseSize: l,
1791
+ baseSize: d,
1786
1792
  // Inner rings render above outer rings
1787
- zIndex: Math.max(1, 100 - p)
1788
- }), g++;
1793
+ zIndex: Math.max(1, 100 - w)
1794
+ }), p++;
1789
1795
  }
1790
- p++;
1796
+ w++;
1791
1797
  }
1792
1798
  return n;
1793
1799
  }
@@ -1807,13 +1813,13 @@ class Oe {
1807
1813
  case "grid":
1808
1814
  return new ye(this.config, this.imageConfig);
1809
1815
  case "spiral":
1810
- return new we(this.config, this.imageConfig);
1816
+ return new xe(this.config, this.imageConfig);
1811
1817
  case "cluster":
1812
- return new Se(this.config, this.imageConfig);
1813
- case "wave":
1814
1818
  return new Ie(this.config, this.imageConfig);
1819
+ case "wave":
1820
+ return new Se(this.config, this.imageConfig);
1815
1821
  case "honeycomb":
1816
- return new Fe(this.config, this.imageConfig);
1822
+ return new Me(this.config, this.imageConfig);
1817
1823
  default:
1818
1824
  return new me(this.config, this.imageConfig);
1819
1825
  }
@@ -1897,15 +1903,15 @@ class Oe {
1897
1903
  const s = this.imageConfig.sizing, r = this.resolveBaseHeight(n);
1898
1904
  if (r !== void 0)
1899
1905
  return { height: r };
1900
- const a = s?.minSize ?? 50, c = s?.maxSize ?? 400, l = this.config.targetCoverage ?? 0.6, u = this.config.densityFactor ?? 1, { width: h, height: d } = t, b = h * d * l / i;
1901
- let m = Math.sqrt(b / 1.4);
1902
- m *= u, m = Math.min(m, e);
1903
- let y = this.clamp(m, a, c);
1904
- if (y === a && m < a) {
1905
- const E = Math.max(a * 0.05, 20);
1906
- y = Math.max(E, m);
1906
+ const a = s?.minSize ?? 50, c = s?.maxSize ?? 400, d = this.config.targetCoverage ?? 0.6, u = this.config.densityFactor ?? 1, { width: f, height: m } = t, v = f * m * d / i;
1907
+ let g = Math.sqrt(v / 1.4);
1908
+ g *= u, g = Math.min(g, e);
1909
+ let h = this.clamp(g, a, c);
1910
+ if (h === a && g < a) {
1911
+ const b = Math.max(a * 0.05, 20);
1912
+ h = Math.max(b, g);
1907
1913
  }
1908
- return this.config.algorithm === "honeycomb" && (y = Math.min(y, this.honeycombMaxImageHeight(i, t))), { height: y };
1914
+ return this.config.algorithm === "honeycomb" && (h = Math.min(h, this.honeycombMaxImageHeight(i, t))), { height: h };
1909
1915
  }
1910
1916
  /**
1911
1917
  * Returns the largest image height at which all honeycomb rings fit within the container.
@@ -1917,8 +1923,8 @@ class Oe {
1917
1923
  let e = 0, n = 1;
1918
1924
  for (; n < t; )
1919
1925
  e++, n += 6 * e;
1920
- const s = this.config.spacing?.padding ?? 50, r = this.config.honeycomb?.spacing ?? 0, a = i.width / 2, c = i.height / 2, l = Math.sqrt(3) / 2, u = 1 / Math.sqrt(3), h = (c - s - r * e) / (e + 0.5), d = (a - s - l * r * e) / (l * e + u);
1921
- return Math.max(10, Math.min(h, d));
1926
+ const s = this.config.spacing?.padding ?? 50, r = this.config.honeycomb?.spacing ?? 0, a = i.width / 2, c = i.height / 2, d = Math.sqrt(3) / 2, u = 1 / Math.sqrt(3), f = (c - s - r * e) / (e + 0.5), m = (a - s - d * r * e) / (d * e + u);
1927
+ return Math.max(10, Math.min(f, m));
1922
1928
  }
1923
1929
  /**
1924
1930
  * Utility: Clamp a value between min and max
@@ -1927,8 +1933,8 @@ class Oe {
1927
1933
  return Math.max(i, Math.min(e, t));
1928
1934
  }
1929
1935
  }
1930
- var x = /* @__PURE__ */ ((o) => (o.IDLE = "idle", o.FOCUSING = "focusing", o.FOCUSED = "focused", o.UNFOCUSING = "unfocusing", o.CROSS_ANIMATING = "cross_animating", o))(x || {});
1931
- const Mt = {
1936
+ var C = /* @__PURE__ */ ((o) => (o.IDLE = "idle", o.FOCUSING = "focusing", o.FOCUSED = "focused", o.UNFOCUSING = "unfocusing", o.CROSS_ANIMATING = "cross_animating", o))(C || {});
1937
+ const Ft = {
1932
1938
  // Geometric shapes - uses percentages for responsive sizing
1933
1939
  circle: "circle(50%)",
1934
1940
  square: "polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%)",
@@ -1961,8 +1967,8 @@ const Mt = {
1961
1967
  },
1962
1968
  // Hexagon - regular hexagon (reference points imported from hexagonGeometry)
1963
1969
  hexagon: {
1964
- refHeight: xt,
1965
- points: St
1970
+ refHeight: wt,
1971
+ points: It
1966
1972
  },
1967
1973
  // Octagon - regular octagon
1968
1974
  octagon: {
@@ -1977,7 +1983,7 @@ const Mt = {
1977
1983
  };
1978
1984
  function De(o) {
1979
1985
  if (o)
1980
- return o in Mt ? Mt[o] : o;
1986
+ return o in Ft ? Ft[o] : o;
1981
1987
  }
1982
1988
  function _e(o, t, i) {
1983
1989
  const e = ze[o];
@@ -1985,10 +1991,10 @@ function _e(o, t, i) {
1985
1991
  const n = t / e.refHeight;
1986
1992
  if (o === "circle")
1987
1993
  return `circle(${Math.round(50 * n * 100) / 100}px)`;
1988
- const s = e.points.map(([b]) => b), r = e.points.map(([, b]) => b), a = (Math.min(...s) + Math.max(...s)) / 2 * n, c = (Math.min(...r) + Math.max(...r)) / 2 * n, l = (Math.max(...s) - Math.min(...s)) * n, u = (i ?? l) / 2, h = t / 2, d = u - a, g = h - c;
1989
- return `polygon(${e.points.map(([b, f]) => {
1990
- const m = Math.round((b * n + d) * 100) / 100, y = Math.round((f * n + g) * 100) / 100;
1991
- return `${m}px ${y}px`;
1994
+ const s = e.points.map(([v]) => v), r = e.points.map(([, v]) => v), a = (Math.min(...s) + Math.max(...s)) / 2 * n, c = (Math.min(...r) + Math.max(...r)) / 2 * n, d = (Math.max(...s) - Math.min(...s)) * n, u = (i ?? d) / 2, f = t / 2, m = u - a, p = f - c;
1995
+ return `polygon(${e.points.map(([v, l]) => {
1996
+ const g = Math.round((v * n + m) * 100) / 100, h = Math.round((l * n + p) * 100) / 100;
1997
+ return `${g}px ${h}px`;
1992
1998
  }).join(", ")})`;
1993
1999
  }
1994
2000
  function $e(o) {
@@ -2023,34 +2029,34 @@ function it(o, t, i) {
2023
2029
  o.borderRadiusTopLeft !== void 0 ? e.borderTopLeftRadius = `${o.borderRadiusTopLeft}px` : a && (e.borderTopLeftRadius = `${a}px`), o.borderRadiusTopRight !== void 0 ? e.borderTopRightRadius = `${o.borderRadiusTopRight}px` : a && (e.borderTopRightRadius = `${a}px`), o.borderRadiusBottomRight !== void 0 ? e.borderBottomRightRadius = `${o.borderRadiusBottomRight}px` : a && (e.borderBottomRightRadius = `${a}px`), o.borderRadiusBottomLeft !== void 0 ? e.borderBottomLeftRadius = `${o.borderRadiusBottomLeft}px` : a && (e.borderBottomLeftRadius = `${a}px`);
2024
2030
  } else o.border?.radius !== void 0 && (e.borderRadius = `${o.border.radius}px`);
2025
2031
  if (o.borderTop || o.borderRight || o.borderBottom || o.borderLeft) {
2026
- const a = o.border || {}, c = { ...a, ...o.borderTop }, l = { ...a, ...o.borderRight }, u = { ...a, ...o.borderBottom }, h = { ...a, ...o.borderLeft };
2027
- e.borderTop = tt(c), e.borderRight = tt(l), e.borderBottom = tt(u), e.borderLeft = tt(h);
2032
+ const a = o.border || {}, c = { ...a, ...o.borderTop }, d = { ...a, ...o.borderRight }, u = { ...a, ...o.borderBottom }, f = { ...a, ...o.borderLeft };
2033
+ e.borderTop = tt(c), e.borderRight = tt(d), e.borderBottom = tt(u), e.borderLeft = tt(f);
2028
2034
  } else o.border && (e.border = tt(o.border));
2029
2035
  o.shadow !== void 0 && (e.boxShadow = Pe(o.shadow));
2030
2036
  const r = Ue(o.filter);
2031
2037
  if (e.filter = r || "none", o.opacity !== void 0 && (e.opacity = String(o.opacity)), o.cursor !== void 0 && (e.cursor = o.cursor), o.outline && o.outline.style !== "none" && (o.outline.width ?? 0) > 0) {
2032
- const a = o.outline.width ?? 0, c = o.outline.style ?? "solid", l = o.outline.color ?? "#000000";
2033
- e.outline = `${a}px ${c} ${l}`, o.outline.offset !== void 0 && (e.outlineOffset = `${o.outline.offset}px`);
2038
+ const a = o.outline.width ?? 0, c = o.outline.style ?? "solid", d = o.outline.color ?? "#000000";
2039
+ e.outline = `${a}px ${c} ${d}`, o.outline.offset !== void 0 && (e.outlineOffset = `${o.outline.offset}px`);
2034
2040
  }
2035
2041
  if (o.objectFit !== void 0 && (e.objectFit = o.objectFit), o.aspectRatio !== void 0 && (e.aspectRatio = o.aspectRatio), o.clipPath !== void 0) {
2036
2042
  let a;
2037
- const c = typeof o.clipPath == "object" && o.clipPath !== null && "shape" in o.clipPath, l = c ? o.clipPath : void 0;
2038
- if (l?.mode === "height-relative" && t)
2039
- a = _e(l.shape, t, i);
2043
+ const c = typeof o.clipPath == "object" && o.clipPath !== null && "shape" in o.clipPath, d = c ? o.clipPath : void 0;
2044
+ if (d?.mode === "height-relative" && t)
2045
+ a = _e(d.shape, t, i);
2040
2046
  else {
2041
- const u = c && l ? l.shape : o.clipPath;
2047
+ const u = c && d ? d.shape : o.clipPath;
2042
2048
  a = De(u);
2043
2049
  }
2044
2050
  a && (a === "none" ? e.clipPath = "unset" : (e.clipPath = a, e.overflow = "hidden"));
2045
2051
  }
2046
2052
  return e;
2047
2053
  }
2048
- function He(o, t) {
2054
+ function ke(o, t) {
2049
2055
  t.borderRadius !== void 0 && (o.style.borderRadius = t.borderRadius), t.borderTopLeftRadius !== void 0 && (o.style.borderTopLeftRadius = t.borderTopLeftRadius), t.borderTopRightRadius !== void 0 && (o.style.borderTopRightRadius = t.borderTopRightRadius), t.borderBottomRightRadius !== void 0 && (o.style.borderBottomRightRadius = t.borderBottomRightRadius), t.borderBottomLeftRadius !== void 0 && (o.style.borderBottomLeftRadius = t.borderBottomLeftRadius), t.border !== void 0 && (o.style.border = t.border), t.borderTop !== void 0 && (o.style.borderTop = t.borderTop), t.borderRight !== void 0 && (o.style.borderRight = t.borderRight), t.borderBottom !== void 0 && (o.style.borderBottom = t.borderBottom), t.borderLeft !== void 0 && (o.style.borderLeft = t.borderLeft), t.boxShadow !== void 0 && (o.style.boxShadow = t.boxShadow), t.filter !== void 0 && (o.style.filter = t.filter), t.opacity !== void 0 && (o.style.opacity = t.opacity), t.cursor !== void 0 && (o.style.cursor = t.cursor), t.outline !== void 0 && (o.style.outline = t.outline), t.outlineOffset !== void 0 && (o.style.outlineOffset = t.outlineOffset), t.objectFit !== void 0 && (o.style.objectFit = t.objectFit), t.aspectRatio !== void 0 && (o.style.aspectRatio = t.aspectRatio), t.clipPath !== void 0 && (o.style.clipPath = t.clipPath), t.overflow !== void 0 && (o.style.overflow = t.overflow);
2050
2056
  }
2051
2057
  function st(o, t, i, e) {
2052
2058
  const n = it(t, i, e);
2053
- He(o, n);
2059
+ ke(o, n);
2054
2060
  }
2055
2061
  function Pt(o) {
2056
2062
  return o ? Array.isArray(o) ? o.join(" ") : o : "";
@@ -2067,13 +2073,13 @@ function pt(o, t) {
2067
2073
  e.trim() && o.classList.remove(e.trim());
2068
2074
  });
2069
2075
  }
2070
- const Ft = {
2076
+ const Mt = {
2071
2077
  UNFOCUSING: 999,
2072
2078
  FOCUSING: 1e3
2073
2079
  };
2074
- class Ne {
2080
+ class He {
2075
2081
  constructor(t, i, e) {
2076
- this.state = x.IDLE, this.currentFocus = null, this.focusData = null, this.outgoing = null, this.incoming = null, this.focusGeneration = 0, this.onUnfocusComplete = null, this.config = t, this.animationEngine = i, this.styling = e, this.focusedClassName = e?.focused?.className;
2082
+ this.state = C.IDLE, this.currentFocus = null, this.focusData = null, this.outgoing = null, this.incoming = null, this.focusGeneration = 0, this.onUnfocusComplete = null, this.config = t, this.animationEngine = i, this.styling = e, this.focusedClassName = e?.focused?.className;
2077
2083
  }
2078
2084
  /**
2079
2085
  * Set callback to be fired when an unfocus animation fully completes.
@@ -2091,7 +2097,7 @@ class Ne {
2091
2097
  * Check if any animation is in progress
2092
2098
  */
2093
2099
  isAnimating() {
2094
- return this.state !== x.IDLE && this.state !== x.FOCUSED;
2100
+ return this.state !== C.IDLE && this.state !== C.FOCUSED;
2095
2101
  }
2096
2102
  /**
2097
2103
  * Normalize scalePercent value
@@ -2106,8 +2112,8 @@ class Ne {
2106
2112
  calculateFocusDimensions(t, i, e) {
2107
2113
  const n = this.normalizeScalePercent(this.config.scalePercent), s = e.height * n, r = t / i;
2108
2114
  let a = s, c = a * r;
2109
- const l = e.width * n;
2110
- return c > l && (c = l, a = c / r), { width: c, height: a };
2115
+ const d = e.width * n;
2116
+ return c > d && (c = d, a = c / r), { width: c, height: a };
2111
2117
  }
2112
2118
  /**
2113
2119
  * Calculate the transform needed to center an image (position only, no scale)
@@ -2139,11 +2145,11 @@ class Ne {
2139
2145
  * This provides sharper zoom by re-rendering at target size instead of scaling pixels
2140
2146
  */
2141
2147
  animateWithDimensions(t, i, e, n, s, r, a, c) {
2142
- const l = this.buildDimensionZoomTransform(i), u = this.buildDimensionZoomTransform(e);
2148
+ const d = this.buildDimensionZoomTransform(i), u = this.buildDimensionZoomTransform(e);
2143
2149
  return t.style.transition = "none", t.animate(
2144
2150
  [
2145
2151
  {
2146
- transform: l,
2152
+ transform: d,
2147
2153
  width: `${n}px`,
2148
2154
  height: `${s}px`
2149
2155
  },
@@ -2200,33 +2206,33 @@ class Ne {
2200
2206
  * @param fromDimensions - Optional starting dimensions (for mid-animation reversals)
2201
2207
  */
2202
2208
  startFocusAnimation(t, i, e, n, s) {
2203
- const r = t.style.zIndex || "", a = t.offsetWidth, c = t.offsetHeight, l = this.calculateFocusDimensions(a, c, i), u = this.calculateFocusTransform(i, e);
2209
+ const r = t.style.zIndex || "", a = t.offsetWidth, c = t.offsetHeight, d = this.calculateFocusDimensions(a, c, i), u = this.calculateFocusTransform(i, e);
2204
2210
  this.animationEngine.cancelAllAnimations(t);
2205
- const h = this.config.animationDuration ?? 600;
2206
- this.applyFocusedStyling(t, Ft.FOCUSING);
2207
- const d = n ?? {
2211
+ const f = this.config.animationDuration ?? 600;
2212
+ this.applyFocusedStyling(t, Mt.FOCUSING);
2213
+ const m = n ?? {
2208
2214
  x: 0,
2209
2215
  y: 0,
2210
2216
  rotation: e.rotation,
2211
2217
  scale: 1
2212
2218
  // No scale - using dimensions
2213
- }, g = s?.width ?? a, p = s?.height ?? c, b = this.animateWithDimensions(
2219
+ }, p = s?.width ?? a, w = s?.height ?? c, v = this.animateWithDimensions(
2214
2220
  t,
2215
- d,
2221
+ m,
2216
2222
  u,
2217
- g,
2218
2223
  p,
2219
- l.width,
2220
- l.height,
2221
- h
2222
- ), f = {
2224
+ w,
2225
+ d.width,
2226
+ d.height,
2227
+ f
2228
+ ), l = {
2223
2229
  id: `focus-${Date.now()}`,
2224
2230
  element: t,
2225
- animation: b,
2226
- fromState: d,
2231
+ animation: v,
2232
+ fromState: m,
2227
2233
  toState: u,
2228
2234
  startTime: performance.now(),
2229
- duration: h
2235
+ duration: f
2230
2236
  };
2231
2237
  return this.focusData = {
2232
2238
  element: t,
@@ -2235,12 +2241,12 @@ class Ne {
2235
2241
  originalZIndex: r,
2236
2242
  originalWidth: a,
2237
2243
  originalHeight: c,
2238
- focusWidth: l.width,
2239
- focusHeight: l.height
2240
- }, this.startClipPathAnimation(t, f, !0), {
2244
+ focusWidth: d.width,
2245
+ focusHeight: d.height
2246
+ }, this.startClipPathAnimation(t, l, !0), {
2241
2247
  element: t,
2242
2248
  originalState: e,
2243
- animationHandle: f,
2249
+ animationHandle: l,
2244
2250
  direction: "in",
2245
2251
  originalWidth: a,
2246
2252
  originalHeight: c
@@ -2252,40 +2258,40 @@ class Ne {
2252
2258
  * @param fromDimensions - Optional starting dimensions (for mid-animation reversals)
2253
2259
  */
2254
2260
  startUnfocusAnimation(t, i, e, n) {
2255
- t.style.zIndex = String(Ft.UNFOCUSING), this.animationEngine.cancelAllAnimations(t);
2261
+ t.style.zIndex = String(Mt.UNFOCUSING), this.animationEngine.cancelAllAnimations(t);
2256
2262
  const s = this.config.animationDuration ?? 600;
2257
2263
  t.classList.remove("fbn-ic-focused"), pt(t, this.focusedClassName);
2258
- const r = e ?? this.focusData?.focusTransform ?? { x: 0, y: 0, rotation: 0, scale: 1 }, a = n?.width ?? this.focusData?.focusWidth ?? t.offsetWidth, c = n?.height ?? this.focusData?.focusHeight ?? t.offsetHeight, l = {
2264
+ const r = e ?? this.focusData?.focusTransform ?? { x: 0, y: 0, rotation: 0, scale: 1 }, a = n?.width ?? this.focusData?.focusWidth ?? t.offsetWidth, c = n?.height ?? this.focusData?.focusHeight ?? t.offsetHeight, d = {
2259
2265
  x: 0,
2260
2266
  y: 0,
2261
2267
  rotation: i.rotation,
2262
2268
  scale: 1
2263
2269
  // No scale - using dimensions
2264
- }, u = this.focusData?.originalWidth ?? t.offsetWidth, h = this.focusData?.originalHeight ?? t.offsetHeight, d = this.animateWithDimensions(
2270
+ }, u = this.focusData?.originalWidth ?? t.offsetWidth, f = this.focusData?.originalHeight ?? t.offsetHeight, m = this.animateWithDimensions(
2265
2271
  t,
2266
2272
  r,
2267
- l,
2273
+ d,
2268
2274
  a,
2269
2275
  c,
2270
2276
  u,
2271
- h,
2277
+ f,
2272
2278
  s
2273
- ), g = {
2279
+ ), p = {
2274
2280
  id: `unfocus-${Date.now()}`,
2275
2281
  element: t,
2276
- animation: d,
2282
+ animation: m,
2277
2283
  fromState: r,
2278
- toState: l,
2284
+ toState: d,
2279
2285
  startTime: performance.now(),
2280
2286
  duration: s
2281
2287
  };
2282
- return this.startClipPathAnimation(t, g, !1), {
2288
+ return this.startClipPathAnimation(t, p, !1), {
2283
2289
  element: t,
2284
2290
  originalState: i,
2285
- animationHandle: g,
2291
+ animationHandle: p,
2286
2292
  direction: "out",
2287
2293
  originalWidth: u,
2288
- originalHeight: h
2294
+ originalHeight: f
2289
2295
  };
2290
2296
  }
2291
2297
  /**
@@ -2331,26 +2337,26 @@ class Ne {
2331
2337
  * Implements cross-animation when swapping focus
2332
2338
  */
2333
2339
  async focusImage(t, i, e) {
2334
- if (this.currentFocus === t && this.state === x.FOCUSED)
2340
+ if (this.currentFocus === t && this.state === C.FOCUSED)
2335
2341
  return this.unfocusImage();
2336
- if (this.incoming?.element === t && this.state === x.FOCUSING) {
2342
+ if (this.incoming?.element === t && this.state === C.FOCUSING) {
2337
2343
  const { transform: s, dimensions: r } = this.captureMidAnimationState(t);
2338
2344
  this.animationEngine.cancelAllAnimations(t), this.outgoing = this.startUnfocusAnimation(
2339
2345
  t,
2340
2346
  this.incoming.originalState,
2341
2347
  s,
2342
2348
  r
2343
- ), this.incoming = null, this.state = x.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 = x.IDLE;
2349
+ ), this.incoming = null, this.state = C.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 = C.IDLE;
2344
2350
  return;
2345
2351
  }
2346
2352
  const n = ++this.focusGeneration;
2347
2353
  switch (this.state) {
2348
- case x.IDLE:
2349
- if (this.state = x.FOCUSING, this.incoming = this.startFocusAnimation(t, i, e), await this.waitForAnimation(this.incoming.animationHandle), this.focusGeneration !== n) return;
2350
- this.currentFocus = t, this.incoming = null, this.state = x.FOCUSED;
2354
+ case C.IDLE:
2355
+ if (this.state = C.FOCUSING, this.incoming = this.startFocusAnimation(t, i, e), await this.waitForAnimation(this.incoming.animationHandle), this.focusGeneration !== n) return;
2356
+ this.currentFocus = t, this.incoming = null, this.state = C.FOCUSED;
2351
2357
  break;
2352
- case x.FOCUSED:
2353
- if (this.state = x.CROSS_ANIMATING, this.currentFocus && this.focusData && (this.outgoing = this.startUnfocusAnimation(
2358
+ case C.FOCUSED:
2359
+ if (this.state = C.CROSS_ANIMATING, this.currentFocus && this.focusData && (this.outgoing = this.startUnfocusAnimation(
2354
2360
  this.currentFocus,
2355
2361
  this.focusData.originalState
2356
2362
  )), this.incoming = this.startFocusAnimation(t, i, e), await Promise.all([
@@ -2362,9 +2368,9 @@ class Ne {
2362
2368
  const s = this.outgoing.element;
2363
2369
  this.removeFocusedStyling(s, this.outgoing.originalState.zIndex?.toString() || ""), this.outgoing = null, this.onUnfocusComplete?.(s);
2364
2370
  }
2365
- this.currentFocus = t, this.incoming = null, this.state = x.FOCUSED;
2371
+ this.currentFocus = t, this.incoming = null, this.state = C.FOCUSED;
2366
2372
  break;
2367
- case x.FOCUSING:
2373
+ case C.FOCUSING:
2368
2374
  if (this.incoming && (this.animationEngine.cancelAnimation(this.incoming.animationHandle, !1), this.resetElementInstantly(
2369
2375
  this.incoming.element,
2370
2376
  this.incoming.originalState,
@@ -2372,10 +2378,10 @@ class Ne {
2372
2378
  this.focusData?.originalWidth,
2373
2379
  this.focusData?.originalHeight
2374
2380
  ), this.incoming = null), this.incoming = this.startFocusAnimation(t, i, e), await this.waitForAnimation(this.incoming.animationHandle), this.focusGeneration !== n) return;
2375
- this.currentFocus = t, this.incoming = null, this.state = x.FOCUSED;
2381
+ this.currentFocus = t, this.incoming = null, this.state = C.FOCUSED;
2376
2382
  break;
2377
- case x.UNFOCUSING:
2378
- if (this.state = x.CROSS_ANIMATING, this.incoming = this.startFocusAnimation(t, i, e), await Promise.all([
2383
+ case C.UNFOCUSING:
2384
+ if (this.state = C.CROSS_ANIMATING, this.incoming = this.startFocusAnimation(t, i, e), await Promise.all([
2379
2385
  this.outgoing ? this.waitForAnimation(this.outgoing.animationHandle) : Promise.resolve(),
2380
2386
  this.waitForAnimation(this.incoming.animationHandle)
2381
2387
  ]), this.focusGeneration !== n) return;
@@ -2383,9 +2389,9 @@ class Ne {
2383
2389
  const s = this.outgoing.element;
2384
2390
  this.removeFocusedStyling(s, this.outgoing.originalState.zIndex?.toString() || ""), this.outgoing = null, this.onUnfocusComplete?.(s);
2385
2391
  }
2386
- this.currentFocus = t, this.incoming = null, this.state = x.FOCUSED;
2392
+ this.currentFocus = t, this.incoming = null, this.state = C.FOCUSED;
2387
2393
  break;
2388
- case x.CROSS_ANIMATING:
2394
+ case C.CROSS_ANIMATING:
2389
2395
  if (this.incoming?.element === t)
2390
2396
  return;
2391
2397
  if (this.outgoing?.element === t) {
@@ -2408,7 +2414,7 @@ class Ne {
2408
2414
  const a = this.outgoing.element;
2409
2415
  this.removeFocusedStyling(a, this.outgoing.originalState.zIndex?.toString() || ""), this.outgoing = null, this.onUnfocusComplete?.(a);
2410
2416
  }
2411
- this.currentFocus = t, this.incoming = null, this.state = x.FOCUSED;
2417
+ this.currentFocus = t, this.incoming = null, this.state = C.FOCUSED;
2412
2418
  return;
2413
2419
  }
2414
2420
  if (this.outgoing && (this.animationEngine.cancelAnimation(this.outgoing.animationHandle, !1), this.resetElementInstantly(
@@ -2434,7 +2440,7 @@ class Ne {
2434
2440
  const s = this.outgoing.element;
2435
2441
  this.removeFocusedStyling(s, this.outgoing.originalState.zIndex?.toString() || ""), this.outgoing = null, this.onUnfocusComplete?.(s);
2436
2442
  }
2437
- this.currentFocus = t, this.incoming = null, this.state = x.FOCUSED;
2443
+ this.currentFocus = t, this.incoming = null, this.state = C.FOCUSED;
2438
2444
  break;
2439
2445
  }
2440
2446
  }
@@ -2442,24 +2448,24 @@ class Ne {
2442
2448
  * Unfocus current image, returning it to original position
2443
2449
  */
2444
2450
  async unfocusImage() {
2445
- if (this.state === x.UNFOCUSING)
2451
+ if (this.state === C.UNFOCUSING)
2446
2452
  return;
2447
2453
  const t = ++this.focusGeneration;
2448
2454
  if (!this.currentFocus || !this.focusData) {
2449
- if (this.incoming && this.state === x.FOCUSING) {
2455
+ if (this.incoming && this.state === C.FOCUSING) {
2450
2456
  const { transform: s, dimensions: r } = this.captureMidAnimationState(this.incoming.element);
2451
2457
  if (this.animationEngine.cancelAllAnimations(this.incoming.element), this.outgoing = this.startUnfocusAnimation(
2452
2458
  this.incoming.element,
2453
2459
  this.incoming.originalState,
2454
2460
  s,
2455
2461
  r
2456
- ), this.incoming = null, this.state = x.UNFOCUSING, await this.waitForAnimation(this.outgoing.animationHandle), this.focusGeneration !== t) return;
2462
+ ), this.incoming = null, this.state = C.UNFOCUSING, await this.waitForAnimation(this.outgoing.animationHandle), this.focusGeneration !== t) return;
2457
2463
  const a = this.outgoing.element;
2458
- this.removeFocusedStyling(a, this.focusData?.originalZIndex || ""), this.outgoing = null, this.focusData = null, this.state = x.IDLE, this.onUnfocusComplete?.(a);
2464
+ this.removeFocusedStyling(a, this.focusData?.originalZIndex || ""), this.outgoing = null, this.focusData = null, this.state = C.IDLE, this.onUnfocusComplete?.(a);
2459
2465
  }
2460
2466
  return;
2461
2467
  }
2462
- if (this.state === x.CROSS_ANIMATING && this.incoming) {
2468
+ if (this.state === C.CROSS_ANIMATING && this.incoming) {
2463
2469
  const { transform: s, dimensions: r } = this.captureMidAnimationState(this.incoming.element);
2464
2470
  this.animationEngine.cancelAllAnimations(this.incoming.element);
2465
2471
  const a = this.startUnfocusAnimation(
@@ -2474,13 +2480,13 @@ class Ne {
2474
2480
  ]), this.focusGeneration !== t) return;
2475
2481
  let c = null;
2476
2482
  this.outgoing && (c = this.outgoing.element, this.removeFocusedStyling(c, this.outgoing.originalState.zIndex?.toString() || ""));
2477
- const l = a.element;
2478
- this.removeFocusedStyling(l, this.incoming.originalState.zIndex?.toString() || ""), this.outgoing = null, this.incoming = null, this.currentFocus = null, this.focusData = null, this.state = x.IDLE, c && this.onUnfocusComplete?.(c), this.onUnfocusComplete?.(l);
2483
+ const d = a.element;
2484
+ this.removeFocusedStyling(d, this.incoming.originalState.zIndex?.toString() || ""), this.outgoing = null, this.incoming = null, this.currentFocus = null, this.focusData = null, this.state = C.IDLE, c && this.onUnfocusComplete?.(c), this.onUnfocusComplete?.(d);
2479
2485
  return;
2480
2486
  }
2481
- this.state = x.UNFOCUSING;
2487
+ this.state = C.UNFOCUSING;
2482
2488
  const i = this.currentFocus, e = this.focusData.originalState, n = this.focusData.originalZIndex;
2483
- this.outgoing = this.startUnfocusAnimation(i, e), await this.waitForAnimation(this.outgoing.animationHandle), this.focusGeneration === t && (this.removeFocusedStyling(i, n), this.outgoing = null, this.currentFocus = null, this.focusData = null, this.state = x.IDLE, this.onUnfocusComplete?.(i));
2489
+ this.outgoing = this.startUnfocusAnimation(i, e), await this.waitForAnimation(this.outgoing.animationHandle), this.focusGeneration === t && (this.removeFocusedStyling(i, n), this.outgoing = null, this.currentFocus = null, this.focusData = null, this.state = C.IDLE, this.onUnfocusComplete?.(i));
2484
2490
  }
2485
2491
  /**
2486
2492
  * Swap focus from current image to a new one (alias for focusImage with cross-animation)
@@ -2498,7 +2504,7 @@ class Ne {
2498
2504
  * Check if an image is currently focused (stable state)
2499
2505
  */
2500
2506
  isFocused(t) {
2501
- return this.currentFocus === t && this.state === x.FOCUSED;
2507
+ return this.currentFocus === t && this.state === C.FOCUSED;
2502
2508
  }
2503
2509
  /**
2504
2510
  * Check if an image is the target of current focus animation
@@ -2519,7 +2525,7 @@ class Ne {
2519
2525
  * Used during swipe gestures for visual feedback
2520
2526
  */
2521
2527
  setDragOffset(t) {
2522
- if (!this.currentFocus || !this.focusData || this.state !== x.FOCUSED) return;
2528
+ if (!this.currentFocus || !this.focusData || this.state !== C.FOCUSED) return;
2523
2529
  const i = this.currentFocus, e = this.focusData.focusTransform, n = ["translate(-50%, -50%)"], s = (e.x ?? 0) + t, r = e.y ?? 0;
2524
2530
  n.push(`translate(${s}px, ${r}px)`), e.rotation !== void 0 && n.push(`rotate(${e.rotation}deg)`), i.style.transition = "none", i.style.transform = n.join(" ");
2525
2531
  }
@@ -2529,7 +2535,7 @@ class Ne {
2529
2535
  * @param duration - Animation duration in ms (default 150)
2530
2536
  */
2531
2537
  clearDragOffset(t, i = 150) {
2532
- if (!this.currentFocus || !this.focusData || this.state !== x.FOCUSED) return;
2538
+ if (!this.currentFocus || !this.focusData || this.state !== C.FOCUSED) return;
2533
2539
  const e = this.currentFocus, n = this.focusData.focusTransform, s = ["translate(-50%, -50%)"], r = n.x ?? 0, a = n.y ?? 0;
2534
2540
  s.push(`translate(${r}px, ${a}px)`), n.rotation !== void 0 && s.push(`rotate(${n.rotation}deg)`);
2535
2541
  const c = s.join(" ");
@@ -2559,10 +2565,10 @@ class Ne {
2559
2565
  this.focusData.originalZIndex,
2560
2566
  this.focusData.originalWidth,
2561
2567
  this.focusData.originalHeight
2562
- ), this.state = x.IDLE, this.currentFocus = null, this.focusData = null, this.outgoing = null, this.incoming = null;
2568
+ ), this.state = C.IDLE, this.currentFocus = null, this.focusData = null, this.outgoing = null, this.incoming = null;
2563
2569
  }
2564
2570
  }
2565
- const ke = 50, Be = 0.5, je = 20, We = 0.3, Ge = 150, qe = 30, rt = class rt {
2571
+ const Ne = 50, Be = 0.5, je = 20, We = 0.3, Ge = 150, qe = 30, rt = class rt {
2566
2572
  constructor(t, i) {
2567
2573
  this.enabled = !1, this.touchState = null, this.recentTouchTimestamp = 0, this.container = t, this.callbacks = i, this.boundTouchStart = this.handleTouchStart.bind(this), this.boundTouchMove = this.handleTouchMove.bind(this), this.boundTouchEnd = this.handleTouchEnd.bind(this), this.boundTouchCancel = this.handleTouchCancel.bind(this);
2568
2574
  }
@@ -2622,7 +2628,7 @@ const ke = 50, Be = 0.5, je = 20, We = 0.3, Ge = 150, qe = 30, rt = class rt {
2622
2628
  this.recentTouchTimestamp = Date.now();
2623
2629
  const i = this.touchState.currentX - this.touchState.startX, e = performance.now() - this.touchState.startTime, n = Math.abs(i) / e, s = Math.abs(i);
2624
2630
  let r = !1;
2625
- this.touchState.isHorizontalSwipe === !0 && this.touchState.isDragging && (s >= ke || n >= Be && s >= je) && (r = !0, i < 0 ? this.callbacks.onNext() : this.callbacks.onPrev()), this.touchState.isDragging && this.callbacks.onDragEnd(r), this.touchState = null;
2631
+ this.touchState.isHorizontalSwipe === !0 && this.touchState.isDragging && (s >= Ne || n >= Be && s >= je) && (r = !0, i < 0 ? this.callbacks.onNext() : this.callbacks.onPrev()), this.touchState.isDragging && this.callbacks.onDragEnd(r), this.touchState = null;
2626
2632
  }
2627
2633
  handleTouchCancel(t) {
2628
2634
  this.touchState?.isDragging && this.callbacks.onDragEnd(!1), this.touchState = null;
@@ -2630,7 +2636,7 @@ const ke = 50, Be = 0.5, je = 20, We = 0.3, Ge = 150, qe = 30, rt = class rt {
2630
2636
  };
2631
2637
  rt.TOUCH_CLICK_DELAY = 300;
2632
2638
  let bt = rt;
2633
- class Xe {
2639
+ class Ye {
2634
2640
  constructor(t) {
2635
2641
  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)
2636
2642
  throw new Error("GoogleDriveLoader requires at least one source to be configured");
@@ -2725,10 +2731,10 @@ class Xe {
2725
2731
  const e = [], n = `'${t}' in parents and trashed=false`, r = `${this.apiEndpoint}?q=${encodeURIComponent(n)}&fields=files(id,name,mimeType,thumbnailLink)&key=${this.apiKey}`, a = await fetch(r);
2726
2732
  if (!a.ok)
2727
2733
  throw new Error(`API request failed: ${a.status} ${a.statusText}`);
2728
- const l = (await a.json()).files.filter(
2734
+ const d = (await a.json()).files.filter(
2729
2735
  (u) => u.mimeType.startsWith("image/") && i.isAllowed(u.name)
2730
2736
  );
2731
- return this.log(`Found ${l.length} images in folder ${t} (non-recursive)`), l.forEach((u) => {
2737
+ return this.log(`Found ${d.length} images in folder ${t} (non-recursive)`), d.forEach((u) => {
2732
2738
  e.push(`https://lh3.googleusercontent.com/d/${u.id}=s1600`), this.log(`Added file: ${u.name}`);
2733
2739
  }), e;
2734
2740
  }
@@ -2795,18 +2801,18 @@ class Xe {
2795
2801
  const e = [], n = `'${t}' in parents and trashed=false`, r = `${this.apiEndpoint}?q=${encodeURIComponent(n)}&fields=files(id,name,mimeType,thumbnailLink)&key=${this.apiKey}`, a = await fetch(r);
2796
2802
  if (!a.ok)
2797
2803
  throw new Error(`API request failed: ${a.status} ${a.statusText}`);
2798
- const c = await a.json(), l = c.files.filter(
2799
- (h) => h.mimeType.startsWith("image/") && i.isAllowed(h.name)
2804
+ const c = await a.json(), d = c.files.filter(
2805
+ (f) => f.mimeType.startsWith("image/") && i.isAllowed(f.name)
2800
2806
  ), u = c.files.filter(
2801
- (h) => h.mimeType === "application/vnd.google-apps.folder"
2807
+ (f) => f.mimeType === "application/vnd.google-apps.folder"
2802
2808
  );
2803
- this.log(`Found ${c.files.length} total items in folder ${t}`), c.files.forEach((h) => this.log(` - File: ${h.name} (${h.mimeType})`)), this.log(`- ${l.length} valid files (images only)`), this.log(`- ${u.length} subfolders`), l.forEach((h) => {
2804
- e.push(`https://lh3.googleusercontent.com/d/${h.id}=s1600`), this.log(`Added file: ${h.name}`);
2809
+ this.log(`Found ${c.files.length} total items in folder ${t}`), c.files.forEach((f) => this.log(` - File: ${f.name} (${f.mimeType})`)), this.log(`- ${d.length} valid files (images only)`), this.log(`- ${u.length} subfolders`), d.forEach((f) => {
2810
+ e.push(`https://lh3.googleusercontent.com/d/${f.id}=s1600`), this.log(`Added file: ${f.name}`);
2805
2811
  });
2806
- for (const h of u) {
2807
- this.log(`Loading images from subfolder: ${h.name}`);
2808
- const d = await this.loadImagesRecursively(h.id, i);
2809
- e.push(...d);
2812
+ for (const f of u) {
2813
+ this.log(`Loading images from subfolder: ${f.name}`);
2814
+ const m = await this.loadImagesRecursively(f.id, i);
2815
+ e.push(...m);
2810
2816
  }
2811
2817
  return e;
2812
2818
  }
@@ -2851,7 +2857,7 @@ class Xe {
2851
2857
  this.debugLogging && typeof console < "u" && console.log(...t);
2852
2858
  }
2853
2859
  }
2854
- class Ye {
2860
+ class Xe {
2855
2861
  constructor(t) {
2856
2862
  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)
2857
2863
  throw new Error("StaticImageLoader requires at least one source to be configured");
@@ -3215,11 +3221,11 @@ function Ze() {
3215
3221
  }
3216
3222
  class Qe {
3217
3223
  constructor(t = {}) {
3218
- this.fullConfig = Zt(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.prevButtonEl = null, this.nextButtonEl = null, this.prevButtonElAutoCreated = !1, this.nextButtonElAutoCreated = !1, this.animationEngine = new ie(this.fullConfig.animation), this.layoutEngine = new Oe({
3224
+ this.fullConfig = Zt(t), t.container instanceof HTMLElement ? (this.containerRef = t.container, this.containerId = null) : (this.containerRef = null, this.containerId = t.container || "imageCloud"), this.callbacks = t.on ?? {}, 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.prevButtonEl = null, this.nextButtonEl = null, this.prevButtonElAutoCreated = !1, this.nextButtonElAutoCreated = !1, this.animationEngine = new ie(this.fullConfig.animation), this.layoutEngine = new Oe({
3219
3225
  layout: this.fullConfig.layout,
3220
3226
  image: this.fullConfig.image
3221
- }), this.zoomEngine = new Ne(this.fullConfig.interaction.focus, this.animationEngine, this.fullConfig.styling), this.defaultStyles = it(this.fullConfig.styling?.default), this.defaultClassName = this.fullConfig.styling?.default?.className, this.hoverClassName = this.fullConfig.styling?.hover?.className;
3222
- const i = this.fullConfig.animation.entry || A.animation.entry;
3227
+ }), this.zoomEngine = new He(this.fullConfig.interaction.focus, this.animationEngine, this.fullConfig.styling), this.defaultStyles = it(this.fullConfig.styling?.default), this.defaultClassName = this.fullConfig.styling?.default?.className, this.hoverClassName = this.fullConfig.styling?.hover?.className;
3228
+ const i = this.fullConfig.animation.entry || L.animation.entry;
3223
3229
  this.entryAnimationEngine = new fe(
3224
3230
  i,
3225
3231
  this.fullConfig.layout.algorithm
@@ -3230,13 +3236,22 @@ class Qe {
3230
3236
  i.timing?.duration ?? 600
3231
3237
  ) : this.idleAnimationEngine = null, this.zoomEngine.setOnUnfocusCompleteCallback((n) => {
3232
3238
  this.idleAnimationEngine?.resumeForImage(n);
3233
- const s = n;
3239
+ const s = n, r = this.imageElements.indexOf(s);
3240
+ if (this.callbacks.onImageUnfocus && r !== -1) {
3241
+ const a = this.imageLoader.imageURLs(), c = {
3242
+ element: s,
3243
+ index: r,
3244
+ url: a[r] ?? "",
3245
+ layout: this.imageLayouts[r]
3246
+ };
3247
+ this.callbacks.onImageUnfocus(c);
3248
+ }
3234
3249
  requestAnimationFrame(() => {
3235
3250
  if (s.matches(":hover") && this.fullConfig.styling?.hover) {
3236
- const r = this.imageElements.indexOf(s);
3237
- if (r !== -1) {
3238
- const a = s.offsetHeight, c = s.cachedRenderedWidth;
3239
- st(s, this.fullConfig.styling.hover, a, c), et(s, this.hoverClassName), this.hoveredImage = { element: s, layout: this.imageLayouts[r] };
3251
+ const a = this.imageElements.indexOf(s);
3252
+ if (a !== -1) {
3253
+ const c = s.offsetHeight, d = s.cachedRenderedWidth;
3254
+ st(s, this.fullConfig.styling.hover, c, d), et(s, this.hoverClassName), this.hoveredImage = { element: s, layout: this.imageLayouts[a] };
3240
3255
  }
3241
3256
  }
3242
3257
  });
@@ -3276,14 +3291,14 @@ class Qe {
3276
3291
  allowedExtensions: e.allowedExtensions ?? i.allowedExtensions,
3277
3292
  debugLogging: e.debugLogging ?? this.fullConfig.config.debug?.loaders
3278
3293
  };
3279
- return new Ye(n);
3294
+ return new Xe(n);
3280
3295
  } else if ("googleDrive" in t) {
3281
3296
  const e = t.googleDrive, n = {
3282
3297
  ...e,
3283
3298
  allowedExtensions: e.allowedExtensions ?? i.allowedExtensions,
3284
3299
  debugLogging: e.debugLogging ?? this.fullConfig.config.debug?.loaders
3285
3300
  };
3286
- return new Xe(n);
3301
+ return new Ye(n);
3287
3302
  } else
3288
3303
  throw new Error(`Unknown loader entry: ${JSON.stringify(t)}`);
3289
3304
  }
@@ -3432,61 +3447,134 @@ class Qe {
3432
3447
  const e = this.getContainerBounds();
3433
3448
  this.currentImageHeight = i;
3434
3449
  const n = this.loadGeneration, s = this.layoutEngine.generateLayout(t.length, e, { fixedHeight: i });
3435
- this.imageLayouts = s, this.displayQueue = [];
3436
- let r = 0;
3437
- const a = (l) => {
3438
- this.containerEl && (this.containerEl.appendChild(l), this.imageElements.push(l), requestAnimationFrame(() => {
3439
- if (l.offsetWidth, l.style.opacity = this.defaultStyles.opacity ?? "1", l.dataset.startX && (this.entryAnimationEngine.requiresJSAnimation() || this.entryAnimationEngine.requiresJSRotation() || this.entryAnimationEngine.requiresJSScale() || l.dataset.startRotation !== l.dataset.rotation || l.dataset.startScale !== l.dataset.scale)) {
3440
- const d = {
3441
- x: parseFloat(l.dataset.startX),
3442
- y: parseFloat(l.dataset.startY)
3443
- }, g = {
3444
- x: parseFloat(l.dataset.endX),
3445
- y: parseFloat(l.dataset.endY)
3446
- }, p = parseFloat(l.dataset.imageWidth), b = parseFloat(l.dataset.imageHeight), f = parseFloat(l.dataset.rotation), m = parseFloat(l.dataset.scale), y = l.dataset.startRotation ? parseFloat(l.dataset.startRotation) : f, E = l.dataset.startScale ? parseFloat(l.dataset.startScale) : m, v = this.entryAnimationEngine.getTiming();
3450
+ if (this.imageLayouts = s, this.callbacks.onLayoutComplete) {
3451
+ const l = {
3452
+ layouts: [...s],
3453
+ // shallow copy caller should not mutate
3454
+ containerBounds: { ...e },
3455
+ algorithm: this.fullConfig.layout.algorithm,
3456
+ imageCount: t.length
3457
+ };
3458
+ this.callbacks.onLayoutComplete(l);
3459
+ }
3460
+ this.displayQueue = [];
3461
+ let r = 0, a = 0, c = 0, d = 0, u = !1;
3462
+ const f = /* @__PURE__ */ new Map(), m = () => {
3463
+ if (u || n !== this.loadGeneration || !this.callbacks.onGalleryReady) return;
3464
+ u = !0;
3465
+ const l = {
3466
+ totalImages: t.length,
3467
+ failedImages: c,
3468
+ loadDuration: d > 0 ? performance.now() - d : 0
3469
+ };
3470
+ this.callbacks.onGalleryReady(l);
3471
+ }, p = () => {
3472
+ r >= t.length && this.displayQueue.length === 0 && m();
3473
+ }, w = (l) => {
3474
+ this.containerEl && (this.containerEl.appendChild(l), this.imageElements.push(l), requestAnimationFrame(async () => {
3475
+ l.offsetWidth, l.style.opacity = this.defaultStyles.opacity ?? "1";
3476
+ const g = parseInt(l.dataset.imageId || "0"), h = this.imageLayouts[g], b = this.entryAnimationEngine.getTiming(), I = performance.now(), y = parseFloat(l.dataset.startX || "0"), E = parseFloat(l.dataset.startY || "0"), x = parseFloat(l.dataset.endX || "0"), F = parseFloat(l.dataset.endY || "0"), R = parseFloat(l.dataset.rotation || "0"), M = parseFloat(l.dataset.scale || "1"), T = parseFloat(l.dataset.startRotation || l.dataset.rotation || "0"), z = parseFloat(l.dataset.startScale || l.dataset.scale || "1"), k = parseFloat(l.dataset.imageWidth || "0"), D = parseFloat(l.dataset.imageHeight || "0");
3477
+ if (this.callbacks.onEntryStart && h) {
3478
+ const S = {
3479
+ element: l,
3480
+ index: g,
3481
+ totalImages: this.imageLayouts.length,
3482
+ layout: h,
3483
+ from: { x: y, y: E, rotation: T, scale: z },
3484
+ to: { x, y: F, rotation: R, scale: M },
3485
+ startTime: I,
3486
+ duration: b.duration
3487
+ };
3488
+ this.callbacks.onEntryStart(S);
3489
+ }
3490
+ if (this.entryAnimationEngine.requiresJSAnimation() || this.entryAnimationEngine.requiresJSRotation() || this.entryAnimationEngine.requiresJSScale() || l.dataset.startRotation !== l.dataset.rotation || l.dataset.startScale !== l.dataset.scale)
3447
3491
  he({
3448
3492
  element: l,
3449
- startPosition: d,
3450
- endPosition: g,
3493
+ startPosition: { x: y, y: E },
3494
+ endPosition: { x, y: F },
3451
3495
  pathConfig: this.entryAnimationEngine.getPathConfig(),
3452
- duration: v.duration,
3453
- imageWidth: p,
3454
- imageHeight: b,
3455
- rotation: f,
3456
- scale: m,
3496
+ duration: b.duration,
3497
+ imageWidth: k,
3498
+ imageHeight: D,
3499
+ rotation: R,
3500
+ scale: M,
3457
3501
  rotationConfig: this.entryAnimationEngine.getRotationConfig(),
3458
- startRotation: y,
3502
+ startRotation: T,
3459
3503
  scaleConfig: this.entryAnimationEngine.getScaleConfig(),
3460
- startScale: E
3504
+ startScale: z,
3505
+ onProgress: this.callbacks.onEntryProgress && h ? (S, P, _) => {
3506
+ const A = {
3507
+ element: l,
3508
+ index: g,
3509
+ totalImages: this.imageLayouts.length,
3510
+ layout: h,
3511
+ from: { x: y, y: E, rotation: T, scale: z },
3512
+ to: { x, y: F, rotation: R, scale: M },
3513
+ startTime: I,
3514
+ duration: b.duration,
3515
+ progress: S,
3516
+ rawProgress: S,
3517
+ elapsed: P,
3518
+ current: _
3519
+ };
3520
+ this.callbacks.onEntryProgress(A);
3521
+ } : void 0,
3522
+ onComplete: h ? () => {
3523
+ if (this.callbacks.onEntryComplete) {
3524
+ const S = {
3525
+ element: l,
3526
+ index: g,
3527
+ layout: h,
3528
+ startTime: I,
3529
+ endTime: performance.now(),
3530
+ duration: b.duration
3531
+ };
3532
+ this.callbacks.onEntryComplete(S);
3533
+ }
3534
+ } : void 0
3461
3535
  });
3462
- } else {
3463
- const d = l.dataset.finalTransform || "";
3464
- l.style.transform = d;
3536
+ else {
3537
+ const S = l.dataset.finalTransform || "";
3538
+ if (l.style.transform = S, this.callbacks.onEntryComplete && h) {
3539
+ const P = (_) => {
3540
+ if (_.propertyName !== "transform") return;
3541
+ l.removeEventListener("transitionend", P);
3542
+ const A = {
3543
+ element: l,
3544
+ index: g,
3545
+ layout: h,
3546
+ startTime: I,
3547
+ endTime: performance.now(),
3548
+ duration: b.duration
3549
+ };
3550
+ this.callbacks.onEntryComplete(A);
3551
+ };
3552
+ l.addEventListener("transitionend", P);
3553
+ }
3465
3554
  }
3466
- const h = parseInt(l.dataset.imageId || "0");
3467
- if (this.fullConfig.config.debug?.enabled && h < 3) {
3468
- const d = l.dataset.finalTransform || "";
3469
- console.log(`Image ${h} final state:`, {
3555
+ if (this.fullConfig.config.debug?.enabled && g < 3) {
3556
+ const S = l.dataset.finalTransform || "";
3557
+ console.log(`Image ${g} final state:`, {
3470
3558
  left: l.style.left,
3471
3559
  top: l.style.top,
3472
3560
  width: l.style.width,
3473
3561
  height: l.style.height,
3474
3562
  computedWidth: l.offsetWidth,
3475
3563
  computedHeight: l.offsetHeight,
3476
- transform: d,
3564
+ transform: S,
3477
3565
  pathType: this.entryAnimationEngine.getPathType()
3478
3566
  });
3479
3567
  }
3480
3568
  if (this.idleAnimationEngine) {
3481
- const d = this.entryAnimationEngine.getTiming().duration;
3482
- this.idleAnimationEngine.register(l, h, this.imageElements.length, d);
3569
+ const S = this.entryAnimationEngine.getTiming().duration;
3570
+ this.idleAnimationEngine.register(l, g, this.imageElements.length, S);
3483
3571
  }
3484
- }), r++);
3485
- }, c = () => {
3572
+ }), r++, p());
3573
+ }, v = () => {
3486
3574
  if (this.logDebug("Starting queue processing, enabled:", this.fullConfig.animation.queue.enabled), !this.fullConfig.animation.queue.enabled) {
3487
3575
  for (; this.displayQueue.length > 0; ) {
3488
3576
  const l = this.displayQueue.shift();
3489
- l && a(l);
3577
+ l && w(l);
3490
3578
  }
3491
3579
  return;
3492
3580
  }
@@ -3497,77 +3585,144 @@ class Qe {
3497
3585
  }
3498
3586
  if (this.displayQueue.length > 0) {
3499
3587
  const l = this.displayQueue.shift();
3500
- l && a(l);
3588
+ l && w(l);
3501
3589
  }
3502
- r >= t.length && this.displayQueue.length === 0 && this.queueInterval !== null && (clearInterval(this.queueInterval), this.queueInterval = null);
3590
+ r >= t.length && this.displayQueue.length === 0 && (this.queueInterval !== null && (clearInterval(this.queueInterval), this.queueInterval = null), m());
3503
3591
  }, this.fullConfig.animation.queue.interval);
3504
3592
  };
3505
3593
  if ("IntersectionObserver" in window && this.containerEl) {
3506
- const l = new IntersectionObserver((u) => {
3507
- u.forEach((h) => {
3508
- h.isIntersecting && (c(), l.disconnect());
3594
+ const l = new IntersectionObserver((g) => {
3595
+ g.forEach((h) => {
3596
+ h.isIntersecting && (v(), l.disconnect());
3509
3597
  });
3510
3598
  }, { threshold: 0.1, rootMargin: "50px" });
3511
3599
  l.observe(this.containerEl);
3512
3600
  } else
3513
- c();
3514
- this.fullConfig.config.debug?.centers && this.containerEl && (this.containerEl.querySelectorAll(".fbn-ic-debug-center").forEach((l) => l.remove()), s.forEach((l, u) => {
3601
+ v();
3602
+ this.fullConfig.config.debug?.centers && this.containerEl && (this.containerEl.querySelectorAll(".fbn-ic-debug-center").forEach((l) => l.remove()), s.forEach((l, g) => {
3515
3603
  const h = document.createElement("div");
3516
3604
  h.className = "fbn-ic-debug-center", h.style.position = "absolute", h.style.width = "12px", h.style.height = "12px", h.style.borderRadius = "50%", h.style.backgroundColor = "red", h.style.border = "2px solid yellow", h.style.zIndex = "9999", h.style.pointerEvents = "none";
3517
- const d = l.x, g = l.y;
3518
- h.style.left = `${d - 6}px`, h.style.top = `${g - 6}px`, h.title = `Image ${u}: center (${Math.round(d)}, ${Math.round(g)})`, this.containerEl.appendChild(h);
3519
- })), t.forEach((l, u) => {
3605
+ const b = l.x, I = l.y;
3606
+ h.style.left = `${b - 6}px`, h.style.top = `${I - 6}px`, h.title = `Image ${g}: center (${Math.round(b)}, ${Math.round(I)})`, this.containerEl.appendChild(h);
3607
+ })), t.forEach((l, g) => {
3520
3608
  const h = document.createElement("img");
3521
- h.referrerPolicy = "no-referrer", h.classList.add("fbn-ic-image"), this.fullConfig.interaction.dragging === !1 && (h.draggable = !1), h.dataset.imageId = String(u), h.dataset.createdFlag = "true";
3522
- const d = s[u];
3523
- h.style.position = "absolute", h.style.width = "auto", h.style.height = `${i}px`, h.style.left = `${d.x}px`, h.style.top = `${d.y}px`, d.zIndex && (h.style.zIndex = String(d.zIndex)), et(h, this.defaultClassName), h.addEventListener("mouseenter", () => {
3524
- if (this.hoveredImage = { element: h, layout: d }, !this.zoomEngine.isInvolved(h)) {
3525
- const g = h.cachedRenderedWidth;
3526
- st(h, this.fullConfig.styling?.hover, i, g), et(h, this.hoverClassName);
3609
+ h.referrerPolicy = "no-referrer", h.classList.add("fbn-ic-image"), this.fullConfig.interaction.dragging === !1 && (h.draggable = !1), h.dataset.imageId = String(g), h.dataset.createdFlag = "true";
3610
+ const b = s[g];
3611
+ h.style.position = "absolute", h.style.width = "auto", h.style.height = `${i}px`, h.style.left = `${b.x}px`, h.style.top = `${b.y}px`, b.zIndex && (h.style.zIndex = String(b.zIndex)), et(h, this.defaultClassName), h.addEventListener("mouseenter", () => {
3612
+ if (this.hoveredImage = { element: h, layout: b }, !this.zoomEngine.isInvolved(h)) {
3613
+ const y = h.cachedRenderedWidth;
3614
+ st(h, this.fullConfig.styling?.hover, i, y), et(h, this.hoverClassName);
3615
+ }
3616
+ if (this.callbacks.onImageHover) {
3617
+ const y = { element: h, index: g, url: l, layout: b };
3618
+ this.callbacks.onImageHover(y);
3527
3619
  }
3528
3620
  }), h.addEventListener("mouseleave", () => {
3529
3621
  if (this.hoveredImage = null, !this.zoomEngine.isInvolved(h)) {
3530
- const g = h.cachedRenderedWidth;
3531
- st(h, this.fullConfig.styling?.default, i, g), pt(h, this.hoverClassName), et(h, this.defaultClassName);
3622
+ const y = h.cachedRenderedWidth;
3623
+ st(h, this.fullConfig.styling?.default, i, y), pt(h, this.hoverClassName), et(h, this.defaultClassName);
3624
+ }
3625
+ if (this.callbacks.onImageUnhover) {
3626
+ const y = { element: h, index: g, url: l, layout: b };
3627
+ this.callbacks.onImageUnhover(y);
3532
3628
  }
3533
- }), h.addEventListener("click", (g) => {
3534
- g.stopPropagation(), this.handleImageClick(h, d);
3629
+ }), h.addEventListener("click", (y) => {
3630
+ y.stopPropagation(), this.handleImageClick(h, b);
3535
3631
  }), h.style.opacity = "0", h.style.transition = this.entryAnimationEngine.getTransitionCSS(), h.onload = () => {
3536
3632
  if (n !== this.loadGeneration)
3537
3633
  return;
3538
- const g = h.naturalWidth / h.naturalHeight, p = i * g;
3539
- h.dataset.onloadCalled = "true", window.DEBUG_CLIPPATH && console.log(`[onload #${u}] Called with imageHeight=${i}, renderedWidth=${p}`), h.style.width = `${p}px`, h.cachedRenderedWidth = p, h.aspectRatio = g, st(h, this.fullConfig.styling?.default, i, p);
3540
- const b = { x: d.x, y: d.y }, f = { width: p, height: i }, m = this.entryAnimationEngine.calculateStartPosition(
3541
- b,
3542
- f,
3634
+ const y = h.naturalWidth / h.naturalHeight, E = i * y;
3635
+ h.dataset.onloadCalled = "true", window.DEBUG_CLIPPATH && console.log(`[onload #${g}] Called with imageHeight=${i}, renderedWidth=${E}`), h.style.width = `${E}px`, h.cachedRenderedWidth = E, h.aspectRatio = y, st(h, this.fullConfig.styling?.default, i, E);
3636
+ const x = { x: b.x, y: b.y }, F = { width: E, height: i }, R = this.entryAnimationEngine.calculateStartPosition(
3637
+ x,
3638
+ F,
3543
3639
  e,
3544
- u,
3640
+ g,
3545
3641
  t.length
3546
- ), y = this.entryAnimationEngine.calculateStartRotation(d.rotation), E = this.entryAnimationEngine.calculateStartScale(d.scale), v = this.entryAnimationEngine.buildFinalTransform(
3547
- d.rotation,
3548
- d.scale,
3549
- p,
3642
+ ), M = this.entryAnimationEngine.calculateStartRotation(b.rotation), T = this.entryAnimationEngine.calculateStartScale(b.scale), z = this.entryAnimationEngine.buildFinalTransform(
3643
+ b.rotation,
3644
+ b.scale,
3645
+ E,
3550
3646
  i
3551
- ), S = this.entryAnimationEngine.buildStartTransform(
3552
- m,
3553
- b,
3554
- d.rotation,
3555
- d.scale,
3556
- p,
3647
+ ), k = this.entryAnimationEngine.buildStartTransform(
3648
+ R,
3649
+ x,
3650
+ b.rotation,
3651
+ b.scale,
3652
+ E,
3557
3653
  i,
3558
- y,
3559
- E
3654
+ M,
3655
+ T
3560
3656
  );
3561
- this.fullConfig.config.debug?.enabled && u < 3 && console.log(`Image ${u}:`, {
3562
- finalPosition: b,
3563
- imageSize: f,
3564
- left: d.x,
3565
- top: d.y,
3566
- finalTransform: v,
3567
- renderedWidth: p,
3657
+ if (this.fullConfig.config.debug?.enabled && g < 3 && console.log(`Image ${g}:`, {
3658
+ finalPosition: x,
3659
+ imageSize: F,
3660
+ left: b.x,
3661
+ top: b.y,
3662
+ finalTransform: z,
3663
+ renderedWidth: E,
3568
3664
  renderedHeight: i
3569
- }), h.style.transform = S, h.dataset.finalTransform = v, (this.entryAnimationEngine.requiresJSAnimation() || this.entryAnimationEngine.requiresJSRotation() || this.entryAnimationEngine.requiresJSScale() || y !== d.rotation || E !== d.scale) && (h.dataset.startX = String(m.x), h.dataset.startY = String(m.y), h.dataset.endX = String(b.x), h.dataset.endY = String(b.y), h.dataset.imageWidth = String(p), h.dataset.imageHeight = String(i), h.dataset.rotation = String(d.rotation), h.dataset.scale = String(d.scale), h.dataset.startRotation = String(y), h.dataset.startScale = String(E)), this.displayQueue.push(h);
3570
- }, h.onerror = () => r++, h.src = l;
3665
+ }), h.style.transform = k, h.dataset.finalTransform = z, h.dataset.startX = String(R.x), h.dataset.startY = String(R.y), h.dataset.endX = String(x.x), h.dataset.endY = String(x.y), h.dataset.imageWidth = String(E), h.dataset.imageHeight = String(i), h.dataset.rotation = String(b.rotation), h.dataset.scale = String(b.scale), h.dataset.startRotation = String(M), h.dataset.startScale = String(T), a++, this.callbacks.onImageLoaded) {
3666
+ const D = {
3667
+ element: h,
3668
+ url: l,
3669
+ index: g,
3670
+ totalImages: t.length,
3671
+ loadTime: performance.now() - (f.get(g) ?? performance.now())
3672
+ };
3673
+ this.callbacks.onImageLoaded(D);
3674
+ }
3675
+ if (this.callbacks.onLoadProgress) {
3676
+ const D = {
3677
+ loaded: a,
3678
+ failed: c,
3679
+ total: t.length,
3680
+ percent: (a + c) / t.length * 100
3681
+ };
3682
+ this.callbacks.onLoadProgress(D);
3683
+ }
3684
+ this.displayQueue.push(h);
3685
+ };
3686
+ const I = () => {
3687
+ if (n === this.loadGeneration) {
3688
+ if (c++, this.callbacks.onImageError) {
3689
+ const y = { url: l, index: g, totalImages: t.length };
3690
+ this.callbacks.onImageError(y);
3691
+ }
3692
+ if (this.callbacks.onLoadProgress) {
3693
+ const y = {
3694
+ loaded: a,
3695
+ failed: c,
3696
+ total: t.length,
3697
+ percent: (a + c) / t.length * 100
3698
+ };
3699
+ this.callbacks.onLoadProgress(y);
3700
+ }
3701
+ r++, p();
3702
+ }
3703
+ };
3704
+ h.onerror = () => I(), (async () => {
3705
+ let y = l;
3706
+ if (this.callbacks.onBeforeImageLoad) {
3707
+ const E = { url: l, index: g, totalImages: t.length }, x = await this.callbacks.onBeforeImageLoad(E);
3708
+ if (x)
3709
+ if (x.fetch !== void 0) {
3710
+ const F = x.url ?? l;
3711
+ try {
3712
+ const M = await (await fetch(F, x.fetch)).blob(), T = URL.createObjectURL(M);
3713
+ y = T;
3714
+ const z = h.onload;
3715
+ h.onload = (k) => {
3716
+ URL.revokeObjectURL(T), z?.call(h, k);
3717
+ };
3718
+ } catch {
3719
+ I();
3720
+ return;
3721
+ }
3722
+ } else x.url && (y = x.url);
3723
+ }
3724
+ d === 0 && (d = performance.now()), f.set(g, performance.now()), h.src = y;
3725
+ })();
3571
3726
  });
3572
3727
  }
3573
3728
  async handleImageClick(t, i) {
@@ -3581,7 +3736,15 @@ class Qe {
3581
3736
  else {
3582
3737
  this.idleAnimationEngine?.pauseForImage(t);
3583
3738
  const s = t.dataset.imageId;
3584
- this.currentFocusIndex = s !== void 0 ? parseInt(s, 10) : null, this.swipeEngine?.enable(), this.containerEl?.focus({ preventScroll: !0 }), await this.zoomEngine.focusImage(t, n, i), this.currentFocusIndex !== null && this.updateCounter(this.currentFocusIndex), this.showNavButtons(), this.showFocusIndicator();
3739
+ if (this.currentFocusIndex = s !== void 0 ? parseInt(s, 10) : null, this.swipeEngine?.enable(), this.containerEl?.focus({ preventScroll: !0 }), await this.zoomEngine.focusImage(t, n, i), this.currentFocusIndex !== null && this.updateCounter(this.currentFocusIndex), this.showNavButtons(), this.showFocusIndicator(), this.callbacks.onImageFocus && this.currentFocusIndex !== null) {
3740
+ const r = this.imageLoader.imageURLs(), a = {
3741
+ element: t,
3742
+ index: this.currentFocusIndex,
3743
+ url: r[this.currentFocusIndex] ?? "",
3744
+ layout: i
3745
+ };
3746
+ this.callbacks.onImageFocus(a);
3747
+ }
3585
3748
  }
3586
3749
  }
3587
3750
  /**
@@ -3624,7 +3787,7 @@ class Qe {
3624
3787
  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.prevButtonElAutoCreated && this.prevButtonEl && (this.prevButtonEl.remove(), this.prevButtonEl = null), this.nextButtonElAutoCreated && this.nextButtonEl && (this.nextButtonEl.remove(), this.nextButtonEl = null), this.resizeTimeout !== null && clearTimeout(this.resizeTimeout), this.swipeEngine?.destroy(), this.idleAnimationEngine?.stopAll(), this.idleAnimationEngine = null;
3625
3788
  }
3626
3789
  }
3627
- const It = class It extends HTMLElement {
3790
+ const St = class St extends HTMLElement {
3628
3791
  constructor() {
3629
3792
  super(...arguments), this._instance = null, this._container = null;
3630
3793
  }
@@ -3682,8 +3845,8 @@ const It = class It extends HTMLElement {
3682
3845
  this._instance?.destroy(), this._instance = null;
3683
3846
  }
3684
3847
  };
3685
- It.observedAttributes = ["config", "images", "layout"];
3686
- let yt = It;
3848
+ St.observedAttributes = ["config", "images", "layout"];
3849
+ let yt = St;
3687
3850
  typeof customElements < "u" && !customElements.get("image-cloud") && customElements.define("image-cloud", yt);
3688
3851
  export {
3689
3852
  yt as ImageCloudElement