@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 +254 -181
- package/dist/cdn.min.js +1 -1
- package/dist/module.cjs.js +254 -181
- package/dist/module.esm.js +254 -181
- package/package.json +3 -3
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
|
|
8
|
-
var
|
|
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:
|
|
11
|
-
if (!
|
|
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(),
|
|
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:
|
|
18
|
-
refWidth:
|
|
19
|
-
refLeft:
|
|
20
|
-
refTop:
|
|
21
|
-
refRight:
|
|
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 = (
|
|
25
|
-
const o = t,
|
|
26
|
-
return o >= (
|
|
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 = (
|
|
29
|
-
var Q = (
|
|
30
|
-
var Z = (
|
|
31
|
-
var _ = (
|
|
32
|
-
var ee = (
|
|
33
|
-
const r = o - t -
|
|
34
|
-
return
|
|
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 = (
|
|
37
|
-
var ne = (
|
|
38
|
-
var
|
|
39
|
-
placement:
|
|
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:
|
|
42
|
+
refLeft: i,
|
|
43
43
|
refHeight: o,
|
|
44
|
-
popperWidth:
|
|
44
|
+
popperWidth: s,
|
|
45
45
|
popperHeight: r,
|
|
46
|
-
windowHeight:
|
|
47
|
-
windowWidth:
|
|
48
|
-
offsetDistance:
|
|
46
|
+
windowHeight: l,
|
|
47
|
+
windowWidth: m,
|
|
48
|
+
offsetDistance: c
|
|
49
49
|
}) => {
|
|
50
|
-
const
|
|
51
|
-
() => _(t, o, r,
|
|
52
|
-
() => Z(t, o, r,
|
|
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
|
-
),
|
|
57
|
-
() => te(
|
|
58
|
-
() => ne(
|
|
59
|
-
n,
|
|
56
|
+
), b = () => ee(
|
|
57
|
+
() => te(i, m, s, e),
|
|
58
|
+
() => ne(i, s),
|
|
60
59
|
i,
|
|
61
|
-
|
|
60
|
+
s,
|
|
61
|
+
m,
|
|
62
62
|
e
|
|
63
|
-
),
|
|
64
|
-
let u = 0,
|
|
65
|
-
const
|
|
66
|
-
switch (
|
|
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 =
|
|
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
|
-
|
|
77
|
+
v = x();
|
|
78
78
|
break;
|
|
79
79
|
case "bottom-start":
|
|
80
80
|
case "top-start":
|
|
81
|
-
u =
|
|
81
|
+
u = H();
|
|
82
82
|
break;
|
|
83
83
|
case "bottom-end":
|
|
84
84
|
case "top-end":
|
|
85
|
-
u =
|
|
85
|
+
u = S();
|
|
86
86
|
break;
|
|
87
87
|
case "left-start":
|
|
88
88
|
case "right-start":
|
|
89
|
-
|
|
89
|
+
v = L();
|
|
90
90
|
break;
|
|
91
91
|
case "left-end":
|
|
92
92
|
case "right-end":
|
|
93
|
-
|
|
93
|
+
v = U();
|
|
94
94
|
break;
|
|
95
95
|
}
|
|
96
|
-
return { x: u, y:
|
|
96
|
+
return { x: u, y: v };
|
|
97
97
|
};
|
|
98
|
-
var
|
|
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,
|
|
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", (
|
|
126
|
-
this.popper.style.setProperty("--fx-popper-placement-x", `${
|
|
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
|
|
130
|
+
var p;
|
|
131
131
|
this.validateElements(), this.setInitialStyles();
|
|
132
|
-
const
|
|
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:
|
|
136
|
-
refTop:
|
|
137
|
-
refLeft:
|
|
135
|
+
refWidth: M,
|
|
136
|
+
refTop: H,
|
|
137
|
+
refLeft: x,
|
|
138
138
|
popperWidth: w,
|
|
139
|
-
refHeight:
|
|
140
|
-
popperHeight:
|
|
141
|
-
windowHeight:
|
|
142
|
-
windowWidth:
|
|
139
|
+
refHeight: b,
|
|
140
|
+
popperHeight: f,
|
|
141
|
+
windowHeight: E,
|
|
142
|
+
windowWidth: g,
|
|
143
143
|
offsetDistance: this.offsetDistance
|
|
144
144
|
}
|
|
145
145
|
);
|
|
146
|
-
this.setPopperStyleProperty(
|
|
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:
|
|
160
|
+
placement: s = V,
|
|
161
161
|
eventEffect: r = {},
|
|
162
|
-
onUpdate:
|
|
163
|
-
} =
|
|
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 (
|
|
168
|
+
if (i.offsetDistance && typeof i.offsetDistance != "number")
|
|
169
169
|
throw new Error("OffsetDistance must be a number");
|
|
170
|
-
const { disableOnResize:
|
|
171
|
-
this.isWindowEventsRegistered = false, this.reference = e, this.popper = t, this.offsetDistance = o, this.placement =
|
|
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 = (
|
|
186
|
-
var
|
|
187
|
-
var ae = (
|
|
188
|
-
var
|
|
189
|
-
for (const [t,
|
|
190
|
-
|
|
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:
|
|
193
|
+
element: n,
|
|
194
194
|
callback: e,
|
|
195
195
|
type: t,
|
|
196
|
-
keysCheck:
|
|
196
|
+
keysCheck: i
|
|
197
197
|
}) => {
|
|
198
|
-
const o = getComputedStyle(
|
|
199
|
-
if (
|
|
200
|
-
const r = "transitionend",
|
|
201
|
-
|
|
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
|
-
|
|
203
|
+
n.addEventListener(r, l, { once: true });
|
|
204
204
|
} else
|
|
205
205
|
e();
|
|
206
206
|
};
|
|
207
207
|
var he = ({
|
|
208
|
-
element:
|
|
208
|
+
element: n,
|
|
209
209
|
callback: e
|
|
210
210
|
}) => {
|
|
211
211
|
le({
|
|
212
|
-
element:
|
|
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
|
|
219
|
-
const
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
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:
|
|
235
|
-
|
|
236
|
-
this.contentElement.getAttribute("data-state") === "open" && (!this.triggerElement.contains(
|
|
237
|
-
}),
|
|
238
|
-
|
|
239
|
-
}),
|
|
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
|
-
}),
|
|
245
|
+
}), h(this, "hideOnMouseLeaseTrigger", () => {
|
|
242
246
|
setTimeout(() => {
|
|
243
247
|
this.contentElement.matches(":hover") || this.hide();
|
|
244
248
|
}, 150);
|
|
245
|
-
}),
|
|
249
|
+
}), h(this, "hideOnMouseLeave", () => {
|
|
246
250
|
setTimeout(() => {
|
|
247
251
|
this.triggerElement.matches(":hover") || this.hide();
|
|
248
252
|
}, 150);
|
|
249
|
-
}),
|
|
253
|
+
}), h(this, "addEventOnMouseEnter", () => {
|
|
250
254
|
this.triggerElement.addEventListener("mouseleave", this.hideOnMouseLeaseTrigger), this.contentElement.addEventListener("mouseleave", this.hideOnMouseLeave);
|
|
251
|
-
}),
|
|
255
|
+
}), h(this, "showOnMouseEnter", () => {
|
|
252
256
|
this.show(), this.addEventOnMouseEnter();
|
|
253
|
-
}),
|
|
254
|
-
var
|
|
257
|
+
}), h(this, "setShowOptions", ({ placement: s, offsetDistance: r }) => {
|
|
258
|
+
var l, m, c, p;
|
|
255
259
|
this.popper.setOptions({
|
|
256
|
-
placement:
|
|
260
|
+
placement: s,
|
|
257
261
|
offsetDistance: r
|
|
258
|
-
}), document.addEventListener("keydown", this.handleKeyDown), document.addEventListener("click", this.handleDocumentClick), (
|
|
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), (
|
|
263
|
-
}),
|
|
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:
|
|
269
|
+
placement: s,
|
|
266
270
|
offsetDistance: r || this.offsetDistance
|
|
267
271
|
});
|
|
268
|
-
}),
|
|
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 =
|
|
273
|
-
}),
|
|
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 =
|
|
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,
|
|
293
|
-
(
|
|
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,
|
|
301
|
-
this.popper.updatePosition(), document.addEventListener("keydown", this.handleKeyDown), document.addEventListener("click", this.handleDocumentClick), (t = (e = this.options).beforeShow) == null || t.call(e),
|
|
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 = (
|
|
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
|
-
|
|
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
|
|
321
|
-
this.onToggleState(true), this.popper.cleanupEvents(), (
|
|
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
|
-
|
|
337
|
+
y({
|
|
327
338
|
state: this.defaultState,
|
|
328
339
|
popper: this.contentElement,
|
|
329
340
|
trigger: this.triggerElement
|
|
330
|
-
}), this.defaultState === "open" ? this.show() :
|
|
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 = (
|
|
338
|
-
var
|
|
339
|
-
var
|
|
340
|
-
var
|
|
341
|
-
let
|
|
342
|
-
const o =
|
|
343
|
-
if (
|
|
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
|
|
346
|
-
let
|
|
347
|
-
if (
|
|
348
|
-
|
|
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
|
|
352
|
-
switch (
|
|
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
|
-
|
|
365
|
+
l.preventDefault(), p = E(p);
|
|
355
366
|
break;
|
|
356
367
|
case "ArrowRight":
|
|
357
368
|
break;
|
|
358
369
|
case "ArrowUp":
|
|
359
|
-
|
|
370
|
+
l.preventDefault(), p = g(p);
|
|
360
371
|
break;
|
|
361
372
|
case "ArrowLeft":
|
|
362
373
|
break;
|
|
363
374
|
case "Home":
|
|
364
|
-
|
|
375
|
+
l.preventDefault(), p = 0;
|
|
365
376
|
break;
|
|
366
377
|
case "End":
|
|
367
|
-
|
|
378
|
+
l.preventDefault(), p = s.length - 1;
|
|
368
379
|
break;
|
|
369
380
|
default:
|
|
370
381
|
return;
|
|
371
382
|
}
|
|
372
|
-
|
|
383
|
+
s[p] !== c && s[p].focus();
|
|
373
384
|
};
|
|
374
385
|
return {
|
|
375
386
|
make: () => {
|
|
376
|
-
|
|
387
|
+
i || (document.addEventListener("keydown", r), i = true);
|
|
377
388
|
},
|
|
378
389
|
destroy: () => {
|
|
379
|
-
|
|
390
|
+
i && (document.removeEventListener("keydown", r), i = false);
|
|
380
391
|
}
|
|
381
392
|
};
|
|
382
393
|
};
|
|
383
|
-
var
|
|
384
|
-
const
|
|
385
|
-
|
|
394
|
+
var K = (n, e, t) => {
|
|
395
|
+
const i = new CustomEvent(e, { detail: t });
|
|
396
|
+
n.dispatchEvent(i);
|
|
386
397
|
};
|
|
387
|
-
|
|
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,
|
|
392
|
-
return this.initGlobalRegistry(), window.$flexillaInstances[e] || (window.$flexillaInstances[e] = []), this.getInstance(e, t) || (window.$flexillaInstances[e].push({ element: t, instance:
|
|
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
|
|
396
|
-
return this.initGlobalRegistry(), (o = (
|
|
397
|
-
(
|
|
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
|
-
(
|
|
444
|
+
(i) => i.element !== t
|
|
403
445
|
));
|
|
404
446
|
}
|
|
405
447
|
};
|
|
406
|
-
var
|
|
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,
|
|
427
|
-
(
|
|
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
|
-
|
|
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
|
-
|
|
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(),
|
|
536
|
+
this.disconnectObserver(), this.OverlayInstance.cleanup(), T.removeInstance("dropdown", this.contentElement);
|
|
464
537
|
});
|
|
465
|
-
const
|
|
466
|
-
if (!(
|
|
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 (!
|
|
543
|
+
if (!i.id)
|
|
471
544
|
throw new Error("Dropdown content element must have an 'id' attribute for trigger association");
|
|
472
|
-
this.contentElement =
|
|
473
|
-
const o =
|
|
545
|
+
this.contentElement = i;
|
|
546
|
+
const o = T.getInstance("dropdown", this.contentElement);
|
|
474
547
|
if (o)
|
|
475
548
|
return o;
|
|
476
|
-
const
|
|
477
|
-
if (this.triggerElement = P(
|
|
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 =
|
|
571
|
+
}), this.moveElOnInit(), this.items = W("a:not([disabled]), button:not([disabled])", this.contentElement), this.navigationKeys = me({
|
|
499
572
|
containerElement: this.contentElement,
|
|
500
|
-
targetChildren:
|
|
573
|
+
targetChildren: this.items,
|
|
501
574
|
direction: "up-down"
|
|
502
|
-
}),
|
|
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
|
|
584
|
+
new O2(e, t);
|
|
512
585
|
}
|
|
513
586
|
};
|
|
514
|
-
a(
|
|
515
|
-
const t =
|
|
516
|
-
for (const
|
|
517
|
-
new
|
|
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
|
|
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
|
|
597
|
+
const dropdown_ = new z(el);
|
|
525
598
|
cleanup(() => {
|
|
526
599
|
dropdown_.cleanup();
|
|
527
600
|
});
|