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