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