@konstructio/ui
Version:
A set of reusable and customizable React components built for konstruct.io
315 lines (314 loc) • 15.7 kB
JavaScript
import { R as Ee, P as ke, O as Se, C as Ie } from "./index-CeZcoQDw.js";
import * as n from "react";
import { P as C } from "./index-DKfEnhKr.js";
import { u as P } from "./index-Dy59FQl5.js";
import { c as j } from "./index-DLcqcWxM.js";
var de = 1, xe = 0.9, Re = 0.8, Ce = 0.17, Q = 0.1, Z = 0.999, Ae = 0.9999, Me = 0.99, $e = /[\\\/_+.#"@\[\(\{&]/, De = /[\\\/_+.#"@\[\(\{&]/g, Fe = /[\s-]/, me = /[\s-]/g;
function ee(t, l, r, f, u, c, d) {
if (c === l.length) return u === t.length ? de : Me;
var m = `${u},${c}`;
if (d[m] !== void 0) return d[m];
for (var b = f.charAt(c), i = r.indexOf(b, u), p = 0, h, I, E, x; i >= 0; ) h = ee(t, l, r, f, i + 1, c + 1, d), h > p && (i === u ? h *= de : $e.test(t.charAt(i - 1)) ? (h *= Re, E = t.slice(u, i - 1).match(De), E && u > 0 && (h *= Math.pow(Z, E.length))) : Fe.test(t.charAt(i - 1)) ? (h *= xe, x = t.slice(u, i - 1).match(me), x && u > 0 && (h *= Math.pow(Z, x.length))) : (h *= Ce, u > 0 && (h *= Math.pow(Z, i - u))), t.charAt(i) !== l.charAt(c) && (h *= Ae)), (h < Q && r.charAt(i - 1) === f.charAt(c + 1) || f.charAt(c + 1) === f.charAt(c) && r.charAt(i - 1) !== f.charAt(c)) && (I = ee(t, l, r, f, i + 1, c + 2, d), I * Q > h && (h = I * Q)), h > p && (p = h), i = r.indexOf(b, i + 1);
return d[m] = p, p;
}
function se(t) {
return t.toLowerCase().replace(me, " ");
}
function Ke(t, l, r) {
return t = r && r.length > 0 ? `${t + " " + r.join(" ")}` : t, ee(t, l, se(t), se(l), 0, 0, {});
}
var V = '[cmdk-group=""]', _ = '[cmdk-group-items=""]', Pe = '[cmdk-group-heading=""]', ve = '[cmdk-item=""]', fe = `${ve}:not([aria-disabled="true"])`, te = "cmdk-item-select", F = "data-value", qe = (t, l, r) => Ke(t, l, r), pe = n.createContext(void 0), L = () => n.useContext(pe), he = n.createContext(void 0), re = () => n.useContext(he), ge = n.createContext(void 0), be = n.forwardRef((t, l) => {
let r = K(() => {
var e, o;
return { search: "", value: (o = (e = t.value) != null ? e : t.defaultValue) != null ? o : "", selectedItemId: void 0, filtered: { count: 0, items: /* @__PURE__ */ new Map(), groups: /* @__PURE__ */ new Set() } };
}), f = K(() => /* @__PURE__ */ new Set()), u = K(() => /* @__PURE__ */ new Map()), c = K(() => /* @__PURE__ */ new Map()), d = K(() => /* @__PURE__ */ new Set()), m = we(t), { label: b, children: i, value: p, onValueChange: h, filter: I, shouldFilter: E, loop: x, disablePointerSelection: U = !1, vimBindings: A = !0, ...O } = t, H = P(), ne = P(), N = P(), M = n.useRef(null), w = We();
$(() => {
if (p !== void 0) {
let e = p.trim();
r.current.value = e, k.emit();
}
}, [p]), $(() => {
w(6, ae);
}, []);
let k = n.useMemo(() => ({ subscribe: (e) => (d.current.add(e), () => d.current.delete(e)), snapshot: () => r.current, setState: (e, o, s) => {
var a, v, g, S;
if (!Object.is(r.current[e], o)) {
if (r.current[e] = o, e === "search") J(), W(), w(1, G);
else if (e === "value") {
if (document.activeElement.hasAttribute("cmdk-input") || document.activeElement.hasAttribute("cmdk-root")) {
let y = document.getElementById(N);
y ? y.focus() : (a = document.getElementById(H)) == null || a.focus();
}
if (w(7, () => {
var y;
r.current.selectedItemId = (y = D()) == null ? void 0 : y.id, k.emit();
}), s || w(5, ae), ((v = m.current) == null ? void 0 : v.value) !== void 0) {
let y = o ?? "";
(S = (g = m.current).onValueChange) == null || S.call(g, y);
return;
}
}
k.emit();
}
}, emit: () => {
d.current.forEach((e) => e());
} }), []), T = n.useMemo(() => ({ value: (e, o, s) => {
var a;
o !== ((a = c.current.get(e)) == null ? void 0 : a.value) && (c.current.set(e, { value: o, keywords: s }), r.current.filtered.items.set(e, le(o, s)), w(2, () => {
W(), k.emit();
}));
}, item: (e, o) => (f.current.add(e), o && (u.current.has(o) ? u.current.get(o).add(e) : u.current.set(o, /* @__PURE__ */ new Set([e]))), w(3, () => {
J(), W(), r.current.value || G(), k.emit();
}), () => {
c.current.delete(e), f.current.delete(e), r.current.filtered.items.delete(e);
let s = D();
w(4, () => {
J(), s?.getAttribute("id") === e && G(), k.emit();
});
}), group: (e) => (u.current.has(e) || u.current.set(e, /* @__PURE__ */ new Set()), () => {
c.current.delete(e), u.current.delete(e);
}), filter: () => m.current.shouldFilter, label: b || t["aria-label"], getDisablePointerSelection: () => m.current.disablePointerSelection, listId: H, inputId: N, labelId: ne, listInnerRef: M }), []);
function le(e, o) {
var s, a;
let v = (a = (s = m.current) == null ? void 0 : s.filter) != null ? a : qe;
return e ? v(e, r.current.search, o) : 0;
}
function W() {
if (!r.current.search || m.current.shouldFilter === !1) return;
let e = r.current.filtered.items, o = [];
r.current.filtered.groups.forEach((a) => {
let v = u.current.get(a), g = 0;
v.forEach((S) => {
let y = e.get(S);
g = Math.max(y, g);
}), o.push([a, g]);
});
let s = M.current;
q().sort((a, v) => {
var g, S;
let y = a.getAttribute("id"), B = v.getAttribute("id");
return ((g = e.get(B)) != null ? g : 0) - ((S = e.get(y)) != null ? S : 0);
}).forEach((a) => {
let v = a.closest(_);
v ? v.appendChild(a.parentElement === v ? a : a.closest(`${_} > *`)) : s.appendChild(a.parentElement === s ? a : a.closest(`${_} > *`));
}), o.sort((a, v) => v[1] - a[1]).forEach((a) => {
var v;
let g = (v = M.current) == null ? void 0 : v.querySelector(`${V}[${F}="${encodeURIComponent(a[0])}"]`);
g?.parentElement.appendChild(g);
});
}
function G() {
let e = q().find((s) => s.getAttribute("aria-disabled") !== "true"), o = e?.getAttribute(F);
k.setState("value", o || void 0);
}
function J() {
var e, o, s, a;
if (!r.current.search || m.current.shouldFilter === !1) {
r.current.filtered.count = f.current.size;
return;
}
r.current.filtered.groups = /* @__PURE__ */ new Set();
let v = 0;
for (let g of f.current) {
let S = (o = (e = c.current.get(g)) == null ? void 0 : e.value) != null ? o : "", y = (a = (s = c.current.get(g)) == null ? void 0 : s.keywords) != null ? a : [], B = le(S, y);
r.current.filtered.items.set(g, B), B > 0 && v++;
}
for (let [g, S] of u.current) for (let y of S) if (r.current.filtered.items.get(y) > 0) {
r.current.filtered.groups.add(g);
break;
}
r.current.filtered.count = v;
}
function ae() {
var e, o, s;
let a = D();
a && (((e = a.parentElement) == null ? void 0 : e.firstChild) === a && ((s = (o = a.closest(V)) == null ? void 0 : o.querySelector(Pe)) == null || s.scrollIntoView({ block: "nearest" })), a.scrollIntoView({ block: "nearest" }));
}
function D() {
var e;
return (e = M.current) == null ? void 0 : e.querySelector(`${ve}[aria-selected="true"]`);
}
function q() {
var e;
return Array.from(((e = M.current) == null ? void 0 : e.querySelectorAll(fe)) || []);
}
function X(e) {
let o = q()[e];
o && k.setState("value", o.getAttribute(F));
}
function Y(e) {
var o;
let s = D(), a = q(), v = a.findIndex((S) => S === s), g = a[v + e];
(o = m.current) != null && o.loop && (g = v + e < 0 ? a[a.length - 1] : v + e === a.length ? a[0] : a[v + e]), g && k.setState("value", g.getAttribute(F));
}
function ue(e) {
let o = D(), s = o?.closest(V), a;
for (; s && !a; ) s = e > 0 ? Ne(s, V) : Te(s, V), a = s?.querySelector(fe);
a ? k.setState("value", a.getAttribute(F)) : Y(e);
}
let ie = () => X(q().length - 1), oe = (e) => {
e.preventDefault(), e.metaKey ? ie() : e.altKey ? ue(1) : Y(1);
}, ce = (e) => {
e.preventDefault(), e.metaKey ? X(0) : e.altKey ? ue(-1) : Y(-1);
};
return n.createElement(C.div, { ref: l, tabIndex: -1, ...O, "cmdk-root": "", onKeyDown: (e) => {
var o;
(o = O.onKeyDown) == null || o.call(O, e);
let s = e.nativeEvent.isComposing || e.keyCode === 229;
if (!(e.defaultPrevented || s)) switch (e.key) {
case "n":
case "j": {
A && e.ctrlKey && oe(e);
break;
}
case "ArrowDown": {
oe(e);
break;
}
case "p":
case "k": {
A && e.ctrlKey && ce(e);
break;
}
case "ArrowUp": {
ce(e);
break;
}
case "Home": {
e.preventDefault(), X(0);
break;
}
case "End": {
e.preventDefault(), ie();
break;
}
case "Enter": {
e.preventDefault();
let a = D();
if (a) {
let v = new Event(te);
a.dispatchEvent(v);
}
}
}
} }, n.createElement("label", { "cmdk-label": "", htmlFor: T.inputId, id: T.labelId, style: Je }, b), z(t, (e) => n.createElement(he.Provider, { value: k }, n.createElement(pe.Provider, { value: T }, e))));
}), Ve = n.forwardRef((t, l) => {
var r, f;
let u = P(), c = n.useRef(null), d = n.useContext(ge), m = L(), b = we(t), i = (f = (r = b.current) == null ? void 0 : r.forceMount) != null ? f : d?.forceMount;
$(() => {
if (!i) return m.item(u, d?.id);
}, [i]);
let p = ye(u, c, [t.value, t.children, c], t.keywords), h = re(), I = R((w) => w.value && w.value === p.current), E = R((w) => i || m.filter() === !1 ? !0 : w.search ? w.filtered.items.get(u) > 0 : !0);
n.useEffect(() => {
let w = c.current;
if (!(!w || t.disabled)) return w.addEventListener(te, x), () => w.removeEventListener(te, x);
}, [E, t.onSelect, t.disabled]);
function x() {
var w, k;
U(), (k = (w = b.current).onSelect) == null || k.call(w, p.current);
}
function U() {
h.setState("value", p.current, !0);
}
if (!E) return null;
let { disabled: A, value: O, onSelect: H, forceMount: ne, keywords: N, ...M } = t;
return n.createElement(C.div, { ref: j(c, l), ...M, id: u, "cmdk-item": "", role: "option", "aria-disabled": !!A, "aria-selected": !!I, "data-disabled": !!A, "data-selected": !!I, onPointerMove: A || m.getDisablePointerSelection() ? void 0 : U, onClick: A ? void 0 : x }, t.children);
}), je = n.forwardRef((t, l) => {
let { heading: r, children: f, forceMount: u, ...c } = t, d = P(), m = n.useRef(null), b = n.useRef(null), i = P(), p = L(), h = R((E) => u || p.filter() === !1 ? !0 : E.search ? E.filtered.groups.has(d) : !0);
$(() => p.group(d), []), ye(d, m, [t.value, t.heading, b]);
let I = n.useMemo(() => ({ id: d, forceMount: u }), [u]);
return n.createElement(C.div, { ref: j(m, l), ...c, "cmdk-group": "", role: "presentation", hidden: h ? void 0 : !0 }, r && n.createElement("div", { ref: b, "cmdk-group-heading": "", "aria-hidden": !0, id: i }, r), z(t, (E) => n.createElement("div", { "cmdk-group-items": "", role: "group", "aria-labelledby": r ? i : void 0 }, n.createElement(ge.Provider, { value: I }, E))));
}), Le = n.forwardRef((t, l) => {
let { alwaysRender: r, ...f } = t, u = n.useRef(null), c = R((d) => !d.search);
return !r && !c ? null : n.createElement(C.div, { ref: j(u, l), ...f, "cmdk-separator": "", role: "separator" });
}), Oe = n.forwardRef((t, l) => {
let { onValueChange: r, ...f } = t, u = t.value != null, c = re(), d = R((i) => i.search), m = R((i) => i.selectedItemId), b = L();
return n.useEffect(() => {
t.value != null && c.setState("search", t.value);
}, [t.value]), n.createElement(C.input, { ref: l, ...f, "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: u ? t.value : d, onChange: (i) => {
u || c.setState("search", i.target.value), r?.(i.target.value);
} });
}), Be = n.forwardRef((t, l) => {
let { children: r, label: f = "Suggestions", ...u } = t, c = n.useRef(null), d = n.useRef(null), m = R((i) => i.selectedItemId), b = L();
return n.useEffect(() => {
if (d.current && c.current) {
let i = d.current, p = c.current, h, I = new ResizeObserver(() => {
h = requestAnimationFrame(() => {
let E = i.offsetHeight;
p.style.setProperty("--cmdk-list-height", E.toFixed(1) + "px");
});
});
return I.observe(i), () => {
cancelAnimationFrame(h), I.unobserve(i);
};
}
}, []), n.createElement(C.div, { ref: j(c, l), ...u, "cmdk-list": "", role: "listbox", tabIndex: -1, "aria-activedescendant": m, "aria-label": f, id: b.listId }, z(t, (i) => n.createElement("div", { ref: j(d, b.listInnerRef), "cmdk-list-sizer": "" }, i)));
}), ze = n.forwardRef((t, l) => {
let { open: r, onOpenChange: f, overlayClassName: u, contentClassName: c, container: d, ...m } = t;
return n.createElement(Ee, { open: r, onOpenChange: f }, n.createElement(ke, { container: d }, n.createElement(Se, { "cmdk-overlay": "", className: u }), n.createElement(Ie, { "aria-label": t.label, "cmdk-dialog": "", className: c }, n.createElement(be, { ref: l, ...m }))));
}), Ue = n.forwardRef((t, l) => R((r) => r.filtered.count === 0) ? n.createElement(C.div, { ref: l, ...t, "cmdk-empty": "", role: "presentation" }) : null), He = n.forwardRef((t, l) => {
let { progress: r, children: f, label: u = "Loading...", ...c } = t;
return n.createElement(C.div, { ref: l, ...c, "cmdk-loading": "", role: "progressbar", "aria-valuenow": r, "aria-valuemin": 0, "aria-valuemax": 100, "aria-label": u }, z(t, (d) => n.createElement("div", { "aria-hidden": !0 }, d)));
}), _e = Object.assign(be, { List: Be, Item: Ve, Input: Oe, Group: je, Separator: Le, Dialog: ze, Empty: Ue, Loading: He });
function Ne(t, l) {
let r = t.nextElementSibling;
for (; r; ) {
if (r.matches(l)) return r;
r = r.nextElementSibling;
}
}
function Te(t, l) {
let r = t.previousElementSibling;
for (; r; ) {
if (r.matches(l)) return r;
r = r.previousElementSibling;
}
}
function we(t) {
let l = n.useRef(t);
return $(() => {
l.current = t;
}), l;
}
var $ = typeof window > "u" ? n.useEffect : n.useLayoutEffect;
function K(t) {
let l = n.useRef();
return l.current === void 0 && (l.current = t()), l;
}
function R(t) {
let l = re(), r = () => t(l.snapshot());
return n.useSyncExternalStore(l.subscribe, r, r);
}
function ye(t, l, r, f = []) {
let u = n.useRef(), c = L();
return $(() => {
var d;
let m = (() => {
var i;
for (let p of r) {
if (typeof p == "string") return p.trim();
if (typeof p == "object" && "current" in p) return p.current ? (i = p.current.textContent) == null ? void 0 : i.trim() : u.current;
}
})(), b = f.map((i) => i.trim());
c.value(t, m, b), (d = l.current) == null || d.setAttribute(F, m), u.current = m;
}), u;
}
var We = () => {
let [t, l] = n.useState(), r = K(() => /* @__PURE__ */ new Map());
return $(() => {
r.current.forEach((f) => f()), r.current = /* @__PURE__ */ new Map();
}, [t]), (f, u) => {
r.current.set(f, u), l({});
};
};
function Ge(t) {
let l = t.type;
return typeof l == "function" ? l(t.props) : "render" in l ? l.render(t.props) : t;
}
function z({ asChild: t, children: l }, r) {
return t && n.isValidElement(l) ? n.cloneElement(Ge(l), { ref: l.ref }, r(l.props.children)) : r(l);
}
var Je = { position: "absolute", width: "1px", height: "1px", padding: "0", margin: "-1px", overflow: "hidden", clip: "rect(0, 0, 0, 0)", whiteSpace: "nowrap", borderWidth: "0" };
export {
_e as _
};