UNPKG

@konstructio/ui

Version:

A set of reusable and customizable React components built for konstruct.io

315 lines (314 loc) 15.7 kB
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 _ };