@frybynite/image-cloud 0.7.4 → 0.7.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,14 +1,14 @@
1
- const Ot = ".fbn-ic-gallery{--fbn-ic-bg-primary: #05060F;--fbn-ic-bg-secondary: #1a1a2e;--fbn-ic-bg-glass: rgba(255, 255, 255, .05);--fbn-ic-border-glass: rgba(255, 255, 255, .1);--fbn-ic-text-primary: #ffffff;--fbn-ic-text-secondary: #b8b8d1;--fbn-ic-text-muted: #6b6b8f;--fbn-ic-accent-primary: #6366f1;--fbn-ic-accent-secondary: #8b5cf6;--fbn-ic-accent-glow: rgba(99, 102, 241, .4);--fbn-ic-transition-smooth: cubic-bezier(.4, 0, .2, 1);--fbn-ic-transition-bounce: cubic-bezier(.68, -.55, .265, 1.55);--fbn-ic-shadow-sm: 0 2px 8px rgba(0, 0, 0, .3);--fbn-ic-shadow-md: 0 4px 16px rgba(0, 0, 0, .4);--fbn-ic-shadow-lg: 0 8px 32px rgba(0, 0, 0, .5);--fbn-ic-shadow-glow: 0 0 20px var(--fbn-ic-accent-glow)}.fbn-ic-gallery{position:relative;width:100%;height:100%;overflow:hidden;perspective:1000px}.fbn-ic-image{position:absolute;border-radius:8px;box-shadow:var(--fbn-ic-shadow-md);cursor:pointer;transition:transform .6s var(--fbn-ic-transition-smooth),box-shadow .6s var(--fbn-ic-transition-smooth),filter .3s var(--fbn-ic-transition-smooth),opacity .3s var(--fbn-ic-transition-smooth),border .3s var(--fbn-ic-transition-smooth),outline .3s var(--fbn-ic-transition-smooth),z-index 0s .6s;will-change:transform;-webkit-user-select:none;user-select:none;backface-visibility:hidden;-webkit-backface-visibility:hidden}.fbn-ic-image:hover{box-shadow:var(--fbn-ic-shadow-lg)}.fbn-ic-image.fbn-ic-focused{z-index:1000;box-shadow:0 20px 60px #000000b3,var(--fbn-ic-shadow-glow);transition:transform .6s var(--fbn-ic-transition-smooth),box-shadow .6s var(--fbn-ic-transition-smooth),filter .3s var(--fbn-ic-transition-smooth),opacity .3s var(--fbn-ic-transition-smooth),border .3s var(--fbn-ic-transition-smooth),outline .3s var(--fbn-ic-transition-smooth),z-index 0s 0s;will-change:auto}.fbn-ic-loading{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;color:var(--fbn-ic-text-secondary);z-index:100;pointer-events:none}.fbn-ic-spinner{width:50px;height:50px;margin:0 auto 1rem;border:4px solid var(--fbn-ic-border-glass);border-top:4px solid var(--fbn-ic-accent-primary);border-radius:50%;animation:fbn-ic-spin 1s linear infinite}@keyframes fbn-ic-spin{to{transform:rotate(360deg)}}.fbn-ic-error{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);max-width:600px;padding:1.5rem;background:#ef44441a;border:1px solid rgba(239,68,68,.3);border-radius:12px;color:#fca5a5;text-align:center;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);z-index:100}.fbn-ic-counter{background:#0009;color:#fff;padding:6px 16px;border-radius:16px;font-family:system-ui,sans-serif;font-size:14px}.fbn-ic-hidden{display:none!important}", ft = Object.freeze({
1
+ const Dt = ".fbn-ic-gallery{--fbn-ic-bg-primary: #05060F;--fbn-ic-bg-secondary: #1a1a2e;--fbn-ic-bg-glass: rgba(255, 255, 255, .05);--fbn-ic-border-glass: rgba(255, 255, 255, .1);--fbn-ic-text-primary: #ffffff;--fbn-ic-text-secondary: #b8b8d1;--fbn-ic-text-muted: #6b6b8f;--fbn-ic-accent-primary: #6366f1;--fbn-ic-accent-secondary: #8b5cf6;--fbn-ic-accent-glow: rgba(99, 102, 241, .4);--fbn-ic-transition-smooth: cubic-bezier(.4, 0, .2, 1);--fbn-ic-transition-bounce: cubic-bezier(.68, -.55, .265, 1.55);--fbn-ic-shadow-sm: 0 2px 8px rgba(0, 0, 0, .3);--fbn-ic-shadow-md: 0 4px 16px rgba(0, 0, 0, .4);--fbn-ic-shadow-lg: 0 8px 32px rgba(0, 0, 0, .5);--fbn-ic-shadow-glow: 0 0 20px var(--fbn-ic-accent-glow)}.fbn-ic-gallery{position:relative;width:100%;height:100%;overflow:hidden;perspective:1000px}.fbn-ic-image{position:absolute;border-radius:8px;box-shadow:var(--fbn-ic-shadow-md);cursor:pointer;transition:transform .6s var(--fbn-ic-transition-smooth),box-shadow .6s var(--fbn-ic-transition-smooth),filter .3s var(--fbn-ic-transition-smooth),opacity .3s var(--fbn-ic-transition-smooth),border .3s var(--fbn-ic-transition-smooth),outline .3s var(--fbn-ic-transition-smooth),z-index 0s .6s;will-change:transform;-webkit-user-select:none;user-select:none;backface-visibility:hidden;-webkit-backface-visibility:hidden}.fbn-ic-image:hover{box-shadow:var(--fbn-ic-shadow-lg)}.fbn-ic-image.fbn-ic-focused{z-index:1000;box-shadow:0 20px 60px #000000b3,var(--fbn-ic-shadow-glow);transition:transform .6s var(--fbn-ic-transition-smooth),box-shadow .6s var(--fbn-ic-transition-smooth),filter .3s var(--fbn-ic-transition-smooth),opacity .3s var(--fbn-ic-transition-smooth),border .3s var(--fbn-ic-transition-smooth),outline .3s var(--fbn-ic-transition-smooth),z-index 0s 0s;will-change:auto}.fbn-ic-loading{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;color:var(--fbn-ic-text-secondary);z-index:100;pointer-events:none}.fbn-ic-spinner{width:50px;height:50px;margin:0 auto 1rem;border:4px solid var(--fbn-ic-border-glass);border-top:4px solid var(--fbn-ic-accent-primary);border-radius:50%;animation:fbn-ic-spin 1s linear infinite}@keyframes fbn-ic-spin{to{transform:rotate(360deg)}}.fbn-ic-error{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);max-width:600px;padding:1.5rem;background:#ef44441a;border:1px solid rgba(239,68,68,.3);border-radius:12px;color:#fca5a5;text-align:center;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);z-index:100}.fbn-ic-counter{background:#0009;color:#fff;padding:6px 16px;border-radius:16px;font-family:system-ui,sans-serif;font-size:14px}.fbn-ic-hidden{display:none!important}", gt = Object.freeze({
2
2
  none: "none",
3
3
  sm: "0 2px 4px rgba(0,0,0,0.1)",
4
4
  md: "0 4px 16px rgba(0,0,0,0.4)",
5
5
  lg: "0 8px 32px rgba(0,0,0,0.5)",
6
6
  glow: "0 0 30px rgba(255,255,255,0.6)"
7
- }), wt = Object.freeze({
7
+ }), xt = 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
- }), xt = Object.freeze({
11
+ }), Et = 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 }),
@@ -24,7 +24,7 @@ const Ot = ".fbn-ic-gallery{--fbn-ic-bg-primary: #05060F;--fbn-ic-bg-secondary:
24
24
  mode: "none"
