@hoosei/voxweave-react
Version:
A customizable and interactive voice UI component for React applications
314 lines (313 loc) • 14.8 kB
JavaScript
import { a as pe } from "./index98.js";
import { Root as ge, Portal as he, Overlay as be, Content as Ee } from "./index23.js";
import * as n from "react";
import { Primitive as I } from "./index35.js";
import { useId as K } from "./index29.js";
import { composeRefs as q } from "./index24.js";
var $ = '[cmdk-group=""]', X = '[cmdk-group-items=""]', ye = '[cmdk-group-heading=""]', oe = '[cmdk-item=""]', ie = `${oe}:not([aria-disabled="true"])`, Y = "cmdk-item-select", D = "data-value", Ce = (t, a, r) => pe(t, a, r), ce = n.createContext(void 0), O = () => n.useContext(ce), de = n.createContext(void 0), Z = () => n.useContext(de), se = n.createContext(void 0), fe = n.forwardRef((t, a) => {
let r = F(() => {
var e, u;
return { search: "", value: (u = (e = t.value) != null ? e : t.defaultValue) != null ? u : "", selectedItemId: void 0, filtered: { count: 0, items: /* @__PURE__ */ new Map(), groups: /* @__PURE__ */ new Set() } };
}), v = F(() => /* @__PURE__ */ new Set()), i = F(() => /* @__PURE__ */ new Map()), c = F(() => /* @__PURE__ */ new Map()), d = F(() => /* @__PURE__ */ new Set()), m = me(t), { label: b, children: s, value: h, onValueChange: R, filter: k, shouldFilter: w, loop: V, disablePointerSelection: B = !1, vimBindings: x = !0, ...j } = t, U = K(), ee = K(), W = K(), A = n.useRef(null), g = Fe();
M(() => {
if (h !== void 0) {
let e = h.trim();
r.current.value = e, y.emit();
}
}, [h]), M(() => {
g(6, re);
}, []);
let y = n.useMemo(() => ({ subscribe: (e) => (d.current.add(e), () => d.current.delete(e)), snapshot: () => r.current, setState: (e, u, o) => {
var l, f, p, C;
if (!Object.is(r.current[e], u)) {
if (r.current[e] = u, e === "search") T(), G(), g(1, H);
else if (e === "value") {
if (document.activeElement.hasAttribute("cmdk-input") || document.activeElement.hasAttribute("cmdk-root")) {
let E = document.getElementById(W);
E ? E.focus() : (l = document.getElementById(U)) == null || l.focus();
}
if (g(7, () => {
var E;
r.current.selectedItemId = (E = P()) == null ? void 0 : E.id, y.emit();
}), o || g(5, re), ((f = m.current) == null ? void 0 : f.value) !== void 0) {
let E = u ?? "";
(C = (p = m.current).onValueChange) == null || C.call(p, E);
return;
}
}
y.emit();
}
}, emit: () => {
d.current.forEach((e) => e());
} }), []), _ = n.useMemo(() => ({ value: (e, u, o) => {
var l;
u !== ((l = c.current.get(e)) == null ? void 0 : l.value) && (c.current.set(e, { value: u, keywords: o }), r.current.filtered.items.set(e, te(u, o)), g(2, () => {
G(), y.emit();
}));
}, item: (e, u) => (v.current.add(e), u && (i.current.has(u) ? i.current.get(u).add(e) : i.current.set(u, /* @__PURE__ */ new Set([e]))), g(3, () => {
T(), G(), r.current.value || H(), y.emit();
}), () => {
c.current.delete(e), v.current.delete(e), r.current.filtered.items.delete(e);
let o = P();
g(4, () => {
T(), o?.getAttribute("id") === e && H(), y.emit();
});
}), group: (e) => (i.current.has(e) || i.current.set(e, /* @__PURE__ */ new Set()), () => {
c.current.delete(e), i.current.delete(e);
}), filter: () => m.current.shouldFilter, label: b || t["aria-label"], getDisablePointerSelection: () => m.current.disablePointerSelection, listId: U, inputId: W, labelId: ee, listInnerRef: A }), []);
function te(e, u) {
var o, l;
let f = (l = (o = m.current) == null ? void 0 : o.filter) != null ? l : Ce;
return e ? f(e, r.current.search, u) : 0;
}
function G() {
if (!r.current.search || m.current.shouldFilter === !1) return;
let e = r.current.filtered.items, u = [];
r.current.filtered.groups.forEach((l) => {
let f = i.current.get(l), p = 0;
f.forEach((C) => {
let E = e.get(C);
p = Math.max(E, p);
}), u.push([l, p]);
});
let o = A.current;
L().sort((l, f) => {
var p, C;
let E = l.getAttribute("id"), N = f.getAttribute("id");
return ((p = e.get(N)) != null ? p : 0) - ((C = e.get(E)) != null ? C : 0);
}).forEach((l) => {
let f = l.closest(X);
f ? f.appendChild(l.parentElement === f ? l : l.closest(`${X} > *`)) : o.appendChild(l.parentElement === o ? l : l.closest(`${X} > *`));
}), u.sort((l, f) => f[1] - l[1]).forEach((l) => {
var f;
let p = (f = A.current) == null ? void 0 : f.querySelector(`${$}[${D}="${encodeURIComponent(l[0])}"]`);
p?.parentElement.appendChild(p);
});
}
function H() {
let e = L().find((o) => o.getAttribute("aria-disabled") !== "true"), u = e?.getAttribute(D);
y.setState("value", u || void 0);
}
function T() {
var e, u, o, l;
if (!r.current.search || m.current.shouldFilter === !1) {
r.current.filtered.count = v.current.size;
return;
}
r.current.filtered.groups = /* @__PURE__ */ new Set();
let f = 0;
for (let p of v.current) {
let C = (u = (e = c.current.get(p)) == null ? void 0 : e.value) != null ? u : "", E = (l = (o = c.current.get(p)) == null ? void 0 : o.keywords) != null ? l : [], N = te(C, E);
r.current.filtered.items.set(p, N), N > 0 && f++;
}
for (let [p, C] of i.current) for (let E of C) if (r.current.filtered.items.get(E) > 0) {
r.current.filtered.groups.add(p);
break;
}
r.current.filtered.count = f;
}
function re() {
var e, u, o;
let l = P();
l && (((e = l.parentElement) == null ? void 0 : e.firstChild) === l && ((o = (u = l.closest($)) == null ? void 0 : u.querySelector(ye)) == null || o.scrollIntoView({ block: "nearest" })), l.scrollIntoView({ block: "nearest" }));
}
function P() {
var e;
return (e = A.current) == null ? void 0 : e.querySelector(`${oe}[aria-selected="true"]`);
}
function L() {
var e;
return Array.from(((e = A.current) == null ? void 0 : e.querySelectorAll(ie)) || []);
}
function J(e) {
let u = L()[e];
u && y.setState("value", u.getAttribute(D));
}
function Q(e) {
var u;
let o = P(), l = L(), f = l.findIndex((C) => C === o), p = l[f + e];
(u = m.current) != null && u.loop && (p = f + e < 0 ? l[l.length - 1] : f + e === l.length ? l[0] : l[f + e]), p && y.setState("value", p.getAttribute(D));
}
function ne(e) {
let u = P(), o = u?.closest($), l;
for (; o && !l; ) o = e > 0 ? Pe(o, $) : De(o, $), l = o?.querySelector(ie);
l ? y.setState("value", l.getAttribute(D)) : Q(e);
}
let le = () => J(L().length - 1), ae = (e) => {
e.preventDefault(), e.metaKey ? le() : e.altKey ? ne(1) : Q(1);
}, ue = (e) => {
e.preventDefault(), e.metaKey ? J(0) : e.altKey ? ne(-1) : Q(-1);
};
return n.createElement(I.div, { ref: a, tabIndex: -1, ...j, "cmdk-root": "", onKeyDown: (e) => {
var u;
(u = j.onKeyDown) == null || u.call(j, e);
let o = e.nativeEvent.isComposing || e.keyCode === 229;
if (!(e.defaultPrevented || o)) switch (e.key) {
case "n":
case "j": {
x && e.ctrlKey && ae(e);
break;
}
case "ArrowDown": {
ae(e);
break;
}
case "p":
case "k": {
x && e.ctrlKey && ue(e);
break;
}
case "ArrowUp": {
ue(e);
break;
}
case "Home": {
e.preventDefault(), J(0);
break;
}
case "End": {
e.preventDefault(), le();
break;
}
case "Enter": {
e.preventDefault();
let l = P();
if (l) {
let f = new Event(Y);
l.dispatchEvent(f);
}
}
}
} }, n.createElement("label", { "cmdk-label": "", htmlFor: _.inputId, id: _.labelId, style: Le }, b), z(t, (e) => n.createElement(de.Provider, { value: y }, n.createElement(ce.Provider, { value: _ }, e))));
}), we = n.forwardRef((t, a) => {
var r, v;
let i = K(), c = n.useRef(null), d = n.useContext(se), m = O(), b = me(t), s = (v = (r = b.current) == null ? void 0 : r.forceMount) != null ? v : d?.forceMount;
M(() => {
if (!s) return m.item(i, d?.id);
}, [s]);
let h = ve(i, c, [t.value, t.children, c], t.keywords), R = Z(), k = S((g) => g.value && g.value === h.current), w = S((g) => s || m.filter() === !1 ? !0 : g.search ? g.filtered.items.get(i) > 0 : !0);
n.useEffect(() => {
let g = c.current;
if (!(!g || t.disabled)) return g.addEventListener(Y, V), () => g.removeEventListener(Y, V);
}, [w, t.onSelect, t.disabled]);
function V() {
var g, y;
B(), (y = (g = b.current).onSelect) == null || y.call(g, h.current);
}
function B() {
R.setState("value", h.current, !0);
}
if (!w) return null;
let { disabled: x, value: j, onSelect: U, forceMount: ee, keywords: W, ...A } = t;
return n.createElement(I.div, { ref: q(c, a), ...A, id: i, "cmdk-item": "", role: "option", "aria-disabled": !!x, "aria-selected": !!k, "data-disabled": !!x, "data-selected": !!k, onPointerMove: x || m.getDisablePointerSelection() ? void 0 : B, onClick: x ? void 0 : V }, t.children);
}), ke = n.forwardRef((t, a) => {
let { heading: r, children: v, forceMount: i, ...c } = t, d = K(), m = n.useRef(null), b = n.useRef(null), s = K(), h = O(), R = S((w) => i || h.filter() === !1 ? !0 : w.search ? w.filtered.groups.has(d) : !0);
M(() => h.group(d), []), ve(d, m, [t.value, t.heading, b]);
let k = n.useMemo(() => ({ id: d, forceMount: i }), [i]);
return n.createElement(I.div, { ref: q(m, a), ...c, "cmdk-group": "", role: "presentation", hidden: R ? void 0 : !0 }, r && n.createElement("div", { ref: b, "cmdk-group-heading": "", "aria-hidden": !0, id: s }, r), z(t, (w) => n.createElement("div", { "cmdk-group-items": "", role: "group", "aria-labelledby": r ? s : void 0 }, n.createElement(se.Provider, { value: k }, w))));
}), Se = n.forwardRef((t, a) => {
let { alwaysRender: r, ...v } = t, i = n.useRef(null), c = S((d) => !d.search);
return !r && !c ? null : n.createElement(I.div, { ref: q(i, a), ...v, "cmdk-separator": "", role: "separator" });
}), Ie = n.forwardRef((t, a) => {
let { onValueChange: r, ...v } = t, i = t.value != null, c = Z(), d = S((s) => s.search), m = S((s) => s.selectedItemId), b = O();
return n.useEffect(() => {
t.value != null && c.setState("search", t.value);
}, [t.value]), n.createElement(I.input, { ref: a, ...v, "cmdk-input": "", autoComplete: "off", autoCorrect: "off", spellCheck: !1, "aria-autocomplete": "list", role: "combobox", "aria-expanded": !0, "aria-controls": b.listId, "aria-labelledby": b.labelId, "aria-activedescendant": m, id: b.inputId, type: "text", value: i ? t.value : d, onChange: (s) => {
i || c.setState("search", s.target.value), r?.(s.target.value);
} });
}), Re = n.forwardRef((t, a) => {
let { children: r, label: v = "Suggestions", ...i } = t, c = n.useRef(null), d = n.useRef(null), m = S((s) => s.selectedItemId), b = O();
return n.useEffect(() => {
if (d.current && c.current) {
let s = d.current, h = c.current, R, k = new ResizeObserver(() => {
R = requestAnimationFrame(() => {
let w = s.offsetHeight;
h.style.setProperty("--cmdk-list-height", w.toFixed(1) + "px");
});
});
return k.observe(s), () => {
cancelAnimationFrame(R), k.unobserve(s);
};
}
}, []), n.createElement(I.div, { ref: q(c, a), ...i, "cmdk-list": "", role: "listbox", tabIndex: -1, "aria-activedescendant": m, "aria-label": v, id: b.listId }, z(t, (s) => n.createElement("div", { ref: q(d, b.listInnerRef), "cmdk-list-sizer": "" }, s)));
}), xe = n.forwardRef((t, a) => {
let { open: r, onOpenChange: v, overlayClassName: i, contentClassName: c, container: d, ...m } = t;
return n.createElement(ge, { open: r, onOpenChange: v }, n.createElement(he, { container: d }, n.createElement(be, { "cmdk-overlay": "", className: i }), n.createElement(Ee, { "aria-label": t.label, "cmdk-dialog": "", className: c }, n.createElement(fe, { ref: a, ...m }))));
}), Ae = n.forwardRef((t, a) => S((r) => r.filtered.count === 0) ? n.createElement(I.div, { ref: a, ...t, "cmdk-empty": "", role: "presentation" }) : null), Me = n.forwardRef((t, a) => {
let { progress: r, children: v, label: i = "Loading...", ...c } = t;
return n.createElement(I.div, { ref: a, ...c, "cmdk-loading": "", role: "progressbar", "aria-valuenow": r, "aria-valuemin": 0, "aria-valuemax": 100, "aria-label": i }, z(t, (d) => n.createElement("div", { "aria-hidden": !0 }, d)));
}), Ne = Object.assign(fe, { List: Re, Item: we, Input: Ie, Group: ke, Separator: Se, Dialog: xe, Empty: Ae, Loading: Me });
function Pe(t, a) {
let r = t.nextElementSibling;
for (; r; ) {
if (r.matches(a)) return r;
r = r.nextElementSibling;
}
}
function De(t, a) {
let r = t.previousElementSibling;
for (; r; ) {
if (r.matches(a)) return r;
r = r.previousElementSibling;
}
}
function me(t) {
let a = n.useRef(t);
return M(() => {
a.current = t;
}), a;
}
var M = typeof window > "u" ? n.useEffect : n.useLayoutEffect;
function F(t) {
let a = n.useRef();
return a.current === void 0 && (a.current = t()), a;
}
function S(t) {
let a = Z(), r = () => t(a.snapshot());
return n.useSyncExternalStore(a.subscribe, r, r);
}
function ve(t, a, r, v = []) {
let i = n.useRef(), c = O();
return M(() => {
var d;
let m = (() => {
var s;
for (let h of r) {
if (typeof h == "string") return h.trim();
if (typeof h == "object" && "current" in h) return h.current ? (s = h.current.textContent) == null ? void 0 : s.trim() : i.current;
}
})(), b = v.map((s) => s.trim());
c.value(t, m, b), (d = a.current) == null || d.setAttribute(D, m), i.current = m;
}), i;
}
var Fe = () => {
let [t, a] = n.useState(), r = F(() => /* @__PURE__ */ new Map());
return M(() => {
r.current.forEach((v) => v()), r.current = /* @__PURE__ */ new Map();
}, [t]), (v, i) => {
r.current.set(v, i), a({});
};
};
function Ke(t) {
let a = t.type;
return typeof a == "function" ? a(t.props) : "render" in a ? a.render(t.props) : t;
}
function z({ asChild: t, children: a }, r) {
return t && n.isValidElement(a) ? n.cloneElement(Ke(a), { ref: a.ref }, r(a.props.children)) : r(a);
}
var Le = { position: "absolute", width: "1px", height: "1px", padding: "0", margin: "-1px", overflow: "hidden", clip: "rect(0, 0, 0, 0)", whiteSpace: "nowrap", borderWidth: "0" };
export {
Ne as Command,
xe as CommandDialog,
Ae as CommandEmpty,
ke as CommandGroup,
Ie as CommandInput,
we as CommandItem,
Re as CommandList,
Me as CommandLoading,
fe as CommandRoot,
Se as CommandSeparator,
Ce as defaultFilter,
S as useCommandState
};
//# sourceMappingURL=index87.js.map