@flexilla/alpine-dropdown 0.1.1 → 0.2.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);
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
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);
31
+ var q = (i, e, t) => e in i ? G(i, e, { enumerable: true, configurable: true, writable: true, value: t }) : i[e] = t;
32
+ var p = (i, e, t) => q(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,68 +45,68 @@ 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
+ ), H = () => Y(s, e, n, m) ? n + e / 2 - s / 2 : b(), M = () => J(o, r, t, l) ? t + r / 2 - o / 2 : w(), A = () => n + s <= m ? n : b(), k = () => n + e - s >= 0 ? n + e - s : b(), L = () => 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 C = t - o - c, x = t + r + c, I = n - s - c, D = n + e + c, W = g >= o + c, F = E >= o + c, R = f >= s + c, $ = d >= s + c;
90
+ switch (i.startsWith("top") ? v = W ? C : F ? x : Math.max(C, x) : i.startsWith("bottom") ? v = F ? x : W ? C : Math.max(x) : i.startsWith("left") ? u = R ? I : $ ? D : Math.max(I, D) : i.startsWith("right") && (u = $ ? D : R ? I : Math.max(D, I)), i) {
91
91
  case "bottom":
92
92
  case "bottom-middle":
93
93
  case "top":
94
94
  case "top-middle":
95
- u = M();
95
+ u = H();
96
96
  break;
97
97
  case "left":
98
98
  case "left-middle":
99
99
  case "right":
100
100
  case "right-middle":
101
- v = x();
101
+ v = M();
102
102
  break;
103
103
  case "bottom-start":
104
104
  case "top-start":
105
- u = H();
105
+ u = A();
106
106
  break;
107
107
  case "bottom-end":
108
108
  case "top-end":
109
- u = S();
109
+ u = k();
110
110
  break;
111
111
  case "left-start":
112
112
  case "right-start":
@@ -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: H, refLeft: M, refTop: A } = X({ reference: this.reference, popper: this.popper }), { x: k, y: L } = ie(
157
157
  {
158
158
  placement: this.placement,
159
- refWidth: M,
160
- refTop: H,
161
- refLeft: x,
159
+ refWidth: H,
160
+ refTop: A,
161
+ refLeft: M,
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(k, L), (d = this.onUpdate) == null || d.call(this, { x: k, y: L, 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,84 +369,84 @@ 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 P = (i, e = document.body) => e.querySelector(i);
373
+ var O = (i, e = document.body) => Array.from(e.querySelectorAll(i));
374
+ var pe = (i) => typeof i == "string" ? P(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" ? O(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 K = (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, e, t = "move") {
423
+ if (!(i instanceof HTMLElement))
424
424
  throw new Error("Source element must be an HTMLElement");
425
425
  if (!(e instanceof HTMLElement))
426
426
  throw new Error("Target element must be an HTMLElement");
427
427
  if (!["move", "detachable"].includes(t))
428
428
  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), {
429
+ let n = document.createComment("teleporter-placeholder");
430
+ const r = i.parentNode;
431
+ return r ? r.insertBefore(n, i) : console.warn("Element has no parent; placeholder not inserted."), t === "move" ? (i.parentNode && e.appendChild(i), {
432
432
  append() {
433
- n.parentNode !== e && e.appendChild(n);
433
+ i.parentNode !== e && e.appendChild(i);
434
434
  },
435
435
  remove() {
436
- i != null && i.parentNode && n.parentNode && i.parentNode.insertBefore(n, i);
436
+ n != null && n.parentNode && i.parentNode && n.parentNode.insertBefore(i, n);
437
437
  },
438
438
  restore() {
439
- i != null && i.parentNode && n.parentNode !== o && i.parentNode.insertBefore(n, i);
439
+ n != null && n.parentNode && i.parentNode !== r && n.parentNode.insertBefore(i, n);
440
440
  }
441
- }) : (n.parentNode && e.appendChild(n), {
441
+ }) : (i.parentNode && e.appendChild(i), {
442
442
  append() {
443
- e.contains(n) || e.appendChild(n);
443
+ e.contains(i) || e.appendChild(i);
444
444
  },
445
445
  remove() {
446
- n.parentNode && n.remove();
446
+ i.parentNode && i.remove();
447
447
  },
448
448
  restore() {
449
- i != null && i.parentNode && !n.parentNode && i.parentNode.insertBefore(n, i);
449
+ n != null && n.parentNode && !i.parentNode && n.parentNode.insertBefore(i, n);
450
450
  }
451
451
  });
452
452
  }
@@ -454,26 +454,26 @@ var T = class {
454
454
  static initGlobalRegistry() {
455
455
  window.$flexillaInstances || (window.$flexillaInstances = {});
456
456
  }
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);
457
+ static register(e, t, n) {
458
+ return this.initGlobalRegistry(), window.$flexillaInstances[e] || (window.$flexillaInstances[e] = []), this.getInstance(e, t) || (window.$flexillaInstances[e].push({ element: t, instance: n }), n);
459
459
  }
460
460
  static getInstance(e, t) {
461
- var i, o;
462
- return this.initGlobalRegistry(), (o = (i = window.$flexillaInstances[e]) == null ? void 0 : i.find(
461
+ var n, r;
462
+ return this.initGlobalRegistry(), (r = (n = window.$flexillaInstances[e]) == null ? void 0 : n.find(
463
463
  (s) => s.element === t
464
- )) == null ? void 0 : o.instance;
464
+ )) == null ? void 0 : r.instance;
465
465
  }
466
466
  static removeInstance(e, t) {
467
467
  this.initGlobalRegistry(), window.$flexillaInstances[e] && (window.$flexillaInstances[e] = window.$flexillaInstances[e].filter(
468
- (i) => i.element !== t
468
+ (n) => n.element !== t
469
469
  ));
470
470
  }
471
471
  };
472
- var ge = {
472
+ var fe = {
473
473
  teleport: true,
474
474
  teleportMode: "move"
475
475
  };
476
- var O = class O2 {
476
+ var S = class S2 {
477
477
  /**
478
478
  * Creates a new Dropdown instance
479
479
  * @param dropdown - The dropdown content element or selector
@@ -488,6 +488,7 @@ var O = class O2 {
488
488
  a(this, "OverlayInstance");
489
489
  a(this, "navigationKeys");
490
490
  a(this, "keyObserver");
491
+ a(this, "subtriggerObserver");
491
492
  a(this, "triggerStrategy");
492
493
  a(this, "placement");
493
494
  a(this, "offsetDistance");
@@ -496,20 +497,35 @@ var O = class O2 {
496
497
  a(this, "defaultState");
497
498
  a(this, "experimentalOptions");
498
499
  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, {
500
+ a(this, "updateSubtriggerAttr", (e2, t2) => {
501
+ t2 === "add" ? (e2.setAttribute("data-current-subtrigger", ""), e2.setAttribute("data-focus", "active")) : (e2.removeAttribute("data-current-subtrigger"), e2.removeAttribute("data-focus"));
502
+ });
503
+ a(this, "updateObserverFor", (e2) => {
504
+ const t2 = O("[data-dropdown-trigger]", this.contentElement);
505
+ for (const n2 of t2)
506
+ e2.observe(n2, {
506
507
  attributes: true,
507
508
  attributeFilter: ["aria-expanded"]
508
509
  });
509
510
  });
511
+ a(this, "observeEl", () => {
512
+ this.keyObserver = new MutationObserver((e2) => {
513
+ for (const t2 of e2)
514
+ t2.type === "attributes" && t2.attributeName === "aria-expanded" && (t2.target.getAttribute("aria-expanded") === "true" ? this.navigationKeys.destroy() : this.contentElement.dataset.state === "open" && this.navigationKeys.make());
515
+ }), this.updateObserverFor(this.keyObserver);
516
+ });
517
+ a(this, "observeSubtriggers", () => {
518
+ this.subtriggerObserver = new MutationObserver((e2) => {
519
+ for (const t2 of e2)
520
+ if (t2.type === "attributes" && t2.attributeName === "aria-expanded") {
521
+ const n2 = t2.target, r2 = n2.getAttribute("aria-expanded");
522
+ this.updateSubtriggerAttr(n2, r2 === "true" ? "add" : "remove");
523
+ }
524
+ }), this.updateObserverFor(this.subtriggerObserver);
525
+ });
510
526
  a(this, "onToggle", ({ isHidden: e2 }) => {
511
- var t2, i2;
512
- (i2 = (t2 = this.options).onToggle) == null || i2.call(t2, { isHidden: e2 });
527
+ var t2, n2;
528
+ (n2 = (t2 = this.options).onToggle) == null || n2.call(t2, { isHidden: e2 });
513
529
  });
514
530
  a(this, "moveElOnInit", () => {
515
531
  this.experimentalOptions.teleport && (this.experimentalOptions.teleportMode === "detachable" ? this.teleporter.remove() : this.teleporter.append());
@@ -521,29 +537,54 @@ var O = class O2 {
521
537
  this.experimentalOptions.teleport && this.experimentalOptions.teleportMode === "detachable" && this.teleporter.append();
522
538
  });
523
539
  a(this, "beforeShow", () => {
524
- this.restoreEl(), this.contentElement.focus(), this.navigationKeys.make();
540
+ this.restoreEl(), this.contentElement.focus(), this.navigationKeys.make(), this.addArrowEvent();
525
541
  });
526
542
  a(this, "beforeHide", () => {
527
- this.contentElement.blur(), this.navigationKeys.destroy();
543
+ this.contentElement.blur(), this.navigationKeys.destroy(), this.removeArrowEvent();
544
+ });
545
+ a(this, "showHideOnArrow", (e2) => {
546
+ e2.preventDefault();
547
+ const t2 = e2.key, n2 = document.activeElement;
548
+ if (n2 != null && n2.hasAttribute("data-dropdown-trigger"))
549
+ switch (t2) {
550
+ case "ArrowRight":
551
+ n2.getAttribute("aria-expanded") !== "true" && (n2.click(), this.updateSubtriggerAttr(n2, "add"));
552
+ break;
553
+ case "ArrowLeft":
554
+ n2.getAttribute("aria-expanded") === "true" && (n2.click(), this.updateSubtriggerAttr(n2, "remove"));
555
+ break;
556
+ default:
557
+ return;
558
+ }
559
+ if (this.triggerElement.hasAttribute("data-current-subtrigger"))
560
+ switch (t2) {
561
+ case "ArrowLeft":
562
+ this.triggerElement.click(), this.triggerElement.focus(), this.updateSubtriggerAttr(this.triggerElement, "remove");
563
+ break;
564
+ default:
565
+ return;
566
+ }
567
+ });
568
+ a(this, "addArrowEvent", () => {
569
+ document.addEventListener("keydown", this.showHideOnArrow);
570
+ });
571
+ a(this, "removeArrowEvent", () => {
572
+ document.removeEventListener("keydown", this.showHideOnArrow);
528
573
  });
529
574
  a(this, "onShow", () => {
530
575
  var e2, t2;
531
576
  K(this.contentElement, "dropdown-show", {
532
577
  isHidden: false
533
- }), (t2 = (e2 = this.options).onShow) == null || t2.call(e2);
578
+ }), (t2 = (e2 = this.options).onShow) == null || t2.call(e2), this.observeEl(), this.observeSubtriggers();
534
579
  });
535
580
  a(this, "onHide", () => {
536
581
  var e2, t2;
537
582
  K(this.contentElement, "dropdown-hide", {
538
583
  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();
584
+ }), (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
585
  });
586
+ a(this, "show", () => this.OverlayInstance.show());
587
+ a(this, "hide", () => this.OverlayInstance.hide());
547
588
  a(this, "setShowOptions", ({ placement: e2, offsetDistance: t2 }) => {
548
589
  this.OverlayInstance.setShowOptions({ placement: e2, offsetDistance: t2 });
549
590
  });
@@ -554,26 +595,26 @@ var O = class O2 {
554
595
  this.OverlayInstance.setPopperTrigger(e2, t2);
555
596
  });
556
597
  a(this, "disconnectObserver", () => {
557
- this.keyObserver && this.keyObserver.disconnect();
598
+ this.keyObserver && this.keyObserver.disconnect(), this.subtriggerObserver && this.subtriggerObserver.disconnect();
558
599
  });
559
600
  a(this, "cleanup", () => {
560
601
  this.disconnectObserver(), this.OverlayInstance.cleanup(), T.removeInstance("dropdown", this.contentElement);
561
602
  });
562
- const i = typeof e == "string" ? P(e) : e;
563
- if (!(i instanceof HTMLElement))
603
+ const n = typeof e == "string" ? P(e) : e;
604
+ if (!(n instanceof HTMLElement))
564
605
  throw new Error(
565
606
  "Invalid dropdown content element: Must provide either a valid HTMLElement or a selector string that resolves to an existing HTMLElement"
566
607
  );
567
- if (!i.id)
608
+ if (!n.id)
568
609
  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;
610
+ this.contentElement = n;
611
+ const r = T.getInstance("dropdown", this.contentElement);
612
+ if (r)
613
+ return r;
573
614
  const s = `[data-dropdown-trigger][data-dropdown-id=${this.contentElement.id}]`;
574
615
  if (this.triggerElement = P(s), !(this.triggerElement instanceof HTMLElement))
575
616
  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({
617
+ 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({}, fe, t.experimental), this.teleporter = ge(this.contentElement, document.body, this.experimentalOptions.teleportMode), this.OverlayInstance = new ce({
577
618
  trigger: this.triggerElement,
578
619
  content: this.contentElement,
579
620
  options: {
@@ -584,19 +625,23 @@ var O = class O2 {
584
625
  preventCloseFromInside: this.preventFromCloseInside,
585
626
  defaultState: this.defaultState,
586
627
  beforeShow: this.beforeShow,
587
- beforeHide: this.beforeHide,
628
+ beforeHide: () => {
629
+ if (O("[data-dropdown-trigger][aria-expanded=true]", this.contentElement).length >= 1)
630
+ return { cancelAction: true };
631
+ this.beforeHide();
632
+ },
588
633
  onShow: this.onShow,
589
634
  onHide: this.onHide,
590
- onToggle: ({ isHidden: r }) => {
591
- this.onToggle({ isHidden: r });
635
+ onToggle: ({ isHidden: o }) => {
636
+ this.onToggle({ isHidden: o });
592
637
  },
593
638
  popper: this.options.popper
594
639
  }
595
- }), this.moveElOnInit(), this.items = W("a:not([disabled]), button:not([disabled])", this.contentElement), this.navigationKeys = me({
640
+ }), this.moveElOnInit(), this.items = O("a:not([disabled]), button:not([disabled])", this.contentElement), this.navigationKeys = me({
596
641
  containerElement: this.contentElement,
597
642
  targetChildren: this.items,
598
643
  direction: "up-down"
599
- }), this.observeEl(), T.register("dropdown", this.contentElement, this);
644
+ }), T.register("dropdown", this.contentElement, this);
600
645
  }
601
646
  /**
602
647
  * Initializes a single dropdown instance
@@ -605,15 +650,15 @@ var O = class O2 {
605
650
  * @returns A new Dropdown instance
606
651
  */
607
652
  static init(e, t = {}) {
608
- new O2(e, t);
653
+ new S2(e, t);
609
654
  }
610
655
  };
611
- a(O, "autoInit", (e = "[data-fx-dropdown]") => {
612
- const t = W(e);
613
- for (const i of t)
614
- new O(i);
656
+ a(S, "autoInit", (e = "[data-fx-dropdown]") => {
657
+ const t = O(e);
658
+ for (const n of t)
659
+ new S(n);
615
660
  });
616
- var z = O;
661
+ var z = S;
617
662
 
618
663
  // src/index.js
619
664
  function Dropdown(Alpine) {