@ynput/ayon-frontend-shared 0.6.6 → 0.6.8
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.
- package/dist/DetailsPanel.es.js +4 -4
- package/dist/ListTable.es.js +2 -2
- package/dist/NewEntity.es.js +49 -49
- package/dist/ProjectTreeTable.es.js +501 -496
- package/dist/Slicer.es.js +27 -27
- package/dist/Views.es.js +213 -206
- package/dist/api.es.js +362 -360
- package/dist/chunks/Actions.es.js +21 -21
- package/dist/chunks/CodeEditor.es.js +30 -0
- package/dist/chunks/ColumnDropIndicator.es.js +5 -5
- package/dist/chunks/ColumnDropIndicator.styled.es.js +24 -24
- package/dist/chunks/ColumnHeaderMenuUI.es.js +2 -2
- package/dist/chunks/DeleteEntitiesContextInstance.es.js +96 -96
- package/dist/chunks/EmptyPlaceholder.es.js +9 -9
- package/dist/chunks/EntityPath.es.js +3 -3
- package/dist/chunks/EntityTooltip.es.js +1 -1
- package/dist/chunks/EntityUpdatesContext.es.js +1 -1
- package/dist/chunks/Feed.es.js +1625 -1573
- package/dist/chunks/JsonViewer.es.js +1 -1
- package/dist/chunks/Menu.es.js +1 -1
- package/dist/chunks/MenuItem.es.js +25 -25
- package/dist/chunks/MetaWidget.es.js +1537 -1516
- package/dist/chunks/PlayableIcon.es.js +128 -128
- package/dist/chunks/ProjectContext.es.js +11 -11
- package/dist/chunks/ReviewablesSelector.es.js +553 -462
- package/dist/chunks/SimpleForm.es.js +7 -7
- package/dist/chunks/SimpleTable.es.js +110 -110
- package/dist/chunks/Slicer.es.js +80 -80
- package/dist/chunks/TableSettingsFallback.es.js +1 -1
- package/dist/chunks/ThumbnailSimple.es.js +17 -17
- package/dist/chunks/VideoPlayer.es.js +1 -1
- package/dist/chunks/Watchers.es.js +50 -50
- package/dist/chunks/afterStartup.es.js +13 -0
- package/dist/chunks/getBundleMode.es.js +1 -1
- package/dist/chunks/getUris.es.js +797 -827
- package/dist/chunks/searchTerms.es.js +353 -336
- package/dist/chunks/useAttributeEnums.es.js +16 -16
- package/dist/chunks/useHierarchySelection.es.js +2 -2
- package/dist/chunks/useLoadModule.es.js +24 -23
- package/dist/chunks/viewUpdateHelper.es.js +8 -8
- package/dist/components.es.js +205 -202
- package/dist/context.es.js +525 -496
- package/dist/hooks.es.js +190 -166
- package/dist/types/ContextMenu.d.ts +1 -0
- package/dist/types/ProjectTreeTable.d.ts +1 -0
- package/dist/types/Views.d.ts +11 -0
- package/dist/types/api.d.ts +823 -1427
- package/dist/types/components.d.ts +9 -1
- package/dist/types/context.d.ts +1 -0
- package/dist/types/hooks.d.ts +25 -1
- package/dist/types/util.d.ts +10 -0
- package/dist/util.es.js +45 -42
- package/package.json +2 -2
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { jsx as r, jsxs as
|
|
2
|
-
import { Button as
|
|
1
|
+
import { jsx as r, jsxs as q } from "react/jsx-runtime";
|
|
2
|
+
import { Button as G, Dropdown as de, Icon as E, DefaultValueTemplate as ue, Spacer as pe } from "@ynput/ayon-react-components";
|
|
3
3
|
import x, { keyframes as ge } from "styled-components";
|
|
4
4
|
import { useRef as fe, useMemo as f, useState as $, useEffect as me } from "react";
|
|
5
5
|
import B from "clsx";
|
|
6
6
|
import { toast as w } from "react-toastify";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
7
|
+
import { bj as he } from "./searchTerms.es.js";
|
|
8
|
+
import { d3 as be, bc as ve, cS as ye, bd as xe, b8 as Ae } from "./getUris.es.js";
|
|
9
9
|
import "primereact/confirmdialog";
|
|
10
|
-
import { upperFirst as
|
|
10
|
+
import { upperFirst as Q } from "lodash";
|
|
11
11
|
import { u as we } from "./useActionTriggers.es.js";
|
|
12
|
-
import { S as
|
|
12
|
+
import { S as R } from "./SimpleFormDialog.es.js";
|
|
13
13
|
import "uuid";
|
|
14
14
|
import "@module-federation/enhanced/runtime";
|
|
15
15
|
import { d as Ce } from "./DeleteEntitiesContextInstance.es.js";
|
|
@@ -28,7 +28,7 @@ const Se = x.div`
|
|
|
28
28
|
|
|
29
29
|
border-radius: var(--border-radius-m);
|
|
30
30
|
background-color: var(--md-sys-color-surface-container-high);
|
|
31
|
-
`, Ie = x(
|
|
31
|
+
`, Ie = x(G)`
|
|
32
32
|
padding: 4px;
|
|
33
33
|
user-select: none;
|
|
34
34
|
position: relative;
|
|
@@ -140,12 +140,12 @@ const Se = x.div`
|
|
|
140
140
|
hasConfig: p,
|
|
141
141
|
description: b,
|
|
142
142
|
onConfig: c
|
|
143
|
-
}) => u ? /* @__PURE__ */ r(ke, { children:
|
|
143
|
+
}) => u ? /* @__PURE__ */ r(ke, { children: Q(s) }) : /* @__PURE__ */ r(De, { children: /* @__PURE__ */ q(Be, { "data-tooltip": b || "", "data-tooltip-delay": 0, children: [
|
|
144
144
|
/* @__PURE__ */ r(U, { icon: a }),
|
|
145
145
|
/* @__PURE__ */ r("span", { children: s }),
|
|
146
146
|
/* @__PURE__ */ r(pe, {}),
|
|
147
147
|
p && /* @__PURE__ */ r(
|
|
148
|
-
|
|
148
|
+
G,
|
|
149
149
|
{
|
|
150
150
|
onClick: (m) => {
|
|
151
151
|
c?.(o), m.stopPropagation(), m.preventDefault();
|
|
@@ -182,13 +182,13 @@ const Se = x.div`
|
|
|
182
182
|
onChange: (g) => p(g[0]),
|
|
183
183
|
buttonProps: {
|
|
184
184
|
// @ts-expect-error
|
|
185
|
-
"data-tooltip": a === "production" ? "Actions" : `${
|
|
185
|
+
"data-tooltip": a === "production" ? "Actions" : `${Q(u)} Actions`,
|
|
186
186
|
"data-tooltip-delay": 0
|
|
187
187
|
},
|
|
188
188
|
...c
|
|
189
189
|
}
|
|
190
190
|
);
|
|
191
|
-
},
|
|
191
|
+
}, je = ({ action: o, onClose: s, context: a }) => {
|
|
192
192
|
const u = f(() => !o || !(o.addonName && o.addonVersion) ? null : {
|
|
193
193
|
addonName: o.addonName,
|
|
194
194
|
addonVersion: o.addonVersion,
|
|
@@ -208,7 +208,7 @@ const Se = x.div`
|
|
|
208
208
|
}
|
|
209
209
|
};
|
|
210
210
|
return /* @__PURE__ */ r(
|
|
211
|
-
|
|
211
|
+
R,
|
|
212
212
|
{
|
|
213
213
|
isOpen: !0,
|
|
214
214
|
title: `Configure action ${o.label}`,
|
|
@@ -222,7 +222,7 @@ const Se = x.div`
|
|
|
222
222
|
cancelIcon: "close"
|
|
223
223
|
}
|
|
224
224
|
);
|
|
225
|
-
},
|
|
225
|
+
}, Ve = ({
|
|
226
226
|
interactiveForm: o,
|
|
227
227
|
onClose: s,
|
|
228
228
|
onSubmit: a
|
|
@@ -232,7 +232,7 @@ const Se = x.div`
|
|
|
232
232
|
a(o.identifier, p), s();
|
|
233
233
|
};
|
|
234
234
|
return /* @__PURE__ */ r(
|
|
235
|
-
|
|
235
|
+
R,
|
|
236
236
|
{
|
|
237
237
|
isOpen: !0,
|
|
238
238
|
title: `${o.title}`,
|
|
@@ -286,14 +286,14 @@ const Se = x.div`
|
|
|
286
286
|
const { data: X, isFetching: Y } = ye(
|
|
287
287
|
{ archived: !1 },
|
|
288
288
|
{ skip: d !== "developer" }
|
|
289
|
-
), I = X?.bundles || [],
|
|
289
|
+
), I = X?.bundles || [], j = f(() => {
|
|
290
290
|
if (!I?.length || d !== "developer") return null;
|
|
291
291
|
const e = I.filter((t) => t.isDev);
|
|
292
292
|
return e.length ? e.find((t) => t.activeUser === F?.name)?.name || e[0].name : null;
|
|
293
|
-
}, [I, d, F?.name]),
|
|
293
|
+
}, [I, d, F?.name]), V = f(() => d === "developer" ? j || "developer" : d, [d, j]), { data: Z, isFetching: M } = xe(
|
|
294
294
|
{
|
|
295
295
|
mode: "simple",
|
|
296
|
-
variant:
|
|
296
|
+
variant: V,
|
|
297
297
|
actionContext: C
|
|
298
298
|
},
|
|
299
299
|
{ skip: !C }
|
|
@@ -397,7 +397,7 @@ const Se = x.div`
|
|
|
397
397
|
() => Array(c).fill(N),
|
|
398
398
|
[c, N]
|
|
399
399
|
), k = M || u, ce = k ? le : oe;
|
|
400
|
-
return /* @__PURE__ */
|
|
400
|
+
return /* @__PURE__ */ q(Se, { className: B("actions", { loading: k }), children: [
|
|
401
401
|
ce.map((e, n) => /* @__PURE__ */ r(
|
|
402
402
|
Ie,
|
|
403
403
|
{
|
|
@@ -419,13 +419,13 @@ const Se = x.div`
|
|
|
419
419
|
onAction: D,
|
|
420
420
|
onConfig: ae,
|
|
421
421
|
bundleMode: d,
|
|
422
|
-
actionsVariant:
|
|
422
|
+
actionsVariant: V,
|
|
423
423
|
align: z,
|
|
424
424
|
...H?.dropdown
|
|
425
425
|
}
|
|
426
426
|
),
|
|
427
427
|
/* @__PURE__ */ r(
|
|
428
|
-
|
|
428
|
+
je,
|
|
429
429
|
{
|
|
430
430
|
action: K,
|
|
431
431
|
context: C,
|
|
@@ -433,7 +433,7 @@ const Se = x.div`
|
|
|
433
433
|
}
|
|
434
434
|
),
|
|
435
435
|
/* @__PURE__ */ r(
|
|
436
|
-
|
|
436
|
+
Ve,
|
|
437
437
|
{
|
|
438
438
|
interactiveForm: W,
|
|
439
439
|
onClose: () => S(null),
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsx as o } from "react/jsx-runtime";
|
|
2
|
+
import { lazy as i, forwardRef as s, Suspense as d } from "react";
|
|
3
|
+
const m = i(() => import("@uiw/react-textarea-code-editor")), u = s((e, a) => {
|
|
4
|
+
const { language: c, minHeight: t, padding: r, prefixCls: g, rehypePlugins: p, onChange: y, value: n, ...l } = e;
|
|
5
|
+
return /* @__PURE__ */ o(
|
|
6
|
+
d,
|
|
7
|
+
{
|
|
8
|
+
fallback: /* @__PURE__ */ o(
|
|
9
|
+
"textarea",
|
|
10
|
+
{
|
|
11
|
+
...l,
|
|
12
|
+
ref: a,
|
|
13
|
+
value: n ?? "",
|
|
14
|
+
readOnly: !0,
|
|
15
|
+
style: {
|
|
16
|
+
padding: r,
|
|
17
|
+
minHeight: t,
|
|
18
|
+
fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
|
|
19
|
+
...e.style
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
),
|
|
23
|
+
children: /* @__PURE__ */ o(m, { ref: a, ...e })
|
|
24
|
+
}
|
|
25
|
+
);
|
|
26
|
+
});
|
|
27
|
+
u.displayName = "CodeEditor";
|
|
28
|
+
export {
|
|
29
|
+
u as C
|
|
30
|
+
};
|
|
@@ -3,9 +3,9 @@ import "react-toastify";
|
|
|
3
3
|
import "lodash";
|
|
4
4
|
import "primereact/confirmdialog";
|
|
5
5
|
import { g as p } from "./iconUtils.es.js";
|
|
6
|
-
import {
|
|
6
|
+
import { bk as E } from "./searchTerms.es.js";
|
|
7
7
|
import "uuid";
|
|
8
|
-
import { jsx as
|
|
8
|
+
import { jsx as k } from "react/jsx-runtime";
|
|
9
9
|
import "clsx";
|
|
10
10
|
import "./PlayableIcon.es.js";
|
|
11
11
|
import "@ynput/ayon-react-components";
|
|
@@ -22,7 +22,7 @@ import "@lexical/selection";
|
|
|
22
22
|
import "@lexical/utils";
|
|
23
23
|
import "./getUris.es.js";
|
|
24
24
|
import "./DeleteEntitiesContextInstance.es.js";
|
|
25
|
-
import { a as
|
|
25
|
+
import { a as L, b as S } from "./MetaWidget.es.js";
|
|
26
26
|
import "@module-federation/enhanced/runtime";
|
|
27
27
|
import "semver";
|
|
28
28
|
import "./ContextMenuContextInstance.es.js";
|
|
@@ -36,7 +36,7 @@ const O = ["string", "integer", "float"], B = (o, s, t, n) => (t || O).includes(
|
|
|
36
36
|
enumOnly: s,
|
|
37
37
|
scope: t
|
|
38
38
|
}) => {
|
|
39
|
-
const { columnOrder: n } =
|
|
39
|
+
const { columnOrder: n } = L(), { attribFields: a } = S();
|
|
40
40
|
return A(
|
|
41
41
|
() => [
|
|
42
42
|
{
|
|
@@ -175,7 +175,7 @@ const O = ["string", "integer", "float"], B = (o, s, t, n) => (t || O).includes(
|
|
|
175
175
|
m = requestAnimationFrame(u);
|
|
176
176
|
};
|
|
177
177
|
return u(), () => cancelAnimationFrame(m);
|
|
178
|
-
}, [t, n]), a ? R(/* @__PURE__ */
|
|
178
|
+
}, [t, n]), a ? R(/* @__PURE__ */ k(I, { style: a }), document.body) : null;
|
|
179
179
|
};
|
|
180
180
|
export {
|
|
181
181
|
_ as C,
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { createContext as _, useContext as u, forwardRef as I } from "react";
|
|
2
2
|
import { jsxs as l, jsx as i, Fragment as S } from "react/jsx-runtime";
|
|
3
|
-
import { Button as p, Icon as
|
|
3
|
+
import { Button as p, Icon as N } from "@ynput/ayon-react-components";
|
|
4
4
|
import a from "clsx";
|
|
5
5
|
import n from "styled-components";
|
|
6
6
|
import { R as d, D as f } from "./realtimeUpdatesUtils.es.js";
|
|
7
7
|
import "lodash";
|
|
8
8
|
import "primereact/confirmdialog";
|
|
9
9
|
import "react-toastify";
|
|
10
|
-
import { c as
|
|
10
|
+
import { c as z } from "./copyToClipboard.es.js";
|
|
11
11
|
import "uuid";
|
|
12
12
|
import "./searchTerms.es.js";
|
|
13
|
-
const
|
|
13
|
+
const E = (t) => {
|
|
14
14
|
const o = t.getIsPinned(), s = t.id !== d && t.id !== f ? -30 : 0;
|
|
15
15
|
return {
|
|
16
16
|
left: o === "left" ? `${t.getStart("left") + s}px` : void 0,
|
|
@@ -19,7 +19,7 @@ const D = (t) => {
|
|
|
19
19
|
width: t.getSize(),
|
|
20
20
|
zIndex: o ? 100 : 0
|
|
21
21
|
};
|
|
22
|
-
},
|
|
22
|
+
}, M = (t) => `calc(var(--col-${t}-size) * 1px)`, g = _(void 0), Q = () => {
|
|
23
23
|
const t = u(g);
|
|
24
24
|
if (!t)
|
|
25
25
|
throw new Error("useFeedback must be used within a FeedbackProvider");
|
|
@@ -63,7 +63,7 @@ const D = (t) => {
|
|
|
63
63
|
)
|
|
64
64
|
]
|
|
65
65
|
}
|
|
66
|
-
)),
|
|
66
|
+
)), B = n(p)`
|
|
67
67
|
width: 24px;
|
|
68
68
|
height: 24px;
|
|
69
69
|
padding: 2px;
|
|
@@ -79,14 +79,14 @@ const D = (t) => {
|
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
&.pin-button .material-symbols-outlined.icon {
|
|
82
|
-
font-variation-settings: 'FILL' 1
|
|
82
|
+
font-variation-settings: 'FILL' 1;
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
&.selected {
|
|
86
86
|
display: flex !important;
|
|
87
87
|
}
|
|
88
88
|
`, tt = ({ selected: t, style: o, ...s }) => /* @__PURE__ */ i(
|
|
89
|
-
|
|
89
|
+
B,
|
|
90
90
|
{
|
|
91
91
|
...s,
|
|
92
92
|
selected: t,
|
|
@@ -114,20 +114,20 @@ const D = (t) => {
|
|
|
114
114
|
${({ $isOpen: t }) => t && `
|
|
115
115
|
background-color: var(--md-sys-color-surface-container-hover) !important;
|
|
116
116
|
`}
|
|
117
|
-
`,
|
|
117
|
+
`, D = n.tfoot`
|
|
118
118
|
display: grid !important;
|
|
119
119
|
position: sticky;
|
|
120
120
|
bottom: 0;
|
|
121
121
|
z-index: 10;
|
|
122
122
|
background-color: var(--md-sys-color-surface-container-lowest);
|
|
123
|
-
`,
|
|
123
|
+
`, P = n.tr`
|
|
124
124
|
display: flex;
|
|
125
125
|
background-color: var(--md-sys-color-surface-container-low);
|
|
126
126
|
|
|
127
127
|
&.clickable {
|
|
128
128
|
cursor: pointer;
|
|
129
129
|
}
|
|
130
|
-
`,
|
|
130
|
+
`, R = n.td`
|
|
131
131
|
position: relative;
|
|
132
132
|
box-shadow: inset 1px 1px 0 0 var(--md-sys-color-surface-container);
|
|
133
133
|
background-color: var(--md-sys-color-surface-container-lowest);
|
|
@@ -151,7 +151,7 @@ const D = (t) => {
|
|
|
151
151
|
width: 24px !important;
|
|
152
152
|
min-width: unset;
|
|
153
153
|
}
|
|
154
|
-
`,
|
|
154
|
+
`, A = n.div`
|
|
155
155
|
display: flex;
|
|
156
156
|
align-items: center;
|
|
157
157
|
gap: var(--base-gap-small);
|
|
@@ -193,8 +193,8 @@ const D = (t) => {
|
|
|
193
193
|
virtualPaddingRight: m,
|
|
194
194
|
renderCellContent: v,
|
|
195
195
|
onClick: c,
|
|
196
|
-
isLoading:
|
|
197
|
-
statsLoading:
|
|
196
|
+
isLoading: y,
|
|
197
|
+
statsLoading: w,
|
|
198
198
|
error: r
|
|
199
199
|
}) => {
|
|
200
200
|
const C = [
|
|
@@ -202,8 +202,8 @@ const D = (t) => {
|
|
|
202
202
|
...o.getCenterVisibleLeafColumns(),
|
|
203
203
|
...o.getRightVisibleLeafColumns()
|
|
204
204
|
], b = t.getVirtualItems(), h = r instanceof Error ? r.message : typeof r == "string" ? r : "";
|
|
205
|
-
return /* @__PURE__ */ i(
|
|
206
|
-
|
|
205
|
+
return /* @__PURE__ */ i(D, { children: /* @__PURE__ */ l(
|
|
206
|
+
P,
|
|
207
207
|
{
|
|
208
208
|
className: a({ clickable: !!c }),
|
|
209
209
|
onClick: c,
|
|
@@ -215,21 +215,21 @@ const D = (t) => {
|
|
|
215
215
|
if (!e) return null;
|
|
216
216
|
const L = e.id === f || e.id === d, F = e.getIsPinned() === "left" && e.getIsLastColumn("left");
|
|
217
217
|
return /* @__PURE__ */ i(
|
|
218
|
-
|
|
218
|
+
R,
|
|
219
219
|
{
|
|
220
220
|
className: a(e.id, { "last-pinned-left": F }),
|
|
221
|
-
style: { ...
|
|
222
|
-
children:
|
|
221
|
+
style: { ...E(e), width: M(e.id) },
|
|
222
|
+
children: y ? /* @__PURE__ */ i(
|
|
223
223
|
x,
|
|
224
224
|
{
|
|
225
225
|
className: a("loading", "shimmer-dark", {
|
|
226
226
|
selection: e.id === d
|
|
227
227
|
})
|
|
228
228
|
}
|
|
229
|
-
) : r ? e.id === "name" ? /* @__PURE__ */ l(
|
|
229
|
+
) : r ? e.id === "name" ? /* @__PURE__ */ l(A, { style: { color: "var(--md-sys-color-error)" }, children: [
|
|
230
230
|
"Error loading stats",
|
|
231
231
|
/* @__PURE__ */ i(
|
|
232
|
-
|
|
232
|
+
N,
|
|
233
233
|
{
|
|
234
234
|
icon: "info",
|
|
235
235
|
style: { fontSize: 16, cursor: "help" },
|
|
@@ -242,7 +242,7 @@ const D = (t) => {
|
|
|
242
242
|
{
|
|
243
243
|
icon: "content_copy",
|
|
244
244
|
"data-tooltip": "Copy error message",
|
|
245
|
-
onClick: () =>
|
|
245
|
+
onClick: () => z(h),
|
|
246
246
|
iconProps: { style: { fontSize: 16 } },
|
|
247
247
|
style: { padding: 2 },
|
|
248
248
|
variant: "text"
|
|
@@ -250,7 +250,7 @@ const D = (t) => {
|
|
|
250
250
|
)
|
|
251
251
|
] }) : null : !L && /* @__PURE__ */ l(S, { children: [
|
|
252
252
|
v?.(e.id),
|
|
253
|
-
|
|
253
|
+
w && /* @__PURE__ */ i(O, { className: a("loading", "shimmer-dark") })
|
|
254
254
|
] })
|
|
255
255
|
},
|
|
256
256
|
e.id
|
|
@@ -275,7 +275,7 @@ export {
|
|
|
275
275
|
et as T,
|
|
276
276
|
it as a,
|
|
277
277
|
Q as b,
|
|
278
|
-
|
|
279
|
-
|
|
278
|
+
E as c,
|
|
279
|
+
M as g,
|
|
280
280
|
X as u
|
|
281
281
|
};
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { jsxs as a, Fragment as l, jsx as n } from "react/jsx-runtime";
|
|
2
2
|
import { useRef as u } from "react";
|
|
3
3
|
import "@module-federation/enhanced/runtime";
|
|
4
|
+
import "react-toastify";
|
|
5
|
+
import "@ynput/ayon-react-components";
|
|
4
6
|
import "./searchTerms.es.js";
|
|
5
7
|
import "./getUris.es.js";
|
|
6
8
|
import "primereact/confirmdialog";
|
|
7
9
|
import { u as f } from "./DeleteEntitiesContextInstance.es.js";
|
|
8
10
|
import "lodash";
|
|
9
|
-
import "react-toastify";
|
|
10
11
|
import "uuid";
|
|
11
12
|
import "semver";
|
|
12
|
-
import "@ynput/ayon-react-components";
|
|
13
13
|
import "./ContextMenuContextInstance.es.js";
|
|
14
14
|
import "clsx";
|
|
15
15
|
import "react-dom";
|