@flexilla/alpine-dropdown 0.1.0 → 0.1.1

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