@code0-tech/pictor 0.0.0-mvp.42 → 0.0.0-mvp.43

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 +1 @@
1
- .avatar{aspect-ratio:1/1;padding:.35rem;display:flex;width:38px;align-items:center;justify-content:center;overflow:hidden}.avatar{background:#191825;box-shadow:inset 0 1px 1px #bfbfbf1a;border:none;color:#ffffffbf;position:relative;box-sizing:border-box;border-radius:1rem;background:transparent;box-shadow:none}.avatar--image{padding:0}
1
+ .avatar{aspect-ratio:1/1;display:flex;align-items:center;justify-content:center;overflow:hidden}.avatar{background:#191825;box-shadow:inset 0 1px 1px #bfbfbf1a;border:none;color:#ffffffbf;position:relative;box-sizing:border-box;background:transparent;box-shadow:none}.avatar--image{padding:0}
@@ -4,5 +4,6 @@ export interface AvatarProps extends Code0Component<HTMLDivElement> {
4
4
  identifier?: string;
5
5
  src?: string;
6
6
  size?: number;
7
+ color?: string;
7
8
  }
8
9
  export declare const Avatar: React.FC<AvatarProps>;
@@ -1,56 +1,58 @@
1
- import { jsx as m } from "react/jsx-runtime";
2
- import { c as p } from "../../_virtual/compiler-runtime.js";
3
- import d from "react";
4
- import { md5 as v } from "js-md5";
1
+ import { jsx as u } from "react/jsx-runtime";
2
+ import { c as v } from "../../_virtual/compiler-runtime.js";
3
+ import g from "react";
4
+ import { md5 as R } from "js-md5";
5
5
  import '../../assets/components/avatar/Avatar.style.css';/* empty css */
6
- import { mergeCode0Props as R } from "../../utils/utils.js";
7
- import { hashToColor as x } from "../d-flow/DFlow.util.js";
8
- const C = (s) => {
9
- const t = p.c(3), {
10
- src: e,
11
- size: o
12
- } = s;
13
- let i;
14
- return t[0] !== o || t[1] !== e ? (i = /* @__PURE__ */ m("img", { src: e, width: o, height: o, alt: "Avatar image" }), t[0] = o, t[1] = e, t[2] = i) : i = t[2], i;
15
- }, E = ({
16
- identifier: s,
17
- size: t
6
+ import { mergeCode0Props as x } from "../../utils/utils.js";
7
+ import { hashToColor as C } from "../d-flow/DFlow.util.js";
8
+ const E = (l) => {
9
+ const t = v.c(3), {
10
+ src: c,
11
+ size: e
12
+ } = l;
13
+ let o;
14
+ return t[0] !== e || t[1] !== c ? (o = /* @__PURE__ */ u("img", { src: c, width: e, height: e, alt: "Avatar image" }), t[0] = e, t[1] = c, t[2] = o) : o = t[2], o;
15
+ }, z = ({
16
+ identifier: l,
17
+ size: t,
18
+ color: c
18
19
  }) => {
19
- const e = d.useRef(null);
20
- d.useEffect(() => {
20
+ const e = g.useRef(null);
21
+ g.useEffect(() => {
21
22
  o();
22
23
  });
23
24
  const o = () => {
24
- const i = v(s), r = Math.floor(t / 5), a = x(s);
25
+ const i = R(l), r = Math.floor(t / 5), s = c ?? C(l);
25
26
  e.current.width = r * 5, e.current.height = r * 5;
26
- let c = i.split("").map((f) => (f = parseInt(f, 16), f < 8 ? 0 : 1)), l = [];
27
- l[0] = l[4] = c.slice(0, 5), l[1] = l[3] = c.slice(5, 10), l[2] = c.slice(10, 15);
28
- const n = e.current.getContext("2d");
29
- n.imageSmoothingEnabled = !1, n.clearRect(0, 0, e.current.width, e.current.height), l.forEach((f, h) => {
30
- f.forEach((g, u) => {
31
- g ? (n.fillStyle = a, n.fillRect(r * h, r * u, r, r)) : (n.fillStyle = "transparent", n.fillRect(r * h, r * u, r, r));
27
+ let a = i.split("").map((m) => (m = parseInt(m, 16), m < 8 ? 0 : 1)), n = [];
28
+ n[0] = n[4] = a.slice(0, 5), n[1] = n[3] = a.slice(5, 10), n[2] = a.slice(10, 15);
29
+ const f = e.current.getContext("2d");
30
+ f.imageSmoothingEnabled = !1, f.clearRect(0, 0, e.current.width, e.current.height), n.forEach((m, h) => {
31
+ m.forEach((d, p) => {
32
+ d ? (f.fillStyle = s, f.fillRect(r * h, r * p, r, r)) : (f.fillStyle = "transparent", f.fillRect(r * h, r * p, r, r));
32
33
  });
33
34
  });
34
35
  };
35
- return /* @__PURE__ */ m("canvas", { ref: e });
36
- }, y = (s) => {
37
- const t = p.c(12);
38
- let e, o, i, r;
39
- if (t[0] !== s) {
36
+ return /* @__PURE__ */ u("canvas", { ref: e });
37
+ }, k = (l) => {
38
+ const t = v.c(14);
39
+ let c, e, o, i, r;
40
+ if (t[0] !== l) {
40
41
  const {
41
- identifier: l,
42
- src: n,
43
- size: f,
44
- ...h
45
- } = s;
46
- e = l, i = n, o = f === void 0 ? 25 : f, r = R(`avatar ${!e && i ? "avatar--image" : ""}`, h), t[0] = s, t[1] = e, t[2] = o, t[3] = i, t[4] = r;
42
+ identifier: n,
43
+ color: f,
44
+ src: m,
45
+ size: h,
46
+ ...d
47
+ } = l;
48
+ e = n, c = f, i = m, o = h === void 0 ? 25 : h, r = x(`avatar ${!e && i ? "avatar--image" : ""}`, d), t[0] = l, t[1] = c, t[2] = e, t[3] = o, t[4] = i, t[5] = r;
47
49
  } else
48
- e = t[1], o = t[2], i = t[3], r = t[4];
50
+ c = t[1], e = t[2], o = t[3], i = t[4], r = t[5];
51
+ let s;
52
+ t[6] !== c || t[7] !== e || t[8] !== o || t[9] !== i ? (s = e ? /* @__PURE__ */ u(z, { color: c, identifier: e, size: o }) : i ? /* @__PURE__ */ u(E, { src: i, size: o + 13 }) : null, t[6] = c, t[7] = e, t[8] = o, t[9] = i, t[10] = s) : s = t[10];
49
53
  let a;
50
- t[5] !== e || t[6] !== o || t[7] !== i ? (a = e ? /* @__PURE__ */ m(E, { identifier: e, size: o }) : i ? /* @__PURE__ */ m(C, { src: i, size: o + 13 }) : null, t[5] = e, t[6] = o, t[7] = i, t[8] = a) : a = t[8];
51
- let c;
52
- return t[9] !== r || t[10] !== a ? (c = /* @__PURE__ */ m("div", { ...r, children: a }), t[9] = r, t[10] = a, t[11] = c) : c = t[11], c;
54
+ return t[11] !== r || t[12] !== s ? (a = /* @__PURE__ */ u("div", { ...r, children: s }), t[11] = r, t[12] = s, t[13] = a) : a = t[13], a;
53
55
  };
54
56
  export {
55
- y as Avatar
57
+ k as Avatar
56
58
  };
@@ -10,7 +10,7 @@ import "../d-flow/DFlow.js";
10
10
  import { DFlowReactiveService as R } from "../d-flow/DFlow.service.js";
11
11
  import { useReturnTypes as j } from "../d-flow-node/DFlowNode.return.hook.js";
12
12
  const re = (n, t, o, u = []) => {
13
- const f = I(x), r = N(x), v = I(R), T = N(R), M = $(n), S = g.useMemo(() => t ? M?.find((i) => i.nodeFunctionId === t) : void 0, [M, t]), B = g.useMemo(() => t ? v.getNodeById(n, t)?.parameters?.nodes?.map((a) => a?.value).filter((a) => a?.__typename === "NodeFunctionIdWrapper") ?? [] : [], [n, t, v, T]), c = g.useMemo(() => o ? C(P(o, f), u) : void 0, [o, f, r, u]), p = U(n), m = j(n);
13
+ const m = I(x), r = N(x), v = I(R), T = N(R), M = $(n), S = g.useMemo(() => t ? M?.find((i) => i.nodeFunctionId === t) : void 0, [M, t]), B = g.useMemo(() => t ? v.getNodeById(n, t)?.parameters?.nodes?.map((a) => a?.value).filter((a) => a?.__typename === "NodeFunctionIdWrapper") ?? [] : [], [n, t, v, T]), c = g.useMemo(() => o ? C(P(o, m), u) : void 0, [o, m, r, u]), p = U(n), f = j(n);
14
14
  return g.useMemo(() => {
15
15
  if (!c || !S) return [];
16
16
  const {
@@ -28,7 +28,7 @@ const re = (n, t, o, u = []) => {
28
28
  if (!d && e.node >= l) return [];
29
29
  if (e.depth > i) return [];
30
30
  if (e.scope.some((s) => !a.includes(s))) return [];
31
- const h = m.get(e.nodeFunctionId), E = C(P(h, f), []);
31
+ const h = f.get(e.nodeFunctionId), E = C(P(h, m), []);
32
32
  return V(c, E) ? [{
33
33
  path: [],
34
34
  type: A.REF_OBJECT,
@@ -36,13 +36,13 @@ const re = (n, t, o, u = []) => {
36
36
  value: e
37
37
  }] : [];
38
38
  });
39
- }, [f, S, B, p, c]);
39
+ }, [m, S, B, p, c, f]);
40
40
  }, U = (n) => {
41
41
  const t = I(x);
42
42
  N(x);
43
- const o = I(O), u = I(R), f = N(R), r = g.useMemo(() => u.getById(n), [n, f]), v = $(n), T = j(n), M = g.useMemo(() => r?.nodes?.nodes?.map((c) => {
44
- const p = T.get(c?.id), m = v?.find((i) => i.nodeFunctionId === c?.id);
45
- return p && m ? G(m, p, t) : {};
43
+ const o = I(O), u = I(R), m = N(R), r = g.useMemo(() => u.getById(n), [n, m]), v = $(n), T = j(n), M = g.useMemo(() => r?.nodes?.nodes?.map((c) => {
44
+ const p = T.get(c?.id), f = v?.find((i) => i.nodeFunctionId === c?.id);
45
+ return p && f ? G(f, p, t) : {};
46
46
  }) ?? [], [r]), S = g.useMemo(() => G({
47
47
  node: 0,
48
48
  depth: 0,
@@ -54,7 +54,7 @@ const re = (n, t, o, u = []) => {
54
54
  return [...g.useMemo(() => r?.nodes?.nodes?.length ? r.nodes.nodes.flatMap((c) => {
55
55
  const p = o.getById(c?.functionDefinition?.id);
56
56
  if (!p) return [];
57
- const m = c?.parameters?.nodes?.map((i) => i?.value).filter(Boolean) ?? [];
57
+ const f = c?.parameters?.nodes?.map((i) => i?.value).filter(Boolean) ?? [];
58
58
  return (p.parameterDefinitions ?? []).flatMap((i, a) => {
59
59
  const l = i?.dataTypeIdentifier;
60
60
  if (!l) return [];
@@ -64,7 +64,7 @@ const re = (n, t, o, u = []) => {
64
64
  if (!d?.value || d.value.__typename !== "NodeFunctionIdWrapper") return [];
65
65
  const D = v?.find((y) => d?.value?.__typename === "NodeFunctionIdWrapper" && y.nodeFunctionId === d.value?.id);
66
66
  if (!D) return [];
67
- const h = e.rules?.nodes?.filter((y) => y?.variant === "INPUT_TYPES") ?? [], E = Y(p, m, t, o), s = k(p, l), F = new Map([...E].map(([y, b]) => [s.get(y) ?? y, b]));
67
+ const h = e.rules?.nodes?.filter((y) => y?.variant === "INPUT_TYPES") ?? [], E = Y(p, f, t, o), s = k(p, l), F = new Map([...E].map(([y, b]) => [s.get(y) ?? y, b]));
68
68
  return h.flatMap((y) => (y?.config?.inputTypes ?? []).flatMap((W, K) => {
69
69
  const w = J(W.dataTypeIdentifier, F);
70
70
  return w ? G({
@@ -93,13 +93,13 @@ const re = (n, t, o, u = []) => {
93
93
  ...n
94
94
  }] : [];
95
95
  }, $ = (n) => {
96
- const t = I(x), o = I(R), u = I(O), f = N(R), r = N(O), v = N(x), T = g.useMemo(() => o.getById(n), [n, f]);
96
+ const t = I(x), o = I(R), u = I(O), m = N(R), r = N(O), v = N(x), T = g.useMemo(() => o.getById(n), [n, m]);
97
97
  return g.useMemo(() => {
98
98
  if (!t || !o || !u || !T?.startingNodeId) return;
99
99
  let M = 0;
100
100
  const S = () => ++M;
101
101
  let B = 0;
102
- const c = () => ++B, p = [], m = (i, a, l) => {
102
+ const c = () => ++B, p = [], f = (i, a, l) => {
103
103
  if (!i) return;
104
104
  let e = i.__typename === "NodeFunctionIdWrapper" ? o.getNodeById(n, i.id) : i;
105
105
  for (; e; ) {
@@ -111,9 +111,9 @@ const re = (n, t, o, u = []) => {
111
111
  if (E?.variant === "NODE") {
112
112
  if (s?.value && s.value.__typename === "NodeFunctionIdWrapper") {
113
113
  const F = [...l, S()];
114
- m(s.value, a + 1, F);
114
+ f(s.value, a + 1, F);
115
115
  }
116
- } else s?.value && s.value.__typename === "NodeFunctionIdWrapper" && m(s.value, a, l);
116
+ } else s?.value && s.value.__typename === "NodeFunctionIdWrapper" && f(s.value, a, l);
117
117
  }
118
118
  const D = c();
119
119
  p.push({
@@ -124,8 +124,8 @@ const re = (n, t, o, u = []) => {
124
124
  }), e = o.getNodeById(T.id, e.nextNodeId);
125
125
  }
126
126
  };
127
- return m(o.getNodeById(T.id, T.startingNodeId), 0, [0]), p;
128
- }, [t, T, n, o, u, v, f, r]) ?? [];
127
+ return f(o.getNodeById(T.id, T.startingNodeId), 0, [0]), p;
128
+ }, [t, T, n, o, u, v, m, r]) ?? [];
129
129
  };
130
130
  export {
131
131
  re as useReferenceSuggestions
@@ -5,8 +5,8 @@ import { MenuTrigger as y, MenuContent as _, Menu as g } from "../menu/Menu.js";
5
5
  const T = (t) => {
6
6
  const e = v.c(11), {
7
7
  children: l,
8
- context: u
9
- } = t, [m, p] = w.useState(!0), h = _;
8
+ context: m
9
+ } = t, [u, p] = w.useState(!0), h = _;
10
10
  let r;
11
11
  e[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (r = (a) => p(a), e[0] = r) : r = e[0];
12
12
  let i;
@@ -18,9 +18,9 @@ const T = (t) => {
18
18
  height: 0
19
19
  } }) }), e[1] = i) : i = e[1];
20
20
  let n;
21
- e[2] !== u?.view ? (n = (a) => {
22
- ["Escape", "ArrowUp", "ArrowDown"].includes(a.key) || u?.view?.focus();
23
- }, e[2] = u?.view, e[3] = n) : n = e[3];
21
+ e[2] !== m?.view ? (n = (a) => {
22
+ ["Escape", "ArrowUp", "ArrowDown"].includes(a.key) || m?.view?.focus();
23
+ }, e[2] = m?.view, e[3] = n) : n = e[3];
24
24
  let s;
25
25
  e[4] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (s = {
26
26
  position: "fixed",
@@ -29,12 +29,12 @@ const T = (t) => {
29
29
  pointerEvents: "auto"
30
30
  }, e[4] = s) : s = e[4];
31
31
  let o;
32
- e[5] !== l || e[6] !== n ? (o = /* @__PURE__ */ f(h, { w: "200px", onInteractOutside: b, onOpenAutoFocus: D, onKeyDown: n, style: s, children: l }), e[5] = l, e[6] = n, e[7] = o) : o = e[7];
32
+ e[5] !== l || e[6] !== n ? (o = /* @__PURE__ */ f(h, { miw: "200px", onInteractOutside: b, onOpenAutoFocus: D, onKeyDown: n, style: s, children: l }), e[5] = l, e[6] = n, e[7] = o) : o = e[7];
33
33
  let c;
34
- return e[8] !== m || e[9] !== o ? (c = /* @__PURE__ */ d(g, { open: m, onOpenChange: r, modal: !1, children: [
34
+ return e[8] !== u || e[9] !== o ? (c = /* @__PURE__ */ d(g, { open: u, onOpenChange: r, modal: !1, children: [
35
35
  i,
36
36
  o
37
- ] }), e[8] = m, e[9] = o, e[10] = c) : c = e[10], c;
37
+ ] }), e[8] = u, e[9] = o, e[10] = c) : c = e[10], c;
38
38
  };
39
39
  function x(t) {
40
40
  return t;
@@ -0,0 +1,146 @@
1
+ let a = 0;
2
+ class t {
3
+ /**
4
+ Create a new node prop type.
5
+ */
6
+ constructor(e = {}) {
7
+ this.id = a++, this.perNode = !!e.perNode, this.deserialize = e.deserialize || (() => {
8
+ throw new Error("This node type doesn't define a deserialize function");
9
+ }), this.combine = e.combine || null;
10
+ }
11
+ /**
12
+ This is meant to be used with
13
+ [`NodeSet.extend`](#common.NodeSet.extend) or
14
+ [`LRParser.configure`](#lr.ParserConfig.props) to compute
15
+ prop values for each node type in the set. Takes a [match
16
+ object](#common.NodeType^match) or function that returns undefined
17
+ if the node type doesn't get this prop, and the prop's value if
18
+ it does.
19
+ */
20
+ add(e) {
21
+ if (this.perNode)
22
+ throw new RangeError("Can't add per-node props to node types");
23
+ return typeof e != "function" && (e = l.match(e)), (n) => {
24
+ let o = e(n);
25
+ return o === void 0 ? null : [this, o];
26
+ };
27
+ }
28
+ }
29
+ t.closedBy = new t({ deserialize: (r) => r.split(" ") });
30
+ t.openedBy = new t({ deserialize: (r) => r.split(" ") });
31
+ t.group = new t({ deserialize: (r) => r.split(" ") });
32
+ t.isolate = new t({ deserialize: (r) => {
33
+ if (r && r != "rtl" && r != "ltr" && r != "auto")
34
+ throw new RangeError("Invalid value for isolate: " + r);
35
+ return r || "auto";
36
+ } });
37
+ t.contextHash = new t({ perNode: !0 });
38
+ t.lookAhead = new t({ perNode: !0 });
39
+ t.mounted = new t({ perNode: !0 });
40
+ const d = /* @__PURE__ */ Object.create(null);
41
+ class l {
42
+ /**
43
+ @internal
44
+ */
45
+ constructor(e, n, o, s = 0) {
46
+ this.name = e, this.props = n, this.id = o, this.flags = s;
47
+ }
48
+ /**
49
+ Define a node type.
50
+ */
51
+ static define(e) {
52
+ let n = e.props && e.props.length ? /* @__PURE__ */ Object.create(null) : d, o = (e.top ? 1 : 0) | (e.skipped ? 2 : 0) | (e.error ? 4 : 0) | (e.name == null ? 8 : 0), s = new l(e.name || "", n, e.id, o);
53
+ if (e.props) {
54
+ for (let i of e.props)
55
+ if (Array.isArray(i) || (i = i(s)), i) {
56
+ if (i[0].perNode)
57
+ throw new RangeError("Can't store a per-node prop on a node type");
58
+ n[i[0].id] = i[1];
59
+ }
60
+ }
61
+ return s;
62
+ }
63
+ /**
64
+ Retrieves a node prop for this type. Will return `undefined` if
65
+ the prop isn't present on this node.
66
+ */
67
+ prop(e) {
68
+ return this.props[e.id];
69
+ }
70
+ /**
71
+ True when this is the top node of a grammar.
72
+ */
73
+ get isTop() {
74
+ return (this.flags & 1) > 0;
75
+ }
76
+ /**
77
+ True when this node is produced by a skip rule.
78
+ */
79
+ get isSkipped() {
80
+ return (this.flags & 2) > 0;
81
+ }
82
+ /**
83
+ Indicates whether this is an error node.
84
+ */
85
+ get isError() {
86
+ return (this.flags & 4) > 0;
87
+ }
88
+ /**
89
+ When true, this node type doesn't correspond to a user-declared
90
+ named node, for example because it is used to cache repetition.
91
+ */
92
+ get isAnonymous() {
93
+ return (this.flags & 8) > 0;
94
+ }
95
+ /**
96
+ Returns true when this node's name or one of its
97
+ [groups](#common.NodeProp^group) matches the given string.
98
+ */
99
+ is(e) {
100
+ if (typeof e == "string") {
101
+ if (this.name == e)
102
+ return !0;
103
+ let n = this.prop(t.group);
104
+ return n ? n.indexOf(e) > -1 : !1;
105
+ }
106
+ return this.id == e;
107
+ }
108
+ /**
109
+ Create a function from node types to arbitrary values by
110
+ specifying an object whose property names are node or
111
+ [group](#common.NodeProp^group) names. Often useful with
112
+ [`NodeProp.add`](#common.NodeProp.add). You can put multiple
113
+ names, separated by spaces, in a single property name to map
114
+ multiple node names to a single value.
115
+ */
116
+ static match(e) {
117
+ let n = /* @__PURE__ */ Object.create(null);
118
+ for (let o in e)
119
+ for (let s of o.split(" "))
120
+ n[s] = e[o];
121
+ return (o) => {
122
+ for (let s = o.prop(t.group), i = -1; i < (s ? s.length : 0); i++) {
123
+ let p = n[i < 0 ? o.name : s[i]];
124
+ if (p)
125
+ return p;
126
+ }
127
+ };
128
+ }
129
+ }
130
+ l.none = new l(
131
+ "",
132
+ /* @__PURE__ */ Object.create(null),
133
+ 0,
134
+ 8
135
+ /* NodeFlag.Anonymous */
136
+ );
137
+ var u;
138
+ (function(r) {
139
+ r[r.ExcludeBuffers = 1] = "ExcludeBuffers", r[r.IncludeAnonymous = 2] = "IncludeAnonymous", r[r.IgnoreMounts = 4] = "IgnoreMounts", r[r.IgnoreOverlays = 8] = "IgnoreOverlays", r[r.EnterBracketed = 16] = "EnterBracketed";
140
+ })(u || (u = {}));
141
+ new t({ perNode: !0 });
142
+ export {
143
+ u as IterMode,
144
+ t as NodeProp,
145
+ l as NodeType
146
+ };
@@ -1,4 +1,4 @@
1
- import { NodeProp as q } from "@lezer/common";
1
+ import { NodeProp as q } from "../../common/dist/index.js";
2
2
  let A = 0;
3
3
  class l {
4
4
  /**
@@ -17,7 +17,7 @@ const _ = "GENERIC", y = (e) => typeof e == "object" && e !== null && !Array.isA
17
17
  if (y(e)) {
18
18
  const t = {};
19
19
  return Object.entries(e).forEach(([r, s]) => {
20
- r === "__typename" || r === "id" || r === "createdAt" || r === "updatedAt" || (t[r] = C(s));
20
+ s != null && (r === "__typename" || r === "id" || r === "createdAt" || r === "updatedAt" || (t[r] = C(s)));
21
21
  }), t;
22
22
  }
23
23
  return e;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code0-tech/pictor",
3
- "version": "0.0.0-mvp.42",
3
+ "version": "0.0.0-mvp.43",
4
4
  "type": "module",
5
5
  "description": "A simple template for a custom React component library",
6
6
  "scripts": {
@@ -119,7 +119,6 @@
119
119
  "@codemirror/language": "^6.12.1",
120
120
  "@monaco-editor/react": "^4.7.0",
121
121
  "@radix-ui/react-checkbox": "^1.3.3",
122
- "@lezer/common": "^1.5.1",
123
122
  "@radix-ui/react-context-menu": "^2.2.16",
124
123
  "@radix-ui/react-dialog": "^1.1.15",
125
124
  "@radix-ui/react-dropdown-menu": "^2.1.16",