25
25
  }), yt = Object.freeze({
26
26
  mode: "none"
27
- }), Ct = Object.freeze({
27
+ }), Tt = Object.freeze({
28
28
  default: Object.freeze({
29
29
  border: Object.freeze({
30
30
  width: 0,
@@ -50,7 +50,7 @@ const Ot = ".fbn-ic-gallery{--fbn-ic-bg-primary: #05060F;--fbn-ic-bg-secondary:
50
50
  focused: Object.freeze({
51
51
  shadow: "none"
52
52
  })
53
- }), $t = Object.freeze({
53
+ }), Ot = Object.freeze({
54
54
  rows: 1,
55
55
  amplitude: 100,
56
56
  frequency: 2,
@@ -78,15 +78,15 @@ const Ot = ".fbn-ic-gallery{--fbn-ic-bg-primary: #05060F;--fbn-ic-bg-secondary:
78
78
  min: -15,
79
79
  max: 15
80
80
  })
81
- }), Tt = Object.freeze({
81
+ }), Rt = Object.freeze({
82
82
  sizing: Ut,
83
83
  rotation: _t
84
- }), Rt = Object.freeze({
84
+ }), Mt = Object.freeze({
85
85
  validateUrls: !0,
86
86
  validationTimeout: 5e3,
87
87
  validationMethod: "head",
88
88
  allowedExtensions: ["jpg", "jpeg", "png", "gif", "webp", "bmp"]
89
- }), Mt = Object.freeze({
89
+ }), Lt = Object.freeze({
90
90
  enabled: !1,
91
91
  centers: !1,
92
92
  loaders: !1
@@ -95,11 +95,11 @@ const Ot = ".fbn-ic-gallery{--fbn-ic-bg-primary: #05060F;--fbn-ic-bg-secondary:
95
95
  loaders: [],
96
96
  // Shared loader settings and debug config
97
97
  config: Object.freeze({
98
- loaders: Rt,
99
- debug: Mt
98
+ loaders: Mt,
99
+ debug: Lt
100
100
  }),
101
101
  // Image sizing and rotation configuration
102
- image: Tt,
102
+ image: Rt,
103
103
  // Pattern-based layout configuration
104
104
  layout: Object.freeze({
105
105
  algorithm: "radial",
@@ -216,47 +216,47 @@ const Ot = ".fbn-ic-gallery{--fbn-ic-bg-primary: #05060F;--fbn-ic-bg-secondary:
216
216
  })
217
217
  }),
218
218
  // Image styling
219
- styling: Ct
219
+ styling: Tt
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 Ht(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 Nt(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;
@@ -279,14 +279,14 @@ function jt(n) {
279
279
  }
280
280
  };
281
281
  }
282
- function Gt(n = {}) {
283
- const t = kt(n), e = jt(n);
284
- let i = n.image;
285
- (t || e) && (i = {
286
- ...e || {},
282
+ function Wt(n = {}) {
283
+ const t = kt(n), i = jt(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
- ...Rt,
301
+ ...Mt,
302
302
  ...n.config?.loaders ?? {}
303
303
  }
304
- }, a = {
304
+ }, s = {
305
305
  loaders: o,
306
306
  config: r,
307
- image: Nt(Tt, i),
307
+ image: Nt(Rt, e),
308
308
  layout: { ...y.layout },
309
309
  animation: { ...y.animation },
310
310
  interaction: { ...y.interaction },
311
311
  rendering: { ...y.rendering },
312
- styling: Ht(Ct, n.styling)
312
+ styling: Ht(Tt, n.styling)
313
313
  };
314
- return n.layout && (a.layout = {
314
+ return n.layout && (s.layout = {
315
315
  ...y.layout,
316
316
  ...n.layout
317
- }, n.layout.responsive && (a.layout.responsive = {
317
+ }, n.layout.responsive && (s.layout.responsive = {
318
318
  ...y.layout.responsive,
319
319
  mobile: n.layout.responsive.mobile ? { ...y.layout.responsive.mobile, ...n.layout.responsive.mobile } : y.layout.responsive.mobile,
320
320
  tablet: n.layout.responsive.tablet ? { ...y.layout.responsive.tablet, ...n.layout.responsive.tablet } : y.layout.responsive.tablet
321
- }), n.layout.spacing && (a.layout.spacing = {
321
+ }), n.layout.spacing && (s.layout.spacing = {
322
322
  ...y.layout.spacing,
323
323
  ...n.layout.spacing
324
- })), n.animation && (a.animation = {
324
+ })), n.animation && (s.animation = {
325
325
  ...y.animation,
326
326
  ...n.animation
327
- }, n.animation.easing && (a.animation.easing = {
327
+ }, n.animation.easing && (s.animation.easing = {
328
328
  ...y.animation.easing,
329
329
  ...n.animation.easing
330
- }), n.animation.queue && (a.animation.queue = {
330
+ }), n.animation.queue && (s.animation.queue = {
331
331
  ...y.animation.queue,
332
332
  ...n.animation.queue
333
- }), n.animation.performance && (a.animation.performance = {
333
+ }), n.animation.performance && (s.animation.performance = {
334
334
  ...y.animation.performance,
335
335
  ...n.animation.performance
336
- }), n.animation.entry && (a.animation.entry = {
336
+ }), n.animation.entry && (s.animation.entry = {
337
337
  ...y.animation.entry,
338
338
  ...n.animation.entry,
339
339
  start: n.animation.entry.start ? {
@@ -345,42 +345,42 @@ function Gt(n = {}) {
345
345
  path: n.animation.entry.path ? { ...pt, ...n.animation.entry.path } : y.animation.entry.path,
346
346
  rotation: n.animation.entry.rotation ? { ...bt, ...n.animation.entry.rotation } : y.animation.entry.rotation,
347
347
  scale: n.animation.entry.scale ? { ...yt, ...n.animation.entry.scale } : y.animation.entry.scale
348
- })), n.interaction && (a.interaction = {
348
+ })), n.interaction && (s.interaction = {
349
349
  ...y.interaction,
350
350
  ...n.interaction
351
- }, n.interaction.focus && (a.interaction.focus = {
351
+ }, n.interaction.focus && (s.interaction.focus = {
352
352
  ...y.interaction.focus,
353
353
  ...n.interaction.focus
354
- }), n.interaction.navigation && (a.interaction.navigation = {
354
+ }), n.interaction.navigation && (s.interaction.navigation = {
355
355
  ...y.interaction.navigation,
356
356
  ...n.interaction.navigation
357
- }), n.interaction.gestures && (a.interaction.gestures = {
357
+ }), n.interaction.gestures && (s.interaction.gestures = {
358
358
  ...y.interaction.gestures,
359
359
  ...n.interaction.gestures
360
- })), n.rendering && (a.rendering = {
360
+ })), n.rendering && (s.rendering = {
361
361
  ...y.rendering,
362
362
  ...n.rendering
363
- }, n.rendering.responsive && (a.rendering.responsive = {
363
+ }, n.rendering.responsive && (s.rendering.responsive = {
364
364
  ...y.rendering.responsive,
365
365
  ...n.rendering.responsive,
366
366
  breakpoints: n.rendering.responsive.breakpoints ? { ...y.rendering.responsive.breakpoints, ...n.rendering.responsive.breakpoints } : y.rendering.responsive.breakpoints,
367
367
  mobileDetection: n.rendering.responsive.mobileDetection ? n.rendering.responsive.mobileDetection : y.rendering.responsive.mobileDetection
368
- }), n.rendering.ui && (a.rendering.ui = {
368
+ }), n.rendering.ui && (s.rendering.ui = {
369
369
  ...y.rendering.ui,
370
370
  ...n.rendering.ui
371
- }), n.rendering.performance && (a.rendering.performance = {
371
+ }), n.rendering.performance && (s.rendering.performance = {
372
372
  ...y.rendering.performance,
373
373
  ...n.rendering.performance
374
- })), a.config.debug = {
375
- ...Mt,
374
+ })), s.config.debug = {
375
+ ...Lt,
376
376
  ...n.config?.debug ?? {}
377
- }, a;
377
+ }, s;
378
378
  }
379
- function Wt(n, t) {
380
- return { ...n ? wt[n] : wt.playful, ...t };
379
+ function Gt(n, t) {
380
+ return { ...n ? xt[n] : xt.playful, ...t };
381
381
  }
382
382
  function qt(n, t) {
383
- return { ...n ? xt[n] : xt.gentle, ...t };
383
+ return { ...n ? Et[n] : Et.gentle, ...t };
384
384
  }
385
385
  function Yt(n, t) {
386
386
  return { ...n ? St[n] : St.gentle, ...t };
@@ -394,12 +394,12 @@ class Xt {
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 Xt {
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 Xt {
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 Xt {
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 Xt {
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 Xt {
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 Xt {
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 Xt {
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 Bt(n, t, e, i) {
548
- const { overshoot: o, bounces: s, decayRatio: r } = i, a = e.x - t.x, h = e.y - t.y, c = Jt(s, r);
549
- let u = 0, l = 0, d = 1, f = 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, f = c[g].overshoot, b = c[g].isOvershoot;
547
+ function Bt(n, t, i, e) {
548
+ const { overshoot: o, bounces: a, decayRatio: r } = e, s = i.x - t.x, h = i.y - t.y, c = Jt(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 + f * ot(p);
555
+ const b = (n - l) / (u - l);
556
+ if (p)
557
+ d = 1 + g * it(b);
558
558
  else if (l === 0)
559
- u = ot(p);
559
+ d = it(b);
560
560
  else {
561
561
  const m = 1 + (c.find(
562
- (S, v) => S.time > l && v > 0 && c[v - 1].isOvershoot
563
- )?.overshoot || f);
564
- u = V(m, 1, ot(p));
562
+ (E, v) => E.time > l && v > 0 && c[v - 1].isOvershoot
563
+ )?.overshoot || g);
564
+ d = V(m, 1, it(b));
565
565
  }
566
566
  return {
567
- x: t.x + a * u,
568
- y: t.y + h * u
567
+ x: t.x + s * d,
568
+ y: t.y + h * d
569
569
  };
570
570
  }
571
571
  function Jt(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 Vt(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 Vt(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 f = u * Math.sqrt(1 - l * l), b = Math.exp(-l * u * n * 3), p = Math.cos(f * 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 Kt(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, f = 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, m = Zt(n);
594
+ function Kt(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 = Zt(n);
596
596
  return {
597
- x: V(t.x, e.x, m) + g * d,
598
- y: V(t.y, e.y, m) + g * f
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 it(n) {
602
602
  return 1 - (1 - n) * (1 - n);
603
603
  }
604
604
  function Zt(n) {
605
605
  return 1 - Math.pow(1 - n, 3);
606
606
  }
607
- function Qt(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 Qt(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 te(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 f = 1 - (r - 1) * a;
619
- u += c, s.push({ time: u, scale: f }), 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 te(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 f = d === 0 ? 0 : s[d - 1].time, b = d === 0 ? 1 : s[d - 1].scale, p = (n - f) / (s[d].time - f), g = ot(p);
626
- l = b + (s[d].scale - b) * g;
623
+ for (let u = 0; u < a.length; u++)
624
+ if (n <= a[u].time) {
625
+ const g = u === 0 ? 0 : a[u - 1].time, p = u === 0 ? 1 : a[u - 1].scale, b = (n - g) / (a[u].time - g), f = it(b);
626
+ l = p + (a[u].scale - p) * f;
627
627
  break;
628
628
  }
629
629
  return l * t;
@@ -631,64 +631,64 @@ function te(n, t, e) {
631
631
  function ee(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: f,
646
- startScale: b
647
- } = n, p = o.type, g = d !== void 0 && d !== h, m = l?.mode === "wobble", S = l?.wobble || { amplitude: 15, frequency: 3, decay: !0 }, v = g || m, w = b !== void 0 && b !== c, E = f?.mode === "pop", x = f?.pop || { overshoot: 1.2, bounces: 1 };
648
- if ((p === "linear" || p === "arc") && !v && !(w || E)) {
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, U = -a / 2;
652
+ const L = performance.now(), z = -r / 2, U = -s / 2;
653
653
  function _(Y) {
654
- const N = Y - L, C = Math.min(N / s, 1);
655
- let D;
656
- switch (p) {
654
+ const N = Y - L, A = Math.min(N / a, 1);
655
+ let $;
656
+ switch (b) {
657
657
  case "bounce": {
658
- const O = Wt(
658
+ const D = Gt(
659
659
  o.bouncePreset,
660
660
  o.bounce
661
661
  );
662
- D = Bt(C, e, i, O);
662
+ $ = Bt(A, i, e, D);
663
663
  break;
664
664
  }
665
665
  case "elastic": {
666
- const O = qt(
666
+ const D = qt(
667
667
  o.elasticPreset,
668
668
  o.elastic
669
669
  );
670
- D = Vt(C, e, i, O);
670
+ $ = Vt(A, i, e, D);
671
671
  break;
672
672
  }
673
673
  case "wave": {
674
- const O = Yt(
674
+ const D = Yt(
675
675
  o.wavePreset,
676
676
  o.wave
677
677
  );
678
- D = Kt(C, e, i, O);
678
+ $ = Kt(A, i, e, D);
679
679
  break;
680
680
  }
681
681
  default:
682
- D = {
683
- x: V(e.x, i.x, C),
684
- y: V(e.y, i.y, C)
682
+ $ = {
683
+ x: V(i.x, e.x, A),
684
+ y: V(i.y, e.y, A)
685
685
  };
686
686
  }
687
- const j = D.x - i.x, H = D.y - i.y;
687
+ const j = $.x - e.x, H = $.y - e.y;
688
688
  let R;
689
- m ? R = Qt(C, h, S) : g ? R = V(d, h, C) : R = h;
689
+ m ? R = Qt(A, h, E) : f ? R = V(u, h, A) : R = h;
690
690
  let T;
691
- E ? T = te(C, c, x) : w ? T = V(b, c, C) : T = c, t.style.transform = `translate(${z}px, ${U}px) translate(${j}px, ${H}px) rotate(${R}deg) scale(${T})`, C < 1 ? requestAnimationFrame(_) : (t.style.transform = `translate(${z}px, ${U}px) rotate(${h}deg) scale(${c})`, u && u());
691
+ S ? T = te(A, c, x) : w ? T = V(p, c, A) : T = c, t.style.transform = `translate(${z}px, ${U}px) translate(${j}px, ${H}px) rotate(${R}deg) scale(${T})`, A < 1 ? requestAnimationFrame(_) : (t.style.transform = `translate(${z}px, ${U}px) rotate(${h}deg) scale(${c})`, d && d());
692
692
  }
693
693
  requestAnimationFrame(_);
694
694
  }
@@ -704,8 +704,8 @@ const ne = {
704
704
  wave: "left"
705
705
  };
706
706
  class oe {
707
- constructor(t, e) {
708
- this.config = t, this.layoutAlgorithm = e, this.resolvedStartPosition = this.resolveStartPosition(), this.pathConfig = t.path || pt, this.rotationConfig = t.rotation || bt, this.scaleConfig = t.scale || yt;
707
+ constructor(t, i) {
708
+ this.config = t, this.layoutAlgorithm = i, this.resolvedStartPosition = this.resolveStartPosition(), this.pathConfig = t.path || pt, this.rotationConfig = t.rotation || bt, this.scaleConfig = t.scale || yt;
709
709
  }
710
710
  /**
711
711
  * Get the effective start position, considering layout-aware defaults
@@ -716,72 +716,72 @@ class oe {
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, f = t.y;
754
- return l === a ? d = -(e.width + o) : l === h ? d = i.width + o : l === c ? f = -(e.height + o) : f = i.height + o, { x: d, y: f };
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 oe {
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, f = l + Math.cos(u) * h, b = d + Math.sin(u) * h;
813
- return { x: f, 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, f = s !== void 0 ? -s / 2 : 0, b = r !== void 0 ? -r / 2 : 0, p = s !== void 0 ? `translate(${f}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 oe {
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 oe {
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 oe {
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 oe {
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 oe {
1048
1048
  }
1049
1049
  }
1050
1050
  class se {
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,12 +1058,12 @@ class se {
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, f = this.imageConfig.sizing?.variance?.max ?? 1, b = d !== 1 || f !== 1, g = h * 1.5 / 2, m = h / 2, S = s - a - g, v = r - a - m, w = a + g, E = a + m;
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, S), L = this.random(E, v), z = c === "random" ? this.random(u, l) : 0, U = b ? this.random(d, f) : 1, _ = h * U, Y = {
1064
+ const C = this.random(w, E), L = this.random(S, v), z = c === "random" ? this.random(d, l) : 0, U = p ? this.random(u, g) : 1, _ = h * U, Y = {
1065
1065
  id: x,
1066
- x: A,
1066
+ x: C,
1067
1067
  y: L,
1068
1068
  rotation: z,
1069
1069
  scale: U,
@@ -1079,13 +1079,13 @@ class se {
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 ae {
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,17 +1094,17 @@ class ae {
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, f = l !== 1 || d !== 1, b = this.config.scaleDecay ?? 0, p = i.fixedHeight ?? a, g = s / 2, m = r / 2, S = 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 E = f ? this.random(l, d) : 1, x = p * E;
1100
+ const S = g ? this.random(l, u) : 1, x = b * S;
1101
1101
  o.push({
1102
1102
  id: 0,
1103
- x: g,
1103
+ x: f,
1104
1104
  y: m,
1105
- rotation: h === "random" ? this.random(c * 0.33, u * 0.33) : 0,
1105
+ rotation: h === "random" ? this.random(c * 0.33, d * 0.33) : 0,
1106
1106
  // Less rotation for center
1107
- scale: E,
1107
+ scale: S,
1108
1108
  baseSize: x,
1109
1109
  zIndex: 100
1110
1110
  // Center image is highest
@@ -1112,23 +1112,23 @@ class ae {
1112
1112
  }
1113
1113
  let v = 1, w = 1;
1114
1114
  for (; v < t; ) {
1115
- const E = w / S, x = b > 0 ? 1 - E * 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))), U = this.estimateWidth(p), _ = Math.floor(z / (U * 0.7));
1115
+ const S = w / E, x = p > 0 ? 1 - S * p * 0.5 : 1, C = w * (b * 0.8), L = C * 1.5, z = Math.PI * (3 * (L + C) - Math.sqrt((3 * L + C) * (L + 3 * C))), U = this.estimateWidth(b), _ = Math.floor(z / (U * 0.7));
1116
1116
  if (_ === 0) {
1117
1117
  w++;
1118
1118
  continue;
1119
1119
  }
1120
1120
  const Y = 2 * Math.PI / _, N = w * (20 * Math.PI / 180);
1121
- for (let C = 0; C < _ && v < t; C++) {
1122
- const D = C * Y + N, j = f ? this.random(l, d) : 1, H = x * j, R = p * H;
1123
- let T = g + Math.cos(D) * L, O = m + Math.sin(D) * A;
1124
- const $ = this.config.spacing.padding ?? 50, P = R * 1.5 / 2, M = R / 2;
1125
- T - P < $ ? T = $ + P : T + P > s - $ && (T = s - $ - P), O - M < $ ? O = $ + M : O + M > r - $ && (O = r - $ - M);
1126
- const G = h === "random" ? this.random(c, u) : 0;
1121
+ for (let A = 0; A < _ && v < t; A++) {
1122
+ const $ = A * Y + N, j = g ? this.random(l, u) : 1, H = x * j, R = b * H;
1123
+ let T = f + Math.cos($) * L, D = m + Math.sin($) * C;
1124
+ const O = this.config.spacing.padding ?? 50, P = R * 1.5 / 2, M = R / 2;
1125
+ T - P < O ? T = O + P : T + P > a - O && (T = a - O - P), D - M < O ? D = O + M : D + M > r - O && (D = r - O - M);
1126
+ const W = h === "random" ? this.random(c, d) : 0;
1127
1127
  o.push({
1128
1128
  id: v,
1129
1129
  x: T,
1130
- y: O,
1131
- rotation: G,
1130
+ y: D,
1131
+ rotation: W,
1132
1132
  scale: H,
1133
1133
  baseSize: R,
1134
1134
  zIndex: Math.max(1, 100 - w)
@@ -1154,8 +1154,8 @@ class ae {
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 re = {
@@ -1168,7 +1168,7 @@ const re = {
1168
1168
  alignment: "center",
1169
1169
  gap: 10,
1170
1170
  overflowOffset: 0.25
1171
- }, Et = [
1171
+ }, It = [
1172
1172
  { x: 1, y: 1 },
1173
1173
  // bottom-right
1174
1174
  { x: -1, y: -1 },
@@ -1187,8 +1187,8 @@ const re = {
1187
1187
  // down
1188
1188
  ];
1189
1189
  class ce {
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 ce {
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 = { ...re, ...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, f = l !== 1 || d !== 1, b = s - 2 * h, p = r - 2 * h, { columns: g, rows: m } = this.calculateGridDimensions(
1200
+ generate(t, i, e = {}) {
1201
+ const o = [], { width: a, height: r } = i, s = { ...re, ...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
- ), S = a.stagger === "row", v = a.stagger === "column", w = S ? g + 0.5 : g, E = v ? m + 0.5 : m, x = (b - a.gap * (g - 1)) / w, A = (p - a.gap * (m - 1)) / E, L = S ? x / 2 : 0, z = v ? A / 2 : 0, U = 1 + a.overlap, _ = Math.min(x, A) * U, Y = i.fixedHeight ? Math.min(i.fixedHeight, _) : _, N = g * x + (g - 1) * a.gap + L, C = m * A + (m - 1) * a.gap + z, D = h + (b - N) / 2, j = h + (p - C) / 2, H = g * m, R = a.columns !== "auto" && a.rows !== "auto", T = 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, C = (b - s.gap * (m - 1)) / S, L = E ? x / 2 : 0, z = v ? C / 2 : 0, U = 1 + s.overlap, _ = Math.min(x, C) * U, Y = e.fixedHeight ? Math.min(e.fixedHeight, _) : _, N = f * x + (f - 1) * s.gap + L, A = m * C + (m - 1) * s.gap + z, $ = h + (p - N) / 2, j = h + (b - A) / 2, H = f * m, R = s.columns !== "auto" && s.rows !== "auto", T = R && t > H;
1208
1208
  typeof window < "u" && (window.__gridOverflowDebug = {
1209
- gridConfigColumns: a.columns,
1210
- gridConfigRows: a.rows,
1211
- columns: g,
1209
+ gridConfigColumns: s.columns,
1210
+ gridConfigRows: s.rows,
1211
+ columns: f,
1212
1212
  rows: m,
1213
1213
  cellCount: H,
1214
1214
  hasFixedGrid: R,
1215
1215
  imageCount: t,
1216
1216
  isOverflowMode: T
1217
1217
  });
1218
- const O = T ? new Array(H).fill(0) : [], $ = Math.min(x, A) * a.overflowOffset;
1218
+ const D = T ? new Array(H).fill(0) : [], O = Math.min(x, C) * s.overflowOffset;
1219
1219
  for (let F = 0; F < t; F++) {
1220
- let P, M, G = 0;
1220
+ let P, M, W = 0;
1221
1221
  if (T && F >= H) {
1222
1222
  const q = F - H, k = q % H;
1223
- G = Math.floor(q / H) + 1, O[k]++, a.fillDirection === "row" ? (P = k % g, M = Math.floor(k / g)) : (M = k % m, P = Math.floor(k / m));
1223
+ W = Math.floor(q / H) + 1, D[k]++, s.fillDirection === "row" ? (P = k % f, M = Math.floor(k / f)) : (M = k % m, P = Math.floor(k / m));
1224
1224
  } else
1225
- a.fillDirection === "row" ? (P = F % g, M = Math.floor(F / g)) : (M = F % m, P = Math.floor(F / m));
1226
- let W = D + P * (x + a.gap) + x / 2, X = j + M * (A + a.gap) + A / 2;
1227
- if (a.stagger === "row" && M % 2 === 1 ? W += x / 2 : a.stagger === "column" && P % 2 === 1 && (X += A / 2), G > 0) {
1228
- const q = (G - 1) % Et.length, k = Et[q];
1229
- W += k.x * $, X += k.y * $;
1225
+ s.fillDirection === "row" ? (P = F % f, M = Math.floor(F / f)) : (M = F % m, P = Math.floor(F / m));
1226
+ let G = $ + P * (x + s.gap) + x / 2, X = j + M * (C + s.gap) + C / 2;
1227
+ if (s.stagger === "row" && M % 2 === 1 ? G += x / 2 : s.stagger === "column" && P % 2 === 1 && (X += C / 2), W > 0) {
1228
+ const q = (W - 1) % It.length, k = It[q];
1229
+ G += k.x * O, X += k.y * O;
1230
1230
  }
1231
- if (a.jitter > 0) {
1232
- const q = x / 2 * a.jitter, k = A / 2 * a.jitter;
1233
- W += this.random(-q, q), X += this.random(-k, k);
1231
+ if (s.jitter > 0) {
1232
+ const q = x / 2 * s.jitter, k = C / 2 * s.jitter;
1233
+ G += this.random(-q, q), X += this.random(-k, k);
1234
1234
  }
1235
- let B = W, J = X;
1236
- if (!T && a.fillDirection === "row") {
1237
- const q = t % g || g;
1238
- if (M === Math.floor((t - 1) / g) && q < g) {
1239
- const vt = q * x + (q - 1) * a.gap;
1240
- let gt = 0;
1241
- a.alignment === "center" ? gt = (N - vt) / 2 : a.alignment === "end" && (gt = N - vt), B += gt;
1235
+ let B = G, J = X;
1236
+ if (!T && s.fillDirection === "row") {
1237
+ const q = t % f || f;
1238
+ if (M === Math.floor((t - 1) / f) && q < f) {
1239
+ const wt = q * x + (q - 1) * s.gap;
1240
+ let dt = 0;
1241
+ s.alignment === "center" ? dt = (N - wt) / 2 : s.alignment === "end" && (dt = N - wt), B += dt;
1242
1242
  }
1243
1243
  }
1244
- const rt = f ? this.random(l, d) : 1, K = Y * rt, it = K * 1.5 / 2, nt = K / 2, lt = h + it, ht = s - h - it, Ft = h + nt, Dt = r - h - nt;
1245
- B = Math.max(lt, Math.min(B, ht)), J = Math.max(Ft, Math.min(J, Dt));
1246
- let dt = 0;
1247
- if (u === "random") {
1244
+ const st = g ? this.random(l, u) : 1, K = Y * st, tt = K * 1.5 / 2, et = K / 2, rt = h + tt, ct = a - h - tt, Ft = h + et, $t = r - h - et;
1245
+ B = Math.max(rt, Math.min(B, ct)), J = Math.max(Ft, Math.min(J, $t));
1246
+ let lt = 0;
1247
+ if (d === "random") {
1248
1248
  const q = this.imageConfig.rotation?.range?.min ?? -15, k = this.imageConfig.rotation?.range?.max ?? 15;
1249
- a.jitter > 0 ? dt = this.random(q * a.jitter, k * a.jitter) : dt = this.random(q, k);
1249
+ s.jitter > 0 ? lt = this.random(q * s.jitter, k * s.jitter) : lt = this.random(q, k);
1250
1250
  }
1251
- let ut;
1252
- T && G > 0 ? ut = 50 - G : ut = T ? 100 + F : F + 1, o.push({
1251
+ let ht;
1252
+ T && W > 0 ? ht = 50 - W : ht = T ? 100 + F : F + 1, o.push({
1253
1253
  id: F,
1254
1254
  x: B,
1255
1255
  y: J,
1256
- rotation: dt,
1257
- scale: rt,
1256
+ rotation: lt,
1257
+ scale: st,
1258
1258
  baseSize: K,
1259
- zIndex: ut
1259
+ zIndex: ht
1260
1260
  });
1261
1261
  }
1262
1262
  return o;
@@ -1264,26 +1264,26 @@ class ce {
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 le = Math.PI * (3 - Math.sqrt(5)), he = {
@@ -1294,8 +1294,8 @@ const le = Math.PI * (3 - Math.sqrt(5)), he = {
1294
1294
  startAngle: 0
1295
1295
  };
1296
1296
  class de {
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,37 +1304,37 @@ class de {
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 = { ...he, ...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, f = this.imageConfig.sizing?.variance?.min ?? 1, b = this.imageConfig.sizing?.variance?.max ?? 1, p = f !== 1 || b !== 1, g = this.config.scaleDecay ?? a.scaleDecay, m = s / 2, S = r / 2, v = Math.min(
1307
+ generate(t, i, e = {}) {
1308
+ const o = [], { width: a, height: r } = i, s = { ...he, ...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
1309
  m - h - c / 2,
1310
- S - h - c / 2
1311
- ), w = a.direction === "clockwise" ? -1 : 1;
1312
- for (let E = 0; E < t; E++) {
1313
- let x, A;
1314
- if (a.spiralType === "golden")
1315
- x = E * le * w + a.startAngle, A = this.calculateGoldenRadius(E, t, v, a.tightness);
1316
- else if (a.spiralType === "archimedean") {
1317
- const W = E * 0.5 * a.tightness;
1318
- x = W * w + a.startAngle, A = this.calculateArchimedeanRadius(W, t, v, a.tightness);
1310
+ E - h - c / 2
1311
+ ), w = s.direction === "clockwise" ? -1 : 1;
1312
+ for (let S = 0; S < t; S++) {
1313
+ let x, C;
1314
+ if (s.spiralType === "golden")
1315
+ x = S * le * w + s.startAngle, C = 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, C = this.calculateArchimedeanRadius(G, t, v, s.tightness);
1319
1319
  } else {
1320
- const W = E * 0.3 * a.tightness;
1321
- x = W * w + a.startAngle, A = this.calculateLogarithmicRadius(W, t, v, a.tightness);
1320
+ const G = S * 0.3 * s.tightness;
1321
+ x = G * w + s.startAngle, C = this.calculateLogarithmicRadius(G, t, v, s.tightness);
1322
1322
  }
1323
- const L = m + Math.cos(x) * A, z = S + Math.sin(x) * A, U = A / v, _ = g > 0 ? 1 - U * g * 0.5 : 1, Y = p ? this.random(f, b) : 1, N = _ * Y, C = c * N, j = C * 1.5 / 2, H = C / 2, R = h + j, T = s - h - j, O = h + H, $ = r - h - H, F = Math.max(R, Math.min(L, T)), P = Math.max(O, Math.min(z, $));
1323
+ const L = m + Math.cos(x) * C, z = E + Math.sin(x) * C, U = C / v, _ = f > 0 ? 1 - U * f * 0.5 : 1, Y = b ? this.random(g, p) : 1, N = _ * Y, A = c * N, j = A * 1.5 / 2, H = A / 2, R = h + j, T = a - h - j, D = h + H, O = r - h - H, F = Math.max(R, Math.min(L, T)), P = Math.max(D, Math.min(z, O));
1324
1324
  let M = 0;
1325
- if (u === "random") {
1326
- const W = x * 180 / Math.PI % 360, X = this.random(l, d);
1327
- M = a.spiralType === "golden" ? X : W * 0.1 + X * 0.9;
1328
- } else u === "tangent" && (M = this.calculateSpiralTangent(x, A, a));
1329
- const G = t - E;
1325
+ if (d === "random") {
1326
+ const G = x * 180 / Math.PI % 360, X = this.random(l, u);
1327
+ M = s.spiralType === "golden" ? X : G * 0.1 + X * 0.9;
1328
+ } else d === "tangent" && (M = this.calculateSpiralTangent(x, C, s));
1329
+ const W = t - S;
1330
1330
  o.push({
1331
- id: E,
1331
+ id: S,
1332
1332
  x: F,
1333
1333
  y: P,
1334
1334
  rotation: M,
1335
1335
  scale: N,
1336
- baseSize: C,
1337
- zIndex: G
1336
+ baseSize: A,
1337
+ zIndex: W
1338
1338
  });
1339
1339
  }
1340
1340
  return o;
@@ -1343,16 +1343,16 @@ class de {
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 de {
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 ue = {
@@ -1396,8 +1396,8 @@ const ue = {
1396
1396
  distribution: "gaussian"
1397
1397
  };
1398
1398
  class ge {
1399
- constructor(t, e = {}) {
1400
- this.config = t, this.imageConfig = e;
1399
+ constructor(t, i = {}) {
1400
+ this.config = t, this.imageConfig = i;
1401
1401
  }
1402
1402
  /**
1403
1403
  * Generate cluster layout positions for images
@@ -1406,47 +1406,47 @@ class ge {
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 = { ...ue, ...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, f = this.imageConfig.sizing?.variance?.min ?? 1, b = this.imageConfig.sizing?.variance?.max ?? 1, p = f !== 1 || b !== 1, g = this.calculateClusterCount(
1409
+ generate(t, i, e = {}) {
1410
+ const o = [], { width: a, height: r } = i, s = { ...ue, ...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
1415
+ s.clusterSpacing
1416
1416
  ), m = this.generateClusterCenters(
1417
- g,
1418
- s,
1417
+ f,
1418
+ a,
1419
1419
  r,
1420
1420
  h,
1421
- a
1422
- ), S = new Array(g).fill(0);
1421
+ s
1422
+ ), E = new Array(f).fill(0);
1423
1423
  for (let w = 0; w < t; w++)
1424
- S[w % g]++;
1424
+ E[w % f]++;
1425
1425
  let v = 0;
1426
- for (let w = 0; w < g; w++) {
1427
- const E = m[w], x = S[w];
1428
- for (let A = 0; A < x; A++) {
1426
+ for (let w = 0; w < f; w++) {
1427
+ const S = m[w], x = E[w];
1428
+ for (let C = 0; C < x; C++) {
1429
1429
  let L, z;
1430
- if (a.distribution === "gaussian")
1431
- L = this.gaussianRandom() * E.spread, z = this.gaussianRandom() * E.spread;
1430
+ if (s.distribution === "gaussian")
1431
+ L = this.gaussianRandom() * S.spread, z = this.gaussianRandom() * S.spread;
1432
1432
  else {
1433
- const M = this.random(0, Math.PI * 2), G = this.random(0, E.spread);
1434
- L = Math.cos(M) * G, z = Math.sin(M) * G;
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;
1435
1435
  }
1436
- const U = 1 + a.overlap * 0.5, _ = 1 + a.overlap * 0.3;
1436
+ const U = 1 + s.overlap * 0.5, _ = 1 + s.overlap * 0.3;
1437
1437
  L /= U, z /= U;
1438
- const Y = p ? this.random(f, b) : 1, N = _ * Y, C = c * N;
1439
- let D = E.x + L, j = E.y + z;
1440
- const R = C * 1.5 / 2, T = C / 2;
1441
- D = Math.max(h + R, Math.min(D, s - h - R)), j = Math.max(h + T, Math.min(j, r - h - T));
1442
- const O = u === "random" ? this.random(l, d) : 0, F = Math.sqrt(L * L + z * z) / E.spread, P = Math.round((1 - F) * 50) + 1;
1438
+ const Y = b ? this.random(g, p) : 1, N = _ * Y, A = c * N;
1439
+ let $ = S.x + L, j = S.y + z;
1440
+ const R = A * 1.5 / 2, T = A / 2;
1441
+ $ = Math.max(h + R, Math.min($, a - h - R)), j = Math.max(h + T, Math.min(j, r - h - T));
1442
+ const D = d === "random" ? this.random(l, u) : 0, F = Math.sqrt(L * L + z * z) / S.spread, P = Math.round((1 - F) * 50) + 1;
1443
1443
  o.push({
1444
1444
  id: v,
1445
- x: D,
1445
+ x: $,
1446
1446
  y: j,
1447
- rotation: O,
1447
+ rotation: D,
1448
1448
  scale: N,
1449
- baseSize: C,
1449
+ baseSize: A,
1450
1450
  zIndex: P
1451
1451
  }), v++;
1452
1452
  }
@@ -1456,36 +1456,36 @@ class ge {
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 f = 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
1480
  let m = 1 / 0;
1481
- for (const S of r) {
1482
- const v = g.x - S.x, w = g.y - S.y, E = Math.sqrt(v * v + w * w);
1483
- m = Math.min(m, E);
1481
+ for (const E of r) {
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 || m > b) && (f = g, b = m), m >= s.clusterSpacing)
1485
+ if ((r.length === 0 || m > p) && (g = f, p = m), m >= a.clusterSpacing)
1486
1486
  break;
1487
1487
  }
1488
- f && r.push(f);
1488
+ g && r.push(g);
1489
1489
  }
1490
1490
  return r;
1491
1491
  }
@@ -1500,22 +1500,22 @@ class ge {
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
1516
  class fe {
1517
- constructor(t, e = {}) {
1518
- this.config = t, this.imageConfig = e;
1517
+ constructor(t, i = {}) {
1518
+ this.config = t, this.imageConfig = i;
1519
1519
  }
1520
1520
  /**
1521
1521
  * Generate wave layout positions for images
@@ -1524,25 +1524,25 @@ 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, f = this.imageConfig.sizing?.variance?.max ?? 1, b = d !== 1 || f !== 1, p = i.fixedHeight ?? a, g = {
1529
- ...$t,
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
+ ...Ot,
1530
1530
  ...this.config.wave
1531
- }, { rows: m, amplitude: S, frequency: v, phaseShift: w, synchronization: E } = g, x = Math.ceil(t / m), z = p * 1.5 / 2, U = h + z, _ = s - h - z, Y = _ - U, N = x > 1 ? Y / (x - 1) : 0, C = h + S + p / 2, D = r - h - S - p / 2, j = D - C, H = m > 1 ? j / (m - 1) : 0;
1531
+ }, { rows: m, amplitude: E, frequency: v, phaseShift: w, synchronization: S } = f, x = Math.ceil(t / m), z = b * 1.5 / 2, U = h + z, _ = a - h - z, Y = _ - U, N = x > 1 ? Y / (x - 1) : 0, A = h + E + b / 2, $ = r - h - E - b / 2, j = $ - A, H = m > 1 ? j / (m - 1) : 0;
1532
1532
  let R = 0;
1533
1533
  for (let T = 0; T < m && R < t; T++) {
1534
- const O = m === 1 ? (C + D) / 2 : C + T * H;
1535
- let $ = 0;
1536
- E === "offset" ? $ = T * w : E === "alternating" && ($ = T * Math.PI);
1534
+ const D = m === 1 ? (A + $) / 2 : A + T * H;
1535
+ let O = 0;
1536
+ S === "offset" ? O = T * w : S === "alternating" && (O = T * Math.PI);
1537
1537
  for (let F = 0; F < x && R < t; F++) {
1538
- const P = x === 1 ? (U + _) / 2 : U + F * N, M = this.calculateWaveY(P, s, S, v, $), G = P, W = O + M, X = b ? this.random(d, f) : 1, B = p * X;
1538
+ const P = x === 1 ? (U + _) / 2 : U + F * N, M = this.calculateWaveY(P, a, E, v, O), W = P, G = D + M, X = p ? this.random(u, g) : 1, B = b * X;
1539
1539
  let J = 0;
1540
- c === "tangent" ? J = this.calculateRotation(P, s, S, 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, O) : c === "random" && (J = this.random(d, l));
1541
+ const K = B * 1.5 / 2, at = B / 2, tt = h + K, et = a - h - K, rt = h + at, ct = r - h - at;
1542
1542
  o.push({
1543
1543
  id: R,
1544
- x: Math.max(it, Math.min(G, nt)),
1545
- y: Math.max(lt, Math.min(W, ht)),
1544
+ x: Math.max(tt, Math.min(W, et)),
1545
+ y: Math.max(rt, Math.min(G, ct)),
1546
1546
  rotation: J,
1547
1547
  scale: X,
1548
1548
  baseSize: B,
@@ -1561,9 +1561,9 @@ class fe {
1561
1561
  * @param phase - Phase offset
1562
1562
  * @returns Y displacement from baseline
1563
1563
  */
1564
- calculateWaveY(t, e, i, o, s) {
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 me {
@@ -1621,10 +1621,10 @@ class me {
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 me {
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 me {
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 me {
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 m = Math.sqrt(p / 1.4);
1698
- m *= u, m = Math.min(m, i);
1699
- let S = this.clamp(m, a, h);
1700
- if (S === a && m < a) {
1701
- const v = Math.max(a * 0.05, 20);
1702
- S = Math.max(v, m);
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
- return { height: S };
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
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 It = {
1714
+ const Ct = {
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 It = {
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
+ }, pe = {
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 pe(n) {
1725
- if (n)
1726
- return n in It ? It[n] : n;
1727
- }
1728
1761
  function be(n) {
1729
- return n in ft;
1762
+ if (n)
1763
+ return n in Ct ? Ct[n] : n;
1730
1764
  }
1731
- function ye(n) {
1732
- return n ? be(n) ? ft[n] : n : ft.md;
1765
+ function ye(n, t, i) {
1766
+ const e = pe[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 ve(n) {
1778
+ return n in gt;
1779
+ }
1780
+ function we(n) {
1781
+ return n ? ve(n) ? gt[n] : n : gt.md;
1782
+ }
1783
+ function xe(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 vt(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 = ye(n.shadow));
1764
- const o = ve(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 = pe(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 = we(n.shadow));
1813
+ const r = xe(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 = ye(c.shape, t, i);
1823
+ else {
1824
+ const d = h && c ? c.shape : n.clipPath;
1825
+ s = be(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 Ee(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 Lt(n) {
1834
+ function ut(n, t, i, e) {
1835
+ const o = vt(t, i, e);
1836
+ Ee(n, o);
1837
+ }
1838
+ function zt(n) {
1779
1839
  return n ? Array.isArray(n) ? n.join(" ") : n : "";
1780
1840
  }
1781
- function et(n, t) {
1782
- const e = Lt(t);
1783
- e && e.split(" ").forEach((i) => {
1784
- i.trim() && n.classList.add(i.trim());
1841
+ function nt(n, t) {
1842
+ const i = zt(t);
1843
+ i && i.split(" ").forEach((e) => {
1844
+ e.trim() && n.classList.add(e.trim());
1785
1845
  });
1786
1846
  }
1787
- function zt(n, t) {
1788
- const e = Lt(t);
1789
- e && e.split(" ").forEach((i) => {
1790
- i.trim() && n.classList.remove(i.trim());
1847
+ function ft(n, t) {
1848
+ const i = zt(t);
1849
+ i && i.split(" ").forEach((e) => {
1850
+ e.trim() && n.classList.remove(e.trim());
1791
1851
  });
1792
1852
  }
1793
1853
  const At = {
1794
1854
  UNFOCUSING: 999,
1795
1855
  FOCUSING: 1e3
1796
1856
  };
1797
- class we {
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 Se {
1858
+ constructor(t, i, e) {
1859
+ this.state = I.IDLE, this.currentFocus = null, this.focusData = null, this.outgoing = null, this.incoming = null, this.focusGeneration = 0, this.config = t, this.animationEngine = i, this.styling = e, this.focusedClassName = e?.focused?.className;
1800
1860
  }
1801
1861
  /**
1802
1862
  * Get current state machine state
@@ -1820,20 +1880,20 @@ class we {
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 we {
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,30 @@ class we {
1879
1939
  }
1880
1940
  /**
1881
1941
  * Apply focused styling to an element
1942
+ * Applies non-clip-path styles immediately, clip-path will be updated during animation via startClipPathAnimation
1882
1943
  */
1883
- 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
+ t.style.zIndex = String(i), t.classList.add("fbn-ic-focused"), nt(t, this.focusedClassName);
1885
1946
  }
1886
1947
  /**
1887
1948
  * Remove focused styling from an element
1949
+ * Removes classes and z-index, clip-path will be updated during animation via startClipPathAnimation
1888
1950
  */
1889
- removeFocusedStyling(t, e) {
1890
- t.style.zIndex = e, t.classList.remove("fbn-ic-focused"), zt(t, this.focusedClassName), tt(t, this.defaultStyles), et(t, this.defaultClassName);
1951
+ removeFocusedStyling(t, i) {
1952
+ t.style.zIndex = i, t.classList.remove("fbn-ic-focused"), ft(t, this.focusedClassName);
1953
+ }
1954
+ /**
1955
+ * Continuously update clip-path during animation based on current element dimensions
1956
+ * This ensures clip-path changes smoothly as width/height animate
1957
+ */
1958
+ startClipPathAnimation(t, i, e) {
1959
+ let o = e ? this.styling?.focused ?? this.styling?.default : this.styling?.default;
1960
+ e && this.styling?.focused && this.styling.focused.clipPath === void 0 && (o = { ...o, clipPath: void 0 });
1961
+ const a = () => {
1962
+ const r = t.offsetHeight, s = t.offsetWidth, h = vt(o, r, s);
1963
+ h.clipPath !== void 0 ? t.style.clipPath = h.clipPath : t.style.clipPath = "unset", h.overflow !== void 0 && (t.style.overflow = h.overflow), i.animation.playState === "running" && requestAnimationFrame(a);
1964
+ };
1965
+ requestAnimationFrame(a);
1891
1966
  }
1892
1967
  /**
1893
1968
  * Start focus animation for an image using dimension-based zoom
@@ -1895,48 +1970,50 @@ class we {
1895
1970
  * @param fromTransform - Optional starting transform (for mid-animation reversals)
1896
1971
  * @param fromDimensions - Optional starting dimensions (for mid-animation reversals)
1897
1972
  */
1898
- startFocusAnimation(t, e, i, o, s) {
1899
- const r = t.style.zIndex || "", a = t.offsetWidth, h = t.offsetHeight, c = this.calculateFocusDimensions(a, h, e), u = this.calculateFocusTransform(e, i);
1900
- this.applyFocusedStyling(t, At.FOCUSING), this.animationEngine.cancelAllAnimations(t);
1901
- const l = o ?? {
1973
+ startFocusAnimation(t, i, e, o, a) {
1974
+ const r = t.style.zIndex || "", s = t.offsetWidth, h = t.offsetHeight, c = this.calculateFocusDimensions(s, h, i), d = this.calculateFocusTransform(i, e);
1975
+ this.animationEngine.cancelAllAnimations(t);
1976
+ const l = this.config.animationDuration ?? 600;
1977
+ this.applyFocusedStyling(t, At.FOCUSING);
1978
+ const u = o ?? {
1902
1979
  x: 0,
1903
1980
  y: 0,
1904
- rotation: i.rotation,
1981
+ rotation: e.rotation,
1905
1982
  scale: 1
1906
1983
  // No scale - using dimensions
1907
- }, d = s?.width ?? a, f = s?.height ?? h, b = this.config.animationDuration ?? 600, p = this.animateWithDimensions(
1984
+ }, g = a?.width ?? s, p = a?.height ?? h, b = this.animateWithDimensions(
1908
1985
  t,
1909
- l,
1910
1986
  u,
1911
1987
  d,
1912
- f,
1988
+ g,
1989
+ p,
1913
1990
  c.width,
1914
1991
  c.height,
1915
- b
1916
- ), g = {
1992
+ l
1993
+ ), f = {
1917
1994
  id: `focus-${Date.now()}`,
1918
1995
  element: t,
1919
- animation: p,
1920
- fromState: l,
1921
- toState: u,
1996
+ animation: b,
1997
+ fromState: u,
1998
+ toState: d,
1922
1999
  startTime: performance.now(),
1923
- duration: b
2000
+ duration: l
1924
2001
  };
1925
2002
  return this.focusData = {
1926
2003
  element: t,
1927
- originalState: i,
1928
- focusTransform: u,
2004
+ originalState: e,
2005
+ focusTransform: d,
1929
2006
  originalZIndex: r,
1930
- originalWidth: a,
2007
+ originalWidth: s,
1931
2008
  originalHeight: h,
1932
2009
  focusWidth: c.width,
1933
2010
  focusHeight: c.height
1934
- }, {
2011
+ }, this.startClipPathAnimation(t, f, !0), {
1935
2012
  element: t,
1936
- originalState: i,
1937
- animationHandle: g,
2013
+ originalState: e,
2014
+ animationHandle: f,
1938
2015
  direction: "in",
1939
- originalWidth: a,
2016
+ originalWidth: s,
1940
2017
  originalHeight: h
1941
2018
  };
1942
2019
  }
@@ -1945,39 +2022,41 @@ class we {
1945
2022
  * Animates back to original dimensions for consistent behavior
1946
2023
  * @param fromDimensions - Optional starting dimensions (for mid-animation reversals)
1947
2024
  */
1948
- startUnfocusAnimation(t, e, i, o) {
2025
+ startUnfocusAnimation(t, i, e, o) {
1949
2026
  t.style.zIndex = String(At.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 = {
2027
+ const a = this.config.animationDuration ?? 600;
2028
+ t.classList.remove("fbn-ic-focused"), ft(t, this.focusedClassName);
2029
+ 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
2030
  x: 0,
1952
2031
  y: 0,
1953
- rotation: e.rotation,
2032
+ rotation: i.rotation,
1954
2033
  scale: 1
1955
2034
  // No scale - using dimensions
1956
- }, c = this.focusData?.originalWidth ?? t.offsetWidth, u = this.focusData?.originalHeight ?? t.offsetHeight, l = this.config.animationDuration ?? 600, d = this.animateWithDimensions(
2035
+ }, d = this.focusData?.originalWidth ?? t.offsetWidth, l = this.focusData?.originalHeight ?? t.offsetHeight, u = this.animateWithDimensions(
1957
2036
  t,
1958
- s,
1959
- h,
1960
2037
  r,
1961
- a,
1962
2038
  c,
1963
- u,
1964
- l
1965
- ), f = {
2039
+ s,
2040
+ h,
2041
+ d,
2042
+ l,
2043
+ a
2044
+ ), g = {
1966
2045
  id: `unfocus-${Date.now()}`,
1967
2046
  element: t,
1968
- animation: d,
1969
- fromState: s,
1970
- toState: h,
2047
+ animation: u,
2048
+ fromState: r,
2049
+ toState: c,
1971
2050
  startTime: performance.now(),
1972
- duration: l
2051
+ duration: a
1973
2052
  };
1974
- return {
2053
+ return this.startClipPathAnimation(t, g, !1), {
1975
2054
  element: t,
1976
- originalState: e,
1977
- animationHandle: f,
2055
+ originalState: i,
2056
+ animationHandle: g,
1978
2057
  direction: "out",
1979
- originalWidth: c,
1980
- originalHeight: u
2058
+ originalWidth: d,
2059
+ originalHeight: l
1981
2060
  };
1982
2061
  }
1983
2062
  /**
@@ -1995,10 +2074,10 @@ class we {
1995
2074
  * Caller is responsible for calling animationEngine.cancelAllAnimations() afterwards.
1996
2075
  */
1997
2076
  captureMidAnimationState(t) {
1998
- const e = getComputedStyle(t), i = new DOMMatrix(e.transform), o = t.offsetWidth, s = t.offsetHeight, r = i.e + o * 0.5, a = i.f + s * 0.5, h = Math.atan2(i.b, i.a) * (180 / Math.PI);
1999
- return t.style.width = `${o}px`, t.style.height = `${s}px`, t.style.transform = `translate(-50%, -50%) translate(${r}px, ${a}px) rotate(${h}deg)`, t.style.transition = "none", {
2000
- transform: { x: r, y: a, rotation: h, scale: 1 },
2001
- dimensions: { width: o, height: s }
2077
+ const 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);
2078
+ return t.style.width = `${o}px`, t.style.height = `${a}px`, t.style.transform = `translate(-50%, -50%) translate(${r}px, ${s}px) rotate(${h}deg)`, t.style.transition = "none", {
2079
+ transform: { x: r, y: s, rotation: h, scale: 1 },
2080
+ dimensions: { width: o, height: a }
2002
2081
  };
2003
2082
  }
2004
2083
  /**
@@ -2013,24 +2092,24 @@ class we {
2013
2092
  /**
2014
2093
  * Reset an element instantly to its original position and dimensions (no animation)
2015
2094
  */
2016
- resetElementInstantly(t, e, i, o, s) {
2095
+ resetElementInstantly(t, i, e, o, a) {
2017
2096
  this.animationEngine.cancelAllAnimations(t);
2018
2097
  const r = ["translate(-50%, -50%)"];
2019
- r.push("translate(0px, 0px)"), r.push(`rotate(${e.rotation}deg)`), t.style.transition = "none", t.style.transform = r.join(" "), o !== void 0 && s !== void 0 && (t.style.width = `${o}px`, t.style.height = `${s}px`), this.removeFocusedStyling(t, i);
2098
+ r.push("translate(0px, 0px)"), r.push(`rotate(${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
2099
  }
2021
2100
  /**
2022
2101
  * Focus (zoom) an image to center of container
2023
2102
  * Implements cross-animation when swapping focus
2024
2103
  */
2025
- async focusImage(t, e, i) {
2104
+ async focusImage(t, i, e) {
2026
2105
  if (this.currentFocus === t && this.state === I.FOCUSED)
2027
2106
  return this.unfocusImage();
2028
2107
  if (this.incoming?.element === t && this.state === I.FOCUSING) {
2029
- const { transform: s, dimensions: r } = this.captureMidAnimationState(t);
2108
+ const { transform: a, dimensions: r } = this.captureMidAnimationState(t);
2030
2109
  this.animationEngine.cancelAllAnimations(t), this.outgoing = this.startUnfocusAnimation(
2031
2110
  t,
2032
2111
  this.incoming.originalState,
2033
- s,
2112
+ a,
2034
2113
  r
2035
2114
  ), this.incoming = null, this.state = I.UNFOCUSING, await this.waitForAnimation(this.outgoing.animationHandle), this.removeFocusedStyling(this.outgoing.element, this.focusData?.originalZIndex || ""), this.outgoing = null, this.currentFocus = null, this.focusData = null, this.state = I.IDLE;
2036
2115
  return;
@@ -2038,14 +2117,14 @@ class we {
2038
2117
  const o = ++this.focusGeneration;
2039
2118
  switch (this.state) {
2040
2119
  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;
2120
+ if (this.state = I.FOCUSING, this.incoming = this.startFocusAnimation(t, i, e), await this.waitForAnimation(this.incoming.animationHandle), this.focusGeneration !== o) return;
2042
2121
  this.currentFocus = t, this.incoming = null, this.state = I.FOCUSED;
2043
2122
  break;
2044
2123
  case I.FOCUSED:
2045
2124
  if (this.state = I.CROSS_ANIMATING, this.currentFocus && this.focusData && (this.outgoing = this.startUnfocusAnimation(
2046
2125
  this.currentFocus,
2047
2126
  this.focusData.originalState
2048
- )), this.incoming = this.startFocusAnimation(t, e, i), await Promise.all([
2127
+ )), this.incoming = this.startFocusAnimation(t, i, e), await Promise.all([
2049
2128
  this.outgoing ? this.waitForAnimation(this.outgoing.animationHandle) : Promise.resolve(),
2050
2129
  this.waitForAnimation(this.incoming.animationHandle)
2051
2130
  ]), this.focusGeneration !== o)
@@ -2059,11 +2138,11 @@ class we {
2059
2138
  this.focusData?.originalZIndex || "",
2060
2139
  this.focusData?.originalWidth,
2061
2140
  this.focusData?.originalHeight
2062
- ), this.incoming = null), this.incoming = this.startFocusAnimation(t, e, i), await this.waitForAnimation(this.incoming.animationHandle), this.focusGeneration !== o) return;
2141
+ ), this.incoming = null), this.incoming = this.startFocusAnimation(t, i, e), await this.waitForAnimation(this.incoming.animationHandle), this.focusGeneration !== o) return;
2063
2142
  this.currentFocus = t, this.incoming = null, this.state = I.FOCUSED;
2064
2143
  break;
2065
2144
  case I.UNFOCUSING:
2066
- if (this.state = I.CROSS_ANIMATING, this.incoming = this.startFocusAnimation(t, e, i), await Promise.all([
2145
+ if (this.state = I.CROSS_ANIMATING, this.incoming = this.startFocusAnimation(t, i, e), await Promise.all([
2067
2146
  this.outgoing ? this.waitForAnimation(this.outgoing.animationHandle) : Promise.resolve(),
2068
2147
  this.waitForAnimation(this.incoming.animationHandle)
2069
2148
  ]), this.focusGeneration !== o) return;
@@ -2073,18 +2152,18 @@ class we {
2073
2152
  if (this.incoming?.element === t)
2074
2153
  return;
2075
2154
  if (this.outgoing?.element === t) {
2076
- const { transform: s, dimensions: r } = this.captureMidAnimationState(t);
2155
+ const { transform: a, dimensions: r } = this.captureMidAnimationState(t);
2077
2156
  if (this.animationEngine.cancelAllAnimations(t), this.incoming) {
2078
- const { transform: a, dimensions: h } = this.captureMidAnimationState(this.incoming.element);
2157
+ const { transform: s, dimensions: h } = this.captureMidAnimationState(this.incoming.element);
2079
2158
  this.animationEngine.cancelAllAnimations(this.incoming.element), this.outgoing = this.startUnfocusAnimation(
2080
2159
  this.incoming.element,
2081
2160
  this.incoming.originalState,
2082
- a,
2161
+ s,
2083
2162
  h
2084
2163
  );
2085
2164
  } else
2086
2165
  this.outgoing = null;
2087
- if (this.incoming = this.startFocusAnimation(t, e, i, s, r), await Promise.all([
2166
+ if (this.incoming = this.startFocusAnimation(t, i, e, a, r), await Promise.all([
2088
2167
  this.outgoing ? this.waitForAnimation(this.outgoing.animationHandle) : Promise.resolve(),
2089
2168
  this.waitForAnimation(this.incoming.animationHandle)
2090
2169
  ]), this.focusGeneration !== o) return;
@@ -2098,15 +2177,15 @@ class we {
2098
2177
  this.outgoing.originalWidth,
2099
2178
  this.outgoing.originalHeight
2100
2179
  ), this.outgoing = null), this.incoming) {
2101
- const { transform: s, dimensions: r } = this.captureMidAnimationState(this.incoming.element);
2180
+ const { transform: a, dimensions: r } = this.captureMidAnimationState(this.incoming.element);
2102
2181
  this.animationEngine.cancelAllAnimations(this.incoming.element), this.outgoing = this.startUnfocusAnimation(
2103
2182
  this.incoming.element,
2104
2183
  this.incoming.originalState,
2105
- s,
2184
+ a,
2106
2185
  r
2107
2186
  );
2108
2187
  }
2109
- if (this.incoming = this.startFocusAnimation(t, e, i), await Promise.all([
2188
+ if (this.incoming = this.startFocusAnimation(t, i, e), await Promise.all([
2110
2189
  this.outgoing ? this.waitForAnimation(this.outgoing.animationHandle) : Promise.resolve(),
2111
2190
  this.waitForAnimation(this.incoming.animationHandle)
2112
2191
  ]), this.focusGeneration !== o) return;
@@ -2123,11 +2202,11 @@ class we {
2123
2202
  const t = ++this.focusGeneration;
2124
2203
  if (!this.currentFocus || !this.focusData) {
2125
2204
  if (this.incoming && this.state === I.FOCUSING) {
2126
- const { transform: s, dimensions: r } = this.captureMidAnimationState(this.incoming.element);
2205
+ const { transform: a, dimensions: r } = this.captureMidAnimationState(this.incoming.element);
2127
2206
  if (this.animationEngine.cancelAllAnimations(this.incoming.element), this.outgoing = this.startUnfocusAnimation(
2128
2207
  this.incoming.element,
2129
2208
  this.incoming.originalState,
2130
- s,
2209
+ a,
2131
2210
  r
2132
2211
  ), this.incoming = null, this.state = I.UNFOCUSING, await this.waitForAnimation(this.outgoing.animationHandle), this.focusGeneration !== t) return;
2133
2212
  this.removeFocusedStyling(this.outgoing.element, this.focusData?.originalZIndex || ""), this.outgoing = null, this.focusData = null, this.state = I.IDLE;
@@ -2135,30 +2214,30 @@ class we {
2135
2214
  return;
2136
2215
  }
2137
2216
  if (this.state === I.CROSS_ANIMATING && this.incoming) {
2138
- const { transform: s, dimensions: r } = this.captureMidAnimationState(this.incoming.element);
2217
+ const { transform: a, dimensions: r } = this.captureMidAnimationState(this.incoming.element);
2139
2218
  this.animationEngine.cancelAllAnimations(this.incoming.element);
2140
- const a = this.startUnfocusAnimation(
2219
+ const s = this.startUnfocusAnimation(
2141
2220
  this.incoming.element,
2142
2221
  this.incoming.originalState,
2143
- s,
2222
+ a,
2144
2223
  r
2145
2224
  );
2146
2225
  if (await Promise.all([
2147
2226
  this.outgoing ? this.waitForAnimation(this.outgoing.animationHandle) : Promise.resolve(),
2148
- this.waitForAnimation(a.animationHandle)
2227
+ this.waitForAnimation(s.animationHandle)
2149
2228
  ]), this.focusGeneration !== t) return;
2150
- this.outgoing && this.removeFocusedStyling(this.outgoing.element, this.outgoing.originalState.zIndex?.toString() || ""), this.removeFocusedStyling(a.element, this.incoming.originalState.zIndex?.toString() || ""), this.outgoing = null, this.incoming = null, this.currentFocus = null, this.focusData = null, this.state = I.IDLE;
2229
+ this.outgoing && this.removeFocusedStyling(this.outgoing.element, this.outgoing.originalState.zIndex?.toString() || ""), this.removeFocusedStyling(s.element, this.incoming.originalState.zIndex?.toString() || ""), this.outgoing = null, this.incoming = null, this.currentFocus = null, this.focusData = null, this.state = I.IDLE;
2151
2230
  return;
2152
2231
  }
2153
2232
  this.state = I.UNFOCUSING;
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);
2233
+ const i = this.currentFocus, e = this.focusData.originalState, o = this.focusData.originalZIndex;
2234
+ 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 = I.IDLE);
2156
2235
  }
2157
2236
  /**
2158
2237
  * Swap focus from current image to a new one (alias for focusImage with cross-animation)
2159
2238
  */
2160
- async swapFocus(t, e, i) {
2161
- return this.focusImage(t, e, i);
2239
+ async swapFocus(t, i, e) {
2240
+ return this.focusImage(t, i, e);
2162
2241
  }
2163
2242
  /**
2164
2243
  * Get currently focused image element
@@ -2192,22 +2271,22 @@ class we {
2192
2271
  */
2193
2272
  setDragOffset(t) {
2194
2273
  if (!this.currentFocus || !this.focusData || this.state !== I.FOCUSED) return;
2195
- const e = this.currentFocus, i = this.focusData.focusTransform, o = ["translate(-50%, -50%)"], s = (i.x ?? 0) + t, r = i.y ?? 0;
2196
- o.push(`translate(${s}px, ${r}px)`), i.rotation !== void 0 && o.push(`rotate(${i.rotation}deg)`), e.style.transition = "none", e.style.transform = o.join(" ");
2274
+ const i = this.currentFocus, e = this.focusData.focusTransform, o = ["translate(-50%, -50%)"], a = (e.x ?? 0) + t, r = e.y ?? 0;
2275
+ 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
2276
  }
2198
2277
  /**
2199
2278
  * Clear the drag offset, optionally animating back to center
2200
2279
  * @param animate - If true, animate back to center; if false, snap instantly
2201
2280
  * @param duration - Animation duration in ms (default 150)
2202
2281
  */
2203
- clearDragOffset(t, e = 150) {
2282
+ clearDragOffset(t, i = 150) {
2204
2283
  if (!this.currentFocus || !this.focusData || this.state !== I.FOCUSED) return;
2205
- const i = this.currentFocus, o = this.focusData.focusTransform, s = ["translate(-50%, -50%)"], r = o.x ?? 0, a = o.y ?? 0;
2206
- s.push(`translate(${r}px, ${a}px)`), o.rotation !== void 0 && s.push(`rotate(${o.rotation}deg)`);
2207
- const h = s.join(" ");
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);
2284
+ const e = this.currentFocus, o = this.focusData.focusTransform, a = ["translate(-50%, -50%)"], r = o.x ?? 0, s = o.y ?? 0;
2285
+ a.push(`translate(${r}px, ${s}px)`), o.rotation !== void 0 && a.push(`rotate(${o.rotation}deg)`);
2286
+ const h = a.join(" ");
2287
+ t ? (e.style.transition = `transform ${i}ms ease-out`, e.style.transform = h, setTimeout(() => {
2288
+ this.currentFocus === e && (e.style.transition = "none");
2289
+ }, i)) : (e.style.transition = "none", e.style.transform = h);
2211
2290
  }
2212
2291
  /**
2213
2292
  * Reset zoom state (cancels all animations)
@@ -2234,9 +2313,9 @@ class we {
2234
2313
  ), this.state = I.IDLE, this.currentFocus = null, this.focusData = null, this.outgoing = null, this.incoming = null;
2235
2314
  }
2236
2315
  }
2237
- const xe = 50, Se = 0.5, Ee = 20, Ie = 0.3, Ae = 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);
2316
+ const Ie = 50, Ce = 0.5, Ae = 20, Te = 0.3, Re = 150, Me = 30, ot = class ot {
2317
+ constructor(t, i) {
2318
+ 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
2319
  }
2241
2320
  /**
2242
2321
  * Start listening for touch events
@@ -2261,48 +2340,48 @@ const xe = 50, Se = 0.5, Ee = 20, Ie = 0.3, Ae = 150, Ce = 30, at = class at {
2261
2340
  * Used to prevent click-outside from unfocusing immediately after touch
2262
2341
  */
2263
2342
  hadRecentTouch() {
2264
- return Date.now() - this.recentTouchTimestamp < at.TOUCH_CLICK_DELAY;
2343
+ return Date.now() - this.recentTouchTimestamp < ot.TOUCH_CLICK_DELAY;
2265
2344
  }
2266
2345
  handleTouchStart(t) {
2267
2346
  if (t.touches.length !== 1) return;
2268
2347
  this.recentTouchTimestamp = Date.now();
2269
- const e = t.touches[0];
2348
+ const i = t.touches[0];
2270
2349
  this.touchState = {
2271
- startX: e.clientX,
2272
- startY: e.clientY,
2350
+ startX: i.clientX,
2351
+ startY: i.clientY,
2273
2352
  startTime: performance.now(),
2274
- currentX: e.clientX,
2353
+ currentX: i.clientX,
2275
2354
  isDragging: !1,
2276
2355
  isHorizontalSwipe: null
2277
2356
  };
2278
2357
  }
2279
2358
  handleTouchMove(t) {
2280
2359
  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;
2360
+ const i = t.touches[0], e = i.clientX - this.touchState.startX, o = i.clientY - this.touchState.startY;
2361
+ if (this.touchState.isHorizontalSwipe === null && Math.sqrt(e * e + o * o) > 10) {
2362
+ const s = Math.atan2(Math.abs(o), Math.abs(e)) * (180 / Math.PI);
2363
+ this.touchState.isHorizontalSwipe = s <= Me;
2285
2364
  }
2286
2365
  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 * Ie;
2289
- this.callbacks.onDragOffset(s);
2366
+ t.preventDefault(), this.touchState.isDragging = !0, this.touchState.currentX = i.clientX;
2367
+ const a = e * Te;
2368
+ this.callbacks.onDragOffset(a);
2290
2369
  }
2291
2370
  }
2292
2371
  handleTouchEnd(t) {
2293
2372
  if (!this.touchState) return;
2294
2373
  this.recentTouchTimestamp = Date.now();
2295
- const e = this.touchState.currentX - this.touchState.startX, i = performance.now() - this.touchState.startTime, o = Math.abs(e) / i, s = Math.abs(e);
2374
+ const i = this.touchState.currentX - this.touchState.startX, e = performance.now() - this.touchState.startTime, o = Math.abs(i) / e, a = Math.abs(i);
2296
2375
  let r = !1;
2297
- this.touchState.isHorizontalSwipe === !0 && this.touchState.isDragging && (s >= xe || o >= Se && s >= Ee) && (r = !0, e < 0 ? this.callbacks.onNext() : this.callbacks.onPrev()), this.touchState.isDragging && this.callbacks.onDragEnd(r), this.touchState = null;
2376
+ this.touchState.isHorizontalSwipe === !0 && this.touchState.isDragging && (a >= Ie || o >= Ce && a >= Ae) && (r = !0, i < 0 ? this.callbacks.onNext() : this.callbacks.onPrev()), this.touchState.isDragging && this.callbacks.onDragEnd(r), this.touchState = null;
2298
2377
  }
2299
2378
  handleTouchCancel(t) {
2300
2379
  this.touchState?.isDragging && this.callbacks.onDragEnd(!1), this.touchState = null;
2301
2380
  }
2302
2381
  };
2303
- at.TOUCH_CLICK_DELAY = 300;
2304
- let mt = at;
2305
- class Te {
2382
+ ot.TOUCH_CLICK_DELAY = 300;
2383
+ let mt = ot;
2384
+ class Le {
2306
2385
  constructor(t) {
2307
2386
  if (this._prepared = !1, this._discoveredUrls = [], this.apiKey = t.apiKey ?? "", this.apiEndpoint = t.apiEndpoint ?? "https://www.googleapis.com/drive/v3/files", this.debugLogging = t.debugLogging ?? !1, this.sources = t.sources ?? [], !this.sources || this.sources.length === 0)
2308
2387
  throw new Error("GoogleDriveLoader requires at least one source to be configured");
@@ -2313,15 +2392,15 @@ class Te {
2313
2392
  */
2314
2393
  async prepare(t) {
2315
2394
  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);
2395
+ for (const i of this.sources)
2396
+ if ("folders" in i)
2397
+ for (const e of i.folders) {
2398
+ const o = i.recursive !== void 0 ? i.recursive : !0, a = await this.loadFromFolder(e, t, o);
2399
+ this._discoveredUrls.push(...a);
2321
2400
  }
2322
- else if ("files" in e) {
2323
- const i = await this.loadFiles(e.files, t);
2324
- this._discoveredUrls.push(...i);
2401
+ else if ("files" in i) {
2402
+ const e = await this.loadFiles(i.files, t);
2403
+ this._discoveredUrls.push(...e);
2325
2404
  }
2326
2405
  this._prepared = !0;
2327
2406
  }
@@ -2355,14 +2434,14 @@ class Te {
2355
2434
  * @returns Folder ID or null if invalid
2356
2435
  */
2357
2436
  extractFolderId(t) {
2358
- const e = [
2437
+ const i = [
2359
2438
  /\/folders\/([a-zA-Z0-9_-]+)/,
2360
2439
  // Standard format
2361
2440
  /id=([a-zA-Z0-9_-]+)/
2362
2441
  // Alternative format
2363
2442
  ];
2364
- for (const i of e) {
2365
- const o = t.match(i);
2443
+ for (const e of i) {
2444
+ const o = t.match(e);
2366
2445
  if (o && o[1])
2367
2446
  return o[1];
2368
2447
  }
@@ -2375,16 +2454,16 @@ class Te {
2375
2454
  * @param recursive - Whether to include images from subfolders
2376
2455
  * @returns Promise resolving to array of image URLs
2377
2456
  */
2378
- async loadFromFolder(t, e, i = !0) {
2457
+ async loadFromFolder(t, i, e = !0) {
2379
2458
  const o = this.extractFolderId(t);
2380
2459
  if (!o)
2381
2460
  throw new Error("Invalid Google Drive folder URL. Please check the URL format.");
2382
2461
  if (!this.apiKey || this.apiKey === "YOUR_API_KEY_HERE")
2383
- return this.loadImagesDirectly(o, e);
2462
+ return this.loadImagesDirectly(o, i);
2384
2463
  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);
2464
+ return e ? await this.loadImagesRecursively(o, i) : await this.loadImagesFromSingleFolder(o, i);
2465
+ } catch (a) {
2466
+ return console.error("Error loading from Google Drive API:", a), this.loadImagesDirectly(o, i);
2388
2467
  }
2389
2468
  }
2390
2469
  /**
@@ -2393,16 +2472,16 @@ class Te {
2393
2472
  * @param filter - Filter to apply to discovered images
2394
2473
  * @returns Promise resolving to array of image URLs
2395
2474
  */
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)
2475
+ async loadImagesFromSingleFolder(t, i) {
2476
+ 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);
2477
+ if (!s.ok)
2478
+ throw new Error(`API request failed: ${s.status} ${s.statusText}`);
2479
+ const c = (await s.json()).files.filter(
2480
+ (d) => d.mimeType.startsWith("image/") && i.isAllowed(d.name)
2402
2481
  );
2403
- return this.log(`Found ${c.length} images in folder ${t} (non-recursive)`), c.forEach((u) => {
2404
- i.push(`https://lh3.googleusercontent.com/d/${u.id}=s1600`), this.log(`Added file: ${u.name}`);
2405
- }), i;
2482
+ return this.log(`Found ${c.length} images in folder ${t} (non-recursive)`), c.forEach((d) => {
2483
+ e.push(`https://lh3.googleusercontent.com/d/${d.id}=s1600`), this.log(`Added file: ${d.name}`);
2484
+ }), e;
2406
2485
  }
2407
2486
  /**
2408
2487
  * Load specific files by their URLs or IDs
@@ -2410,29 +2489,29 @@ class Te {
2410
2489
  * @param filter - Filter to apply to discovered images
2411
2490
  * @returns Promise resolving to array of image URLs
2412
2491
  */
2413
- async loadFiles(t, e) {
2414
- const i = [];
2492
+ async loadFiles(t, i) {
2493
+ const e = [];
2415
2494
  for (const o of t) {
2416
- const s = this.extractFileId(o);
2417
- if (!s) {
2495
+ const a = this.extractFileId(o);
2496
+ if (!a) {
2418
2497
  this.log(`Skipping invalid file URL: ${o}`);
2419
2498
  continue;
2420
2499
  }
2421
2500
  if (this.apiKey && this.apiKey !== "YOUR_API_KEY_HERE")
2422
2501
  try {
2423
- const r = `${this.apiEndpoint}/${s}?fields=name,mimeType&key=${this.apiKey}`, a = await fetch(r);
2424
- if (a.ok) {
2425
- const h = await a.json();
2426
- h.mimeType.startsWith("image/") && e.isAllowed(h.name) ? (i.push(`https://lh3.googleusercontent.com/d/${s}=s1600`), this.log(`Added file: ${h.name}`)) : this.log(`Skipping non-image file: ${h.name} (${h.mimeType})`);
2502
+ const r = `${this.apiEndpoint}/${a}?fields=name,mimeType&key=${this.apiKey}`, s = await fetch(r);
2503
+ if (s.ok) {
2504
+ const h = await s.json();
2505
+ h.mimeType.startsWith("image/") && 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
2506
  } else
2428
- this.log(`Failed to fetch metadata for file ${s}: ${a.status}`);
2507
+ this.log(`Failed to fetch metadata for file ${a}: ${s.status}`);
2429
2508
  } catch (r) {
2430
- this.log(`Error fetching metadata for file ${s}:`, r);
2509
+ this.log(`Error fetching metadata for file ${a}:`, r);
2431
2510
  }
2432
2511
  else
2433
- i.push(`https://lh3.googleusercontent.com/d/${s}=s1600`);
2512
+ e.push(`https://lh3.googleusercontent.com/d/${a}=s1600`);
2434
2513
  }
2435
- return i;
2514
+ return e;
2436
2515
  }
2437
2516
  /**
2438
2517
  * Extract file ID from Google Drive file URL
@@ -2442,7 +2521,7 @@ class Te {
2442
2521
  extractFileId(t) {
2443
2522
  if (!/[/:.]/.test(t))
2444
2523
  return t;
2445
- const e = [
2524
+ const i = [
2446
2525
  /\/file\/d\/([a-zA-Z0-9_-]+)/,
2447
2526
  // Standard file format
2448
2527
  /\/open\?id=([a-zA-Z0-9_-]+)/,
@@ -2450,8 +2529,8 @@ class Te {
2450
2529
  /id=([a-zA-Z0-9_-]+)/
2451
2530
  // Generic id parameter
2452
2531
  ];
2453
- for (const i of e) {
2454
- const o = t.match(i);
2532
+ for (const e of i) {
2533
+ const o = t.match(e);
2455
2534
  if (o && o[1])
2456
2535
  return o[1];
2457
2536
  }
@@ -2463,24 +2542,24 @@ class Te {
2463
2542
  * @param filter - Filter to apply to discovered images
2464
2543
  * @returns Promise resolving to array of image URLs
2465
2544
  */
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(
2545
+ async loadImagesRecursively(t, i) {
2546
+ 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);
2547
+ if (!s.ok)
2548
+ throw new Error(`API request failed: ${s.status} ${s.statusText}`);
2549
+ const h = await s.json(), c = h.files.filter(
2550
+ (l) => l.mimeType.startsWith("image/") && i.isAllowed(l.name)
2551
+ ), d = h.files.filter(
2473
2552
  (l) => l.mimeType === "application/vnd.google-apps.folder"
2474
2553
  );
2475
- this.log(`Found ${h.files.length} total items in folder ${t}`), h.files.forEach((l) => this.log(` - File: ${l.name} (${l.mimeType})`)), this.log(`- ${c.length} valid files (images only)`), this.log(`- ${u.length} subfolders`), c.forEach((l) => {
2476
- i.push(`https://lh3.googleusercontent.com/d/${l.id}=s1600`), this.log(`Added file: ${l.name}`);
2554
+ this.log(`Found ${h.files.length} total items in folder ${t}`), h.files.forEach((l) => this.log(` - File: ${l.name} (${l.mimeType})`)), this.log(`- ${c.length} valid files (images only)`), this.log(`- ${d.length} subfolders`), c.forEach((l) => {
2555
+ e.push(`https://lh3.googleusercontent.com/d/${l.id}=s1600`), this.log(`Added file: ${l.name}`);
2477
2556
  });
2478
- for (const l of u) {
2557
+ for (const l of d) {
2479
2558
  this.log(`Loading images from subfolder: ${l.name}`);
2480
- const d = await this.loadImagesRecursively(l.id, e);
2481
- i.push(...d);
2559
+ const u = await this.loadImagesRecursively(l.id, i);
2560
+ e.push(...u);
2482
2561
  }
2483
- return i;
2562
+ return e;
2484
2563
  }
2485
2564
  /**
2486
2565
  * Direct loading method (no API key required, but less reliable)
@@ -2489,17 +2568,17 @@ class Te {
2489
2568
  * @param filter - Filter to apply (not used in fallback mode)
2490
2569
  * @returns Promise resolving to array of image URLs
2491
2570
  */
2492
- async loadImagesDirectly(t, e) {
2571
+ async loadImagesDirectly(t, i) {
2493
2572
  try {
2494
- const i = `https://drive.google.com/embeddedfolderview?id=${t}`, o = await fetch(i, { mode: "cors" });
2573
+ const e = `https://drive.google.com/embeddedfolderview?id=${t}`, o = await fetch(e, { mode: "cors" });
2495
2574
  if (!o.ok)
2496
2575
  throw new Error("Cannot access folder directly (CORS or permissions issue)");
2497
- const s = await o.text(), r = /\/file\/d\/([a-zA-Z0-9_-]+)/g, a = [...s.matchAll(r)];
2498
- return [...new Set(a.map((u) => u[1]))].map(
2499
- (u) => `https://drive.google.com/uc?export=view&id=${u}`
2576
+ const a = await o.text(), r = /\/file\/d\/([a-zA-Z0-9_-]+)/g, s = [...a.matchAll(r)];
2577
+ return [...new Set(s.map((d) => d[1]))].map(
2578
+ (d) => `https://drive.google.com/uc?export=view&id=${d}`
2500
2579
  );
2501
- } catch (i) {
2502
- throw console.error("Direct loading failed:", i), new Error(
2580
+ } catch (e) {
2581
+ throw console.error("Direct loading failed:", e), new Error(
2503
2582
  `Unable to load images. Please ensure:
2504
2583
  1. The folder is shared publicly (Anyone with the link can view)
2505
2584
  2. The folder contains image files
@@ -2513,7 +2592,7 @@ class Te {
2513
2592
  * @returns Array of direct image URLs
2514
2593
  */
2515
2594
  manualImageUrls(t) {
2516
- return t.map((e) => `https://drive.google.com/uc?export=view&id=${e}`);
2595
+ return t.map((i) => `https://drive.google.com/uc?export=view&id=${i}`);
2517
2596
  }
2518
2597
  /**
2519
2598
  * Debug logging helper
@@ -2523,7 +2602,7 @@ class Te {
2523
2602
  this.debugLogging && typeof console < "u" && console.log(...t);
2524
2603
  }
2525
2604
  }
2526
- class Re {
2605
+ class ze {
2527
2606
  constructor(t) {
2528
2607
  if (this._prepared = !1, this._discoveredUrls = [], this.validateUrls = t.validateUrls !== !1, this.validationTimeout = t.validationTimeout ?? 5e3, this.validationMethod = t.validationMethod ?? "head", this.debugLogging = t.debugLogging ?? !1, this.sources = t.sources ?? [], !this.sources || this.sources.length === 0)
2529
2608
  throw new Error("StaticImageLoader requires at least one source to be configured");
@@ -2535,12 +2614,12 @@ class Re {
2535
2614
  */
2536
2615
  async prepare(t) {
2537
2616
  this._discoveredUrls = [], this.log(`Processing ${this.sources.length} source(s)`);
2538
- for (const e of this.sources)
2617
+ for (const i of this.sources)
2539
2618
  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);
2619
+ const e = await this.processSource(i, t);
2620
+ this._discoveredUrls.push(...e);
2621
+ } catch (e) {
2622
+ console.warn("Failed to process source:", i, e);
2544
2623
  }
2545
2624
  this._prepared = !0, this.log(`Successfully loaded ${this._discoveredUrls.length} image(s)`);
2546
2625
  }
@@ -2574,8 +2653,8 @@ class Re {
2574
2653
  * @param filter - Filter to apply to discovered images
2575
2654
  * @returns Promise resolving to array of valid URLs from this source
2576
2655
  */
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), []);
2656
+ async processSource(t, i) {
2657
+ 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
2658
  }
2580
2659
  /**
2581
2660
  * Process a list of direct URLs
@@ -2583,19 +2662,19 @@ class Re {
2583
2662
  * @param filter - Filter to apply to discovered images
2584
2663
  * @returns Promise resolving to array of validated URLs
2585
2664
  */
2586
- async processUrls(t, e) {
2665
+ async processUrls(t, i) {
2587
2666
  if (!Array.isArray(t))
2588
2667
  return console.warn("URLs must be an array:", t), [];
2589
- const i = [];
2668
+ const e = [];
2590
2669
  for (const o of t) {
2591
- const s = o.split("/").pop() || o;
2592
- if (!e.isAllowed(s)) {
2670
+ const a = o.split("/").pop() || o;
2671
+ if (!i.isAllowed(a)) {
2593
2672
  this.log(`Skipping filtered URL: ${o}`);
2594
2673
  continue;
2595
2674
  }
2596
- this.validateUrls ? await this.validateUrl(o) ? i.push(o) : console.warn(`Skipping invalid/missing URL: ${o}`) : i.push(o);
2675
+ this.validateUrls ? await this.validateUrl(o) ? e.push(o) : console.warn(`Skipping invalid/missing URL: ${o}`) : e.push(o);
2597
2676
  }
2598
- return i;
2677
+ return e;
2599
2678
  }
2600
2679
  /**
2601
2680
  * Process a path-based source
@@ -2604,16 +2683,16 @@ class Re {
2604
2683
  * @param filter - Filter to apply to discovered images
2605
2684
  * @returns Promise resolving to array of validated URLs
2606
2685
  */
2607
- async processPath(t, e, i) {
2608
- if (!Array.isArray(e))
2609
- return console.warn("files must be an array:", e), [];
2686
+ async processPath(t, i, e) {
2687
+ if (!Array.isArray(i))
2688
+ return console.warn("files must be an array:", i), [];
2610
2689
  const o = [];
2611
- for (const s of e) {
2612
- if (!i.isAllowed(s)) {
2613
- this.log(`Skipping filtered file: ${s}`);
2690
+ for (const a of i) {
2691
+ if (!e.isAllowed(a)) {
2692
+ this.log(`Skipping filtered file: ${a}`);
2614
2693
  continue;
2615
2694
  }
2616
- const r = this.constructUrl(t, s);
2695
+ const r = this.constructUrl(t, a);
2617
2696
  this.validateUrls ? await this.validateUrl(r) ? o.push(r) : console.warn(`Skipping invalid/missing file: ${r}`) : o.push(r);
2618
2697
  }
2619
2698
  return o;
@@ -2625,19 +2704,19 @@ class Re {
2625
2704
  * @param filter - Filter to apply to discovered images
2626
2705
  * @returns Promise resolving to array of validated URLs
2627
2706
  */
2628
- async processJson(t, e) {
2707
+ async processJson(t, i) {
2629
2708
  this.log(`Fetching JSON endpoint: ${t}`);
2630
- const i = new AbortController(), o = setTimeout(() => i.abort(), 1e4);
2709
+ const e = new AbortController(), o = setTimeout(() => e.abort(), 1e4);
2631
2710
  try {
2632
- const s = await fetch(t, { signal: i.signal });
2633
- if (clearTimeout(o), !s.ok)
2634
- throw new Error(`HTTP ${s.status} fetching ${t}`);
2635
- const r = await s.json();
2711
+ const a = await fetch(t, { signal: e.signal });
2712
+ if (clearTimeout(o), !a.ok)
2713
+ throw new Error(`HTTP ${a.status} fetching ${t}`);
2714
+ const r = await a.json();
2636
2715
  if (!r || !Array.isArray(r.images))
2637
2716
  throw new Error('JSON source must return JSON with shape { "images": ["url1", "url2", ...] }');
2638
- 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;
2717
+ return this.log(`JSON endpoint returned ${r.images.length} image(s)`), await this.processUrls(r.images, i);
2718
+ } catch (a) {
2719
+ throw clearTimeout(o), a instanceof Error && a.name === "AbortError" ? new Error(`Timeout fetching JSON endpoint: ${t}`) : a;
2641
2720
  }
2642
2721
  }
2643
2722
  /**
@@ -2659,13 +2738,13 @@ class Re {
2659
2738
  if (!(t.startsWith(window.location.origin) || t.startsWith("/")))
2660
2739
  return this.log(`Skipping validation for cross-origin URL: ${t}`), !0;
2661
2740
  try {
2662
- const i = new AbortController(), o = setTimeout(() => i.abort(), this.validationTimeout), s = await fetch(t, {
2741
+ const e = new AbortController(), o = setTimeout(() => e.abort(), this.validationTimeout), a = await fetch(t, {
2663
2742
  method: "HEAD",
2664
- signal: i.signal
2743
+ signal: e.signal
2665
2744
  });
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;
2745
+ return clearTimeout(o), a.ok ? !0 : (this.log(`Validation failed for ${t}: HTTP ${a.status}`), !1);
2746
+ } catch (e) {
2747
+ return e instanceof Error && (e.name === "AbortError" ? this.log(`Validation timeout for ${t}`) : this.log(`Validation failed for ${t}:`, e.message)), !1;
2669
2748
  }
2670
2749
  }
2671
2750
  /**
@@ -2674,14 +2753,14 @@ class Re {
2674
2753
  * @param filename - Filename to append
2675
2754
  * @returns Complete URL
2676
2755
  */
2677
- constructUrl(t, e) {
2678
- const i = t.replace(/\/$/, "");
2756
+ constructUrl(t, i) {
2757
+ const e = t.replace(/\/$/, "");
2679
2758
  if (this.isAbsoluteUrl(t))
2680
- return `${i}/${e}`;
2759
+ return `${e}/${i}`;
2681
2760
  if (typeof window > "u")
2682
- return `${i}/${e}`;
2761
+ return `${e}/${i}`;
2683
2762
  const o = window.location.origin, r = (t.startsWith("/") ? t : "/" + t).replace(/\/$/, "");
2684
- return `${o}${r}/${e}`;
2763
+ return `${o}${r}/${i}`;
2685
2764
  }
2686
2765
  /**
2687
2766
  * Check if URL is absolute (contains protocol)
@@ -2703,7 +2782,7 @@ class Re {
2703
2782
  this.debugLogging && typeof console < "u" && console.log(...t);
2704
2783
  }
2705
2784
  }
2706
- class Me {
2785
+ class Fe {
2707
2786
  constructor(t) {
2708
2787
  if (this._prepared = !1, this._discoveredUrls = [], this.loaders = t.loaders, this.debugLogging = t.debugLogging ?? !1, !this.loaders || this.loaders.length === 0)
2709
2788
  throw new Error("CompositeLoader requires at least one loader to be configured");
@@ -2715,15 +2794,15 @@ class Me {
2715
2794
  */
2716
2795
  async prepare(t) {
2717
2796
  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);
2797
+ const i = this.loaders.map((e, o) => e.prepare(t).then(() => {
2798
+ this.log(`Loader ${o} prepared with ${e.imagesLength()} images`);
2799
+ }).catch((a) => {
2800
+ console.warn(`Loader ${o} failed to prepare:`, a);
2722
2801
  }));
2723
- await Promise.all(e);
2724
- for (const i of this.loaders)
2725
- if (i.isPrepared()) {
2726
- const o = i.imageURLs();
2802
+ await Promise.all(i);
2803
+ for (const e of this.loaders)
2804
+ if (e.isPrepared()) {
2805
+ const o = e.imageURLs();
2727
2806
  this._discoveredUrls.push(...o);
2728
2807
  }
2729
2808
  this._prepared = !0, this.log(`CompositeLoader prepared with ${this._discoveredUrls.length} total images`);
@@ -2760,7 +2839,7 @@ class Me {
2760
2839
  this.debugLogging && typeof console < "u" && console.log("[CompositeLoader]", ...t);
2761
2840
  }
2762
2841
  }
2763
- class Le {
2842
+ class $e {
2764
2843
  /**
2765
2844
  * Create a new ImageFilter
2766
2845
  * @param extensions - Array of allowed file extensions (without dots)
@@ -2782,8 +2861,8 @@ class Le {
2782
2861
  * @returns True if the file extension is allowed
2783
2862
  */
2784
2863
  isAllowed(t) {
2785
- const i = t.split("?")[0].split(".").pop()?.toLowerCase();
2786
- return i ? this.allowedExtensions.includes(i) : !1;
2864
+ const e = t.split("?")[0].split(".").pop()?.toLowerCase();
2865
+ return e ? this.allowedExtensions.includes(e) : !1;
2787
2866
  }
2788
2867
  /**
2789
2868
  * Get the list of allowed extensions
@@ -2797,7 +2876,7 @@ class Le {
2797
2876
  // isAllowedDate(date: Date): boolean
2798
2877
  // isAllowedDimensions(width: number, height: number): boolean
2799
2878
  }
2800
- const ze = `
2879
+ const De = `
2801
2880
  .fbn-ic-gallery {
2802
2881
  position: relative;
2803
2882
  width: 100%;
@@ -2847,22 +2926,22 @@ const ze = `
2847
2926
  display: none !important;
2848
2927
  }
2849
2928
  `;
2850
- function Fe() {
2929
+ function Oe() {
2851
2930
  if (typeof document > "u") return;
2852
2931
  const n = "fbn-ic-functional-styles";
2853
2932
  if (document.getElementById(n)) return;
2854
2933
  const t = document.createElement("style");
2855
- t.id = n, t.textContent = ze, document.head.appendChild(t);
2934
+ t.id = n, t.textContent = De, document.head.appendChild(t);
2856
2935
  }
2857
- class De {
2936
+ class Pe {
2858
2937
  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 Xt(this.fullConfig.animation), this.layoutEngine = new me({
2938
+ this.fullConfig = Wt(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 me({
2860
2939
  layout: this.fullConfig.layout,
2861
2940
  image: this.fullConfig.image
2862
- }), this.zoomEngine = new we(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;
2941
+ }), this.zoomEngine = new Se(this.fullConfig.interaction.focus, this.animationEngine, this.fullConfig.styling), this.defaultStyles = vt(this.fullConfig.styling?.default), this.defaultClassName = this.fullConfig.styling?.default?.className, this.hoverClassName = this.fullConfig.styling?.hover?.className;
2942
+ const i = this.fullConfig.animation.entry || y.animation.entry;
2864
2943
  this.entryAnimationEngine = new oe(
2865
- e,
2944
+ i,
2866
2945
  this.fullConfig.layout.algorithm
2867
2946
  ), this.swipeEngine = null, this.imageFilter = this.createImageFilter(), this.imageLoader = this.createLoader(), this.containerEl = null, this.loadingEl = null, this.errorEl = null;
2868
2947
  }
@@ -2871,43 +2950,43 @@ class De {
2871
2950
  */
2872
2951
  createImageFilter() {
2873
2952
  const t = this.fullConfig.config.loaders?.allowedExtensions;
2874
- return new Le(t);
2953
+ return new $e(t);
2875
2954
  }
2876
2955
  /**
2877
2956
  * Create appropriate image loader based on config
2878
2957
  * Processes loaders array, merges shared config, wraps in CompositeLoader if needed
2879
2958
  */
2880
2959
  createLoader() {
2881
- const t = this.fullConfig.loaders, e = this.fullConfig.config.loaders ?? {};
2960
+ const t = this.fullConfig.loaders, i = this.fullConfig.config.loaders ?? {};
2882
2961
  if (!t || t.length === 0)
2883
2962
  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 Me({
2886
- loaders: i,
2963
+ const e = t.map((o) => this.createLoaderFromEntry(o, i));
2964
+ return e.length === 1 ? e[0] : new Fe({
2965
+ loaders: e,
2887
2966
  debugLogging: this.fullConfig.config.debug?.loaders
2888
2967
  });
2889
2968
  }
2890
2969
  /**
2891
2970
  * Create a single loader from a LoaderEntry, merging shared config
2892
2971
  */
2893
- createLoaderFromEntry(t, e) {
2972
+ createLoaderFromEntry(t, i) {
2894
2973
  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
2974
+ const e = t.static, o = {
2975
+ ...e,
2976
+ validateUrls: e.validateUrls ?? i.validateUrls,
2977
+ validationTimeout: e.validationTimeout ?? i.validationTimeout,
2978
+ validationMethod: e.validationMethod ?? i.validationMethod,
2979
+ allowedExtensions: e.allowedExtensions ?? i.allowedExtensions,
2980
+ debugLogging: e.debugLogging ?? this.fullConfig.config.debug?.loaders
2902
2981
  };
2903
- return new Re(o);
2982
+ return new ze(o);
2904
2983
  } 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
2984
+ const e = t.googleDrive, o = {
2985
+ ...e,
2986
+ allowedExtensions: e.allowedExtensions ?? i.allowedExtensions,
2987
+ debugLogging: e.debugLogging ?? this.fullConfig.config.debug?.loaders
2909
2988
  };
2910
- return new Te(o);
2989
+ return new Le(o);
2911
2990
  } else
2912
2991
  throw new Error(`Unknown loader entry: ${JSON.stringify(t)}`);
2913
2992
  }
@@ -2916,7 +2995,7 @@ class De {
2916
2995
  */
2917
2996
  async init() {
2918
2997
  try {
2919
- if (Fe(), this.containerRef)
2998
+ if (Oe(), this.containerRef)
2920
2999
  this.containerEl = this.containerRef;
2921
3000
  else if (this.containerEl = document.getElementById(this.containerId), !this.containerEl)
2922
3001
  throw new Error(`Container #${this.containerId} not found`);
@@ -2925,7 +3004,7 @@ class De {
2925
3004
  onPrev: () => this.navigateToPreviousImage(),
2926
3005
  onDragOffset: (t) => this.zoomEngine.setDragOffset(t),
2927
3006
  onDragEnd: (t) => {
2928
- t ? this.zoomEngine.clearDragOffset(!1) : this.zoomEngine.clearDragOffset(!0, Ae);
3007
+ t ? this.zoomEngine.clearDragOffset(!1) : this.zoomEngine.clearDragOffset(!0, Re);
2929
3008
  }
2930
3009
  }), this.setupUI(), this.setupEventListeners(), this.logDebug("ImageCloud initialized"), await this.loadImages();
2931
3010
  } catch (t) {
@@ -2942,10 +3021,10 @@ class De {
2942
3021
  createDefaultLoadingElement() {
2943
3022
  const t = document.createElement("div");
2944
3023
  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;
3024
+ const i = document.createElement("div");
3025
+ i.className = "fbn-ic-spinner", t.appendChild(i);
3026
+ const e = document.createElement("p");
3027
+ return e.textContent = "Loading images...", t.appendChild(e), this.containerEl.appendChild(t), t;
2949
3028
  }
2950
3029
  createDefaultErrorElement() {
2951
3030
  const t = document.createElement("div");
@@ -2967,24 +3046,24 @@ class De {
2967
3046
  */
2968
3047
  navigateToNextImage() {
2969
3048
  if (this.currentFocusIndex === null || this.imageElements.length === 0) return;
2970
- const t = (this.currentFocusIndex + 1) % this.imageLayouts.length, e = this.imageElements.find(
3049
+ const t = (this.currentFocusIndex + 1) % this.imageLayouts.length, i = this.imageElements.find(
2971
3050
  (o) => o.dataset.imageId === String(t)
2972
3051
  );
2973
- if (!e) return;
2974
- const i = this.imageLayouts[t];
2975
- i && (this.currentFocusIndex = t, this.handleImageClick(e, i), this.updateCounter(t));
3052
+ if (!i) return;
3053
+ const e = this.imageLayouts[t];
3054
+ e && (this.currentFocusIndex = t, this.handleImageClick(i, e), this.updateCounter(t));
2976
3055
  }
2977
3056
  /**
2978
3057
  * Navigate to the previous image (Left arrow)
2979
3058
  */
2980
3059
  navigateToPreviousImage() {
2981
3060
  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(
3061
+ const t = (this.currentFocusIndex - 1 + this.imageLayouts.length) % this.imageLayouts.length, i = this.imageElements.find(
2983
3062
  (o) => o.dataset.imageId === String(t)
2984
3063
  );
2985
- if (!e) return;
2986
- const i = this.imageLayouts[t];
2987
- i && (this.currentFocusIndex = t, this.handleImageClick(e, i), this.updateCounter(t));
3064
+ if (!i) return;
3065
+ const e = this.imageLayouts[t];
3066
+ e && (this.currentFocusIndex = t, this.handleImageClick(i, e), this.updateCounter(t));
2988
3067
  }
2989
3068
  /**
2990
3069
  * Navigate to a specific image by index
@@ -2996,8 +3075,8 @@ class De {
2996
3075
  }, 500));
2997
3076
  }
2998
3077
  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);
3078
+ const t = window.innerWidth, i = this.fullConfig.layout.responsive, o = this.fullConfig.image.sizing?.maxSize ?? 400;
3079
+ 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
3080
  }
3002
3081
  /**
3003
3082
  * Get container bounds for layout calculations
@@ -3015,20 +3094,20 @@ class De {
3015
3094
  try {
3016
3095
  this.showLoading(!0), this.hideError(), this.clearImageCloud(), await this.imageLoader.prepare(this.imageFilter);
3017
3096
  const t = this.imageLoader.imagesLength();
3018
- let e = this.imageLoader.imageURLs();
3097
+ let i = this.imageLoader.imageURLs();
3019
3098
  if (t === 0) {
3020
3099
  this.showError("No images found."), this.showLoading(!1);
3021
3100
  return;
3022
3101
  }
3023
- const i = this.getContainerBounds(), o = this.getImageHeight(), s = window.innerWidth;
3024
- this.logDebug(`Adaptive sizing input: container=${i.width}x${i.height}px, images=${t}, responsiveMax=${o}px`);
3102
+ const e = this.getContainerBounds(), o = this.getImageHeight(), a = window.innerWidth;
3103
+ this.logDebug(`Adaptive sizing input: container=${e.width}x${e.height}px, images=${t}, responsiveMax=${o}px`);
3025
3104
  const r = this.layoutEngine.calculateAdaptiveSize(
3026
- i,
3105
+ e,
3027
3106
  t,
3028
3107
  o,
3029
- s
3108
+ a
3030
3109
  );
3031
- this.logDebug(`Adaptive sizing result: height=${r.height}px`), await this.createImageCloud(e, r.height), this.showLoading(!1), this.imagesLoaded = !0;
3110
+ this.logDebug(`Adaptive sizing result: height=${r.height}px`), await this.createImageCloud(i, r.height), this.showLoading(!1), this.imagesLoaded = !0;
3032
3111
  } catch (t) {
3033
3112
  console.error("Error loading images:", t), t instanceof Error && this.showError(t.message || "Failed to load images."), this.showLoading(!1);
3034
3113
  }
@@ -3039,45 +3118,45 @@ class De {
3039
3118
  logDebug(...t) {
3040
3119
  this.fullConfig.config.debug?.enabled && typeof console < "u" && console.log(...t);
3041
3120
  }
3042
- async createImageCloud(t, e) {
3121
+ async createImageCloud(t, i) {
3043
3122
  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 = [];
3123
+ const e = this.getContainerBounds();
3124
+ this.currentImageHeight = i;
3125
+ const o = this.loadGeneration, a = this.layoutEngine.generateLayout(t.length, e, { fixedHeight: i });
3126
+ this.imageLayouts = a, this.displayQueue = [];
3048
3127
  let r = 0;
3049
- const a = (c) => {
3128
+ const s = (c) => {
3050
3129
  this.containerEl && (this.containerEl.appendChild(c), this.imageElements.push(c), requestAnimationFrame(() => {
3051
3130
  if (c.offsetWidth, c.style.opacity = this.defaultStyles.opacity ?? "1", c.dataset.startX && (this.entryAnimationEngine.requiresJSAnimation() || this.entryAnimationEngine.requiresJSRotation() || this.entryAnimationEngine.requiresJSScale() || c.dataset.startRotation !== c.dataset.rotation || c.dataset.startScale !== c.dataset.scale)) {
3052
- const d = {
3131
+ const u = {
3053
3132
  x: parseFloat(c.dataset.startX),
3054
3133
  y: parseFloat(c.dataset.startY)
3055
- }, f = {
3134
+ }, g = {
3056
3135
  x: parseFloat(c.dataset.endX),
3057
3136
  y: parseFloat(c.dataset.endY)
3058
- }, b = parseFloat(c.dataset.imageWidth), p = parseFloat(c.dataset.imageHeight), g = parseFloat(c.dataset.rotation), m = parseFloat(c.dataset.scale), S = c.dataset.startRotation ? parseFloat(c.dataset.startRotation) : g, v = c.dataset.startScale ? parseFloat(c.dataset.startScale) : m, w = this.entryAnimationEngine.getTiming();
3137
+ }, p = parseFloat(c.dataset.imageWidth), b = parseFloat(c.dataset.imageHeight), f = parseFloat(c.dataset.rotation), m = parseFloat(c.dataset.scale), E = c.dataset.startRotation ? parseFloat(c.dataset.startRotation) : f, v = c.dataset.startScale ? parseFloat(c.dataset.startScale) : m, w = this.entryAnimationEngine.getTiming();
3059
3138
  ee({
3060
3139
  element: c,
3061
- startPosition: d,
3062
- endPosition: f,
3140
+ startPosition: u,
3141
+ endPosition: g,
3063
3142
  pathConfig: this.entryAnimationEngine.getPathConfig(),
3064
3143
  duration: w.duration,
3065
- imageWidth: b,
3066
- imageHeight: p,
3067
- rotation: g,
3144
+ imageWidth: p,
3145
+ imageHeight: b,
3146
+ rotation: f,
3068
3147
  scale: m,
3069
3148
  rotationConfig: this.entryAnimationEngine.getRotationConfig(),
3070
- startRotation: S,
3149
+ startRotation: E,
3071
3150
  scaleConfig: this.entryAnimationEngine.getScaleConfig(),
3072
3151
  startScale: v
3073
3152
  });
3074
3153
  } else {
3075
- const d = c.dataset.finalTransform || "";
3076
- c.style.transform = d;
3154
+ const u = c.dataset.finalTransform || "";
3155
+ c.style.transform = u;
3077
3156
  }
3078
3157
  const l = parseInt(c.dataset.imageId || "0");
3079
3158
  if (this.fullConfig.config.debug?.enabled && l < 3) {
3080
- const d = c.dataset.finalTransform || "";
3159
+ const u = c.dataset.finalTransform || "";
3081
3160
  console.log(`Image ${l} final state:`, {
3082
3161
  left: c.style.left,
3083
3162
  top: c.style.top,
@@ -3085,7 +3164,7 @@ class De {
3085
3164
  height: c.style.height,
3086
3165
  computedWidth: c.offsetWidth,
3087
3166
  computedHeight: c.offsetHeight,
3088
- transform: d,
3167
+ transform: u,
3089
3168
  pathType: this.entryAnimationEngine.getPathType()
3090
3169
  });
3091
3170
  }
@@ -3094,7 +3173,7 @@ class De {
3094
3173
  if (this.logDebug("Starting queue processing, enabled:", this.fullConfig.animation.queue.enabled), !this.fullConfig.animation.queue.enabled) {
3095
3174
  for (; this.displayQueue.length > 0; ) {
3096
3175
  const c = this.displayQueue.shift();
3097
- c && a(c);
3176
+ c && s(c);
3098
3177
  }
3099
3178
  return;
3100
3179
  }
@@ -3105,84 +3184,90 @@ class De {
3105
3184
  }
3106
3185
  if (this.displayQueue.length > 0) {
3107
3186
  const c = this.displayQueue.shift();
3108
- c && a(c);
3187
+ c && s(c);
3109
3188
  }
3110
3189
  r >= t.length && this.displayQueue.length === 0 && this.queueInterval !== null && (clearInterval(this.queueInterval), this.queueInterval = null);
3111
3190
  }, this.fullConfig.animation.queue.interval);
3112
3191
  };
3113
3192
  if ("IntersectionObserver" in window && this.containerEl) {
3114
- const c = new IntersectionObserver((u) => {
3115
- u.forEach((l) => {
3193
+ const c = new IntersectionObserver((d) => {
3194
+ d.forEach((l) => {
3116
3195
  l.isIntersecting && (h(), c.disconnect());
3117
3196
  });
3118
3197
  }, { threshold: 0.1, rootMargin: "50px" });
3119
3198
  c.observe(this.containerEl);
3120
3199
  } else
3121
3200
  h();
3122
- this.fullConfig.config.debug?.centers && this.containerEl && (this.containerEl.querySelectorAll(".fbn-ic-debug-center").forEach((c) => c.remove()), s.forEach((c, u) => {
3201
+ this.fullConfig.config.debug?.centers && this.containerEl && (this.containerEl.querySelectorAll(".fbn-ic-debug-center").forEach((c) => c.remove()), a.forEach((c, d) => {
3123
3202
  const l = document.createElement("div");
3124
3203
  l.className = "fbn-ic-debug-center", l.style.position = "absolute", l.style.width = "12px", l.style.height = "12px", l.style.borderRadius = "50%", l.style.backgroundColor = "red", l.style.border = "2px solid yellow", l.style.zIndex = "9999", l.style.pointerEvents = "none";
3125
- const d = c.x, f = c.y;
3126
- l.style.left = `${d - 6}px`, l.style.top = `${f - 6}px`, l.title = `Image ${u}: center (${Math.round(d)}, ${Math.round(f)})`, this.containerEl.appendChild(l);
3127
- })), t.forEach((c, u) => {
3204
+ const u = c.x, g = c.y;
3205
+ l.style.left = `${u - 6}px`, l.style.top = `${g - 6}px`, l.title = `Image ${d}: center (${Math.round(u)}, ${Math.round(g)})`, this.containerEl.appendChild(l);
3206
+ })), t.forEach((c, d) => {
3128
3207
  const l = document.createElement("img");
3129
- l.referrerPolicy = "no-referrer", l.classList.add("fbn-ic-image"), l.dataset.imageId = String(u);
3130
- const d = s[u];
3131
- l.style.position = "absolute", l.style.width = "auto", l.style.height = `${e}px`, l.style.left = `${d.x}px`, l.style.top = `${d.y}px`, d.zIndex && (l.style.zIndex = String(d.zIndex)), tt(l, this.defaultStyles), et(l, this.defaultClassName), l.addEventListener("mouseenter", () => {
3132
- this.hoveredImage = { element: l, layout: d }, this.zoomEngine.isInvolved(l) || (tt(l, this.hoverStyles), et(l, this.hoverClassName));
3208
+ l.referrerPolicy = "no-referrer", l.classList.add("fbn-ic-image"), l.dataset.imageId = String(d), l.dataset.createdFlag = "true";
3209
+ const u = a[d];
3210
+ l.style.position = "absolute", l.style.width = "auto", l.style.height = `${i}px`, l.style.left = `${u.x}px`, l.style.top = `${u.y}px`, u.zIndex && (l.style.zIndex = String(u.zIndex)), nt(l, this.defaultClassName), l.addEventListener("mouseenter", () => {
3211
+ if (this.hoveredImage = { element: l, layout: u }, !this.zoomEngine.isInvolved(l)) {
3212
+ const g = l.cachedRenderedWidth;
3213
+ ut(l, this.fullConfig.styling?.hover, i, g), nt(l, this.hoverClassName);
3214
+ }
3133
3215
  }), l.addEventListener("mouseleave", () => {
3134
- this.hoveredImage = null, this.zoomEngine.isInvolved(l) || (tt(l, this.defaultStyles), zt(l, this.hoverClassName), et(l, this.defaultClassName));
3135
- }), l.addEventListener("click", (f) => {
3136
- f.stopPropagation(), this.handleImageClick(l, d);
3216
+ if (this.hoveredImage = null, !this.zoomEngine.isInvolved(l)) {
3217
+ const g = l.cachedRenderedWidth;
3218
+ ut(l, this.fullConfig.styling?.default, i, g), ft(l, this.hoverClassName), nt(l, this.defaultClassName);
3219
+ }
3220
+ }), l.addEventListener("click", (g) => {
3221
+ g.stopPropagation(), this.handleImageClick(l, u);
3137
3222
  }), l.style.opacity = "0", l.style.transition = this.entryAnimationEngine.getTransitionCSS(), l.onload = () => {
3138
3223
  if (o !== this.loadGeneration)
3139
3224
  return;
3140
- const f = l.naturalWidth / l.naturalHeight, b = e * f;
3141
- l.style.width = `${b}px`;
3142
- const p = { x: d.x, y: d.y }, g = { width: b, height: e }, m = this.entryAnimationEngine.calculateStartPosition(
3143
- p,
3144
- g,
3145
- i,
3146
- u,
3147
- t.length
3148
- ), S = this.entryAnimationEngine.calculateStartRotation(d.rotation), v = this.entryAnimationEngine.calculateStartScale(d.scale), w = this.entryAnimationEngine.buildFinalTransform(
3149
- d.rotation,
3150
- d.scale,
3225
+ const g = l.naturalWidth / l.naturalHeight, p = i * g;
3226
+ 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, ut(l, this.fullConfig.styling?.default, i, p);
3227
+ const b = { x: u.x, y: u.y }, f = { width: p, height: i }, m = this.entryAnimationEngine.calculateStartPosition(
3151
3228
  b,
3152
- e
3153
- ), E = this.entryAnimationEngine.buildStartTransform(
3154
- m,
3229
+ f,
3230
+ e,
3231
+ d,
3232
+ t.length
3233
+ ), E = this.entryAnimationEngine.calculateStartRotation(u.rotation), v = this.entryAnimationEngine.calculateStartScale(u.scale), w = this.entryAnimationEngine.buildFinalTransform(
3234
+ u.rotation,
3235
+ u.scale,
3155
3236
  p,
3156
- d.rotation,
3157
- d.scale,
3237
+ i
3238
+ ), S = this.entryAnimationEngine.buildStartTransform(
3239
+ m,
3158
3240
  b,
3159
- e,
3160
- S,
3241
+ u.rotation,
3242
+ u.scale,
3243
+ p,
3244
+ i,
3245
+ E,
3161
3246
  v
3162
3247
  );
3163
- this.fullConfig.config.debug?.enabled && u < 3 && console.log(`Image ${u}:`, {
3164
- finalPosition: p,
3165
- imageSize: g,
3166
- left: d.x,
3167
- top: d.y,
3248
+ this.fullConfig.config.debug?.enabled && d < 3 && console.log(`Image ${d}:`, {
3249
+ finalPosition: b,
3250
+ imageSize: f,
3251
+ left: u.x,
3252
+ top: u.y,
3168
3253
  finalTransform: w,
3169
- renderedWidth: b,
3170
- renderedHeight: e
3171
- }), l.style.transform = E, l.dataset.finalTransform = w, (this.entryAnimationEngine.requiresJSAnimation() || this.entryAnimationEngine.requiresJSRotation() || this.entryAnimationEngine.requiresJSScale() || S !== d.rotation || v !== d.scale) && (l.dataset.startX = String(m.x), l.dataset.startY = String(m.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(S), l.dataset.startScale = String(v)), this.displayQueue.push(l);
3254
+ renderedWidth: p,
3255
+ renderedHeight: i
3256
+ }), l.style.transform = S, l.dataset.finalTransform = w, (this.entryAnimationEngine.requiresJSAnimation() || this.entryAnimationEngine.requiresJSRotation() || this.entryAnimationEngine.requiresJSScale() || E !== u.rotation || v !== u.scale) && (l.dataset.startX = String(m.x), l.dataset.startY = String(m.y), l.dataset.endX = String(b.x), l.dataset.endY = String(b.y), l.dataset.imageWidth = String(p), l.dataset.imageHeight = String(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
3257
  }, l.onerror = () => r++, l.src = c;
3173
3258
  });
3174
3259
  }
3175
- async handleImageClick(t, e) {
3260
+ async handleImageClick(t, i) {
3176
3261
  if (!this.containerEl) return;
3177
- const i = this.zoomEngine.isFocused(t), o = {
3262
+ const e = this.zoomEngine.isFocused(t), o = {
3178
3263
  width: this.containerEl.offsetWidth,
3179
3264
  height: this.containerEl.offsetHeight
3180
3265
  };
3181
- if (i)
3266
+ if (e)
3182
3267
  await this.zoomEngine.unfocusImage(), this.currentFocusIndex = null, this.swipeEngine?.disable(), this.hideCounter();
3183
3268
  else {
3184
- const s = t.dataset.imageId;
3185
- this.currentFocusIndex = s !== void 0 ? parseInt(s, 10) : null, this.swipeEngine?.enable(), await this.zoomEngine.focusImage(t, o, e), this.currentFocusIndex !== null && this.updateCounter(this.currentFocusIndex);
3269
+ const a = t.dataset.imageId;
3270
+ this.currentFocusIndex = a !== void 0 ? parseInt(a, 10) : null, this.swipeEngine?.enable(), await this.zoomEngine.focusImage(t, o, i), this.currentFocusIndex !== null && this.updateCounter(this.currentFocusIndex);
3186
3271
  }
3187
3272
  }
3188
3273
  /**
@@ -3213,55 +3298,55 @@ class De {
3213
3298
  this.clearImageCloud(), this.loadingElAutoCreated && this.loadingEl && (this.loadingEl.remove(), this.loadingEl = null), this.errorElAutoCreated && this.errorEl && (this.errorEl.remove(), this.errorEl = null), this.counterElAutoCreated && this.counterEl && (this.counterEl.remove(), this.counterEl = null), this.resizeTimeout !== null && clearTimeout(this.resizeTimeout), this.swipeEngine?.destroy();
3214
3299
  }
3215
3300
  }
3216
- function Oe() {
3301
+ function Ue() {
3217
3302
  if (typeof document > "u") return;
3218
3303
  const n = "fbn-ic-styles";
3219
3304
  if (document.getElementById(n)) return;
3220
3305
  const t = document.createElement("style");
3221
- t.id = n, t.textContent = Ot, document.head.appendChild(t);
3306
+ t.id = n, t.textContent = Dt, document.head.appendChild(t);
3222
3307
  }
3223
- Oe();
3224
- function $e() {
3308
+ Ue();
3309
+ function _e() {
3225
3310
  if (typeof document > "u") {
3226
3311
  console.warn("ImageCloud: Document not available (not in browser environment)");
3227
3312
  return;
3228
3313
  }
3229
3314
  const n = () => {
3230
3315
  const t = document.querySelectorAll("[data-image-cloud], [data-image-gallery]");
3231
- t.length !== 0 && t.forEach((e) => {
3232
- const i = e;
3233
- if (!i.id) {
3316
+ t.length !== 0 && t.forEach((i) => {
3317
+ const e = i;
3318
+ if (!e.id) {
3234
3319
  console.error("ImageCloud: Container with data-image-cloud must have an id attribute");
3235
3320
  return;
3236
3321
  }
3237
- const o = i.dataset.config || i.dataset.galleryConfig;
3238
- let s;
3322
+ const o = e.dataset.config || e.dataset.galleryConfig;
3323
+ let a;
3239
3324
  if (o)
3240
3325
  try {
3241
- const a = JSON.parse(o);
3242
- s = {
3243
- container: i.id,
3244
- ...a
3326
+ const s = JSON.parse(o);
3327
+ a = {
3328
+ container: e.id,
3329
+ ...s
3245
3330
  };
3246
- } catch (a) {
3247
- console.error(`ImageCloud: Failed to parse configuration JSON for #${i.id}:`, a);
3331
+ } catch (s) {
3332
+ console.error(`ImageCloud: Failed to parse configuration JSON for #${e.id}:`, s);
3248
3333
  return;
3249
3334
  }
3250
3335
  else {
3251
- console.error(`ImageCloud: Missing configuration for #${i.id}. Add data-config='{...}' attribute.`);
3336
+ console.error(`ImageCloud: Missing configuration for #${e.id}. Add data-config='{...}' attribute.`);
3252
3337
  return;
3253
3338
  }
3254
- new De(s).init().catch((a) => {
3255
- console.error("ImageCloud initialization failed:", a);
3339
+ new Pe(a).init().catch((s) => {
3340
+ console.error("ImageCloud initialization failed:", s);
3256
3341
  });
3257
3342
  });
3258
3343
  };
3259
3344
  document.readyState === "loading" ? document.addEventListener("DOMContentLoaded", n) : n();
3260
3345
  }
3261
- $e();
3346
+ _e();
3262
3347
  export {
3263
- De as ImageCloud,
3264
- De as ImageGallery,
3265
- $e as autoInitialize
3348
+ Pe as ImageCloud,
3349
+ Pe as ImageGallery,
3350
+ _e as autoInitialize
3266
3351
  };
3267
3352
  //# sourceMappingURL=image-cloud-auto-init.js.map