@vue-interface/btn-dropdown 4.1.1 → 4.1.3
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/btn-dropdown.js +171 -154
- package/dist/btn-dropdown.js.map +1 -1
- package/dist/btn-dropdown.umd.cjs +1 -1
- package/dist/btn-dropdown.umd.cjs.map +1 -1
- package/dist/src/BtnDropdown.vue.d.ts +326 -14
- package/dist/src/BtnDropdownSingle.vue.d.ts +156 -0
- package/dist/src/BtnDropdownSplit.vue.d.ts +166 -0
- package/dist/src/useDropdownHandler.d.ts +8 -2
- package/package.json +5 -2
- package/src/BtnDropdown.vue +19 -1
- package/src/BtnDropdownSingle.vue +13 -2
- package/src/BtnDropdownSplit.vue +18 -2
- package/src/useDropdownHandler.ts +14 -5
package/dist/btn-dropdown.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { ref as D, computed as x, watchEffect as
|
|
2
|
-
import { DropdownMenu as
|
|
3
|
-
import { offset as
|
|
4
|
-
import { useFloating as
|
|
5
|
-
function
|
|
6
|
-
const
|
|
1
|
+
import { ref as D, computed as x, watchEffect as O, defineComponent as L, createElementBlock as I, openBlock as P, normalizeClass as C, unref as e, renderSlot as y, createVNode as N, normalizeProps as B, guardReactiveProps as z, createElementVNode as E, toDisplayString as M, withModifiers as V, normalizeStyle as F, withCtx as T, createCommentVNode as A, mergeProps as H, useTemplateRef as G, createBlock as J, resolveDynamicComponent as K } from "vue";
|
|
2
|
+
import { DropdownMenu as R } from "@vue-interface/dropdown-menu";
|
|
3
|
+
import { offset as Q, flip as U } from "@floating-ui/dom";
|
|
4
|
+
import { useFloating as W } from "@floating-ui/vue";
|
|
5
|
+
function j(t, k) {
|
|
6
|
+
const u = D(null), p = D(), s = D(!1), d = x(() => t.align ?? "start"), c = x(() => t.dropup ? "top" : t.dropleft ? "left" : t.dropright ? "right" : "bottom"), r = x(() => `${c.value}-${d.value}`), i = x(() => ({
|
|
7
7
|
dropdown: t.dropup && t.dropright && t.dropleft,
|
|
8
8
|
dropup: t.dropup,
|
|
9
9
|
dropright: t.dropright,
|
|
10
10
|
dropleft: t.dropleft,
|
|
11
|
-
expanded:
|
|
11
|
+
expanded: s.value,
|
|
12
12
|
[t.size ?? ""]: !!t.size
|
|
13
|
-
})),
|
|
13
|
+
})), f = x(() => {
|
|
14
14
|
const l = {
|
|
15
15
|
btn: !0,
|
|
16
16
|
[t.variant ?? ""]: !!t.variant,
|
|
@@ -20,75 +20,75 @@ function q(t, c) {
|
|
|
20
20
|
if (typeof t.buttonClass == "string")
|
|
21
21
|
l[t.buttonClass] = !0;
|
|
22
22
|
else if (Array.isArray(t.buttonClass))
|
|
23
|
-
for (const
|
|
24
|
-
l[
|
|
23
|
+
for (const S of t.buttonClass)
|
|
24
|
+
l[S] = !0;
|
|
25
25
|
else t.buttonClass && Object.assign(l, t.buttonClass);
|
|
26
26
|
return l;
|
|
27
|
-
}), { floatingStyles:
|
|
28
|
-
placement:
|
|
27
|
+
}), { floatingStyles: h, update: v } = W(u, p, {
|
|
28
|
+
placement: r,
|
|
29
29
|
middleware: t.middleware ?? [
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
Q(t.offset ?? 5),
|
|
31
|
+
U()
|
|
32
32
|
]
|
|
33
33
|
});
|
|
34
34
|
function w() {
|
|
35
|
-
|
|
35
|
+
s.value = !0, !(!u.value || !p.value) && (v(), k("show"));
|
|
36
36
|
}
|
|
37
|
-
function
|
|
38
|
-
|
|
37
|
+
function b() {
|
|
38
|
+
s.value = !1, u.value instanceof HTMLElement && u.value?.blur(), k("hide");
|
|
39
39
|
}
|
|
40
|
-
function
|
|
41
|
-
|
|
40
|
+
function a() {
|
|
41
|
+
s.value ? b() : w();
|
|
42
42
|
}
|
|
43
|
-
function
|
|
44
|
-
const
|
|
45
|
-
for (const
|
|
46
|
-
if (l ===
|
|
43
|
+
function m(l) {
|
|
44
|
+
const S = Array.from(p.value?.$el.querySelectorAll("label, input, select, textarea") ?? []);
|
|
45
|
+
for (const q in S)
|
|
46
|
+
if (l === S[q])
|
|
47
47
|
return !0;
|
|
48
48
|
return !1;
|
|
49
49
|
}
|
|
50
|
-
function
|
|
51
|
-
if (!(l.relatedTarget instanceof HTMLElement)) {
|
|
52
|
-
|
|
50
|
+
function $(l) {
|
|
51
|
+
if (!(l.relatedTarget instanceof HTMLElement) || !(u.value instanceof Element)) {
|
|
52
|
+
b();
|
|
53
53
|
return;
|
|
54
54
|
}
|
|
55
|
-
(
|
|
55
|
+
(p.value && !p.value?.$el.contains(l.relatedTarget) || !u.value?.contains(l.relatedTarget)) && b();
|
|
56
56
|
}
|
|
57
|
-
function
|
|
58
|
-
|
|
57
|
+
function g(l) {
|
|
58
|
+
k("click", l);
|
|
59
59
|
}
|
|
60
60
|
function o(l) {
|
|
61
|
-
l.target?.dispatchEvent(new Event("focus", l)),
|
|
61
|
+
l.target?.dispatchEvent(new Event("focus", l)), k("clickToggle", l), l.defaultPrevented || a();
|
|
62
62
|
}
|
|
63
63
|
function n(l) {
|
|
64
64
|
if (!(l.target instanceof HTMLElement)) {
|
|
65
|
-
|
|
65
|
+
b();
|
|
66
66
|
return;
|
|
67
67
|
}
|
|
68
|
-
!
|
|
68
|
+
!m(l.target) && !l.defaultPrevented && b();
|
|
69
69
|
}
|
|
70
|
-
return
|
|
71
|
-
|
|
70
|
+
return O(() => {
|
|
71
|
+
s.value ? window.addEventListener("resize", v) : window.removeEventListener("resize", v);
|
|
72
72
|
}), {
|
|
73
|
-
target:
|
|
74
|
-
menu:
|
|
75
|
-
alignment:
|
|
76
|
-
expanded:
|
|
77
|
-
floatingStyles:
|
|
78
|
-
placement:
|
|
79
|
-
side:
|
|
80
|
-
classes:
|
|
81
|
-
buttonClasses:
|
|
73
|
+
target: u,
|
|
74
|
+
menu: p,
|
|
75
|
+
alignment: d,
|
|
76
|
+
expanded: s,
|
|
77
|
+
floatingStyles: h,
|
|
78
|
+
placement: r,
|
|
79
|
+
side: c,
|
|
80
|
+
classes: i,
|
|
81
|
+
buttonClasses: f,
|
|
82
82
|
show: w,
|
|
83
|
-
hide:
|
|
84
|
-
toggle:
|
|
85
|
-
onBlur:
|
|
86
|
-
onClick:
|
|
83
|
+
hide: b,
|
|
84
|
+
toggle: a,
|
|
85
|
+
onBlur: $,
|
|
86
|
+
onClick: g,
|
|
87
87
|
onClickToggle: o,
|
|
88
88
|
onClickItem: n
|
|
89
89
|
};
|
|
90
90
|
}
|
|
91
|
-
const
|
|
91
|
+
const X = ["aria-expanded"], Y = /* @__PURE__ */ L({
|
|
92
92
|
__name: "BtnDropdownSingle",
|
|
93
93
|
props: {
|
|
94
94
|
align: {},
|
|
@@ -107,62 +107,67 @@ const W = ["aria-expanded"], X = /* @__PURE__ */ A({
|
|
|
107
107
|
variant: { default: "btn-primary" }
|
|
108
108
|
},
|
|
109
109
|
emits: ["click", "clickToggle", "show", "hide"],
|
|
110
|
-
setup(t, { expose:
|
|
111
|
-
const
|
|
112
|
-
target:
|
|
113
|
-
menu:
|
|
114
|
-
buttonClasses:
|
|
115
|
-
classes:
|
|
116
|
-
expanded:
|
|
117
|
-
floatingStyles:
|
|
118
|
-
show:
|
|
110
|
+
setup(t, { expose: k, emit: u }) {
|
|
111
|
+
const p = t, s = u, {
|
|
112
|
+
target: d,
|
|
113
|
+
menu: c,
|
|
114
|
+
buttonClasses: r,
|
|
115
|
+
classes: i,
|
|
116
|
+
expanded: f,
|
|
117
|
+
floatingStyles: h,
|
|
118
|
+
show: v,
|
|
119
119
|
hide: w,
|
|
120
|
-
toggle:
|
|
121
|
-
onBlur:
|
|
122
|
-
onClickToggle:
|
|
123
|
-
onClickItem:
|
|
124
|
-
} =
|
|
125
|
-
return
|
|
126
|
-
show:
|
|
120
|
+
toggle: b,
|
|
121
|
+
onBlur: a,
|
|
122
|
+
onClickToggle: m,
|
|
123
|
+
onClickItem: $
|
|
124
|
+
} = j(p, s);
|
|
125
|
+
return k({
|
|
126
|
+
show: v,
|
|
127
127
|
hide: w,
|
|
128
|
-
toggle:
|
|
129
|
-
}), (
|
|
130
|
-
class:
|
|
128
|
+
toggle: b
|
|
129
|
+
}), (g, o) => (P(), I("div", {
|
|
130
|
+
class: C(["btn-group", e(i)])
|
|
131
131
|
}, [
|
|
132
|
-
|
|
133
|
-
|
|
132
|
+
y(g.$slots, "button", B(z({
|
|
133
|
+
target: (n) => d.value = n,
|
|
134
|
+
expanded: e(f),
|
|
135
|
+
onBlur: e(a),
|
|
136
|
+
onClickToggle: e(m)
|
|
137
|
+
})), () => [
|
|
138
|
+
E("button", {
|
|
134
139
|
ref_key: "target",
|
|
135
|
-
ref:
|
|
140
|
+
ref: d,
|
|
136
141
|
type: "button",
|
|
137
|
-
class:
|
|
142
|
+
class: C({ ...e(r), "dropdown-toggle": !0 }),
|
|
138
143
|
"aria-haspopup": "true",
|
|
139
|
-
"aria-expanded": e(
|
|
144
|
+
"aria-expanded": e(f),
|
|
140
145
|
onBlur: o[0] || (o[0] = //@ts-ignore
|
|
141
|
-
(...n) => e(
|
|
146
|
+
(...n) => e(a) && e(a)(...n)),
|
|
142
147
|
onClick: o[1] || (o[1] = //@ts-ignore
|
|
143
|
-
(...n) => e(
|
|
144
|
-
}, M(t.label), 43,
|
|
148
|
+
(...n) => e(m) && e(m)(...n))
|
|
149
|
+
}, M(t.label), 43, X)
|
|
145
150
|
]),
|
|
146
|
-
N(e(
|
|
151
|
+
N(e(R), {
|
|
147
152
|
ref_key: "menu",
|
|
148
|
-
ref:
|
|
149
|
-
class:
|
|
150
|
-
show: e(
|
|
153
|
+
ref: c,
|
|
154
|
+
class: C({
|
|
155
|
+
show: e(f)
|
|
151
156
|
}),
|
|
152
|
-
style: F(e(
|
|
153
|
-
onBlur: e(
|
|
154
|
-
onClick: e(
|
|
157
|
+
style: F(e(h)),
|
|
158
|
+
onBlur: e(a),
|
|
159
|
+
onClick: e($),
|
|
155
160
|
onMousedown: o[2] || (o[2] = V(() => {
|
|
156
161
|
}, ["prevent"]))
|
|
157
162
|
}, {
|
|
158
|
-
default:
|
|
159
|
-
|
|
163
|
+
default: T(() => [
|
|
164
|
+
y(g.$slots, "default")
|
|
160
165
|
]),
|
|
161
166
|
_: 3
|
|
162
167
|
}, 8, ["class", "style", "onBlur", "onClick"])
|
|
163
168
|
], 2));
|
|
164
169
|
}
|
|
165
|
-
}),
|
|
170
|
+
}), Z = ["aria-expanded"], _ = { class: "btn-group" }, ee = ["aria-expanded"], te = ["aria-expanded"], oe = /* @__PURE__ */ L({
|
|
166
171
|
__name: "BtnDropdownSplit",
|
|
167
172
|
props: {
|
|
168
173
|
align: {},
|
|
@@ -181,88 +186,93 @@ const W = ["aria-expanded"], X = /* @__PURE__ */ A({
|
|
|
181
186
|
variant: { default: "btn-primary" }
|
|
182
187
|
},
|
|
183
188
|
emits: ["click", "clickToggle", "show", "hide"],
|
|
184
|
-
setup(t, { expose:
|
|
185
|
-
const
|
|
186
|
-
target:
|
|
187
|
-
menu:
|
|
188
|
-
buttonClasses:
|
|
189
|
-
classes:
|
|
190
|
-
expanded:
|
|
191
|
-
floatingStyles:
|
|
192
|
-
show:
|
|
189
|
+
setup(t, { expose: k, emit: u }) {
|
|
190
|
+
const p = t, s = u, {
|
|
191
|
+
target: d,
|
|
192
|
+
menu: c,
|
|
193
|
+
buttonClasses: r,
|
|
194
|
+
classes: i,
|
|
195
|
+
expanded: f,
|
|
196
|
+
floatingStyles: h,
|
|
197
|
+
show: v,
|
|
193
198
|
hide: w,
|
|
194
|
-
toggle:
|
|
195
|
-
onBlur:
|
|
196
|
-
onClickToggle:
|
|
197
|
-
onClickItem:
|
|
198
|
-
} =
|
|
199
|
-
return
|
|
200
|
-
show:
|
|
199
|
+
toggle: b,
|
|
200
|
+
onBlur: a,
|
|
201
|
+
onClickToggle: m,
|
|
202
|
+
onClickItem: $
|
|
203
|
+
} = j(p, s);
|
|
204
|
+
return k({
|
|
205
|
+
show: v,
|
|
201
206
|
hide: w,
|
|
202
|
-
toggle:
|
|
203
|
-
}), (
|
|
204
|
-
class:
|
|
207
|
+
toggle: b
|
|
208
|
+
}), (g, o) => (P(), I("div", {
|
|
209
|
+
class: C(["btn-group btn-dropdown-split", e(i)])
|
|
205
210
|
}, [
|
|
206
|
-
t.dropleft ?
|
|
207
|
-
|
|
211
|
+
t.dropleft ? A("", !0) : y(g.$slots, "button", B(H({ key: 0 }, { expanded: e(f), onBlur: e(a), onClickToggle: e(m) })), () => [
|
|
212
|
+
E("button", {
|
|
208
213
|
type: "button",
|
|
209
|
-
class:
|
|
214
|
+
class: C(e(r)),
|
|
210
215
|
"aria-haspopup": "true",
|
|
211
|
-
"aria-expanded": e(
|
|
216
|
+
"aria-expanded": e(f),
|
|
212
217
|
onBlur: o[0] || (o[0] = //@ts-ignore
|
|
213
|
-
(...n) => e(
|
|
218
|
+
(...n) => e(a) && e(a)(...n)),
|
|
214
219
|
onClick: o[1] || (o[1] = //@ts-ignore
|
|
215
|
-
(...n) =>
|
|
216
|
-
}, M(t.label), 43,
|
|
220
|
+
(...n) => g.onClick && g.onClick(...n))
|
|
221
|
+
}, M(t.label), 43, Z)
|
|
217
222
|
]),
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
223
|
+
E("div", _, [
|
|
224
|
+
y(g.$slots, "toggle", B(z({
|
|
225
|
+
target: (n) => d.value = n,
|
|
226
|
+
expanded: e(f),
|
|
227
|
+
onBlur: e(a),
|
|
228
|
+
onClickToggle: e(m)
|
|
229
|
+
})), () => [
|
|
230
|
+
E("button", {
|
|
221
231
|
ref_key: "target",
|
|
222
|
-
ref:
|
|
232
|
+
ref: d,
|
|
223
233
|
type: "button",
|
|
224
234
|
"aria-haspopup": "true",
|
|
225
|
-
"aria-expanded": e(
|
|
226
|
-
class:
|
|
235
|
+
"aria-expanded": e(f),
|
|
236
|
+
class: C({ ...e(r), "dropdown-toggle": !0, "dropdown-toggle-split": t.split }),
|
|
227
237
|
onBlur: o[2] || (o[2] = //@ts-ignore
|
|
228
|
-
(...n) => e(
|
|
238
|
+
(...n) => e(a) && e(a)(...n)),
|
|
229
239
|
onClick: o[3] || (o[3] = //@ts-ignore
|
|
230
|
-
(...n) => e(
|
|
231
|
-
}, null, 42,
|
|
240
|
+
(...n) => e(m) && e(m)(...n))
|
|
241
|
+
}, null, 42, ee)
|
|
232
242
|
]),
|
|
233
|
-
N(e(
|
|
243
|
+
N(e(R), {
|
|
234
244
|
ref_key: "menu",
|
|
235
|
-
ref:
|
|
236
|
-
class:
|
|
237
|
-
show: e(
|
|
245
|
+
ref: c,
|
|
246
|
+
class: C({
|
|
247
|
+
show: e(f)
|
|
238
248
|
}),
|
|
239
|
-
style: F(e(
|
|
240
|
-
onBlur: e(
|
|
241
|
-
onClick: e(
|
|
249
|
+
style: F(e(h)),
|
|
250
|
+
onBlur: e(a),
|
|
251
|
+
onClick: e($),
|
|
242
252
|
onMousedown: o[4] || (o[4] = V(() => {
|
|
243
253
|
}, ["prevent"]))
|
|
244
254
|
}, {
|
|
245
|
-
default:
|
|
246
|
-
|
|
255
|
+
default: T(() => [
|
|
256
|
+
y(g.$slots, "default")
|
|
247
257
|
]),
|
|
248
258
|
_: 3
|
|
249
259
|
}, 8, ["class", "style", "onBlur", "onClick"])
|
|
250
260
|
]),
|
|
251
|
-
t.dropleft ?
|
|
252
|
-
|
|
261
|
+
t.dropleft ? y(g.$slots, "button", B(H({ key: 1 }, { expanded: e(f), onBlur: e(a), onClickToggle: e(m) })), () => [
|
|
262
|
+
E("button", {
|
|
253
263
|
type: "button",
|
|
254
|
-
class:
|
|
264
|
+
class: C(e(r)),
|
|
255
265
|
"aria-haspopup": "true",
|
|
256
|
-
"aria-expanded": e(
|
|
266
|
+
"aria-expanded": e(f),
|
|
257
267
|
onBlur: o[5] || (o[5] = //@ts-ignore
|
|
258
|
-
(...n) => e(
|
|
268
|
+
(...n) => e(a) && e(a)(...n)),
|
|
259
269
|
onClick: o[6] || (o[6] = //@ts-ignore
|
|
260
|
-
(...n) =>
|
|
261
|
-
}, M(t.label), 43,
|
|
262
|
-
]) :
|
|
270
|
+
(...n) => g.onClick && g.onClick(...n))
|
|
271
|
+
}, M(t.label), 43, te)
|
|
272
|
+
]) : A("", !0)
|
|
263
273
|
], 2));
|
|
264
274
|
}
|
|
265
|
-
}),
|
|
275
|
+
}), se = /* @__PURE__ */ L({
|
|
266
276
|
__name: "BtnDropdown",
|
|
267
277
|
props: {
|
|
268
278
|
split: { type: Boolean, default: !1 },
|
|
@@ -281,31 +291,38 @@ const W = ["aria-expanded"], X = /* @__PURE__ */ A({
|
|
|
281
291
|
variant: {}
|
|
282
292
|
},
|
|
283
293
|
emits: ["click", "clickToggle", "show", "hide"],
|
|
284
|
-
setup(t, { emit:
|
|
285
|
-
const p = t,
|
|
286
|
-
return (
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
294
|
+
setup(t, { expose: k, emit: u }) {
|
|
295
|
+
const p = t, s = u, d = G("el");
|
|
296
|
+
return k({
|
|
297
|
+
hide: () => d.value?.hide(),
|
|
298
|
+
show: () => d.value?.show(),
|
|
299
|
+
toggle: () => d.value?.toggle()
|
|
300
|
+
}), (c, r) => (P(), J(K(t.split ? oe : Y), H({
|
|
301
|
+
ref_key: "el",
|
|
302
|
+
ref: d
|
|
303
|
+
}, p, {
|
|
304
|
+
onClick: r[0] || (r[0] = (i) => s("click", i)),
|
|
305
|
+
onClickToggle: r[1] || (r[1] = (i) => s("clickToggle", i)),
|
|
306
|
+
onShow: r[2] || (r[2] = () => s("show")),
|
|
307
|
+
onHide: r[3] || (r[3] = () => s("hide"))
|
|
291
308
|
}), {
|
|
292
|
-
button:
|
|
293
|
-
|
|
309
|
+
button: T((i) => [
|
|
310
|
+
y(c.$slots, "button", B(z(i)))
|
|
294
311
|
]),
|
|
295
|
-
toggle:
|
|
296
|
-
|
|
312
|
+
toggle: T((i) => [
|
|
313
|
+
y(c.$slots, "toggle", B(z(i)))
|
|
297
314
|
]),
|
|
298
|
-
split:
|
|
299
|
-
|
|
315
|
+
split: T((i) => [
|
|
316
|
+
y(c.$slots, "split", B(z(i)))
|
|
300
317
|
]),
|
|
301
|
-
default:
|
|
302
|
-
|
|
318
|
+
default: T(() => [
|
|
319
|
+
y(c.$slots, "default")
|
|
303
320
|
]),
|
|
304
321
|
_: 3
|
|
305
322
|
}, 16));
|
|
306
323
|
}
|
|
307
324
|
});
|
|
308
325
|
export {
|
|
309
|
-
|
|
326
|
+
se as BtnDropdown
|
|
310
327
|
};
|
|
311
328
|
//# sourceMappingURL=btn-dropdown.js.map
|
package/dist/btn-dropdown.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"btn-dropdown.js","sources":["../src/useDropdownHandler.ts","../src/BtnDropdownSingle.vue","../src/BtnDropdownSplit.vue","../src/BtnDropdown.vue"],"sourcesContent":["import { flip, offset, Placement, type Alignment, type Middleware, type OffsetOptions, type Side } from '@floating-ui/dom';\nimport { useFloating, UseFloatingReturn } from '@floating-ui/vue';\nimport { DropdownMenu } from '@vue-interface/dropdown-menu';\nimport { computed, ComputedRef, Ref, ref, watchEffect, type EmitFn, type HTMLAttributes } from 'vue';\n\ntype LiteralUnion<T extends U, U = string> = T | (U & Record<never, never>);\n\nexport type BtnGroupSizes = 'btn-group-xs'\n | 'btn-group-sm' \n | 'btn-group-md'\n | 'btn-group-lg'\n | 'btn-group-xl'\n | 'btn-group-2xl'\n | 'btn-group-3xl'\n | 'btn-group-4xl';\n\nexport type BtnDropdownProps = {\n align?: Alignment;\n block?: boolean;\n buttonClass?: HTMLAttributes['class'],\n caret?: boolean;\n dropup?: boolean;\n dropright?: boolean;\n dropleft?: boolean;\n label?: string;\n offset?: OffsetOptions,\n middleware?: Middleware[],\n side?: Side;\n size?: LiteralUnion<BtnGroupSizes>;\n split?: boolean;\n variant?: string;\n}\n\nexport type BtnDropdownEvents = {\n click: [event: MouseEvent];\n clickToggle: [event: MouseEvent];\n show: [],\n hide: []\n}\n\nexport type UseDropdownHandler = {\n target: Ref<HTMLElement|undefined>;\n menu: Ref<InstanceType<typeof DropdownMenu>|undefined>;\n alignment: ComputedRef<Alignment>;\n expanded: Ref<boolean>;\n floatingStyles: UseFloatingReturn['floatingStyles'];\n placement: ComputedRef<Placement>;\n side: ComputedRef<Side>;\n classes: ComputedRef<Record<string, boolean|undefined>>;\n buttonClasses: ComputedRef<Record<string, boolean>>;\n show: () => void;\n hide: () => void;\n toggle: () => void;\n onBlur: (e: FocusEvent) => void;\n onClick: (e: MouseEvent) => void;\n onClickToggle: (e: MouseEvent) => void;\n onClickItem: (e: PointerEvent) => void;\n}\n\nexport function useDropdownHandler(props: BtnDropdownProps, emit: EmitFn<BtnDropdownEvents>): UseDropdownHandler {\n const target = ref<HTMLElement>();\n const menu = ref<InstanceType<typeof DropdownMenu>>();\n const expanded = ref(false);\n\n const alignment = computed<Alignment>(() => props.align ?? 'start');\n\n const side = computed<Side>(() => {\n if(props.dropup) {\n return 'top';\n }\n\n if(props.dropleft) {\n return 'left';\n }\n\n if(props.dropright) {\n return 'right';\n }\n\n return 'bottom';\n });\n\n const placement = computed<Placement>(() => `${side.value}-${alignment.value}`);\n\n const classes = computed<Record<string,boolean|undefined>>(() => ({\n 'dropdown': props.dropup && props.dropright && props.dropleft,\n 'dropup': props.dropup,\n 'dropright': props.dropright,\n 'dropleft': props.dropleft,\n 'expanded': expanded.value,\n [props.size ?? '']: !!props.size,\n }));\n \n const buttonClasses = computed(() => {\n const classes = {\n btn: true,\n [props.variant ?? '']: !!props.variant,\n 'btn-block': !!props.block,\n 'no-caret': !props.caret\n };\n \n if(typeof props.buttonClass === 'string') {\n classes[props.buttonClass] = true;\n }\n else if(Array.isArray(props.buttonClass)) {\n for(const value of props.buttonClass) {\n classes[value] = true;\n }\n }\n else if(props.buttonClass) {\n Object.assign(classes, props.buttonClass);\n }\n\n return classes;\n });\n\n const { floatingStyles, update } = useFloating(target, menu, {\n placement: placement,\n middleware: props.middleware ?? [\n offset(props.offset ?? 5),\n flip()\n ]\n });\n\n function show() {\n expanded.value = true;\n\n if(!target.value || !menu.value) {\n return;\n }\n\n update();\n\n emit('show');\n }\n\n function hide() {\n expanded.value = false;\n\n target.value?.blur();\n\n emit('hide');\n }\n\n function toggle() {\n if(!expanded.value) {\n show();\n }\n else {\n hide();\n }\n }\n\n function isFocusable(element: HTMLElement) {\n const nodes = Array.from(menu.value?.$el.querySelectorAll('label, input, select, textarea') ?? []);\n\n for(const i in nodes) {\n if(element === nodes[i]) {\n return true;\n }\n }\n\n return false;\n }\n \n function onBlur(e: FocusEvent) {\n if(!(e.relatedTarget instanceof HTMLElement)) {\n hide();\n \n return;\n }\n \n if(menu.value && !menu.value?.$el.contains(e.relatedTarget) || !target.value?.contains(e.relatedTarget)) {\n hide();\n }\n }\n\n function onClick(e: MouseEvent) {\n emit('click', e);\n }\n\n function onClickToggle(e: MouseEvent) {\n e.target?.dispatchEvent(new Event('focus', e));\n \n emit('clickToggle', e);\n\n if(!e.defaultPrevented) {\n toggle();\n }\n }\n\n function onClickItem(e: PointerEvent) {\n if(!(e.target instanceof HTMLElement)) {\n hide();\n\n return;\n }\n\n if(!isFocusable(e.target) && !e.defaultPrevented) {\n hide();\n }\n }\n\n watchEffect(() => {\n if(expanded.value) {\n window.addEventListener('resize', update);\n }\n else {\n window.removeEventListener('resize', update);\n }\n });\n\n return {\n target,\n menu,\n alignment,\n expanded,\n floatingStyles,\n placement,\n side,\n classes,\n buttonClasses,\n show,\n hide,\n toggle,\n onBlur,\n onClick,\n onClickToggle,\n onClickItem\n };\n}","<script setup lang=\"ts\">\nimport { DropdownMenu } from '@vue-interface/dropdown-menu';\nimport { BtnDropdownEvents, BtnDropdownProps, useDropdownHandler } from './useDropdownHandler';\n\nconst props = withDefaults(defineProps<BtnDropdownProps>(), {\n caret: true,\n variant: 'btn-primary'\n});\n\nconst emit = defineEmits<BtnDropdownEvents>();\n\nconst {\n target,\n menu,\n buttonClasses,\n classes,\n expanded,\n floatingStyles,\n show,\n hide,\n toggle,\n onBlur,\n onClickToggle,\n onClickItem\n} = useDropdownHandler(props, emit);\n\ndefineExpose({\n show,\n hide,\n toggle,\n});\n</script>\n\n<template>\n <div\n class=\"btn-group\"\n :class=\"classes\">\n <slot\n name=\"button\"\n v-bind=\"{ target: (el: HTMLElement) => target = el, expanded, onBlur, onClickToggle }\">\n <button\n ref=\"target\"\n type=\"button\"\n :class=\"{...buttonClasses, ['dropdown-toggle']: true}\"\n aria-haspopup=\"true\"\n :aria-expanded=\"expanded\"\n @blur=\"onBlur\"\n @click=\"onClickToggle\">\n {{ label }}\n </button>\n </slot>\n <DropdownMenu\n ref=\"menu\"\n :class=\"{\n 'show': expanded\n }\"\n :style=\"floatingStyles\"\n @blur=\"onBlur\"\n @click=\"onClickItem\"\n @mousedown.prevent>\n <slot />\n </DropdownMenu>\n </div>\n</template>","<script setup lang=\"ts\">\nimport { DropdownMenu } from '@vue-interface/dropdown-menu';\nimport { BtnDropdownEvents, BtnDropdownProps, useDropdownHandler } from './useDropdownHandler';\n\nconst props = withDefaults(defineProps<BtnDropdownProps>(), {\n caret: true,\n variant: 'btn-primary'\n});\n\nconst emit = defineEmits<BtnDropdownEvents>();\n\nconst {\n target,\n menu,\n buttonClasses,\n classes,\n expanded,\n floatingStyles,\n show,\n hide,\n toggle,\n onBlur,\n onClickToggle,\n onClickItem\n} = useDropdownHandler(props, emit);\n\ndefineExpose({\n show,\n hide,\n toggle,\n});\n</script>\n\n<template>\n <div\n class=\"btn-group btn-dropdown-split\"\n :class=\"classes\">\n <slot\n v-if=\"!dropleft\"\n name=\"button\"\n v-bind=\"{ expanded, onBlur, onClickToggle }\">\n <button\n type=\"button\"\n :class=\"buttonClasses\"\n aria-haspopup=\"true\"\n :aria-expanded=\"expanded\"\n @blur=\"onBlur\"\n @click=\"onClick\">\n {{ label }}\n </button>\n </slot>\n <div class=\"btn-group\">\n <slot\n name=\"toggle\"\n v-bind=\"{ target: (el: HTMLElement) => target = el, expanded, onBlur, onClickToggle }\">\n <button\n ref=\"target\"\n type=\"button\"\n aria-haspopup=\"true\"\n :aria-expanded=\"expanded\"\n :class=\"{...buttonClasses, 'dropdown-toggle': true, 'dropdown-toggle-split': split}\"\n @blur=\"onBlur\"\n @click=\"onClickToggle\" />\n </slot>\n <DropdownMenu\n ref=\"menu\"\n :class=\"{\n 'show': expanded\n }\"\n :style=\"floatingStyles\"\n @blur=\"onBlur\"\n @click=\"onClickItem\"\n @mousedown.prevent>\n <slot />\n </DropdownMenu>\n </div>\n <slot\n v-if=\"dropleft\"\n name=\"button\"\n v-bind=\"{ expanded, onBlur, onClickToggle }\">\n <button\n type=\"button\"\n :class=\"buttonClasses\"\n aria-haspopup=\"true\"\n :aria-expanded=\"expanded\"\n @blur=\"onBlur\"\n @click=\"onClick\">\n {{ label }}\n </button>\n </slot>\n </div>\n</template>","<script setup lang=\"ts\">\nimport BtnDropdownSingle from './BtnDropdownSingle.vue';\nimport BtnDropdownSplit from './BtnDropdownSplit.vue';\nimport { BtnDropdownEvents, BtnDropdownProps } from './useDropdownHandler';\n\nconst props = withDefaults(defineProps<{\n split?: boolean\n} & BtnDropdownProps>(), {\n split: false,\n caret: true\n});\n\nconst emit = defineEmits<BtnDropdownEvents>();\n</script>\n\n<template>\n <Component\n :is=\"!split ? BtnDropdownSingle : BtnDropdownSplit\"\n v-bind=\"props\"\n @click=\"(e: MouseEvent) => emit('click', e)\"\n @click-toggle=\"(e: MouseEvent) => emit('clickToggle', e)\"\n @show=\"() => emit('show')\"\n @hide=\"() => emit('hide')\">\n <template #button=\"slot\">\n <slot\n name=\"button\"\n v-bind=\"slot\" />\n </template>\n <template #toggle=\"slot\">\n <slot\n name=\"toggle\"\n v-bind=\"slot\" />\n </template>\n <template #split=\"slot\">\n <slot\n name=\"split\"\n v-bind=\"slot\" />\n </template>\n <slot />\n </Component>\n</template>"],"names":["useDropdownHandler","props","emit","target","ref","menu","expanded","alignment","computed","side","placement","classes","buttonClasses","value","floatingStyles","update","useFloating","offset","flip","show","hide","toggle","isFocusable","element","nodes","i","onBlur","e","onClick","onClickToggle","onClickItem","watchEffect","__props","__emit","__expose","_createElementBlock","_normalizeClass","_unref","_renderSlot","_ctx","_normalizeProps","_guardReactiveProps","el","_createElementVNode","_cache","args","_hoisted_1","_createVNode","DropdownMenu","_hoisted_2","_hoisted_4","_createBlock","_resolveDynamicComponent","BtnDropdownSplit","BtnDropdownSingle","_mergeProps","_withCtx","slot"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"btn-dropdown.js","sources":["../src/useDropdownHandler.ts","../src/BtnDropdownSingle.vue","../src/BtnDropdownSplit.vue","../src/BtnDropdown.vue"],"sourcesContent":["import { flip, offset, Placement, type Alignment, type Middleware, type OffsetOptions, type Side } from '@floating-ui/dom';\nimport { useFloating, UseFloatingReturn } from '@floating-ui/vue';\nimport { DropdownMenu } from '@vue-interface/dropdown-menu';\nimport { ComponentPublicInstance, computed, ComputedRef, Ref, ref, watchEffect, type EmitFn, type HTMLAttributes } from 'vue';\n\ntype LiteralUnion<T extends U, U = string> = T | (U & Record<never, never>);\n\nexport type BtnGroupSizes = 'btn-group-xs'\n | 'btn-group-sm' \n | 'btn-group-md'\n | 'btn-group-lg'\n | 'btn-group-xl'\n | 'btn-group-2xl'\n | 'btn-group-3xl'\n | 'btn-group-4xl';\n\nexport type BtnDropdownProps = {\n align?: Alignment;\n block?: boolean;\n buttonClass?: HTMLAttributes['class'],\n caret?: boolean;\n dropup?: boolean;\n dropright?: boolean;\n dropleft?: boolean;\n label?: string;\n offset?: OffsetOptions,\n middleware?: Middleware[],\n side?: Side;\n size?: LiteralUnion<BtnGroupSizes>;\n split?: boolean;\n variant?: string;\n}\n\nexport type BtnDropdownEvents = {\n click: [event: MouseEvent];\n clickToggle: [event: MouseEvent];\n show: [],\n hide: []\n}\n\nexport type BtnDropdownSlotProps = { \n target: (el: Element | ComponentPublicInstance | null) => void;\n expanded: boolean;\n onBlur: (e: FocusEvent) => void;\n onClickToggle: (e: MouseEvent) => void;\n};\n\nexport type UseDropdownHandler = {\n target: Ref<Element|ComponentPublicInstance|null>;\n menu: Ref<InstanceType<typeof DropdownMenu>|undefined>;\n alignment: ComputedRef<Alignment>;\n expanded: Ref<boolean>;\n floatingStyles: UseFloatingReturn['floatingStyles'];\n placement: ComputedRef<Placement>;\n side: ComputedRef<Side>;\n classes: ComputedRef<Record<string, boolean|undefined>>;\n buttonClasses: ComputedRef<Record<string, boolean>>;\n show: () => void;\n hide: () => void;\n toggle: () => void;\n onBlur: (e: FocusEvent) => void;\n onClick: (e: MouseEvent) => void;\n onClickToggle: (e: MouseEvent) => void;\n onClickItem: (e: PointerEvent) => void;\n}\n\nexport function useDropdownHandler(props: BtnDropdownProps, emit: EmitFn<BtnDropdownEvents>): UseDropdownHandler {\n const target = ref<Element|ComponentPublicInstance|null>(null);\n const menu = ref<InstanceType<typeof DropdownMenu>>();\n const expanded = ref(false);\n\n const alignment = computed<Alignment>(() => props.align ?? 'start');\n\n const side = computed<Side>(() => {\n if(props.dropup) {\n return 'top';\n }\n\n if(props.dropleft) {\n return 'left';\n }\n\n if(props.dropright) {\n return 'right';\n }\n\n return 'bottom';\n });\n\n const placement = computed<Placement>(() => `${side.value}-${alignment.value}`);\n\n const classes = computed<Record<string,boolean|undefined>>(() => ({\n 'dropdown': props.dropup && props.dropright && props.dropleft,\n 'dropup': props.dropup,\n 'dropright': props.dropright,\n 'dropleft': props.dropleft,\n 'expanded': expanded.value,\n [props.size ?? '']: !!props.size,\n }));\n \n const buttonClasses = computed(() => {\n const classes = {\n btn: true,\n [props.variant ?? '']: !!props.variant,\n 'btn-block': !!props.block,\n 'no-caret': !props.caret\n };\n \n if(typeof props.buttonClass === 'string') {\n classes[props.buttonClass] = true;\n }\n else if(Array.isArray(props.buttonClass)) {\n for(const value of props.buttonClass) {\n classes[value] = true;\n }\n }\n else if(props.buttonClass) {\n Object.assign(classes, props.buttonClass);\n }\n\n return classes;\n });\n\n const { floatingStyles, update } = useFloating(target, menu, {\n placement: placement,\n middleware: props.middleware ?? [\n offset(props.offset ?? 5),\n flip()\n ]\n });\n\n function show() {\n expanded.value = true;\n\n if(!target.value || !menu.value) {\n return;\n }\n\n update();\n\n emit('show');\n }\n\n function hide() {\n expanded.value = false;\n\n if(target.value instanceof HTMLElement) {\n target.value?.blur();\n }\n\n emit('hide');\n }\n\n function toggle() {\n if(!expanded.value) {\n show();\n }\n else {\n hide();\n }\n }\n\n function isFocusable(element: HTMLElement) {\n const nodes = Array.from(menu.value?.$el.querySelectorAll('label, input, select, textarea') ?? []);\n\n for(const i in nodes) {\n if(element === nodes[i]) {\n return true;\n }\n }\n\n return false;\n }\n \n function onBlur(e: FocusEvent) {\n if(!(e.relatedTarget instanceof HTMLElement) || !(target.value instanceof Element)) {\n hide();\n \n return;\n }\n \n if(menu.value && !menu.value?.$el.contains(e.relatedTarget) || !target.value?.contains(e.relatedTarget)) {\n hide();\n }\n }\n\n function onClick(e: MouseEvent) {\n emit('click', e);\n }\n\n function onClickToggle(e: MouseEvent) {\n e.target?.dispatchEvent(new Event('focus', e));\n \n emit('clickToggle', e);\n\n if(!e.defaultPrevented) {\n toggle();\n }\n }\n\n function onClickItem(e: PointerEvent) {\n if(!(e.target instanceof HTMLElement)) {\n hide();\n\n return;\n }\n\n if(!isFocusable(e.target) && !e.defaultPrevented) {\n hide();\n }\n }\n\n watchEffect(() => {\n if(expanded.value) {\n window.addEventListener('resize', update);\n }\n else {\n window.removeEventListener('resize', update);\n }\n });\n\n return {\n target,\n menu,\n alignment,\n expanded,\n floatingStyles,\n placement,\n side,\n classes,\n buttonClasses,\n show,\n hide,\n toggle,\n onBlur,\n onClick,\n onClickToggle,\n onClickItem\n };\n}","<script setup lang=\"ts\">\nimport { DropdownMenu } from '@vue-interface/dropdown-menu';\nimport { ComponentPublicInstance } from 'vue';\nimport { BtnDropdownEvents, BtnDropdownProps, BtnDropdownSlotProps, useDropdownHandler } from './useDropdownHandler';\n\nconst props = withDefaults(defineProps<BtnDropdownProps>(), {\n caret: true,\n variant: 'btn-primary'\n});\n\nconst emit = defineEmits<BtnDropdownEvents>();\n\nconst {\n target,\n menu,\n buttonClasses,\n classes,\n expanded,\n floatingStyles,\n show,\n hide,\n toggle,\n onBlur,\n onClickToggle,\n onClickItem\n} = useDropdownHandler(props, emit);\n\ndefineExpose({\n show,\n hide,\n toggle,\n});\n\ndefineSlots<{\n button(props: BtnDropdownSlotProps): any;\n default(): any;\n}>();\n</script>\n\n<template>\n <div\n class=\"btn-group\"\n :class=\"classes\">\n <slot\n name=\"button\"\n v-bind=\"{\n target: (el: Element | ComponentPublicInstance | null) => target = el,\n expanded,\n onBlur,\n onClickToggle\n }\">\n <button\n ref=\"target\"\n type=\"button\"\n :class=\"{...buttonClasses, ['dropdown-toggle']: true}\"\n aria-haspopup=\"true\"\n :aria-expanded=\"expanded\"\n @blur=\"onBlur\"\n @click=\"onClickToggle\">\n {{ label }}\n </button>\n </slot>\n <DropdownMenu\n ref=\"menu\"\n :class=\"{\n 'show': expanded\n }\"\n :style=\"floatingStyles\"\n @blur=\"onBlur\"\n @click=\"onClickItem\"\n @mousedown.prevent>\n <slot />\n </DropdownMenu>\n </div>\n</template>","<script setup lang=\"ts\">\nimport { DropdownMenu } from '@vue-interface/dropdown-menu';\nimport { ComponentPublicInstance } from 'vue';\nimport { BtnDropdownEvents, BtnDropdownProps, BtnDropdownSlotProps, useDropdownHandler } from './useDropdownHandler';\n\nconst props = withDefaults(defineProps<BtnDropdownProps>(), {\n caret: true,\n variant: 'btn-primary'\n});\n\nconst emit = defineEmits<BtnDropdownEvents>();\n\nconst {\n target,\n menu,\n buttonClasses,\n classes,\n expanded,\n floatingStyles,\n show,\n hide,\n toggle,\n onBlur,\n onClickToggle,\n onClickItem\n} = useDropdownHandler(props, emit);\n\ndefineExpose({\n show,\n hide,\n toggle,\n});\n\ndefineSlots<{\n button(props: {\n expanded: BtnDropdownSlotProps['expanded'],\n onBlur: BtnDropdownSlotProps['onBlur'],\n onClickToggle: BtnDropdownSlotProps['onClickToggle']\n }): any;\n toggle(props: BtnDropdownSlotProps): any;\n default(): any;\n}>();\n</script>\n\n<template>\n <div\n class=\"btn-group btn-dropdown-split\"\n :class=\"classes\">\n <slot\n v-if=\"!dropleft\"\n name=\"button\"\n v-bind=\"{ expanded, onBlur, onClickToggle }\">\n <button\n type=\"button\"\n :class=\"buttonClasses\"\n aria-haspopup=\"true\"\n :aria-expanded=\"expanded\"\n @blur=\"onBlur\"\n @click=\"onClick\">\n {{ label }}\n </button>\n </slot>\n <div class=\"btn-group\">\n <slot\n name=\"toggle\"\n v-bind=\"{\n target: (el: Element | ComponentPublicInstance | null) => target = el,\n expanded,\n onBlur,\n onClickToggle\n }\">\n <button\n ref=\"target\"\n type=\"button\"\n aria-haspopup=\"true\"\n :aria-expanded=\"expanded\"\n :class=\"{...buttonClasses, 'dropdown-toggle': true, 'dropdown-toggle-split': split}\"\n @blur=\"onBlur\"\n @click=\"onClickToggle\" />\n </slot>\n <DropdownMenu\n ref=\"menu\"\n :class=\"{\n 'show': expanded\n }\"\n :style=\"floatingStyles\"\n @blur=\"onBlur\"\n @click=\"onClickItem\"\n @mousedown.prevent>\n <slot />\n </DropdownMenu>\n </div>\n <slot\n v-if=\"dropleft\"\n name=\"button\"\n v-bind=\"{ expanded, onBlur, onClickToggle }\">\n <button\n type=\"button\"\n :class=\"buttonClasses\"\n aria-haspopup=\"true\"\n :aria-expanded=\"expanded\"\n @blur=\"onBlur\"\n @click=\"onClick\">\n {{ label }}\n </button>\n </slot>\n </div>\n</template>","<script setup lang=\"ts\">\nimport { useTemplateRef } from 'vue';\nimport { type ComponentExposed } from 'vue-component-type-helpers';\nimport BtnDropdownSingle from './BtnDropdownSingle.vue';\nimport BtnDropdownSplit from './BtnDropdownSplit.vue';\nimport { BtnDropdownEvents, BtnDropdownProps, BtnDropdownSlotProps } from './useDropdownHandler';\n\nconst props = withDefaults(defineProps<{\n split?: boolean\n} & BtnDropdownProps>(), {\n split: false,\n caret: true\n});\n\nconst emit = defineEmits<BtnDropdownEvents>();\n\nconst el = useTemplateRef<ComponentExposed<typeof BtnDropdownSingle | typeof BtnDropdownSplit>>('el');\n\ndefineExpose({\n hide: () => el.value?.hide(),\n show: () => el.value?.show(),\n toggle: () => el.value?.toggle(),\n});\n\ndefineSlots<{\n button(props: BtnDropdownSlotProps): any;\n toggle(props: BtnDropdownSlotProps): any;\n split(props: BtnDropdownSlotProps): any;\n default(): any;\n}>();\n</script>\n\n<template>\n <Component\n ref=\"el\"\n :is=\"!split ? BtnDropdownSingle : BtnDropdownSplit\"\n v-bind=\"props\"\n @click=\"(e: MouseEvent) => emit('click', e)\"\n @click-toggle=\"(e: MouseEvent) => emit('clickToggle', e)\"\n @show=\"() => emit('show')\"\n @hide=\"() => emit('hide')\">\n <template #button=\"slot\">\n <slot\n name=\"button\"\n v-bind=\"slot\" />\n </template>\n <template #toggle=\"slot\">\n <slot\n name=\"toggle\"\n v-bind=\"slot\" />\n </template>\n <template #split=\"slot\">\n <slot\n name=\"split\"\n v-bind=\"slot\" />\n </template>\n <slot />\n </Component>\n</template>"],"names":["useDropdownHandler","props","emit","target","ref","menu","expanded","alignment","computed","side","placement","classes","buttonClasses","value","floatingStyles","update","useFloating","offset","flip","show","hide","toggle","isFocusable","element","nodes","i","onBlur","e","onClick","onClickToggle","onClickItem","watchEffect","__props","__emit","__expose","_createElementBlock","_normalizeClass","_unref","_renderSlot","_ctx","_normalizeProps","_guardReactiveProps","el","_createElementVNode","_cache","args","_hoisted_1","_createVNode","DropdownMenu","_hoisted_2","_hoisted_4","useTemplateRef","_openBlock","_createBlock","_resolveDynamicComponent","BtnDropdownSplit","BtnDropdownSingle","_mergeProps","_withCtx","slot"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(
|
|
1
|
+
(function(C,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@vue-interface/dropdown-menu"),require("@floating-ui/dom"),require("@floating-ui/vue")):typeof define=="function"&&define.amd?define(["exports","vue","@vue-interface/dropdown-menu","@floating-ui/dom","@floating-ui/vue"],e):(C=typeof globalThis<"u"?globalThis:C||self,e(C.BtnDropdown={},C.Vue,C.VueInterfaceDropdownMenu,C.FloatingUiDom,C.FloatingUiVue))})(this,(function(C,e,S,T,x){"use strict";function P(t,k){const d=e.ref(null),c=e.ref(),a=e.ref(!1),f=e.computed(()=>t.align??"start"),g=e.computed(()=>t.dropup?"top":t.dropleft?"left":t.dropright?"right":"bottom"),i=e.computed(()=>`${g.value}-${f.value}`),s=e.computed(()=>({dropdown:t.dropup&&t.dropright&&t.dropleft,dropup:t.dropup,dropright:t.dropright,dropleft:t.dropleft,expanded:a.value,[t.size??""]:!!t.size})),u=e.computed(()=>{const l={btn:!0,[t.variant??""]:!!t.variant,"btn-block":!!t.block,"no-caret":!t.caret};if(typeof t.buttonClass=="string")l[t.buttonClass]=!0;else if(Array.isArray(t.buttonClass))for(const z of t.buttonClass)l[z]=!0;else t.buttonClass&&Object.assign(l,t.buttonClass);return l}),{floatingStyles:B,update:w}=x.useFloating(d,c,{placement:i,middleware:t.middleware??[T.offset(t.offset??5),T.flip()]});function b(){a.value=!0,!(!d.value||!c.value)&&(w(),k("show"))}function y(){a.value=!1,d.value instanceof HTMLElement&&d.value?.blur(),k("hide")}function r(){a.value?y():b()}function m(l){const z=Array.from(c.value?.$el.querySelectorAll("label, input, select, textarea")??[]);for(const H in z)if(l===z[H])return!0;return!1}function h(l){if(!(l.relatedTarget instanceof HTMLElement)||!(d.value instanceof Element)){y();return}(c.value&&!c.value?.$el.contains(l.relatedTarget)||!d.value?.contains(l.relatedTarget))&&y()}function p(l){k("click",l)}function n(l){l.target?.dispatchEvent(new Event("focus",l)),k("clickToggle",l),l.defaultPrevented||r()}function o(l){if(!(l.target instanceof HTMLElement)){y();return}!m(l.target)&&!l.defaultPrevented&&y()}return e.watchEffect(()=>{a.value?window.addEventListener("resize",w):window.removeEventListener("resize",w)}),{target:d,menu:c,alignment:f,expanded:a,floatingStyles:B,placement:i,side:g,classes:s,buttonClasses:u,show:b,hide:y,toggle:r,onBlur:h,onClick:p,onClickToggle:n,onClickItem:o}}const $=["aria-expanded"],E=e.defineComponent({__name:"BtnDropdownSingle",props:{align:{},block:{type:Boolean},buttonClass:{},caret:{type:Boolean,default:!0},dropup:{type:Boolean},dropright:{type:Boolean},dropleft:{type:Boolean},label:{},offset:{},middleware:{},side:{},size:{},split:{type:Boolean},variant:{default:"btn-primary"}},emits:["click","clickToggle","show","hide"],setup(t,{expose:k,emit:d}){const c=t,a=d,{target:f,menu:g,buttonClasses:i,classes:s,expanded:u,floatingStyles:B,show:w,hide:b,toggle:y,onBlur:r,onClickToggle:m,onClickItem:h}=P(c,a);return k({show:w,hide:b,toggle:y}),(p,n)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["btn-group",e.unref(s)])},[e.renderSlot(p.$slots,"button",e.normalizeProps(e.guardReactiveProps({target:o=>f.value=o,expanded:e.unref(u),onBlur:e.unref(r),onClickToggle:e.unref(m)})),()=>[e.createElementVNode("button",{ref_key:"target",ref:f,type:"button",class:e.normalizeClass({...e.unref(i),"dropdown-toggle":!0}),"aria-haspopup":"true","aria-expanded":e.unref(u),onBlur:n[0]||(n[0]=(...o)=>e.unref(r)&&e.unref(r)(...o)),onClick:n[1]||(n[1]=(...o)=>e.unref(m)&&e.unref(m)(...o))},e.toDisplayString(t.label),43,$)]),e.createVNode(e.unref(S.DropdownMenu),{ref_key:"menu",ref:g,class:e.normalizeClass({show:e.unref(u)}),style:e.normalizeStyle(e.unref(B)),onBlur:e.unref(r),onClick:e.unref(h),onMousedown:n[2]||(n[2]=e.withModifiers(()=>{},["prevent"]))},{default:e.withCtx(()=>[e.renderSlot(p.$slots,"default")]),_:3},8,["class","style","onBlur","onClick"])],2))}}),D=["aria-expanded"],V={class:"btn-group"},M=["aria-expanded"],N=["aria-expanded"],R=e.defineComponent({__name:"BtnDropdownSplit",props:{align:{},block:{type:Boolean},buttonClass:{},caret:{type:Boolean,default:!0},dropup:{type:Boolean},dropright:{type:Boolean},dropleft:{type:Boolean},label:{},offset:{},middleware:{},side:{},size:{},split:{type:Boolean},variant:{default:"btn-primary"}},emits:["click","clickToggle","show","hide"],setup(t,{expose:k,emit:d}){const c=t,a=d,{target:f,menu:g,buttonClasses:i,classes:s,expanded:u,floatingStyles:B,show:w,hide:b,toggle:y,onBlur:r,onClickToggle:m,onClickItem:h}=P(c,a);return k({show:w,hide:b,toggle:y}),(p,n)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["btn-group btn-dropdown-split",e.unref(s)])},[t.dropleft?e.createCommentVNode("",!0):e.renderSlot(p.$slots,"button",e.normalizeProps(e.mergeProps({key:0},{expanded:e.unref(u),onBlur:e.unref(r),onClickToggle:e.unref(m)})),()=>[e.createElementVNode("button",{type:"button",class:e.normalizeClass(e.unref(i)),"aria-haspopup":"true","aria-expanded":e.unref(u),onBlur:n[0]||(n[0]=(...o)=>e.unref(r)&&e.unref(r)(...o)),onClick:n[1]||(n[1]=(...o)=>p.onClick&&p.onClick(...o))},e.toDisplayString(t.label),43,D)]),e.createElementVNode("div",V,[e.renderSlot(p.$slots,"toggle",e.normalizeProps(e.guardReactiveProps({target:o=>f.value=o,expanded:e.unref(u),onBlur:e.unref(r),onClickToggle:e.unref(m)})),()=>[e.createElementVNode("button",{ref_key:"target",ref:f,type:"button","aria-haspopup":"true","aria-expanded":e.unref(u),class:e.normalizeClass({...e.unref(i),"dropdown-toggle":!0,"dropdown-toggle-split":t.split}),onBlur:n[2]||(n[2]=(...o)=>e.unref(r)&&e.unref(r)(...o)),onClick:n[3]||(n[3]=(...o)=>e.unref(m)&&e.unref(m)(...o))},null,42,M)]),e.createVNode(e.unref(S.DropdownMenu),{ref_key:"menu",ref:g,class:e.normalizeClass({show:e.unref(u)}),style:e.normalizeStyle(e.unref(B)),onBlur:e.unref(r),onClick:e.unref(h),onMousedown:n[4]||(n[4]=e.withModifiers(()=>{},["prevent"]))},{default:e.withCtx(()=>[e.renderSlot(p.$slots,"default")]),_:3},8,["class","style","onBlur","onClick"])]),t.dropleft?e.renderSlot(p.$slots,"button",e.normalizeProps(e.mergeProps({key:1},{expanded:e.unref(u),onBlur:e.unref(r),onClickToggle:e.unref(m)})),()=>[e.createElementVNode("button",{type:"button",class:e.normalizeClass(e.unref(i)),"aria-haspopup":"true","aria-expanded":e.unref(u),onBlur:n[5]||(n[5]=(...o)=>e.unref(r)&&e.unref(r)(...o)),onClick:n[6]||(n[6]=(...o)=>p.onClick&&p.onClick(...o))},e.toDisplayString(t.label),43,N)]):e.createCommentVNode("",!0)],2))}}),q=e.defineComponent({__name:"BtnDropdown",props:{split:{type:Boolean,default:!1},align:{},block:{type:Boolean},buttonClass:{},caret:{type:Boolean,default:!0},dropup:{type:Boolean},dropright:{type:Boolean},dropleft:{type:Boolean},label:{},offset:{},middleware:{},side:{},size:{},variant:{}},emits:["click","clickToggle","show","hide"],setup(t,{expose:k,emit:d}){const c=t,a=d,f=e.useTemplateRef("el");return k({hide:()=>f.value?.hide(),show:()=>f.value?.show(),toggle:()=>f.value?.toggle()}),(g,i)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(t.split?R:E),e.mergeProps({ref_key:"el",ref:f},c,{onClick:i[0]||(i[0]=s=>a("click",s)),onClickToggle:i[1]||(i[1]=s=>a("clickToggle",s)),onShow:i[2]||(i[2]=()=>a("show")),onHide:i[3]||(i[3]=()=>a("hide"))}),{button:e.withCtx(s=>[e.renderSlot(g.$slots,"button",e.normalizeProps(e.guardReactiveProps(s)))]),toggle:e.withCtx(s=>[e.renderSlot(g.$slots,"toggle",e.normalizeProps(e.guardReactiveProps(s)))]),split:e.withCtx(s=>[e.renderSlot(g.$slots,"split",e.normalizeProps(e.guardReactiveProps(s)))]),default:e.withCtx(()=>[e.renderSlot(g.$slots,"default")]),_:3},16))}});C.BtnDropdown=q,Object.defineProperty(C,Symbol.toStringTag,{value:"Module"})}));
|
|
2
2
|
//# sourceMappingURL=btn-dropdown.umd.cjs.map
|