sb-floating-panel-vue 5.2.0 → 5.2.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.
@@ -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 ee, normalizeStyle as d, onBeforeUnmount as f, onMounted as p, onScopeDispose as m, openBlock as h, provide as g, readonly as _, ref as v, renderSlot as te, resolveDynamicComponent as y, toRef as b, toValue 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 ne } from "@floating-ui/vue";
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 re = "data-sbf-focus-guard", I = [
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(","), L = (e) => e.tabIndex >= 0 && !e.hasAttribute("data-sbf-focus-guard") && !e.closest("[inert]") && (e.checkVisibility?.() ?? !0);
16
- function ie(e) {
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 R(e) {
21
- let t = e instanceof Element ? e.closest(I) : null;
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 ae(e) {
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 oe = (e) => e.matches(I) && !e.closest("[inert]");
32
- function z(e) {
33
- return [...e.querySelectorAll(I)].filter(L);
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 B(e, t) {
36
- return z(e.ownerDocument).find((n) => !!(e.compareDocumentPosition(n) & Node.DOCUMENT_POSITION_FOLLOWING) && !e.contains(n) && !t(n));
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 se = (() => {
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 V(e) {
48
- se && console.warn(`[sb-floating-panel-vue] ${e}`);
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 H = (e) => e.parent?.navigation.value === "menu";
53
- function U(e, t) {
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 : B(r, (t) => e.contains(t)))?.focus({ preventScroll: !0 }), !0);
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 W = Symbol("SbFloatingContext");
58
- function ce(e, t, n) {
59
- return ++e.parts[t] > 1 && V(`<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]--;
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 le(e) {
62
- let t = c(W, null);
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 G = (e) => `${Math.max(0, e)}px`, K = (e, t) => {
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 q(e) {
73
- let t = v(null), r = v(null), i = n(() => {
74
- let t = x(e.padding), n = x(e.matchWidth), r = x(e.placement).includes("-"), i = A({
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(x(e.offset)),
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 = G(e.reference.width);
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", K(a, c)), o.setProperty("--sbf-available-width", G(r)), o.setProperty("--sbf-available-height", G(i)), o.width = n === !0 ? s : "", o.minWidth = n === "min" ? s : "";
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 x(e.hideWhenDetached) && o.push(j({ padding: t })), o;
95
- }), { floatingStyles: a, middlewareData: o, placement: s, isPositioned: c, update: l } = ne(t, r, {
96
- open: () => x(e.isOpen),
97
- placement: () => x(e.placement),
98
- strategy: () => x(e.strategy),
99
- middleware: i,
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
- }), u = n(() => !!o.value.hide?.referenceHidden);
101
+ }), d = n(() => !!s.value.hide?.referenceHidden);
102
102
  return {
103
- reference: t,
104
- floating: r,
103
+ reference: r,
104
+ floating: i,
105
105
  floatingStyles: n(() => ({
106
- ...a.value,
107
- ...u.value ? { visibility: "hidden" } : {}
106
+ ...o.value,
107
+ ...d.value ? { visibility: "hidden" } : {}
108
108
  })),
109
- placement: s,
110
- side: n(() => s.value.split("-")[0]),
111
- align: n(() => s.value.split("-")[1]),
112
- isPositioned: c,
113
- referenceHidden: u,
114
- update: l
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 J = [], Y = {
119
+ var Y = [], X = {
120
120
  open: 300,
121
121
  close: 150
122
- }, X = /* @__PURE__ */ s({
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: () => ({ ...Y }) },
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
- m(() => clearTimeout(u));
171
- let d, p = ((e, t) => {
172
- clearTimeout(u), !(e && i.disabled) && e !== l.value && (d = t, a.value = e, ee(() => d = void 0));
173
- }), h = () => p(!0, "api"), _ = () => p(!1, "api"), y = () => p(!l.value, "api"), x = (e) => {
174
- if (e.pointerType === "touch" || (O?.hover(e), i.trigger !== "hover")) return;
175
- let t = e.type === "pointerenter" || k.contains(e.relatedTarget);
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] ?? Y[r];
178
- u = setTimeout(() => p(t, "hover"), a);
179
- }, C = q({
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
- placement: () => i.placement,
182
- strategy: () => i.strategy,
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: O,
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: h,
205
- close: _,
206
- toggle: y,
207
- setOpen: p,
208
- hover: x,
209
- contains: (e) => e instanceof Node ? C.reference.value?.contains(e) || C.floating.value?.contains(e) ? !0 : [...D].some((t) => t.contains(e)) : !1,
210
- registerChild: (e) => (D.add(e), () => D.delete(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
- O && m(O.registerChild(k)), g(W, k), f(() => {
213
- k.isUnmounting = !0, U(k, !1);
204
+ A && h(A.registerChild(j)), _(q, j), p(() => {
205
+ j.isUnmounting = !0, K(j, !1);
214
206
  });
215
- let A = (e) => {
216
- let t = e.composedPath()[0] ?? e.target;
217
- return J.findLast((e) => e.contains(t)) ?? J[J.length - 1];
218
- }, j = (e) => {
219
- e.key === "Escape" && A(e) === k && (!i.closeOnEscape || e.defaultPrevented || e.isComposing || (e.preventDefault(), p(!1, "escape")));
220
- }, M = (e) => {
221
- k.contains(e) || (k.skipFocusReturn = R(e), p(!1, "outside"));
222
- }, N, P = (e) => {
223
- if (N?.(), !i.closeOnClickOutside) return;
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
- M(t);
218
+ P(t);
227
219
  return;
228
220
  }
229
- if (k.contains(t)) return;
221
+ if (j.contains(t)) return;
230
222
  let n = (e) => {
231
- N?.(), M(e.composedPath()[0] ?? e.target);
223
+ F?.(), P(e.composedPath()[0] ?? e.target);
232
224
  };
233
- document.addEventListener("click", n, !0), N = () => {
234
- document.removeEventListener("click", n, !0), N = void 0;
225
+ document.addEventListener("click", n, !0), F = () => {
226
+ document.removeEventListener("click", n, !0), F = void 0;
235
227
  };
236
- }, F = (e) => {
237
- i.closeOnFocusOut && (k.contains(e.composedPath()[0] ?? e.target) || p(!1, "focus-out"));
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 && typeof document < "u" && (J.push(k), document.addEventListener("keydown", j), document.addEventListener("pointerdown", P, !0), document.addEventListener("focusin", F), n(() => {
241
- document.removeEventListener("keydown", j), document.removeEventListener("pointerdown", P, !0), document.removeEventListener("focusin", F), N?.(), J.splice(J.indexOf(k), 1);
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 = d ?? (!e && i.disabled ? "disabled" : "api");
245
- d = void 0, o(e ? "open" : "close", t);
246
- }), E(C.referenceHidden, (e) => {
247
- e && i.hideWhenDetached === "close" && p(!1, "detached");
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: h,
255
- close: _,
256
- toggle: y,
257
- update: C.update
258
- }), (e, t) => te(e.$slots, "default", {
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: h,
261
- close: _,
262
- toggle: y,
263
- placement: S(C).placement.value,
264
- side: S(C).side.value,
265
- align: S(C).align.value,
266
- floatingId: k.floatingId,
267
- referenceId: k.referenceId.value
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
- }), ue = {
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
- }, Z = {
274
+ }, ce = {
278
275
  menu: "[role=\"menuitem\"], [role=\"menuitemcheckbox\"], [role=\"menuitemradio\"]",
279
276
  listbox: "[role=\"option\"]"
280
- }, de = (e) => !!e && Object.hasOwn(Z, e);
281
- function fe(e, t) {
282
- return [...e.querySelectorAll(Z[t])].filter((n) => n.closest(`[role="${t}"]`) === e && !n.matches(":disabled") && (n.checkVisibility?.() ?? !0));
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\"])"), pe = (e) => getComputedStyle(e).direction === "rtl" ? {
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
- }, me = /* @__PURE__ */ s({
287
+ }, fe = /* @__PURE__ */ s({
291
288
  __name: "SbReference",
292
289
  props: {
293
290
  as: { default: "button" },
294
- id: { default: void 0 },
295
- ariaHaspopup: { default: void 0 }
291
+ id: {},
292
+ ariaHaspopup: {}
296
293
  },
297
294
  setup(e) {
298
- let t = e, i = C(), a = le("SbReference"), { isOpen: o, disabled: s, floatingId: c, floatingRole: l } = a, u = ce(a, "reference", "SbReference"), ee = [
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
- ], d = () => typeof t.as != "string" || ee.includes(t.as) || t.as === "a" && i.href != null, m = `${w()}-reference`, g = n(() => t.id ?? m);
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 = g.value;
306
- }), p(() => {
302
+ a.referenceId.value = _.value;
303
+ }), m(() => {
307
304
  let e = a.reference.value;
308
- e ? Q(e) && a.navigation.value && V(`<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.`) : V("<SbReference> rendered no element, so the panel cannot be positioned: a component in `as` must render a single root element.");
309
- }), f(() => {
310
- a.referenceId.value === g.value && (a.referenceId.value = void 0), u(), !a.parts.reference && !a.isUnmounting && (a.skipFocusReturn = U(a, !1), a.setOpen(!1, "api"));
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 _ = n(() => t.ariaHaspopup ?? (l.value && Object.hasOwn(ue, l.value) ? ue[l.value] : void 0)), v = (e) => {
313
- a.reference.value = ie(e);
314
- }, b = () => {
315
- a.trigger.value === "click" && (Q(a.reference.value) ? a.setOpen(!0, "trigger") : a.setOpen(!o.value, "trigger"));
316
- }, x = n(() => l.value === "tooltip"), T = () => a.trigger.value === "hover" || a.trigger.value === "focus", E = (e) => {
317
- if (!T() || H(a) || a.contains(e.relatedTarget)) return;
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" || ae(t)) && a.setOpen(!0, "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 (H(a)) {
324
+ if (G(a)) {
328
325
  let t = e.currentTarget;
329
- return e.key === pe(t).open ? "first" : void 0;
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
- }, M = (e) => {
334
- if (e.key === "Tab" && !e.shiftKey && o.value && !H(a)) {
335
- A(e);
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 = j(e);
339
- t ? (e.preventDefault(), a.focusRequest.value = t, a.setOpen(!0, "trigger")) : d() || e.key !== "Enter" && e.key !== " " || (e.preventDefault(), b());
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) => (h(), r(y(t.as), {
342
- id: g.value,
343
- ref: v,
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: d() ? void 0 : "button",
346
- tabindex: d() ? void 0 : S(s) ? -1 : 0,
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": _.value,
350
- "aria-expanded": x.value ? void 0 : S(o) ? "true" : "false",
351
- "aria-controls": S(o) && !x.value ? S(c) : void 0,
352
- "aria-describedby": S(o) && x.value ? S(c) : void 0,
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: b,
355
- onKeydown: M,
356
- onFocusin: E,
357
- onFocusout: k,
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(() => [te(e.$slots, "default")]),
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
- }), he = ":disabled, [aria-disabled=\"true\"], [aria-haspopup]:not([aria-haspopup=\"false\"])", ge = /* @__PURE__ */ s({
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: { default: void 0 },
382
+ transition: {},
386
383
  teleport: {
387
384
  type: [String, Boolean],
388
385
  default: "body"
389
386
  },
390
- zIndex: { default: void 0 },
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, g = c, _ = C(), b = le("SbFloating");
407
- f(ce(b, "floating", "SbFloating")), f(() => {
408
- b.isUnmounting || U(b, !0);
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: x, floatingId: w, referenceId: T, side: k, align: A } = b;
407
+ let { isOpen: T, floatingId: k, referenceId: A, side: j, align: M } = w;
411
408
  D(() => {
412
- b.floatingRole.value = l.role, b.navigation.value = l.keyboardNavigation && de(l.role) ? l.role : null;
413
- }), p(() => {
414
- l.role === "tooltip" && b.trigger.value === "click" && V("<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.");
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 j = v(x.value), M = v(null), N = (e) => {
417
- b.floating.value = e instanceof HTMLElement ? e : null;
418
- }, P = (e) => {
419
- M.value = ie(e);
420
- }, F = n(() => ({
421
- ...b.floatingStyles.value,
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
- })), ne = () => ({
424
- "aria-labelledby": l.role && Object.hasOwn(ue, l.role) && _["aria-label"] == null ? T.value : void 0,
425
- ..._
426
- }), I = n(() => l.autoFocus ?? (l.role !== "tooltip" && b.trigger.value !== "hover" && b.trigger.value !== "focus" && !Q(b.reference.value))), L = n(() => x.value && l.teleport !== !1 && l.role !== "tooltip"), R = {
427
- [re]: "",
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
- }, ae = n(() => {
432
+ }, q = n(() => {
436
433
  let { transition: e } = l;
437
434
  return e ? typeof e == "string" ? { name: e } : e : { css: !1 };
438
- }), se = (e) => e.setAttribute("data-sbf-state", "closed"), W = () => g("after-enter"), G = () => {
439
- x.value || (j.value = !1), g("after-leave");
440
- }, K = (e) => e instanceof Node && !!M.value?.contains(e), q = (e) => {
441
- let t = M.value;
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 = z(t);
440
+ let n = V(t);
444
441
  ((e === "first" ? n[0] : n[n.length - 1]) ?? t).focus({ preventScroll: !0 });
445
- }, J = (e) => {
446
- K(e.relatedTarget) ? b.reference.value?.focus() : q("first");
447
- }, Y = (e) => {
448
- if (!K(e.relatedTarget)) {
449
- q("last");
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 = b.reference.value;
453
- ((t && B(t, (e) => b.contains(e))) ?? t)?.focus();
454
- }, X = (e) => {
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 = b.reference.value;
457
- t && M.value && z(M.value).length && (e.composedPath()[0] ?? e.target) === B(t, (e) => b.contains(e)) && (e.preventDefault(), q("last"));
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(L, (e, t, n) => {
460
- e && typeof document < "u" && (document.addEventListener("keydown", X), n(() => document.removeEventListener("keydown", X)));
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 Z = () => {
463
- let e = b.navigation.value;
464
- return M.value && e ? fe(M.value, e) : [];
465
- }, me = {
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 = b.navigation.value;
466
+ let t = w.navigation.value;
473
467
  if (_e || !t) return;
474
- let n = e.length ? e.every(oe) ? 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 ${ge[t]} and must not be disabled.`;
475
- n && (_e = !0, V(`<SbFloating role="${t}"> ${n}`));
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 = M.value;
471
+ let t = P.value;
478
472
  if (!t) return;
479
- let n = Z();
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] ?? z(t)[0] ?? t).focus({ preventScroll: !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 = b.focusRequest.value;
483
- return b.focusRequest.value = null, e;
476
+ let e = w.focusRequest.value;
477
+ return w.focusRequest.value = null, e;
484
478
  }, $ = "", xe;
485
- m(() => clearTimeout(xe));
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 = [b];
492
- for (; H(e[e.length - 1]);) e.push(e[e.length - 1].parent);
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 && B(r, (e) => n.contains(e))) ?? 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 = M.value;
502
- if (!l.closeOnSelect || e.defaultPrevented || !n || !de(t)) return;
503
- let r = e.target.closest(me[t]);
504
- if (!r || r.closest(`[role="${t}"]`) !== n || r.matches(he) || t === "listbox" && n.getAttribute("aria-multiselectable") === "true") return;
505
- let i = t === "menu" ? Ce() : [b];
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 = b.navigation.value;
502
+ let t = w.navigation.value;
509
503
  if (!t || e.defaultPrevented || e.isComposing || Q(e.target)) return;
510
- let n = Z(), r = n.findIndex((t) => t.contains(e.target)), i = n.length - 1, a = t === "menu", o;
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" && H(b) && M.value && e.key === pe(M.value).close) {
524
- e.preventDefault(), b.setOpen(!1, "escape");
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(x, (e) => {
536
- let t = b.skipFocusReturn;
537
- if (b.skipFocusReturn = !1, e) {
538
- j.value = !0;
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 && b.floating.value?.contains(n) && b.reference.value?.focus({ preventScroll: !0 });
543
- }), E(() => x.value && b.isPositioned.value, async (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 || I.value) && (await ee(), ye(t));
547
- }), E(b.focusRequest, (e) => {
548
- e && x.value && b.isPositioned.value && ye(be());
549
- }), (n, s) => (h(), r(e, {
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
- }, [j.value ? (h(), a("div", {
546
+ }, [N.value ? (g(), a("div", {
553
547
  key: 0,
554
- ref: N,
555
- style: d(F.value),
556
- onPointerenter: s[0] ||= (...e) => S(b).hover && S(b).hover(...e),
557
- onPointerleave: s[1] ||= (...e) => S(b).hover && S(b).hover(...e)
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
- L.value ? (h(), a("span", u({ key: 0 }, R, { onFocus: J }), null, 16)) : i("", !0),
560
- o(t, u(ae.value, {
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: se,
563
- onAfterEnter: W,
564
- onAfterLeave: G
556
+ onBeforeLeave: J,
557
+ onAfterEnter: ae,
558
+ onAfterLeave: oe
565
559
  }), {
566
- default: O(() => [S(x) ? (h(), r(y(l.as), u({ key: 0 }, ne(), {
567
- id: S(w),
568
- ref: P,
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: I.value ? -1 : void 0,
564
+ tabindex: z.value ? -1 : void 0,
571
565
  "data-sbf-state": "open",
572
- "data-sbf-side": S(k),
573
- "data-sbf-align": S(A),
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(() => [te(n.$slots, "default")]),
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
- L.value ? (h(), a("span", u({ key: 1 }, R, { onFocus: Y }), null, 16)) : i("", !0)
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 _e() {
595
- let e = c(W, null);
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: _(t),
593
+ isOpen: t,
600
594
  open: n,
601
595
  close: r,
602
596
  toggle: i
603
597
  };
604
598
  }
605
599
  //#endregion
606
- export { X as SbContainer, ge as SbFloating, me as SbReference, _e as useSbFloating };
600
+ export { se as SbContainer, me as SbFloating, fe as SbReference, he as useSbFloating };