@flexilla/alpine-dropdown 0.1.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cdn.js +261 -199
- package/dist/cdn.min.js +1 -1
- package/dist/module.cjs.js +261 -199
- package/dist/module.esm.js +261 -199
- package/package.json +3 -3
package/dist/cdn.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
(() => {
|
|
2
2
|
// ../../node_modules/@flexilla/dropdown/dist/dropdown.js
|
|
3
3
|
var B = Object.defineProperty;
|
|
4
|
-
var j = (
|
|
5
|
-
var a = (
|
|
6
|
-
var
|
|
7
|
-
var
|
|
8
|
-
var
|
|
4
|
+
var j = (i, e, t) => e in i ? B(i, e, { enumerable: true, configurable: true, writable: true, value: t }) : i[e] = t;
|
|
5
|
+
var a = (i, e, t) => j(i, typeof e != "symbol" ? e + "" : e, t);
|
|
6
|
+
var q = Object.defineProperty;
|
|
7
|
+
var G = (i, e, t) => e in i ? q(i, e, { enumerable: true, configurable: true, writable: true, value: t }) : i[e] = t;
|
|
8
|
+
var p = (i, e, t) => G(i, typeof e != "symbol" ? e + "" : e, t);
|
|
9
9
|
var V = "bottom";
|
|
10
|
-
var X = ({ reference:
|
|
11
|
-
if (!
|
|
10
|
+
var X = ({ reference: i, popper: e }) => {
|
|
11
|
+
if (!i || !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(), n = (o) => (t.has(o) || t.set(o, o.getBoundingClientRect()), t.get(o)), r = n(e), s = n(i);
|
|
14
14
|
return {
|
|
15
|
-
popperHeight:
|
|
16
|
-
popperWidth:
|
|
15
|
+
popperHeight: r.height,
|
|
16
|
+
popperWidth: r.width,
|
|
17
17
|
refHeight: s.height,
|
|
18
18
|
refWidth: s.width,
|
|
19
19
|
refLeft: s.left,
|
|
@@ -21,49 +21,49 @@
|
|
|
21
21
|
refRight: s.right
|
|
22
22
|
};
|
|
23
23
|
};
|
|
24
|
-
var Y = (
|
|
25
|
-
const
|
|
26
|
-
return
|
|
24
|
+
var Y = (i, e, t, n) => {
|
|
25
|
+
const r = t, s = n - (t + e);
|
|
26
|
+
return r >= (i - e) / 2 && s >= (i - e) / 2;
|
|
27
27
|
};
|
|
28
|
-
var J = (
|
|
29
|
-
var Q = (
|
|
30
|
-
var Z = (
|
|
31
|
-
var _ = (
|
|
32
|
-
var ee = (
|
|
33
|
-
const
|
|
34
|
-
return
|
|
28
|
+
var J = (i, e, t, n) => (i - e) / 2 <= t && t + i / 2 + e / 2 <= n;
|
|
29
|
+
var Q = (i, e, t, n, r) => t > r - n ? e() ? window.innerHeight - r : t - r : i() ? 0 : t + n;
|
|
30
|
+
var Z = (i, e, t, n) => i <= n && t - i <= e;
|
|
31
|
+
var _ = (i, e, t, n) => t <= n && -i <= e;
|
|
32
|
+
var ee = (i, e, t, n, r, s) => {
|
|
33
|
+
const o = r - t - s, l = t - n, m = t + s - n + (r - t - s), c = o >= 0 ? r - n : l >= 0 ? t - n : t;
|
|
34
|
+
return i() ? 0 : e() ? m : c;
|
|
35
35
|
};
|
|
36
|
-
var te = (
|
|
37
|
-
var ne = (
|
|
36
|
+
var te = (i, e, t, n) => i <= t && e - i - n >= i;
|
|
37
|
+
var ne = (i, e) => i >= e;
|
|
38
38
|
var ie = ({
|
|
39
|
-
placement:
|
|
39
|
+
placement: i,
|
|
40
40
|
refWidth: e,
|
|
41
41
|
refTop: t,
|
|
42
|
-
refLeft:
|
|
43
|
-
refHeight:
|
|
42
|
+
refLeft: n,
|
|
43
|
+
refHeight: r,
|
|
44
44
|
popperWidth: s,
|
|
45
|
-
popperHeight:
|
|
45
|
+
popperHeight: o,
|
|
46
46
|
windowHeight: l,
|
|
47
47
|
windowWidth: m,
|
|
48
48
|
offsetDistance: c
|
|
49
49
|
}) => {
|
|
50
|
-
const
|
|
51
|
-
() => _(t,
|
|
52
|
-
() => Z(t,
|
|
50
|
+
const d = m - n - e, f = n, E = l - t - r, g = t, w = () => Q(
|
|
51
|
+
() => _(t, r, o, l),
|
|
52
|
+
() => Z(t, r, o, l),
|
|
53
53
|
t,
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
r,
|
|
55
|
+
o
|
|
56
56
|
), b = () => ee(
|
|
57
|
-
() => te(
|
|
58
|
-
() => ne(
|
|
59
|
-
|
|
57
|
+
() => te(n, m, s, e),
|
|
58
|
+
() => ne(n, s),
|
|
59
|
+
n,
|
|
60
60
|
s,
|
|
61
61
|
m,
|
|
62
62
|
e
|
|
63
|
-
), M = () => Y(s, e,
|
|
63
|
+
), M = () => Y(s, e, n, m) ? n + e / 2 - s / 2 : b(), A = () => J(o, r, t, l) ? t + r / 2 - o / 2 : w(), C = () => n + s <= m ? n : b(), L = () => n + e - s >= 0 ? n + e - s : b(), x = () => t + o <= l ? t : w(), U = () => t + r - o >= 0 ? t + r - o : w();
|
|
64
64
|
let u = 0, v = 0;
|
|
65
|
-
const
|
|
66
|
-
switch (
|
|
65
|
+
const T = t - o - c, I = t + r + c, D = n - s - c, H = n + e + c, P = g >= o + c, W = E >= o + c, R = f >= s + c, $ = d >= s + c;
|
|
66
|
+
switch (i.startsWith("top") ? v = P ? T : W ? I : Math.max(T, I) : i.startsWith("bottom") ? v = W ? I : P ? T : Math.max(I) : i.startsWith("left") ? u = R ? D : $ ? H : Math.max(D, H) : i.startsWith("right") && (u = $ ? H : R ? D : Math.max(H, D)), i) {
|
|
67
67
|
case "bottom":
|
|
68
68
|
case "bottom-middle":
|
|
69
69
|
case "top":
|
|
@@ -74,19 +74,19 @@
|
|
|
74
74
|
case "left-middle":
|
|
75
75
|
case "right":
|
|
76
76
|
case "right-middle":
|
|
77
|
-
v =
|
|
77
|
+
v = A();
|
|
78
78
|
break;
|
|
79
79
|
case "bottom-start":
|
|
80
80
|
case "top-start":
|
|
81
|
-
u =
|
|
81
|
+
u = C();
|
|
82
82
|
break;
|
|
83
83
|
case "bottom-end":
|
|
84
84
|
case "top-end":
|
|
85
|
-
u =
|
|
85
|
+
u = L();
|
|
86
86
|
break;
|
|
87
87
|
case "left-start":
|
|
88
88
|
case "right-start":
|
|
89
|
-
v =
|
|
89
|
+
v = x();
|
|
90
90
|
break;
|
|
91
91
|
case "left-end":
|
|
92
92
|
case "right-end":
|
|
@@ -114,61 +114,61 @@
|
|
|
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,
|
|
118
|
-
|
|
117
|
+
constructor(e, t, n = {}) {
|
|
118
|
+
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", () => {
|
|
119
119
|
if (!(this.reference instanceof HTMLElement))
|
|
120
120
|
throw new Error("Invalid HTMLElement for Reference Element");
|
|
121
121
|
if (!(this.popper instanceof HTMLElement))
|
|
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
|
-
}),
|
|
126
|
-
this.popper.style.setProperty("--fx-popper-placement-x", `${
|
|
127
|
-
}),
|
|
125
|
+
}), p(this, "setPopperStyleProperty", (d, f) => {
|
|
126
|
+
this.popper.style.setProperty("--fx-popper-placement-x", `${d}px`), this.popper.style.setProperty("--fx-popper-placement-y", `${f}px`);
|
|
127
|
+
}), p(this, "setInitialStyles", () => {
|
|
128
128
|
this.popper.style.setProperty("--fx-popper-placement-x", ""), this.popper.style.setProperty("--fx-popper-placement-y", "");
|
|
129
|
-
}),
|
|
130
|
-
var
|
|
129
|
+
}), p(this, "initPlacement", () => {
|
|
130
|
+
var d;
|
|
131
131
|
this.validateElements(), this.setInitialStyles();
|
|
132
|
-
const
|
|
132
|
+
const f = window.innerWidth, E = window.innerHeight, { popperHeight: g, popperWidth: w, refHeight: b, refWidth: M, refLeft: A, refTop: C } = X({ reference: this.reference, popper: this.popper }), { x: L, y: x } = ie(
|
|
133
133
|
{
|
|
134
134
|
placement: this.placement,
|
|
135
135
|
refWidth: M,
|
|
136
|
-
refTop:
|
|
137
|
-
refLeft:
|
|
136
|
+
refTop: C,
|
|
137
|
+
refLeft: A,
|
|
138
138
|
popperWidth: w,
|
|
139
139
|
refHeight: b,
|
|
140
|
-
popperHeight:
|
|
140
|
+
popperHeight: g,
|
|
141
141
|
windowHeight: E,
|
|
142
|
-
windowWidth:
|
|
142
|
+
windowWidth: f,
|
|
143
143
|
offsetDistance: this.offsetDistance
|
|
144
144
|
}
|
|
145
145
|
);
|
|
146
|
-
this.setPopperStyleProperty(
|
|
147
|
-
}),
|
|
146
|
+
this.setPopperStyleProperty(L, x), (d = this.onUpdate) == null || d.call(this, { x: L, y: x, placement: this.placement });
|
|
147
|
+
}), p(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
|
+
}), p(this, "attachWindowEvent", () => {
|
|
150
150
|
this.isWindowEventsRegistered && this.removeWindowEvents(), this.disableOnResize || window.addEventListener("resize", this.updatePosition), this.disableOnScroll || window.addEventListener("scroll", this.updatePosition), this.isWindowEventsRegistered = true;
|
|
151
|
-
}),
|
|
151
|
+
}), p(this, "resetPosition", () => {
|
|
152
152
|
this.setInitialStyles();
|
|
153
|
-
}),
|
|
153
|
+
}), p(this, "updatePosition", () => {
|
|
154
154
|
this.initPlacement(), this.attachWindowEvent();
|
|
155
|
-
}),
|
|
155
|
+
}), p(this, "cleanupEvents", () => {
|
|
156
156
|
this.setInitialStyles(), this.removeWindowEvents();
|
|
157
157
|
});
|
|
158
158
|
const {
|
|
159
|
-
offsetDistance:
|
|
159
|
+
offsetDistance: r = 10,
|
|
160
160
|
placement: s = V,
|
|
161
|
-
eventEffect:
|
|
161
|
+
eventEffect: o = {},
|
|
162
162
|
onUpdate: l
|
|
163
|
-
} =
|
|
163
|
+
} = n;
|
|
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 (n.offsetDistance && typeof n.offsetDistance != "number")
|
|
169
169
|
throw new Error("OffsetDistance must be a number");
|
|
170
|
-
const { disableOnResize: m, disableOnScroll: c } =
|
|
171
|
-
this.isWindowEventsRegistered = false, this.reference = e, this.popper = t, this.offsetDistance =
|
|
170
|
+
const { disableOnResize: m, disableOnScroll: c } = o;
|
|
171
|
+
this.isWindowEventsRegistered = false, this.reference = e, this.popper = t, this.offsetDistance = r, this.placement = s, this.disableOnResize = m || false, this.disableOnScroll = c || false, this.onUpdate = l;
|
|
172
172
|
}
|
|
173
173
|
/**
|
|
174
174
|
* Updates popper configuration and recalculates position
|
|
@@ -181,50 +181,50 @@
|
|
|
181
181
|
this.placement = e, this.offsetDistance = t || this.offsetDistance, this.initPlacement(), this.attachWindowEvent();
|
|
182
182
|
}
|
|
183
183
|
};
|
|
184
|
-
var
|
|
185
|
-
var
|
|
186
|
-
var h = (
|
|
187
|
-
var ae = (
|
|
188
|
-
var N = (
|
|
189
|
-
for (const [t,
|
|
190
|
-
|
|
184
|
+
var re = Object.defineProperty;
|
|
185
|
+
var oe = (i, e, t) => e in i ? re(i, e, { enumerable: true, configurable: true, writable: true, value: t }) : i[e] = t;
|
|
186
|
+
var h = (i, e, t) => oe(i, typeof e != "symbol" ? e + "" : e, t);
|
|
187
|
+
var ae = (i, e = document.body) => e.querySelector(i);
|
|
188
|
+
var N = (i, e) => {
|
|
189
|
+
for (const [t, n] of Object.entries(e))
|
|
190
|
+
i.setAttribute(t, n);
|
|
191
191
|
};
|
|
192
192
|
var le = ({
|
|
193
|
-
element:
|
|
193
|
+
element: i,
|
|
194
194
|
callback: e,
|
|
195
195
|
type: t,
|
|
196
|
-
keysCheck:
|
|
196
|
+
keysCheck: n
|
|
197
197
|
}) => {
|
|
198
|
-
const
|
|
199
|
-
if (s !== "none" && s !== "" && !
|
|
200
|
-
const
|
|
201
|
-
|
|
198
|
+
const r = getComputedStyle(i), s = r.transition;
|
|
199
|
+
if (s !== "none" && s !== "" && !n.includes(s)) {
|
|
200
|
+
const o = "transitionend", l = () => {
|
|
201
|
+
i.removeEventListener(o, l), e();
|
|
202
202
|
};
|
|
203
|
-
|
|
203
|
+
i.addEventListener(o, l, { once: true });
|
|
204
204
|
} else
|
|
205
205
|
e();
|
|
206
206
|
};
|
|
207
207
|
var he = ({
|
|
208
|
-
element:
|
|
208
|
+
element: i,
|
|
209
209
|
callback: e
|
|
210
210
|
}) => {
|
|
211
211
|
le({
|
|
212
|
-
element:
|
|
212
|
+
element: i,
|
|
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
|
-
|
|
218
|
+
var de = (i, e, t) => {
|
|
219
|
+
const n = new CustomEvent(e, { detail: t });
|
|
220
|
+
i.dispatchEvent(n);
|
|
221
221
|
};
|
|
222
|
-
var y = ({ state:
|
|
223
|
-
const
|
|
222
|
+
var y = ({ state: i, trigger: e, popper: t }) => {
|
|
223
|
+
const n = i === "open";
|
|
224
224
|
N(t, {
|
|
225
|
-
"data-state":
|
|
225
|
+
"data-state": i
|
|
226
226
|
}), N(e, {
|
|
227
|
-
"aria-expanded": `${
|
|
227
|
+
"aria-expanded": `${n}`
|
|
228
228
|
});
|
|
229
229
|
};
|
|
230
230
|
var ce = class {
|
|
@@ -235,7 +235,7 @@
|
|
|
235
235
|
* @param {string | HTMLElement} params.content - The content element selector or HTMLElement
|
|
236
236
|
* @param {OverlayOptions} [params.options] - Configuration options for the overlay
|
|
237
237
|
*/
|
|
238
|
-
constructor({ trigger: e, content: t, options:
|
|
238
|
+
constructor({ trigger: e, content: t, options: n = {} }) {
|
|
239
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
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
241
|
}), h(this, "handleKeyDown", (s) => {
|
|
@@ -254,35 +254,35 @@
|
|
|
254
254
|
this.triggerElement.addEventListener("mouseleave", this.hideOnMouseLeaseTrigger), this.contentElement.addEventListener("mouseleave", this.hideOnMouseLeave);
|
|
255
255
|
}), h(this, "showOnMouseEnter", () => {
|
|
256
256
|
this.show(), this.addEventOnMouseEnter();
|
|
257
|
-
}), h(this, "setShowOptions", ({ placement: s, offsetDistance:
|
|
258
|
-
var l, m, c,
|
|
257
|
+
}), h(this, "setShowOptions", ({ placement: s, offsetDistance: o }) => {
|
|
258
|
+
var l, m, c, d;
|
|
259
259
|
this.popper.setOptions({
|
|
260
260
|
placement: s,
|
|
261
|
-
offsetDistance:
|
|
261
|
+
offsetDistance: o
|
|
262
262
|
}), document.addEventListener("keydown", this.handleKeyDown), document.addEventListener("click", this.handleDocumentClick), (m = (l = this.options).beforeShow) == null || m.call(l), y({
|
|
263
263
|
state: "open",
|
|
264
264
|
popper: this.contentElement,
|
|
265
265
|
trigger: this.triggerElement
|
|
266
|
-
}), this.onToggleState(false), (
|
|
267
|
-
}), h(this, "setPopperOptions", ({ placement: s, offsetDistance:
|
|
266
|
+
}), this.onToggleState(false), (d = (c = this.options).onShow) == null || d.call(c);
|
|
267
|
+
}), h(this, "setPopperOptions", ({ placement: s, offsetDistance: o }) => {
|
|
268
268
|
this.popper.setOptions({
|
|
269
269
|
placement: s,
|
|
270
|
-
offsetDistance:
|
|
270
|
+
offsetDistance: o || this.offsetDistance
|
|
271
271
|
});
|
|
272
|
-
}), h(this, "setPopperTrigger", (s,
|
|
272
|
+
}), h(this, "setPopperTrigger", (s, o) => {
|
|
273
273
|
this.cleanup(), this.popper.setOptions({
|
|
274
|
-
placement:
|
|
275
|
-
offsetDistance:
|
|
274
|
+
placement: o.placement || this.placement,
|
|
275
|
+
offsetDistance: o.offsetDistance || this.offsetDistance
|
|
276
276
|
}), this.triggerElement = s, this.triggerElement.addEventListener("click", this.toggleStateOnClick), this.triggerStrategy === "hover" && this.triggerElement.addEventListener("mouseenter", this.showOnMouseEnter);
|
|
277
277
|
}), h(this, "cleanup", () => {
|
|
278
278
|
this.triggerElement.removeEventListener("click", this.toggleStateOnClick), this.triggerStrategy === "hover" && this.triggerElement.removeEventListener("mouseenter", this.showOnMouseEnter);
|
|
279
279
|
});
|
|
280
|
-
var
|
|
280
|
+
var r;
|
|
281
281
|
if (this.contentElement = this.getElement(t), this.triggerElement = this.getElement(e), !(this.triggerElement instanceof HTMLElement))
|
|
282
282
|
throw new Error("Trigger element must be a valid HTML element");
|
|
283
283
|
if (!(this.contentElement instanceof HTMLElement))
|
|
284
284
|
throw new Error("Content element must be a valid HTML element");
|
|
285
|
-
this.options =
|
|
285
|
+
this.options = n, this.triggerStrategy = this.options.triggerStrategy || "click", this.placement = this.options.placement || "bottom", this.offsetDistance = this.options.offsetDistance || 6, this.preventFromCloseOutside = this.options.preventFromCloseOutside || false, this.preventFromCloseInside = this.options.preventCloseFromInside || false, this.defaultState = this.options.defaultState || "close", this.eventEffect = (r = this.options.popper) == null ? void 0 : r.eventEffect, this.popper = new se(
|
|
286
286
|
this.triggerElement,
|
|
287
287
|
this.contentElement,
|
|
288
288
|
{
|
|
@@ -293,43 +293,43 @@
|
|
|
293
293
|
), this.initInstance();
|
|
294
294
|
}
|
|
295
295
|
onToggleState(e) {
|
|
296
|
-
var t,
|
|
297
|
-
(
|
|
296
|
+
var t, n;
|
|
297
|
+
(n = (t = this.options).onToggle) == null || n.call(t, { isHidden: e });
|
|
298
298
|
}
|
|
299
299
|
/**
|
|
300
300
|
* Shows the overlay
|
|
301
301
|
* Positions the overlay, adds event listeners, and triggers related callbacks
|
|
302
302
|
*/
|
|
303
303
|
show() {
|
|
304
|
-
var e, t,
|
|
304
|
+
var e, t, n, r;
|
|
305
305
|
this.popper.updatePosition(), document.addEventListener("keydown", this.handleKeyDown), document.addEventListener("click", this.handleDocumentClick), (t = (e = this.options).beforeShow) == null || t.call(e), y({
|
|
306
306
|
state: "open",
|
|
307
307
|
popper: this.contentElement,
|
|
308
308
|
trigger: this.triggerElement
|
|
309
|
-
}), this.onToggleState(false), (
|
|
309
|
+
}), this.onToggleState(false), (r = (n = this.options).onShow) == null || r.call(n);
|
|
310
310
|
}
|
|
311
311
|
/**
|
|
312
312
|
* Hides the overlay
|
|
313
313
|
* Removes event listeners and triggers related callbacks
|
|
314
314
|
*/
|
|
315
315
|
hide() {
|
|
316
|
-
var e, t,
|
|
317
|
-
let
|
|
318
|
-
|
|
319
|
-
setExitAction: (
|
|
320
|
-
|
|
316
|
+
var e, t, n;
|
|
317
|
+
let r = false;
|
|
318
|
+
de(this.contentElement, "before-hide", {
|
|
319
|
+
setExitAction: (o) => {
|
|
320
|
+
r = o;
|
|
321
321
|
}
|
|
322
322
|
});
|
|
323
|
-
const s = (
|
|
324
|
-
|
|
323
|
+
const s = (n = (t = (e = this.options).beforeHide) == null ? void 0 : t.call(e)) == null ? void 0 : n.cancelAction;
|
|
324
|
+
r || s || (y({
|
|
325
325
|
state: "close",
|
|
326
326
|
popper: this.contentElement,
|
|
327
327
|
trigger: this.triggerElement
|
|
328
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({
|
|
329
329
|
element: this.contentElement,
|
|
330
330
|
callback: () => {
|
|
331
|
-
var
|
|
332
|
-
this.onToggleState(true), this.popper.cleanupEvents(), (l = (
|
|
331
|
+
var o, l;
|
|
332
|
+
this.onToggleState(true), this.popper.cleanupEvents(), (l = (o = this.options).onHide) == null || l.call(o);
|
|
333
333
|
}
|
|
334
334
|
}));
|
|
335
335
|
}
|
|
@@ -345,111 +345,125 @@
|
|
|
345
345
|
}), this.triggerElement.addEventListener("click", this.toggleStateOnClick), this.triggerStrategy === "hover" && this.triggerElement.addEventListener("mouseenter", this.showOnMouseEnter);
|
|
346
346
|
}
|
|
347
347
|
};
|
|
348
|
-
var
|
|
349
|
-
var
|
|
350
|
-
var
|
|
351
|
-
var me = ({ containerElement:
|
|
352
|
-
let
|
|
353
|
-
const
|
|
354
|
-
if (l.preventDefault(),
|
|
348
|
+
var F = (i, e = document.body) => e.querySelector(i);
|
|
349
|
+
var S = (i, e = document.body) => Array.from(e.querySelectorAll(i));
|
|
350
|
+
var pe = (i) => typeof i == "string" ? F(i) : i;
|
|
351
|
+
var me = ({ containerElement: i, targetChildren: e = "a:not([disabled]), button:not([disabled])", direction: t }) => {
|
|
352
|
+
let n = false;
|
|
353
|
+
const r = pe(i) || document.body, s = typeof e == "string" ? S(e, r) : e, o = (l) => {
|
|
354
|
+
if (l.preventDefault(), r.focus(), s.length === 0)
|
|
355
355
|
return;
|
|
356
356
|
const m = l.key, c = document.activeElement;
|
|
357
|
-
let
|
|
358
|
-
if (
|
|
357
|
+
let d = s.findIndex((g) => g === c);
|
|
358
|
+
if (d === -1) {
|
|
359
359
|
m === "ArrowUp" || m === "ArrowLeft" ? s[s.length - 1].focus() : s[0].focus();
|
|
360
360
|
return;
|
|
361
361
|
}
|
|
362
|
-
const
|
|
362
|
+
const f = (g) => g > 0 ? g - 1 : s.length - 1, E = (g) => g < s.length - 1 ? g + 1 : 0;
|
|
363
363
|
switch (m) {
|
|
364
364
|
case "ArrowDown":
|
|
365
|
-
l.preventDefault(),
|
|
365
|
+
l.preventDefault(), d = E(d);
|
|
366
366
|
break;
|
|
367
367
|
case "ArrowRight":
|
|
368
368
|
break;
|
|
369
369
|
case "ArrowUp":
|
|
370
|
-
l.preventDefault(),
|
|
370
|
+
l.preventDefault(), d = f(d);
|
|
371
371
|
break;
|
|
372
372
|
case "ArrowLeft":
|
|
373
373
|
break;
|
|
374
374
|
case "Home":
|
|
375
|
-
l.preventDefault(),
|
|
375
|
+
l.preventDefault(), d = 0;
|
|
376
376
|
break;
|
|
377
377
|
case "End":
|
|
378
|
-
l.preventDefault(),
|
|
378
|
+
l.preventDefault(), d = s.length - 1;
|
|
379
379
|
break;
|
|
380
380
|
default:
|
|
381
381
|
return;
|
|
382
382
|
}
|
|
383
|
-
s[
|
|
383
|
+
s[d] !== c && s[d].focus();
|
|
384
384
|
};
|
|
385
385
|
return {
|
|
386
386
|
make: () => {
|
|
387
|
-
|
|
387
|
+
n || (document.addEventListener("keydown", o), n = true);
|
|
388
388
|
},
|
|
389
389
|
destroy: () => {
|
|
390
|
-
|
|
390
|
+
n && (document.removeEventListener("keydown", o), n = false);
|
|
391
391
|
}
|
|
392
392
|
};
|
|
393
393
|
};
|
|
394
|
-
var
|
|
395
|
-
const
|
|
396
|
-
|
|
394
|
+
var z = (i, e, t) => {
|
|
395
|
+
const n = new CustomEvent(e, { detail: t });
|
|
396
|
+
i.dispatchEvent(n);
|
|
397
397
|
};
|
|
398
|
-
function
|
|
399
|
-
|
|
398
|
+
function ge(i) {
|
|
399
|
+
const e = () => {
|
|
400
|
+
document.querySelector(
|
|
401
|
+
"[data-fx-component]:not([data-component-initialized])"
|
|
402
|
+
) ? requestAnimationFrame(e) : i();
|
|
403
|
+
};
|
|
404
|
+
e();
|
|
405
|
+
}
|
|
406
|
+
function fe(i, e, t = "move") {
|
|
407
|
+
if (!(i instanceof HTMLElement))
|
|
400
408
|
throw new Error("Source element must be an HTMLElement");
|
|
401
409
|
if (!(e instanceof HTMLElement))
|
|
402
410
|
throw new Error("Target element must be an HTMLElement");
|
|
403
411
|
if (!["move", "detachable"].includes(t))
|
|
404
412
|
throw new Error(`Invalid teleport mode: ${t}. Must be "move" or "detachable".`);
|
|
405
|
-
let
|
|
406
|
-
const
|
|
407
|
-
return
|
|
413
|
+
let n = document.createComment("teleporter-placeholder");
|
|
414
|
+
const r = i.parentNode;
|
|
415
|
+
return r ? r.insertBefore(n, i) : console.warn("Element has no parent; placeholder not inserted."), t === "move" ? (i.parentNode && e.appendChild(i), {
|
|
408
416
|
append() {
|
|
409
|
-
|
|
417
|
+
i.parentNode !== e && e.appendChild(i);
|
|
410
418
|
},
|
|
411
419
|
remove() {
|
|
412
|
-
|
|
420
|
+
n != null && n.parentNode && i.parentNode && n.parentNode.insertBefore(i, n);
|
|
413
421
|
},
|
|
414
422
|
restore() {
|
|
415
|
-
|
|
423
|
+
n != null && n.parentNode && i.parentNode !== r && n.parentNode.insertBefore(i, n);
|
|
416
424
|
}
|
|
417
|
-
}) : (
|
|
425
|
+
}) : (i.parentNode && e.appendChild(i), {
|
|
418
426
|
append() {
|
|
419
|
-
e.contains(
|
|
427
|
+
e.contains(i) || e.appendChild(i);
|
|
420
428
|
},
|
|
421
429
|
remove() {
|
|
422
|
-
|
|
430
|
+
i.parentNode && i.remove();
|
|
423
431
|
},
|
|
424
432
|
restore() {
|
|
425
|
-
|
|
433
|
+
n != null && n.parentNode && !i.parentNode && n.parentNode.insertBefore(i, n);
|
|
426
434
|
}
|
|
427
435
|
});
|
|
428
436
|
}
|
|
429
|
-
var
|
|
437
|
+
var O = class {
|
|
430
438
|
static initGlobalRegistry() {
|
|
431
439
|
window.$flexillaInstances || (window.$flexillaInstances = {});
|
|
432
440
|
}
|
|
433
|
-
static register(e, t,
|
|
434
|
-
return this.initGlobalRegistry(), window.$flexillaInstances[e] || (window.$flexillaInstances[e] = []), this.getInstance(e, t) || (window.$flexillaInstances[e].push({ element: t, instance:
|
|
441
|
+
static register(e, t, n) {
|
|
442
|
+
return this.initGlobalRegistry(), window.$flexillaInstances[e] || (window.$flexillaInstances[e] = []), this.getInstance(e, t) || (window.$flexillaInstances[e].push({ element: t, instance: n }), n);
|
|
435
443
|
}
|
|
436
444
|
static getInstance(e, t) {
|
|
437
|
-
var
|
|
438
|
-
return this.initGlobalRegistry(), (
|
|
445
|
+
var n, r;
|
|
446
|
+
return this.initGlobalRegistry(), (r = (n = window.$flexillaInstances[e]) == null ? void 0 : n.find(
|
|
439
447
|
(s) => s.element === t
|
|
440
|
-
)) == null ? void 0 :
|
|
448
|
+
)) == null ? void 0 : r.instance;
|
|
441
449
|
}
|
|
442
450
|
static removeInstance(e, t) {
|
|
443
451
|
this.initGlobalRegistry(), window.$flexillaInstances[e] && (window.$flexillaInstances[e] = window.$flexillaInstances[e].filter(
|
|
444
|
-
(
|
|
452
|
+
(n) => n.element !== t
|
|
445
453
|
));
|
|
446
454
|
}
|
|
455
|
+
static setup(e) {
|
|
456
|
+
e.setAttribute("data-fx-component", "fx");
|
|
457
|
+
}
|
|
458
|
+
static initialized(e) {
|
|
459
|
+
e.setAttribute("data-component-initialized", "initialized");
|
|
460
|
+
}
|
|
447
461
|
};
|
|
448
|
-
var
|
|
462
|
+
var ue = {
|
|
449
463
|
teleport: true,
|
|
450
464
|
teleportMode: "move"
|
|
451
465
|
};
|
|
452
|
-
var
|
|
466
|
+
var k = class k2 {
|
|
453
467
|
/**
|
|
454
468
|
* Creates a new Dropdown instance
|
|
455
469
|
* @param dropdown - The dropdown content element or selector
|
|
@@ -464,6 +478,7 @@
|
|
|
464
478
|
a(this, "OverlayInstance");
|
|
465
479
|
a(this, "navigationKeys");
|
|
466
480
|
a(this, "keyObserver");
|
|
481
|
+
a(this, "subtriggerObserver");
|
|
467
482
|
a(this, "triggerStrategy");
|
|
468
483
|
a(this, "placement");
|
|
469
484
|
a(this, "offsetDistance");
|
|
@@ -472,23 +487,40 @@
|
|
|
472
487
|
a(this, "defaultState");
|
|
473
488
|
a(this, "experimentalOptions");
|
|
474
489
|
a(this, "teleporter");
|
|
475
|
-
a(this, "
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
for (const
|
|
481
|
-
e2.
|
|
490
|
+
a(this, "updateSubtriggerAttr", (e2, t2) => {
|
|
491
|
+
t2 === "add" ? (e2.setAttribute("data-current-subtrigger", ""), e2.setAttribute("data-focus", "active")) : (e2.removeAttribute("data-current-subtrigger"), e2.removeAttribute("data-focus"));
|
|
492
|
+
});
|
|
493
|
+
a(this, "updateObserverFor", (e2) => {
|
|
494
|
+
const t2 = S("[data-dropdown-trigger]", this.contentElement);
|
|
495
|
+
for (const n2 of t2)
|
|
496
|
+
e2.observe(n2, {
|
|
482
497
|
attributes: true,
|
|
483
498
|
attributeFilter: ["aria-expanded"]
|
|
484
499
|
});
|
|
485
500
|
});
|
|
501
|
+
a(this, "observeEl", () => {
|
|
502
|
+
this.keyObserver = new MutationObserver((e2) => {
|
|
503
|
+
for (const t2 of e2)
|
|
504
|
+
t2.type === "attributes" && t2.attributeName === "aria-expanded" && (t2.target.getAttribute("aria-expanded") === "true" ? this.navigationKeys.destroy() : this.contentElement.dataset.state === "open" && this.navigationKeys.make());
|
|
505
|
+
}), this.updateObserverFor(this.keyObserver);
|
|
506
|
+
});
|
|
507
|
+
a(this, "observeSubtriggers", () => {
|
|
508
|
+
this.subtriggerObserver = new MutationObserver((e2) => {
|
|
509
|
+
for (const t2 of e2)
|
|
510
|
+
if (t2.type === "attributes" && t2.attributeName === "aria-expanded") {
|
|
511
|
+
const n2 = t2.target, r2 = n2.getAttribute("aria-expanded");
|
|
512
|
+
this.updateSubtriggerAttr(n2, r2 === "true" ? "add" : "remove");
|
|
513
|
+
}
|
|
514
|
+
}), this.updateObserverFor(this.subtriggerObserver);
|
|
515
|
+
});
|
|
486
516
|
a(this, "onToggle", ({ isHidden: e2 }) => {
|
|
487
|
-
var t2,
|
|
488
|
-
(
|
|
517
|
+
var t2, n2;
|
|
518
|
+
(n2 = (t2 = this.options).onToggle) == null || n2.call(t2, { isHidden: e2 });
|
|
489
519
|
});
|
|
490
520
|
a(this, "moveElOnInit", () => {
|
|
491
|
-
this.experimentalOptions.teleport && (
|
|
521
|
+
this.experimentalOptions.teleport && ge(() => {
|
|
522
|
+
this.experimentalOptions.teleportMode === "detachable" ? this.teleporter.remove() : this.teleporter.append();
|
|
523
|
+
});
|
|
492
524
|
});
|
|
493
525
|
a(this, "moveEl", () => {
|
|
494
526
|
this.experimentalOptions.teleport && this.experimentalOptions.teleportMode === "detachable" && this.teleporter.remove();
|
|
@@ -497,29 +529,54 @@
|
|
|
497
529
|
this.experimentalOptions.teleport && this.experimentalOptions.teleportMode === "detachable" && this.teleporter.append();
|
|
498
530
|
});
|
|
499
531
|
a(this, "beforeShow", () => {
|
|
500
|
-
this.restoreEl(), this.contentElement.focus(), this.navigationKeys.make();
|
|
532
|
+
this.restoreEl(), this.contentElement.focus(), this.navigationKeys.make(), this.addArrowEvent();
|
|
501
533
|
});
|
|
502
534
|
a(this, "beforeHide", () => {
|
|
503
|
-
this.contentElement.blur(), this.navigationKeys.destroy();
|
|
535
|
+
this.contentElement.blur(), this.navigationKeys.destroy(), this.removeArrowEvent();
|
|
536
|
+
});
|
|
537
|
+
a(this, "showHideOnArrow", (e2) => {
|
|
538
|
+
e2.preventDefault();
|
|
539
|
+
const t2 = e2.key, n2 = document.activeElement;
|
|
540
|
+
if (n2 != null && n2.hasAttribute("data-dropdown-trigger"))
|
|
541
|
+
switch (t2) {
|
|
542
|
+
case "ArrowRight":
|
|
543
|
+
n2.getAttribute("aria-expanded") !== "true" && (n2.click(), this.updateSubtriggerAttr(n2, "add"));
|
|
544
|
+
break;
|
|
545
|
+
case "ArrowLeft":
|
|
546
|
+
n2.getAttribute("aria-expanded") === "true" && (n2.click(), this.updateSubtriggerAttr(n2, "remove"));
|
|
547
|
+
break;
|
|
548
|
+
default:
|
|
549
|
+
return;
|
|
550
|
+
}
|
|
551
|
+
if (this.triggerElement.hasAttribute("data-current-subtrigger"))
|
|
552
|
+
switch (t2) {
|
|
553
|
+
case "ArrowLeft":
|
|
554
|
+
this.triggerElement.click(), this.triggerElement.focus(), this.updateSubtriggerAttr(this.triggerElement, "remove");
|
|
555
|
+
break;
|
|
556
|
+
default:
|
|
557
|
+
return;
|
|
558
|
+
}
|
|
559
|
+
});
|
|
560
|
+
a(this, "addArrowEvent", () => {
|
|
561
|
+
document.addEventListener("keydown", this.showHideOnArrow);
|
|
562
|
+
});
|
|
563
|
+
a(this, "removeArrowEvent", () => {
|
|
564
|
+
document.removeEventListener("keydown", this.showHideOnArrow);
|
|
504
565
|
});
|
|
505
566
|
a(this, "onShow", () => {
|
|
506
567
|
var e2, t2;
|
|
507
|
-
|
|
568
|
+
z(this.contentElement, "dropdown-show", {
|
|
508
569
|
isHidden: false
|
|
509
|
-
}), (t2 = (e2 = this.options).onShow) == null || t2.call(e2);
|
|
570
|
+
}), (t2 = (e2 = this.options).onShow) == null || t2.call(e2), this.observeEl(), this.observeSubtriggers();
|
|
510
571
|
});
|
|
511
572
|
a(this, "onHide", () => {
|
|
512
573
|
var e2, t2;
|
|
513
|
-
|
|
574
|
+
z(this.contentElement, "dropdown-hide", {
|
|
514
575
|
isHidden: true
|
|
515
|
-
}), (t2 = (e2 = this.options).onHide) == null || t2.call(e2), this.moveEl();
|
|
516
|
-
});
|
|
517
|
-
a(this, "show", () => {
|
|
518
|
-
this.OverlayInstance.show();
|
|
519
|
-
});
|
|
520
|
-
a(this, "hide", () => {
|
|
521
|
-
this.OverlayInstance.hide();
|
|
576
|
+
}), (t2 = (e2 = this.options).onHide) == null || t2.call(e2), this.moveEl(), this.triggerElement.hasAttribute("data-current-subtrigger") && this.updateSubtriggerAttr(this.triggerElement, "remove"), this.disconnectObserver();
|
|
522
577
|
});
|
|
578
|
+
a(this, "show", () => this.OverlayInstance.show());
|
|
579
|
+
a(this, "hide", () => this.OverlayInstance.hide());
|
|
523
580
|
a(this, "setShowOptions", ({ placement: e2, offsetDistance: t2 }) => {
|
|
524
581
|
this.OverlayInstance.setShowOptions({ placement: e2, offsetDistance: t2 });
|
|
525
582
|
});
|
|
@@ -530,26 +587,27 @@
|
|
|
530
587
|
this.OverlayInstance.setPopperTrigger(e2, t2);
|
|
531
588
|
});
|
|
532
589
|
a(this, "disconnectObserver", () => {
|
|
533
|
-
this.keyObserver && this.keyObserver.disconnect();
|
|
590
|
+
this.keyObserver && this.keyObserver.disconnect(), this.subtriggerObserver && this.subtriggerObserver.disconnect();
|
|
534
591
|
});
|
|
535
592
|
a(this, "cleanup", () => {
|
|
536
|
-
this.disconnectObserver(), this.OverlayInstance.cleanup(),
|
|
593
|
+
this.disconnectObserver(), this.OverlayInstance.cleanup(), O.removeInstance("dropdown", this.contentElement);
|
|
537
594
|
});
|
|
538
|
-
const
|
|
539
|
-
if (!(
|
|
595
|
+
const n = typeof e == "string" ? F(e) : e;
|
|
596
|
+
if (!(n instanceof HTMLElement))
|
|
540
597
|
throw new Error(
|
|
541
598
|
"Invalid dropdown content element: Must provide either a valid HTMLElement or a selector string that resolves to an existing HTMLElement"
|
|
542
599
|
);
|
|
543
|
-
if (!
|
|
600
|
+
if (!n.id)
|
|
544
601
|
throw new Error("Dropdown content element must have an 'id' attribute for trigger association");
|
|
545
|
-
this.contentElement =
|
|
546
|
-
const
|
|
547
|
-
if (
|
|
548
|
-
return
|
|
602
|
+
this.contentElement = n;
|
|
603
|
+
const r = O.getInstance("dropdown", this.contentElement);
|
|
604
|
+
if (r)
|
|
605
|
+
return r;
|
|
606
|
+
O.setup(this.contentElement);
|
|
549
607
|
const s = `[data-dropdown-trigger][data-dropdown-id=${this.contentElement.id}]`;
|
|
550
|
-
if (this.triggerElement =
|
|
608
|
+
if (this.triggerElement = F(s), !(this.triggerElement instanceof HTMLElement))
|
|
551
609
|
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}"`);
|
|
552
|
-
this.options = t, this.triggerStrategy = this.
|
|
610
|
+
this.options = t, this.triggerStrategy = this.contentElement.dataset.triggerStrategy || this.options.triggerStrategy || "click", this.placement = this.contentElement.dataset.placement || this.options.placement || "bottom-start", this.offsetDistance = parseInt(`${this.contentElement.dataset.offsetDistance}`) || this.options.offsetDistance || 6, this.preventFromCloseOutside = this.contentElement.hasAttribute("data-prevent-close-outside") || this.options.preventFromCloseOutside || false, this.preventFromCloseInside = this.contentElement.hasAttribute("data-prevent-close-inside") || this.options.preventCloseFromInside || false, this.defaultState = this.contentElement.dataset.defaultState || this.options.defaultState || "close", this.experimentalOptions = Object.assign({}, ue, t.experimental), this.teleporter = fe(this.contentElement, document.body, this.experimentalOptions.teleportMode), this.OverlayInstance = new ce({
|
|
553
611
|
trigger: this.triggerElement,
|
|
554
612
|
content: this.contentElement,
|
|
555
613
|
options: {
|
|
@@ -560,19 +618,23 @@
|
|
|
560
618
|
preventCloseFromInside: this.preventFromCloseInside,
|
|
561
619
|
defaultState: this.defaultState,
|
|
562
620
|
beforeShow: this.beforeShow,
|
|
563
|
-
beforeHide:
|
|
621
|
+
beforeHide: () => {
|
|
622
|
+
if (S("[data-dropdown-trigger][aria-expanded=true]", this.contentElement).length >= 1)
|
|
623
|
+
return { cancelAction: true };
|
|
624
|
+
this.beforeHide();
|
|
625
|
+
},
|
|
564
626
|
onShow: this.onShow,
|
|
565
627
|
onHide: this.onHide,
|
|
566
|
-
onToggle: ({ isHidden:
|
|
567
|
-
this.onToggle({ isHidden:
|
|
628
|
+
onToggle: ({ isHidden: o }) => {
|
|
629
|
+
this.onToggle({ isHidden: o });
|
|
568
630
|
},
|
|
569
631
|
popper: this.options.popper
|
|
570
632
|
}
|
|
571
|
-
}), this.moveElOnInit(), this.items =
|
|
633
|
+
}), this.moveElOnInit(), this.items = S("a:not([disabled]), button:not([disabled])", this.contentElement), this.navigationKeys = me({
|
|
572
634
|
containerElement: this.contentElement,
|
|
573
635
|
targetChildren: this.items,
|
|
574
636
|
direction: "up-down"
|
|
575
|
-
}),
|
|
637
|
+
}), O.register("dropdown", this.contentElement, this), O.initialized(this.contentElement);
|
|
576
638
|
}
|
|
577
639
|
/**
|
|
578
640
|
* Initializes a single dropdown instance
|
|
@@ -581,20 +643,20 @@
|
|
|
581
643
|
* @returns A new Dropdown instance
|
|
582
644
|
*/
|
|
583
645
|
static init(e, t = {}) {
|
|
584
|
-
new
|
|
646
|
+
new k2(e, t);
|
|
585
647
|
}
|
|
586
648
|
};
|
|
587
|
-
a(
|
|
588
|
-
const t =
|
|
589
|
-
for (const
|
|
590
|
-
new
|
|
649
|
+
a(k, "autoInit", (e = "[data-fx-dropdown]") => {
|
|
650
|
+
const t = S(e);
|
|
651
|
+
for (const n of t)
|
|
652
|
+
new k(n);
|
|
591
653
|
});
|
|
592
|
-
var
|
|
654
|
+
var K = k;
|
|
593
655
|
|
|
594
656
|
// src/index.js
|
|
595
657
|
function Dropdown(Alpine) {
|
|
596
658
|
Alpine.directive("dropdown", (el, {}, { cleanup }) => {
|
|
597
|
-
const dropdown_ = new
|
|
659
|
+
const dropdown_ = new K(el);
|
|
598
660
|
cleanup(() => {
|
|
599
661
|
dropdown_.cleanup();
|
|
600
662
|
});
|