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