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