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