@gridsuite/commons-ui 0.34.1 → 0.35.0
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/lib/components/ElementSearchDialog/equipment-item.js +12 -5
- package/lib/components/ElementSearchDialog/tag-renderer.js +4 -1
- package/lib/components/FlatParameters/FlatParameters.js +18 -21
- package/lib/components/Login/Login.js +22 -20
- package/lib/components/Login/Logout.js +18 -20
- package/lib/components/MuiVirtualizedTable/ColumnHeader.js +53 -54
- package/lib/components/MuiVirtualizedTable/MuiVirtualizedTable.js +80 -55
- package/lib/components/MuiVirtualizedTable/index.js +5 -3
- package/lib/components/OverflowableText/overflowable-text.js +38 -27
- package/lib/components/ReportViewer/log-table.js +15 -15
- package/lib/components/ReportViewer/report-item.js +61 -49
- package/lib/components/ReportViewer/report-viewer.js +5 -7
- package/lib/components/ReportViewerDialog/report-viewer-dialog.js +6 -8
- package/lib/components/TopBar/TopBar.js +157 -160
- package/lib/components/TreeViewFinder/TreeViewFinder.js +51 -39
- package/lib/components/TreeViewFinder/index.js +5 -4
- package/lib/components/translations/top-bar-en.js +2 -1
- package/lib/components/translations/top-bar-fr.js +2 -1
- package/lib/utils/EquipmentType.js +30 -30
- package/lib/utils/styles.js +42 -0
- package/package.json +1 -2
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
exports.__esModule = true;
|
|
4
|
-
exports["default"] = void 0;
|
|
4
|
+
exports.generateTreeViewFinderClass = exports["default"] = void 0;
|
|
5
5
|
var _react = _interopRequireWildcard(require("react"));
|
|
6
6
|
var _reactIntl = require("react-intl");
|
|
7
7
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
8
|
-
var
|
|
8
|
+
var _styles = require("../../utils/styles");
|
|
9
|
+
var _system = require("@mui/system");
|
|
9
10
|
var _Dialog = _interopRequireDefault(require("@mui/material/Dialog"));
|
|
10
11
|
var _DialogActions = _interopRequireDefault(require("@mui/material/DialogActions"));
|
|
11
12
|
var _DialogContent = _interopRequireDefault(require("@mui/material/DialogContent"));
|
|
@@ -18,37 +19,45 @@ var _Typography = _interopRequireDefault(require("@mui/material/Typography"));
|
|
|
18
19
|
var _ExpandMore = _interopRequireDefault(require("@mui/icons-material/ExpandMore"));
|
|
19
20
|
var _ChevronRight = _interopRequireDefault(require("@mui/icons-material/ChevronRight"));
|
|
20
21
|
var _Check = _interopRequireDefault(require("@mui/icons-material/Check"));
|
|
21
|
-
|
|
22
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
23
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
22
|
+
var _defaultStyles;
|
|
24
23
|
/**
|
|
25
24
|
* Copyright (c) 2021, RTE (http://www.rte-france.com)
|
|
26
25
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
27
26
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
28
27
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
29
28
|
*/
|
|
29
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
30
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
31
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
32
|
+
// As a bunch of individual variables to try to make it easier
|
|
33
|
+
// to track that they are all used. Not sure, maybe group them in an object ?
|
|
34
|
+
var cssDialogPaper = 'dialogPaper';
|
|
35
|
+
var cssLabelRoot = 'labelRoot';
|
|
36
|
+
var cssLabelText = 'labelText';
|
|
37
|
+
var cssLabelIcon = 'labelIcon';
|
|
38
|
+
var cssIcon = 'icon';
|
|
30
39
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
},
|
|
50
|
-
icon: {}
|
|
40
|
+
// converted to nested rules
|
|
41
|
+
var defaultStyles = (_defaultStyles = {}, _defaultStyles[cssDialogPaper] = {
|
|
42
|
+
minWidth: '50%'
|
|
43
|
+
}, _defaultStyles[cssLabelRoot] = {
|
|
44
|
+
display: 'flex',
|
|
45
|
+
alignContent: 'center',
|
|
46
|
+
alignItems: 'center'
|
|
47
|
+
}, _defaultStyles[cssLabelText] = {
|
|
48
|
+
fontWeight: 'inherit',
|
|
49
|
+
flexGrow: 1
|
|
50
|
+
}, _defaultStyles[cssLabelIcon] = {
|
|
51
|
+
display: 'flex',
|
|
52
|
+
alignContent: 'center',
|
|
53
|
+
alignItems: 'center',
|
|
54
|
+
marginRight: '4px'
|
|
55
|
+
}, _defaultStyles[cssIcon] = {}, _defaultStyles);
|
|
56
|
+
var generateTreeViewFinderClass = function generateTreeViewFinderClass(className) {
|
|
57
|
+
return "GsiTreeViewFinder-" + className;
|
|
51
58
|
};
|
|
59
|
+
exports.generateTreeViewFinderClass = generateTreeViewFinderClass;
|
|
60
|
+
var composeClasses = (0, _styles.makeComposeClasses)(generateTreeViewFinderClass);
|
|
52
61
|
|
|
53
62
|
/**
|
|
54
63
|
* This callback type is called `onTreeBrowseCallback` and is displayed as a global symbol.
|
|
@@ -63,7 +72,7 @@ var defaultStyles = {
|
|
|
63
72
|
* It is flexible and allow controlled props to let Parent component manage
|
|
64
73
|
* data.
|
|
65
74
|
*
|
|
66
|
-
* @param {Object} classes - CSS classes, please use withStyles API from MaterialUI
|
|
75
|
+
* @param {Object} classes - Deprecated, use sx or styled instead. - Otherwise, CSS classes, please use withStyles API from MaterialUI
|
|
67
76
|
* @param {String} [title] - Title of the Dialog
|
|
68
77
|
* @param {String} [contentText] - Content text of the Dialog
|
|
69
78
|
* @param {Boolean} open - dialog state boolean handler (Controlled)
|
|
@@ -96,7 +105,8 @@ var TreeViewFinder = function TreeViewFinder(props) {
|
|
|
96
105
|
validationButtonText = props.validationButtonText,
|
|
97
106
|
onlyLeaves = props.onlyLeaves,
|
|
98
107
|
multiselect = props.multiselect,
|
|
99
|
-
sortMethod = props.sortMethod
|
|
108
|
+
sortMethod = props.sortMethod,
|
|
109
|
+
className = props.className;
|
|
100
110
|
var _useState = (0, _react.useState)({}),
|
|
101
111
|
mapPrintedNodes = _useState[0],
|
|
102
112
|
setMapPrintedNodes = _useState[1];
|
|
@@ -194,12 +204,12 @@ var TreeViewFinder = function TreeViewFinder(props) {
|
|
|
194
204
|
return nodeId === node.id;
|
|
195
205
|
})) {
|
|
196
206
|
return /*#__PURE__*/_react["default"].createElement(_Check["default"], {
|
|
197
|
-
className: classes
|
|
207
|
+
className: composeClasses(classes, cssLabelIcon)
|
|
198
208
|
});
|
|
199
209
|
} else {
|
|
200
210
|
if (node.icon) {
|
|
201
211
|
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
202
|
-
className: classes
|
|
212
|
+
className: composeClasses(classes, cssLabelIcon)
|
|
203
213
|
}, node.icon);
|
|
204
214
|
} else {
|
|
205
215
|
return null;
|
|
@@ -208,9 +218,9 @@ var TreeViewFinder = function TreeViewFinder(props) {
|
|
|
208
218
|
};
|
|
209
219
|
var renderTreeItemLabel = function renderTreeItemLabel(node) {
|
|
210
220
|
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
211
|
-
className: classes
|
|
221
|
+
className: composeClasses(classes, cssLabelRoot)
|
|
212
222
|
}, getNodeIcon(node), /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
|
|
213
|
-
className: classes
|
|
223
|
+
className: composeClasses(classes, cssLabelText)
|
|
214
224
|
}, node.name));
|
|
215
225
|
};
|
|
216
226
|
var showChevron = function showChevron(node) {
|
|
@@ -226,10 +236,10 @@ var TreeViewFinder = function TreeViewFinder(props) {
|
|
|
226
236
|
nodeId: node.id,
|
|
227
237
|
label: renderTreeItemLabel(node),
|
|
228
238
|
expandIcon: showChevron(node) ? /*#__PURE__*/_react["default"].createElement(_ChevronRight["default"], {
|
|
229
|
-
className: classes
|
|
239
|
+
className: composeClasses(classes, cssIcon)
|
|
230
240
|
}) : null,
|
|
231
241
|
collapseIcon: showChevron(node) ? /*#__PURE__*/_react["default"].createElement(_ExpandMore["default"], {
|
|
232
|
-
className: classes
|
|
242
|
+
className: composeClasses(classes, cssIcon)
|
|
233
243
|
}) : null
|
|
234
244
|
}, Array.isArray(node.children) ? node.children.length ? node.children.sort(sortMethod).map(function (child) {
|
|
235
245
|
return renderTree(child);
|
|
@@ -245,8 +255,9 @@ var TreeViewFinder = function TreeViewFinder(props) {
|
|
|
245
255
|
}
|
|
246
256
|
},
|
|
247
257
|
"aria-labelledby": "TreeViewFindertitle",
|
|
258
|
+
className: className,
|
|
248
259
|
classes: {
|
|
249
|
-
paper: classes
|
|
260
|
+
paper: composeClasses(classes, cssDialogPaper)
|
|
250
261
|
}
|
|
251
262
|
}, /*#__PURE__*/_react["default"].createElement(_DialogTitle["default"], {
|
|
252
263
|
id: "TreeViewFindertitle"
|
|
@@ -310,7 +321,7 @@ TreeViewFinder.propTypes = process.env.NODE_ENV !== "production" ? {
|
|
|
310
321
|
})).isRequired,
|
|
311
322
|
onTreeBrowse: _propTypes["default"].func,
|
|
312
323
|
//uncontrolled
|
|
313
|
-
classes: _propTypes["default"].object
|
|
324
|
+
classes: _propTypes["default"].object,
|
|
314
325
|
title: _propTypes["default"].string,
|
|
315
326
|
contentText: _propTypes["default"].string,
|
|
316
327
|
validationButtonText: _propTypes["default"].string,
|
|
@@ -327,8 +338,9 @@ TreeViewFinder.defaultProps = {
|
|
|
327
338
|
defaultExpanded: [],
|
|
328
339
|
onlyLeaves: true,
|
|
329
340
|
multiselect: false,
|
|
330
|
-
sortMethod: undefined
|
|
341
|
+
sortMethod: undefined,
|
|
342
|
+
classes: {}
|
|
331
343
|
};
|
|
332
|
-
var
|
|
333
|
-
|
|
334
|
-
|
|
344
|
+
var nestedGlobalSelectorsStyles = (0, _styles.toNestedGlobalSelectors)(defaultStyles, generateTreeViewFinderClass);
|
|
345
|
+
var _default = (0, _system.styled)(TreeViewFinder)(nestedGlobalSelectorsStyles);
|
|
346
|
+
exports["default"] = _default;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
exports.__esModule = true;
|
|
4
|
-
exports["default"] = void 0;
|
|
5
|
-
var _TreeViewFinder =
|
|
4
|
+
exports.generateTreeViewFinderClass = exports["default"] = void 0;
|
|
5
|
+
var _TreeViewFinder = _interopRequireWildcard(require("./TreeViewFinder"));
|
|
6
6
|
exports["default"] = _TreeViewFinder["default"];
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
exports.generateTreeViewFinderClass = _TreeViewFinder.generateTreeViewFinderClass;
|
|
8
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
9
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
@@ -19,7 +19,8 @@ var top_bar_en = {
|
|
|
19
19
|
'top-bar/equipmentLabel': 'Equipment label',
|
|
20
20
|
'top-bar/id': 'Id',
|
|
21
21
|
'top-bar/name': 'Name',
|
|
22
|
-
'top-bar/language': 'Language'
|
|
22
|
+
'top-bar/language': 'Language',
|
|
23
|
+
'top-bar/customTheme': 'Custom theme'
|
|
23
24
|
};
|
|
24
25
|
var _default = top_bar_en;
|
|
25
26
|
exports["default"] = _default;
|
|
@@ -19,7 +19,8 @@ var top_bar_fr = {
|
|
|
19
19
|
'top-bar/equipmentLabel': 'Label des ouvrages',
|
|
20
20
|
'top-bar/id': 'Id',
|
|
21
21
|
'top-bar/name': 'Nom',
|
|
22
|
-
'top-bar/language': 'Langue'
|
|
22
|
+
'top-bar/language': 'Langue',
|
|
23
|
+
'top-bar/customTheme': 'Choix de theme'
|
|
23
24
|
};
|
|
24
25
|
var _default = top_bar_fr;
|
|
25
26
|
exports["default"] = _default;
|
|
@@ -14,41 +14,41 @@ var TYPE_TAG_MAX_SIZE = '90px';
|
|
|
14
14
|
exports.TYPE_TAG_MAX_SIZE = TYPE_TAG_MAX_SIZE;
|
|
15
15
|
var VL_TAG_MAX_SIZE = '100px';
|
|
16
16
|
exports.VL_TAG_MAX_SIZE = VL_TAG_MAX_SIZE;
|
|
17
|
-
var equipmentStyles =
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
17
|
+
var equipmentStyles = {
|
|
18
|
+
equipmentOption: {
|
|
19
|
+
display: 'flex',
|
|
20
|
+
gap: '20px',
|
|
21
|
+
width: '100%',
|
|
22
|
+
margin: '0px',
|
|
23
|
+
padding: '0px',
|
|
24
|
+
alignItems: 'center',
|
|
25
|
+
justifyContent: 'space-between'
|
|
26
|
+
},
|
|
27
|
+
equipmentTag: function equipmentTag(theme) {
|
|
28
|
+
return {
|
|
29
29
|
borderRadius: '10px',
|
|
30
30
|
padding: '4px',
|
|
31
31
|
fontSize: 'x-small',
|
|
32
32
|
textAlign: 'center',
|
|
33
33
|
color: theme === _TopBar.LIGHT_THEME ? 'inherit' : 'black'
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
equipmentTypeTag: {
|
|
37
|
+
minWidth: TYPE_TAG_MAX_SIZE,
|
|
38
|
+
maxWidth: TYPE_TAG_MAX_SIZE,
|
|
39
|
+
background: 'lightblue'
|
|
40
|
+
},
|
|
41
|
+
equipmentVlTag: {
|
|
42
|
+
width: VL_TAG_MAX_SIZE,
|
|
43
|
+
minWidth: VL_TAG_MAX_SIZE,
|
|
44
|
+
maxWidth: VL_TAG_MAX_SIZE,
|
|
45
|
+
background: 'lightgray',
|
|
46
|
+
fontStyle: 'italic'
|
|
47
|
+
},
|
|
48
|
+
result: {
|
|
49
|
+
width: '100%',
|
|
50
|
+
padding: '2px'
|
|
51
|
+
}
|
|
52
52
|
};
|
|
53
53
|
|
|
54
54
|
// Must be equivalent as the back enum
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
exports.__esModule = true;
|
|
4
|
+
exports.toNestedGlobalSelectors = exports.mergeSx = exports.makeComposeClasses = void 0;
|
|
5
|
+
/**
|
|
6
|
+
* Copyright (c) 2023, RTE (http://www.rte-france.com)
|
|
7
|
+
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
8
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
9
|
+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
//TODO do we need to export this to clients (index.js) ?
|
|
13
|
+
|
|
14
|
+
// like mui sx(slot)/class merging but simpler with less features
|
|
15
|
+
// TODO use their system ? But it's named unstable_composeClasses so not supported?
|
|
16
|
+
var makeComposeClasses = function makeComposeClasses(generateGlobalClass) {
|
|
17
|
+
return function (classes, ruleName) {
|
|
18
|
+
return [generateGlobalClass(ruleName), classes[ruleName]].filter(function (x) {
|
|
19
|
+
return x;
|
|
20
|
+
}).join(' ');
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
exports.makeComposeClasses = makeComposeClasses;
|
|
24
|
+
var toNestedGlobalSelectors = function toNestedGlobalSelectors(styles, generateGlobalClass) {
|
|
25
|
+
return Object.fromEntries(Object.entries(styles).map(function (_ref) {
|
|
26
|
+
var k = _ref[0],
|
|
27
|
+
v = _ref[1];
|
|
28
|
+
return ["& ." + generateGlobalClass(k), v];
|
|
29
|
+
}));
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// https://mui.com/system/getting-started/the-sx-prop/#passing-the-sx-prop
|
|
33
|
+
// You cannot spread or concat directly because `SxProps` (typeof sx) can be an array. */
|
|
34
|
+
// same as [{}, ...(Array.isArray(sx) ? sx : [sx])]
|
|
35
|
+
exports.toNestedGlobalSelectors = toNestedGlobalSelectors;
|
|
36
|
+
var mergeSx = function mergeSx() {
|
|
37
|
+
for (var _len = arguments.length, allSx = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
38
|
+
allSx[_key] = arguments[_key];
|
|
39
|
+
}
|
|
40
|
+
return allSx.flat();
|
|
41
|
+
};
|
|
42
|
+
exports.mergeSx = mergeSx;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gridsuite/commons-ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.35.0",
|
|
4
4
|
"description": "common react components for gridsuite applications",
|
|
5
5
|
"engines": {
|
|
6
6
|
"npm": "<=6",
|
|
@@ -39,7 +39,6 @@
|
|
|
39
39
|
"@mui/icons-material": "^5.5.0",
|
|
40
40
|
"@mui/lab": "^5.0.0-alpha.72",
|
|
41
41
|
"@mui/material": "^5.5.0",
|
|
42
|
-
"@mui/styles": "^5.5.0",
|
|
43
42
|
"notistack": "^2.0.3",
|
|
44
43
|
"react-router-dom": "^6.0.0",
|
|
45
44
|
"react": "^18.0.0",
|