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