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