sb-floating-panel-vue 5.2.0 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +81 -213
- package/dist/components/SbContainer.vue.d.ts +1 -1
- package/dist/components/SbFloating.vue.d.ts +0 -3
- package/dist/components/SbReference.vue.d.ts +0 -2
- package/dist/composables/useSbFloatingPanel.d.ts +6 -16
- package/dist/sb-floating-panel.es.js +259 -265
- package/dist/sb-floating-panel.umd.js +1 -1
- package/dist/types.d.ts +30 -7
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Teleport as e, Transition as t, computed as n, createBlock as r, createCommentVNode as i, createElementBlock as a, createVNode as o, defineComponent as s, inject as c, mergeModels as l, mergeProps as u, nextTick as
|
|
2
|
-
import { autoUpdate as k, flip as A, hide as j, limitShift as M, offset as N, shift as P, size as F, useFloating as
|
|
1
|
+
import { Teleport as e, Transition as t, computed as n, createBlock as r, createCommentVNode as i, createElementBlock as a, createVNode as o, defineComponent as s, inject as c, mergeModels as l, mergeProps as u, nextTick as d, normalizeStyle as f, onBeforeUnmount as p, onMounted as m, onScopeDispose as h, openBlock as g, provide as _, ref as v, renderSlot as y, resolveDynamicComponent as b, toRef as x, unref as S, useAttrs as C, useId as w, useModel as T, watch as E, watchEffect as D, withCtx as O } from "vue";
|
|
2
|
+
import { autoUpdate as k, flip as A, hide as j, limitShift as M, offset as N, shift as P, size as F, useFloating as I } from "@floating-ui/vue";
|
|
3
3
|
//#region src/utils/dom.ts
|
|
4
|
-
var
|
|
4
|
+
var L = "data-sbf-focus-guard", R = [
|
|
5
5
|
"a[href]",
|
|
6
6
|
"button:not([disabled])",
|
|
7
7
|
"input:not([disabled]):not([type=\"hidden\"])",
|
|
@@ -12,66 +12,66 @@ var re = "data-sbf-focus-guard", I = [
|
|
|
12
12
|
"video[controls]",
|
|
13
13
|
"[tabindex]",
|
|
14
14
|
"[contenteditable=\"true\"]"
|
|
15
|
-
].join(","),
|
|
16
|
-
function
|
|
15
|
+
].join(","), ee = (e) => e.tabIndex >= 0 && !e.hasAttribute("data-sbf-focus-guard") && !e.closest("[inert]") && (e.checkVisibility?.() ?? !0);
|
|
16
|
+
function te(e) {
|
|
17
17
|
let t = e && typeof e == "object" && "$el" in e ? e.$el : e;
|
|
18
18
|
return t instanceof HTMLElement ? t : null;
|
|
19
19
|
}
|
|
20
|
-
function
|
|
21
|
-
let t = e instanceof Element ? e.closest(
|
|
20
|
+
function z(e) {
|
|
21
|
+
let t = e instanceof Element ? e.closest(R) : null;
|
|
22
22
|
return !!t && !t.closest("[inert]");
|
|
23
23
|
}
|
|
24
|
-
function
|
|
24
|
+
function B(e) {
|
|
25
25
|
try {
|
|
26
26
|
return e.matches(":focus-visible");
|
|
27
27
|
} catch {
|
|
28
28
|
return !0;
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
|
-
var
|
|
32
|
-
function
|
|
33
|
-
return [...e.querySelectorAll(
|
|
31
|
+
var ne = (e) => e.matches(R) && !e.closest("[inert]");
|
|
32
|
+
function V(e) {
|
|
33
|
+
return [...e.querySelectorAll(R)].filter(ee);
|
|
34
34
|
}
|
|
35
|
-
function
|
|
36
|
-
return
|
|
35
|
+
function H(e, t) {
|
|
36
|
+
return V(e.ownerDocument).find((n) => !!(e.compareDocumentPosition(n) & Node.DOCUMENT_POSITION_FOLLOWING) && !e.contains(n) && !t(n));
|
|
37
37
|
}
|
|
38
38
|
//#endregion
|
|
39
39
|
//#region src/utils/warn.ts
|
|
40
|
-
var
|
|
40
|
+
var U = (() => {
|
|
41
41
|
try {
|
|
42
42
|
return process.env.NODE_ENV !== "production";
|
|
43
43
|
} catch {
|
|
44
44
|
return !1;
|
|
45
45
|
}
|
|
46
46
|
})();
|
|
47
|
-
function
|
|
48
|
-
|
|
47
|
+
function W(e) {
|
|
48
|
+
U && console.warn(`[sb-floating-panel-vue] ${e}`);
|
|
49
49
|
}
|
|
50
50
|
//#endregion
|
|
51
51
|
//#region src/composables/useSbFloatingContext.ts
|
|
52
|
-
var
|
|
53
|
-
function
|
|
52
|
+
var G = (e) => e.parent?.navigation.value === "menu";
|
|
53
|
+
function K(e, t) {
|
|
54
54
|
let n = document.activeElement, r = e.reference.value;
|
|
55
|
-
return !n || !r || r.contains(n) || !e.contains(n) ? !1 : ((t ? r :
|
|
55
|
+
return !n || !r || r.contains(n) || !e.contains(n) ? !1 : ((t ? r : H(r, (t) => e.contains(t)))?.focus({ preventScroll: !0 }), !0);
|
|
56
56
|
}
|
|
57
|
-
var
|
|
58
|
-
function
|
|
59
|
-
return ++e.parts[t] > 1 &&
|
|
57
|
+
var q = Symbol("SbFloatingContext");
|
|
58
|
+
function re(e, t, n) {
|
|
59
|
+
return ++e.parts[t] > 1 && W(`<SbContainer> has more than one <${n}>: they share one open state and position, so only the last one works. Use one SbContainer for each panel.`), () => e.parts[t]--;
|
|
60
60
|
}
|
|
61
|
-
function
|
|
62
|
-
let t = c(
|
|
61
|
+
function ie(e) {
|
|
62
|
+
let t = c(q, null);
|
|
63
63
|
if (!t) throw Error(`[sb-floating-panel-vue] <${e}> must be used inside <SbContainer>.`);
|
|
64
64
|
return t;
|
|
65
65
|
}
|
|
66
66
|
//#endregion
|
|
67
67
|
//#region src/composables/useSbFloatingPanel.ts
|
|
68
|
-
var
|
|
68
|
+
var J = (e) => `${Math.max(0, e)}px`, ae = (e, t) => {
|
|
69
69
|
let [n, r] = e.split("-"), i = t && (n === "top" || n === "bottom"), a = r === "start" ? i ? "100%" : "0%" : r === "end" ? i ? "0%" : "100%" : "50%";
|
|
70
70
|
return n === "top" ? `${a} 100%` : n === "bottom" ? `${a} 0%` : n === "left" ? `100% ${a}` : `0% ${a}`;
|
|
71
71
|
};
|
|
72
|
-
function
|
|
73
|
-
let
|
|
74
|
-
let
|
|
72
|
+
function oe(e, t) {
|
|
73
|
+
let r = v(null), i = v(null), a = n(() => {
|
|
74
|
+
let { padding: t, matchWidth: n } = e, r = e.placement.includes("-"), i = A({
|
|
75
75
|
padding: t,
|
|
76
76
|
crossAxis: "alignment",
|
|
77
77
|
fallbackAxisSideDirection: "end"
|
|
@@ -79,47 +79,47 @@ function q(e) {
|
|
|
79
79
|
padding: t,
|
|
80
80
|
limiter: M()
|
|
81
81
|
}), o = [
|
|
82
|
-
N(
|
|
82
|
+
N(e.offset),
|
|
83
83
|
...r ? [i, a] : [a, i],
|
|
84
84
|
F({
|
|
85
85
|
padding: t,
|
|
86
86
|
apply({ rects: e, elements: t, availableWidth: r, availableHeight: i, placement: a }) {
|
|
87
|
-
let { style: o } = t.floating, s =
|
|
87
|
+
let { style: o } = t.floating, s = J(e.reference.width);
|
|
88
88
|
o.setProperty("--sbf-reference-width", s);
|
|
89
89
|
let c = getComputedStyle(t.floating).direction === "rtl";
|
|
90
|
-
o.setProperty("--sbf-transform-origin",
|
|
90
|
+
o.setProperty("--sbf-transform-origin", ae(a, c)), o.setProperty("--sbf-available-width", J(r)), o.setProperty("--sbf-available-height", J(i)), o.width = n === !0 ? s : "", o.minWidth = n === "min" ? s : "";
|
|
91
91
|
}
|
|
92
92
|
})
|
|
93
93
|
];
|
|
94
|
-
return
|
|
95
|
-
}), { floatingStyles:
|
|
96
|
-
open:
|
|
97
|
-
placement: () =>
|
|
98
|
-
strategy: () =>
|
|
99
|
-
middleware:
|
|
94
|
+
return e.hideWhenDetached && o.push(j({ padding: t })), o;
|
|
95
|
+
}), { floatingStyles: o, middlewareData: s, placement: c, isPositioned: l, update: u } = I(r, i, {
|
|
96
|
+
open: t,
|
|
97
|
+
placement: () => e.placement,
|
|
98
|
+
strategy: () => e.strategy,
|
|
99
|
+
middleware: a,
|
|
100
100
|
whileElementsMounted: k
|
|
101
|
-
}),
|
|
101
|
+
}), d = n(() => !!s.value.hide?.referenceHidden);
|
|
102
102
|
return {
|
|
103
|
-
reference:
|
|
104
|
-
floating:
|
|
103
|
+
reference: r,
|
|
104
|
+
floating: i,
|
|
105
105
|
floatingStyles: n(() => ({
|
|
106
|
-
...
|
|
107
|
-
...
|
|
106
|
+
...o.value,
|
|
107
|
+
...d.value ? { visibility: "hidden" } : {}
|
|
108
108
|
})),
|
|
109
|
-
placement:
|
|
110
|
-
side: n(() =>
|
|
111
|
-
align: n(() =>
|
|
112
|
-
isPositioned:
|
|
113
|
-
referenceHidden:
|
|
114
|
-
update:
|
|
109
|
+
placement: c,
|
|
110
|
+
side: n(() => c.value.split("-")[0]),
|
|
111
|
+
align: n(() => c.value.split("-")[1]),
|
|
112
|
+
isPositioned: l,
|
|
113
|
+
referenceHidden: d,
|
|
114
|
+
update: u
|
|
115
115
|
};
|
|
116
116
|
}
|
|
117
117
|
//#endregion
|
|
118
118
|
//#region src/components/SbContainer.vue?vue&type=script&setup=true&lang.ts
|
|
119
|
-
var
|
|
119
|
+
var Y = [], X = {
|
|
120
120
|
open: 300,
|
|
121
121
|
close: 150
|
|
122
|
-
},
|
|
122
|
+
}, se = /* @__PURE__ */ s({
|
|
123
123
|
inheritAttrs: !1,
|
|
124
124
|
__name: "SbContainer",
|
|
125
125
|
props: /*@__PURE__*/ l({
|
|
@@ -144,7 +144,7 @@ var J = [], Y = {
|
|
|
144
144
|
default: !1
|
|
145
145
|
},
|
|
146
146
|
trigger: { default: "click" },
|
|
147
|
-
delay: { default: () => ({ ...
|
|
147
|
+
delay: { default: () => ({ ...X }) },
|
|
148
148
|
closeOnEscape: {
|
|
149
149
|
type: Boolean,
|
|
150
150
|
default: !0
|
|
@@ -167,198 +167,195 @@ var J = [], Y = {
|
|
|
167
167
|
emits: /*@__PURE__*/ l(["open", "close"], ["update:open"]),
|
|
168
168
|
setup(e, { expose: t, emit: r }) {
|
|
169
169
|
let i = e, a = T(e, "open"), o = r, s = i.defaultOpen, l = n(() => !i.disabled && (a.value ?? s)), u;
|
|
170
|
-
|
|
171
|
-
let
|
|
172
|
-
clearTimeout(u), !(e && i.disabled) && e !== l.value && (
|
|
173
|
-
}),
|
|
174
|
-
if (e.pointerType === "touch" || (
|
|
175
|
-
let t = e.type === "pointerenter" ||
|
|
170
|
+
h(() => clearTimeout(u));
|
|
171
|
+
let f, m = ((e, t) => {
|
|
172
|
+
clearTimeout(u), !(e && i.disabled) && e !== l.value && (f = t, a.value = e, d(() => f = void 0));
|
|
173
|
+
}), g = () => m(!0, "api"), b = () => m(!1, "api"), C = () => m(!l.value, "api"), D = (e) => {
|
|
174
|
+
if (e.pointerType === "touch" || (A?.hover(e), i.trigger !== "hover")) return;
|
|
175
|
+
let t = e.type === "pointerenter" || j.contains(e.relatedTarget);
|
|
176
176
|
if (clearTimeout(u), t === l.value) return;
|
|
177
|
-
let { delay: n } = i, r = t ? "open" : "close", a = typeof n == "number" ? n : n[r] ??
|
|
178
|
-
u = setTimeout(() =>
|
|
179
|
-
},
|
|
177
|
+
let { delay: n } = i, r = t ? "open" : "close", a = typeof n == "number" ? n : n[r] ?? X[r];
|
|
178
|
+
u = setTimeout(() => m(t, "hover"), a);
|
|
179
|
+
}, O = oe(i, l), k = /* @__PURE__ */ new Set(), A = c(q, null), j = {
|
|
180
|
+
...O,
|
|
180
181
|
isOpen: l,
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
offset: () => i.offset,
|
|
184
|
-
padding: () => i.padding,
|
|
185
|
-
matchWidth: () => i.matchWidth,
|
|
186
|
-
hideWhenDetached: () => i.hideWhenDetached
|
|
187
|
-
}), D = /* @__PURE__ */ new Set(), O = c(W, null), k = {
|
|
188
|
-
...C,
|
|
189
|
-
isOpen: l,
|
|
190
|
-
disabled: b(i, "disabled"),
|
|
191
|
-
trigger: b(i, "trigger"),
|
|
182
|
+
disabled: x(i, "disabled"),
|
|
183
|
+
trigger: x(i, "trigger"),
|
|
192
184
|
floatingId: `${w()}-floating`,
|
|
193
185
|
referenceId: v(),
|
|
194
186
|
floatingRole: v("dialog"),
|
|
195
187
|
navigation: v(null),
|
|
196
188
|
focusRequest: v(null),
|
|
197
|
-
parent:
|
|
189
|
+
parent: A,
|
|
198
190
|
skipFocusReturn: !1,
|
|
199
191
|
parts: {
|
|
200
192
|
reference: 0,
|
|
201
193
|
floating: 0
|
|
202
194
|
},
|
|
203
195
|
isUnmounting: !1,
|
|
204
|
-
open:
|
|
205
|
-
close:
|
|
206
|
-
toggle:
|
|
207
|
-
setOpen:
|
|
208
|
-
hover:
|
|
209
|
-
contains: (e) => e instanceof Node ?
|
|
210
|
-
registerChild: (e) => (
|
|
196
|
+
open: g,
|
|
197
|
+
close: b,
|
|
198
|
+
toggle: C,
|
|
199
|
+
setOpen: m,
|
|
200
|
+
hover: D,
|
|
201
|
+
contains: (e) => e instanceof Node ? O.reference.value?.contains(e) || O.floating.value?.contains(e) ? !0 : [...k].some((t) => t.contains(e)) : !1,
|
|
202
|
+
registerChild: (e) => (k.add(e), () => k.delete(e))
|
|
211
203
|
};
|
|
212
|
-
|
|
213
|
-
|
|
204
|
+
A && h(A.registerChild(j)), _(q, j), p(() => {
|
|
205
|
+
j.isUnmounting = !0, K(j, !1);
|
|
214
206
|
});
|
|
215
|
-
let
|
|
216
|
-
let t = e.composedPath()[0] ?? e.target;
|
|
217
|
-
return
|
|
218
|
-
},
|
|
219
|
-
e.key === "Escape" &&
|
|
220
|
-
},
|
|
221
|
-
|
|
222
|
-
},
|
|
223
|
-
if (
|
|
207
|
+
let M = (e) => {
|
|
208
|
+
let t = e.composedPath()[0] ?? e.target, n = Y.filter((e) => e.closeOnEscape());
|
|
209
|
+
return (n.findLast((e) => e.context.contains(t)) ?? n[n.length - 1])?.context;
|
|
210
|
+
}, N = (e) => {
|
|
211
|
+
e.key === "Escape" && M(e) === j && (e.defaultPrevented || e.isComposing || (e.preventDefault(), m(!1, "escape")));
|
|
212
|
+
}, P = (e) => {
|
|
213
|
+
j.contains(e) || (j.skipFocusReturn = z(e), m(!1, "outside"));
|
|
214
|
+
}, F, I = (e) => {
|
|
215
|
+
if (F?.(), !i.closeOnClickOutside) return;
|
|
224
216
|
let t = e.composedPath()[0] ?? e.target;
|
|
225
217
|
if (e.pointerType !== "touch") {
|
|
226
|
-
|
|
218
|
+
P(t);
|
|
227
219
|
return;
|
|
228
220
|
}
|
|
229
|
-
if (
|
|
221
|
+
if (j.contains(t)) return;
|
|
230
222
|
let n = (e) => {
|
|
231
|
-
|
|
223
|
+
F?.(), P(e.composedPath()[0] ?? e.target);
|
|
232
224
|
};
|
|
233
|
-
document.addEventListener("click", n, !0),
|
|
234
|
-
document.removeEventListener("click", n, !0),
|
|
225
|
+
document.addEventListener("click", n, !0), F = () => {
|
|
226
|
+
document.removeEventListener("click", n, !0), F = void 0;
|
|
235
227
|
};
|
|
236
|
-
},
|
|
237
|
-
i.closeOnFocusOut && (
|
|
228
|
+
}, L = (e) => {
|
|
229
|
+
i.closeOnFocusOut && (j.contains(e.composedPath()[0] ?? e.target) || m(!1, "focus-out"));
|
|
238
230
|
};
|
|
239
231
|
return E(l, (e, t, n) => {
|
|
240
|
-
e
|
|
241
|
-
|
|
242
|
-
|
|
232
|
+
if (!e || typeof document > "u") return;
|
|
233
|
+
let r = {
|
|
234
|
+
context: j,
|
|
235
|
+
closeOnEscape: () => i.closeOnEscape
|
|
236
|
+
};
|
|
237
|
+
Y.push(r), document.addEventListener("keydown", N), document.addEventListener("pointerdown", I, !0), document.addEventListener("focusin", L), n(() => {
|
|
238
|
+
document.removeEventListener("keydown", N), document.removeEventListener("pointerdown", I, !0), document.removeEventListener("focusin", L), F?.(), Y.splice(Y.indexOf(r), 1);
|
|
239
|
+
});
|
|
243
240
|
}, { immediate: !0 }), E(l, (e) => {
|
|
244
|
-
let t =
|
|
245
|
-
|
|
246
|
-
}), E(
|
|
247
|
-
e && i.hideWhenDetached === "close" &&
|
|
241
|
+
let t = f ?? (!e && i.disabled ? "disabled" : "api");
|
|
242
|
+
f = void 0, o(e ? "open" : "close", t);
|
|
243
|
+
}), E(O.referenceHidden, (e) => {
|
|
244
|
+
e && i.hideWhenDetached === "close" && m(!1, "detached");
|
|
248
245
|
}), E(() => i.disabled, (e) => {
|
|
249
246
|
e && (a.value ?? s) && (a.value = !1);
|
|
250
247
|
}), t({
|
|
251
248
|
get isOpen() {
|
|
252
249
|
return l.value;
|
|
253
250
|
},
|
|
254
|
-
open:
|
|
255
|
-
close:
|
|
256
|
-
toggle:
|
|
257
|
-
update:
|
|
258
|
-
}), (e, t) =>
|
|
251
|
+
open: g,
|
|
252
|
+
close: b,
|
|
253
|
+
toggle: C,
|
|
254
|
+
update: O.update
|
|
255
|
+
}), (e, t) => y(e.$slots, "default", {
|
|
259
256
|
isOpen: l.value,
|
|
260
|
-
open:
|
|
261
|
-
close:
|
|
262
|
-
toggle:
|
|
263
|
-
placement: S(
|
|
264
|
-
side: S(
|
|
265
|
-
align: S(
|
|
266
|
-
floatingId:
|
|
267
|
-
referenceId:
|
|
257
|
+
open: g,
|
|
258
|
+
close: b,
|
|
259
|
+
toggle: C,
|
|
260
|
+
placement: S(O).placement.value,
|
|
261
|
+
side: S(O).side.value,
|
|
262
|
+
align: S(O).align.value,
|
|
263
|
+
floatingId: j.floatingId,
|
|
264
|
+
referenceId: j.referenceId.value
|
|
268
265
|
});
|
|
269
266
|
}
|
|
270
|
-
}),
|
|
267
|
+
}), Z = {
|
|
271
268
|
dialog: "dialog",
|
|
272
269
|
alertdialog: "dialog",
|
|
273
270
|
menu: "menu",
|
|
274
271
|
listbox: "listbox",
|
|
275
272
|
tree: "tree",
|
|
276
273
|
grid: "grid"
|
|
277
|
-
},
|
|
274
|
+
}, ce = {
|
|
278
275
|
menu: "[role=\"menuitem\"], [role=\"menuitemcheckbox\"], [role=\"menuitemradio\"]",
|
|
279
276
|
listbox: "[role=\"option\"]"
|
|
280
|
-
},
|
|
281
|
-
function
|
|
282
|
-
return [...e.querySelectorAll(
|
|
277
|
+
}, le = (e) => !!e && Object.hasOwn(ce, e);
|
|
278
|
+
function ue(e, t) {
|
|
279
|
+
return [...e.querySelectorAll(ce[t])].filter((n) => n.closest(`[role="${t}"]`) === e && !n.matches(":disabled") && (n.checkVisibility?.() ?? !0));
|
|
283
280
|
}
|
|
284
|
-
var Q = (e) => e instanceof Element && !!e.closest("input, textarea, select, [contenteditable]:not([contenteditable=\"false\"])"),
|
|
281
|
+
var Q = (e) => e instanceof Element && !!e.closest("input, textarea, select, [contenteditable]:not([contenteditable=\"false\"])"), de = (e) => getComputedStyle(e).direction === "rtl" ? {
|
|
285
282
|
open: "ArrowLeft",
|
|
286
283
|
close: "ArrowRight"
|
|
287
284
|
} : {
|
|
288
285
|
open: "ArrowRight",
|
|
289
286
|
close: "ArrowLeft"
|
|
290
|
-
},
|
|
287
|
+
}, fe = /* @__PURE__ */ s({
|
|
291
288
|
__name: "SbReference",
|
|
292
289
|
props: {
|
|
293
290
|
as: { default: "button" },
|
|
294
|
-
id: {
|
|
295
|
-
ariaHaspopup: {
|
|
291
|
+
id: {},
|
|
292
|
+
ariaHaspopup: {}
|
|
296
293
|
},
|
|
297
294
|
setup(e) {
|
|
298
|
-
let t = e, i = C(), a =
|
|
295
|
+
let t = e, i = C(), a = ie("SbReference"), { isOpen: o, disabled: s, floatingId: c, floatingRole: l } = a, u = re(a, "reference", "SbReference"), d = [
|
|
299
296
|
"button",
|
|
300
297
|
"input",
|
|
301
298
|
"textarea",
|
|
302
299
|
"select"
|
|
303
|
-
],
|
|
300
|
+
], f = () => typeof t.as != "string" || d.includes(t.as) || t.as === "a" && i.href != null, h = `${w()}-reference`, _ = n(() => t.id ?? h);
|
|
304
301
|
D(() => {
|
|
305
|
-
a.referenceId.value =
|
|
306
|
-
}),
|
|
302
|
+
a.referenceId.value = _.value;
|
|
303
|
+
}), m(() => {
|
|
307
304
|
let e = a.reference.value;
|
|
308
|
-
e ? Q(e) && a.navigation.value &&
|
|
309
|
-
}),
|
|
310
|
-
a.referenceId.value ===
|
|
305
|
+
e ? Q(e) && a.navigation.value && W(`<SbReference> is a text field with a role="${a.navigation.value}" panel: the arrow keys move focus into the panel, so typing stops there. The combobox pattern (focus kept in the field with aria-activedescendant) is not supported.`) : W("<SbReference> rendered no element, so the panel cannot be positioned: a component in `as` must render a single root element.");
|
|
306
|
+
}), p(() => {
|
|
307
|
+
a.referenceId.value === _.value && (a.referenceId.value = void 0), u(), !a.parts.reference && !a.isUnmounting && (a.skipFocusReturn = K(a, !1), a.setOpen(!1, "api"));
|
|
311
308
|
});
|
|
312
|
-
let
|
|
313
|
-
a.reference.value =
|
|
314
|
-
},
|
|
315
|
-
a.trigger.value === "click" && (Q(a.reference.value) ? a.setOpen(!0, "trigger") : a.setOpen(!o.value, "trigger"));
|
|
316
|
-
},
|
|
317
|
-
if (!
|
|
309
|
+
let v = n(() => t.ariaHaspopup ?? (l.value && Object.hasOwn(Z, l.value) ? Z[l.value] : void 0)), x = (e) => {
|
|
310
|
+
a.reference.value = te(e);
|
|
311
|
+
}, T = (e) => {
|
|
312
|
+
s.value && a.reference.value instanceof HTMLAnchorElement && e?.preventDefault(), a.trigger.value === "click" && (Q(a.reference.value) ? a.setOpen(!0, "trigger") : a.setOpen(!o.value, "trigger"));
|
|
313
|
+
}, E = n(() => l.value === "tooltip"), k = () => a.trigger.value === "hover" || a.trigger.value === "focus", A = (e) => {
|
|
314
|
+
if (!k() || G(a) || a.contains(e.relatedTarget)) return;
|
|
318
315
|
let t = e.target;
|
|
319
|
-
(a.trigger.value === "focus" ||
|
|
320
|
-
}, k = (e) => {
|
|
321
|
-
T() && !a.contains(e.relatedTarget) && a.setOpen(!1, "focus-out");
|
|
322
|
-
}, A = (e) => {
|
|
323
|
-
let t = a.floating.value, n = t && z(t)[0];
|
|
324
|
-
n && (e.preventDefault(), n.focus());
|
|
316
|
+
(a.trigger.value === "focus" || B(t)) && a.setOpen(!0, "focus");
|
|
325
317
|
}, j = (e) => {
|
|
318
|
+
k() && !a.contains(e.relatedTarget) && a.setOpen(!1, "focus-out");
|
|
319
|
+
}, M = (e) => {
|
|
320
|
+
let t = a.floating.value, n = t && V(t)[0];
|
|
321
|
+
n && (e.preventDefault(), n.focus());
|
|
322
|
+
}, N = (e) => {
|
|
326
323
|
if (a.navigation.value && !s.value && a.trigger.value !== "manual") {
|
|
327
|
-
if (
|
|
324
|
+
if (G(a)) {
|
|
328
325
|
let t = e.currentTarget;
|
|
329
|
-
return e.key ===
|
|
326
|
+
return e.key === de(t).open ? "first" : void 0;
|
|
330
327
|
}
|
|
331
328
|
return e.key === "ArrowDown" ? "first" : e.key === "ArrowUp" ? "last" : void 0;
|
|
332
329
|
}
|
|
333
|
-
},
|
|
334
|
-
if (e.key === "Tab" && !e.shiftKey && o.value && !
|
|
335
|
-
|
|
330
|
+
}, P = (e) => {
|
|
331
|
+
if (e.key === "Tab" && !e.shiftKey && o.value && !G(a)) {
|
|
332
|
+
M(e);
|
|
336
333
|
return;
|
|
337
334
|
}
|
|
338
|
-
let t =
|
|
339
|
-
t ? (e.preventDefault(), a.focusRequest.value = t, a.setOpen(!0, "trigger")) :
|
|
335
|
+
let t = N(e);
|
|
336
|
+
t ? (e.preventDefault(), a.focusRequest.value = t, a.setOpen(!0, "trigger")) : f() || e.key !== "Enter" && e.key !== " " || (e.preventDefault(), T());
|
|
340
337
|
};
|
|
341
|
-
return (e, n) => (
|
|
342
|
-
id:
|
|
343
|
-
ref:
|
|
338
|
+
return (e, n) => (g(), r(b(t.as), {
|
|
339
|
+
id: _.value,
|
|
340
|
+
ref: x,
|
|
344
341
|
type: t.as === "button" ? "button" : void 0,
|
|
345
|
-
role:
|
|
346
|
-
tabindex:
|
|
342
|
+
role: f() ? void 0 : "button",
|
|
343
|
+
tabindex: f() ? void 0 : S(s) ? -1 : 0,
|
|
347
344
|
disabled: t.as === "button" && S(s) ? !0 : void 0,
|
|
348
345
|
"aria-disabled": t.as !== "button" && S(s) ? "true" : void 0,
|
|
349
|
-
"aria-haspopup":
|
|
350
|
-
"aria-expanded":
|
|
351
|
-
"aria-controls": S(o) && !
|
|
352
|
-
"aria-describedby": S(o) &&
|
|
346
|
+
"aria-haspopup": v.value,
|
|
347
|
+
"aria-expanded": E.value ? void 0 : S(o) ? "true" : "false",
|
|
348
|
+
"aria-controls": S(o) && !E.value ? S(c) : void 0,
|
|
349
|
+
"aria-describedby": S(o) && E.value ? S(c) : void 0,
|
|
353
350
|
"data-sbf-state": S(o) ? "open" : "closed",
|
|
354
|
-
onClick:
|
|
355
|
-
onKeydown:
|
|
356
|
-
onFocusin:
|
|
357
|
-
onFocusout:
|
|
351
|
+
onClick: T,
|
|
352
|
+
onKeydown: P,
|
|
353
|
+
onFocusin: A,
|
|
354
|
+
onFocusout: j,
|
|
358
355
|
onPointerenter: S(a).hover,
|
|
359
356
|
onPointerleave: S(a).hover
|
|
360
357
|
}, {
|
|
361
|
-
default: O(() => [
|
|
358
|
+
default: O(() => [y(e.$slots, "default")]),
|
|
362
359
|
_: 3
|
|
363
360
|
}, 40, [
|
|
364
361
|
"id",
|
|
@@ -376,18 +373,18 @@ var Q = (e) => e instanceof Element && !!e.closest("input, textarea, select, [co
|
|
|
376
373
|
"onPointerleave"
|
|
377
374
|
]));
|
|
378
375
|
}
|
|
379
|
-
}),
|
|
376
|
+
}), pe = ":disabled, [aria-disabled=\"true\"], [aria-haspopup]:not([aria-haspopup=\"false\"])", me = /* @__PURE__ */ s({
|
|
380
377
|
inheritAttrs: !1,
|
|
381
378
|
__name: "SbFloating",
|
|
382
379
|
props: {
|
|
383
380
|
as: { default: "div" },
|
|
384
381
|
role: { default: "dialog" },
|
|
385
|
-
transition: {
|
|
382
|
+
transition: {},
|
|
386
383
|
teleport: {
|
|
387
384
|
type: [String, Boolean],
|
|
388
385
|
default: "body"
|
|
389
386
|
},
|
|
390
|
-
zIndex: {
|
|
387
|
+
zIndex: {},
|
|
391
388
|
autoFocus: {
|
|
392
389
|
type: Boolean,
|
|
393
390
|
default: void 0
|
|
@@ -403,28 +400,28 @@ var Q = (e) => e instanceof Element && !!e.closest("input, textarea, select, [co
|
|
|
403
400
|
},
|
|
404
401
|
emits: ["after-enter", "after-leave"],
|
|
405
402
|
setup(s, { emit: c }) {
|
|
406
|
-
let l = s,
|
|
407
|
-
|
|
408
|
-
|
|
403
|
+
let l = s, _ = c, x = C(), w = ie("SbFloating");
|
|
404
|
+
p(re(w, "floating", "SbFloating")), p(() => {
|
|
405
|
+
w.isUnmounting || K(w, !0);
|
|
409
406
|
});
|
|
410
|
-
let { isOpen:
|
|
407
|
+
let { isOpen: T, floatingId: k, referenceId: A, side: j, align: M } = w;
|
|
411
408
|
D(() => {
|
|
412
|
-
|
|
413
|
-
}),
|
|
414
|
-
l.role === "tooltip" &&
|
|
409
|
+
w.floatingRole.value = l.role, w.navigation.value = l.keyboardNavigation && le(l.role) ? l.role : null;
|
|
410
|
+
}), m(() => {
|
|
411
|
+
l.role === "tooltip" && w.trigger.value === "click" && W("<SbFloating role=\"tooltip\"> opens on click: a tooltip shows on hover and focus. Set trigger=\"hover\" or \"focus\" on SbContainer, or use another role for a panel opened by click.");
|
|
415
412
|
});
|
|
416
|
-
let
|
|
417
|
-
|
|
418
|
-
},
|
|
419
|
-
|
|
420
|
-
},
|
|
421
|
-
...
|
|
413
|
+
let N = v(T.value), P = v(null), F = (e) => {
|
|
414
|
+
w.floating.value = e instanceof HTMLElement ? e : null;
|
|
415
|
+
}, I = (e) => {
|
|
416
|
+
P.value = te(e);
|
|
417
|
+
}, R = n(() => ({
|
|
418
|
+
...w.floatingStyles.value,
|
|
422
419
|
...l.zIndex === void 0 ? {} : { zIndex: l.zIndex }
|
|
423
|
-
})),
|
|
424
|
-
"aria-labelledby": l.role && Object.hasOwn(
|
|
425
|
-
...
|
|
426
|
-
}),
|
|
427
|
-
[
|
|
420
|
+
})), ee = () => ({
|
|
421
|
+
"aria-labelledby": l.role && Object.hasOwn(Z, l.role) && x["aria-label"] == null ? A.value : void 0,
|
|
422
|
+
...x
|
|
423
|
+
}), z = n(() => l.autoFocus ?? (l.role !== "tooltip" && w.trigger.value !== "hover" && w.trigger.value !== "focus" && !Q(w.reference.value))), B = n(() => T.value && l.teleport !== !1 && l.role !== "tooltip"), U = {
|
|
424
|
+
[L]: "",
|
|
428
425
|
tabindex: 0,
|
|
429
426
|
style: {
|
|
430
427
|
position: "fixed",
|
|
@@ -432,82 +429,79 @@ var Q = (e) => e instanceof Element && !!e.closest("input, textarea, select, [co
|
|
|
432
429
|
outline: "none",
|
|
433
430
|
pointerEvents: "none"
|
|
434
431
|
}
|
|
435
|
-
},
|
|
432
|
+
}, q = n(() => {
|
|
436
433
|
let { transition: e } = l;
|
|
437
434
|
return e ? typeof e == "string" ? { name: e } : e : { css: !1 };
|
|
438
|
-
}),
|
|
439
|
-
|
|
440
|
-
},
|
|
441
|
-
let t =
|
|
435
|
+
}), J = (e) => e.setAttribute("data-sbf-state", "closed"), ae = () => _("after-enter"), oe = () => {
|
|
436
|
+
T.value || (N.value = !1), _("after-leave");
|
|
437
|
+
}, Y = (e) => e instanceof Node && !!P.value?.contains(e), X = (e) => {
|
|
438
|
+
let t = P.value;
|
|
442
439
|
if (!t) return;
|
|
443
|
-
let n =
|
|
440
|
+
let n = V(t);
|
|
444
441
|
((e === "first" ? n[0] : n[n.length - 1]) ?? t).focus({ preventScroll: !0 });
|
|
445
|
-
},
|
|
446
|
-
|
|
447
|
-
},
|
|
448
|
-
if (!
|
|
449
|
-
|
|
442
|
+
}, se = (e) => {
|
|
443
|
+
Y(e.relatedTarget) ? w.reference.value?.focus() : X("first");
|
|
444
|
+
}, fe = (e) => {
|
|
445
|
+
if (!Y(e.relatedTarget)) {
|
|
446
|
+
X("last");
|
|
450
447
|
return;
|
|
451
448
|
}
|
|
452
|
-
let t =
|
|
453
|
-
((t &&
|
|
454
|
-
},
|
|
449
|
+
let t = w.reference.value;
|
|
450
|
+
((t && H(t, (e) => w.contains(e))) ?? t)?.focus();
|
|
451
|
+
}, me = (e) => {
|
|
455
452
|
if (e.key !== "Tab" || !e.shiftKey || e.defaultPrevented) return;
|
|
456
|
-
let t =
|
|
457
|
-
t &&
|
|
453
|
+
let t = w.reference.value;
|
|
454
|
+
t && P.value && V(P.value).length && (e.composedPath()[0] ?? e.target) === H(t, (e) => w.contains(e)) && (e.preventDefault(), X("last"));
|
|
458
455
|
};
|
|
459
|
-
E(
|
|
460
|
-
e && typeof document < "u" && (document.addEventListener("keydown",
|
|
456
|
+
E(B, (e, t, n) => {
|
|
457
|
+
e && typeof document < "u" && (document.addEventListener("keydown", me), n(() => document.removeEventListener("keydown", me)));
|
|
461
458
|
}, { immediate: !0 });
|
|
462
|
-
let
|
|
463
|
-
let e =
|
|
464
|
-
return
|
|
465
|
-
},
|
|
459
|
+
let he = () => {
|
|
460
|
+
let e = w.navigation.value;
|
|
461
|
+
return P.value && e ? ue(P.value, e) : [];
|
|
462
|
+
}, ge = {
|
|
466
463
|
menu: "[role=\"menuitem\"]",
|
|
467
464
|
listbox: "[role=\"option\"]"
|
|
468
|
-
}, ge = {
|
|
469
|
-
menu: "role=\"menuitem\", \"menuitemcheckbox\" or \"menuitemradio\"",
|
|
470
|
-
listbox: "role=\"option\""
|
|
471
465
|
}, _e = !1, ve = (e) => {
|
|
472
|
-
let t =
|
|
466
|
+
let t = w.navigation.value;
|
|
473
467
|
if (_e || !t) return;
|
|
474
|
-
let n = e.length ? e.every(
|
|
475
|
-
n && (_e = !0,
|
|
468
|
+
let n = e.length ? e.every(ne) ? null : "has items that cannot take focus, so the arrow keys cannot move to them: make each one a button, or give it tabindex=\"-1\"." : `has no items the arrow keys can move to: items need ${ce[t]} and must not be disabled.`;
|
|
469
|
+
n && (_e = !0, W(`<SbFloating role="${t}"> ${n}`));
|
|
476
470
|
}, ye = (e) => {
|
|
477
|
-
let t =
|
|
471
|
+
let t = P.value;
|
|
478
472
|
if (!t) return;
|
|
479
|
-
let n =
|
|
480
|
-
e && ve(n), (n.find((e) => e.getAttribute("aria-selected") === "true") ?? (e === "last" ? n[n.length - 1] : e ? n[0] : void 0) ?? t.querySelector("[autofocus]") ?? n[0] ??
|
|
473
|
+
let n = he();
|
|
474
|
+
e && ve(n), (n.find((e) => e.getAttribute("aria-selected") === "true") ?? (e === "last" ? n[n.length - 1] : e ? n[0] : void 0) ?? t.querySelector("[autofocus]") ?? n[0] ?? V(t)[0] ?? t).focus({ preventScroll: !0 });
|
|
481
475
|
}, be = () => {
|
|
482
|
-
let e =
|
|
483
|
-
return
|
|
476
|
+
let e = w.focusRequest.value;
|
|
477
|
+
return w.focusRequest.value = null, e;
|
|
484
478
|
}, $ = "", xe;
|
|
485
|
-
|
|
479
|
+
h(() => clearTimeout(xe));
|
|
486
480
|
let Se = (e, t, n) => {
|
|
487
481
|
$ += n.toLowerCase(), clearTimeout(xe), xe = setTimeout(() => $ = "", 500);
|
|
488
482
|
let r = [...$].every((e) => e === $[0]) ? $[0] : $, i = Math.max(t, 0), a = [...e.slice(i), ...e.slice(0, i)];
|
|
489
483
|
return r.length === 1 && t >= 0 && a.push(a.shift()), a.find((e) => e.textContent?.trim().toLowerCase().startsWith(r));
|
|
490
484
|
}, Ce = () => {
|
|
491
|
-
let e = [
|
|
492
|
-
for (;
|
|
485
|
+
let e = [w];
|
|
486
|
+
for (; G(e[e.length - 1]);) e.push(e[e.length - 1].parent);
|
|
493
487
|
return e;
|
|
494
488
|
}, we = (e, t, n) => {
|
|
495
489
|
for (let t of e) t.skipFocusReturn = !0, t.setOpen(!1, n);
|
|
496
490
|
t?.focus({ preventScroll: !0 });
|
|
497
491
|
}, Te = (e) => {
|
|
498
|
-
let t = Ce(), n = t[t.length - 1], r = n.reference.value, i = e ? r : (r &&
|
|
492
|
+
let t = Ce(), n = t[t.length - 1], r = n.reference.value, i = e ? r : (r && H(r, (e) => n.contains(e))) ?? r;
|
|
499
493
|
we(t, i, "focus-out");
|
|
500
494
|
}, Ee = (e) => {
|
|
501
|
-
let { role: t } = l, n =
|
|
502
|
-
if (!l.closeOnSelect || e.defaultPrevented || !n || !
|
|
503
|
-
let r = e.target.closest(
|
|
504
|
-
if (!r || r.closest(`[role="${t}"]`) !== n || r.matches(
|
|
505
|
-
let i = t === "menu" ? Ce() : [
|
|
495
|
+
let { role: t } = l, n = P.value;
|
|
496
|
+
if (!l.closeOnSelect || e.defaultPrevented || !n || !le(t)) return;
|
|
497
|
+
let r = e.target.closest(ge[t]);
|
|
498
|
+
if (!r || r.closest(`[role="${t}"]`) !== n || r.matches(pe) || t === "listbox" && n.getAttribute("aria-multiselectable") === "true") return;
|
|
499
|
+
let i = t === "menu" ? Ce() : [w];
|
|
506
500
|
we(i, i[i.length - 1].reference.value, "select");
|
|
507
501
|
}, De = (e) => {
|
|
508
|
-
let t =
|
|
502
|
+
let t = w.navigation.value;
|
|
509
503
|
if (!t || e.defaultPrevented || e.isComposing || Q(e.target)) return;
|
|
510
|
-
let n =
|
|
504
|
+
let n = he(), r = n.findIndex((t) => t.contains(e.target)), i = n.length - 1, a = t === "menu", o;
|
|
511
505
|
if ([
|
|
512
506
|
"ArrowDown",
|
|
513
507
|
"ArrowUp",
|
|
@@ -520,8 +514,8 @@ var Q = (e) => e instanceof Element && !!e.closest("input, textarea, select, [co
|
|
|
520
514
|
else if (e.key === "Tab" && t === "menu") {
|
|
521
515
|
e.preventDefault(), Te(e.shiftKey);
|
|
522
516
|
return;
|
|
523
|
-
} else if (t === "menu" &&
|
|
524
|
-
e.preventDefault(),
|
|
517
|
+
} else if (t === "menu" && G(w) && P.value && e.key === de(P.value).close) {
|
|
518
|
+
e.preventDefault(), w.setOpen(!1, "escape");
|
|
525
519
|
return;
|
|
526
520
|
} else if (e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey && (e.key !== " " || $)) e.preventDefault(), o = Se(n, r, e.key);
|
|
527
521
|
else if ((e.key === "Enter" || e.key === " ") && e.target === n[r]) {
|
|
@@ -532,49 +526,49 @@ var Q = (e) => e instanceof Element && !!e.closest("input, textarea, select, [co
|
|
|
532
526
|
}
|
|
533
527
|
o && (e.preventDefault(), o.focus());
|
|
534
528
|
};
|
|
535
|
-
return E(
|
|
536
|
-
let t =
|
|
537
|
-
if (
|
|
538
|
-
|
|
529
|
+
return E(T, (e) => {
|
|
530
|
+
let t = w.skipFocusReturn;
|
|
531
|
+
if (w.skipFocusReturn = !1, e) {
|
|
532
|
+
N.value = !0;
|
|
539
533
|
return;
|
|
540
534
|
}
|
|
541
535
|
let n = document.activeElement;
|
|
542
|
-
!t && n &&
|
|
543
|
-
}), E(() =>
|
|
536
|
+
!t && n && w.floating.value?.contains(n) && w.reference.value?.focus({ preventScroll: !0 });
|
|
537
|
+
}), E(() => T.value && w.isPositioned.value, async (e) => {
|
|
544
538
|
if (!e) return;
|
|
545
539
|
let t = be();
|
|
546
|
-
(t ||
|
|
547
|
-
}), E(
|
|
548
|
-
e &&
|
|
549
|
-
}), (n, s) => (
|
|
540
|
+
(t || z.value) && (await d(), ye(t));
|
|
541
|
+
}), E(w.focusRequest, (e) => {
|
|
542
|
+
e && T.value && w.isPositioned.value && ye(be());
|
|
543
|
+
}), (n, s) => (g(), r(e, {
|
|
550
544
|
to: l.teleport || "body",
|
|
551
545
|
disabled: l.teleport === !1
|
|
552
|
-
}, [
|
|
546
|
+
}, [N.value ? (g(), a("div", {
|
|
553
547
|
key: 0,
|
|
554
|
-
ref:
|
|
555
|
-
style:
|
|
556
|
-
onPointerenter: s[0] ||= (...e) => S(
|
|
557
|
-
onPointerleave: s[1] ||= (...e) => S(
|
|
548
|
+
ref: F,
|
|
549
|
+
style: f(R.value),
|
|
550
|
+
onPointerenter: s[0] ||= (...e) => S(w).hover && S(w).hover(...e),
|
|
551
|
+
onPointerleave: s[1] ||= (...e) => S(w).hover && S(w).hover(...e)
|
|
558
552
|
}, [
|
|
559
|
-
|
|
560
|
-
o(t, u(
|
|
553
|
+
B.value ? (g(), a("span", u({ key: 0 }, U, { onFocus: se }), null, 16)) : i("", !0),
|
|
554
|
+
o(t, u(q.value, {
|
|
561
555
|
appear: "",
|
|
562
|
-
onBeforeLeave:
|
|
563
|
-
onAfterEnter:
|
|
564
|
-
onAfterLeave:
|
|
556
|
+
onBeforeLeave: J,
|
|
557
|
+
onAfterEnter: ae,
|
|
558
|
+
onAfterLeave: oe
|
|
565
559
|
}), {
|
|
566
|
-
default: O(() => [S(
|
|
567
|
-
id: S(
|
|
568
|
-
ref:
|
|
560
|
+
default: O(() => [S(T) ? (g(), r(b(l.as), u({ key: 0 }, ee(), {
|
|
561
|
+
id: S(k),
|
|
562
|
+
ref: I,
|
|
569
563
|
role: l.role ?? void 0,
|
|
570
|
-
tabindex:
|
|
564
|
+
tabindex: z.value ? -1 : void 0,
|
|
571
565
|
"data-sbf-state": "open",
|
|
572
|
-
"data-sbf-side": S(
|
|
573
|
-
"data-sbf-align": S(
|
|
566
|
+
"data-sbf-side": S(j),
|
|
567
|
+
"data-sbf-align": S(M),
|
|
574
568
|
onKeydown: De,
|
|
575
569
|
onClick: Ee
|
|
576
570
|
}), {
|
|
577
|
-
default: O(() => [
|
|
571
|
+
default: O(() => [y(n.$slots, "default")]),
|
|
578
572
|
_: 3
|
|
579
573
|
}, 16, [
|
|
580
574
|
"id",
|
|
@@ -585,22 +579,22 @@ var Q = (e) => e instanceof Element && !!e.closest("input, textarea, select, [co
|
|
|
585
579
|
])) : i("", !0)]),
|
|
586
580
|
_: 3
|
|
587
581
|
}, 16),
|
|
588
|
-
|
|
582
|
+
B.value ? (g(), a("span", u({ key: 1 }, U, { onFocus: fe }), null, 16)) : i("", !0)
|
|
589
583
|
], 36)) : i("", !0)], 8, ["to", "disabled"]));
|
|
590
584
|
}
|
|
591
585
|
});
|
|
592
586
|
//#endregion
|
|
593
587
|
//#region src/composables/useSbFloating.ts
|
|
594
|
-
function
|
|
595
|
-
let e = c(
|
|
588
|
+
function he() {
|
|
589
|
+
let e = c(q, null);
|
|
596
590
|
if (!e) throw Error("[sb-floating-panel-vue] useSbFloating() must be called in a component inside <SbContainer>.");
|
|
597
591
|
let { isOpen: t, open: n, close: r, toggle: i } = e;
|
|
598
592
|
return {
|
|
599
|
-
isOpen:
|
|
593
|
+
isOpen: t,
|
|
600
594
|
open: n,
|
|
601
595
|
close: r,
|
|
602
596
|
toggle: i
|
|
603
597
|
};
|
|
604
598
|
}
|
|
605
599
|
//#endregion
|
|
606
|
-
export {
|
|
600
|
+
export { se as SbContainer, me as SbFloating, fe as SbReference, he as useSbFloating };
|