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