@flexilla/alpine-dropdown 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -25,19 +25,19 @@ module.exports = __toCommonJS(module_exports);
25
25
 
26
26
  // ../../node_modules/@flexilla/dropdown/dist/dropdown.js
27
27
  var B = Object.defineProperty;
28
- var j = (n, e, t) => e in n ? B(n, e, { enumerable: true, configurable: true, writable: true, value: t }) : n[e] = t;
29
- var a = (n, e, t) => j(n, typeof e != "symbol" ? e + "" : e, t);
30
- var G = Object.defineProperty;
31
- var q = (n, e, t) => e in n ? G(n, e, { enumerable: true, configurable: true, writable: true, value: t }) : n[e] = t;
32
- var d = (n, e, t) => q(n, typeof e != "symbol" ? e + "" : e, t);
28
+ var j = (i, e, t) => e in i ? B(i, e, { enumerable: true, configurable: true, writable: true, value: t }) : i[e] = t;
29
+ var a = (i, e, t) => j(i, typeof e != "symbol" ? e + "" : e, t);
30
+ var q = Object.defineProperty;
31
+ var G = (i, e, t) => e in i ? q(i, e, { enumerable: true, configurable: true, writable: true, value: t }) : i[e] = t;
32
+ var p = (i, e, t) => G(i, typeof e != "symbol" ? e + "" : e, t);
33
33
  var V = "bottom";
