@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.
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);
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
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);
7
+ var q = (i, e, t) => e in i ? G(i, e, { enumerable: true, configurable: true, writable: true, value: t }) : i[e] = t;
8
+ var p = (i, e, t) => q(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,68 +21,68 @@
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
+ ), 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();
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 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;
66
+ 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) {
67
67
  case "bottom":
68
68
  case "bottom-middle":
69
69
  case "top":
70
70
  case "top-middle":
71
- u = M();
71
+ u = H();
72
72
  break;
73
73
  case "left":
74
74
  case "left-middle":
75
75
  case "right":
76
76
  case "right-middle":
77
- v = x();
77
+ v = M();
78
78
  break;
79
79
  case "bottom-start":
80
80
  case "top-start":
81
- u = H();
81
+ u = A();
82
82
  break;
83
83
  case "bottom-end":
84
84
  case "top-end":
85
- u = S();
85
+ u = k();
86
86
  break;
87
87
  case "left-start":
88
88
  case "right-start":
@@ -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: H, refLeft: M, refTop: A } = X({ reference: this.reference, popper: this.popper }), { x: k, y: L } = ie(
133
133
  {
134
134
  placement: this.placement,
135
- refWidth: M,
136
- refTop: H,
137
- refLeft: x,
135
+ refWidth: H,
136
+ refTop: A,
137
+ refLeft: M,
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(k, L), (d = this.onUpdate) == null || d.call(this, { x: k, y: L, 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,84 +345,84 @@
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 P = (i, e = document.body) => e.querySelector(i);
349
+ var O = (i, e = document.body) => Array.from(e.querySelectorAll(i));
350
+ var pe = (i) => typeof i == "string" ? P(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" ? O(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 K = (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, e, t = "move") {
399
+ if (!(i instanceof HTMLElement))
400
400
  throw new Error("Source element must be an HTMLElement");
401
401
  if (!(e instanceof HTMLElement))
402
402
  throw new Error("Target element must be an HTMLElement");
403
403
  if (!["move", "detachable"].includes(t))
404
404
  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), {
405
+ let n = document.createComment("teleporter-placeholder");
406
+ const r = i.parentNode;
407
+ return r ? r.insertBefore(n, i) : console.warn("Element has no parent; placeholder not inserted."), t === "move" ? (i.parentNode && e.appendChild(i), {
408
408
  append() {
409
- n.parentNode !== e && e.appendChild(n);
409
+ i.parentNode !== e && e.appendChild(i);
410
410
  },
411
411
  remove() {
412
- i != null && i.parentNode && n.parentNode && i.parentNode.insertBefore(n, i);
412
+ n != null && n.parentNode && i.parentNode && n.parentNode.insertBefore(i, n);
413
413
  },
414
414
  restore() {
415
- i != null && i.parentNode && n.parentNode !== o && i.parentNode.insertBefore(n, i);
415
+ n != null && n.parentNode && i.parentNode !== r && n.parentNode.insertBefore(i, n);
416
416
  }
417
- }) : (n.parentNode && e.appendChild(n), {
417
+ }) : (i.parentNode && e.appendChild(i), {
418
418
  append() {
419
- e.contains(n) || e.appendChild(n);
419
+ e.contains(i) || e.appendChild(i);
420
420
  },
421
421
  remove() {
422
- n.parentNode && n.remove();
422
+ i.parentNode && i.remove();
423
423
  },
424
424
  restore() {
425
- i != null && i.parentNode && !n.parentNode && i.parentNode.insertBefore(n, i);
425
+ n != null && n.parentNode && !i.parentNode && n.parentNode.insertBefore(i, n);
426
426
  }
427
427
  });
428
428
  }
@@ -430,26 +430,26 @@
430
430
  static initGlobalRegistry() {
431
431
  window.$flexillaInstances || (window.$flexillaInstances = {});
432
432
  }
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);
433
+ static register(e, t, n) {
434
+ return this.initGlobalRegistry(), window.$flexillaInstances[e] || (window.$flexillaInstances[e] = []), this.getInstance(e, t) || (window.$flexillaInstances[e].push({ element: t, instance: n }), n);
435
435
  }
436
436
  static getInstance(e, t) {
437
- var i, o;
438
- return this.initGlobalRegistry(), (o = (i = window.$flexillaInstances[e]) == null ? void 0 : i.find(
437
+ var n, r;
438
+ return this.initGlobalRegistry(), (r = (n = window.$flexillaInstances[e]) == null ? void 0 : n.find(
439
439
  (s) => s.element === t
440
- )) == null ? void 0 : o.instance;
440
+ )) == null ? void 0 : r.instance;
441
441
  }
442
442
  static removeInstance(e, t) {
443
443
  this.initGlobalRegistry(), window.$flexillaInstances[e] && (window.$flexillaInstances[e] = window.$flexillaInstances[e].filter(
444
- (i) => i.element !== t
444
+ (n) => n.element !== t
445
445
  ));
446
446
  }
447
447
  };
448
- var ge = {
448
+ var fe = {
449
449
  teleport: true,
450
450
  teleportMode: "move"
451
451
  };
452
- var O = class O2 {
452
+ var S = class S2 {
453
453
  /**
454
454
  * Creates a new Dropdown instance
455
455
  * @param dropdown - The dropdown content element or selector
@@ -464,6 +464,7 @@
464
464
  a(this, "OverlayInstance");
465
465
  a(this, "navigationKeys");
466
466
  a(this, "keyObserver");
467
+ a(this, "subtriggerObserver");
467
468
  a(this, "triggerStrategy");
468
469
  a(this, "placement");
469
470
  a(this, "offsetDistance");
@@ -472,20 +473,35 @@
472
473
  a(this, "defaultState");
473
474
  a(this, "experimentalOptions");
474
475
  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, {
476
+ a(this, "updateSubtriggerAttr", (e2, t2) => {
477
+ t2 === "add" ? (e2.setAttribute("data-current-subtrigger", ""), e2.setAttribute("data-focus", "active")) : (e2.removeAttribute("data-current-subtrigger"), e2.removeAttribute("data-focus"));
478
+ });
479
+ a(this, "updateObserverFor", (e2) => {
480
+ const t2 = O("[data-dropdown-trigger]", this.contentElement);
481
+ for (const n2 of t2)
482
+ e2.observe(n2, {
482
483
  attributes: true,
483
484
  attributeFilter: ["aria-expanded"]
484
485
  });
485
486
  });
487
+ a(this, "observeEl", () => {
488
+ this.keyObserver = new MutationObserver((e2) => {
489
+ for (const t2 of e2)
490
+ t2.type === "attributes" && t2.attributeName === "aria-expanded" && (t2.target.getAttribute("aria-expanded") === "true" ? this.navigationKeys.destroy() : this.contentElement.dataset.state === "open" && this.navigationKeys.make());
491
+ }), this.updateObserverFor(this.keyObserver);
492
+ });
493
+ a(this, "observeSubtriggers", () => {
494
+ this.subtriggerObserver = new MutationObserver((e2) => {
495
+ for (const t2 of e2)
496
+ if (t2.type === "attributes" && t2.attributeName === "aria-expanded") {
497
+ const n2 = t2.target, r2 = n2.getAttribute("aria-expanded");
498
+ this.updateSubtriggerAttr(n2, r2 === "true" ? "add" : "remove");
499
+ }
500
+ }), this.updateObserverFor(this.subtriggerObserver);
501
+ });
486
502
  a(this, "onToggle", ({ isHidden: e2 }) => {
487
- var t2, i2;
488
- (i2 = (t2 = this.options).onToggle) == null || i2.call(t2, { isHidden: e2 });
503
+ var t2, n2;
504
+ (n2 = (t2 = this.options).onToggle) == null || n2.call(t2, { isHidden: e2 });
489
505
  });
490
506
  a(this, "moveElOnInit", () => {
491
507
  this.experimentalOptions.teleport && (this.experimentalOptions.teleportMode === "detachable" ? this.teleporter.remove() : this.teleporter.append());
@@ -497,29 +513,54 @@
497
513
  this.experimentalOptions.teleport && this.experimentalOptions.teleportMode === "detachable" && this.teleporter.append();
498
514
  });
499
515
  a(this, "beforeShow", () => {
500
- this.restoreEl(), this.contentElement.focus(), this.navigationKeys.make();
516
+ this.restoreEl(), this.contentElement.focus(), this.navigationKeys.make(), this.addArrowEvent();
501
517
  });
502
518
  a(this, "beforeHide", () => {
503
- this.contentElement.blur(), this.navigationKeys.destroy();
519
+ this.contentElement.blur(), this.navigationKeys.destroy(), this.removeArrowEvent();
520
+ });
521
+ a(this, "showHideOnArrow", (e2) => {
522
+ e2.preventDefault();
523
+ const t2 = e2.key, n2 = document.activeElement;
524
+ if (n2 != null && n2.hasAttribute("data-dropdown-trigger"))
525
+ switch (t2) {
526
+ case "ArrowRight":
527
+ n2.getAttribute("aria-expanded") !== "true" && (n2.click(), this.updateSubtriggerAttr(n2, "add"));
528
+ break;
529
+ case "ArrowLeft":
530
+ n2.getAttribute("aria-expanded") === "true" && (n2.click(), this.updateSubtriggerAttr(n2, "remove"));
531
+ break;
532
+ default:
533
+ return;
534
+ }
535
+ if (this.triggerElement.hasAttribute("data-current-subtrigger"))
536
+ switch (t2) {
537
+ case "ArrowLeft":
538
+ this.triggerElement.click(), this.triggerElement.focus(), this.updateSubtriggerAttr(this.triggerElement, "remove");
539
+ break;
540
+ default:
541
+ return;
542
+ }
543
+ });
544
+ a(this, "addArrowEvent", () => {
545
+ document.addEventListener("keydown", this.showHideOnArrow);
546
+ });
547
+ a(this, "removeArrowEvent", () => {
548
+ document.removeEventListener("keydown", this.showHideOnArrow);
504
549
  });
505
550
  a(this, "onShow", () => {
506
551
  var e2, t2;
507
552
  K(this.contentElement, "dropdown-show", {
508
553
  isHidden: false
509
- }), (t2 = (e2 = this.options).onShow) == null || t2.call(e2);
554
+ }), (t2 = (e2 = this.options).onShow) == null || t2.call(e2), this.observeEl(), this.observeSubtriggers();
510
555
  });
511
556
  a(this, "onHide", () => {
512
557
  var e2, t2;
513
558
  K(this.contentElement, "dropdown-hide", {
514
559
  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();
560
+ }), (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
561
  });
562
+ a(this, "show", () => this.OverlayInstance.show());
563
+ a(this, "hide", () => this.OverlayInstance.hide());
523
564
  a(this, "setShowOptions", ({ placement: e2, offsetDistance: t2 }) => {
524
565
  this.OverlayInstance.setShowOptions({ placement: e2, offsetDistance: t2 });
525
566
  });
@@ -530,26 +571,26 @@
530
571
  this.OverlayInstance.setPopperTrigger(e2, t2);
531
572
  });
532
573
  a(this, "disconnectObserver", () => {
533
- this.keyObserver && this.keyObserver.disconnect();
574
+ this.keyObserver && this.keyObserver.disconnect(), this.subtriggerObserver && this.subtriggerObserver.disconnect();
534
575
  });
535
576
  a(this, "cleanup", () => {
536
577
  this.disconnectObserver(), this.OverlayInstance.cleanup(), T.removeInstance("dropdown", this.contentElement);
537
578
  });
538
- const i = typeof e == "string" ? P(e) : e;
539
- if (!(i instanceof HTMLElement))
579
+ const n = typeof e == "string" ? P(e) : e;
580
+ if (!(n instanceof HTMLElement))
540
581
  throw new Error(
541
582
  "Invalid dropdown content element: Must provide either a valid HTMLElement or a selector string that resolves to an existing HTMLElement"
542
583
  );
543
- if (!i.id)
584
+ if (!n.id)
544
585
  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;
586
+ this.contentElement = n;
587
+ const r = T.getInstance("dropdown", this.contentElement);
588
+ if (r)
589
+ return r;
549
590
  const s = `[data-dropdown-trigger][data-dropdown-id=${this.contentElement.id}]`;
550
591
  if (this.triggerElement = P(s), !(this.triggerElement instanceof HTMLElement))
551
592
  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({
593
+ 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({
553
594
  trigger: this.triggerElement,
554
595
  content: this.contentElement,
555
596
  options: {
@@ -560,19 +601,23 @@
560
601
  preventCloseFromInside: this.preventFromCloseInside,
561
602
  defaultState: this.defaultState,
562
603
  beforeShow: this.beforeShow,
563
- beforeHide: this.beforeHide,
604
+ beforeHide: () => {
605
+ if (O("[data-dropdown-trigger][aria-expanded=true]", this.contentElement).length >= 1)
606
+ return { cancelAction: true };
607
+ this.beforeHide();
608
+ },
564
609
  onShow: this.onShow,
565
610
  onHide: this.onHide,
566
- onToggle: ({ isHidden: r }) => {
567
- this.onToggle({ isHidden: r });
611
+ onToggle: ({ isHidden: o }) => {
612
+ this.onToggle({ isHidden: o });
568
613
  },
569
614
  popper: this.options.popper
570
615
  }
571
- }), this.moveElOnInit(), this.items = W("a:not([disabled]), button:not([disabled])", this.contentElement), this.navigationKeys = me({
616
+ }), this.moveElOnInit(), this.items = O("a:not([disabled]), button:not([disabled])", this.contentElement), this.navigationKeys = me({
572
617
  containerElement: this.contentElement,
573
618
  targetChildren: this.items,
574
619
  direction: "up-down"
575
- }), this.observeEl(), T.register("dropdown", this.contentElement, this);
620
+ }), T.register("dropdown", this.contentElement, this);
576
621
  }
577
622
  /**
578
623
  * Initializes a single dropdown instance
@@ -581,15 +626,15 @@
581
626
  * @returns A new Dropdown instance
582
627
  */
583
628
  static init(e, t = {}) {
584
- new O2(e, t);
629
+ new S2(e, t);
585
630
  }
586
631
  };
587
- a(O, "autoInit", (e = "[data-fx-dropdown]") => {
588
- const t = W(e);
589
- for (const i of t)
590
- new O(i);
632
+ a(S, "autoInit", (e = "[data-fx-dropdown]") => {
633
+ const t = O(e);
634
+ for (const n of t)
635
+ new S(n);
591
636
  });
592
- var z = O;
637
+ var z = S;
593
638
 
594
639
  // src/index.js
595
640
  function Dropdown(Alpine) {