@mirrormedia/lilith-draft-editor 1.1.0-alpha.19 → 1.1.0-alpha.20
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/draft-js/buttons/image.js +3 -3
- package/lib/draft-js/buttons/selector/image-selector.js +12 -10
- package/lib/website/mirrormedia/block-renderer/image-block.js +103 -0
- package/lib/website/mirrormedia/block-renderer-fn.js +3 -2
- package/lib/website/mirrormedia/selector/image-selector.js +12 -10
- package/lib/website/readr/block-renderer/image-block.js +101 -0
- package/lib/website/readr/block-renderer-fn.js +3 -2
- package/lib/website/readr/selector/image-selector.js +12 -10
- package/package.json +2 -2
|
@@ -37,9 +37,9 @@ function ImageButton(props) {
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
const contentState = editorState.getCurrentContent();
|
|
40
|
-
const contentStateWithEntity = contentState.createEntity('image', 'IMMUTABLE', { ...
|
|
41
|
-
desc: selected
|
|
42
|
-
url: selected
|
|
40
|
+
const contentStateWithEntity = contentState.createEntity('image', 'IMMUTABLE', { ...selected.image,
|
|
41
|
+
desc: selected.desc,
|
|
42
|
+
url: selected.url,
|
|
43
43
|
alignment: align
|
|
44
44
|
});
|
|
45
45
|
const entityKey = contentStateWithEntity.getLastCreatedEntityKey();
|
|
@@ -240,6 +240,16 @@ const imagesQuery = (0, _apollo.gql)`
|
|
|
240
240
|
`;
|
|
241
241
|
|
|
242
242
|
function ImageSelector(props) {
|
|
243
|
+
const {
|
|
244
|
+
enableMultiSelect = false,
|
|
245
|
+
enableCaption = false,
|
|
246
|
+
enableUrl = false,
|
|
247
|
+
enableAlignment = false,
|
|
248
|
+
enableDelay = false,
|
|
249
|
+
onChange,
|
|
250
|
+
initialSelected = [],
|
|
251
|
+
initialAlign
|
|
252
|
+
} = props;
|
|
243
253
|
const [queryImages, {
|
|
244
254
|
loading,
|
|
245
255
|
error,
|
|
@@ -253,9 +263,9 @@ function ImageSelector(props) {
|
|
|
253
263
|
const [currentPage, setCurrentPage] = (0, _react.useState)(0); // page starts with 1, 0 is used to detect initialization
|
|
254
264
|
|
|
255
265
|
const [searchText, setSearchText] = (0, _react.useState)('');
|
|
256
|
-
const [selected, setSelected] = (0, _react.useState)(
|
|
266
|
+
const [selected, setSelected] = (0, _react.useState)(initialSelected);
|
|
257
267
|
const [delay, setDelay] = (0, _react.useState)('5');
|
|
258
|
-
const [align, setAlign] = (0, _react.useState)(
|
|
268
|
+
const [align, setAlign] = (0, _react.useState)(initialAlign);
|
|
259
269
|
const contentWrapperRef = (0, _react.useRef)();
|
|
260
270
|
const pageSize = 6;
|
|
261
271
|
const options = [{
|
|
@@ -271,14 +281,6 @@ function ImageSelector(props) {
|
|
|
271
281
|
label: 'right',
|
|
272
282
|
isDisabled: false
|
|
273
283
|
}];
|
|
274
|
-
const {
|
|
275
|
-
enableMultiSelect = false,
|
|
276
|
-
enableCaption = false,
|
|
277
|
-
enableUrl = false,
|
|
278
|
-
enableAlignment = false,
|
|
279
|
-
enableDelay = false,
|
|
280
|
-
onChange
|
|
281
|
-
} = props;
|
|
282
284
|
|
|
283
285
|
const onSave = () => {
|
|
284
286
|
let adjustedDelay = +delay;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ImageEditorBlock = ImageEditorBlock;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
|
|
10
|
+
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
11
|
+
|
|
12
|
+
var _mirrormedia = _interopRequireDefault(require("@mirrormedia/lilith-draft-renderer/lib/website/mirrormedia"));
|
|
13
|
+
|
|
14
|
+
var _imageSelector = require("../selector/image-selector");
|
|
15
|
+
|
|
16
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
+
|
|
18
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
19
|
+
|
|
20
|
+
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; }
|
|
21
|
+
|
|
22
|
+
const {
|
|
23
|
+
ImageBlock
|
|
24
|
+
} = _mirrormedia.default.blockRenderers;
|
|
25
|
+
const StyledImageBlock = (0, _styledComponents.default)(ImageBlock)``;
|
|
26
|
+
const ImageEditButton = _styledComponents.default.span`
|
|
27
|
+
cursor: pointer;
|
|
28
|
+
background-color: white;
|
|
29
|
+
padding: 6px;
|
|
30
|
+
border-radius: 6px;
|
|
31
|
+
`;
|
|
32
|
+
|
|
33
|
+
function ImageEditorBlock(props) {
|
|
34
|
+
const [toShowImageSelector, setToShowImageSelector] = (0, _react.useState)(false);
|
|
35
|
+
const {
|
|
36
|
+
block,
|
|
37
|
+
blockProps,
|
|
38
|
+
contentState
|
|
39
|
+
} = props;
|
|
40
|
+
const {
|
|
41
|
+
onEditStart,
|
|
42
|
+
onEditFinish
|
|
43
|
+
} = blockProps;
|
|
44
|
+
const entityKey = block.getEntityAt(0);
|
|
45
|
+
const entity = contentState.getEntity(entityKey);
|
|
46
|
+
const {
|
|
47
|
+
id,
|
|
48
|
+
name,
|
|
49
|
+
imageFile,
|
|
50
|
+
resized,
|
|
51
|
+
resizedWebp,
|
|
52
|
+
desc,
|
|
53
|
+
url,
|
|
54
|
+
alignment
|
|
55
|
+
} = entity.getData();
|
|
56
|
+
const imageWithMeta = {
|
|
57
|
+
image: {
|
|
58
|
+
id,
|
|
59
|
+
name,
|
|
60
|
+
imageFile,
|
|
61
|
+
resized,
|
|
62
|
+
resizedWebp
|
|
63
|
+
},
|
|
64
|
+
desc,
|
|
65
|
+
url
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const onImageSelectorChange = (params, align) => {
|
|
69
|
+
if (params.length === 0) {
|
|
70
|
+
onEditFinish({});
|
|
71
|
+
} else {
|
|
72
|
+
const imageEntity = params[0];
|
|
73
|
+
onEditFinish({
|
|
74
|
+
entityKey,
|
|
75
|
+
entityData: { ...imageEntity.image,
|
|
76
|
+
desc: imageEntity.desc,
|
|
77
|
+
url: imageEntity.url,
|
|
78
|
+
alignment: align
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
setToShowImageSelector(false);
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, toShowImageSelector && /*#__PURE__*/_react.default.createElement(_imageSelector.ImageSelector, {
|
|
87
|
+
onChange: onImageSelectorChange,
|
|
88
|
+
enableCaption: true,
|
|
89
|
+
enableUrl: true,
|
|
90
|
+
enableAlignment: true,
|
|
91
|
+
initialAlign: alignment,
|
|
92
|
+
initialSelected: [imageWithMeta]
|
|
93
|
+
}), /*#__PURE__*/_react.default.createElement(StyledImageBlock, props), /*#__PURE__*/_react.default.createElement(ImageEditButton, {
|
|
94
|
+
onClick: () => {
|
|
95
|
+
// call `onEditStart` prop as we are trying to update the BGImage entity
|
|
96
|
+
onEditStart(); // open `BGImageInput`
|
|
97
|
+
|
|
98
|
+
setToShowImageSelector(true);
|
|
99
|
+
}
|
|
100
|
+
}, /*#__PURE__*/_react.default.createElement("i", {
|
|
101
|
+
className: "fa-solid fa-pen"
|
|
102
|
+
}), /*#__PURE__*/_react.default.createElement("span", null, "Modify")));
|
|
103
|
+
}
|
|
@@ -21,13 +21,14 @@ var _embeddedCodeBlock = require("./block-renderer/embedded-code-block");
|
|
|
21
21
|
|
|
22
22
|
var _slideshowBlock = require("./block-renderer/slideshow-block");
|
|
23
23
|
|
|
24
|
+
var _imageBlock = require("./block-renderer/image-block");
|
|
25
|
+
|
|
24
26
|
var _mirrormedia = _interopRequireDefault(require("@mirrormedia/lilith-draft-renderer/lib/website/mirrormedia"));
|
|
25
27
|
|
|
26
28
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
27
29
|
|
|
28
30
|
const {
|
|
29
31
|
MediaBlock,
|
|
30
|
-
ImageBlock,
|
|
31
32
|
DividerBlock,
|
|
32
33
|
RelatedPostBlock,
|
|
33
34
|
VideoBlock,
|
|
@@ -49,7 +50,7 @@ const AtomicBlock = props => {
|
|
|
49
50
|
|
|
50
51
|
case 'image':
|
|
51
52
|
{
|
|
52
|
-
return
|
|
53
|
+
return (0, _imageBlock.ImageEditorBlock)(props);
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
case 'slideshow':
|
|
@@ -250,6 +250,16 @@ function DelayInput(props) {
|
|
|
250
250
|
}
|
|
251
251
|
|
|
252
252
|
function ImageSelector(props) {
|
|
253
|
+
const {
|
|
254
|
+
enableMultiSelect = false,
|
|
255
|
+
enableCaption = false,
|
|
256
|
+
enableUrl = false,
|
|
257
|
+
enableAlignment = false,
|
|
258
|
+
enableDelay = false,
|
|
259
|
+
onChange,
|
|
260
|
+
initialSelected = [],
|
|
261
|
+
initialAlign
|
|
262
|
+
} = props;
|
|
253
263
|
const [queryImages, {
|
|
254
264
|
loading,
|
|
255
265
|
error,
|
|
@@ -263,9 +273,9 @@ function ImageSelector(props) {
|
|
|
263
273
|
const [currentPage, setCurrentPage] = (0, _react.useState)(0); // page starts with 1, 0 is used to detect initialization
|
|
264
274
|
|
|
265
275
|
const [searchText, setSearchText] = (0, _react.useState)('');
|
|
266
|
-
const [selected, setSelected] = (0, _react.useState)(
|
|
276
|
+
const [selected, setSelected] = (0, _react.useState)(initialSelected);
|
|
267
277
|
const [delay, setDelay] = (0, _react.useState)('5');
|
|
268
|
-
const [align, setAlign] = (0, _react.useState)(
|
|
278
|
+
const [align, setAlign] = (0, _react.useState)(initialAlign);
|
|
269
279
|
const contentWrapperRef = (0, _react.useRef)();
|
|
270
280
|
const pageSize = 6;
|
|
271
281
|
const options = [{
|
|
@@ -281,14 +291,6 @@ function ImageSelector(props) {
|
|
|
281
291
|
label: 'right',
|
|
282
292
|
isDisabled: false
|
|
283
293
|
}];
|
|
284
|
-
const {
|
|
285
|
-
enableMultiSelect = false,
|
|
286
|
-
enableCaption = false,
|
|
287
|
-
enableUrl = false,
|
|
288
|
-
enableAlignment = false,
|
|
289
|
-
enableDelay = false,
|
|
290
|
-
onChange
|
|
291
|
-
} = props;
|
|
292
294
|
|
|
293
295
|
const onSave = () => {
|
|
294
296
|
let adjustedDelay = +delay;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ImageEditorBlock = ImageEditorBlock;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
|
|
10
|
+
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
11
|
+
|
|
12
|
+
var _readr = _interopRequireDefault(require("@mirrormedia/lilith-draft-renderer/lib/website/readr"));
|
|
13
|
+
|
|
14
|
+
var _imageSelector = require("../selector/image-selector");
|
|
15
|
+
|
|
16
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
+
|
|
18
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
19
|
+
|
|
20
|
+
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; }
|
|
21
|
+
|
|
22
|
+
const {
|
|
23
|
+
ImageBlock
|
|
24
|
+
} = _readr.default.blockRenderers;
|
|
25
|
+
const StyledImageBlock = (0, _styledComponents.default)(ImageBlock)``;
|
|
26
|
+
const ImageEditButton = _styledComponents.default.span`
|
|
27
|
+
cursor: pointer;
|
|
28
|
+
background-color: white;
|
|
29
|
+
padding: 6px;
|
|
30
|
+
border-radius: 6px;
|
|
31
|
+
`;
|
|
32
|
+
|
|
33
|
+
function ImageEditorBlock(props) {
|
|
34
|
+
const [toShowImageSelector, setToShowImageSelector] = (0, _react.useState)(false);
|
|
35
|
+
const {
|
|
36
|
+
block,
|
|
37
|
+
blockProps,
|
|
38
|
+
contentState
|
|
39
|
+
} = props;
|
|
40
|
+
const {
|
|
41
|
+
onEditStart,
|
|
42
|
+
onEditFinish
|
|
43
|
+
} = blockProps;
|
|
44
|
+
const entityKey = block.getEntityAt(0);
|
|
45
|
+
const entity = contentState.getEntity(entityKey);
|
|
46
|
+
const {
|
|
47
|
+
id,
|
|
48
|
+
name,
|
|
49
|
+
imageFile,
|
|
50
|
+
resized,
|
|
51
|
+
desc,
|
|
52
|
+
url,
|
|
53
|
+
alignment
|
|
54
|
+
} = entity.getData();
|
|
55
|
+
const imageWithMeta = {
|
|
56
|
+
image: {
|
|
57
|
+
id,
|
|
58
|
+
name,
|
|
59
|
+
imageFile,
|
|
60
|
+
resized
|
|
61
|
+
},
|
|
62
|
+
desc,
|
|
63
|
+
url
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
const onImageSelectorChange = (params, align) => {
|
|
67
|
+
if (params.length === 0) {
|
|
68
|
+
onEditFinish({});
|
|
69
|
+
} else {
|
|
70
|
+
const imageEntity = params[0];
|
|
71
|
+
onEditFinish({
|
|
72
|
+
entityKey,
|
|
73
|
+
entityData: { ...imageEntity.image,
|
|
74
|
+
desc: imageEntity.desc,
|
|
75
|
+
url: imageEntity.url,
|
|
76
|
+
alignment: align
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
setToShowImageSelector(false);
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, toShowImageSelector && /*#__PURE__*/_react.default.createElement(_imageSelector.ImageSelector, {
|
|
85
|
+
onChange: onImageSelectorChange,
|
|
86
|
+
enableCaption: true,
|
|
87
|
+
enableUrl: true,
|
|
88
|
+
enableAlignment: true,
|
|
89
|
+
initialAlign: alignment,
|
|
90
|
+
initialSelected: [imageWithMeta]
|
|
91
|
+
}), /*#__PURE__*/_react.default.createElement(StyledImageBlock, props), /*#__PURE__*/_react.default.createElement(ImageEditButton, {
|
|
92
|
+
onClick: () => {
|
|
93
|
+
// call `onEditStart` prop as we are trying to update the BGImage entity
|
|
94
|
+
onEditStart(); // open `BGImageInput`
|
|
95
|
+
|
|
96
|
+
setToShowImageSelector(true);
|
|
97
|
+
}
|
|
98
|
+
}, /*#__PURE__*/_react.default.createElement("i", {
|
|
99
|
+
className: "fa-solid fa-pen"
|
|
100
|
+
}), /*#__PURE__*/_react.default.createElement("span", null, "Modify")));
|
|
101
|
+
}
|
|
@@ -17,6 +17,8 @@ var _backgroundVideoBlock = require("./block-renderer/background-video-block");
|
|
|
17
17
|
|
|
18
18
|
var _sideIndexBlock = require("./block-renderer/side-index-block");
|
|
19
19
|
|
|
20
|
+
var _imageBlock = require("./block-renderer/image-block");
|
|
21
|
+
|
|
20
22
|
var _readr = _interopRequireDefault(require("@mirrormedia/lilith-draft-renderer/lib/website/readr"));
|
|
21
23
|
|
|
22
24
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
@@ -24,7 +26,6 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
24
26
|
const {
|
|
25
27
|
EmbeddedCodeBlock,
|
|
26
28
|
MediaBlock,
|
|
27
|
-
ImageBlock,
|
|
28
29
|
SlideshowBlock,
|
|
29
30
|
SlideshowBlockV2,
|
|
30
31
|
DividerBlock,
|
|
@@ -47,7 +48,7 @@ const AtomicBlock = props => {
|
|
|
47
48
|
|
|
48
49
|
case 'image':
|
|
49
50
|
{
|
|
50
|
-
return
|
|
51
|
+
return (0, _imageBlock.ImageEditorBlock)(props);
|
|
51
52
|
}
|
|
52
53
|
|
|
53
54
|
case 'slideshow':
|
|
@@ -242,6 +242,16 @@ function DelayInput(props) {
|
|
|
242
242
|
}
|
|
243
243
|
|
|
244
244
|
function ImageSelector(props) {
|
|
245
|
+
const {
|
|
246
|
+
enableMultiSelect = false,
|
|
247
|
+
enableCaption = false,
|
|
248
|
+
enableUrl = false,
|
|
249
|
+
enableAlignment = false,
|
|
250
|
+
enableDelay = false,
|
|
251
|
+
onChange,
|
|
252
|
+
initialSelected = [],
|
|
253
|
+
initialAlign
|
|
254
|
+
} = props;
|
|
245
255
|
const [queryImages, {
|
|
246
256
|
loading,
|
|
247
257
|
error,
|
|
@@ -255,9 +265,9 @@ function ImageSelector(props) {
|
|
|
255
265
|
const [currentPage, setCurrentPage] = (0, _react.useState)(0); // page starts with 1, 0 is used to detect initialization
|
|
256
266
|
|
|
257
267
|
const [searchText, setSearchText] = (0, _react.useState)('');
|
|
258
|
-
const [selected, setSelected] = (0, _react.useState)(
|
|
268
|
+
const [selected, setSelected] = (0, _react.useState)(initialSelected);
|
|
259
269
|
const [delay, setDelay] = (0, _react.useState)('5');
|
|
260
|
-
const [align, setAlign] = (0, _react.useState)(
|
|
270
|
+
const [align, setAlign] = (0, _react.useState)(initialAlign);
|
|
261
271
|
const contentWrapperRef = (0, _react.useRef)();
|
|
262
272
|
const pageSize = 6;
|
|
263
273
|
const options = [{
|
|
@@ -273,14 +283,6 @@ function ImageSelector(props) {
|
|
|
273
283
|
label: 'right',
|
|
274
284
|
isDisabled: false
|
|
275
285
|
}];
|
|
276
|
-
const {
|
|
277
|
-
enableMultiSelect = false,
|
|
278
|
-
enableCaption = false,
|
|
279
|
-
enableUrl = false,
|
|
280
|
-
enableAlignment = false,
|
|
281
|
-
enableDelay = false,
|
|
282
|
-
onChange
|
|
283
|
-
} = props;
|
|
284
286
|
|
|
285
287
|
const onSave = () => {
|
|
286
288
|
let adjustedDelay = +delay;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mirrormedia/lilith-draft-editor",
|
|
3
|
-
"version": "1.1.0-alpha.
|
|
3
|
+
"version": "1.1.0-alpha.20",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"license": "MIT",
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"draft-js": "^0.11.7",
|
|
26
|
-
"@mirrormedia/lilith-draft-renderer": "1.3.0-alpha.
|
|
26
|
+
"@mirrormedia/lilith-draft-renderer": "1.3.0-alpha.3"
|
|
27
27
|
},
|
|
28
28
|
"peerDependencies": {
|
|
29
29
|
"react": "18.2.0",
|