34
- var X = ({ reference: n, popper: e }) => {
35
- if (!n || !e)
34
+ var X = ({ reference: i, popper: e }) => {
35
+ if (!i || !e)
36
36
  throw new Error("Reference or popper element is null or undefined");
37
- const t = /* @__PURE__ */ new WeakMap(), i = (r) => (t.has(r) || t.set(r, r.getBoundingClientRect()), t.get(r)), o = i(e), s = i(n);
37
+ const t = /* @__PURE__ */ new WeakMap(), n = (o) => (t.has(o) || t.set(o, o.getBoundingClientRect()), t.get(o)), r = n(e), s = n(i);
38
38
  return {
39
- popperHeight: o.height,
40
- popperWidth: o.width,
39
+ popperHeight: r.height,
40
+ popperWidth: r.width,
41
41
  refHeight: s.height,
42
42
  refWidth: s.width,
43
43
  refLeft: s.left,
@@ -45,49 +45,49 @@ var X = ({ reference: n, popper: e }) => {
45
45
  refRight: s.right
46
46
  };
47
47
  };
48
- var Y = (n, e, t, i) => {
49
- const o = t, s = i - (t + e);
50
- return o >= (n - e) / 2 && s >= (n - e) / 2;
48
+ var Y = (i, e, t, n) => {
49
+ const r = t, s = n - (t + e);
50
+ return r >= (i - e) / 2 && s >= (i - e) / 2;
51
51
  };
52
- var J = (n, e, t, i) => (n - e) / 2 <= t && t + n / 2 + e / 2 <= i;
53
- var Q = (n, e, t, i, o) => t > o - i ? e() ? window.innerHeight - o : t - o : n() ? 0 : t + i;
54
- var Z = (n, e, t, i) => n <= i && t - n <= e;
55
- var _ = (n, e, t, i) => t <= i && -n <= e;
56
- var ee = (n, e, t, i, o, s) => {
57
- const r = o - t - s, l = t - i, m = t + s - i + (o - t - s), c = r >= 0 ? o - i : l >= 0 ? t - i : t;
58
- return n() ? 0 : e() ? m : c;
52
+ var J = (i, e, t, n) => (i - e) / 2 <= t && t + i / 2 + e / 2 <= n;
53
+ var Q = (i, e, t, n, r) => t > r - n ? e() ? window.innerHeight - r : t - r : i() ? 0 : t + n;
54
+ var Z = (i, e, t, n) => i <= n && t - i <= e;
55
+ var _ = (i, e, t, n) => t <= n && -i <= e;
56
+ var ee = (i, e, t, n, r, s) => {
57
+ const o = r - t - s, l = t - n, m = t + s - n + (r - t - s), c = o >= 0 ? r - n : l >= 0 ? t - n : t;
58
+ return i() ? 0 : e() ? m : c;
59
59
  };
60
- var te = (n, e, t, i) => n <= t && e - n - i >= n;
61
- var ne = (n, e) => n >= e;
60
+ var te = (i, e, t, n) => i <= t && e - i - n >= i;
61
+ var ne = (i, e) => i >= e;
62
62
  var ie = ({
63
- placement: n,
63
+ placement: i,
64
64
  refWidth: e,
65
65
  refTop: t,
66
- refLeft: i,
67
- refHeight: o,
66
+ refLeft: n,
67
+ refHeight: r,
68
68
  popperWidth: s,
69
- popperHeight: r,
69
+ popperHeight: o,
70
70
  windowHeight: l,
71
71
  windowWidth: m,
72
72
  offsetDistance: c
73
73
  }) => {
74
- const p = m - i - e, g = i, E = l - t - o, f = t, w = () => Q(
75
- () => _(t, o, r, l),
76
- () => Z(t, o, r, l),
74
+ const d = m - n - e, f = n, E = l - t - r, g = t, w = () => Q(
75
+ () => _(t, r, o, l),
76
+ () => Z(t, r, o, l),
77
77
  t,
78
- o,
79
- r
78
+ r,
79
+ o
80
80
  ), b = () => ee(
81
- () => te(i, m, s, e),
82
- () => ne(i, s),
83
- i,
81
+ () => te(n, m, s, e),
82
+ () => ne(n, s),
83
+ n,
84
84
  s,
85
85
  m,
86
86
  e
87
- ), M = () => Y(s, e, i, m) ? i + e / 2 - s / 2 : b(), x = () => J(r, o, t, l) ? t + o / 2 - r / 2 : w(), H = () => i + s <= m ? i : b(), S = () => i + e - s >= 0 ? i + e - s : b(), L = () => t + r <= l ? t : w(), U = () => t + o - r >= 0 ? t + o - r : w();
87
+ ), M = () => Y(s, e, n, m) ? n + e / 2 - s / 2 : b(), A = () => J(o, r, t, l) ? t + r / 2 - o / 2 : w(), C = () => n + s <= m ? n : b(), L = () => n + e - s >= 0 ? n + e - s : b(), x = () => t + o <= l ? t : w(), U = () => t + r - o >= 0 ? t + r - o : w();
88
88
  let u = 0, v = 0;
89
- const C = t - r - c, k = t + o + c, I = i - s - c, D = i + e + c, F = f >= r + c, R = E >= r + c, $ = g >= s + c, A = p >= s + c;
90
- switch (n.startsWith("top") ? v = F ? C : R ? k : Math.max(C, k) : n.startsWith("bottom") ? v = R ? k : F ? C : Math.max(k) : n.startsWith("left") ? u = $ ? I : A ? D : Math.max(I, D) : n.startsWith("right") && (u = A ? D : $ ? I : Math.max(D, I)), n) {
89
+ const T = t - o - c, I = t + r + c, D = n - s - c, H = n + e + c, P = g >= o + c, W = E >= o + c, R = f >= s + c, $ = d >= s + c;
90
+ switch (i.startsWith("top") ? v = P ? T : W ? I : Math.max(T, I) : i.startsWith("bottom") ? v = W ? I : P ? T : Math.max(I) : i.startsWith("left") ? u = R ? D : $ ? H : Math.max(D, H) : i.startsWith("right") && (u = $ ? H : R ? D : Math.max(H, D)), i) {
91
91
  case "bottom":
92
92
  case "bottom-middle":
93
93
  case "top":
@@ -98,19 +98,19 @@ var ie = ({
98
98
  case "left-middle":
99
99
  case "right":
100
100
  case "right-middle":
101
- v = x();
101
+ v = A();
102
102
  break;
103
103
  case "bottom-start":
104
104
  case "top-start":
105
- u = H();
105
+ u = C();
106
106
  break;
107
107
  case "bottom-end":
108
108
  case "top-end":
109
- u = S();
109
+ u = L();
110
110
  break;
111
111
  case "left-start":
112
112
  case "right-start":
113
- v = L();
113
+ v = x();
114
114
  break;
115
115
  case "left-end":
116
116
  case "right-end":
@@ -138,61 +138,61 @@ var se = class {
138
138
  * @param {boolean} [options.eventEffect.disableOnScroll] - Disable position updates on scroll
139
139
  * @param {Function} [options.onUpdate] - Callback function when position updates
140
140
  */
141
- constructor(e, t, i = {}) {
142
- d(this, "reference"), d(this, "popper"), d(this, "offsetDistance"), d(this, "placement"), d(this, "disableOnResize"), d(this, "disableOnScroll"), d(this, "onUpdate"), d(this, "isWindowEventsRegistered"), d(this, "validateElements", () => {
141
+ constructor(e, t, n = {}) {
142
+ p(this, "reference"), p(this, "popper"), p(this, "offsetDistance"), p(this, "placement"), p(this, "disableOnResize"), p(this, "disableOnScroll"), p(this, "onUpdate"), p(this, "isWindowEventsRegistered"), p(this, "validateElements", () => {
143
143
  if (!(this.reference instanceof HTMLElement))
144
144
  throw new Error("Invalid HTMLElement for Reference Element");
145
145
  if (!(this.popper instanceof HTMLElement))
146
146
  throw new Error("Invalid HTMLElement for Popper");
147
147
  if (typeof this.offsetDistance != "number")
148
148
  throw new Error("OffsetDistance must be a number");
149
- }), d(this, "setPopperStyleProperty", (p, g) => {
150
- this.popper.style.setProperty("--fx-popper-placement-x", `${p}px`), this.popper.style.setProperty("--fx-popper-placement-y", `${g}px`);
151
- }), d(this, "setInitialStyles", () => {
149
+ }), p(this, "setPopperStyleProperty", (d, f) => {
150
+ this.popper.style.setProperty("--fx-popper-placement-x", `${d}px`), this.popper.style.setProperty("--fx-popper-placement-y", `${f}px`);
151
+ }), p(this, "setInitialStyles", () => {
152
152
  this.popper.style.setProperty("--fx-popper-placement-x", ""), this.popper.style.setProperty("--fx-popper-placement-y", "");
153
- }), d(this, "initPlacement", () => {
154
- var p;
153
+ }), p(this, "initPlacement", () => {
154
+ var d;
155
155
  this.validateElements(), this.setInitialStyles();
156
- const g = window.innerWidth, E = window.innerHeight, { popperHeight: f, popperWidth: w, refHeight: b, refWidth: M, refLeft: x, refTop: H } = X({ reference: this.reference, popper: this.popper }), { x: S, y: L } = ie(
156
+ const f = window.innerWidth, E = window.innerHeight, { popperHeight: g, popperWidth: w, refHeight: b, refWidth: M, refLeft: A, refTop: C } = X({ reference: this.reference, popper: this.popper }), { x: L, y: x } = ie(
157
157
  {
158
158
  placement: this.placement,
159
159
  refWidth: M,
160
- refTop: H,
161
- refLeft: x,
160
+ refTop: C,
161
+ refLeft: A,
162
162
  popperWidth: w,
163
163
  refHeight: b,
164
- popperHeight: f,
164
+ popperHeight: g,
165
165
  windowHeight: E,
166
- windowWidth: g,
166
+ windowWidth: f,
167
167
  offsetDistance: this.offsetDistance
168
168
  }
169
169
  );
170
- this.setPopperStyleProperty(S, L), (p = this.onUpdate) == null || p.call(this, { x: S, y: L, placement: this.placement });
171
- }), d(this, "removeWindowEvents", () => {
170
+ this.setPopperStyleProperty(L, x), (d = this.onUpdate) == null || d.call(this, { x: L, y: x, placement: this.placement });
171
+ }), p(this, "removeWindowEvents", () => {
172
172
  this.isWindowEventsRegistered && (!this.disableOnResize && window.removeEventListener("resize", this.updatePosition), !this.disableOnScroll && window.removeEventListener("scroll", this.updatePosition), this.isWindowEventsRegistered = false);
173
- }), d(this, "attachWindowEvent", () => {
173
+ }), p(this, "attachWindowEvent", () => {
174
174
  this.isWindowEventsRegistered && this.removeWindowEvents(), this.disableOnResize || window.addEventListener("resize", this.updatePosition), this.disableOnScroll || window.addEventListener("scroll", this.updatePosition), this.isWindowEventsRegistered = true;
175
- }), d(this, "resetPosition", () => {
175
+ }), p(this, "resetPosition", () => {
176
176
  this.setInitialStyles();
177
- }), d(this, "updatePosition", () => {
177
+ }), p(this, "updatePosition", () => {
178
178
  this.initPlacement(), this.attachWindowEvent();
179
- }), d(this, "cleanupEvents", () => {
179
+ }), p(this, "cleanupEvents", () => {
180
180
  this.setInitialStyles(), this.removeWindowEvents();
181
181
  });
182
182
  const {
183
- offsetDistance: o = 10,
183
+ offsetDistance: r = 10,
184
184
  placement: s = V,
185
- eventEffect: r = {},
185
+ eventEffect: o = {},
186
186
  onUpdate: l
187
- } = i;
187
+ } = n;
188
188
  if (!(e instanceof HTMLElement))
189
189
  throw new Error("Invalid HTMLElement for Reference Element");
190
190
  if (!(t instanceof HTMLElement))
191
191
  throw new Error("Invalid HTMLElement for Popper");
192
- if (i.offsetDistance && typeof i.offsetDistance != "number")
192
+ if (n.offsetDistance && typeof n.offsetDistance != "number")
193
193
  throw new Error("OffsetDistance must be a number");
194
- const { disableOnResize: m, disableOnScroll: c } = r;
195
- this.isWindowEventsRegistered = false, this.reference = e, this.popper = t, this.offsetDistance = o, this.placement = s, this.disableOnResize = m || false, this.disableOnScroll = c || false, this.onUpdate = l;
194
+ const { disableOnResize: m, disableOnScroll: c } = o;
195
+ this.isWindowEventsRegistered = false, this.reference = e, this.popper = t, this.offsetDistance = r, this.placement = s, this.disableOnResize = m || false, this.disableOnScroll = c || false, this.onUpdate = l;
196
196
  }
197
197
  /**
198
198
  * Updates popper configuration and recalculates position
@@ -205,50 +205,50 @@ var se = class {
205
205
  this.placement = e, this.offsetDistance = t || this.offsetDistance, this.initPlacement(), this.attachWindowEvent();
206
206
  }
207
207
  };
208
- var oe = Object.defineProperty;
209
- var re = (n, e, t) => e in n ? oe(n, e, { enumerable: true, configurable: true, writable: true, value: t }) : n[e] = t;
210
- var h = (n, e, t) => re(n, typeof e != "symbol" ? e + "" : e, t);
211
- var ae = (n, e = document.body) => e.querySelector(n);
212
- var N = (n, e) => {
213
- for (const [t, i] of Object.entries(e))
214
- n.setAttribute(t, i);
208
+ var re = Object.defineProperty;
209
+ var oe = (i, e, t) => e in i ? re(i, e, { enumerable: true, configurable: true, writable: true, value: t }) : i[e] = t;
210
+ var h = (i, e, t) => oe(i, typeof e != "symbol" ? e + "" : e, t);
211
+ var ae = (i, e = document.body) => e.querySelector(i);
212
+ var N = (i, e) => {
213
+ for (const [t, n] of Object.entries(e))
214
+ i.setAttribute(t, n);
215
215
  };
216
216
  var le = ({
217
- element: n,
217
+ element: i,
218
218
  callback: e,
219
219
  type: t,
220
- keysCheck: i
220
+ keysCheck: n
221
221
  }) => {
222
- const o = getComputedStyle(n), s = o.transition;
223
- if (s !== "none" && s !== "" && !i.includes(s)) {
224
- const r = "transitionend", l = () => {
225
- n.removeEventListener(r, l), e();
222
+ const r = getComputedStyle(i), s = r.transition;
223
+ if (s !== "none" && s !== "" && !n.includes(s)) {
224
+ const o = "transitionend", l = () => {
225
+ i.removeEventListener(o, l), e();
226
226
  };
227
- n.addEventListener(r, l, { once: true });
227
+ i.addEventListener(o, l, { once: true });
228
228
  } else
229
229
  e();
230
230
  };
231
231
  var he = ({
232
- element: n,
232
+ element: i,
233
233
  callback: e
234
234
  }) => {
235
235
  le({
236
- element: n,
236
+ element: i,
237
237
  callback: e,
238
238
  type: "transition",
239
239
  keysCheck: ["all 0s ease 0s", "all"]
240
240
  });
241
241
  };
242
- var pe = (n, e, t) => {
243
- const i = new CustomEvent(e, { detail: t });
244
- n.dispatchEvent(i);
242
+ var de = (i, e, t) => {
243
+ const n = new CustomEvent(e, { detail: t });
244
+ i.dispatchEvent(n);
245
245
  };
246
- var y = ({ state: n, trigger: e, popper: t }) => {
247
- const i = n === "open";
246
+ var y = ({ state: i, trigger: e, popper: t }) => {
247
+ const n = i === "open";
248
248
  N(t, {
249
- "data-state": n
249
+ "data-state": i
250
250
  }), N(e, {
251
- "aria-expanded": `${i}`
251
+ "aria-expanded": `${n}`
252
252
  });
253
253
  };
254
254
  var ce = class {
@@ -259,7 +259,7 @@ var ce = class {
259
259
  * @param {string | HTMLElement} params.content - The content element selector or HTMLElement
260
260
  * @param {OverlayOptions} [params.options] - Configuration options for the overlay
261
261
  */
262
- constructor({ trigger: e, content: t, options: i = {} }) {
262
+ constructor({ trigger: e, content: t, options: n = {} }) {
263
263
  h(this, "triggerElement"), h(this, "contentElement"), h(this, "triggerStrategy"), h(this, "placement"), h(this, "offsetDistance"), h(this, "preventFromCloseOutside"), h(this, "preventFromCloseInside"), h(this, "options"), h(this, "defaultState"), h(this, "popper"), h(this, "eventEffect"), h(this, "getElement", (s) => typeof s == "string" ? ae(s) : s instanceof HTMLElement ? s : void 0), h(this, "handleDocumentClick", (s) => {
264
264
  this.contentElement.getAttribute("data-state") === "open" && (!this.triggerElement.contains(s.target) && !this.preventFromCloseInside && !this.preventFromCloseOutside ? this.hide() : !this.triggerElement.contains(s.target) && !this.contentElement.contains(s.target) && !this.preventFromCloseOutside ? this.hide() : !this.triggerElement.contains(s.target) && !this.contentElement.contains(s.target) && !this.preventFromCloseOutside ? this.hide() : !this.triggerElement.contains(s.target) && this.contentElement.contains(s.target) && !this.preventFromCloseInside && this.hide());
265
265
  }), h(this, "handleKeyDown", (s) => {
@@ -278,35 +278,35 @@ var ce = class {
278
278
  this.triggerElement.addEventListener("mouseleave", this.hideOnMouseLeaseTrigger), this.contentElement.addEventListener("mouseleave", this.hideOnMouseLeave);
279
279
  }), h(this, "showOnMouseEnter", () => {
280
280
  this.show(), this.addEventOnMouseEnter();
281
- }), h(this, "setShowOptions", ({ placement: s, offsetDistance: r }) => {
282
- var l, m, c, p;
281
+ }), h(this, "setShowOptions", ({ placement: s, offsetDistance: o }) => {
282
+ var l, m, c, d;
283
283
  this.popper.setOptions({
284
284
  placement: s,
285
- offsetDistance: r
285
+ offsetDistance: o
286
286
  }), document.addEventListener("keydown", this.handleKeyDown), document.addEventListener("click", this.handleDocumentClick), (m = (l = this.options).beforeShow) == null || m.call(l), y({
287
287
  state: "open",
288
288
  popper: this.contentElement,
289
289
  trigger: this.triggerElement
290
- }), this.onToggleState(false), (p = (c = this.options).onShow) == null || p.call(c);
291
- }), h(this, "setPopperOptions", ({ placement: s, offsetDistance: r }) => {
290
+ }), this.onToggleState(false), (d = (c = this.options).onShow) == null || d.call(c);
291
+ }), h(this, "setPopperOptions", ({ placement: s, offsetDistance: o }) => {
292
292
  this.popper.setOptions({
293
293
  placement: s,
294
- offsetDistance: r || this.offsetDistance
294
+ offsetDistance: o || this.offsetDistance
295
295
  });
296
- }), h(this, "setPopperTrigger", (s, r) => {
296
+ }), h(this, "setPopperTrigger", (s, o) => {
297
297
  this.cleanup(), this.popper.setOptions({
298
- placement: r.placement || this.placement,
299
- offsetDistance: r.offsetDistance || this.offsetDistance
298
+ placement: o.placement || this.placement,
299
+ offsetDistance: o.offsetDistance || this.offsetDistance
300
300
  }), this.triggerElement = s, this.triggerElement.addEventListener("click", this.toggleStateOnClick), this.triggerStrategy === "hover" && this.triggerElement.addEventListener("mouseenter", this.showOnMouseEnter);
301
301
  }), h(this, "cleanup", () => {
302
302
  this.triggerElement.removeEventListener("click", this.toggleStateOnClick), this.triggerStrategy === "hover" && this.triggerElement.removeEventListener("mouseenter", this.showOnMouseEnter);
303
303
  });
304
- var o;
304
+ var r;
305
305
  if (this.contentElement = this.getElement(t), this.triggerElement = this.getElement(e), !(this.triggerElement instanceof HTMLElement))
306
306
  throw new Error("Trigger element must be a valid HTML element");
307
307
  if (!(this.contentElement instanceof HTMLElement))
308
308
  throw new Error("Content element must be a valid HTML element");
309
- this.options = i, this.triggerStrategy = this.options.triggerStrategy || "click", this.placement = this.options.placement || "bottom", this.offsetDistance = this.options.offsetDistance || 6, this.preventFromCloseOutside = this.options.preventFromCloseOutside || false, this.preventFromCloseInside = this.options.preventCloseFromInside || false, this.defaultState = this.options.defaultState || "close", this.eventEffect = (o = this.options.popper) == null ? void 0 : o.eventEffect, this.popper = new se(
309
+ this.options = n, this.triggerStrategy = this.options.triggerStrategy || "click", this.placement = this.options.placement || "bottom", this.offsetDistance = this.options.offsetDistance || 6, this.preventFromCloseOutside = this.options.preventFromCloseOutside || false, this.preventFromCloseInside = this.options.preventCloseFromInside || false, this.defaultState = this.options.defaultState || "close", this.eventEffect = (r = this.options.popper) == null ? void 0 : r.eventEffect, this.popper = new se(
310
310
  this.triggerElement,
311
311
  this.contentElement,
312
312
  {
@@ -317,43 +317,43 @@ var ce = class {
317
317
  ), this.initInstance();
318
318
  }
319
319
  onToggleState(e) {
320
- var t, i;
321
- (i = (t = this.options).onToggle) == null || i.call(t, { isHidden: e });
320
+ var t, n;
321
+ (n = (t = this.options).onToggle) == null || n.call(t, { isHidden: e });
322
322
  }
323
323
  /**
324
324
  * Shows the overlay
325
325
  * Positions the overlay, adds event listeners, and triggers related callbacks
326
326
  */
327
327
  show() {
328
- var e, t, i, o;
328
+ var e, t, n, r;
329
329
  this.popper.updatePosition(), document.addEventListener("keydown", this.handleKeyDown), document.addEventListener("click", this.handleDocumentClick), (t = (e = this.options).beforeShow) == null || t.call(e), y({
330
330
  state: "open",
331
331
  popper: this.contentElement,
332
332
  trigger: this.triggerElement
333
- }), this.onToggleState(false), (o = (i = this.options).onShow) == null || o.call(i);
333
+ }), this.onToggleState(false), (r = (n = this.options).onShow) == null || r.call(n);
334
334
  }
335
335
  /**
336
336
  * Hides the overlay
337
337
  * Removes event listeners and triggers related callbacks
338
338
  */
339
339
  hide() {
340
- var e, t, i;
341
- let o = false;
342
- pe(this.contentElement, "before-hide", {
343
- setExitAction: (r) => {
344
- o = r;
340
+ var e, t, n;
341
+ let r = false;
342
+ de(this.contentElement, "before-hide", {
343
+ setExitAction: (o) => {
344
+ r = o;
345
345
  }
346
346
  });
347
- const s = (i = (t = (e = this.options).beforeHide) == null ? void 0 : t.call(e)) == null ? void 0 : i.cancelAction;
348
- o || s || (y({
347
+ const s = (n = (t = (e = this.options).beforeHide) == null ? void 0 : t.call(e)) == null ? void 0 : n.cancelAction;
348
+ r || s || (y({
349
349
  state: "close",
350
350
  popper: this.contentElement,
351
351
  trigger: this.triggerElement
352
352
  }), this.triggerStrategy === "click" && document.removeEventListener("click", this.handleDocumentClick), document.removeEventListener("keydown", this.handleKeyDown), this.triggerStrategy === "hover" && (this.triggerElement.removeEventListener("mouseleave", this.hideOnMouseLeaseTrigger), this.contentElement.removeEventListener("mouseleave", this.hideOnMouseLeave)), he({
353
353
  element: this.contentElement,
354
354
  callback: () => {
355
- var r, l;
356
- this.onToggleState(true), this.popper.cleanupEvents(), (l = (r = this.options).onHide) == null || l.call(r);
355
+ var o, l;
356
+ this.onToggleState(true), this.popper.cleanupEvents(), (l = (o = this.options).onHide) == null || l.call(o);
357
357
  }
358
358
  }));
359
359
  }
@@ -369,111 +369,125 @@ var ce = class {
369
369
  }), this.triggerElement.addEventListener("click", this.toggleStateOnClick), this.triggerStrategy === "hover" && this.triggerElement.addEventListener("mouseenter", this.showOnMouseEnter);
370
370
  }
371
371
  };
372
- var P = (n, e = document.body) => e.querySelector(n);
373
- var W = (n, e = document.body) => Array.from(e.querySelectorAll(n));
374
- var de = (n) => typeof n == "string" ? P(n) : n;
375
- var me = ({ containerElement: n, targetChildren: e = "a:not([disabled]), button:not([disabled])", direction: t }) => {
376
- let i = false;
377
- const o = de(n) || document.body, s = typeof e == "string" ? W(e, o) : e, r = (l) => {
378
- if (l.preventDefault(), o.focus(), s.length === 0)
372
+ var F = (i, e = document.body) => e.querySelector(i);
373
+ var S = (i, e = document.body) => Array.from(e.querySelectorAll(i));
374
+ var pe = (i) => typeof i == "string" ? F(i) : i;
375
+ var me = ({ containerElement: i, targetChildren: e = "a:not([disabled]), button:not([disabled])", direction: t }) => {
376
+ let n = false;
377
+ const r = pe(i) || document.body, s = typeof e == "string" ? S(e, r) : e, o = (l) => {
378
+ if (l.preventDefault(), r.focus(), s.length === 0)
379
379
  return;
380
380
  const m = l.key, c = document.activeElement;
381
- let p = s.findIndex((f) => f === c);
382
- if (p === -1) {
381
+ let d = s.findIndex((g) => g === c);
382
+ if (d === -1) {
383
383
  m === "ArrowUp" || m === "ArrowLeft" ? s[s.length - 1].focus() : s[0].focus();
384
384
  return;
385
385
  }
386
- const g = (f) => f > 0 ? f - 1 : s.length - 1, E = (f) => f < s.length - 1 ? f + 1 : 0;
386
+ const f = (g) => g > 0 ? g - 1 : s.length - 1, E = (g) => g < s.length - 1 ? g + 1 : 0;
387
387
  switch (m) {
388
388
  case "ArrowDown":
389
- l.preventDefault(), p = E(p);
389
+ l.preventDefault(), d = E(d);
390
390
  break;
391
391
  case "ArrowRight":
392
392
  break;
393
393
  case "ArrowUp":
394
- l.preventDefault(), p = g(p);
394
+ l.preventDefault(), d = f(d);
395
395
  break;
396
396
  case "ArrowLeft":
397
397
  break;
398
398
  case "Home":
399
- l.preventDefault(), p = 0;
399
+ l.preventDefault(), d = 0;
400
400
  break;
401
401
  case "End":
402
- l.preventDefault(), p = s.length - 1;
402
+ l.preventDefault(), d = s.length - 1;
403
403
  break;
404
404
  default:
405
405
  return;
406
406
  }
407
- s[p] !== c && s[p].focus();
407
+ s[d] !== c && s[d].focus();
408
408
  };
409
409
  return {
410
410
  make: () => {
411
- i || (document.addEventListener("keydown", r), i = true);
411
+ n || (document.addEventListener("keydown", o), n = true);
412
412
  },
413
413
  destroy: () => {
414
- i && (document.removeEventListener("keydown", r), i = false);
414
+ n && (document.removeEventListener("keydown", o), n = false);
415
415
  }
416
416
  };
417
417
  };
418
- var K = (n, e, t) => {
419
- const i = new CustomEvent(e, { detail: t });
420
- n.dispatchEvent(i);
418
+ var z = (i, e, t) => {
419
+ const n = new CustomEvent(e, { detail: t });
420
+ i.dispatchEvent(n);
421
421
  };
422
- function fe(n, e, t = "move") {
423
- if (!(n instanceof HTMLElement))
422
+ function ge(i) {
423
+ const e = () => {
424
+ document.querySelector(
425
+ "[data-fx-component]:not([data-component-initialized])"
426
+ ) ? requestAnimationFrame(e) : i();
427
+ };
428
+ e();
429
+ }
430
+ function fe(i, e, t = "move") {
431
+ if (!(i instanceof HTMLElement))
424
432
  throw new Error("Source element must be an HTMLElement");
425
433
  if (!(e instanceof HTMLElement))
426
434
  throw new Error("Target element must be an HTMLElement");
427
435
  if (!["move", "detachable"].includes(t))
428
436
  throw new Error(`Invalid teleport mode: ${t}. Must be "move" or "detachable".`);
429
- let i = document.createComment("teleporter-placeholder");
430
- const o = n.parentNode;
431
- return o ? o.insertBefore(i, n) : console.warn("Element has no parent; placeholder not inserted."), t === "move" ? (n.parentNode && e.appendChild(n), {
437
+ let n = document.createComment("teleporter-placeholder");
438
+ const r = i.parentNode;
439
+ return r ? r.insertBefore(n, i) : console.warn("Element has no parent; placeholder not inserted."), t === "move" ? (i.parentNode && e.appendChild(i), {
432
440
  append() {
433
- n.parentNode !== e && e.appendChild(n);
441
+ i.parentNode !== e && e.appendChild(i);
434
442
  },
435
443
  remove() {
436
- i != null && i.parentNode && n.parentNode && i.parentNode.insertBefore(n, i);
444
+ n != null && n.parentNode && i.parentNode && n.parentNode.insertBefore(i, n);
437
445
  },
438
446
  restore() {
439
- i != null && i.parentNode && n.parentNode !== o && i.parentNode.insertBefore(n, i);
447
+ n != null && n.parentNode && i.parentNode !== r && n.parentNode.insertBefore(i, n);
440
448
  }
441
- }) : (n.parentNode && e.appendChild(n), {
449
+ }) : (i.parentNode && e.appendChild(i), {
442
450
  append() {
443
- e.contains(n) || e.appendChild(n);
451
+ e.contains(i) || e.appendChild(i);
444
452
  },
445
453
  remove() {
446
- n.parentNode && n.remove();
454
+ i.parentNode && i.remove();
447
455
  },
448
456
  restore() {
449
- i != null && i.parentNode && !n.parentNode && i.parentNode.insertBefore(n, i);
457
+ n != null && n.parentNode && !i.parentNode && n.parentNode.insertBefore(i, n);
450
458
  }
451
459
  });
452
460
  }
453
- var T = class {
461
+ var O = class {
454
462
  static initGlobalRegistry() {
455
463
  window.$flexillaInstances || (window.$flexillaInstances = {});
456
464
  }
457
- static register(e, t, i) {
458
- return this.initGlobalRegistry(), window.$flexillaInstances[e] || (window.$flexillaInstances[e] = []), this.getInstance(e, t) || (window.$flexillaInstances[e].push({ element: t, instance: i }), i);
465
+ static register(e, t, n) {
466
+ return this.initGlobalRegistry(), window.$flexillaInstances[e] || (window.$flexillaInstances[e] = []), this.getInstance(e, t) || (window.$flexillaInstances[e].push({ element: t, instance: n }), n);
459
467
  }
460
468
  static getInstance(e, t) {
461
- var i, o;
462
- return this.initGlobalRegistry(), (o = (i = window.$flexillaInstances[e]) == null ? void 0 : i.find(
469
+ var n, r;
470
+ return this.initGlobalRegistry(), (r = (n = window.$flexillaInstances[e]) == null ? void 0 : n.find(
463
471
  (s) => s.element === t
464
- )) == null ? void 0 : o.instance;
472
+ )) == null ? void 0 : r.instance;
465
473
  }
466
474
  static removeInstance(e, t) {
467
475
  this.initGlobalRegistry(), window.$flexillaInstances[e] && (window.$flexillaInstances[e] = window.$flexillaInstances[e].filter(
468
- (i) => i.element !== t
476
+ (n) => n.element !== t
469
477
  ));
470
478
  }
479
+ static setup(e) {
480
+ e.setAttribute("data-fx-component", "fx");
481
+ }
482
+ static initialized(e) {
483
+ e.setAttribute("data-component-initialized", "initialized");
484
+ }
471
485
  };
472
- var ge = {
486
+ var ue = {
473
487
  teleport: true,
474
488
  teleportMode: "move"
475
489
  };
476
- var O = class O2 {
490
+ var k = class k2 {
477
491
  /**
478
492
  * Creates a new Dropdown instance
479
493
  * @param dropdown - The dropdown content element or selector
@@ -488,6 +502,7 @@ var O = class O2 {
488
502
  a(this, "OverlayInstance");
489
503
  a(this, "navigationKeys");
490
504
  a(this, "keyObserver");
505
+ a(this, "subtriggerObserver");
491
506
  a(this, "triggerStrategy");
492
507
  a(this, "placement");
493
508
  a(this, "offsetDistance");
@@ -496,23 +511,40 @@ var O = class O2 {
496
511
  a(this, "defaultState");
497
512
  a(this, "experimentalOptions");
498
513
  a(this, "teleporter");
499
- a(this, "observeEl", () => {
500
- this.keyObserver = new MutationObserver((e2) => {
501
- for (const t2 of e2)
502
- t2.type === "attributes" && t2.attributeName === "aria-expanded" && (t2.target.getAttribute("aria-expanded") === "true" ? this.navigationKeys.destroy() : this.navigationKeys.make());
503
- });
504
- for (const e2 of this.items)
505
- e2.hasAttribute("data-dropdown-trigger") && this.keyObserver.observe(e2, {
514
+ a(this, "updateSubtriggerAttr", (e2, t2) => {
515
+ t2 === "add" ? (e2.setAttribute("data-current-subtrigger", ""), e2.setAttribute("data-focus", "active")) : (e2.removeAttribute("data-current-subtrigger"), e2.removeAttribute("data-focus"));
516
+ });
517
+ a(this, "updateObserverFor", (e2) => {
518
+ const t2 = S("[data-dropdown-trigger]", this.contentElement);
519
+ for (const n2 of t2)
520
+ e2.observe(n2, {
506
521
  attributes: true,
507
522
  attributeFilter: ["aria-expanded"]
508
523
  });
509
524
  });
525
+ a(this, "observeEl", () => {
526
+ this.keyObserver = new MutationObserver((e2) => {
527
+ for (const t2 of e2)
528
+ t2.type === "attributes" && t2.attributeName === "aria-expanded" && (t2.target.getAttribute("aria-expanded") === "true" ? this.navigationKeys.destroy() : this.contentElement.dataset.state === "open" && this.navigationKeys.make());
529
+ }), this.updateObserverFor(this.keyObserver);
530
+ });
531
+ a(this, "observeSubtriggers", () => {
532
+ this.subtriggerObserver = new MutationObserver((e2) => {
533
+ for (const t2 of e2)
534
+ if (t2.type === "attributes" && t2.attributeName === "aria-expanded") {
535
+ const n2 = t2.target, r2 = n2.getAttribute("aria-expanded");
536
+ this.updateSubtriggerAttr(n2, r2 === "true" ? "add" : "remove");
537
+ }
538
+ }), this.updateObserverFor(this.subtriggerObserver);
539
+ });
510
540
  a(this, "onToggle", ({ isHidden: e2 }) => {
511
- var t2, i2;
512
- (i2 = (t2 = this.options).onToggle) == null || i2.call(t2, { isHidden: e2 });
541
+ var t2, n2;
542
+ (n2 = (t2 = this.options).onToggle) == null || n2.call(t2, { isHidden: e2 });
513
543
  });
514
544
  a(this, "moveElOnInit", () => {
515
- this.experimentalOptions.teleport && (this.experimentalOptions.teleportMode === "detachable" ? this.teleporter.remove() : this.teleporter.append());
545
+ this.experimentalOptions.teleport && ge(() => {
546
+ this.experimentalOptions.teleportMode === "detachable" ? this.teleporter.remove() : this.teleporter.append();
547
+ });
516
548
  });
517
549
  a(this, "moveEl", () => {
518
550
  this.experimentalOptions.teleport && this.experimentalOptions.teleportMode === "detachable" && this.teleporter.remove();
@@ -521,29 +553,54 @@ var O = class O2 {
521
553
  this.experimentalOptions.teleport && this.experimentalOptions.teleportMode === "detachable" && this.teleporter.append();
522
554
  });
523
555
  a(this, "beforeShow", () => {
524
- this.restoreEl(), this.contentElement.focus(), this.navigationKeys.make();
556
+ this.restoreEl(), this.contentElement.focus(), this.navigationKeys.make(), this.addArrowEvent();
525
557
  });
526
558
  a(this, "beforeHide", () => {
527
- this.contentElement.blur(), this.navigationKeys.destroy();
559
+ this.contentElement.blur(), this.navigationKeys.destroy(), this.removeArrowEvent();
560
+ });
561
+ a(this, "showHideOnArrow", (e2) => {
562
+ e2.preventDefault();
563
+ const t2 = e2.key, n2 = document.activeElement;
564
+ if (n2 != null && n2.hasAttribute("data-dropdown-trigger"))
565
+ switch (t2) {
566
+ case "ArrowRight":
567
+ n2.getAttribute("aria-expanded") !== "true" && (n2.click(), this.updateSubtriggerAttr(n2, "add"));
568
+ break;
569
+ case "ArrowLeft":
570
+ n2.getAttribute("aria-expanded") === "true" && (n2.click(), this.updateSubtriggerAttr(n2, "remove"));
571
+ break;
572
+ default:
573
+ return;
574
+ }
575
+ if (this.triggerElement.hasAttribute("data-current-subtrigger"))
576
+ switch (t2) {
577
+ case "ArrowLeft":
578
+ this.triggerElement.click(), this.triggerElement.focus(), this.updateSubtriggerAttr(this.triggerElement, "remove");
579
+ break;
580
+ default:
581
+ return;
582
+ }
583
+ });
584
+ a(this, "addArrowEvent", () => {
585
+ document.addEventListener("keydown", this.showHideOnArrow);
586
+ });
587
+ a(this, "removeArrowEvent", () => {
588
+ document.removeEventListener("keydown", this.showHideOnArrow);
528
589
  });
529
590
  a(this, "onShow", () => {
530
591
  var e2, t2;
531
- K(this.contentElement, "dropdown-show", {
592
+ z(this.contentElement, "dropdown-show", {
532
593
  isHidden: false
533
- }), (t2 = (e2 = this.options).onShow) == null || t2.call(e2);
594
+ }), (t2 = (e2 = this.options).onShow) == null || t2.call(e2), this.observeEl(), this.observeSubtriggers();
534
595
  });
535
596
  a(this, "onHide", () => {
536
597
  var e2, t2;
537
- K(this.contentElement, "dropdown-hide", {
598
+ z(this.contentElement, "dropdown-hide", {
538
599
  isHidden: true
539
- }), (t2 = (e2 = this.options).onHide) == null || t2.call(e2), this.moveEl();
540
- });
541
- a(this, "show", () => {
542
- this.OverlayInstance.show();
543
- });
544
- a(this, "hide", () => {
545
- this.OverlayInstance.hide();
600
+ }), (t2 = (e2 = this.options).onHide) == null || t2.call(e2), this.moveEl(), this.triggerElement.hasAttribute("data-current-subtrigger") && this.updateSubtriggerAttr(this.triggerElement, "remove"), this.disconnectObserver();
546
601
  });
602
+ a(this, "show", () => this.OverlayInstance.show());
603
+ a(this, "hide", () => this.OverlayInstance.hide());
547
604
  a(this, "setShowOptions", ({ placement: e2, offsetDistance: t2 }) => {
548
605
  this.OverlayInstance.setShowOptions({ placement: e2, offsetDistance: t2 });
549
606
  });
@@ -554,26 +611,27 @@ var O = class O2 {
554
611
  this.OverlayInstance.setPopperTrigger(e2, t2);
555
612
  });
556
613
  a(this, "disconnectObserver", () => {
557
- this.keyObserver && this.keyObserver.disconnect();
614
+ this.keyObserver && this.keyObserver.disconnect(), this.subtriggerObserver && this.subtriggerObserver.disconnect();
558
615
  });
559
616
  a(this, "cleanup", () => {
560
- this.disconnectObserver(), this.OverlayInstance.cleanup(), T.removeInstance("dropdown", this.contentElement);
617
+ this.disconnectObserver(), this.OverlayInstance.cleanup(), O.removeInstance("dropdown", this.contentElement);
561
618
  });
562
- const i = typeof e == "string" ? P(e) : e;
563
- if (!(i instanceof HTMLElement))
619
+ const n = typeof e == "string" ? F(e) : e;
620
+ if (!(n instanceof HTMLElement))
564
621
  throw new Error(
565
622
  "Invalid dropdown content element: Must provide either a valid HTMLElement or a selector string that resolves to an existing HTMLElement"
566
623
  );
567
- if (!i.id)
624
+ if (!n.id)
568
625
  throw new Error("Dropdown content element must have an 'id' attribute for trigger association");
569
- this.contentElement = i;
570
- const o = T.getInstance("dropdown", this.contentElement);
571
- if (o)
572
- return o;
626
+ this.contentElement = n;
627
+ const r = O.getInstance("dropdown", this.contentElement);
628
+ if (r)
629
+ return r;
630
+ O.setup(this.contentElement);
573
631
  const s = `[data-dropdown-trigger][data-dropdown-id=${this.contentElement.id}]`;
574
- if (this.triggerElement = P(s), !(this.triggerElement instanceof HTMLElement))
632
+ if (this.triggerElement = F(s), !(this.triggerElement instanceof HTMLElement))
575
633
  throw new Error(`No valid trigger element found. Ensure a trigger element exists with attributes: data-dropdown-trigger and data-dropdown-id="${this.contentElement.id}"`);
576
- this.options = t, this.triggerStrategy = this.options.triggerStrategy || this.contentElement.dataset.triggerStrategy || "click", this.placement = this.options.placement || this.contentElement.dataset.placement || "bottom-start", this.offsetDistance = this.options.offsetDistance || parseInt(`${this.contentElement.dataset.offsetDistance}`) | 6, this.preventFromCloseOutside = this.options.preventFromCloseOutside || this.contentElement.hasAttribute("data-prevent-close-outside") || false, this.preventFromCloseInside = this.options.preventCloseFromInside || this.contentElement.hasAttribute("data-prevent-close-inside") || false, this.defaultState = this.options.defaultState || this.contentElement.dataset.defaultState || "close", this.experimentalOptions = Object.assign({}, ge, t.experimental), this.teleporter = fe(this.contentElement, document.body, this.experimentalOptions.teleportMode), this.OverlayInstance = new ce({
634
+ this.options = t, this.triggerStrategy = this.contentElement.dataset.triggerStrategy || this.options.triggerStrategy || "click", this.placement = this.contentElement.dataset.placement || this.options.placement || "bottom-start", this.offsetDistance = parseInt(`${this.contentElement.dataset.offsetDistance}`) || this.options.offsetDistance || 6, this.preventFromCloseOutside = this.contentElement.hasAttribute("data-prevent-close-outside") || this.options.preventFromCloseOutside || false, this.preventFromCloseInside = this.contentElement.hasAttribute("data-prevent-close-inside") || this.options.preventCloseFromInside || false, this.defaultState = this.contentElement.dataset.defaultState || this.options.defaultState || "close", this.experimentalOptions = Object.assign({}, ue, t.experimental), this.teleporter = fe(this.contentElement, document.body, this.experimentalOptions.teleportMode), this.OverlayInstance = new ce({
577
635
  trigger: this.triggerElement,
578
636
  content: this.contentElement,
579
637
  options: {
@@ -584,19 +642,23 @@ var O = class O2 {
584
642
  preventCloseFromInside: this.preventFromCloseInside,
585
643
  defaultState: this.defaultState,
586
644
  beforeShow: this.beforeShow,
587
- beforeHide: this.beforeHide,
645
+ beforeHide: () => {
646
+ if (S("[data-dropdown-trigger][aria-expanded=true]", this.contentElement).length >= 1)
647
+ return { cancelAction: true };
648
+ this.beforeHide();
649
+ },
588
650
  onShow: this.onShow,
589
651
  onHide: this.onHide,
590
- onToggle: ({ isHidden: r }) => {
591
- this.onToggle({ isHidden: r });
652
+ onToggle: ({ isHidden: o }) => {
653
+ this.onToggle({ isHidden: o });
592
654
  },
593
655
  popper: this.options.popper
594
656
  }
595
- }), this.moveElOnInit(), this.items = W("a:not([disabled]), button:not([disabled])", this.contentElement), this.navigationKeys = me({
657
+ }), this.moveElOnInit(), this.items = S("a:not([disabled]), button:not([disabled])", this.contentElement), this.navigationKeys = me({
596
658
  containerElement: this.contentElement,
597
659
  targetChildren: this.items,
598
660
  direction: "up-down"
599
- }), this.observeEl(), T.register("dropdown", this.contentElement, this);
661
+ }), O.register("dropdown", this.contentElement, this), O.initialized(this.contentElement);
600
662
  }
601
663
  /**
602
664
  * Initializes a single dropdown instance
@@ -605,20 +667,20 @@ var O = class O2 {
605
667
  * @returns A new Dropdown instance
606
668
  */
607
669
  static init(e, t = {}) {
608
- new O2(e, t);
670
+ new k2(e, t);
609
671
  }
610
672
  };
611
- a(O, "autoInit", (e = "[data-fx-dropdown]") => {
612
- const t = W(e);
613
- for (const i of t)
614
- new O(i);
673
+ a(k, "autoInit", (e = "[data-fx-dropdown]") => {
674
+ const t = S(e);
675
+ for (const n of t)
676
+ new k(n);
615
677
  });
616
- var z = O;
678
+ var K = k;
617
679
 
618
680
  // src/index.js
619
681
  function Dropdown(Alpine) {
620
682
  Alpine.directive("dropdown", (el, {}, { cleanup }) => {
621
- const dropdown_ = new z(el);
683
+ const dropdown_ = new K(el);
622
684
  cleanup(() => {
623
685
  dropdown_.cleanup();
624
686
  });