@frybynite/image-cloud 0.7.4 → 0.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,14 +1,14 @@
1
- const mt = Object.freeze({
1
+ const ft = Object.freeze({
2
2
  none: "none",
3
3
  sm: "0 2px 4px rgba(0,0,0,0.1)",
4
4
  md: "0 4px 16px rgba(0,0,0,0.4)",
5
5
  lg: "0 8px 32px rgba(0,0,0,0.5)",
6
6
  glow: "0 0 30px rgba(255,255,255,0.6)"
7
- }), Et = Object.freeze({
7
+ }), St = Object.freeze({
8
8
  energetic: Object.freeze({ overshoot: 0.25, bounces: 2, decayRatio: 0.5 }),
9
9
  playful: Object.freeze({ overshoot: 0.15, bounces: 1, decayRatio: 0.5 }),
10
10
  subtle: Object.freeze({ overshoot: 0.08, bounces: 1, decayRatio: 0.5 })
11
- }), St = Object.freeze({
11
+ }), Rt = 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 }),
@@ -18,13 +18,13 @@ const mt = Object.freeze({
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 }),
20
20
  flutter: Object.freeze({ amplitude: 20, frequency: 4, decay: !0, decayRate: 0.5, phase: 0 })
21
- }), bt = Object.freeze({
22
- type: "linear"
23
21
  }), yt = Object.freeze({
24
- mode: "none"
22
+ type: "linear"
25
23
  }), vt = Object.freeze({
26
24
  mode: "none"
27
- }), Rt = Object.freeze({
25
+ }), wt = Object.freeze({
26
+ mode: "none"
27
+ }), Lt = Object.freeze({
28
28
  default: Object.freeze({
29
29
  border: Object.freeze({
30
30
  width: 0,
@@ -81,7 +81,7 @@ const mt = Object.freeze({
81
81
  }), Mt = Object.freeze({
82
82
  sizing: Ut,
83
83
  rotation: Ht
84
- }), Lt = Object.freeze({
84
+ }), Ft = Object.freeze({
85
85
  validateUrls: !0,
86
86
  validationTimeout: 5e3,
87
87
  validationMethod: "head",
@@ -95,7 +95,7 @@ const mt = Object.freeze({
95
95
  loaders: [],
96
96
  // Shared loader settings and debug config
97
97
  config: Object.freeze({
98
- loaders: Lt,
98
+ loaders: Ft,
99
99
  debug: zt
100
100
  }),
101
101
  // Image sizing and rotation configuration
@@ -161,9 +161,9 @@ const mt = Object.freeze({
161
161
  }),
162
162
  easing: "cubic-bezier(0.25, 1, 0.5, 1)",
163
163
  // smooth deceleration
164
- path: bt,
165
- rotation: yt,
166
- scale: vt
164
+ path: yt,
165
+ rotation: vt,
166
+ scale: wt
167
167
  })
168
168
  }),
169
169
  // Pattern-based interaction configuration
@@ -216,47 +216,47 @@ const mt = Object.freeze({
216
216
  })
217
217
  }),
218
218
  // Image styling
219
- styling: Rt
219
+ styling: Lt
220
220
  });
221
221
  function Z(n, t) {
222
222
  if (!n) return t || {};
223
223
  if (!t) return { ...n };
224
- const e = { ...n };
225
- return t.border !== void 0 && (e.border = { ...n.border, ...t.border }), t.borderTop !== void 0 && (e.borderTop = { ...n.borderTop, ...t.borderTop }), t.borderRight !== void 0 && (e.borderRight = { ...n.borderRight, ...t.borderRight }), t.borderBottom !== void 0 && (e.borderBottom = { ...n.borderBottom, ...t.borderBottom }), t.borderLeft !== void 0 && (e.borderLeft = { ...n.borderLeft, ...t.borderLeft }), t.filter !== void 0 && (e.filter = { ...n.filter, ...t.filter }), t.outline !== void 0 && (e.outline = { ...n.outline, ...t.outline }), t.shadow !== void 0 && (e.shadow = t.shadow), t.clipPath !== void 0 && (e.clipPath = t.clipPath), t.opacity !== void 0 && (e.opacity = t.opacity), t.cursor !== void 0 && (e.cursor = t.cursor), t.className !== void 0 && (e.className = t.className), t.objectFit !== void 0 && (e.objectFit = t.objectFit), t.aspectRatio !== void 0 && (e.aspectRatio = t.aspectRatio), t.borderRadiusTopLeft !== void 0 && (e.borderRadiusTopLeft = t.borderRadiusTopLeft), t.borderRadiusTopRight !== void 0 && (e.borderRadiusTopRight = t.borderRadiusTopRight), t.borderRadiusBottomRight !== void 0 && (e.borderRadiusBottomRight = t.borderRadiusBottomRight), t.borderRadiusBottomLeft !== void 0 && (e.borderRadiusBottomLeft = t.borderRadiusBottomLeft), e;
224
+ const i = { ...n };
225
+ return t.border !== void 0 && (i.border = { ...n.border, ...t.border }), t.borderTop !== void 0 && (i.borderTop = { ...n.borderTop, ...t.borderTop }), t.borderRight !== void 0 && (i.borderRight = { ...n.borderRight, ...t.borderRight }), t.borderBottom !== void 0 && (i.borderBottom = { ...n.borderBottom, ...t.borderBottom }), t.borderLeft !== void 0 && (i.borderLeft = { ...n.borderLeft, ...t.borderLeft }), t.filter !== void 0 && (i.filter = { ...n.filter, ...t.filter }), t.outline !== void 0 && (i.outline = { ...n.outline, ...t.outline }), t.shadow !== void 0 && (i.shadow = t.shadow), t.clipPath !== void 0 && (i.clipPath = t.clipPath), t.opacity !== void 0 && (i.opacity = t.opacity), t.cursor !== void 0 && (i.cursor = t.cursor), t.className !== void 0 && (i.className = t.className), t.objectFit !== void 0 && (i.objectFit = t.objectFit), t.aspectRatio !== void 0 && (i.aspectRatio = t.aspectRatio), t.borderRadiusTopLeft !== void 0 && (i.borderRadiusTopLeft = t.borderRadiusTopLeft), t.borderRadiusTopRight !== void 0 && (i.borderRadiusTopRight = t.borderRadiusTopRight), t.borderRadiusBottomRight !== void 0 && (i.borderRadiusBottomRight = t.borderRadiusBottomRight), t.borderRadiusBottomLeft !== void 0 && (i.borderRadiusBottomLeft = t.borderRadiusBottomLeft), i;
226
226
  }
227
227
  function Nt(n, t) {
228
228
  if (!t) return { ...n };
229
- const e = Z(n.default, t.default), i = Z(
230
- Z(e, n.hover),
229
+ const i = Z(n.default, t.default), e = Z(
230
+ Z(i, n.hover),
231
231
  t.hover
232
232
  ), o = Z(
233
- Z(e, n.focused),
233
+ Z(i, n.focused),
234
234
  t.focused
235
235
  );
236
236
  return {
237
- default: e,
238
- hover: i,
237
+ default: i,
238
+ hover: e,
239
239
  focused: o
240
240
  };
241
241
  }
242
242
  function jt(n, t) {
243
243
  if (!t) return { ...n };
244
- const e = { ...n };
245
- if (t.sizing !== void 0 && (e.sizing = {
244
+ const i = { ...n };
245
+ if (t.sizing !== void 0 && (i.sizing = {
246
246
  ...n.sizing,
247
247
  ...t.sizing
248
248
  }, t.sizing.variance)) {
249
- const i = t.sizing.variance, o = i.min !== void 0 && i.min >= 0.25 && i.min <= 1 ? i.min : n.sizing?.variance?.min ?? 1, s = i.max !== void 0 && i.max >= 1 && i.max <= 1.75 ? i.max : n.sizing?.variance?.max ?? 1;
250
- e.sizing.variance = { min: o, max: s };
249
+ const e = t.sizing.variance, o = e.min !== void 0 && e.min >= 0.25 && e.min <= 1 ? e.min : n.sizing?.variance?.min ?? 1, a = e.max !== void 0 && e.max >= 1 && e.max <= 1.75 ? e.max : n.sizing?.variance?.max ?? 1;
250
+ i.sizing.variance = { min: o, max: a };
251
251
  }
252
- if (t.rotation !== void 0 && (e.rotation = {
252
+ if (t.rotation !== void 0 && (i.rotation = {
253
253
  ...n.rotation,
254
254
  ...t.rotation
255
255
  }, t.rotation.range)) {
256
- const i = t.rotation.range, o = i.min !== void 0 && i.min >= -180 && i.min <= 0 ? i.min : n.rotation?.range?.min ?? -15, s = i.max !== void 0 && i.max >= 0 && i.max <= 180 ? i.max : n.rotation?.range?.max ?? 15;
257
- e.rotation.range = { min: o, max: s };
256
+ const e = t.rotation.range, o = e.min !== void 0 && e.min >= -180 && e.min <= 0 ? e.min : n.rotation?.range?.min ?? -15, a = e.max !== void 0 && e.max >= 0 && e.max <= 180 ? e.max : n.rotation?.range?.max ?? 15;
257
+ i.rotation.range = { min: o, max: a };
258
258
  }
259
- return e;
259
+ return i;
260
260
  }
261
261
  function kt(n) {
262
262
  const t = n.layout?.rotation;
@@ -280,13 +280,13 @@ function Wt(n) {
280
280
  };
281
281
  }
282
282
  function Gt(n = {}) {
283
- const t = kt(n), e = Wt(n);
284
- let i = n.image;
285
- (t || e) && (i = {
286
- ...e || {},
283
+ const t = kt(n), i = Wt(n);
284
+ let e = n.image;
285
+ (t || i) && (e = {
286
+ ...i || {},
287
287
  ...t || {},
288
- ...i
289
- }, i.rotation && t?.rotation && n.image?.rotation && (i.rotation = {
288
+ ...e
289
+ }, e.rotation && t?.rotation && n.image?.rotation && (e.rotation = {
290
290
  ...t.rotation,
291
291
  ...n.image.rotation
292
292
  }));
@@ -298,42 +298,42 @@ function Gt(n = {}) {
298
298
  });
299
299
  const r = {
300
300
  loaders: {
301
- ...Lt,
301
+ ...Ft,
302
302
  ...n.config?.loaders ?? {}
303
303
  }
304
- }, a = {
304
+ }, s = {
305
305
  loaders: o,
306
306
  config: r,
307
- image: jt(Mt, i),
307
+ image: jt(Mt, e),
308
308
  layout: { ...y.layout },
309
309
  animation: { ...y.animation },
310
310
  interaction: { ...y.interaction },
311
311
  rendering: { ...y.rendering },
312
- styling: Nt(Rt, n.styling)
312
+ styling: Nt(Lt, n.styling)
313
313
  };
314
- return n.layout && (a.layout = {
314
+ return n.layout && (s.layout = {
315
315
  ...y.layout,
316
316
  ...n.layout
317
- }, n.layout.responsive && (a.layout.responsive = {
317
+ }, n.layout.responsive && (s.layout.responsive = {
318
318
  ...y.layout.responsive,
319
319
  mobile: n.layout.responsive.mobile ? { ...y.layout.responsive.mobile, ...n.layout.responsive.mobile } : y.layout.responsive.mobile,
320
320
  tablet: n.layout.responsive.tablet ? { ...y.layout.responsive.tablet, ...n.layout.responsive.tablet } : y.layout.responsive.tablet
321
- }), n.layout.spacing && (a.layout.spacing = {
321
+ }), n.layout.spacing && (s.layout.spacing = {
322
322
  ...y.layout.spacing,
323
323
  ...n.layout.spacing
324
- })), n.animation && (a.animation = {
324
+ })), n.animation && (s.animation = {
325
325
  ...y.animation,
326
326
  ...n.animation
327
- }, n.animation.easing && (a.animation.easing = {
327
+ }, n.animation.easing && (s.animation.easing = {
328
328
  ...y.animation.easing,
329
329
  ...n.animation.easing
330
- }), n.animation.queue && (a.animation.queue = {
330
+ }), n.animation.queue && (s.animation.queue = {
331
331
  ...y.animation.queue,
332
332
  ...n.animation.queue
333
- }), n.animation.performance && (a.animation.performance = {
333
+ }), n.animation.performance && (s.animation.performance = {
334
334
  ...y.animation.performance,
335
335
  ...n.animation.performance
336
- }), n.animation.entry && (a.animation.entry = {
336
+ }), n.animation.entry && (s.animation.entry = {
337
337
  ...y.animation.entry,
338
338
  ...n.animation.entry,
339
339
  start: n.animation.entry.start ? {
@@ -342,50 +342,50 @@ function Gt(n = {}) {
342
342
  circular: n.animation.entry.start.circular ? { ...y.animation.entry.start.circular, ...n.animation.entry.start.circular } : y.animation.entry.start.circular
343
343
  } : y.animation.entry.start,
344
344
  timing: n.animation.entry.timing ? { ...y.animation.entry.timing, ...n.animation.entry.timing } : y.animation.entry.timing,
345
- path: n.animation.entry.path ? { ...bt, ...n.animation.entry.path } : y.animation.entry.path,
346
- rotation: n.animation.entry.rotation ? { ...yt, ...n.animation.entry.rotation } : y.animation.entry.rotation,
347
- scale: n.animation.entry.scale ? { ...vt, ...n.animation.entry.scale } : y.animation.entry.scale
348
- })), n.interaction && (a.interaction = {
345
+ path: n.animation.entry.path ? { ...yt, ...n.animation.entry.path } : y.animation.entry.path,
346
+ rotation: n.animation.entry.rotation ? { ...vt, ...n.animation.entry.rotation } : y.animation.entry.rotation,
347
+ scale: n.animation.entry.scale ? { ...wt, ...n.animation.entry.scale } : y.animation.entry.scale
348
+ })), n.interaction && (s.interaction = {
349
349
  ...y.interaction,
350
350
  ...n.interaction
351
- }, n.interaction.focus && (a.interaction.focus = {
351
+ }, n.interaction.focus && (s.interaction.focus = {
352
352
  ...y.interaction.focus,
353
353
  ...n.interaction.focus
354
- }), n.interaction.navigation && (a.interaction.navigation = {
354
+ }), n.interaction.navigation && (s.interaction.navigation = {
355
355
  ...y.interaction.navigation,
356
356
  ...n.interaction.navigation
357
- }), n.interaction.gestures && (a.interaction.gestures = {
357
+ }), n.interaction.gestures && (s.interaction.gestures = {
358
358
  ...y.interaction.gestures,
359
359
  ...n.interaction.gestures
360
- })), n.rendering && (a.rendering = {
360
+ })), n.rendering && (s.rendering = {
361
361
  ...y.rendering,
362
362
  ...n.rendering
363
- }, n.rendering.responsive && (a.rendering.responsive = {
363
+ }, n.rendering.responsive && (s.rendering.responsive = {
364
364
  ...y.rendering.responsive,
365
365
  ...n.rendering.responsive,
366
366
  breakpoints: n.rendering.responsive.breakpoints ? { ...y.rendering.responsive.breakpoints, ...n.rendering.responsive.breakpoints } : y.rendering.responsive.breakpoints,
367
367
  mobileDetection: n.rendering.responsive.mobileDetection ? n.rendering.responsive.mobileDetection : y.rendering.responsive.mobileDetection
368
- }), n.rendering.ui && (a.rendering.ui = {
368
+ }), n.rendering.ui && (s.rendering.ui = {
369
369
  ...y.rendering.ui,
370
370
  ...n.rendering.ui
371
- }), n.rendering.performance && (a.rendering.performance = {
371
+ }), n.rendering.performance && (s.rendering.performance = {
372
372
  ...y.rendering.performance,
373
373
  ...n.rendering.performance
374
- })), a.config.debug = {
374
+ })), s.config.debug = {
375
375
  ...zt,
376
376
  ...n.config?.debug ?? {}
377
- }, a;
377
+ }, s;
378
378
  }
379
379
  function qt(n, t) {
380
- return { ...n ? Et[n] : Et.playful, ...t };
380
+ return { ...n ? St[n] : St.playful, ...t };
381
381
  }
382
- function Yt(n, t) {
383
- return { ...n ? St[n] : St.gentle, ...t };
382
+ function Bt(n, t) {
383
+ return { ...n ? Rt[n] : Rt.gentle, ...t };
384
384
  }
385
- function Xt(n, t) {
385
+ function Yt(n, t) {
386
386
  return { ...n ? It[n] : It.gentle, ...t };
387
387
  }
388
- class Bt {
388
+ class Xt {
389
389
  constructor(t) {
390
390
  this.activeAnimations = /* @__PURE__ */ new Map(), this.animationIdCounter = 0, this.config = t;
391
391
  }
@@ -394,12 +394,12 @@ class Bt {
394
394
  * Always starts with centering transform to match image positioning system
395
395
  */
396
396
  buildTransformString(t) {
397
- const e = ["translate(-50%, -50%)"];
397
+ const i = ["translate(-50%, -50%)"];
398
398
  if (t.x !== void 0 || t.y !== void 0) {
399
- const i = t.x ?? 0, o = t.y ?? 0;
400
- e.push(`translate(${i}px, ${o}px)`);
399
+ const e = t.x ?? 0, o = t.y ?? 0;
400
+ i.push(`translate(${e}px, ${o}px)`);
401
401
  }
402
- return t.rotation !== void 0 && e.push(`rotate(${t.rotation}deg)`), t.scale !== void 0 && e.push(`scale(${t.scale})`), e.join(" ");
402
+ return t.rotation !== void 0 && i.push(`rotate(${t.rotation}deg)`), t.scale !== void 0 && i.push(`scale(${t.scale})`), i.join(" ");
403
403
  }
404
404
  /**
405
405
  * Start a cancellable transform animation using Web Animations API
@@ -410,31 +410,31 @@ class Bt {
410
410
  * @param easing - CSS easing function (optional)
411
411
  * @returns AnimationHandle that can be used to cancel or query the animation
412
412
  */
413
- animateTransformCancellable(t, e, i, o = null, s = null) {
413
+ animateTransformCancellable(t, i, e, o = null, a = null) {
414
414
  this.cancelAllAnimations(t);
415
- const r = o ?? this.config.duration, a = s ?? this.config.easing.default, h = this.buildTransformString(e), c = this.buildTransformString(i);
415
+ const r = o ?? this.config.duration, s = a ?? this.config.easing.default, h = this.buildTransformString(i), c = this.buildTransformString(e);
416
416
  t.style.transition = "none";
417
- const u = t.animate(
417
+ const d = t.animate(
418
418
  [
419
419
  { transform: h },
420
420
  { transform: c }
421
421
  ],
422
422
  {
423
423
  duration: r,
424
- easing: a,
424
+ easing: s,
425
425
  fill: "forwards"
426
426
  // Keep final state after animation
427
427
  }
428
428
  ), l = {
429
429
  id: `anim-${++this.animationIdCounter}`,
430
430
  element: t,
431
- animation: u,
432
- fromState: e,
433
- toState: i,
431
+ animation: d,
432
+ fromState: i,
433
+ toState: e,
434
434
  startTime: performance.now(),
435
435
  duration: r
436
436
  };
437
- return this.activeAnimations.set(t, l), u.finished.then(() => {
437
+ return this.activeAnimations.set(t, l), d.finished.then(() => {
438
438
  t.style.transform = c, this.activeAnimations.delete(t);
439
439
  }).catch(() => {
440
440
  this.activeAnimations.delete(t);
@@ -446,18 +446,18 @@ class Bt {
446
446
  * @param commitStyle - If true, keeps current position; if false, no style change
447
447
  * @returns Snapshot of where the animation was when cancelled
448
448
  */
449
- cancelAnimation(t, e = !0) {
450
- const i = this.getCurrentTransform(t.element);
451
- if (t.animation.cancel(), e) {
449
+ cancelAnimation(t, i = !0) {
450
+ const e = this.getCurrentTransform(t.element);
451
+ if (t.animation.cancel(), i) {
452
452
  const o = this.buildTransformString({
453
- x: i.x,
454
- y: i.y,
455
- rotation: i.rotation,
456
- scale: i.scale
453
+ x: e.x,
454
+ y: e.y,
455
+ rotation: e.rotation,
456
+ scale: e.scale
457
457
  });
458
458
  t.element.style.transform = o;
459
459
  }
460
- return this.activeAnimations.delete(t.element), i;
460
+ return this.activeAnimations.delete(t.element), e;
461
461
  }
462
462
  /**
463
463
  * Cancel all animations on an element
@@ -465,10 +465,10 @@ class Bt {
465
465
  * @param element - The element to cancel animations for
466
466
  */
467
467
  cancelAllAnimations(t) {
468
- const e = this.activeAnimations.get(t);
469
- e && this.cancelAnimation(e, !1);
470
- const i = t.getAnimations();
471
- for (const o of i)
468
+ const i = this.activeAnimations.get(t);
469
+ i && this.cancelAnimation(i, !1);
470
+ const e = t.getAnimations();
471
+ for (const o of e)
472
472
  o.cancel();
473
473
  }
474
474
  /**
@@ -478,11 +478,11 @@ class Bt {
478
478
  * @returns Current transform snapshot
479
479
  */
480
480
  getCurrentTransform(t) {
481
- const i = getComputedStyle(t).transform;
482
- if (i === "none" || !i)
481
+ const e = getComputedStyle(t).transform;
482
+ if (e === "none" || !e)
483
483
  return { x: 0, y: 0, rotation: 0, scale: 1 };
484
- const o = new DOMMatrix(i), s = Math.sqrt(o.a * o.a + o.b * o.b), r = Math.atan2(o.b, o.a) * (180 / Math.PI), a = o.e, h = o.f;
485
- return { x: a, y: h, rotation: r, scale: s };
484
+ const o = new DOMMatrix(e), a = Math.sqrt(o.a * o.a + o.b * o.b), r = Math.atan2(o.b, o.a) * (180 / Math.PI), s = o.e, h = o.f;
485
+ return { x: s, y: h, rotation: r, scale: a };
486
486
  }
487
487
  /**
488
488
  * Check if an element has an active animation
@@ -508,11 +508,11 @@ class Bt {
508
508
  * @param easing - CSS easing function (optional)
509
509
  * @returns Promise that resolves when animation completes
510
510
  */
511
- animateTransform(t, e, i = null, o = null) {
512
- return new Promise((s) => {
513
- const r = i ?? this.config.duration, a = o ?? this.config.easing.default;
514
- t.style.transition = `transform ${r}ms ${a}, box-shadow ${r}ms ${a}`, t.style.transform = this.buildTransformString(e), setTimeout(() => {
515
- s();
511
+ animateTransform(t, i, e = null, o = null) {
512
+ return new Promise((a) => {
513
+ const r = e ?? this.config.duration, s = o ?? this.config.easing.default;
514
+ t.style.transition = `transform ${r}ms ${s}, box-shadow ${r}ms ${s}`, t.style.transform = this.buildTransformString(i), setTimeout(() => {
515
+ a();
516
516
  }, r);
517
517
  });
518
518
  }
@@ -522,8 +522,8 @@ class Bt {
522
522
  * @param originalState - Original transform state {x, y, rotation, scale}
523
523
  * @returns Promise that resolves when animation completes
524
524
  */
525
- resetTransform(t, e) {
526
- return this.animateTransform(t, e);
525
+ resetTransform(t, i) {
526
+ return this.animateTransform(t, i);
527
527
  }
528
528
  /**
529
529
  * Remove transition styles from element
@@ -538,92 +538,92 @@ class Bt {
538
538
  * @returns Promise that resolves after the specified duration
539
539
  */
540
540
  wait(t) {
541
- return new Promise((e) => setTimeout(e, t));
541
+ return new Promise((i) => setTimeout(i, t));
542
542
  }
543
543
  }
544
- function V(n, t, e) {
545
- return n + (t - n) * e;
544
+ function V(n, t, i) {
545
+ return n + (t - n) * i;
546
546
  }
547
- function Jt(n, t, e, i) {
548
- const { overshoot: o, bounces: s, decayRatio: r } = i, a = e.x - t.x, h = e.y - t.y, c = Vt(s, r);
549
- let u = 0, l = 0, d = 1, m = o, b = !1;
550
- for (let g = 0; g < c.length; g++)
551
- if (n <= c[g].time) {
552
- l = g === 0 ? 0 : c[g - 1].time, d = c[g].time, m = c[g].overshoot, b = c[g].isOvershoot;
547
+ function Jt(n, t, i, e) {
548
+ const { overshoot: o, bounces: a, decayRatio: r } = e, s = i.x - t.x, h = i.y - t.y, c = Vt(a, r);
549
+ let d = 0, l = 0, u = 1, g = o, p = !1;
550
+ for (let f = 0; f < c.length; f++)
551
+ if (n <= c[f].time) {
552
+ l = f === 0 ? 0 : c[f - 1].time, u = c[f].time, g = c[f].overshoot, p = c[f].isOvershoot;
553
553
  break;
554
554
  }
555
- const p = (n - l) / (d - l);
556
- if (b)
557
- u = 1 + m * ot(p);
555
+ const b = (n - l) / (u - l);
556
+ if (p)
557
+ d = 1 + g * nt(b);
558
558
  else if (l === 0)
559
- u = ot(p);
559
+ d = nt(b);
560
560
  else {
561
- const f = 1 + (c.find(
561
+ const m = 1 + (c.find(
562
562
  (E, v) => E.time > l && v > 0 && c[v - 1].isOvershoot
563
- )?.overshoot || m);
564
- u = V(f, 1, ot(p));
563
+ )?.overshoot || g);
564
+ d = V(m, 1, nt(b));
565
565
  }
566
566
  return {
567
- x: t.x + a * u,
568
- y: t.y + h * u
567
+ x: t.x + s * d,
568
+ y: t.y + h * d
569
569
  };
570
570
  }
571
571
  function Vt(n, t) {
572
- const e = [];
573
- let i = 0.6;
574
- e.push({ time: i, overshoot: 0, isOvershoot: !1 });
572
+ const i = [];
573
+ let e = 0.6;
574
+ i.push({ time: e, overshoot: 0, isOvershoot: !1 });
575
575
  let o = 0.15;
576
576
  const r = 0.4 / (n * 2);
577
- for (let a = 0; a < n; a++)
578
- i += r, e.push({ time: i, overshoot: o, isOvershoot: !0 }), i += r, e.push({ time: i, overshoot: o * t, isOvershoot: !1 }), o *= t;
579
- return e.push({ time: 1, overshoot: 0, isOvershoot: !1 }), e;
577
+ for (let s = 0; s < n; s++)
578
+ e += r, i.push({ time: e, overshoot: o, isOvershoot: !0 }), e += r, i.push({ time: e, overshoot: o * t, isOvershoot: !1 }), o *= t;
579
+ return i.push({ time: 1, overshoot: 0, isOvershoot: !1 }), i;
580
580
  }
581
- function Kt(n, t, e, i) {
582
- const { stiffness: o, damping: s, mass: r, oscillations: a } = i, h = e.x - t.x, c = e.y - t.y, u = Math.sqrt(o / r), l = s / (2 * Math.sqrt(o * r));
583
- let d;
581
+ function Kt(n, t, i, e) {
582
+ const { stiffness: o, damping: a, mass: r, oscillations: s } = e, h = i.x - t.x, c = i.y - t.y, d = Math.sqrt(o / r), l = a / (2 * Math.sqrt(o * r));
583
+ let u;
584
584
  if (l < 1) {
585
- const m = u * Math.sqrt(1 - l * l), b = Math.exp(-l * u * n * 3), p = Math.cos(m * n * a * Math.PI);
586
- d = 1 - b * p;
585
+ const g = d * Math.sqrt(1 - l * l), p = Math.exp(-l * d * n * 3), b = Math.cos(g * n * s * Math.PI);
586
+ u = 1 - p * b;
587
587
  } else
588
- d = 1 - Math.exp(-u * n * 3);
589
- return d = Math.max(0, Math.min(d, 1.3)), {
590
- x: t.x + h * d,
591
- y: t.y + c * d
588
+ u = 1 - Math.exp(-d * n * 3);
589
+ return u = Math.max(0, Math.min(u, 1.3)), {
590
+ x: t.x + h * u,
591
+ y: t.y + c * u
592
592
  };
593
593
  }
594
- function Zt(n, t, e, i) {
595
- const { amplitude: o, frequency: s, decay: r, decayRate: a, phase: h } = i, c = e.x - t.x, u = e.y - t.y, l = Math.sqrt(c * c + u * u), d = l > 0 ? -u / l : 0, m = l > 0 ? c / l : 1, b = s * Math.PI * 2 * n + h, p = r ? Math.pow(1 - n, a) : 1, g = o * Math.sin(b) * p, f = Qt(n);
594
+ function Zt(n, t, i, e) {
595
+ const { amplitude: o, frequency: a, decay: r, decayRate: s, phase: h } = e, c = i.x - t.x, d = i.y - t.y, l = Math.sqrt(c * c + d * d), u = l > 0 ? -d / l : 0, g = l > 0 ? c / l : 1, p = a * Math.PI * 2 * n + h, b = r ? Math.pow(1 - n, s) : 1, f = o * Math.sin(p) * b, m = Qt(n);
596
596
  return {
597
- x: V(t.x, e.x, f) + g * d,
598
- y: V(t.y, e.y, f) + g * m
597
+ x: V(t.x, i.x, m) + f * u,
598
+ y: V(t.y, i.y, m) + f * g
599
599
  };
600
600
  }
601
- function ot(n) {
601
+ function nt(n) {
602
602
  return 1 - (1 - n) * (1 - n);
603
603
  }
604
604
  function Qt(n) {
605
605
  return 1 - Math.pow(1 - n, 3);
606
606
  }
607
- function te(n, t, e) {
608
- const { amplitude: i, frequency: o, decay: s } = e, r = Math.sin(n * o * Math.PI * 2), a = s ? Math.pow(1 - n, 2) : 1, h = i * r * a;
607
+ function te(n, t, i) {
608
+ const { amplitude: e, frequency: o, decay: a } = i, r = Math.sin(n * o * Math.PI * 2), s = a ? Math.pow(1 - n, 2) : 1, h = e * r * s;
609
609
  return t + h;
610
610
  }
611
- function ee(n, t, e) {
612
- const { overshoot: i, bounces: o } = e, s = [];
613
- s.push({ time: 0.5, scale: i });
614
- let r = i;
615
- const a = 0.5, c = 0.5 / (o * 2);
616
- let u = 0.5;
617
- for (let d = 0; d < o; d++) {
618
- const m = 1 - (r - 1) * a;
619
- u += c, s.push({ time: u, scale: m }), r = 1 + (r - 1) * a * a, u += c, d < o - 1 && s.push({ time: u, scale: r });
620
- }
621
- s.push({ time: 1, scale: 1 });
611
+ function ee(n, t, i) {
612
+ const { overshoot: e, bounces: o } = i, a = [];
613
+ a.push({ time: 0.5, scale: e });
614
+ let r = e;
615
+ const s = 0.5, c = 0.5 / (o * 2);
616
+ let d = 0.5;
617
+ for (let u = 0; u < o; u++) {
618
+ const g = 1 - (r - 1) * s;
619
+ d += c, a.push({ time: d, scale: g }), r = 1 + (r - 1) * s * s, d += c, u < o - 1 && a.push({ time: d, scale: r });
620
+ }
621
+ a.push({ time: 1, scale: 1 });
622
622
  let l = 1;
623
- for (let d = 0; d < s.length; d++)
624
- if (n <= s[d].time) {
625
- const m = d === 0 ? 0 : s[d - 1].time, b = d === 0 ? 1 : s[d - 1].scale, p = (n - m) / (s[d].time - m), g = ot(p);
626
- l = b + (s[d].scale - b) * g;
623
+ for (let u = 0; u < a.length; u++)
624
+ if (n <= a[u].time) {
625
+ const g = u === 0 ? 0 : a[u - 1].time, p = u === 0 ? 1 : a[u - 1].scale, b = (n - g) / (a[u].time - g), f = nt(b);
626
+ l = p + (a[u].scale - p) * f;
627
627
  break;
628
628
  }
629
629
  return l * t;
@@ -631,64 +631,64 @@ function ee(n, t, e) {
631
631
  function ie(n) {
632
632
  const {
633
633
  element: t,
634
- startPosition: e,
635
- endPosition: i,
634
+ startPosition: i,
635
+ endPosition: e,
636
636
  pathConfig: o,
637
- duration: s,
637
+ duration: a,
638
638
  imageWidth: r,
639
- imageHeight: a,
639
+ imageHeight: s,
640
640
  rotation: h,
641
641
  scale: c,
642
- onComplete: u,
642
+ onComplete: d,
643
643
  rotationConfig: l,
644
- startRotation: d,
645
- scaleConfig: m,
646
- startScale: b
647
- } = n, p = o.type, g = d !== void 0 && d !== h, f = l?.mode === "wobble", E = l?.wobble || { amplitude: 15, frequency: 3, decay: !0 }, v = g || f, w = b !== void 0 && b !== c, S = m?.mode === "pop", x = m?.pop || { overshoot: 1.2, bounces: 1 };
648
- if ((p === "linear" || p === "arc") && !v && !(w || S)) {
649
- u && u();
644
+ startRotation: u,
645
+ scaleConfig: g,
646
+ startScale: p
647
+ } = n, b = o.type, f = u !== void 0 && u !== h, m = l?.mode === "wobble", E = l?.wobble || { amplitude: 15, frequency: 3, decay: !0 }, v = f || m, w = p !== void 0 && p !== c, S = g?.mode === "pop", x = g?.pop || { overshoot: 1.2, bounces: 1 };
648
+ if ((b === "linear" || b === "arc") && !v && !(w || S)) {
649
+ d && d();
650
650
  return;
651
651
  }
652
- const L = performance.now(), z = -r / 2, _ = -a / 2;
653
- function U(Y) {
654
- const N = Y - L, T = Math.min(N / s, 1);
652
+ const M = performance.now(), F = -r / 2, _ = -s / 2;
653
+ function U(B) {
654
+ const N = B - M, T = Math.min(N / a, 1);
655
655
  let O;
656
- switch (p) {
656
+ switch (b) {
657
657
  case "bounce": {
658
- const D = qt(
658
+ const $ = qt(
659
659
  o.bouncePreset,
660
660
  o.bounce
661
661
  );
662
- O = Jt(T, e, i, D);
662
+ O = Jt(T, i, e, $);
663
663
  break;
664
664
  }
665
665
  case "elastic": {
666
- const D = Yt(
666
+ const $ = Bt(
667
667
  o.elasticPreset,
668
668
  o.elastic
669
669
  );
670
- O = Kt(T, e, i, D);
670
+ O = Kt(T, i, e, $);
671
671
  break;
672
672
  }
673
673
  case "wave": {
674
- const D = Xt(
674
+ const $ = Yt(
675
675
  o.wavePreset,
676
676
  o.wave
677
677
  );
678
- O = Zt(T, e, i, D);
678
+ O = Zt(T, i, e, $);
679
679
  break;
680
680
  }
681
681
  default:
682
682
  O = {
683
- x: V(e.x, i.x, T),
684
- y: V(e.y, i.y, T)
683
+ x: V(i.x, e.x, T),
684
+ y: V(i.y, e.y, T)
685
685
  };
686
686
  }
687
- const k = O.x - i.x, H = O.y - i.y;
688
- let R;
689
- f ? R = te(T, h, E) : g ? R = V(d, h, T) : R = h;
687
+ const k = O.x - e.x, H = O.y - e.y;
690
688
  let C;
691
- S ? C = ee(T, c, x) : w ? C = V(b, c, T) : C = c, t.style.transform = `translate(${z}px, ${_}px) translate(${k}px, ${H}px) rotate(${R}deg) scale(${C})`, T < 1 ? requestAnimationFrame(U) : (t.style.transform = `translate(${z}px, ${_}px) rotate(${h}deg) scale(${c})`, u && u());
689
+ m ? C = te(T, h, E) : f ? C = V(u, h, T) : C = h;
690
+ let A;
691
+ S ? A = ee(T, c, x) : w ? A = V(p, c, T) : A = c, t.style.transform = `translate(${F}px, ${_}px) translate(${k}px, ${H}px) rotate(${C}deg) scale(${A})`, T < 1 ? requestAnimationFrame(U) : (t.style.transform = `translate(${F}px, ${_}px) rotate(${h}deg) scale(${c})`, d && d());
692
692
  }
693
693
  requestAnimationFrame(U);
694
694
  }
@@ -704,8 +704,8 @@ const oe = {
704
704
  wave: "left"
705
705
  };
706
706
  class se {
707
- constructor(t, e) {
708
- this.config = t, this.layoutAlgorithm = e, this.resolvedStartPosition = this.resolveStartPosition(), this.pathConfig = t.path || bt, this.rotationConfig = t.rotation || yt, this.scaleConfig = t.scale || vt;
707
+ constructor(t, i) {
708
+ this.config = t, this.layoutAlgorithm = i, this.resolvedStartPosition = this.resolveStartPosition(), this.pathConfig = t.path || yt, this.rotationConfig = t.rotation || vt, this.scaleConfig = t.scale || wt;
709
709
  }
710
710
  /**
711
711
  * Get the effective start position, considering layout-aware defaults
@@ -716,72 +716,72 @@ class se {
716
716
  /**
717
717
  * Calculate the starting position for an image's entry animation
718
718
  */
719
- calculateStartPosition(t, e, i, o, s) {
720
- const r = this.resolvedStartPosition, a = this.config.start.offset ?? 100;
719
+ calculateStartPosition(t, i, e, o, a) {
720
+ const r = this.resolvedStartPosition, s = this.config.start.offset ?? 100;
721
721
  switch (r) {
722
722
  case "nearest-edge":
723
- return this.calculateNearestEdge(t, e, i, a);
723
+ return this.calculateNearestEdge(t, i, e, s);
724
724
  case "top":
725
- return this.calculateEdgePosition("top", t, e, i, a);
725
+ return this.calculateEdgePosition("top", t, i, e, s);
726
726
  case "bottom":
727
- return this.calculateEdgePosition("bottom", t, e, i, a);
727
+ return this.calculateEdgePosition("bottom", t, i, e, s);
728
728
  case "left":
729
- return this.calculateEdgePosition("left", t, e, i, a);
729
+ return this.calculateEdgePosition("left", t, i, e, s);
730
730
  case "right":
731
- return this.calculateEdgePosition("right", t, e, i, a);
731
+ return this.calculateEdgePosition("right", t, i, e, s);
732
732
  case "center":
733
- return this.calculateCenterPosition(i, t, e);
733
+ return this.calculateCenterPosition(e, t, i);
734
734
  case "random-edge":
735
- return this.calculateRandomEdge(t, e, i, a);
735
+ return this.calculateRandomEdge(t, i, e, s);
736
736
  case "circular":
737
737
  return this.calculateCircularPosition(
738
738
  t,
739
- e,
740
739
  i,
740
+ e,
741
741
  o,
742
- s
742
+ a
743
743
  );
744
744
  default:
745
- return this.calculateNearestEdge(t, e, i, a);
745
+ return this.calculateNearestEdge(t, i, e, s);
746
746
  }
747
747
  }
748
748
  /**
749
749
  * Calculate start position from the nearest edge (current default behavior)
750
750
  */
751
- calculateNearestEdge(t, e, i, o) {
752
- const s = t.x, r = t.y, a = s, h = i.width - s, c = r, u = i.height - r, l = Math.min(a, h, c, u);
753
- let d = t.x, m = t.y;
754
- return l === a ? d = -(e.width + o) : l === h ? d = i.width + o : l === c ? m = -(e.height + o) : m = i.height + o, { x: d, y: m };
751
+ calculateNearestEdge(t, i, e, o) {
752
+ const a = t.x, r = t.y, s = a, h = e.width - a, c = r, d = e.height - r, l = Math.min(s, h, c, d);
753
+ let u = t.x, g = t.y;
754
+ return l === s ? u = -(i.width + o) : l === h ? u = e.width + o : l === c ? g = -(i.height + o) : g = e.height + o, { x: u, y: g };
755
755
  }
756
756
  /**
757
757
  * Calculate start position from a specific edge
758
758
  */
759
- calculateEdgePosition(t, e, i, o, s) {
760
- let r = e.x, a = e.y;
759
+ calculateEdgePosition(t, i, e, o, a) {
760
+ let r = i.x, s = i.y;
761
761
  switch (t) {
762
762
  case "top":
763
- a = -(i.height + s);
763
+ s = -(e.height + a);
764
764
  break;
765
765
  case "bottom":
766
- a = o.height + s;
766
+ s = o.height + a;
767
767
  break;
768
768
  case "left":
769
- r = -(i.width + s);
769
+ r = -(e.width + a);
770
770
  break;
771
771
  case "right":
772
- r = o.width + s;
772
+ r = o.width + a;
773
773
  break;
774
774
  }
775
- return { x: r, y: a };
775
+ return { x: r, y: s };
776
776
  }
777
777
  /**
778
778
  * Calculate start position from center with scale animation
779
779
  */
780
- calculateCenterPosition(t, e, i) {
781
- const o = t.width / 2, s = t.height / 2;
780
+ calculateCenterPosition(t, i, e) {
781
+ const o = t.width / 2, a = t.height / 2;
782
782
  return {
783
783
  x: o,
784
- y: s,
784
+ y: a,
785
785
  useScale: !0
786
786
  // Signal to use scale animation from 0
787
787
  };
@@ -789,68 +789,68 @@ class se {
789
789
  /**
790
790
  * Calculate start position from a random edge
791
791
  */
792
- calculateRandomEdge(t, e, i, o) {
793
- const s = ["top", "bottom", "left", "right"], r = s[Math.floor(Math.random() * s.length)];
794
- return this.calculateEdgePosition(r, t, e, i, o);
792
+ calculateRandomEdge(t, i, e, o) {
793
+ const a = ["top", "bottom", "left", "right"], r = a[Math.floor(Math.random() * a.length)];
794
+ return this.calculateEdgePosition(r, t, i, e, o);
795
795
  }
796
796
  /**
797
797
  * Calculate start position on a circle around the container
798
798
  */
799
- calculateCircularPosition(t, e, i, o, s) {
800
- const r = this.config.start.circular || {}, a = r.distribution || "even";
799
+ calculateCircularPosition(t, i, e, o, a) {
800
+ const r = this.config.start.circular || {}, s = r.distribution || "even";
801
801
  let h;
802
802
  const c = r.radius || "120%";
803
803
  if (typeof c == "string" && c.endsWith("%")) {
804
- const p = parseFloat(c) / 100;
804
+ const b = parseFloat(c) / 100;
805
805
  h = Math.sqrt(
806
- i.width ** 2 + i.height ** 2
807
- ) * p / 2;
806
+ e.width ** 2 + e.height ** 2
807
+ ) * b / 2;
808
808
  } else
809
809
  h = typeof c == "number" ? c : 500;
810
- let u;
811
- a === "even" ? u = o / s * 2 * Math.PI : u = Math.random() * 2 * Math.PI;
812
- const l = i.width / 2, d = i.height / 2, m = l + Math.cos(u) * h, b = d + Math.sin(u) * h;
813
- return { x: m, y: b };
810
+ let d;
811
+ s === "even" ? d = o / a * 2 * Math.PI : d = Math.random() * 2 * Math.PI;
812
+ const l = e.width / 2, u = e.height / 2, g = l + Math.cos(d) * h, p = u + Math.sin(d) * h;
813
+ return { x: g, y: p };
814
814
  }
815
815
  /**
816
816
  * Get animation parameters for an image
817
817
  */
818
818
  getAnimationParams(t) {
819
- const e = this.config.timing.duration, i = this.config.easing;
819
+ const i = this.config.timing.duration, e = this.config.easing;
820
820
  return {
821
821
  startTransform: "",
822
822
  // Will be computed by caller based on start position
823
- duration: e,
823
+ duration: i,
824
824
  delay: 0,
825
- easing: i
825
+ easing: e
826
826
  };
827
827
  }
828
828
  /**
829
829
  * Build a CSS transform string for the start position
830
830
  * Uses pixel-based centering offset for reliable cross-browser behavior
831
831
  */
832
- buildStartTransform(t, e, i, o, s, r, a, h) {
833
- const c = t.x - e.x, u = t.y - e.y, l = a !== void 0 ? a : i, d = h !== void 0 ? h : o, m = s !== void 0 ? -s / 2 : 0, b = r !== void 0 ? -r / 2 : 0, p = s !== void 0 ? `translate(${m}px, ${b}px)` : "translate(-50%, -50%)";
834
- return t.useScale ? `${p} translate(${c}px, ${u}px) rotate(${l}deg) scale(0)` : `${p} translate(${c}px, ${u}px) rotate(${l}deg) scale(${d})`;
832
+ buildStartTransform(t, i, e, o, a, r, s, h) {
833
+ const c = t.x - i.x, d = t.y - i.y, l = s !== void 0 ? s : e, u = h !== void 0 ? h : o, g = a !== void 0 ? -a / 2 : 0, p = r !== void 0 ? -r / 2 : 0, b = a !== void 0 ? `translate(${g}px, ${p}px)` : "translate(-50%, -50%)";
834
+ return t.useScale ? `${b} translate(${c}px, ${d}px) rotate(${l}deg) scale(0)` : `${b} translate(${c}px, ${d}px) rotate(${l}deg) scale(${u})`;
835
835
  }
836
836
  /**
837
837
  * Build the final CSS transform string
838
838
  * Uses pixel-based centering offset for reliable cross-browser behavior
839
839
  */
840
- buildFinalTransform(t, e, i, o) {
841
- if (i !== void 0 && o !== void 0) {
842
- const s = -i / 2, r = -o / 2;
843
- return `translate(${s}px, ${r}px) rotate(${t}deg) scale(${e})`;
840
+ buildFinalTransform(t, i, e, o) {
841
+ if (e !== void 0 && o !== void 0) {
842
+ const a = -e / 2, r = -o / 2;
843
+ return `translate(${a}px, ${r}px) rotate(${t}deg) scale(${i})`;
844
844
  }
845
- return `translate(-50%, -50%) rotate(${t}deg) scale(${e})`;
845
+ return `translate(-50%, -50%) rotate(${t}deg) scale(${i})`;
846
846
  }
847
847
  /**
848
848
  * Get the transition CSS for entry animation
849
849
  * For JS-animated paths, only animate opacity (transform handled by JS)
850
850
  */
851
851
  getTransitionCSS() {
852
- const t = this.config.timing.duration, e = this.config.easing;
853
- return this.requiresJSAnimation() ? `opacity ${t}ms ease-out` : `opacity ${t}ms ease-out, transform ${t}ms ${e}`;
852
+ const t = this.config.timing.duration, i = this.config.easing;
853
+ return this.requiresJSAnimation() ? `opacity ${t}ms ease-out` : `opacity ${t}ms ease-out, transform ${t}ms ${i}`;
854
854
  }
855
855
  /**
856
856
  * Check if the current path type requires JavaScript animation
@@ -900,17 +900,17 @@ class se {
900
900
  case "none":
901
901
  return t;
902
902
  case "settle": {
903
- const i = this.rotationConfig.startRotation;
904
- if (i === void 0)
903
+ const e = this.rotationConfig.startRotation;
904
+ if (e === void 0)
905
905
  return t + (Math.random() - 0.5) * 60;
906
- if (typeof i == "number")
907
- return i;
908
- const o = i.max - i.min;
909
- return i.min + Math.random() * o;
906
+ if (typeof e == "number")
907
+ return e;
908
+ const o = e.max - e.min;
909
+ return e.min + Math.random() * o;
910
910
  }
911
911
  case "spin": {
912
- const i = this.rotationConfig.spinCount ?? 1, o = this.resolveSpinDirection(t);
913
- return t + i * 360 * o;
912
+ const e = this.rotationConfig.spinCount ?? 1, o = this.resolveSpinDirection(t);
913
+ return t + e * 360 * o;
914
914
  }
915
915
  case "random":
916
916
  return t + (Math.random() - 0.5) * 60;
@@ -951,15 +951,15 @@ class se {
951
951
  * @param finalRotation - The final rotation in degrees
952
952
  * @returns The current rotation in degrees
953
953
  */
954
- calculateWobbleRotation(t, e) {
954
+ calculateWobbleRotation(t, i) {
955
955
  if (this.rotationConfig.mode !== "wobble")
956
- return e;
957
- const i = this.rotationConfig.wobble || {
956
+ return i;
957
+ const e = this.rotationConfig.wobble || {
958
958
  amplitude: 15,
959
959
  frequency: 3,
960
960
  decay: !0
961
- }, { amplitude: o, frequency: s, decay: r } = i, a = Math.sin(t * s * Math.PI * 2), h = r ? Math.pow(1 - t, 2) : 1, c = o * a * h;
962
- return e + c;
961
+ }, { amplitude: o, frequency: a, decay: r } = e, s = Math.sin(t * a * Math.PI * 2), h = r ? Math.pow(1 - t, 2) : 1, c = o * s * h;
962
+ return i + c;
963
963
  }
964
964
  /**
965
965
  * Get the scale configuration
@@ -989,8 +989,8 @@ class se {
989
989
  case "pop":
990
990
  return t;
991
991
  case "random": {
992
- const i = this.scaleConfig.range ?? { min: 0.5, max: 1 };
993
- return (i.min + Math.random() * (i.max - i.min)) * t;
992
+ const e = this.scaleConfig.range ?? { min: 0.5, max: 1 };
993
+ return (e.min + Math.random() * (e.max - e.min)) * t;
994
994
  }
995
995
  default:
996
996
  return t;
@@ -1009,36 +1009,36 @@ class se {
1009
1009
  * @param finalScale - The final scale value
1010
1010
  * @returns The current scale value with bounce effect
1011
1011
  */
1012
- calculatePopScale(t, e) {
1012
+ calculatePopScale(t, i) {
1013
1013
  if (this.scaleConfig.mode !== "pop")
1014
- return e;
1015
- const i = this.scaleConfig.pop || {
1014
+ return i;
1015
+ const e = this.scaleConfig.pop || {
1016
1016
  overshoot: 1.2,
1017
1017
  bounces: 1
1018
- }, { overshoot: o, bounces: s } = i, r = this.generateScaleBounceKeyframes(s, o);
1019
- let a = e;
1018
+ }, { overshoot: o, bounces: a } = e, r = this.generateScaleBounceKeyframes(a, o);
1019
+ let s = i;
1020
1020
  for (let h = 0; h < r.length; h++)
1021
1021
  if (t <= r[h].time) {
1022
- const c = h === 0 ? 0 : r[h - 1].time, u = h === 0 ? e : r[h - 1].scale, l = (t - c) / (r[h].time - c), d = this.easeOutQuad(l);
1023
- a = u + (r[h].scale - u) * d;
1022
+ const c = h === 0 ? 0 : r[h - 1].time, d = h === 0 ? i : r[h - 1].scale, l = (t - c) / (r[h].time - c), u = this.easeOutQuad(l);
1023
+ s = d + (r[h].scale - d) * u;
1024
1024
  break;
1025
1025
  }
1026
- return a * e;
1026
+ return s * i;
1027
1027
  }
1028
1028
  /**
1029
1029
  * Generate keyframes for scale bounce animation
1030
1030
  */
1031
- generateScaleBounceKeyframes(t, e) {
1032
- const i = [];
1033
- i.push({ time: 0.5, scale: e });
1034
- let o = e;
1035
- const s = 0.5, a = 0.5 / (t * 2);
1031
+ generateScaleBounceKeyframes(t, i) {
1032
+ const e = [];
1033
+ e.push({ time: 0.5, scale: i });
1034
+ let o = i;
1035
+ const a = 0.5, s = 0.5 / (t * 2);
1036
1036
  let h = 0.5;
1037
1037
  for (let c = 0; c < t; c++) {
1038
- const u = 1 - (o - 1) * s;
1039
- h += a, i.push({ time: h, scale: u }), o = 1 + (o - 1) * s * s, h += a, c < t - 1 && i.push({ time: h, scale: o });
1038
+ const d = 1 - (o - 1) * a;
1039
+ h += s, e.push({ time: h, scale: d }), o = 1 + (o - 1) * a * a, h += s, c < t - 1 && e.push({ time: h, scale: o });
1040
1040
  }
1041
- return i.push({ time: 1, scale: 1 }), i;
1041
+ return e.push({ time: 1, scale: 1 }), e;
1042
1042
  }
1043
1043
  /**
1044
1044
  * Easing function for smooth transitions
@@ -1048,8 +1048,8 @@ class se {
1048
1048
  }
1049
1049
  }
1050
1050
  class ae {
1051
- constructor(t, e = {}) {
1052
- this.config = t, this.imageConfig = e;
1051
+ constructor(t, i = {}) {
1052
+ this.config = t, this.imageConfig = i;
1053
1053
  }
1054
1054
  /**
1055
1055
  * Generate random layout positions for images
@@ -1058,18 +1058,18 @@ class ae {
1058
1058
  * @param options - Optional overrides (includes fixedHeight)
1059
1059
  * @returns Array of layout objects with position, rotation, scale
1060
1060
  */
1061
- generate(t, e, i = {}) {
1062
- const o = [], { width: s, height: r } = e, a = this.config.spacing.padding, h = i.fixedHeight ?? 200, c = this.imageConfig.rotation?.mode ?? "none", u = this.imageConfig.rotation?.range?.min ?? -15, l = this.imageConfig.rotation?.range?.max ?? 15, d = this.imageConfig.sizing?.variance?.min ?? 1, m = this.imageConfig.sizing?.variance?.max ?? 1, b = d !== 1 || m !== 1, g = h * 1.5 / 2, f = h / 2, E = s - a - g, v = r - a - f, w = a + g, S = a + f;
1061
+ generate(t, i, e = {}) {
1062
+ const o = [], { width: a, height: r } = i, s = this.config.spacing.padding, h = e.fixedHeight ?? 200, c = this.imageConfig.rotation?.mode ?? "none", d = this.imageConfig.rotation?.range?.min ?? -15, l = this.imageConfig.rotation?.range?.max ?? 15, u = this.imageConfig.sizing?.variance?.min ?? 1, g = this.imageConfig.sizing?.variance?.max ?? 1, p = u !== 1 || g !== 1, f = h * 1.5 / 2, m = h / 2, E = a - s - f, v = r - s - m, w = s + f, S = s + m;
1063
1063
  for (let x = 0; x < t; x++) {
1064
- const A = this.random(w, E), L = this.random(S, v), z = c === "random" ? this.random(u, l) : 0, _ = b ? this.random(d, m) : 1, U = h * _, Y = {
1064
+ const I = this.random(w, E), M = this.random(S, v), F = c === "random" ? this.random(d, l) : 0, _ = p ? this.random(u, g) : 1, U = h * _, B = {
1065
1065
  id: x,
1066
- x: A,
1067
- y: L,
1068
- rotation: z,
1066
+ x: I,
1067
+ y: M,
1068
+ rotation: F,
1069
1069
  scale: _,
1070
1070
  baseSize: U
1071
1071
  };
1072
- o.push(Y);
1072
+ o.push(B);
1073
1073
  }
1074
1074
  return o;
1075
1075
  }
@@ -1079,13 +1079,13 @@ class ae {
1079
1079
  * @param max - Maximum value
1080
1080
  * @returns Random number in range
1081
1081
  */
1082
- random(t, e) {
1083
- return Math.random() * (e - t) + t;
1082
+ random(t, i) {
1083
+ return Math.random() * (i - t) + t;
1084
1084
  }
1085
1085
  }
1086
1086
  class re {
1087
- constructor(t, e = {}) {
1088
- this.config = t, this.imageConfig = e;
1087
+ constructor(t, i = {}) {
1088
+ this.config = t, this.imageConfig = i;
1089
1089
  }
1090
1090
  /**
1091
1091
  * Generate radial layout positions for images
@@ -1094,15 +1094,15 @@ class re {
1094
1094
  * @param options - Optional overrides
1095
1095
  * @returns Array of layout objects with position, rotation, scale
1096
1096
  */
1097
- generate(t, e, i = {}) {
1098
- const o = [], { width: s, height: r } = e, a = i.fixedHeight ?? 200, h = this.imageConfig.rotation?.mode ?? "none", c = this.imageConfig.rotation?.range?.min ?? -15, u = this.imageConfig.rotation?.range?.max ?? 15, l = this.imageConfig.sizing?.variance?.min ?? 1, d = this.imageConfig.sizing?.variance?.max ?? 1, m = l !== 1 || d !== 1, b = this.config.scaleDecay ?? 0, p = i.fixedHeight ?? a, g = s / 2, f = r / 2, E = Math.ceil(Math.sqrt(t));
1097
+ generate(t, i, e = {}) {
1098
+ const o = [], { width: a, height: r } = i, s = e.fixedHeight ?? 200, h = this.imageConfig.rotation?.mode ?? "none", c = this.imageConfig.rotation?.range?.min ?? -15, d = this.imageConfig.rotation?.range?.max ?? 15, l = this.imageConfig.sizing?.variance?.min ?? 1, u = this.imageConfig.sizing?.variance?.max ?? 1, g = l !== 1 || u !== 1, p = this.config.scaleDecay ?? 0, b = e.fixedHeight ?? s, f = a / 2, m = r / 2, E = Math.ceil(Math.sqrt(t));
1099
1099
  if (t > 0) {
1100
- const S = m ? this.random(l, d) : 1, x = p * S;
1100
+ const S = g ? this.random(l, u) : 1, x = b * S;
1101
1101
  o.push({
1102
1102
  id: 0,
1103
- x: g,
1104
- y: f,
1105
- rotation: h === "random" ? this.random(c * 0.33, u * 0.33) : 0,
1103
+ x: f,
1104
+ y: m,
1105
+ rotation: h === "random" ? this.random(c * 0.33, d * 0.33) : 0,
1106
1106
  // Less rotation for center
1107
1107
  scale: S,
1108
1108
  baseSize: x,
@@ -1112,25 +1112,25 @@ class re {
1112
1112
  }
1113
1113
  let v = 1, w = 1;
1114
1114
  for (; v < t; ) {
1115
- const S = w / E, x = b > 0 ? 1 - S * b * 0.5 : 1, A = w * (p * 0.8), L = A * 1.5, z = Math.PI * (3 * (L + A) - Math.sqrt((3 * L + A) * (L + 3 * A))), _ = this.estimateWidth(p), U = Math.floor(z / (_ * 0.7));
1115
+ const S = w / E, x = p > 0 ? 1 - S * p * 0.5 : 1, I = w * (b * 0.8), M = I * 1.5, F = Math.PI * (3 * (M + I) - Math.sqrt((3 * M + I) * (M + 3 * I))), _ = this.estimateWidth(b), U = Math.floor(F / (_ * 0.7));
1116
1116
  if (U === 0) {
1117
1117
  w++;
1118
1118
  continue;
1119
1119
  }
1120
- const Y = 2 * Math.PI / U, N = w * (20 * Math.PI / 180);
1120
+ const B = 2 * Math.PI / U, N = w * (20 * Math.PI / 180);
1121
1121
  for (let T = 0; T < U && v < t; T++) {
1122
- const O = T * Y + N, k = m ? this.random(l, d) : 1, H = x * k, R = p * H;
1123
- let C = g + Math.cos(O) * L, D = f + Math.sin(O) * A;
1124
- const $ = this.config.spacing.padding ?? 50, P = R * 1.5 / 2, M = R / 2;
1125
- C - P < $ ? C = $ + P : C + P > s - $ && (C = s - $ - P), D - M < $ ? D = $ + M : D + M > r - $ && (D = r - $ - M);
1126
- const W = h === "random" ? this.random(c, u) : 0;
1122
+ const O = T * B + N, k = g ? this.random(l, u) : 1, H = x * k, C = b * H;
1123
+ let A = f + Math.cos(O) * M, $ = m + Math.sin(O) * I;
1124
+ const D = this.config.spacing.padding ?? 50, P = C * 1.5 / 2, L = C / 2;
1125
+ A - P < D ? A = D + P : A + P > a - D && (A = a - D - P), $ - L < D ? $ = D + L : $ + L > r - D && ($ = r - D - L);
1126
+ const W = h === "random" ? this.random(c, d) : 0;
1127
1127
  o.push({
1128
1128
  id: v,
1129
- x: C,
1130
- y: D,
1129
+ x: A,
1130
+ y: $,
1131
1131
  rotation: W,
1132
1132
  scale: H,
1133
- baseSize: R,
1133
+ baseSize: C,
1134
1134
  zIndex: Math.max(1, 100 - w)
1135
1135
  // Outer rings have lower z-index
1136
1136
  }), v++;
@@ -1154,8 +1154,8 @@ class re {
1154
1154
  * @param max - Maximum value
1155
1155
  * @returns Random number in range
1156
1156
  */
1157
- random(t, e) {
1158
- return Math.random() * (e - t) + t;
1157
+ random(t, i) {
1158
+ return Math.random() * (i - t) + t;
1159
1159
  }
1160
1160
  }
1161
1161
  const ce = {
@@ -1168,7 +1168,7 @@ const ce = {
1168
1168
  alignment: "center",
1169
1169
  gap: 10,
1170
1170
  overflowOffset: 0.25
1171
- }, At = [
1171
+ }, Tt = [
1172
1172
  { x: 1, y: 1 },
1173
1173
  // bottom-right
1174
1174
  { x: -1, y: -1 },
@@ -1187,8 +1187,8 @@ const ce = {
1187
1187
  // down
1188
1188
  ];
1189
1189
  class le {
1190
- constructor(t, e = {}) {
1191
- this.config = t, this.imageConfig = e;
1190
+ constructor(t, i = {}) {
1191
+ this.config = t, this.imageConfig = i;
1192
1192
  }
1193
1193
  /**
1194
1194
  * Generate grid layout positions for images
@@ -1197,66 +1197,66 @@ class le {
1197
1197
  * @param options - Optional overrides (includes fixedHeight)
1198
1198
  * @returns Array of layout objects with position, rotation, scale
1199
1199
  */
1200
- generate(t, e, i = {}) {
1201
- const o = [], { width: s, height: r } = e, a = { ...ce, ...this.config.grid }, h = this.config.spacing.padding, c = i.fixedHeight ?? 200, u = this.imageConfig.rotation?.mode ?? "none", l = this.imageConfig.sizing?.variance?.min ?? 1, d = this.imageConfig.sizing?.variance?.max ?? 1, m = l !== 1 || d !== 1, b = s - 2 * h, p = r - 2 * h, { columns: g, rows: f } = this.calculateGridDimensions(
1200
+ generate(t, i, e = {}) {
1201
+ const o = [], { width: a, height: r } = i, s = { ...ce, ...this.config.grid }, h = this.config.spacing.padding, c = e.fixedHeight ?? 200, d = this.imageConfig.rotation?.mode ?? "none", l = this.imageConfig.sizing?.variance?.min ?? 1, u = this.imageConfig.sizing?.variance?.max ?? 1, g = l !== 1 || u !== 1, p = a - 2 * h, b = r - 2 * h, { columns: f, rows: m } = this.calculateGridDimensions(
1202
1202
  t,
1203
- b,
1204
1203
  p,
1204
+ b,
1205
1205
  c,
1206
- a
1207
- ), E = a.stagger === "row", v = a.stagger === "column", w = E ? g + 0.5 : g, S = v ? f + 0.5 : f, x = (b - a.gap * (g - 1)) / w, A = (p - a.gap * (f - 1)) / S, L = E ? x / 2 : 0, z = v ? A / 2 : 0, _ = 1 + a.overlap, U = Math.min(x, A) * _, Y = i.fixedHeight ? Math.min(i.fixedHeight, U) : U, N = g * x + (g - 1) * a.gap + L, T = f * A + (f - 1) * a.gap + z, O = h + (b - N) / 2, k = h + (p - T) / 2, H = g * f, R = a.columns !== "auto" && a.rows !== "auto", C = R && t > H;
1206
+ s
1207
+ ), E = s.stagger === "row", v = s.stagger === "column", w = E ? f + 0.5 : f, S = v ? m + 0.5 : m, x = (p - s.gap * (f - 1)) / w, I = (b - s.gap * (m - 1)) / S, M = E ? x / 2 : 0, F = v ? I / 2 : 0, _ = 1 + s.overlap, U = Math.min(x, I) * _, B = e.fixedHeight ? Math.min(e.fixedHeight, U) : U, N = f * x + (f - 1) * s.gap + M, T = m * I + (m - 1) * s.gap + F, O = h + (p - N) / 2, k = h + (b - T) / 2, H = f * m, C = s.columns !== "auto" && s.rows !== "auto", A = C && t > H;
1208
1208
  typeof window < "u" && (window.__gridOverflowDebug = {
1209
- gridConfigColumns: a.columns,
1210
- gridConfigRows: a.rows,
1211
- columns: g,
1212
- rows: f,
1209
+ gridConfigColumns: s.columns,
1210
+ gridConfigRows: s.rows,
1211
+ columns: f,
1212
+ rows: m,
1213
1213
  cellCount: H,
1214
- hasFixedGrid: R,
1214
+ hasFixedGrid: C,
1215
1215
  imageCount: t,
1216
- isOverflowMode: C
1216
+ isOverflowMode: A
1217
1217
  });
1218
- const D = C ? new Array(H).fill(0) : [], $ = Math.min(x, A) * a.overflowOffset;
1219
- for (let F = 0; F < t; F++) {
1220
- let P, M, W = 0;
1221
- if (C && F >= H) {
1222
- const q = F - H, j = q % H;
1223
- W = Math.floor(q / H) + 1, D[j]++, a.fillDirection === "row" ? (P = j % g, M = Math.floor(j / g)) : (M = j % f, P = Math.floor(j / f));
1218
+ const $ = A ? new Array(H).fill(0) : [], D = Math.min(x, I) * s.overflowOffset;
1219
+ for (let z = 0; z < t; z++) {
1220
+ let P, L, W = 0;
1221
+ if (A && z >= H) {
1222
+ const q = z - H, j = q % H;
1223
+ W = Math.floor(q / H) + 1, $[j]++, s.fillDirection === "row" ? (P = j % f, L = Math.floor(j / f)) : (L = j % m, P = Math.floor(j / m));
1224
1224
  } else
1225
- a.fillDirection === "row" ? (P = F % g, M = Math.floor(F / g)) : (M = F % f, P = Math.floor(F / f));
1226
- let G = O + P * (x + a.gap) + x / 2, X = k + M * (A + a.gap) + A / 2;
1227
- if (a.stagger === "row" && M % 2 === 1 ? G += x / 2 : a.stagger === "column" && P % 2 === 1 && (X += A / 2), W > 0) {
1228
- const q = (W - 1) % At.length, j = At[q];
1229
- G += j.x * $, X += j.y * $;
1225
+ s.fillDirection === "row" ? (P = z % f, L = Math.floor(z / f)) : (L = z % m, P = Math.floor(z / m));
1226
+ let G = O + P * (x + s.gap) + x / 2, Y = k + L * (I + s.gap) + I / 2;
1227
+ if (s.stagger === "row" && L % 2 === 1 ? G += x / 2 : s.stagger === "column" && P % 2 === 1 && (Y += I / 2), W > 0) {
1228
+ const q = (W - 1) % Tt.length, j = Tt[q];
1229
+ G += j.x * D, Y += j.y * D;
1230
1230
  }
1231
- if (a.jitter > 0) {
1232
- const q = x / 2 * a.jitter, j = A / 2 * a.jitter;
1233
- G += this.random(-q, q), X += this.random(-j, j);
1231
+ if (s.jitter > 0) {
1232
+ const q = x / 2 * s.jitter, j = I / 2 * s.jitter;
1233
+ G += this.random(-q, q), Y += this.random(-j, j);
1234
1234
  }
1235
- let B = G, J = X;
1236
- if (!C && a.fillDirection === "row") {
1237
- const q = t % g || g;
1238
- if (M === Math.floor((t - 1) / g) && q < g) {
1239
- const xt = q * x + (q - 1) * a.gap;
1240
- let gt = 0;
1241
- a.alignment === "center" ? gt = (N - xt) / 2 : a.alignment === "end" && (gt = N - xt), B += gt;
1235
+ let X = G, J = Y;
1236
+ if (!A && s.fillDirection === "row") {
1237
+ const q = t % f || f;
1238
+ if (L === Math.floor((t - 1) / f) && q < f) {
1239
+ const Et = q * x + (q - 1) * s.gap;
1240
+ let ut = 0;
1241
+ s.alignment === "center" ? ut = (N - Et) / 2 : s.alignment === "end" && (ut = N - Et), X += ut;
1242
1242
  }
1243
1243
  }
1244
- const rt = m ? this.random(l, d) : 1, K = Y * rt, it = K * 1.5 / 2, nt = K / 2, lt = h + it, ht = s - h - it, Dt = h + nt, $t = r - h - nt;
1245
- B = Math.max(lt, Math.min(B, ht)), J = Math.max(Dt, Math.min(J, $t));
1246
- let dt = 0;
1247
- if (u === "random") {
1244
+ const at = g ? this.random(l, u) : 1, K = B * at, et = K * 1.5 / 2, it = K / 2, ct = h + et, lt = a - h - et, $t = h + it, Dt = r - h - it;
1245
+ X = Math.max(ct, Math.min(X, lt)), J = Math.max($t, Math.min(J, Dt));
1246
+ let ht = 0;
1247
+ if (d === "random") {
1248
1248
  const q = this.imageConfig.rotation?.range?.min ?? -15, j = this.imageConfig.rotation?.range?.max ?? 15;
1249
- a.jitter > 0 ? dt = this.random(q * a.jitter, j * a.jitter) : dt = this.random(q, j);
1249
+ s.jitter > 0 ? ht = this.random(q * s.jitter, j * s.jitter) : ht = this.random(q, j);
1250
1250
  }
1251
- let ut;
1252
- C && W > 0 ? ut = 50 - W : ut = C ? 100 + F : F + 1, o.push({
1253
- id: F,
1254
- x: B,
1251
+ let dt;
1252
+ A && W > 0 ? dt = 50 - W : dt = A ? 100 + z : z + 1, o.push({
1253
+ id: z,
1254
+ x: X,
1255
1255
  y: J,
1256
- rotation: dt,
1257
- scale: rt,
1256
+ rotation: ht,
1257
+ scale: at,
1258
1258
  baseSize: K,
1259
- zIndex: ut
1259
+ zIndex: dt
1260
1260
  });
1261
1261
  }
1262
1262
  return o;
@@ -1264,26 +1264,26 @@ class le {
1264
1264
  /**
1265
1265
  * Calculate optimal grid dimensions based on image count and container
1266
1266
  */
1267
- calculateGridDimensions(t, e, i, o, s) {
1268
- let r, a;
1269
- if (s.columns !== "auto" && s.rows !== "auto")
1270
- r = s.columns, a = s.rows;
1271
- else if (s.columns !== "auto")
1272
- r = s.columns, a = Math.ceil(t / r);
1273
- else if (s.rows !== "auto")
1274
- a = s.rows, r = Math.ceil(t / a);
1267
+ calculateGridDimensions(t, i, e, o, a) {
1268
+ let r, s;
1269
+ if (a.columns !== "auto" && a.rows !== "auto")
1270
+ r = a.columns, s = a.rows;
1271
+ else if (a.columns !== "auto")
1272
+ r = a.columns, s = Math.ceil(t / r);
1273
+ else if (a.rows !== "auto")
1274
+ s = a.rows, r = Math.ceil(t / s);
1275
1275
  else {
1276
- const h = e / i;
1277
- for (r = Math.max(1, Math.round(Math.sqrt(t * h / 1.4))), a = Math.ceil(t / r); r > 1 && (r - 1) * a >= t; )
1276
+ const h = i / e;
1277
+ for (r = Math.max(1, Math.round(Math.sqrt(t * h / 1.4))), s = Math.ceil(t / r); r > 1 && (r - 1) * s >= t; )
1278
1278
  r--;
1279
1279
  }
1280
- return { columns: Math.max(1, r), rows: Math.max(1, a) };
1280
+ return { columns: Math.max(1, r), rows: Math.max(1, s) };
1281
1281
  }
1282
1282
  /**
1283
1283
  * Utility: Generate random number between min and max
1284
1284
  */
1285
- random(t, e) {
1286
- return Math.random() * (e - t) + t;
1285
+ random(t, i) {
1286
+ return Math.random() * (i - t) + t;
1287
1287
  }
1288
1288
  }
1289
1289
  const he = Math.PI * (3 - Math.sqrt(5)), de = {
@@ -1294,8 +1294,8 @@ const he = Math.PI * (3 - Math.sqrt(5)), de = {
1294
1294
  startAngle: 0
1295
1295
  };
1296
1296
  class ue {
1297
- constructor(t, e = {}) {
1298
- this.config = t, this.imageConfig = e;
1297
+ constructor(t, i = {}) {
1298
+ this.config = t, this.imageConfig = i;
1299
1299
  }
1300
1300
  /**
1301
1301
  * Generate spiral layout positions for images
@@ -1304,34 +1304,34 @@ class ue {
1304
1304
  * @param options - Optional overrides (includes fixedHeight)
1305
1305
  * @returns Array of layout objects with position, rotation, scale
1306
1306
  */
1307
- generate(t, e, i = {}) {
1308
- const o = [], { width: s, height: r } = e, a = { ...de, ...this.config.spiral }, h = this.config.spacing.padding, c = i.fixedHeight ?? 200, u = this.imageConfig.rotation?.mode ?? "none", l = this.imageConfig.rotation?.range?.min ?? -15, d = this.imageConfig.rotation?.range?.max ?? 15, m = this.imageConfig.sizing?.variance?.min ?? 1, b = this.imageConfig.sizing?.variance?.max ?? 1, p = m !== 1 || b !== 1, g = this.config.scaleDecay ?? a.scaleDecay, f = s / 2, E = r / 2, v = Math.min(
1309
- f - h - c / 2,
1307
+ generate(t, i, e = {}) {
1308
+ const o = [], { width: a, height: r } = i, s = { ...de, ...this.config.spiral }, h = this.config.spacing.padding, c = e.fixedHeight ?? 200, d = this.imageConfig.rotation?.mode ?? "none", l = this.imageConfig.rotation?.range?.min ?? -15, u = this.imageConfig.rotation?.range?.max ?? 15, g = this.imageConfig.sizing?.variance?.min ?? 1, p = this.imageConfig.sizing?.variance?.max ?? 1, b = g !== 1 || p !== 1, f = this.config.scaleDecay ?? s.scaleDecay, m = a / 2, E = r / 2, v = Math.min(
1309
+ m - h - c / 2,
1310
1310
  E - h - c / 2
1311
- ), w = a.direction === "clockwise" ? -1 : 1;
1311
+ ), w = s.direction === "clockwise" ? -1 : 1;
1312
1312
  for (let S = 0; S < t; S++) {
1313
- let x, A;
1314
- if (a.spiralType === "golden")
1315
- x = S * he * w + a.startAngle, A = this.calculateGoldenRadius(S, t, v, a.tightness);
1316
- else if (a.spiralType === "archimedean") {
1317
- const G = S * 0.5 * a.tightness;
1318
- x = G * w + a.startAngle, A = this.calculateArchimedeanRadius(G, t, v, a.tightness);
1313
+ let x, I;
1314
+ if (s.spiralType === "golden")
1315
+ x = S * he * w + s.startAngle, I = this.calculateGoldenRadius(S, t, v, s.tightness);
1316
+ else if (s.spiralType === "archimedean") {
1317
+ const G = S * 0.5 * s.tightness;
1318
+ x = G * w + s.startAngle, I = this.calculateArchimedeanRadius(G, t, v, s.tightness);
1319
1319
  } else {
1320
- const G = S * 0.3 * a.tightness;
1321
- x = G * w + a.startAngle, A = this.calculateLogarithmicRadius(G, t, v, a.tightness);
1320
+ const G = S * 0.3 * s.tightness;
1321
+ x = G * w + s.startAngle, I = this.calculateLogarithmicRadius(G, t, v, s.tightness);
1322
1322
  }
1323
- const L = f + Math.cos(x) * A, z = E + Math.sin(x) * A, _ = A / v, U = g > 0 ? 1 - _ * g * 0.5 : 1, Y = p ? this.random(m, b) : 1, N = U * Y, T = c * N, k = T * 1.5 / 2, H = T / 2, R = h + k, C = s - h - k, D = h + H, $ = r - h - H, F = Math.max(R, Math.min(L, C)), P = Math.max(D, Math.min(z, $));
1324
- let M = 0;
1325
- if (u === "random") {
1326
- const G = x * 180 / Math.PI % 360, X = this.random(l, d);
1327
- M = a.spiralType === "golden" ? X : G * 0.1 + X * 0.9;
1328
- } else u === "tangent" && (M = this.calculateSpiralTangent(x, A, a));
1323
+ const M = m + Math.cos(x) * I, F = E + Math.sin(x) * I, _ = I / v, U = f > 0 ? 1 - _ * f * 0.5 : 1, B = b ? this.random(g, p) : 1, N = U * B, T = c * N, k = T * 1.5 / 2, H = T / 2, C = h + k, A = a - h - k, $ = h + H, D = r - h - H, z = Math.max(C, Math.min(M, A)), P = Math.max($, Math.min(F, D));
1324
+ let L = 0;
1325
+ if (d === "random") {
1326
+ const G = x * 180 / Math.PI % 360, Y = this.random(l, u);
1327
+ L = s.spiralType === "golden" ? Y : G * 0.1 + Y * 0.9;
1328
+ } else d === "tangent" && (L = this.calculateSpiralTangent(x, I, s));
1329
1329
  const W = t - S;
1330
1330
  o.push({
1331
1331
  id: S,
1332
- x: F,
1332
+ x: z,
1333
1333
  y: P,
1334
- rotation: M,
1334
+ rotation: L,
1335
1335
  scale: N,
1336
1336
  baseSize: T,
1337
1337
  zIndex: W
@@ -1343,16 +1343,16 @@ class ue {
1343
1343
  * Calculate tangent angle for spiral curve at given position
1344
1344
  * This aligns the image along the spiral's direction of travel
1345
1345
  */
1346
- calculateSpiralTangent(t, e, i) {
1346
+ calculateSpiralTangent(t, i, e) {
1347
1347
  let o;
1348
- if (i.spiralType === "golden")
1348
+ if (e.spiralType === "golden")
1349
1349
  o = t + Math.PI / 2;
1350
- else if (i.spiralType === "archimedean") {
1351
- const r = 1 / i.tightness, a = Math.atan(e / r);
1352
- o = t + a;
1350
+ else if (e.spiralType === "archimedean") {
1351
+ const r = 1 / e.tightness, s = Math.atan(i / r);
1352
+ o = t + s;
1353
1353
  } else {
1354
- const r = 0.15 / i.tightness, a = Math.atan(1 / r);
1355
- o = t + a;
1354
+ const r = 0.15 / e.tightness, s = Math.atan(1 / r);
1355
+ o = t + s;
1356
1356
  }
1357
1357
  return o * 180 / Math.PI % 360 - 90;
1358
1358
  }
@@ -1360,31 +1360,31 @@ class ue {
1360
1360
  * Calculate radius for golden spiral (Vogel's model)
1361
1361
  * Creates even distribution like sunflower seeds
1362
1362
  */
1363
- calculateGoldenRadius(t, e, i, o) {
1364
- const r = i / Math.sqrt(e) * Math.sqrt(t) / o;
1365
- return Math.min(r, i);
1363
+ calculateGoldenRadius(t, i, e, o) {
1364
+ const r = e / Math.sqrt(i) * Math.sqrt(t) / o;
1365
+ return Math.min(r, e);
1366
1366
  }
1367
1367
  /**
1368
1368
  * Calculate radius for Archimedean spiral
1369
1369
  * r = a + b*θ (constant spacing between arms)
1370
1370
  */
1371
- calculateArchimedeanRadius(t, e, i, o) {
1372
- const s = e * 0.5 * o;
1373
- return t / s * i;
1371
+ calculateArchimedeanRadius(t, i, e, o) {
1372
+ const a = i * 0.5 * o;
1373
+ return t / a * e;
1374
1374
  }
1375
1375
  /**
1376
1376
  * Calculate radius for logarithmic (equiangular) spiral
1377
1377
  * r = a * e^(b*θ)
1378
1378
  */
1379
- calculateLogarithmicRadius(t, e, i, o) {
1380
- const s = i * 0.05, r = 0.15 / o, a = s * Math.exp(r * t), h = e * 0.3 * o, c = s * Math.exp(r * h);
1381
- return a / c * i;
1379
+ calculateLogarithmicRadius(t, i, e, o) {
1380
+ const a = e * 0.05, r = 0.15 / o, s = a * Math.exp(r * t), h = i * 0.3 * o, c = a * Math.exp(r * h);
1381
+ return s / c * e;
1382
1382
  }
1383
1383
  /**
1384
1384
  * Utility: Generate random number between min and max
1385
1385
  */
1386
- random(t, e) {
1387
- return Math.random() * (e - t) + t;
1386
+ random(t, i) {
1387
+ return Math.random() * (i - t) + t;
1388
1388
  }
1389
1389
  }
1390
1390
  const ge = {
@@ -1395,9 +1395,9 @@ const ge = {
1395
1395
  overlap: 0.3,
1396
1396
  distribution: "gaussian"
1397
1397
  };
1398
- class me {
1399
- constructor(t, e = {}) {
1400
- this.config = t, this.imageConfig = e;
1398
+ class fe {
1399
+ constructor(t, i = {}) {
1400
+ this.config = t, this.imageConfig = i;
1401
1401
  }
1402
1402
  /**
1403
1403
  * Generate cluster layout positions for images
@@ -1406,45 +1406,45 @@ class me {
1406
1406
  * @param options - Optional overrides (includes fixedHeight)
1407
1407
  * @returns Array of layout objects with position, rotation, scale
1408
1408
  */
1409
- generate(t, e, i = {}) {
1410
- const o = [], { width: s, height: r } = e, a = { ...ge, ...this.config.cluster }, h = this.config.spacing.padding, c = i.fixedHeight ?? 200, u = this.imageConfig.rotation?.mode ?? "none", l = this.imageConfig.rotation?.range?.min ?? -15, d = this.imageConfig.rotation?.range?.max ?? 15, m = this.imageConfig.sizing?.variance?.min ?? 1, b = this.imageConfig.sizing?.variance?.max ?? 1, p = m !== 1 || b !== 1, g = this.calculateClusterCount(
1409
+ generate(t, i, e = {}) {
1410
+ const o = [], { width: a, height: r } = i, s = { ...ge, ...this.config.cluster }, h = this.config.spacing.padding, c = e.fixedHeight ?? 200, d = this.imageConfig.rotation?.mode ?? "none", l = this.imageConfig.rotation?.range?.min ?? -15, u = this.imageConfig.rotation?.range?.max ?? 15, g = this.imageConfig.sizing?.variance?.min ?? 1, p = this.imageConfig.sizing?.variance?.max ?? 1, b = g !== 1 || p !== 1, f = this.calculateClusterCount(
1411
1411
  t,
1412
- a.clusterCount,
1413
- s,
1412
+ s.clusterCount,
1413
+ a,
1414
1414
  r,
1415
- a.clusterSpacing
1416
- ), f = this.generateClusterCenters(
1417
- g,
1418
- s,
1415
+ s.clusterSpacing
1416
+ ), m = this.generateClusterCenters(
1417
+ f,
1418
+ a,
1419
1419
  r,
1420
1420
  h,
1421
- a
1422
- ), E = new Array(g).fill(0);
1421
+ s
1422
+ ), E = new Array(f).fill(0);
1423
1423
  for (let w = 0; w < t; w++)
1424
- E[w % g]++;
1424
+ E[w % f]++;
1425
1425
  let v = 0;
1426
- for (let w = 0; w < g; w++) {
1427
- const S = f[w], x = E[w];
1428
- for (let A = 0; A < x; A++) {
1429
- let L, z;
1430
- if (a.distribution === "gaussian")
1431
- L = this.gaussianRandom() * S.spread, z = this.gaussianRandom() * S.spread;
1426
+ for (let w = 0; w < f; w++) {
1427
+ const S = m[w], x = E[w];
1428
+ for (let I = 0; I < x; I++) {
1429
+ let M, F;
1430
+ if (s.distribution === "gaussian")
1431
+ M = this.gaussianRandom() * S.spread, F = this.gaussianRandom() * S.spread;
1432
1432
  else {
1433
- const M = this.random(0, Math.PI * 2), W = this.random(0, S.spread);
1434
- L = Math.cos(M) * W, z = Math.sin(M) * W;
1433
+ const L = this.random(0, Math.PI * 2), W = this.random(0, S.spread);
1434
+ M = Math.cos(L) * W, F = Math.sin(L) * W;
1435
1435
  }
1436
- const _ = 1 + a.overlap * 0.5, U = 1 + a.overlap * 0.3;
1437
- L /= _, z /= _;
1438
- const Y = p ? this.random(m, b) : 1, N = U * Y, T = c * N;
1439
- let O = S.x + L, k = S.y + z;
1440
- const R = T * 1.5 / 2, C = T / 2;
1441
- O = Math.max(h + R, Math.min(O, s - h - R)), k = Math.max(h + C, Math.min(k, r - h - C));
1442
- const D = u === "random" ? this.random(l, d) : 0, F = Math.sqrt(L * L + z * z) / S.spread, P = Math.round((1 - F) * 50) + 1;
1436
+ const _ = 1 + s.overlap * 0.5, U = 1 + s.overlap * 0.3;
1437
+ M /= _, F /= _;
1438
+ const B = b ? this.random(g, p) : 1, N = U * B, T = c * N;
1439
+ let O = S.x + M, k = S.y + F;
1440
+ const C = T * 1.5 / 2, A = T / 2;
1441
+ O = Math.max(h + C, Math.min(O, a - h - C)), k = Math.max(h + A, Math.min(k, r - h - A));
1442
+ const $ = d === "random" ? this.random(l, u) : 0, z = Math.sqrt(M * M + F * F) / S.spread, P = Math.round((1 - z) * 50) + 1;
1443
1443
  o.push({
1444
1444
  id: v,
1445
1445
  x: O,
1446
1446
  y: k,
1447
- rotation: D,
1447
+ rotation: $,
1448
1448
  scale: N,
1449
1449
  baseSize: T,
1450
1450
  zIndex: P
@@ -1456,36 +1456,36 @@ class me {
1456
1456
  /**
1457
1457
  * Calculate optimal number of clusters based on image count and container
1458
1458
  */
1459
- calculateClusterCount(t, e, i, o, s) {
1460
- if (e !== "auto")
1461
- return Math.max(1, Math.min(e, t));
1462
- const a = Math.max(1, Math.ceil(t / 8)), h = Math.floor(
1463
- i / s * (o / s) * 0.6
1459
+ calculateClusterCount(t, i, e, o, a) {
1460
+ if (i !== "auto")
1461
+ return Math.max(1, Math.min(i, t));
1462
+ const s = Math.max(1, Math.ceil(t / 8)), h = Math.floor(
1463
+ e / a * (o / a) * 0.6
1464
1464
  );
1465
- return Math.max(1, Math.min(a, h, 10));
1465
+ return Math.max(1, Math.min(s, h, 10));
1466
1466
  }
1467
1467
  /**
1468
1468
  * Generate cluster center positions with spacing constraints
1469
1469
  */
1470
- generateClusterCenters(t, e, i, o, s) {
1471
- const r = [], h = o + s.clusterSpread, c = e - o - s.clusterSpread, u = o + s.clusterSpread, l = i - o - s.clusterSpread;
1472
- for (let d = 0; d < t; d++) {
1473
- let m = null, b = -1;
1474
- for (let p = 0; p < 100; p++) {
1475
- const g = {
1470
+ generateClusterCenters(t, i, e, o, a) {
1471
+ const r = [], h = o + a.clusterSpread, c = i - o - a.clusterSpread, d = o + a.clusterSpread, l = e - o - a.clusterSpread;
1472
+ for (let u = 0; u < t; u++) {
1473
+ let g = null, p = -1;
1474
+ for (let b = 0; b < 100; b++) {
1475
+ const f = {
1476
1476
  x: this.random(h, c),
1477
- y: this.random(u, l),
1478
- spread: this.calculateClusterSpread(s)
1477
+ y: this.random(d, l),
1478
+ spread: this.calculateClusterSpread(a)
1479
1479
  };
1480
- let f = 1 / 0;
1480
+ let m = 1 / 0;
1481
1481
  for (const E of r) {
1482
- const v = g.x - E.x, w = g.y - E.y, S = Math.sqrt(v * v + w * w);
1483
- f = Math.min(f, S);
1482
+ const v = f.x - E.x, w = f.y - E.y, S = Math.sqrt(v * v + w * w);
1483
+ m = Math.min(m, S);
1484
1484
  }
1485
- if ((r.length === 0 || f > b) && (m = g, b = f), f >= s.clusterSpacing)
1485
+ if ((r.length === 0 || m > p) && (g = f, p = m), m >= a.clusterSpacing)
1486
1486
  break;
1487
1487
  }
1488
- m && r.push(m);
1488
+ g && r.push(g);
1489
1489
  }
1490
1490
  return r;
1491
1491
  }
@@ -1500,22 +1500,22 @@ class me {
1500
1500
  * Using Box-Muller transform
1501
1501
  */
1502
1502
  gaussianRandom() {
1503
- let t = 0, e = 0;
1503
+ let t = 0, i = 0;
1504
1504
  for (; t === 0; ) t = Math.random();
1505
- for (; e === 0; ) e = Math.random();
1506
- const i = Math.sqrt(-2 * Math.log(t)) * Math.cos(2 * Math.PI * e);
1507
- return Math.max(-3, Math.min(3, i)) / 3;
1505
+ for (; i === 0; ) i = Math.random();
1506
+ const e = Math.sqrt(-2 * Math.log(t)) * Math.cos(2 * Math.PI * i);
1507
+ return Math.max(-3, Math.min(3, e)) / 3;
1508
1508
  }
1509
1509
  /**
1510
1510
  * Utility: Generate random number between min and max
1511
1511
  */
1512
- random(t, e) {
1513
- return Math.random() * (e - t) + t;
1512
+ random(t, i) {
1513
+ return Math.random() * (i - t) + t;
1514
1514
  }
1515
1515
  }
1516
- class fe {
1517
- constructor(t, e = {}) {
1518
- this.config = t, this.imageConfig = e;
1516
+ class me {
1517
+ constructor(t, i = {}) {
1518
+ this.config = t, this.imageConfig = i;
1519
1519
  }
1520
1520
  /**
1521
1521
  * Generate wave layout positions for images
@@ -1524,30 +1524,30 @@ class fe {
1524
1524
  * @param options - Optional overrides
1525
1525
  * @returns Array of layout objects with position, rotation, scale
1526
1526
  */
1527
- generate(t, e, i = {}) {
1528
- const o = [], { width: s, height: r } = e, a = i.fixedHeight ?? 200, h = this.config.spacing.padding ?? 50, c = this.imageConfig.rotation?.mode ?? "none", u = this.imageConfig.rotation?.range?.min ?? -15, l = this.imageConfig.rotation?.range?.max ?? 15, d = this.imageConfig.sizing?.variance?.min ?? 1, m = this.imageConfig.sizing?.variance?.max ?? 1, b = d !== 1 || m !== 1, p = i.fixedHeight ?? a, g = {
1527
+ generate(t, i, e = {}) {
1528
+ const o = [], { width: a, height: r } = i, s = e.fixedHeight ?? 200, h = this.config.spacing.padding ?? 50, c = this.imageConfig.rotation?.mode ?? "none", d = this.imageConfig.rotation?.range?.min ?? -15, l = this.imageConfig.rotation?.range?.max ?? 15, u = this.imageConfig.sizing?.variance?.min ?? 1, g = this.imageConfig.sizing?.variance?.max ?? 1, p = u !== 1 || g !== 1, b = e.fixedHeight ?? s, f = {
1529
1529
  ...Pt,
1530
1530
  ...this.config.wave
1531
- }, { rows: f, amplitude: E, frequency: v, phaseShift: w, synchronization: S } = g, x = Math.ceil(t / f), z = p * 1.5 / 2, _ = h + z, U = s - h - z, Y = U - _, N = x > 1 ? Y / (x - 1) : 0, T = h + E + p / 2, O = r - h - E - p / 2, k = O - T, H = f > 1 ? k / (f - 1) : 0;
1532
- let R = 0;
1533
- for (let C = 0; C < f && R < t; C++) {
1534
- const D = f === 1 ? (T + O) / 2 : T + C * H;
1535
- let $ = 0;
1536
- S === "offset" ? $ = C * w : S === "alternating" && ($ = C * Math.PI);
1537
- for (let F = 0; F < x && R < t; F++) {
1538
- const P = x === 1 ? (_ + U) / 2 : _ + F * N, M = this.calculateWaveY(P, s, E, v, $), W = P, G = D + M, X = b ? this.random(d, m) : 1, B = p * X;
1531
+ }, { rows: m, amplitude: E, frequency: v, phaseShift: w, synchronization: S } = f, x = Math.ceil(t / m), F = b * 1.5 / 2, _ = h + F, U = a - h - F, B = U - _, N = x > 1 ? B / (x - 1) : 0, T = h + E + b / 2, O = r - h - E - b / 2, k = O - T, H = m > 1 ? k / (m - 1) : 0;
1532
+ let C = 0;
1533
+ for (let A = 0; A < m && C < t; A++) {
1534
+ const $ = m === 1 ? (T + O) / 2 : T + A * H;
1535
+ let D = 0;
1536
+ S === "offset" ? D = A * w : S === "alternating" && (D = A * Math.PI);
1537
+ for (let z = 0; z < x && C < t; z++) {
1538
+ const P = x === 1 ? (_ + U) / 2 : _ + z * N, L = this.calculateWaveY(P, a, E, v, D), W = P, G = $ + L, Y = p ? this.random(u, g) : 1, X = b * Y;
1539
1539
  let J = 0;
1540
- c === "tangent" ? J = this.calculateRotation(P, s, E, v, $) : c === "random" && (J = this.random(u, l));
1541
- const K = B * 1.5 / 2, ct = B / 2, it = h + K, nt = s - h - K, lt = h + ct, ht = r - h - ct;
1540
+ c === "tangent" ? J = this.calculateRotation(P, a, E, v, D) : c === "random" && (J = this.random(d, l));
1541
+ const K = X * 1.5 / 2, rt = X / 2, et = h + K, it = a - h - K, ct = h + rt, lt = r - h - rt;
1542
1542
  o.push({
1543
- id: R,
1544
- x: Math.max(it, Math.min(W, nt)),
1545
- y: Math.max(lt, Math.min(G, ht)),
1543
+ id: C,
1544
+ x: Math.max(et, Math.min(W, it)),
1545
+ y: Math.max(ct, Math.min(G, lt)),
1546
1546
  rotation: J,
1547
- scale: X,
1548
- baseSize: B,
1549
- zIndex: R + 1
1550
- }), R++;
1547
+ scale: Y,
1548
+ baseSize: X,
1549
+ zIndex: C + 1
1550
+ }), C++;
1551
1551
  }
1552
1552
  }
1553
1553
  return o;
@@ -1561,9 +1561,9 @@ class fe {
1561
1561
  * @param phase - Phase offset
1562
1562
  * @returns Y displacement from baseline
1563
1563
  */
1564
- calculateWaveY(t, e, i, o, s) {
1565
- const r = t / e;
1566
- return i * Math.sin(o * r * 2 * Math.PI + s);
1564
+ calculateWaveY(t, i, e, o, a) {
1565
+ const r = t / i;
1566
+ return e * Math.sin(o * r * 2 * Math.PI + a);
1567
1567
  }
1568
1568
  /**
1569
1569
  * Calculate rotation based on wave tangent
@@ -1574,9 +1574,9 @@ class fe {
1574
1574
  * @param phase - Phase offset
1575
1575
  * @returns Rotation angle in degrees
1576
1576
  */
1577
- calculateRotation(t, e, i, o, s) {
1578
- const r = t / e, a = i * o * 2 * Math.PI * Math.cos(o * r * 2 * Math.PI + s) / e;
1579
- return Math.atan(a) * (180 / Math.PI);
1577
+ calculateRotation(t, i, e, o, a) {
1578
+ const r = t / i, s = e * o * 2 * Math.PI * Math.cos(o * r * 2 * Math.PI + a) / i;
1579
+ return Math.atan(s) * (180 / Math.PI);
1580
1580
  }
1581
1581
  /**
1582
1582
  * Estimate image width based on height
@@ -1586,8 +1586,8 @@ class fe {
1586
1586
  * @param max - Maximum value
1587
1587
  * @returns Random number in range
1588
1588
  */
1589
- random(t, e) {
1590
- return Math.random() * (e - t) + t;
1589
+ random(t, i) {
1590
+ return Math.random() * (i - t) + t;
1591
1591
  }
1592
1592
  }
1593
1593
  class pe {
@@ -1607,9 +1607,9 @@ class pe {
1607
1607
  case "spiral":
1608
1608
  return new ue(this.config, this.imageConfig);
1609
1609
  case "cluster":
1610
- return new me(this.config, this.imageConfig);
1611
- case "wave":
1612
1610
  return new fe(this.config, this.imageConfig);
1611
+ case "wave":
1612
+ return new me(this.config, this.imageConfig);
1613
1613
  default:
1614
1614
  return new ae(this.config, this.imageConfig);
1615
1615
  }
@@ -1621,10 +1621,10 @@ class pe {
1621
1621
  * @param options - Optional overrides for configuration (e.g. fixedHeight)
1622
1622
  * @returns Array of layout objects with position, rotation, scale
1623
1623
  */
1624
- generateLayout(t, e, i = {}) {
1625
- const o = this.placementLayout.generate(t, e, i);
1626
- return o.forEach((s) => {
1627
- this.layouts.set(s.id, s);
1624
+ generateLayout(t, i, e = {}) {
1625
+ const o = this.placementLayout.generate(t, i, e);
1626
+ return o.forEach((a) => {
1627
+ this.layouts.set(a.id, a);
1628
1628
  }), o;
1629
1629
  }
1630
1630
  /**
@@ -1661,8 +1661,8 @@ class pe {
1661
1661
  * Resolve breakpoint name based on viewport width
1662
1662
  */
1663
1663
  resolveBreakpoint(t) {
1664
- const e = this.getBreakpoints();
1665
- return t <= e.mobile.maxWidth ? "mobile" : t <= e.tablet.maxWidth ? "tablet" : "screen";
1664
+ const i = this.getBreakpoints();
1665
+ return t <= i.mobile.maxWidth ? "mobile" : t <= i.tablet.maxWidth ? "tablet" : "screen";
1666
1666
  }
1667
1667
  /**
1668
1668
  * Resolve the effective base height based on image config and current viewport
@@ -1670,16 +1670,16 @@ class pe {
1670
1670
  * @returns Resolved base height or undefined if should auto-calculate (adaptive mode)
1671
1671
  */
1672
1672
  resolveBaseHeight(t) {
1673
- const e = this.imageConfig.sizing;
1674
- if (!e || e.mode === "adaptive")
1673
+ const i = this.imageConfig.sizing;
1674
+ if (!i || i.mode === "adaptive")
1675
1675
  return;
1676
- const i = e.height;
1677
- if (i === void 0)
1676
+ const e = i.height;
1677
+ if (e === void 0)
1678
1678
  return;
1679
- if (typeof i == "number")
1680
- return i;
1681
- const o = i, s = this.resolveBreakpoint(t);
1682
- return s === "mobile" ? o.mobile ?? o.tablet ?? o.screen : s === "tablet" ? o.tablet ?? o.screen ?? o.mobile : o.screen ?? o.tablet ?? o.mobile;
1679
+ if (typeof e == "number")
1680
+ return e;
1681
+ const o = e, a = this.resolveBreakpoint(t);
1682
+ return a === "mobile" ? o.mobile ?? o.tablet ?? o.screen : a === "tablet" ? o.tablet ?? o.screen ?? o.mobile : o.screen ?? o.tablet ?? o.mobile;
1683
1683
  }
1684
1684
  /**
1685
1685
  * Calculate adaptive image size based on container dimensions and image count
@@ -1689,29 +1689,29 @@ class pe {
1689
1689
  * @param viewportWidth - Current viewport width for baseHeight resolution
1690
1690
  * @returns Calculated sizing result with height
1691
1691
  */
1692
- calculateAdaptiveSize(t, e, i, o) {
1693
- const s = this.imageConfig.sizing, r = this.resolveBaseHeight(o);
1692
+ calculateAdaptiveSize(t, i, e, o) {
1693
+ const a = this.imageConfig.sizing, r = this.resolveBaseHeight(o);
1694
1694
  if (r !== void 0)
1695
1695
  return { height: r };
1696
- const a = s?.minSize ?? 50, h = s?.maxSize ?? 400, c = this.config.targetCoverage ?? 0.6, u = this.config.densityFactor ?? 1, { width: l, height: d } = t, p = l * d * c / e;
1697
- let f = Math.sqrt(p / 1.4);
1698
- f *= u, f = Math.min(f, i);
1699
- let E = this.clamp(f, a, h);
1700
- if (E === a && f < a) {
1701
- const v = Math.max(a * 0.05, 20);
1702
- E = Math.max(v, f);
1696
+ const s = a?.minSize ?? 50, h = a?.maxSize ?? 400, c = this.config.targetCoverage ?? 0.6, d = this.config.densityFactor ?? 1, { width: l, height: u } = t, b = l * u * c / i;
1697
+ let m = Math.sqrt(b / 1.4);
1698
+ m *= d, m = Math.min(m, e);
1699
+ let E = this.clamp(m, s, h);
1700
+ if (E === s && m < s) {
1701
+ const v = Math.max(s * 0.05, 20);
1702
+ E = Math.max(v, m);
1703
1703
  }
1704
1704
  return { height: E };
1705
1705
  }
1706
1706
  /**
1707
1707
  * Utility: Clamp a value between min and max
1708
1708
  */
1709
- clamp(t, e, i) {
1710
- return Math.max(e, Math.min(i, t));
1709
+ clamp(t, i, e) {
1710
+ return Math.max(i, Math.min(e, t));
1711
1711
  }
1712
1712
  }
1713
- var I = /* @__PURE__ */ ((n) => (n.IDLE = "idle", n.FOCUSING = "focusing", n.FOCUSED = "focused", n.UNFOCUSING = "unfocusing", n.CROSS_ANIMATING = "cross_animating", n))(I || {});
1714
- const Tt = {
1713
+ var R = /* @__PURE__ */ ((n) => (n.IDLE = "idle", n.FOCUSING = "focusing", n.FOCUSED = "focused", n.UNFOCUSING = "unfocusing", n.CROSS_ANIMATING = "cross_animating", n))(R || {});
1714
+ const At = {
1715
1715
  // Geometric shapes - uses percentages for responsive sizing
1716
1716
  circle: "circle(50%)",
1717
1717
  square: "polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%)",
@@ -1720,83 +1720,143 @@ const Tt = {
1720
1720
  hexagon: "polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%)",
1721
1721
  octagon: "polygon(30% 0%, 70% 0%, 100% 30%, 100% 70%, 70% 100%, 30% 100%, 0% 70%, 0% 30%)",
1722
1722
  diamond: "polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%)"
1723
+ }, be = {
1724
+ // Circle - uses radius in pixels (refHeight of 100px = 50px radius)
1725
+ circle: {
1726
+ refHeight: 100,
1727
+ points: []
1728
+ // Special case: handled separately
1729
+ },
1730
+ // Square - maintains perfect aspect ratio (always 1:1)
1731
+ square: {
1732
+ refHeight: 100,
1733
+ points: [[0, 0], [100, 0], [100, 100], [0, 100]]
1734
+ },
1735
+ // Triangle - isosceles triangle
1736
+ triangle: {
1737
+ refHeight: 100,
1738
+ points: [[50, 0], [100, 100], [0, 100]]
1739
+ },
1740
+ // Pentagon - regular pentagon
1741
+ pentagon: {
1742
+ refHeight: 100,
1743
+ points: [[50, 0], [100, 38], [82, 100], [18, 100], [0, 38]]
1744
+ },
1745
+ // Hexagon - regular hexagon
1746
+ hexagon: {
1747
+ refHeight: 100,
1748
+ points: [[25, 0], [75, 0], [100, 50], [75, 100], [25, 100], [0, 50]]
1749
+ },
1750
+ // Octagon - regular octagon
1751
+ octagon: {
1752
+ refHeight: 100,
1753
+ points: [[30, 0], [70, 0], [100, 30], [100, 70], [70, 100], [30, 100], [0, 70], [0, 30]]
1754
+ },
1755
+ // Diamond - 45-degree rotated square
1756
+ diamond: {
1757
+ refHeight: 100,
1758
+ points: [[50, 0], [100, 50], [50, 100], [0, 50]]
1759
+ }
1723
1760
  };
1724
- function be(n) {
1725
- if (n)
1726
- return n in Tt ? Tt[n] : n;
1727
- }
1728
1761
  function ye(n) {
1729
- return n in mt;
1762
+ if (n)
1763
+ return n in At ? At[n] : n;
1730
1764
  }
1731
- function ve(n) {
1732
- return n ? ye(n) ? mt[n] : n : mt.md;
1765
+ function ve(n, t, i) {
1766
+ const e = be[n];
1767
+ if (!e) return "";
1768
+ const o = t / e.refHeight;
1769
+ if (n === "circle")
1770
+ return `circle(${Math.round(50 * o * 100) / 100}px)`;
1771
+ const a = e.refHeight * o, r = a / 2, s = a / 2, h = (i ?? a) / 2, c = t / 2, d = h - r, l = c - s;
1772
+ return `polygon(${e.points.map(([g, p]) => {
1773
+ const b = Math.round((g * o + d) * 100) / 100, f = Math.round((p * o + l) * 100) / 100;
1774
+ return `${b}px ${f}px`;
1775
+ }).join(", ")})`;
1733
1776
  }
1734
1777
  function we(n) {
1778
+ return n in ft;
1779
+ }
1780
+ function xe(n) {
1781
+ return n ? we(n) ? ft[n] : n : ft.md;
1782
+ }
1783
+ function Ee(n) {
1735
1784
  if (!n) return "";
1736
1785
  const t = [];
1737
1786
  if (n.grayscale !== void 0 && t.push(`grayscale(${n.grayscale})`), n.blur !== void 0 && t.push(`blur(${n.blur}px)`), n.brightness !== void 0 && t.push(`brightness(${n.brightness})`), n.contrast !== void 0 && t.push(`contrast(${n.contrast})`), n.saturate !== void 0 && t.push(`saturate(${n.saturate})`), n.opacity !== void 0 && t.push(`opacity(${n.opacity})`), n.sepia !== void 0 && t.push(`sepia(${n.sepia})`), n.hueRotate !== void 0 && t.push(`hue-rotate(${n.hueRotate}deg)`), n.invert !== void 0 && t.push(`invert(${n.invert})`), n.dropShadow !== void 0)
1738
1787
  if (typeof n.dropShadow == "string")
1739
1788
  t.push(`drop-shadow(${n.dropShadow})`);
1740
1789
  else {
1741
- const e = n.dropShadow;
1742
- t.push(`drop-shadow(${e.x}px ${e.y}px ${e.blur}px ${e.color})`);
1790
+ const i = n.dropShadow;
1791
+ t.push(`drop-shadow(${i.x}px ${i.y}px ${i.blur}px ${i.color})`);
1743
1792
  }
1744
1793
  return t.join(" ");
1745
1794
  }
1746
1795
  function Q(n) {
1747
1796
  if (!n || n.style === "none" || n.width === 0)
1748
1797
  return "none";
1749
- const t = n.width ?? 0, e = n.style ?? "solid", i = n.color ?? "#000000";
1750
- return `${t}px ${e} ${i}`;
1798
+ const t = n.width ?? 0, i = n.style ?? "solid", e = n.color ?? "#000000";
1799
+ return `${t}px ${i} ${e}`;
1751
1800
  }
1752
- function st(n) {
1801
+ function tt(n, t, i) {
1753
1802
  if (!n) return {};
1754
- const t = {};
1803
+ const e = {};
1755
1804
  if (n.borderRadiusTopLeft !== void 0 || n.borderRadiusTopRight !== void 0 || n.borderRadiusBottomRight !== void 0 || n.borderRadiusBottomLeft !== void 0) {
1756
1805
  const s = n.border?.radius ?? 0;
1757
- n.borderRadiusTopLeft !== void 0 ? t.borderTopLeftRadius = `${n.borderRadiusTopLeft}px` : s && (t.borderTopLeftRadius = `${s}px`), n.borderRadiusTopRight !== void 0 ? t.borderTopRightRadius = `${n.borderRadiusTopRight}px` : s && (t.borderTopRightRadius = `${s}px`), n.borderRadiusBottomRight !== void 0 ? t.borderBottomRightRadius = `${n.borderRadiusBottomRight}px` : s && (t.borderBottomRightRadius = `${s}px`), n.borderRadiusBottomLeft !== void 0 ? t.borderBottomLeftRadius = `${n.borderRadiusBottomLeft}px` : s && (t.borderBottomLeftRadius = `${s}px`);
1758
- } else n.border?.radius !== void 0 && (t.borderRadius = `${n.border.radius}px`);
1806
+ n.borderRadiusTopLeft !== void 0 ? e.borderTopLeftRadius = `${n.borderRadiusTopLeft}px` : s && (e.borderTopLeftRadius = `${s}px`), n.borderRadiusTopRight !== void 0 ? e.borderTopRightRadius = `${n.borderRadiusTopRight}px` : s && (e.borderTopRightRadius = `${s}px`), n.borderRadiusBottomRight !== void 0 ? e.borderBottomRightRadius = `${n.borderRadiusBottomRight}px` : s && (e.borderBottomRightRadius = `${s}px`), n.borderRadiusBottomLeft !== void 0 ? e.borderBottomLeftRadius = `${n.borderRadiusBottomLeft}px` : s && (e.borderBottomLeftRadius = `${s}px`);
1807
+ } else n.border?.radius !== void 0 && (e.borderRadius = `${n.border.radius}px`);
1759
1808
  if (n.borderTop || n.borderRight || n.borderBottom || n.borderLeft) {
1760
- const s = n.border || {}, r = { ...s, ...n.borderTop }, a = { ...s, ...n.borderRight }, h = { ...s, ...n.borderBottom }, c = { ...s, ...n.borderLeft };
1761
- t.borderTop = Q(r), t.borderRight = Q(a), t.borderBottom = Q(h), t.borderLeft = Q(c);
1762
- } else n.border && (t.border = Q(n.border));
1763
- n.shadow !== void 0 && (t.boxShadow = ve(n.shadow));
1764
- const o = we(n.filter);
1765
- if (t.filter = o || "none", n.opacity !== void 0 && (t.opacity = String(n.opacity)), n.cursor !== void 0 && (t.cursor = n.cursor), n.outline && n.outline.style !== "none" && (n.outline.width ?? 0) > 0) {
1766
- const s = n.outline.width ?? 0, r = n.outline.style ?? "solid", a = n.outline.color ?? "#000000";
1767
- t.outline = `${s}px ${r} ${a}`, n.outline.offset !== void 0 && (t.outlineOffset = `${n.outline.offset}px`);
1768
- }
1769
- if (n.objectFit !== void 0 && (t.objectFit = n.objectFit), n.aspectRatio !== void 0 && (t.aspectRatio = n.aspectRatio), n.clipPath !== void 0) {
1770
- const s = be(n.clipPath);
1771
- s && (s === "none" ? t.clipPath = "unset" : (t.clipPath = s, t.overflow = "hidden"));
1772
- }
1773
- return t;
1809
+ const s = n.border || {}, h = { ...s, ...n.borderTop }, c = { ...s, ...n.borderRight }, d = { ...s, ...n.borderBottom }, l = { ...s, ...n.borderLeft };
1810
+ e.borderTop = Q(h), e.borderRight = Q(c), e.borderBottom = Q(d), e.borderLeft = Q(l);
1811
+ } else n.border && (e.border = Q(n.border));
1812
+ n.shadow !== void 0 && (e.boxShadow = xe(n.shadow));
1813
+ const r = Ee(n.filter);
1814
+ if (e.filter = r || "none", n.opacity !== void 0 && (e.opacity = String(n.opacity)), n.cursor !== void 0 && (e.cursor = n.cursor), n.outline && n.outline.style !== "none" && (n.outline.width ?? 0) > 0) {
1815
+ const s = n.outline.width ?? 0, h = n.outline.style ?? "solid", c = n.outline.color ?? "#000000";
1816
+ e.outline = `${s}px ${h} ${c}`, n.outline.offset !== void 0 && (e.outlineOffset = `${n.outline.offset}px`);
1817
+ }
1818
+ if (n.objectFit !== void 0 && (e.objectFit = n.objectFit), n.aspectRatio !== void 0 && (e.aspectRatio = n.aspectRatio), n.clipPath !== void 0) {
1819
+ let s;
1820
+ const h = typeof n.clipPath == "object" && n.clipPath !== null && "shape" in n.clipPath, c = h ? n.clipPath : void 0;
1821
+ if (c?.mode === "height-relative" && t)
1822
+ s = ve(c.shape, t, i);
1823
+ else {
1824
+ const d = h && c ? c.shape : n.clipPath;
1825
+ s = ye(d);
1826
+ }
1827
+ s && (s === "none" ? e.clipPath = "unset" : (e.clipPath = s, e.overflow = "hidden"));
1828
+ }
1829
+ return e;
1774
1830
  }
1775
- function tt(n, t) {
1831
+ function Se(n, t) {
1776
1832
  t.borderRadius !== void 0 && (n.style.borderRadius = t.borderRadius), t.borderTopLeftRadius !== void 0 && (n.style.borderTopLeftRadius = t.borderTopLeftRadius), t.borderTopRightRadius !== void 0 && (n.style.borderTopRightRadius = t.borderTopRightRadius), t.borderBottomRightRadius !== void 0 && (n.style.borderBottomRightRadius = t.borderBottomRightRadius), t.borderBottomLeftRadius !== void 0 && (n.style.borderBottomLeftRadius = t.borderBottomLeftRadius), t.border !== void 0 && (n.style.border = t.border), t.borderTop !== void 0 && (n.style.borderTop = t.borderTop), t.borderRight !== void 0 && (n.style.borderRight = t.borderRight), t.borderBottom !== void 0 && (n.style.borderBottom = t.borderBottom), t.borderLeft !== void 0 && (n.style.borderLeft = t.borderLeft), t.boxShadow !== void 0 && (n.style.boxShadow = t.boxShadow), t.filter !== void 0 && (n.style.filter = t.filter), t.opacity !== void 0 && (n.style.opacity = t.opacity), t.cursor !== void 0 && (n.style.cursor = t.cursor), t.outline !== void 0 && (n.style.outline = t.outline), t.outlineOffset !== void 0 && (n.style.outlineOffset = t.outlineOffset), t.objectFit !== void 0 && (n.style.objectFit = t.objectFit), t.aspectRatio !== void 0 && (n.style.aspectRatio = t.aspectRatio), t.clipPath !== void 0 && (n.style.clipPath = t.clipPath), t.overflow !== void 0 && (n.style.overflow = t.overflow);
1777
1833
  }
1778
- function Ft(n) {
1834
+ function gt(n, t, i, e) {
1835
+ const o = tt(t, i, e);
1836
+ Se(n, o);
1837
+ }
1838
+ function Ot(n) {
1779
1839
  return n ? Array.isArray(n) ? n.join(" ") : n : "";
1780
1840
  }
1781
- function et(n, t) {
1782
- const e = Ft(t);
1783
- e && e.split(" ").forEach((i) => {
1784
- i.trim() && n.classList.add(i.trim());
1841
+ function ot(n, t) {
1842
+ const i = Ot(t);
1843
+ i && i.split(" ").forEach((e) => {
1844
+ e.trim() && n.classList.add(e.trim());
1785
1845
  });
1786
1846
  }
1787
- function Ot(n, t) {
1788
- const e = Ft(t);
1789
- e && e.split(" ").forEach((i) => {
1790
- i.trim() && n.classList.remove(i.trim());
1847
+ function mt(n, t) {
1848
+ const i = Ot(t);
1849
+ i && i.split(" ").forEach((e) => {
1850
+ e.trim() && n.classList.remove(e.trim());
1791
1851
  });
1792
1852
  }
1793
1853
  const Ct = {
1794
1854
  UNFOCUSING: 999,
1795
1855
  FOCUSING: 1e3
1796
1856
  };
1797
- class xe {
1798
- constructor(t, e, i) {
1799
- this.state = I.IDLE, this.currentFocus = null, this.focusData = null, this.outgoing = null, this.incoming = null, this.focusGeneration = 0, this.config = t, this.animationEngine = e, this.defaultStyles = st(i?.default), this.focusedStyles = st(i?.focused), this.defaultClassName = i?.default?.className, this.focusedClassName = i?.focused?.className;
1857
+ class Re {
1858
+ constructor(t, i, e) {
1859
+ this.state = R.IDLE, this.currentFocus = null, this.focusData = null, this.outgoing = null, this.incoming = null, this.focusGeneration = 0, this.config = t, this.animationEngine = i, this.styling = e, this.focusedClassName = e?.focused?.className;
1800
1860
  }
1801
1861
  /**
1802
1862
  * Get current state machine state
@@ -1808,7 +1868,7 @@ class xe {
1808
1868
  * Check if any animation is in progress
1809
1869
  */
1810
1870
  isAnimating() {
1811
- return this.state !== I.IDLE && this.state !== I.FOCUSED;
1871
+ return this.state !== R.IDLE && this.state !== R.FOCUSED;
1812
1872
  }
1813
1873
  /**
1814
1874
  * Normalize scalePercent value
@@ -1820,20 +1880,20 @@ class xe {
1820
1880
  * Calculate target dimensions for focused image
1821
1881
  * Returns actual pixel dimensions instead of scale factor for sharper rendering
1822
1882
  */
1823
- calculateFocusDimensions(t, e, i) {
1824
- const o = this.normalizeScalePercent(this.config.scalePercent), s = i.height * o, r = t / e;
1825
- let a = s, h = a * r;
1826
- const c = i.width * o;
1827
- return h > c && (h = c, a = h / r), { width: h, height: a };
1883
+ calculateFocusDimensions(t, i, e) {
1884
+ const o = this.normalizeScalePercent(this.config.scalePercent), a = e.height * o, r = t / i;
1885
+ let s = a, h = s * r;
1886
+ const c = e.width * o;
1887
+ return h > c && (h = c, s = h / r), { width: h, height: s };
1828
1888
  }
1829
1889
  /**
1830
1890
  * Calculate the transform needed to center an image (position only, no scale)
1831
1891
  * Scale is handled by animating actual dimensions for sharper rendering
1832
1892
  */
1833
- calculateFocusTransform(t, e) {
1834
- const i = t.width / 2, o = t.height / 2, s = i - e.x, r = o - e.y;
1893
+ calculateFocusTransform(t, i) {
1894
+ const e = t.width / 2, o = t.height / 2, a = e - i.x, r = o - i.y;
1835
1895
  return {
1836
- x: s,
1896
+ x: a,
1837
1897
  y: r,
1838
1898
  rotation: 0,
1839
1899
  scale: 1
@@ -1844,30 +1904,30 @@ class xe {
1844
1904
  * Build transform string for dimension-based zoom (no scale in transform)
1845
1905
  */
1846
1906
  buildDimensionZoomTransform(t) {
1847
- const e = ["translate(-50%, -50%)"];
1907
+ const i = ["translate(-50%, -50%)"];
1848
1908
  if (t.x !== void 0 || t.y !== void 0) {
1849
- const i = t.x ?? 0, o = t.y ?? 0;
1850
- e.push(`translate(${i}px, ${o}px)`);
1909
+ const e = t.x ?? 0, o = t.y ?? 0;
1910
+ i.push(`translate(${e}px, ${o}px)`);
1851
1911
  }
1852
- return t.rotation !== void 0 && e.push(`rotate(${t.rotation}deg)`), e.join(" ");
1912
+ return t.rotation !== void 0 && i.push(`rotate(${t.rotation}deg)`), i.join(" ");
1853
1913
  }
1854
1914
  /**
1855
1915
  * Create a Web Animation that animates both transform (position) and dimensions
1856
1916
  * This provides sharper zoom by re-rendering at target size instead of scaling pixels
1857
1917
  */
1858
- animateWithDimensions(t, e, i, o, s, r, a, h) {
1859
- const c = this.buildDimensionZoomTransform(e), u = this.buildDimensionZoomTransform(i);
1918
+ animateWithDimensions(t, i, e, o, a, r, s, h) {
1919
+ const c = this.buildDimensionZoomTransform(i), d = this.buildDimensionZoomTransform(e);
1860
1920
  return t.style.transition = "none", t.animate(
1861
1921
  [
1862
1922
  {
1863
1923
  transform: c,
1864
1924
  width: `${o}px`,
1865
- height: `${s}px`
1925
+ height: `${a}px`
1866
1926
  },
1867
1927
  {
1868
- transform: u,
1928
+ transform: d,
1869
1929
  width: `${r}px`,
1870
- height: `${a}px`
1930
+ height: `${s}px`
1871
1931
  }
1872
1932
  ],
1873
1933
  {
@@ -1879,15 +1939,36 @@ class xe {
1879
1939
  }
1880
1940
  /**
1881
1941
  * Apply focused styling to an element
1942
+ * Applies all focused styling properties, classes, and z-index
1882
1943
  */
1883
- applyFocusedStyling(t, e) {
1884
- t.style.zIndex = String(e), t.classList.add("fbn-ic-focused"), tt(t, this.focusedStyles), et(t, this.focusedClassName);
1944
+ applyFocusedStyling(t, i) {
1945
+ if (t.style.zIndex = String(i), t.classList.add("fbn-ic-focused"), ot(t, this.focusedClassName), this.styling?.focused) {
1946
+ const e = tt(this.styling.focused, t.offsetHeight, t.offsetWidth);
1947
+ e.borderRadius !== void 0 && (t.style.borderRadius = e.borderRadius), e.borderTopLeftRadius !== void 0 && (t.style.borderTopLeftRadius = e.borderTopLeftRadius), e.borderTopRightRadius !== void 0 && (t.style.borderTopRightRadius = e.borderTopRightRadius), e.borderBottomRightRadius !== void 0 && (t.style.borderBottomRightRadius = e.borderBottomRightRadius), e.borderBottomLeftRadius !== void 0 && (t.style.borderBottomLeftRadius = e.borderBottomLeftRadius), e.border !== void 0 && (t.style.border = e.border), e.borderTop !== void 0 && (t.style.borderTop = e.borderTop), e.borderRight !== void 0 && (t.style.borderRight = e.borderRight), e.borderBottom !== void 0 && (t.style.borderBottom = e.borderBottom), e.borderLeft !== void 0 && (t.style.borderLeft = e.borderLeft), e.boxShadow !== void 0 && (t.style.boxShadow = e.boxShadow), e.filter !== void 0 && (t.style.filter = e.filter), e.opacity !== void 0 && (t.style.opacity = e.opacity), e.cursor !== void 0 && (t.style.cursor = e.cursor), e.outline !== void 0 && (t.style.outline = e.outline), e.outlineOffset !== void 0 && (t.style.outlineOffset = e.outlineOffset), e.objectFit !== void 0 && (t.style.objectFit = e.objectFit), e.aspectRatio !== void 0 && (t.style.aspectRatio = e.aspectRatio);
1948
+ }
1885
1949
  }
1886
1950
  /**
1887
1951
  * Remove focused styling from an element
1952
+ * Restores default styling properties, removes classes, and resets z-index
1888
1953
  */
1889
- removeFocusedStyling(t, e) {
1890
- t.style.zIndex = e, t.classList.remove("fbn-ic-focused"), Ot(t, this.focusedClassName), tt(t, this.defaultStyles), et(t, this.defaultClassName);
1954
+ removeFocusedStyling(t, i) {
1955
+ if (t.style.zIndex = i, t.classList.remove("fbn-ic-focused"), mt(t, this.focusedClassName), this.styling?.default) {
1956
+ const e = tt(this.styling.default, t.offsetHeight, t.offsetWidth);
1957
+ e.borderRadius !== void 0 && (t.style.borderRadius = e.borderRadius), e.borderTopLeftRadius !== void 0 && (t.style.borderTopLeftRadius = e.borderTopLeftRadius), e.borderTopRightRadius !== void 0 && (t.style.borderTopRightRadius = e.borderTopRightRadius), e.borderBottomRightRadius !== void 0 && (t.style.borderBottomRightRadius = e.borderBottomRightRadius), e.borderBottomLeftRadius !== void 0 && (t.style.borderBottomLeftRadius = e.borderBottomLeftRadius), e.border !== void 0 && (t.style.border = e.border), e.borderTop !== void 0 && (t.style.borderTop = e.borderTop), e.borderRight !== void 0 && (t.style.borderRight = e.borderRight), e.borderBottom !== void 0 && (t.style.borderBottom = e.borderBottom), e.borderLeft !== void 0 && (t.style.borderLeft = e.borderLeft), e.boxShadow !== void 0 && (t.style.boxShadow = e.boxShadow), e.filter !== void 0 && (t.style.filter = e.filter), e.opacity !== void 0 && (t.style.opacity = e.opacity), e.cursor !== void 0 && (t.style.cursor = e.cursor), e.outline !== void 0 && (t.style.outline = e.outline), e.outlineOffset !== void 0 && (t.style.outlineOffset = e.outlineOffset), e.objectFit !== void 0 && (t.style.objectFit = e.objectFit), e.aspectRatio !== void 0 && (t.style.aspectRatio = e.aspectRatio);
1958
+ }
1959
+ }
1960
+ /**
1961
+ * Continuously update clip-path during animation based on current element dimensions
1962
+ * This ensures clip-path changes smoothly as width/height animate
1963
+ */
1964
+ startClipPathAnimation(t, i, e) {
1965
+ let o = e ? this.styling?.focused ?? this.styling?.default : this.styling?.default;
1966
+ e && this.styling?.focused && this.styling.focused.clipPath === void 0 && (o = { ...o, clipPath: void 0 });
1967
+ const a = () => {
1968
+ const r = t.offsetHeight, s = t.offsetWidth, h = tt(o, r, s);
1969
+ h.clipPath !== void 0 ? t.style.clipPath = h.clipPath : t.style.clipPath = "unset", h.overflow !== void 0 && (t.style.overflow = h.overflow), i.animation.playState === "running" && requestAnimationFrame(a);
1970
+ };
1971
+ requestAnimationFrame(a);
1891
1972
  }
1892
1973
  /**
1893
1974
  * Start focus animation for an image using dimension-based zoom
@@ -1895,48 +1976,50 @@ class xe {
1895
1976
  * @param fromTransform - Optional starting transform (for mid-animation reversals)
1896
1977
  * @param fromDimensions - Optional starting dimensions (for mid-animation reversals)
1897
1978
  */
1898
- startFocusAnimation(t, e, i, o, s) {
1899
- const r = t.style.zIndex || "", a = t.offsetWidth, h = t.offsetHeight, c = this.calculateFocusDimensions(a, h, e), u = this.calculateFocusTransform(e, i);
1900
- this.applyFocusedStyling(t, Ct.FOCUSING), this.animationEngine.cancelAllAnimations(t);
1901
- const l = o ?? {
1979
+ startFocusAnimation(t, i, e, o, a) {
1980
+ const r = t.style.zIndex || "", s = t.offsetWidth, h = t.offsetHeight, c = this.calculateFocusDimensions(s, h, i), d = this.calculateFocusTransform(i, e);
1981
+ this.animationEngine.cancelAllAnimations(t);
1982
+ const l = this.config.animationDuration ?? 600;
1983
+ this.applyFocusedStyling(t, Ct.FOCUSING);
1984
+ const u = o ?? {
1902
1985
  x: 0,
1903
1986
  y: 0,
1904
- rotation: i.rotation,
1987
+ rotation: e.rotation,
1905
1988
  scale: 1
1906
1989
  // No scale - using dimensions
1907
- }, d = s?.width ?? a, m = s?.height ?? h, b = this.config.animationDuration ?? 600, p = this.animateWithDimensions(
1990
+ }, g = a?.width ?? s, p = a?.height ?? h, b = this.animateWithDimensions(
1908
1991
  t,
1909
- l,
1910
1992
  u,
1911
1993
  d,
1912
- m,
1994
+ g,
1995
+ p,
1913
1996
  c.width,
1914
1997
  c.height,
1915
- b
1916
- ), g = {
1998
+ l
1999
+ ), f = {
1917
2000
  id: `focus-${Date.now()}`,
1918
2001
  element: t,
1919
- animation: p,
1920
- fromState: l,
1921
- toState: u,
2002
+ animation: b,
2003
+ fromState: u,
2004
+ toState: d,
1922
2005
  startTime: performance.now(),
1923
- duration: b
2006
+ duration: l
1924
2007
  };
1925
2008
  return this.focusData = {
1926
2009
  element: t,
1927
- originalState: i,
1928
- focusTransform: u,
2010
+ originalState: e,
2011
+ focusTransform: d,
1929
2012
  originalZIndex: r,
1930
- originalWidth: a,
2013
+ originalWidth: s,
1931
2014
  originalHeight: h,
1932
2015
  focusWidth: c.width,
1933
2016
  focusHeight: c.height
1934
- }, {
2017
+ }, this.startClipPathAnimation(t, f, !0), {
1935
2018
  element: t,
1936
- originalState: i,
1937
- animationHandle: g,
2019
+ originalState: e,
2020
+ animationHandle: f,
1938
2021
  direction: "in",
1939
- originalWidth: a,
2022
+ originalWidth: s,
1940
2023
  originalHeight: h
1941
2024
  };
1942
2025
  }
@@ -1945,39 +2028,41 @@ class xe {
1945
2028
  * Animates back to original dimensions for consistent behavior
1946
2029
  * @param fromDimensions - Optional starting dimensions (for mid-animation reversals)
1947
2030
  */
1948
- startUnfocusAnimation(t, e, i, o) {
2031
+ startUnfocusAnimation(t, i, e, o) {
1949
2032
  t.style.zIndex = String(Ct.UNFOCUSING), this.animationEngine.cancelAllAnimations(t);
1950
- const s = i ?? this.focusData?.focusTransform ?? { x: 0, y: 0, rotation: 0, scale: 1 }, r = o?.width ?? this.focusData?.focusWidth ?? t.offsetWidth, a = o?.height ?? this.focusData?.focusHeight ?? t.offsetHeight, h = {
2033
+ const a = this.config.animationDuration ?? 600;
2034
+ t.classList.remove("fbn-ic-focused"), mt(t, this.focusedClassName);
2035
+ const r = e ?? this.focusData?.focusTransform ?? { x: 0, y: 0, rotation: 0, scale: 1 }, s = o?.width ?? this.focusData?.focusWidth ?? t.offsetWidth, h = o?.height ?? this.focusData?.focusHeight ?? t.offsetHeight, c = {
1951
2036
  x: 0,
1952
2037
  y: 0,
1953
- rotation: e.rotation,
2038
+ rotation: i.rotation,
1954
2039
  scale: 1
1955
2040
  // No scale - using dimensions
1956
- }, c = this.focusData?.originalWidth ?? t.offsetWidth, u = this.focusData?.originalHeight ?? t.offsetHeight, l = this.config.animationDuration ?? 600, d = this.animateWithDimensions(
2041
+ }, d = this.focusData?.originalWidth ?? t.offsetWidth, l = this.focusData?.originalHeight ?? t.offsetHeight, u = this.animateWithDimensions(
1957
2042
  t,
1958
- s,
1959
- h,
1960
2043
  r,
1961
- a,
1962
2044
  c,
1963
- u,
1964
- l
1965
- ), m = {
2045
+ s,
2046
+ h,
2047
+ d,
2048
+ l,
2049
+ a
2050
+ ), g = {
1966
2051
  id: `unfocus-${Date.now()}`,
1967
2052
  element: t,
1968
- animation: d,
1969
- fromState: s,
1970
- toState: h,
2053
+ animation: u,
2054
+ fromState: r,
2055
+ toState: c,
1971
2056
  startTime: performance.now(),
1972
- duration: l
2057
+ duration: a
1973
2058
  };
1974
- return {
2059
+ return this.startClipPathAnimation(t, g, !1), {
1975
2060
  element: t,
1976
- originalState: e,
1977
- animationHandle: m,
2061
+ originalState: i,
2062
+ animationHandle: g,
1978
2063
  direction: "out",
1979
- originalWidth: c,
1980
- originalHeight: u
2064
+ originalWidth: d,
2065
+ originalHeight: l
1981
2066
  };
1982
2067
  }
1983
2068
  /**
@@ -1995,10 +2080,10 @@ class xe {
1995
2080
  * Caller is responsible for calling animationEngine.cancelAllAnimations() afterwards.
1996
2081
  */
1997
2082
  captureMidAnimationState(t) {
1998
- const e = getComputedStyle(t), i = new DOMMatrix(e.transform), o = t.offsetWidth, s = t.offsetHeight, r = i.e + o * 0.5, a = i.f + s * 0.5, h = Math.atan2(i.b, i.a) * (180 / Math.PI);
1999
- return t.style.width = `${o}px`, t.style.height = `${s}px`, t.style.transform = `translate(-50%, -50%) translate(${r}px, ${a}px) rotate(${h}deg)`, t.style.transition = "none", {
2000
- transform: { x: r, y: a, rotation: h, scale: 1 },
2001
- dimensions: { width: o, height: s }
2083
+ const i = getComputedStyle(t), e = new DOMMatrix(i.transform), o = t.offsetWidth, a = t.offsetHeight, r = e.e + o * 0.5, s = e.f + a * 0.5, h = Math.atan2(e.b, e.a) * (180 / Math.PI);
2084
+ return t.style.width = `${o}px`, t.style.height = `${a}px`, t.style.transform = `translate(-50%, -50%) translate(${r}px, ${s}px) rotate(${h}deg)`, t.style.transition = "none", {
2085
+ transform: { x: r, y: s, rotation: h, scale: 1 },
2086
+ dimensions: { width: o, height: a }
2002
2087
  };
2003
2088
  }
2004
2089
  /**
@@ -2013,82 +2098,82 @@ class xe {
2013
2098
  /**
2014
2099
  * Reset an element instantly to its original position and dimensions (no animation)
2015
2100
  */
2016
- resetElementInstantly(t, e, i, o, s) {
2101
+ resetElementInstantly(t, i, e, o, a) {
2017
2102
  this.animationEngine.cancelAllAnimations(t);
2018
2103
  const r = ["translate(-50%, -50%)"];
2019
- r.push("translate(0px, 0px)"), r.push(`rotate(${e.rotation}deg)`), t.style.transition = "none", t.style.transform = r.join(" "), o !== void 0 && s !== void 0 && (t.style.width = `${o}px`, t.style.height = `${s}px`), this.removeFocusedStyling(t, i);
2104
+ r.push("translate(0px, 0px)"), r.push(`rotate(${i.rotation}deg)`), t.style.transition = "none", t.style.transform = r.join(" "), o !== void 0 && a !== void 0 && (t.style.width = `${o}px`, t.style.height = `${a}px`), this.removeFocusedStyling(t, e);
2020
2105
  }
2021
2106
  /**
2022
2107
  * Focus (zoom) an image to center of container
2023
2108
  * Implements cross-animation when swapping focus
2024
2109
  */
2025
- async focusImage(t, e, i) {
2026
- if (this.currentFocus === t && this.state === I.FOCUSED)
2110
+ async focusImage(t, i, e) {
2111
+ if (this.currentFocus === t && this.state === R.FOCUSED)
2027
2112
  return this.unfocusImage();
2028
- if (this.incoming?.element === t && this.state === I.FOCUSING) {
2029
- const { transform: s, dimensions: r } = this.captureMidAnimationState(t);
2113
+ if (this.incoming?.element === t && this.state === R.FOCUSING) {
2114
+ const { transform: a, dimensions: r } = this.captureMidAnimationState(t);
2030
2115
  this.animationEngine.cancelAllAnimations(t), this.outgoing = this.startUnfocusAnimation(
2031
2116
  t,
2032
2117
  this.incoming.originalState,
2033
- s,
2118
+ a,
2034
2119
  r
2035
- ), this.incoming = null, this.state = I.UNFOCUSING, await this.waitForAnimation(this.outgoing.animationHandle), this.removeFocusedStyling(this.outgoing.element, this.focusData?.originalZIndex || ""), this.outgoing = null, this.currentFocus = null, this.focusData = null, this.state = I.IDLE;
2120
+ ), this.incoming = null, this.state = R.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 = R.IDLE;
2036
2121
  return;
2037
2122
  }
2038
2123
  const o = ++this.focusGeneration;
2039
2124
  switch (this.state) {
2040
- case I.IDLE:
2041
- if (this.state = I.FOCUSING, this.incoming = this.startFocusAnimation(t, e, i), await this.waitForAnimation(this.incoming.animationHandle), this.focusGeneration !== o) return;
2042
- this.currentFocus = t, this.incoming = null, this.state = I.FOCUSED;
2125
+ case R.IDLE:
2126
+ if (this.state = R.FOCUSING, this.incoming = this.startFocusAnimation(t, i, e), await this.waitForAnimation(this.incoming.animationHandle), this.focusGeneration !== o) return;
2127
+ this.currentFocus = t, this.incoming = null, this.state = R.FOCUSED;
2043
2128
  break;
2044
- case I.FOCUSED:
2045
- if (this.state = I.CROSS_ANIMATING, this.currentFocus && this.focusData && (this.outgoing = this.startUnfocusAnimation(
2129
+ case R.FOCUSED:
2130
+ if (this.state = R.CROSS_ANIMATING, this.currentFocus && this.focusData && (this.outgoing = this.startUnfocusAnimation(
2046
2131
  this.currentFocus,
2047
2132
  this.focusData.originalState
2048
- )), this.incoming = this.startFocusAnimation(t, e, i), await Promise.all([
2133
+ )), this.incoming = this.startFocusAnimation(t, i, e), await Promise.all([
2049
2134
  this.outgoing ? this.waitForAnimation(this.outgoing.animationHandle) : Promise.resolve(),
2050
2135
  this.waitForAnimation(this.incoming.animationHandle)
2051
2136
  ]), this.focusGeneration !== o)
2052
2137
  return;
2053
- this.outgoing && (this.removeFocusedStyling(this.outgoing.element, this.outgoing.originalState.zIndex?.toString() || ""), this.outgoing = null), this.currentFocus = t, this.incoming = null, this.state = I.FOCUSED;
2138
+ this.outgoing && (this.removeFocusedStyling(this.outgoing.element, this.outgoing.originalState.zIndex?.toString() || ""), this.outgoing = null), this.currentFocus = t, this.incoming = null, this.state = R.FOCUSED;
2054
2139
  break;
2055
- case I.FOCUSING:
2140
+ case R.FOCUSING:
2056
2141
  if (this.incoming && (this.animationEngine.cancelAnimation(this.incoming.animationHandle, !1), this.resetElementInstantly(
2057
2142
  this.incoming.element,
2058
2143
  this.incoming.originalState,
2059
2144
  this.focusData?.originalZIndex || "",
2060
2145
  this.focusData?.originalWidth,
2061
2146
  this.focusData?.originalHeight
2062
- ), this.incoming = null), this.incoming = this.startFocusAnimation(t, e, i), await this.waitForAnimation(this.incoming.animationHandle), this.focusGeneration !== o) return;
2063
- this.currentFocus = t, this.incoming = null, this.state = I.FOCUSED;
2147
+ ), this.incoming = null), this.incoming = this.startFocusAnimation(t, i, e), await this.waitForAnimation(this.incoming.animationHandle), this.focusGeneration !== o) return;
2148
+ this.currentFocus = t, this.incoming = null, this.state = R.FOCUSED;
2064
2149
  break;
2065
- case I.UNFOCUSING:
2066
- if (this.state = I.CROSS_ANIMATING, this.incoming = this.startFocusAnimation(t, e, i), await Promise.all([
2150
+ case R.UNFOCUSING:
2151
+ if (this.state = R.CROSS_ANIMATING, this.incoming = this.startFocusAnimation(t, i, e), await Promise.all([
2067
2152
  this.outgoing ? this.waitForAnimation(this.outgoing.animationHandle) : Promise.resolve(),
2068
2153
  this.waitForAnimation(this.incoming.animationHandle)
2069
2154
  ]), this.focusGeneration !== o) return;
2070
- this.outgoing && (this.removeFocusedStyling(this.outgoing.element, this.outgoing.originalState.zIndex?.toString() || ""), this.outgoing = null), this.currentFocus = t, this.incoming = null, this.state = I.FOCUSED;
2155
+ this.outgoing && (this.removeFocusedStyling(this.outgoing.element, this.outgoing.originalState.zIndex?.toString() || ""), this.outgoing = null), this.currentFocus = t, this.incoming = null, this.state = R.FOCUSED;
2071
2156
  break;
2072
- case I.CROSS_ANIMATING:
2157
+ case R.CROSS_ANIMATING:
2073
2158
  if (this.incoming?.element === t)
2074
2159
  return;
2075
2160
  if (this.outgoing?.element === t) {
2076
- const { transform: s, dimensions: r } = this.captureMidAnimationState(t);
2161
+ const { transform: a, dimensions: r } = this.captureMidAnimationState(t);
2077
2162
  if (this.animationEngine.cancelAllAnimations(t), this.incoming) {
2078
- const { transform: a, dimensions: h } = this.captureMidAnimationState(this.incoming.element);
2163
+ const { transform: s, dimensions: h } = this.captureMidAnimationState(this.incoming.element);
2079
2164
  this.animationEngine.cancelAllAnimations(this.incoming.element), this.outgoing = this.startUnfocusAnimation(
2080
2165
  this.incoming.element,
2081
2166
  this.incoming.originalState,
2082
- a,
2167
+ s,
2083
2168
  h
2084
2169
  );
2085
2170
  } else
2086
2171
  this.outgoing = null;
2087
- if (this.incoming = this.startFocusAnimation(t, e, i, s, r), await Promise.all([
2172
+ if (this.incoming = this.startFocusAnimation(t, i, e, a, r), await Promise.all([
2088
2173
  this.outgoing ? this.waitForAnimation(this.outgoing.animationHandle) : Promise.resolve(),
2089
2174
  this.waitForAnimation(this.incoming.animationHandle)
2090
2175
  ]), this.focusGeneration !== o) return;
2091
- this.outgoing && (this.removeFocusedStyling(this.outgoing.element, this.outgoing.originalState.zIndex?.toString() || ""), this.outgoing = null), this.currentFocus = t, this.incoming = null, this.state = I.FOCUSED;
2176
+ this.outgoing && (this.removeFocusedStyling(this.outgoing.element, this.outgoing.originalState.zIndex?.toString() || ""), this.outgoing = null), this.currentFocus = t, this.incoming = null, this.state = R.FOCUSED;
2092
2177
  return;
2093
2178
  }
2094
2179
  if (this.outgoing && (this.animationEngine.cancelAnimation(this.outgoing.animationHandle, !1), this.resetElementInstantly(
@@ -2098,19 +2183,19 @@ class xe {
2098
2183
  this.outgoing.originalWidth,
2099
2184
  this.outgoing.originalHeight
2100
2185
  ), this.outgoing = null), this.incoming) {
2101
- const { transform: s, dimensions: r } = this.captureMidAnimationState(this.incoming.element);
2186
+ const { transform: a, dimensions: r } = this.captureMidAnimationState(this.incoming.element);
2102
2187
  this.animationEngine.cancelAllAnimations(this.incoming.element), this.outgoing = this.startUnfocusAnimation(
2103
2188
  this.incoming.element,
2104
2189
  this.incoming.originalState,
2105
- s,
2190
+ a,
2106
2191
  r
2107
2192
  );
2108
2193
  }
2109
- if (this.incoming = this.startFocusAnimation(t, e, i), await Promise.all([
2194
+ if (this.incoming = this.startFocusAnimation(t, i, e), await Promise.all([
2110
2195
  this.outgoing ? this.waitForAnimation(this.outgoing.animationHandle) : Promise.resolve(),
2111
2196
  this.waitForAnimation(this.incoming.animationHandle)
2112
2197
  ]), this.focusGeneration !== o) return;
2113
- this.outgoing && (this.removeFocusedStyling(this.outgoing.element, this.outgoing.originalState.zIndex?.toString() || ""), this.outgoing = null), this.currentFocus = t, this.incoming = null, this.state = I.FOCUSED;
2198
+ this.outgoing && (this.removeFocusedStyling(this.outgoing.element, this.outgoing.originalState.zIndex?.toString() || ""), this.outgoing = null), this.currentFocus = t, this.incoming = null, this.state = R.FOCUSED;
2114
2199
  break;
2115
2200
  }
2116
2201
  }
@@ -2118,47 +2203,47 @@ class xe {
2118
2203
  * Unfocus current image, returning it to original position
2119
2204
  */
2120
2205
  async unfocusImage() {
2121
- if (this.state === I.UNFOCUSING)
2206
+ if (this.state === R.UNFOCUSING)
2122
2207
  return;
2123
2208
  const t = ++this.focusGeneration;
2124
2209
  if (!this.currentFocus || !this.focusData) {
2125
- if (this.incoming && this.state === I.FOCUSING) {
2126
- const { transform: s, dimensions: r } = this.captureMidAnimationState(this.incoming.element);
2210
+ if (this.incoming && this.state === R.FOCUSING) {
2211
+ const { transform: a, dimensions: r } = this.captureMidAnimationState(this.incoming.element);
2127
2212
  if (this.animationEngine.cancelAllAnimations(this.incoming.element), this.outgoing = this.startUnfocusAnimation(
2128
2213
  this.incoming.element,
2129
2214
  this.incoming.originalState,
2130
- s,
2215
+ a,
2131
2216
  r
2132
- ), this.incoming = null, this.state = I.UNFOCUSING, await this.waitForAnimation(this.outgoing.animationHandle), this.focusGeneration !== t) return;
2133
- this.removeFocusedStyling(this.outgoing.element, this.focusData?.originalZIndex || ""), this.outgoing = null, this.focusData = null, this.state = I.IDLE;
2217
+ ), this.incoming = null, this.state = R.UNFOCUSING, await this.waitForAnimation(this.outgoing.animationHandle), this.focusGeneration !== t) return;
2218
+ this.removeFocusedStyling(this.outgoing.element, this.focusData?.originalZIndex || ""), this.outgoing = null, this.focusData = null, this.state = R.IDLE;
2134
2219
  }
2135
2220
  return;
2136
2221
  }
2137
- if (this.state === I.CROSS_ANIMATING && this.incoming) {
2138
- const { transform: s, dimensions: r } = this.captureMidAnimationState(this.incoming.element);
2222
+ if (this.state === R.CROSS_ANIMATING && this.incoming) {
2223
+ const { transform: a, dimensions: r } = this.captureMidAnimationState(this.incoming.element);
2139
2224
  this.animationEngine.cancelAllAnimations(this.incoming.element);
2140
- const a = this.startUnfocusAnimation(
2225
+ const s = this.startUnfocusAnimation(
2141
2226
  this.incoming.element,
2142
2227
  this.incoming.originalState,
2143
- s,
2228
+ a,
2144
2229
  r
2145
2230
  );
2146
2231
  if (await Promise.all([
2147
2232
  this.outgoing ? this.waitForAnimation(this.outgoing.animationHandle) : Promise.resolve(),
2148
- this.waitForAnimation(a.animationHandle)
2233
+ this.waitForAnimation(s.animationHandle)
2149
2234
  ]), this.focusGeneration !== t) return;
2150
- this.outgoing && this.removeFocusedStyling(this.outgoing.element, this.outgoing.originalState.zIndex?.toString() || ""), this.removeFocusedStyling(a.element, this.incoming.originalState.zIndex?.toString() || ""), this.outgoing = null, this.incoming = null, this.currentFocus = null, this.focusData = null, this.state = I.IDLE;
2235
+ this.outgoing && this.removeFocusedStyling(this.outgoing.element, this.outgoing.originalState.zIndex?.toString() || ""), this.removeFocusedStyling(s.element, this.incoming.originalState.zIndex?.toString() || ""), this.outgoing = null, this.incoming = null, this.currentFocus = null, this.focusData = null, this.state = R.IDLE;
2151
2236
  return;
2152
2237
  }
2153
- this.state = I.UNFOCUSING;
2154
- const e = this.currentFocus, i = this.focusData.originalState, o = this.focusData.originalZIndex;
2155
- this.outgoing = this.startUnfocusAnimation(e, i), await this.waitForAnimation(this.outgoing.animationHandle), this.focusGeneration === t && (this.removeFocusedStyling(e, o), this.outgoing = null, this.currentFocus = null, this.focusData = null, this.state = I.IDLE);
2238
+ this.state = R.UNFOCUSING;
2239
+ const i = this.currentFocus, e = this.focusData.originalState, o = this.focusData.originalZIndex;
2240
+ this.outgoing = this.startUnfocusAnimation(i, e), await this.waitForAnimation(this.outgoing.animationHandle), this.focusGeneration === t && (this.removeFocusedStyling(i, o), this.outgoing = null, this.currentFocus = null, this.focusData = null, this.state = R.IDLE);
2156
2241
  }
2157
2242
  /**
2158
2243
  * Swap focus from current image to a new one (alias for focusImage with cross-animation)
2159
2244
  */
2160
- async swapFocus(t, e, i) {
2161
- return this.focusImage(t, e, i);
2245
+ async swapFocus(t, i, e) {
2246
+ return this.focusImage(t, i, e);
2162
2247
  }
2163
2248
  /**
2164
2249
  * Get currently focused image element
@@ -2170,7 +2255,7 @@ class xe {
2170
2255
  * Check if an image is currently focused (stable state)
2171
2256
  */
2172
2257
  isFocused(t) {
2173
- return this.currentFocus === t && this.state === I.FOCUSED;
2258
+ return this.currentFocus === t && this.state === R.FOCUSED;
2174
2259
  }
2175
2260
  /**
2176
2261
  * Check if an image is the target of current focus animation
@@ -2191,23 +2276,23 @@ class xe {
2191
2276
  * Used during swipe gestures for visual feedback
2192
2277
  */
2193
2278
  setDragOffset(t) {
2194
- if (!this.currentFocus || !this.focusData || this.state !== I.FOCUSED) return;
2195
- const e = this.currentFocus, i = this.focusData.focusTransform, o = ["translate(-50%, -50%)"], s = (i.x ?? 0) + t, r = i.y ?? 0;
2196
- o.push(`translate(${s}px, ${r}px)`), i.rotation !== void 0 && o.push(`rotate(${i.rotation}deg)`), e.style.transition = "none", e.style.transform = o.join(" ");
2279
+ if (!this.currentFocus || !this.focusData || this.state !== R.FOCUSED) return;
2280
+ const i = this.currentFocus, e = this.focusData.focusTransform, o = ["translate(-50%, -50%)"], a = (e.x ?? 0) + t, r = e.y ?? 0;
2281
+ o.push(`translate(${a}px, ${r}px)`), e.rotation !== void 0 && o.push(`rotate(${e.rotation}deg)`), i.style.transition = "none", i.style.transform = o.join(" ");
2197
2282
  }
2198
2283
  /**
2199
2284
  * Clear the drag offset, optionally animating back to center
2200
2285
  * @param animate - If true, animate back to center; if false, snap instantly
2201
2286
  * @param duration - Animation duration in ms (default 150)
2202
2287
  */
2203
- clearDragOffset(t, e = 150) {
2204
- if (!this.currentFocus || !this.focusData || this.state !== I.FOCUSED) return;
2205
- const i = this.currentFocus, o = this.focusData.focusTransform, s = ["translate(-50%, -50%)"], r = o.x ?? 0, a = o.y ?? 0;
2206
- s.push(`translate(${r}px, ${a}px)`), o.rotation !== void 0 && s.push(`rotate(${o.rotation}deg)`);
2207
- const h = s.join(" ");
2208
- t ? (i.style.transition = `transform ${e}ms ease-out`, i.style.transform = h, setTimeout(() => {
2209
- this.currentFocus === i && (i.style.transition = "none");
2210
- }, e)) : (i.style.transition = "none", i.style.transform = h);
2288
+ clearDragOffset(t, i = 150) {
2289
+ if (!this.currentFocus || !this.focusData || this.state !== R.FOCUSED) return;
2290
+ const e = this.currentFocus, o = this.focusData.focusTransform, a = ["translate(-50%, -50%)"], r = o.x ?? 0, s = o.y ?? 0;
2291
+ a.push(`translate(${r}px, ${s}px)`), o.rotation !== void 0 && a.push(`rotate(${o.rotation}deg)`);
2292
+ const h = a.join(" ");
2293
+ t ? (e.style.transition = `transform ${i}ms ease-out`, e.style.transform = h, setTimeout(() => {
2294
+ this.currentFocus === e && (e.style.transition = "none");
2295
+ }, i)) : (e.style.transition = "none", e.style.transform = h);
2211
2296
  }
2212
2297
  /**
2213
2298
  * Reset zoom state (cancels all animations)
@@ -2231,12 +2316,12 @@ class xe {
2231
2316
  this.focusData.originalZIndex,
2232
2317
  this.focusData.originalWidth,
2233
2318
  this.focusData.originalHeight
2234
- ), this.state = I.IDLE, this.currentFocus = null, this.focusData = null, this.outgoing = null, this.incoming = null;
2319
+ ), this.state = R.IDLE, this.currentFocus = null, this.focusData = null, this.outgoing = null, this.incoming = null;
2235
2320
  }
2236
2321
  }
2237
- const Ee = 50, Se = 0.5, Ie = 20, Ae = 0.3, Te = 150, Ce = 30, at = class at {
2238
- constructor(t, e) {
2239
- this.enabled = !1, this.touchState = null, this.recentTouchTimestamp = 0, this.container = t, this.callbacks = e, this.boundTouchStart = this.handleTouchStart.bind(this), this.boundTouchMove = this.handleTouchMove.bind(this), this.boundTouchEnd = this.handleTouchEnd.bind(this), this.boundTouchCancel = this.handleTouchCancel.bind(this);
2322
+ const Ie = 50, Te = 0.5, Ae = 20, Ce = 0.3, Le = 150, Me = 30, st = class st {
2323
+ constructor(t, i) {
2324
+ 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);
2240
2325
  }
2241
2326
  /**
2242
2327
  * Start listening for touch events
@@ -2261,48 +2346,48 @@ const Ee = 50, Se = 0.5, Ie = 20, Ae = 0.3, Te = 150, Ce = 30, at = class at {
2261
2346
  * Used to prevent click-outside from unfocusing immediately after touch
2262
2347
  */
2263
2348
  hadRecentTouch() {
2264
- return Date.now() - this.recentTouchTimestamp < at.TOUCH_CLICK_DELAY;
2349
+ return Date.now() - this.recentTouchTimestamp < st.TOUCH_CLICK_DELAY;
2265
2350
  }
2266
2351
  handleTouchStart(t) {
2267
2352
  if (t.touches.length !== 1) return;
2268
2353
  this.recentTouchTimestamp = Date.now();
2269
- const e = t.touches[0];
2354
+ const i = t.touches[0];
2270
2355
  this.touchState = {
2271
- startX: e.clientX,
2272
- startY: e.clientY,
2356
+ startX: i.clientX,
2357
+ startY: i.clientY,
2273
2358
  startTime: performance.now(),
2274
- currentX: e.clientX,
2359
+ currentX: i.clientX,
2275
2360
  isDragging: !1,
2276
2361
  isHorizontalSwipe: null
2277
2362
  };
2278
2363
  }
2279
2364
  handleTouchMove(t) {
2280
2365
  if (!this.touchState || t.touches.length !== 1) return;
2281
- const e = t.touches[0], i = e.clientX - this.touchState.startX, o = e.clientY - this.touchState.startY;
2282
- if (this.touchState.isHorizontalSwipe === null && Math.sqrt(i * i + o * o) > 10) {
2283
- const a = Math.atan2(Math.abs(o), Math.abs(i)) * (180 / Math.PI);
2284
- this.touchState.isHorizontalSwipe = a <= Ce;
2366
+ const i = t.touches[0], e = i.clientX - this.touchState.startX, o = i.clientY - this.touchState.startY;
2367
+ if (this.touchState.isHorizontalSwipe === null && Math.sqrt(e * e + o * o) > 10) {
2368
+ const s = Math.atan2(Math.abs(o), Math.abs(e)) * (180 / Math.PI);
2369
+ this.touchState.isHorizontalSwipe = s <= Me;
2285
2370
  }
2286
2371
  if (this.touchState.isHorizontalSwipe !== !1 && this.touchState.isHorizontalSwipe === !0) {
2287
- t.preventDefault(), this.touchState.isDragging = !0, this.touchState.currentX = e.clientX;
2288
- const s = i * Ae;
2289
- this.callbacks.onDragOffset(s);
2372
+ t.preventDefault(), this.touchState.isDragging = !0, this.touchState.currentX = i.clientX;
2373
+ const a = e * Ce;
2374
+ this.callbacks.onDragOffset(a);
2290
2375
  }
2291
2376
  }
2292
2377
  handleTouchEnd(t) {
2293
2378
  if (!this.touchState) return;
2294
2379
  this.recentTouchTimestamp = Date.now();
2295
- const e = this.touchState.currentX - this.touchState.startX, i = performance.now() - this.touchState.startTime, o = Math.abs(e) / i, s = Math.abs(e);
2380
+ const i = this.touchState.currentX - this.touchState.startX, e = performance.now() - this.touchState.startTime, o = Math.abs(i) / e, a = Math.abs(i);
2296
2381
  let r = !1;
2297
- this.touchState.isHorizontalSwipe === !0 && this.touchState.isDragging && (s >= Ee || o >= Se && s >= Ie) && (r = !0, e < 0 ? this.callbacks.onNext() : this.callbacks.onPrev()), this.touchState.isDragging && this.callbacks.onDragEnd(r), this.touchState = null;
2382
+ this.touchState.isHorizontalSwipe === !0 && this.touchState.isDragging && (a >= Ie || o >= Te && a >= Ae) && (r = !0, i < 0 ? this.callbacks.onNext() : this.callbacks.onPrev()), this.touchState.isDragging && this.callbacks.onDragEnd(r), this.touchState = null;
2298
2383
  }
2299
2384
  handleTouchCancel(t) {
2300
2385
  this.touchState?.isDragging && this.callbacks.onDragEnd(!1), this.touchState = null;
2301
2386
  }
2302
2387
  };
2303
- at.TOUCH_CLICK_DELAY = 300;
2304
- let ft = at;
2305
- class Re {
2388
+ st.TOUCH_CLICK_DELAY = 300;
2389
+ let pt = st;
2390
+ class Fe {
2306
2391
  constructor(t) {
2307
2392
  if (this._prepared = !1, this._discoveredUrls = [], this.apiKey = t.apiKey ?? "", this.apiEndpoint = t.apiEndpoint ?? "https://www.googleapis.com/drive/v3/files", this.debugLogging = t.debugLogging ?? !1, this.sources = t.sources ?? [], !this.sources || this.sources.length === 0)
2308
2393
  throw new Error("GoogleDriveLoader requires at least one source to be configured");
@@ -2313,15 +2398,15 @@ class Re {
2313
2398
  */
2314
2399
  async prepare(t) {
2315
2400
  this._discoveredUrls = [];
2316
- for (const e of this.sources)
2317
- if ("folders" in e)
2318
- for (const i of e.folders) {
2319
- const o = e.recursive !== void 0 ? e.recursive : !0, s = await this.loadFromFolder(i, t, o);
2320
- this._discoveredUrls.push(...s);
2401
+ for (const i of this.sources)
2402
+ if ("folders" in i)
2403
+ for (const e of i.folders) {
2404
+ const o = i.recursive !== void 0 ? i.recursive : !0, a = await this.loadFromFolder(e, t, o);
2405
+ this._discoveredUrls.push(...a);
2321
2406
  }
2322
- else if ("files" in e) {
2323
- const i = await this.loadFiles(e.files, t);
2324
- this._discoveredUrls.push(...i);
2407
+ else if ("files" in i) {
2408
+ const e = await this.loadFiles(i.files, t);
2409
+ this._discoveredUrls.push(...e);
2325
2410
  }
2326
2411
  this._prepared = !0;
2327
2412
  }
@@ -2355,14 +2440,14 @@ class Re {
2355
2440
  * @returns Folder ID or null if invalid
2356
2441
  */
2357
2442
  extractFolderId(t) {
2358
- const e = [
2443
+ const i = [
2359
2444
  /\/folders\/([a-zA-Z0-9_-]+)/,
2360
2445
  // Standard format
2361
2446
  /id=([a-zA-Z0-9_-]+)/
2362
2447
  // Alternative format
2363
2448
  ];
2364
- for (const i of e) {
2365
- const o = t.match(i);
2449
+ for (const e of i) {
2450
+ const o = t.match(e);
2366
2451
  if (o && o[1])
2367
2452
  return o[1];
2368
2453
  }
@@ -2375,16 +2460,16 @@ class Re {
2375
2460
  * @param recursive - Whether to include images from subfolders
2376
2461
  * @returns Promise resolving to array of image URLs
2377
2462
  */
2378
- async loadFromFolder(t, e, i = !0) {
2463
+ async loadFromFolder(t, i, e = !0) {
2379
2464
  const o = this.extractFolderId(t);
2380
2465
  if (!o)
2381
2466
  throw new Error("Invalid Google Drive folder URL. Please check the URL format.");
2382
2467
  if (!this.apiKey || this.apiKey === "YOUR_API_KEY_HERE")
2383
- return this.loadImagesDirectly(o, e);
2468
+ return this.loadImagesDirectly(o, i);
2384
2469
  try {
2385
- return i ? await this.loadImagesRecursively(o, e) : await this.loadImagesFromSingleFolder(o, e);
2386
- } catch (s) {
2387
- return console.error("Error loading from Google Drive API:", s), this.loadImagesDirectly(o, e);
2470
+ return e ? await this.loadImagesRecursively(o, i) : await this.loadImagesFromSingleFolder(o, i);
2471
+ } catch (a) {
2472
+ return console.error("Error loading from Google Drive API:", a), this.loadImagesDirectly(o, i);
2388
2473
  }
2389
2474
  }
2390
2475
  /**
@@ -2393,16 +2478,16 @@ class Re {
2393
2478
  * @param filter - Filter to apply to discovered images
2394
2479
  * @returns Promise resolving to array of image URLs
2395
2480
  */
2396
- async loadImagesFromSingleFolder(t, e) {
2397
- const i = [], o = `'${t}' in parents and trashed=false`, r = `${this.apiEndpoint}?q=${encodeURIComponent(o)}&fields=files(id,name,mimeType,thumbnailLink)&key=${this.apiKey}`, a = await fetch(r);
2398
- if (!a.ok)
2399
- throw new Error(`API request failed: ${a.status} ${a.statusText}`);
2400
- const c = (await a.json()).files.filter(
2401
- (u) => u.mimeType.startsWith("image/") && e.isAllowed(u.name)
2481
+ async loadImagesFromSingleFolder(t, i) {
2482
+ const e = [], o = `'${t}' in parents and trashed=false`, r = `${this.apiEndpoint}?q=${encodeURIComponent(o)}&fields=files(id,name,mimeType,thumbnailLink)&key=${this.apiKey}`, s = await fetch(r);
2483
+ if (!s.ok)
2484
+ throw new Error(`API request failed: ${s.status} ${s.statusText}`);
2485
+ const c = (await s.json()).files.filter(
2486
+ (d) => d.mimeType.startsWith("image/") && i.isAllowed(d.name)
2402
2487
  );
2403
- return this.log(`Found ${c.length} images in folder ${t} (non-recursive)`), c.forEach((u) => {
2404
- i.push(`https://lh3.googleusercontent.com/d/${u.id}=s1600`), this.log(`Added file: ${u.name}`);
2405
- }), i;
2488
+ return this.log(`Found ${c.length} images in folder ${t} (non-recursive)`), c.forEach((d) => {
2489
+ e.push(`https://lh3.googleusercontent.com/d/${d.id}=s1600`), this.log(`Added file: ${d.name}`);
2490
+ }), e;
2406
2491
  }
2407
2492
  /**
2408
2493
  * Load specific files by their URLs or IDs
@@ -2410,29 +2495,29 @@ class Re {
2410
2495
  * @param filter - Filter to apply to discovered images
2411
2496
  * @returns Promise resolving to array of image URLs
2412
2497
  */
2413
- async loadFiles(t, e) {
2414
- const i = [];
2498
+ async loadFiles(t, i) {
2499
+ const e = [];
2415
2500
  for (const o of t) {
2416
- const s = this.extractFileId(o);
2417
- if (!s) {
2501
+ const a = this.extractFileId(o);
2502
+ if (!a) {
2418
2503
  this.log(`Skipping invalid file URL: ${o}`);
2419
2504
  continue;
2420
2505
  }
2421
2506
  if (this.apiKey && this.apiKey !== "YOUR_API_KEY_HERE")
2422
2507
  try {
2423
- const r = `${this.apiEndpoint}/${s}?fields=name,mimeType&key=${this.apiKey}`, a = await fetch(r);
2424
- if (a.ok) {
2425
- const h = await a.json();
2426
- h.mimeType.startsWith("image/") && e.isAllowed(h.name) ? (i.push(`https://lh3.googleusercontent.com/d/${s}=s1600`), this.log(`Added file: ${h.name}`)) : this.log(`Skipping non-image file: ${h.name} (${h.mimeType})`);
2508
+ const r = `${this.apiEndpoint}/${a}?fields=name,mimeType&key=${this.apiKey}`, s = await fetch(r);
2509
+ if (s.ok) {
2510
+ const h = await s.json();
2511
+ h.mimeType.startsWith("image/") && i.isAllowed(h.name) ? (e.push(`https://lh3.googleusercontent.com/d/${a}=s1600`), this.log(`Added file: ${h.name}`)) : this.log(`Skipping non-image file: ${h.name} (${h.mimeType})`);
2427
2512
  } else
2428
- this.log(`Failed to fetch metadata for file ${s}: ${a.status}`);
2513
+ this.log(`Failed to fetch metadata for file ${a}: ${s.status}`);
2429
2514
  } catch (r) {
2430
- this.log(`Error fetching metadata for file ${s}:`, r);
2515
+ this.log(`Error fetching metadata for file ${a}:`, r);
2431
2516
  }
2432
2517
  else
2433
- i.push(`https://lh3.googleusercontent.com/d/${s}=s1600`);
2518
+ e.push(`https://lh3.googleusercontent.com/d/${a}=s1600`);
2434
2519
  }
2435
- return i;
2520
+ return e;
2436
2521
  }
2437
2522
  /**
2438
2523
  * Extract file ID from Google Drive file URL
@@ -2442,7 +2527,7 @@ class Re {
2442
2527
  extractFileId(t) {
2443
2528
  if (!/[/:.]/.test(t))
2444
2529
  return t;
2445
- const e = [
2530
+ const i = [
2446
2531
  /\/file\/d\/([a-zA-Z0-9_-]+)/,
2447
2532
  // Standard file format
2448
2533
  /\/open\?id=([a-zA-Z0-9_-]+)/,
@@ -2450,8 +2535,8 @@ class Re {
2450
2535
  /id=([a-zA-Z0-9_-]+)/
2451
2536
  // Generic id parameter
2452
2537
  ];
2453
- for (const i of e) {
2454
- const o = t.match(i);
2538
+ for (const e of i) {
2539
+ const o = t.match(e);
2455
2540
  if (o && o[1])
2456
2541
  return o[1];
2457
2542
  }
@@ -2463,24 +2548,24 @@ class Re {
2463
2548
  * @param filter - Filter to apply to discovered images
2464
2549
  * @returns Promise resolving to array of image URLs
2465
2550
  */
2466
- async loadImagesRecursively(t, e) {
2467
- const i = [], o = `'${t}' in parents and trashed=false`, r = `${this.apiEndpoint}?q=${encodeURIComponent(o)}&fields=files(id,name,mimeType,thumbnailLink)&key=${this.apiKey}`, a = await fetch(r);
2468
- if (!a.ok)
2469
- throw new Error(`API request failed: ${a.status} ${a.statusText}`);
2470
- const h = await a.json(), c = h.files.filter(
2471
- (l) => l.mimeType.startsWith("image/") && e.isAllowed(l.name)
2472
- ), u = h.files.filter(
2551
+ async loadImagesRecursively(t, i) {
2552
+ const e = [], o = `'${t}' in parents and trashed=false`, r = `${this.apiEndpoint}?q=${encodeURIComponent(o)}&fields=files(id,name,mimeType,thumbnailLink)&key=${this.apiKey}`, s = await fetch(r);
2553
+ if (!s.ok)
2554
+ throw new Error(`API request failed: ${s.status} ${s.statusText}`);
2555
+ const h = await s.json(), c = h.files.filter(
2556
+ (l) => l.mimeType.startsWith("image/") && i.isAllowed(l.name)
2557
+ ), d = h.files.filter(
2473
2558
  (l) => l.mimeType === "application/vnd.google-apps.folder"
2474
2559
  );
2475
- this.log(`Found ${h.files.length} total items in folder ${t}`), h.files.forEach((l) => this.log(` - File: ${l.name} (${l.mimeType})`)), this.log(`- ${c.length} valid files (images only)`), this.log(`- ${u.length} subfolders`), c.forEach((l) => {
2476
- i.push(`https://lh3.googleusercontent.com/d/${l.id}=s1600`), this.log(`Added file: ${l.name}`);
2560
+ this.log(`Found ${h.files.length} total items in folder ${t}`), h.files.forEach((l) => this.log(` - File: ${l.name} (${l.mimeType})`)), this.log(`- ${c.length} valid files (images only)`), this.log(`- ${d.length} subfolders`), c.forEach((l) => {
2561
+ e.push(`https://lh3.googleusercontent.com/d/${l.id}=s1600`), this.log(`Added file: ${l.name}`);
2477
2562
  });
2478
- for (const l of u) {
2563
+ for (const l of d) {
2479
2564
  this.log(`Loading images from subfolder: ${l.name}`);
2480
- const d = await this.loadImagesRecursively(l.id, e);
2481
- i.push(...d);
2565
+ const u = await this.loadImagesRecursively(l.id, i);
2566
+ e.push(...u);
2482
2567
  }
2483
- return i;
2568
+ return e;
2484
2569
  }
2485
2570
  /**
2486
2571
  * Direct loading method (no API key required, but less reliable)
@@ -2489,17 +2574,17 @@ class Re {
2489
2574
  * @param filter - Filter to apply (not used in fallback mode)
2490
2575
  * @returns Promise resolving to array of image URLs
2491
2576
  */
2492
- async loadImagesDirectly(t, e) {
2577
+ async loadImagesDirectly(t, i) {
2493
2578
  try {
2494
- const i = `https://drive.google.com/embeddedfolderview?id=${t}`, o = await fetch(i, { mode: "cors" });
2579
+ const e = `https://drive.google.com/embeddedfolderview?id=${t}`, o = await fetch(e, { mode: "cors" });
2495
2580
  if (!o.ok)
2496
2581
  throw new Error("Cannot access folder directly (CORS or permissions issue)");
2497
- const s = await o.text(), r = /\/file\/d\/([a-zA-Z0-9_-]+)/g, a = [...s.matchAll(r)];
2498
- return [...new Set(a.map((u) => u[1]))].map(
2499
- (u) => `https://drive.google.com/uc?export=view&id=${u}`
2582
+ const a = await o.text(), r = /\/file\/d\/([a-zA-Z0-9_-]+)/g, s = [...a.matchAll(r)];
2583
+ return [...new Set(s.map((d) => d[1]))].map(
2584
+ (d) => `https://drive.google.com/uc?export=view&id=${d}`
2500
2585
  );
2501
- } catch (i) {
2502
- throw console.error("Direct loading failed:", i), new Error(
2586
+ } catch (e) {
2587
+ throw console.error("Direct loading failed:", e), new Error(
2503
2588
  `Unable to load images. Please ensure:
2504
2589
  1. The folder is shared publicly (Anyone with the link can view)
2505
2590
  2. The folder contains image files
@@ -2513,7 +2598,7 @@ class Re {
2513
2598
  * @returns Array of direct image URLs
2514
2599
  */
2515
2600
  manualImageUrls(t) {
2516
- return t.map((e) => `https://drive.google.com/uc?export=view&id=${e}`);
2601
+ return t.map((i) => `https://drive.google.com/uc?export=view&id=${i}`);
2517
2602
  }
2518
2603
  /**
2519
2604
  * Debug logging helper
@@ -2523,7 +2608,7 @@ class Re {
2523
2608
  this.debugLogging && typeof console < "u" && console.log(...t);
2524
2609
  }
2525
2610
  }
2526
- class Me {
2611
+ class ze {
2527
2612
  constructor(t) {
2528
2613
  if (this._prepared = !1, this._discoveredUrls = [], this.validateUrls = t.validateUrls !== !1, this.validationTimeout = t.validationTimeout ?? 5e3, this.validationMethod = t.validationMethod ?? "head", this.debugLogging = t.debugLogging ?? !1, this.sources = t.sources ?? [], !this.sources || this.sources.length === 0)
2529
2614
  throw new Error("StaticImageLoader requires at least one source to be configured");
@@ -2535,12 +2620,12 @@ class Me {
2535
2620
  */
2536
2621
  async prepare(t) {
2537
2622
  this._discoveredUrls = [], this.log(`Processing ${this.sources.length} source(s)`);
2538
- for (const e of this.sources)
2623
+ for (const i of this.sources)
2539
2624
  try {
2540
- const i = await this.processSource(e, t);
2541
- this._discoveredUrls.push(...i);
2542
- } catch (i) {
2543
- console.warn("Failed to process source:", e, i);
2625
+ const e = await this.processSource(i, t);
2626
+ this._discoveredUrls.push(...e);
2627
+ } catch (e) {
2628
+ console.warn("Failed to process source:", i, e);
2544
2629
  }
2545
2630
  this._prepared = !0, this.log(`Successfully loaded ${this._discoveredUrls.length} image(s)`);
2546
2631
  }
@@ -2574,8 +2659,8 @@ class Me {
2574
2659
  * @param filter - Filter to apply to discovered images
2575
2660
  * @returns Promise resolving to array of valid URLs from this source
2576
2661
  */
2577
- async processSource(t, e) {
2578
- return t ? "urls" in t ? await this.processUrls(t.urls, e) : "path" in t ? await this.processPath(t.path, t.files, e) : "json" in t ? await this.processJson(t.json, e) : (console.warn("Unknown source shape:", t), []) : (console.warn("Invalid source object:", t), []);
2662
+ async processSource(t, i) {
2663
+ return t ? "urls" in t ? await this.processUrls(t.urls, i) : "path" in t ? await this.processPath(t.path, t.files, i) : "json" in t ? await this.processJson(t.json, i) : (console.warn("Unknown source shape:", t), []) : (console.warn("Invalid source object:", t), []);
2579
2664
  }
2580
2665
  /**
2581
2666
  * Process a list of direct URLs
@@ -2583,19 +2668,19 @@ class Me {
2583
2668
  * @param filter - Filter to apply to discovered images
2584
2669
  * @returns Promise resolving to array of validated URLs
2585
2670
  */
2586
- async processUrls(t, e) {
2671
+ async processUrls(t, i) {
2587
2672
  if (!Array.isArray(t))
2588
2673
  return console.warn("URLs must be an array:", t), [];
2589
- const i = [];
2674
+ const e = [];
2590
2675
  for (const o of t) {
2591
- const s = o.split("/").pop() || o;
2592
- if (!e.isAllowed(s)) {
2676
+ const a = o.split("/").pop() || o;
2677
+ if (!i.isAllowed(a)) {
2593
2678
  this.log(`Skipping filtered URL: ${o}`);
2594
2679
  continue;
2595
2680
  }
2596
- this.validateUrls ? await this.validateUrl(o) ? i.push(o) : console.warn(`Skipping invalid/missing URL: ${o}`) : i.push(o);
2681
+ this.validateUrls ? await this.validateUrl(o) ? e.push(o) : console.warn(`Skipping invalid/missing URL: ${o}`) : e.push(o);
2597
2682
  }
2598
- return i;
2683
+ return e;
2599
2684
  }
2600
2685
  /**
2601
2686
  * Process a path-based source
@@ -2604,16 +2689,16 @@ class Me {
2604
2689
  * @param filter - Filter to apply to discovered images
2605
2690
  * @returns Promise resolving to array of validated URLs
2606
2691
  */
2607
- async processPath(t, e, i) {
2608
- if (!Array.isArray(e))
2609
- return console.warn("files must be an array:", e), [];
2692
+ async processPath(t, i, e) {
2693
+ if (!Array.isArray(i))
2694
+ return console.warn("files must be an array:", i), [];
2610
2695
  const o = [];
2611
- for (const s of e) {
2612
- if (!i.isAllowed(s)) {
2613
- this.log(`Skipping filtered file: ${s}`);
2696
+ for (const a of i) {
2697
+ if (!e.isAllowed(a)) {
2698
+ this.log(`Skipping filtered file: ${a}`);
2614
2699
  continue;
2615
2700
  }
2616
- const r = this.constructUrl(t, s);
2701
+ const r = this.constructUrl(t, a);
2617
2702
  this.validateUrls ? await this.validateUrl(r) ? o.push(r) : console.warn(`Skipping invalid/missing file: ${r}`) : o.push(r);
2618
2703
  }
2619
2704
  return o;
@@ -2625,19 +2710,19 @@ class Me {
2625
2710
  * @param filter - Filter to apply to discovered images
2626
2711
  * @returns Promise resolving to array of validated URLs
2627
2712
  */
2628
- async processJson(t, e) {
2713
+ async processJson(t, i) {
2629
2714
  this.log(`Fetching JSON endpoint: ${t}`);
2630
- const i = new AbortController(), o = setTimeout(() => i.abort(), 1e4);
2715
+ const e = new AbortController(), o = setTimeout(() => e.abort(), 1e4);
2631
2716
  try {
2632
- const s = await fetch(t, { signal: i.signal });
2633
- if (clearTimeout(o), !s.ok)
2634
- throw new Error(`HTTP ${s.status} fetching ${t}`);
2635
- const r = await s.json();
2717
+ const a = await fetch(t, { signal: e.signal });
2718
+ if (clearTimeout(o), !a.ok)
2719
+ throw new Error(`HTTP ${a.status} fetching ${t}`);
2720
+ const r = await a.json();
2636
2721
  if (!r || !Array.isArray(r.images))
2637
2722
  throw new Error('JSON source must return JSON with shape { "images": ["url1", "url2", ...] }');
2638
- return this.log(`JSON endpoint returned ${r.images.length} image(s)`), await this.processUrls(r.images, e);
2639
- } catch (s) {
2640
- throw clearTimeout(o), s instanceof Error && s.name === "AbortError" ? new Error(`Timeout fetching JSON endpoint: ${t}`) : s;
2723
+ return this.log(`JSON endpoint returned ${r.images.length} image(s)`), await this.processUrls(r.images, i);
2724
+ } catch (a) {
2725
+ throw clearTimeout(o), a instanceof Error && a.name === "AbortError" ? new Error(`Timeout fetching JSON endpoint: ${t}`) : a;
2641
2726
  }
2642
2727
  }
2643
2728
  /**
@@ -2659,13 +2744,13 @@ class Me {
2659
2744
  if (!(t.startsWith(window.location.origin) || t.startsWith("/")))
2660
2745
  return this.log(`Skipping validation for cross-origin URL: ${t}`), !0;
2661
2746
  try {
2662
- const i = new AbortController(), o = setTimeout(() => i.abort(), this.validationTimeout), s = await fetch(t, {
2747
+ const e = new AbortController(), o = setTimeout(() => e.abort(), this.validationTimeout), a = await fetch(t, {
2663
2748
  method: "HEAD",
2664
- signal: i.signal
2749
+ signal: e.signal
2665
2750
  });
2666
- return clearTimeout(o), s.ok ? !0 : (this.log(`Validation failed for ${t}: HTTP ${s.status}`), !1);
2667
- } catch (i) {
2668
- return i instanceof Error && (i.name === "AbortError" ? this.log(`Validation timeout for ${t}`) : this.log(`Validation failed for ${t}:`, i.message)), !1;
2751
+ return clearTimeout(o), a.ok ? !0 : (this.log(`Validation failed for ${t}: HTTP ${a.status}`), !1);
2752
+ } catch (e) {
2753
+ return e instanceof Error && (e.name === "AbortError" ? this.log(`Validation timeout for ${t}`) : this.log(`Validation failed for ${t}:`, e.message)), !1;
2669
2754
  }
2670
2755
  }
2671
2756
  /**
@@ -2674,14 +2759,14 @@ class Me {
2674
2759
  * @param filename - Filename to append
2675
2760
  * @returns Complete URL
2676
2761
  */
2677
- constructUrl(t, e) {
2678
- const i = t.replace(/\/$/, "");
2762
+ constructUrl(t, i) {
2763
+ const e = t.replace(/\/$/, "");
2679
2764
  if (this.isAbsoluteUrl(t))
2680
- return `${i}/${e}`;
2765
+ return `${e}/${i}`;
2681
2766
  if (typeof window > "u")
2682
- return `${i}/${e}`;
2767
+ return `${e}/${i}`;
2683
2768
  const o = window.location.origin, r = (t.startsWith("/") ? t : "/" + t).replace(/\/$/, "");
2684
- return `${o}${r}/${e}`;
2769
+ return `${o}${r}/${i}`;
2685
2770
  }
2686
2771
  /**
2687
2772
  * Check if URL is absolute (contains protocol)
@@ -2703,7 +2788,7 @@ class Me {
2703
2788
  this.debugLogging && typeof console < "u" && console.log(...t);
2704
2789
  }
2705
2790
  }
2706
- class Le {
2791
+ class Oe {
2707
2792
  constructor(t) {
2708
2793
  if (this._prepared = !1, this._discoveredUrls = [], this.loaders = t.loaders, this.debugLogging = t.debugLogging ?? !1, !this.loaders || this.loaders.length === 0)
2709
2794
  throw new Error("CompositeLoader requires at least one loader to be configured");
@@ -2715,15 +2800,15 @@ class Le {
2715
2800
  */
2716
2801
  async prepare(t) {
2717
2802
  this._discoveredUrls = [], this.log(`Preparing ${this.loaders.length} loader(s) in parallel`);
2718
- const e = this.loaders.map((i, o) => i.prepare(t).then(() => {
2719
- this.log(`Loader ${o} prepared with ${i.imagesLength()} images`);
2720
- }).catch((s) => {
2721
- console.warn(`Loader ${o} failed to prepare:`, s);
2803
+ const i = this.loaders.map((e, o) => e.prepare(t).then(() => {
2804
+ this.log(`Loader ${o} prepared with ${e.imagesLength()} images`);
2805
+ }).catch((a) => {
2806
+ console.warn(`Loader ${o} failed to prepare:`, a);
2722
2807
  }));
2723
- await Promise.all(e);
2724
- for (const i of this.loaders)
2725
- if (i.isPrepared()) {
2726
- const o = i.imageURLs();
2808
+ await Promise.all(i);
2809
+ for (const e of this.loaders)
2810
+ if (e.isPrepared()) {
2811
+ const o = e.imageURLs();
2727
2812
  this._discoveredUrls.push(...o);
2728
2813
  }
2729
2814
  this._prepared = !0, this.log(`CompositeLoader prepared with ${this._discoveredUrls.length} total images`);
@@ -2760,7 +2845,7 @@ class Le {
2760
2845
  this.debugLogging && typeof console < "u" && console.log("[CompositeLoader]", ...t);
2761
2846
  }
2762
2847
  }
2763
- class ze {
2848
+ class $e {
2764
2849
  /**
2765
2850
  * Create a new ImageFilter
2766
2851
  * @param extensions - Array of allowed file extensions (without dots)
@@ -2782,8 +2867,8 @@ class ze {
2782
2867
  * @returns True if the file extension is allowed
2783
2868
  */
2784
2869
  isAllowed(t) {
2785
- const i = t.split("?")[0].split(".").pop()?.toLowerCase();
2786
- return i ? this.allowedExtensions.includes(i) : !1;
2870
+ const e = t.split("?")[0].split(".").pop()?.toLowerCase();
2871
+ return e ? this.allowedExtensions.includes(e) : !1;
2787
2872
  }
2788
2873
  /**
2789
2874
  * Get the list of allowed extensions
@@ -2797,7 +2882,7 @@ class ze {
2797
2882
  // isAllowedDate(date: Date): boolean
2798
2883
  // isAllowedDimensions(width: number, height: number): boolean
2799
2884
  }
2800
- const Fe = `
2885
+ const De = `
2801
2886
  .fbn-ic-gallery {
2802
2887
  position: relative;
2803
2888
  width: 100%;
@@ -2847,22 +2932,22 @@ const Fe = `
2847
2932
  display: none !important;
2848
2933
  }
2849
2934
  `;
2850
- function Oe() {
2935
+ function Pe() {
2851
2936
  if (typeof document > "u") return;
2852
2937
  const n = "fbn-ic-functional-styles";
2853
2938
  if (document.getElementById(n)) return;
2854
2939
  const t = document.createElement("style");
2855
- t.id = n, t.textContent = Fe, document.head.appendChild(t);
2940
+ t.id = n, t.textContent = De, document.head.appendChild(t);
2856
2941
  }
2857
- class De {
2942
+ class _e {
2858
2943
  constructor(t = {}) {
2859
- this.fullConfig = Gt(t), t.container instanceof HTMLElement ? (this.containerRef = t.container, this.containerId = null) : (this.containerRef = null, this.containerId = t.container || "imageCloud"), this.imagesLoaded = !1, this.imageElements = [], this.imageLayouts = [], this.currentImageHeight = 225, this.currentFocusIndex = null, this.hoveredImage = null, this.resizeTimeout = null, this.displayQueue = [], this.queueInterval = null, this.loadGeneration = 0, this.loadingElAutoCreated = !1, this.errorElAutoCreated = !1, this.counterEl = null, this.counterElAutoCreated = !1, this.animationEngine = new Bt(this.fullConfig.animation), this.layoutEngine = new pe({
2944
+ this.fullConfig = Gt(t), t.container instanceof HTMLElement ? (this.containerRef = t.container, this.containerId = null) : (this.containerRef = null, this.containerId = t.container || "imageCloud"), this.imagesLoaded = !1, this.imageElements = [], this.imageLayouts = [], this.currentImageHeight = 225, this.currentFocusIndex = null, this.hoveredImage = null, this.resizeTimeout = null, this.displayQueue = [], this.queueInterval = null, this.loadGeneration = 0, this.loadingElAutoCreated = !1, this.errorElAutoCreated = !1, this.counterEl = null, this.counterElAutoCreated = !1, this.animationEngine = new Xt(this.fullConfig.animation), this.layoutEngine = new pe({
2860
2945
  layout: this.fullConfig.layout,
2861
2946
  image: this.fullConfig.image
2862
- }), this.zoomEngine = new xe(this.fullConfig.interaction.focus, this.animationEngine, this.fullConfig.styling), this.defaultStyles = st(this.fullConfig.styling?.default), this.hoverStyles = st(this.fullConfig.styling?.hover), this.defaultClassName = this.fullConfig.styling?.default?.className, this.hoverClassName = this.fullConfig.styling?.hover?.className;
2863
- const e = this.fullConfig.animation.entry || y.animation.entry;
2947
+ }), this.zoomEngine = new Re(this.fullConfig.interaction.focus, this.animationEngine, this.fullConfig.styling), this.defaultStyles = tt(this.fullConfig.styling?.default), this.defaultClassName = this.fullConfig.styling?.default?.className, this.hoverClassName = this.fullConfig.styling?.hover?.className;
2948
+ const i = this.fullConfig.animation.entry || y.animation.entry;
2864
2949
  this.entryAnimationEngine = new se(
2865
- e,
2950
+ i,
2866
2951
  this.fullConfig.layout.algorithm
2867
2952
  ), this.swipeEngine = null, this.imageFilter = this.createImageFilter(), this.imageLoader = this.createLoader(), this.containerEl = null, this.loadingEl = null, this.errorEl = null;
2868
2953
  }
@@ -2871,43 +2956,43 @@ class De {
2871
2956
  */
2872
2957
  createImageFilter() {
2873
2958
  const t = this.fullConfig.config.loaders?.allowedExtensions;
2874
- return new ze(t);
2959
+ return new $e(t);
2875
2960
  }
2876
2961
  /**
2877
2962
  * Create appropriate image loader based on config
2878
2963
  * Processes loaders array, merges shared config, wraps in CompositeLoader if needed
2879
2964
  */
2880
2965
  createLoader() {
2881
- const t = this.fullConfig.loaders, e = this.fullConfig.config.loaders ?? {};
2966
+ const t = this.fullConfig.loaders, i = this.fullConfig.config.loaders ?? {};
2882
2967
  if (!t || t.length === 0)
2883
2968
  throw new Error("No loaders configured. Provide `images`, `loaders`, or both.");
2884
- const i = t.map((o) => this.createLoaderFromEntry(o, e));
2885
- return i.length === 1 ? i[0] : new Le({
2886
- loaders: i,
2969
+ const e = t.map((o) => this.createLoaderFromEntry(o, i));
2970
+ return e.length === 1 ? e[0] : new Oe({
2971
+ loaders: e,
2887
2972
  debugLogging: this.fullConfig.config.debug?.loaders
2888
2973
  });
2889
2974
  }
2890
2975
  /**
2891
2976
  * Create a single loader from a LoaderEntry, merging shared config
2892
2977
  */
2893
- createLoaderFromEntry(t, e) {
2978
+ createLoaderFromEntry(t, i) {
2894
2979
  if ("static" in t) {
2895
- const i = t.static, o = {
2896
- ...i,
2897
- validateUrls: i.validateUrls ?? e.validateUrls,
2898
- validationTimeout: i.validationTimeout ?? e.validationTimeout,
2899
- validationMethod: i.validationMethod ?? e.validationMethod,
2900
- allowedExtensions: i.allowedExtensions ?? e.allowedExtensions,
2901
- debugLogging: i.debugLogging ?? this.fullConfig.config.debug?.loaders
2980
+ const e = t.static, o = {
2981
+ ...e,
2982
+ validateUrls: e.validateUrls ?? i.validateUrls,
2983
+ validationTimeout: e.validationTimeout ?? i.validationTimeout,
2984
+ validationMethod: e.validationMethod ?? i.validationMethod,
2985
+ allowedExtensions: e.allowedExtensions ?? i.allowedExtensions,
2986
+ debugLogging: e.debugLogging ?? this.fullConfig.config.debug?.loaders
2902
2987
  };
2903
- return new Me(o);
2988
+ return new ze(o);
2904
2989
  } else if ("googleDrive" in t) {
2905
- const i = t.googleDrive, o = {
2906
- ...i,
2907
- allowedExtensions: i.allowedExtensions ?? e.allowedExtensions,
2908
- debugLogging: i.debugLogging ?? this.fullConfig.config.debug?.loaders
2990
+ const e = t.googleDrive, o = {
2991
+ ...e,
2992
+ allowedExtensions: e.allowedExtensions ?? i.allowedExtensions,
2993
+ debugLogging: e.debugLogging ?? this.fullConfig.config.debug?.loaders
2909
2994
  };
2910
- return new Re(o);
2995
+ return new Fe(o);
2911
2996
  } else
2912
2997
  throw new Error(`Unknown loader entry: ${JSON.stringify(t)}`);
2913
2998
  }
@@ -2916,16 +3001,16 @@ class De {
2916
3001
  */
2917
3002
  async init() {
2918
3003
  try {
2919
- if (Oe(), this.containerRef)
3004
+ if (Pe(), this.containerRef)
2920
3005
  this.containerEl = this.containerRef;
2921
3006
  else if (this.containerEl = document.getElementById(this.containerId), !this.containerEl)
2922
3007
  throw new Error(`Container #${this.containerId} not found`);
2923
- this.containerEl.classList.add("fbn-ic-gallery"), this.swipeEngine = new ft(this.containerEl, {
3008
+ this.containerEl.classList.add("fbn-ic-gallery"), this.swipeEngine = new pt(this.containerEl, {
2924
3009
  onNext: () => this.navigateToNextImage(),
2925
3010
  onPrev: () => this.navigateToPreviousImage(),
2926
3011
  onDragOffset: (t) => this.zoomEngine.setDragOffset(t),
2927
3012
  onDragEnd: (t) => {
2928
- t ? this.zoomEngine.clearDragOffset(!1) : this.zoomEngine.clearDragOffset(!0, Te);
3013
+ t ? this.zoomEngine.clearDragOffset(!1) : this.zoomEngine.clearDragOffset(!0, Le);
2929
3014
  }
2930
3015
  }), this.setupUI(), this.setupEventListeners(), this.logDebug("ImageCloud initialized"), await this.loadImages();
2931
3016
  } catch (t) {
@@ -2942,10 +3027,10 @@ class De {
2942
3027
  createDefaultLoadingElement() {
2943
3028
  const t = document.createElement("div");
2944
3029
  t.className = "fbn-ic-loading fbn-ic-hidden";
2945
- const e = document.createElement("div");
2946
- e.className = "fbn-ic-spinner", t.appendChild(e);
2947
- const i = document.createElement("p");
2948
- return i.textContent = "Loading images...", t.appendChild(i), this.containerEl.appendChild(t), t;
3030
+ const i = document.createElement("div");
3031
+ i.className = "fbn-ic-spinner", t.appendChild(i);
3032
+ const e = document.createElement("p");
3033
+ return e.textContent = "Loading images...", t.appendChild(e), this.containerEl.appendChild(t), t;
2949
3034
  }
2950
3035
  createDefaultErrorElement() {
2951
3036
  const t = document.createElement("div");
@@ -2967,24 +3052,24 @@ class De {
2967
3052
  */
2968
3053
  navigateToNextImage() {
2969
3054
  if (this.currentFocusIndex === null || this.imageElements.length === 0) return;
2970
- const t = (this.currentFocusIndex + 1) % this.imageLayouts.length, e = this.imageElements.find(
3055
+ const t = (this.currentFocusIndex + 1) % this.imageLayouts.length, i = this.imageElements.find(
2971
3056
  (o) => o.dataset.imageId === String(t)
2972
3057
  );
2973
- if (!e) return;
2974
- const i = this.imageLayouts[t];
2975
- i && (this.currentFocusIndex = t, this.handleImageClick(e, i), this.updateCounter(t));
3058
+ if (!i) return;
3059
+ const e = this.imageLayouts[t];
3060
+ e && (this.currentFocusIndex = t, this.handleImageClick(i, e), this.updateCounter(t));
2976
3061
  }
2977
3062
  /**
2978
3063
  * Navigate to the previous image (Left arrow)
2979
3064
  */
2980
3065
  navigateToPreviousImage() {
2981
3066
  if (this.currentFocusIndex === null || this.imageElements.length === 0) return;
2982
- const t = (this.currentFocusIndex - 1 + this.imageLayouts.length) % this.imageLayouts.length, e = this.imageElements.find(
3067
+ const t = (this.currentFocusIndex - 1 + this.imageLayouts.length) % this.imageLayouts.length, i = this.imageElements.find(
2983
3068
  (o) => o.dataset.imageId === String(t)
2984
3069
  );
2985
- if (!e) return;
2986
- const i = this.imageLayouts[t];
2987
- i && (this.currentFocusIndex = t, this.handleImageClick(e, i), this.updateCounter(t));
3070
+ if (!i) return;
3071
+ const e = this.imageLayouts[t];
3072
+ e && (this.currentFocusIndex = t, this.handleImageClick(i, e), this.updateCounter(t));
2988
3073
  }
2989
3074
  /**
2990
3075
  * Navigate to a specific image by index
@@ -2996,8 +3081,8 @@ class De {
2996
3081
  }, 500));
2997
3082
  }
2998
3083
  getImageHeight() {
2999
- const t = window.innerWidth, e = this.fullConfig.layout.responsive, o = this.fullConfig.image.sizing?.maxSize ?? 400;
3000
- return e ? t <= e.mobile.maxWidth ? Math.min(100, o) : t <= e.tablet.maxWidth ? Math.min(180, o) : Math.min(225, o) : t <= 767 ? Math.min(100, o) : t <= 1199 ? Math.min(180, o) : Math.min(225, o);
3084
+ const t = window.innerWidth, i = this.fullConfig.layout.responsive, o = this.fullConfig.image.sizing?.maxSize ?? 400;
3085
+ return i ? t <= i.mobile.maxWidth ? Math.min(100, o) : t <= i.tablet.maxWidth ? Math.min(180, o) : Math.min(225, o) : t <= 767 ? Math.min(100, o) : t <= 1199 ? Math.min(180, o) : Math.min(225, o);
3001
3086
  }
3002
3087
  /**
3003
3088
  * Get container bounds for layout calculations
@@ -3015,20 +3100,20 @@ class De {
3015
3100
  try {
3016
3101
  this.showLoading(!0), this.hideError(), this.clearImageCloud(), await this.imageLoader.prepare(this.imageFilter);
3017
3102
  const t = this.imageLoader.imagesLength();
3018
- let e = this.imageLoader.imageURLs();
3103
+ let i = this.imageLoader.imageURLs();
3019
3104
  if (t === 0) {
3020
3105
  this.showError("No images found."), this.showLoading(!1);
3021
3106
  return;
3022
3107
  }
3023
- const i = this.getContainerBounds(), o = this.getImageHeight(), s = window.innerWidth;
3024
- this.logDebug(`Adaptive sizing input: container=${i.width}x${i.height}px, images=${t}, responsiveMax=${o}px`);
3108
+ const e = this.getContainerBounds(), o = this.getImageHeight(), a = window.innerWidth;
3109
+ this.logDebug(`Adaptive sizing input: container=${e.width}x${e.height}px, images=${t}, responsiveMax=${o}px`);
3025
3110
  const r = this.layoutEngine.calculateAdaptiveSize(
3026
- i,
3111
+ e,
3027
3112
  t,
3028
3113
  o,
3029
- s
3114
+ a
3030
3115
  );
3031
- this.logDebug(`Adaptive sizing result: height=${r.height}px`), await this.createImageCloud(e, r.height), this.showLoading(!1), this.imagesLoaded = !0;
3116
+ this.logDebug(`Adaptive sizing result: height=${r.height}px`), await this.createImageCloud(i, r.height), this.showLoading(!1), this.imagesLoaded = !0;
3032
3117
  } catch (t) {
3033
3118
  console.error("Error loading images:", t), t instanceof Error && this.showError(t.message || "Failed to load images."), this.showLoading(!1);
3034
3119
  }
@@ -3039,45 +3124,45 @@ class De {
3039
3124
  logDebug(...t) {
3040
3125
  this.fullConfig.config.debug?.enabled && typeof console < "u" && console.log(...t);
3041
3126
  }
3042
- async createImageCloud(t, e) {
3127
+ async createImageCloud(t, i) {
3043
3128
  if (!this.containerEl) return;
3044
- const i = this.getContainerBounds();
3045
- this.currentImageHeight = e;
3046
- const o = this.loadGeneration, s = this.layoutEngine.generateLayout(t.length, i, { fixedHeight: e });
3047
- this.imageLayouts = s, this.displayQueue = [];
3129
+ const e = this.getContainerBounds();
3130
+ this.currentImageHeight = i;
3131
+ const o = this.loadGeneration, a = this.layoutEngine.generateLayout(t.length, e, { fixedHeight: i });
3132
+ this.imageLayouts = a, this.displayQueue = [];
3048
3133
  let r = 0;
3049
- const a = (c) => {
3134
+ const s = (c) => {
3050
3135
  this.containerEl && (this.containerEl.appendChild(c), this.imageElements.push(c), requestAnimationFrame(() => {
3051
3136
  if (c.offsetWidth, c.style.opacity = this.defaultStyles.opacity ?? "1", c.dataset.startX && (this.entryAnimationEngine.requiresJSAnimation() || this.entryAnimationEngine.requiresJSRotation() || this.entryAnimationEngine.requiresJSScale() || c.dataset.startRotation !== c.dataset.rotation || c.dataset.startScale !== c.dataset.scale)) {
3052
- const d = {
3137
+ const u = {
3053
3138
  x: parseFloat(c.dataset.startX),
3054
3139
  y: parseFloat(c.dataset.startY)
3055
- }, m = {
3140
+ }, g = {
3056
3141
  x: parseFloat(c.dataset.endX),
3057
3142
  y: parseFloat(c.dataset.endY)
3058
- }, b = parseFloat(c.dataset.imageWidth), p = parseFloat(c.dataset.imageHeight), g = parseFloat(c.dataset.rotation), f = parseFloat(c.dataset.scale), E = c.dataset.startRotation ? parseFloat(c.dataset.startRotation) : g, v = c.dataset.startScale ? parseFloat(c.dataset.startScale) : f, w = this.entryAnimationEngine.getTiming();
3143
+ }, p = parseFloat(c.dataset.imageWidth), b = parseFloat(c.dataset.imageHeight), f = parseFloat(c.dataset.rotation), m = parseFloat(c.dataset.scale), E = c.dataset.startRotation ? parseFloat(c.dataset.startRotation) : f, v = c.dataset.startScale ? parseFloat(c.dataset.startScale) : m, w = this.entryAnimationEngine.getTiming();
3059
3144
  ie({
3060
3145
  element: c,
3061
- startPosition: d,
3062
- endPosition: m,
3146
+ startPosition: u,
3147
+ endPosition: g,
3063
3148
  pathConfig: this.entryAnimationEngine.getPathConfig(),
3064
3149
  duration: w.duration,
3065
- imageWidth: b,
3066
- imageHeight: p,
3067
- rotation: g,
3068
- scale: f,
3150
+ imageWidth: p,
3151
+ imageHeight: b,
3152
+ rotation: f,
3153
+ scale: m,
3069
3154
  rotationConfig: this.entryAnimationEngine.getRotationConfig(),
3070
3155
  startRotation: E,
3071
3156
  scaleConfig: this.entryAnimationEngine.getScaleConfig(),
3072
3157
  startScale: v
3073
3158
  });
3074
3159
  } else {
3075
- const d = c.dataset.finalTransform || "";
3076
- c.style.transform = d;
3160
+ const u = c.dataset.finalTransform || "";
3161
+ c.style.transform = u;
3077
3162
  }
3078
3163
  const l = parseInt(c.dataset.imageId || "0");
3079
3164
  if (this.fullConfig.config.debug?.enabled && l < 3) {
3080
- const d = c.dataset.finalTransform || "";
3165
+ const u = c.dataset.finalTransform || "";
3081
3166
  console.log(`Image ${l} final state:`, {
3082
3167
  left: c.style.left,
3083
3168
  top: c.style.top,
@@ -3085,7 +3170,7 @@ class De {
3085
3170
  height: c.style.height,
3086
3171
  computedWidth: c.offsetWidth,
3087
3172
  computedHeight: c.offsetHeight,
3088
- transform: d,
3173
+ transform: u,
3089
3174
  pathType: this.entryAnimationEngine.getPathType()
3090
3175
  });
3091
3176
  }
@@ -3094,7 +3179,7 @@ class De {
3094
3179
  if (this.logDebug("Starting queue processing, enabled:", this.fullConfig.animation.queue.enabled), !this.fullConfig.animation.queue.enabled) {
3095
3180
  for (; this.displayQueue.length > 0; ) {
3096
3181
  const c = this.displayQueue.shift();
3097
- c && a(c);
3182
+ c && s(c);
3098
3183
  }
3099
3184
  return;
3100
3185
  }
@@ -3105,84 +3190,90 @@ class De {
3105
3190
  }
3106
3191
  if (this.displayQueue.length > 0) {
3107
3192
  const c = this.displayQueue.shift();
3108
- c && a(c);
3193
+ c && s(c);
3109
3194
  }
3110
3195
  r >= t.length && this.displayQueue.length === 0 && this.queueInterval !== null && (clearInterval(this.queueInterval), this.queueInterval = null);
3111
3196
  }, this.fullConfig.animation.queue.interval);
3112
3197
  };
3113
3198
  if ("IntersectionObserver" in window && this.containerEl) {
3114
- const c = new IntersectionObserver((u) => {
3115
- u.forEach((l) => {
3199
+ const c = new IntersectionObserver((d) => {
3200
+ d.forEach((l) => {
3116
3201
  l.isIntersecting && (h(), c.disconnect());
3117
3202
  });
3118
3203
  }, { threshold: 0.1, rootMargin: "50px" });
3119
3204
  c.observe(this.containerEl);
3120
3205
  } else
3121
3206
  h();
3122
- this.fullConfig.config.debug?.centers && this.containerEl && (this.containerEl.querySelectorAll(".fbn-ic-debug-center").forEach((c) => c.remove()), s.forEach((c, u) => {
3207
+ this.fullConfig.config.debug?.centers && this.containerEl && (this.containerEl.querySelectorAll(".fbn-ic-debug-center").forEach((c) => c.remove()), a.forEach((c, d) => {
3123
3208
  const l = document.createElement("div");
3124
3209
  l.className = "fbn-ic-debug-center", l.style.position = "absolute", l.style.width = "12px", l.style.height = "12px", l.style.borderRadius = "50%", l.style.backgroundColor = "red", l.style.border = "2px solid yellow", l.style.zIndex = "9999", l.style.pointerEvents = "none";
3125
- const d = c.x, m = c.y;
3126
- l.style.left = `${d - 6}px`, l.style.top = `${m - 6}px`, l.title = `Image ${u}: center (${Math.round(d)}, ${Math.round(m)})`, this.containerEl.appendChild(l);
3127
- })), t.forEach((c, u) => {
3210
+ const u = c.x, g = c.y;
3211
+ l.style.left = `${u - 6}px`, l.style.top = `${g - 6}px`, l.title = `Image ${d}: center (${Math.round(u)}, ${Math.round(g)})`, this.containerEl.appendChild(l);
3212
+ })), t.forEach((c, d) => {
3128
3213
  const l = document.createElement("img");
3129
- l.referrerPolicy = "no-referrer", l.classList.add("fbn-ic-image"), l.dataset.imageId = String(u);
3130
- const d = s[u];
3131
- l.style.position = "absolute", l.style.width = "auto", l.style.height = `${e}px`, l.style.left = `${d.x}px`, l.style.top = `${d.y}px`, d.zIndex && (l.style.zIndex = String(d.zIndex)), tt(l, this.defaultStyles), et(l, this.defaultClassName), l.addEventListener("mouseenter", () => {
3132
- this.hoveredImage = { element: l, layout: d }, this.zoomEngine.isInvolved(l) || (tt(l, this.hoverStyles), et(l, this.hoverClassName));
3214
+ l.referrerPolicy = "no-referrer", l.classList.add("fbn-ic-image"), l.dataset.imageId = String(d), l.dataset.createdFlag = "true";
3215
+ const u = a[d];
3216
+ l.style.position = "absolute", l.style.width = "auto", l.style.height = `${i}px`, l.style.left = `${u.x}px`, l.style.top = `${u.y}px`, u.zIndex && (l.style.zIndex = String(u.zIndex)), ot(l, this.defaultClassName), l.addEventListener("mouseenter", () => {
3217
+ if (this.hoveredImage = { element: l, layout: u }, !this.zoomEngine.isInvolved(l)) {
3218
+ const g = l.cachedRenderedWidth;
3219
+ gt(l, this.fullConfig.styling?.hover, i, g), ot(l, this.hoverClassName);
3220
+ }
3133
3221
  }), l.addEventListener("mouseleave", () => {
3134
- this.hoveredImage = null, this.zoomEngine.isInvolved(l) || (tt(l, this.defaultStyles), Ot(l, this.hoverClassName), et(l, this.defaultClassName));
3135
- }), l.addEventListener("click", (m) => {
3136
- m.stopPropagation(), this.handleImageClick(l, d);
3222
+ if (this.hoveredImage = null, !this.zoomEngine.isInvolved(l)) {
3223
+ const g = l.cachedRenderedWidth;
3224
+ gt(l, this.fullConfig.styling?.default, i, g), mt(l, this.hoverClassName), ot(l, this.defaultClassName);
3225
+ }
3226
+ }), l.addEventListener("click", (g) => {
3227
+ g.stopPropagation(), this.handleImageClick(l, u);
3137
3228
  }), l.style.opacity = "0", l.style.transition = this.entryAnimationEngine.getTransitionCSS(), l.onload = () => {
3138
3229
  if (o !== this.loadGeneration)
3139
3230
  return;
3140
- const m = l.naturalWidth / l.naturalHeight, b = e * m;
3141
- l.style.width = `${b}px`;
3142
- const p = { x: d.x, y: d.y }, g = { width: b, height: e }, f = this.entryAnimationEngine.calculateStartPosition(
3143
- p,
3144
- g,
3145
- i,
3146
- u,
3147
- t.length
3148
- ), E = this.entryAnimationEngine.calculateStartRotation(d.rotation), v = this.entryAnimationEngine.calculateStartScale(d.scale), w = this.entryAnimationEngine.buildFinalTransform(
3149
- d.rotation,
3150
- d.scale,
3231
+ const g = l.naturalWidth / l.naturalHeight, p = i * g;
3232
+ l.dataset.onloadCalled = "true", window.DEBUG_CLIPPATH && console.log(`[onload #${d}] Called with imageHeight=${i}, renderedWidth=${p}`), l.style.width = `${p}px`, l.cachedRenderedWidth = p, l.aspectRatio = g, gt(l, this.fullConfig.styling?.default, i, p);
3233
+ const b = { x: u.x, y: u.y }, f = { width: p, height: i }, m = this.entryAnimationEngine.calculateStartPosition(
3151
3234
  b,
3152
- e
3153
- ), S = this.entryAnimationEngine.buildStartTransform(
3154
3235
  f,
3236
+ e,
3237
+ d,
3238
+ t.length
3239
+ ), E = this.entryAnimationEngine.calculateStartRotation(u.rotation), v = this.entryAnimationEngine.calculateStartScale(u.scale), w = this.entryAnimationEngine.buildFinalTransform(
3240
+ u.rotation,
3241
+ u.scale,
3155
3242
  p,
3156
- d.rotation,
3157
- d.scale,
3243
+ i
3244
+ ), S = this.entryAnimationEngine.buildStartTransform(
3245
+ m,
3158
3246
  b,
3159
- e,
3247
+ u.rotation,
3248
+ u.scale,
3249
+ p,
3250
+ i,
3160
3251
  E,
3161
3252
  v
3162
3253
  );
3163
- this.fullConfig.config.debug?.enabled && u < 3 && console.log(`Image ${u}:`, {
3164
- finalPosition: p,
3165
- imageSize: g,
3166
- left: d.x,
3167
- top: d.y,
3254
+ this.fullConfig.config.debug?.enabled && d < 3 && console.log(`Image ${d}:`, {
3255
+ finalPosition: b,
3256
+ imageSize: f,
3257
+ left: u.x,
3258
+ top: u.y,
3168
3259
  finalTransform: w,
3169
- renderedWidth: b,
3170
- renderedHeight: e
3171
- }), l.style.transform = S, l.dataset.finalTransform = w, (this.entryAnimationEngine.requiresJSAnimation() || this.entryAnimationEngine.requiresJSRotation() || this.entryAnimationEngine.requiresJSScale() || E !== d.rotation || v !== d.scale) && (l.dataset.startX = String(f.x), l.dataset.startY = String(f.y), l.dataset.endX = String(p.x), l.dataset.endY = String(p.y), l.dataset.imageWidth = String(b), l.dataset.imageHeight = String(e), l.dataset.rotation = String(d.rotation), l.dataset.scale = String(d.scale), l.dataset.startRotation = String(E), l.dataset.startScale = String(v)), this.displayQueue.push(l);
3260
+ renderedWidth: p,
3261
+ renderedHeight: i
3262
+ }), l.style.transform = S, l.dataset.finalTransform = w, (this.entryAnimationEngine.requiresJSAnimation() || this.entryAnimationEngine.requiresJSRotation() || this.entryAnimationEngine.requiresJSScale() || E !== u.rotation || v !== u.scale) && (l.dataset.startX = String(m.x), l.dataset.startY = String(m.y), l.dataset.endX = String(b.x), l.dataset.endY = String(b.y), l.dataset.imageWidth = String(p), l.dataset.imageHeight = String(i), l.dataset.rotation = String(u.rotation), l.dataset.scale = String(u.scale), l.dataset.startRotation = String(E), l.dataset.startScale = String(v)), this.displayQueue.push(l);
3172
3263
  }, l.onerror = () => r++, l.src = c;
3173
3264
  });
3174
3265
  }
3175
- async handleImageClick(t, e) {
3266
+ async handleImageClick(t, i) {
3176
3267
  if (!this.containerEl) return;
3177
- const i = this.zoomEngine.isFocused(t), o = {
3268
+ const e = this.zoomEngine.isFocused(t), o = {
3178
3269
  width: this.containerEl.offsetWidth,
3179
3270
  height: this.containerEl.offsetHeight
3180
3271
  };
3181
- if (i)
3272
+ if (e)
3182
3273
  await this.zoomEngine.unfocusImage(), this.currentFocusIndex = null, this.swipeEngine?.disable(), this.hideCounter();
3183
3274
  else {
3184
- const s = t.dataset.imageId;
3185
- this.currentFocusIndex = s !== void 0 ? parseInt(s, 10) : null, this.swipeEngine?.enable(), await this.zoomEngine.focusImage(t, o, e), this.currentFocusIndex !== null && this.updateCounter(this.currentFocusIndex);
3275
+ const a = t.dataset.imageId;
3276
+ this.currentFocusIndex = a !== void 0 ? parseInt(a, 10) : null, this.swipeEngine?.enable(), await this.zoomEngine.focusImage(t, o, i), this.currentFocusIndex !== null && this.updateCounter(this.currentFocusIndex);
3186
3277
  }
3187
3278
  }
3188
3279
  /**
@@ -3213,7 +3304,7 @@ class De {
3213
3304
  this.clearImageCloud(), this.loadingElAutoCreated && this.loadingEl && (this.loadingEl.remove(), this.loadingEl = null), this.errorElAutoCreated && this.errorEl && (this.errorEl.remove(), this.errorEl = null), this.counterElAutoCreated && this.counterEl && (this.counterEl.remove(), this.counterEl = null), this.resizeTimeout !== null && clearTimeout(this.resizeTimeout), this.swipeEngine?.destroy();
3214
3305
  }
3215
3306
  }
3216
- const wt = class wt extends HTMLElement {
3307
+ const xt = class xt extends HTMLElement {
3217
3308
  constructor() {
3218
3309
  super(...arguments), this._instance = null, this._container = null;
3219
3310
  }
@@ -3223,27 +3314,27 @@ const wt = class wt extends HTMLElement {
3223
3314
  disconnectedCallback() {
3224
3315
  this._destroy(), this._container && (this._container.remove(), this._container = null);
3225
3316
  }
3226
- attributeChangedCallback(t, e, i) {
3227
- e !== i && this._container && (this._destroy(), this._init());
3317
+ attributeChangedCallback(t, i, e) {
3318
+ i !== e && this._container && (this._destroy(), this._init());
3228
3319
  }
3229
3320
  getInstance() {
3230
3321
  return this._instance;
3231
3322
  }
3232
3323
  _getOptions() {
3233
- const t = {}, e = this.getAttribute("config");
3234
- if (e)
3324
+ const t = {}, i = this.getAttribute("config");
3325
+ if (i)
3235
3326
  try {
3236
- const s = JSON.parse(e), { container: r, ...a } = s;
3237
- Object.assign(t, a);
3238
- } catch (s) {
3239
- console.error("<image-cloud> invalid config JSON:", s);
3327
+ const a = JSON.parse(i), { container: r, ...s } = a;
3328
+ Object.assign(t, s);
3329
+ } catch (a) {
3330
+ console.error("<image-cloud> invalid config JSON:", a);
3240
3331
  }
3241
- const i = this.getAttribute("images");
3242
- if (i)
3332
+ const e = this.getAttribute("images");
3333
+ if (e)
3243
3334
  try {
3244
- t.images = JSON.parse(i);
3245
- } catch (s) {
3246
- console.error("<image-cloud> invalid images JSON:", s);
3335
+ t.images = JSON.parse(e);
3336
+ } catch (a) {
3337
+ console.error("<image-cloud> invalid images JSON:", a);
3247
3338
  }
3248
3339
  const o = this.getAttribute("layout");
3249
3340
  return o && (t.layout = {
@@ -3255,13 +3346,13 @@ const wt = class wt extends HTMLElement {
3255
3346
  if (this._container)
3256
3347
  try {
3257
3348
  const t = this._getOptions();
3258
- this._instance = new De({
3349
+ this._instance = new _e({
3259
3350
  container: this._container,
3260
3351
  ...t
3261
3352
  }), this._instance.init().then(() => {
3262
3353
  this.dispatchEvent(new CustomEvent("initialized", { bubbles: !0 }));
3263
- }).catch((e) => {
3264
- console.error("<image-cloud> init failed:", e), this.dispatchEvent(new CustomEvent("error", { detail: e, bubbles: !0 }));
3354
+ }).catch((i) => {
3355
+ console.error("<image-cloud> init failed:", i), this.dispatchEvent(new CustomEvent("error", { detail: i, bubbles: !0 }));
3265
3356
  });
3266
3357
  } catch (t) {
3267
3358
  console.error("<image-cloud> creation failed:", t), this.dispatchEvent(new CustomEvent("error", { detail: t, bubbles: !0 }));
@@ -3271,10 +3362,10 @@ const wt = class wt extends HTMLElement {
3271
3362
  this._instance?.destroy(), this._instance = null;
3272
3363
  }
3273
3364
  };
3274
- wt.observedAttributes = ["config", "images", "layout"];
3275
- let pt = wt;
3276
- typeof customElements < "u" && !customElements.get("image-cloud") && customElements.define("image-cloud", pt);
3365
+ xt.observedAttributes = ["config", "images", "layout"];
3366
+ let bt = xt;
3367
+ typeof customElements < "u" && !customElements.get("image-cloud") && customElements.define("image-cloud", bt);
3277
3368
  export {
3278
- pt as ImageCloudElement
3369
+ bt as ImageCloudElement
3279
3370
  };
3280
3371
  //# sourceMappingURL=web-component.js.map