@mirrormedia/lilith-draft-editor 1.1.0-alpha.2 → 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.
@@ -37,9 +37,9 @@ function ImageButton(props) {
37
37
  }
38
38
 
39
39
  const contentState = editorState.getCurrentContent();
40
- const contentStateWithEntity = contentState.createEntity('image', 'IMMUTABLE', { ...(selected === null || selected === void 0 ? void 0 : selected.image),
41
- desc: selected === null || selected === void 0 ? void 0 : selected.desc,
42
- url: selected === null || selected === void 0 ? void 0 : selected.url,
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();
@@ -94,7 +94,6 @@ function AudioGrid(props) {
94
94
  onSelect,
95
95
  isSelected
96
96
  } = props;
97
- console.log('audio', audio);
98
97
  return /*#__PURE__*/_react.default.createElement(AudioGridWrapper, {
99
98
  key: audio === null || audio === void 0 ? void 0 : audio.id,
100
99
  onClick: () => onSelect(audio)
@@ -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)(undefined);
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,147 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.YoutubeButton = YoutubeButton;
7
+ exports.YoutubeInput = YoutubeInput;
8
+
9
+ var _react = _interopRequireWildcard(require("react"));
10
+
11
+ var _draftJs = require("draft-js");
12
+
13
+ var _modals = require("@keystone-ui/modals");
14
+
15
+ var _fields = require("@keystone-ui/fields");
16
+
17
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
18
+
19
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20
+
21
+ 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); }
22
+
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; }
24
+
25
+ const Label = _styledComponents.default.label`
26
+ display: block;
27
+ font-weight: 600;
28
+ margin: 10px 0;
29
+ `;
30
+
31
+ function YoutubeInput(props) {
32
+ const {
33
+ isOpen,
34
+ onChange,
35
+ onCancel
36
+ } = props;
37
+ const initialInputValue = {
38
+ description: '',
39
+ youtubeId: ''
40
+ };
41
+ const [inputValue, setInputValue] = (0, _react.useState)(initialInputValue);
42
+
43
+ const clearInputValue = () => {
44
+ setInputValue(initialInputValue);
45
+ };
46
+
47
+ return /*#__PURE__*/_react.default.createElement(_modals.DrawerController, {
48
+ isOpen: isOpen
49
+ }, /*#__PURE__*/_react.default.createElement(_modals.Drawer, {
50
+ title: `Insert Youtube video`,
51
+ actions: {
52
+ cancel: {
53
+ label: 'Cancel',
54
+ action: () => {
55
+ clearInputValue();
56
+ onCancel();
57
+ }
58
+ },
59
+ confirm: {
60
+ label: 'Confirm',
61
+ action: () => {
62
+ onChange({
63
+ description: inputValue.description,
64
+ youtubeId: inputValue.youtubeId
65
+ });
66
+ clearInputValue();
67
+ }
68
+ }
69
+ }
70
+ }, /*#__PURE__*/_react.default.createElement(Label, {
71
+ htmlFor: "description"
72
+ }, "Youtube Description"), /*#__PURE__*/_react.default.createElement(_fields.TextInput, {
73
+ onChange: e => setInputValue({
74
+ description: e.target.value,
75
+ youtubeId: inputValue.youtubeId
76
+ }),
77
+ type: "text",
78
+ placeholder: "description",
79
+ id: "description",
80
+ value: inputValue.description
81
+ }), /*#__PURE__*/_react.default.createElement(Label, {
82
+ htmlFor: "youtubeId"
83
+ }, "Youtube Videi Id"), /*#__PURE__*/_react.default.createElement(_fields.TextInput, {
84
+ onChange: e => setInputValue({
85
+ description: inputValue.description,
86
+ youtubeId: e.target.value
87
+ }),
88
+ type: "text",
89
+ placeholder: "youtubeId",
90
+ id: "youtubeId",
91
+ value: inputValue.youtubeId
92
+ })));
93
+ }
94
+
95
+ function YoutubeButton(props) {
96
+ const [toShowInput, setToShowInput] = (0, _react.useState)(false);
97
+ const {
98
+ className,
99
+ editorState,
100
+ onChange: onEditorStateChange
101
+ } = props;
102
+
103
+ const onChange = ({
104
+ description,
105
+ youtubeId
106
+ }) => {
107
+ const contentState = editorState.getCurrentContent(); // create an InfoBox entity
108
+
109
+ const contentStateWithEntity = contentState.createEntity('YOUTUBE', 'IMMUTABLE', {
110
+ description,
111
+ youtubeId
112
+ });
113
+ const entityKey = contentStateWithEntity.getLastCreatedEntityKey();
114
+
115
+ const newEditorState = _draftJs.EditorState.set(editorState, {
116
+ currentContent: contentStateWithEntity
117
+ }); //The third parameter here is a space string, not an empty string
118
+ //If you set an empty string, you will get an error: Unknown DraftEntity key: null
119
+
120
+
121
+ onEditorStateChange(_draftJs.AtomicBlockUtils.insertAtomicBlock(newEditorState, entityKey, ' '));
122
+ setToShowInput(false);
123
+ };
124
+
125
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(YoutubeInput, {
126
+ onChange: onChange,
127
+ onCancel: () => {
128
+ setToShowInput(false);
129
+ },
130
+ isOpen: toShowInput
131
+ }), /*#__PURE__*/_react.default.createElement("div", {
132
+ className: className,
133
+ onClick: () => {
134
+ setToShowInput(true);
135
+ }
136
+ }, /*#__PURE__*/_react.default.createElement("svg", {
137
+ height: "16px",
138
+ width: "14px",
139
+ version: "1.1",
140
+ id: "Layer_1",
141
+ xmlns: "http://www.w3.org/2000/svg",
142
+ viewBox: "0 0 461.001 461.001"
143
+ }, /*#__PURE__*/_react.default.createElement("path", {
144
+ fill: "#6b7280",
145
+ d: "M365.257,67.393H95.744C42.866,67.393,0,110.259,0,163.137v134.728 c0,52.878,42.866,95.744,95.744,95.744h269.513c52.878,0,95.744-42.866,95.744-95.744V163.137 C461.001,110.259,418.135,67.393,365.257,67.393z M300.506,237.056l-126.06,60.123c-3.359,1.602-7.239-0.847-7.239-4.568V168.607 c0-3.774,3.982-6.22,7.348-4.514l126.06,63.881C304.363,229.873,304.298,235.248,300.506,237.056z"
146
+ })), /*#__PURE__*/_react.default.createElement("span", null, "Youtube")));
147
+ }
@@ -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,17 +21,19 @@ 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,
34
- AudioBlock
35
+ AudioBlock,
36
+ YoutubeBlock
35
37
  } = _mirrormedia.default.blockRenderers;
36
38
 
37
39
  const AtomicBlock = props => {
@@ -48,7 +50,7 @@ const AtomicBlock = props => {
48
50
 
49
51
  case 'image':
50
52
  {
51
- return ImageBlock(entity);
53
+ return (0, _imageBlock.ImageEditorBlock)(props);
52
54
  }
53
55
 
54
56
  case 'slideshow':
@@ -115,6 +117,11 @@ const AtomicBlock = props => {
115
117
  {
116
118
  return AudioBlock(entity);
117
119
  }
120
+
121
+ case 'YOUTUBE':
122
+ {
123
+ return YoutubeBlock(entity);
124
+ }
118
125
  }
119
126
 
120
127
  return null;
@@ -9,6 +9,8 @@ var _react = _interopRequireDefault(require("react"));
9
9
 
10
10
  var _styledComponents = _interopRequireWildcard(require("styled-components"));
11
11
 
12
+ var _theme = _interopRequireDefault(require("./theme"));
13
+
12
14
  var _draftJs = require("draft-js");
13
15
 
14
16
  var _blockRendererFn = require("./block-renderer-fn");
@@ -53,6 +55,8 @@ var _video = require("../../draft-js/buttons/video");
53
55
 
54
56
  var _audio = require("../../draft-js/buttons/audio");
55
57
 
58
+ var _youtube = require("../../draft-js/buttons/youtube");
59
+
56
60
  var _const = require("../../draft-js/const");
57
61
 
58
62
  var _imageSelector = require("./selector/image-selector");
@@ -103,10 +107,11 @@ const buttonNames = {
103
107
  relatedPost: 'related-post',
104
108
  sideIndex: 'side-index',
105
109
  video: 'video',
106
- audio: 'audio'
110
+ audio: 'audio',
111
+ youtube: 'youtube'
107
112
  };
108
113
  exports.buttonNames = buttonNames;
109
- const disabledButtonsOnBasicEditor = [buttonNames.annotation, buttonNames.divider, buttonNames.embed, buttonNames.image, buttonNames.infoBox, buttonNames.slideshow, buttonNames.table, buttonNames.textAlign, buttonNames.colorBox, buttonNames.backgroundColor, buttonNames.backgroundImage, buttonNames.backgroundVideo, buttonNames.relatedPost, buttonNames.sideIndex, buttonNames.video, buttonNames.audio];
114
+ const disabledButtonsOnBasicEditor = [buttonNames.annotation, buttonNames.divider, buttonNames.embed, buttonNames.image, buttonNames.infoBox, buttonNames.slideshow, buttonNames.table, buttonNames.textAlign, buttonNames.colorBox, buttonNames.backgroundColor, buttonNames.backgroundImage, buttonNames.backgroundVideo, buttonNames.relatedPost, buttonNames.sideIndex, buttonNames.video, buttonNames.audio, buttonNames.youtube];
110
115
  const buttonStyle = (0, _styledComponents.css)`
111
116
  border-radius: 6px;
112
117
  text-align: center;
@@ -248,6 +253,7 @@ const CustomAlignCenterButton = createButtonWithoutProps(_textAlign.AlignCenterB
248
253
  const CustomAlignLeftButton = createButtonWithoutProps(_textAlign.AlignLeftButton, true);
249
254
  const CustomVideoButton = createButtonWithoutProps(_video.VideoButton);
250
255
  const CustomAudioButton = createButtonWithoutProps(_audio.AudioButton);
256
+ const CustomYoutubeButton = createButtonWithoutProps(_youtube.YoutubeButton);
251
257
  const DraftEditorWrapper = _styledComponents.default.div`
252
258
  /* Rich-editor default setting (.RichEditor-root)*/
253
259
  background: #fff;
@@ -265,11 +271,16 @@ const DraftEditorWrapper = _styledComponents.default.div`
265
271
  background: rgb(255, 255, 255);
266
272
  border-radius: 6px;
267
273
  padding: 0 1rem 1rem;
268
-
274
+ font-size: 18px;
275
+ line-height: 2;
269
276
  /* Draft built-in buttons' style */
270
277
  .public-DraftStyleDefault-header-two {
278
+ font-size: 36px;
279
+ line-height: 1.5;
271
280
  }
272
281
  .public-DraftStyleDefault-header-three {
282
+ font-size: 30px;
283
+ line-height: 1.5;
273
284
  }
274
285
  .public-DraftStyleDefault-header-four {
275
286
  }
@@ -632,7 +643,9 @@ class RichTextEditor extends _react.default.Component {
632
643
  }));
633
644
  };
634
645
 
635
- return /*#__PURE__*/_react.default.createElement(DraftEditorContainer, {
646
+ return /*#__PURE__*/_react.default.createElement(_styledComponents.ThemeProvider, {
647
+ theme: _theme.default
648
+ }, /*#__PURE__*/_react.default.createElement(DraftEditorContainer, {
636
649
  isEnlarged: isEnlarged
637
650
  }, /*#__PURE__*/_react.default.createElement(DraftEditorWrapper, null, /*#__PURE__*/_react.default.createElement("link", {
638
651
  href: "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css",
@@ -699,6 +712,11 @@ class RichTextEditor extends _react.default.Component {
699
712
  onChange: this.onChange,
700
713
  readOnly: this.state.readOnly,
701
714
  VideoSelector: _videoSelector.VideoSelector
715
+ })), /*#__PURE__*/_react.default.createElement(ButtonGroup, null, /*#__PURE__*/_react.default.createElement(CustomYoutubeButton, {
716
+ isDisabled: disabledButtons.includes(buttonNames.youtube),
717
+ editorState: editorState,
718
+ onChange: this.onChange,
719
+ readOnly: this.state.readOnly
702
720
  })), /*#__PURE__*/_react.default.createElement(ButtonGroup, null, /*#__PURE__*/_react.default.createElement(CustomAudioButton, {
703
721
  isDisabled: disabledButtons.includes(buttonNames.audio),
704
722
  editorState: editorState,
@@ -801,7 +819,7 @@ class RichTextEditor extends _react.default.Component {
801
819
  ref: "editor",
802
820
  spellCheck: true,
803
821
  readOnly: readOnly
804
- }))));
822
+ })))));
805
823
  }
806
824
 
807
825
  }
@@ -11,10 +11,17 @@ var _mirrormedia = _interopRequireDefault(require("@mirrormedia/lilith-draft-ren
11
11
 
12
12
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
13
 
14
+ //Because `annotationDecorator` and `linkDecorator` is generated by different `contentLayout`,
15
+ //so it is needed to generate decorators by using function `decoratorsGenerator`.
14
16
  const {
15
17
  annotationDecorator,
16
18
  linkDecorator
17
19
  } = _mirrormedia.default.entityDecorators;
18
- const decorators = new _draftJs.CompositeDecorator([annotationDecorator, linkDecorator]);
20
+
21
+ const decoratorsGenerator = (contentLayout = 'normal') => {
22
+ return new _draftJs.CompositeDecorator([annotationDecorator(contentLayout), linkDecorator(contentLayout)]);
23
+ };
24
+
25
+ const decorators = decoratorsGenerator('normal');
19
26
  var _default = decorators;
20
27
  exports.default = _default;
@@ -94,7 +94,6 @@ function AudioGrid(props) {
94
94
  onSelect,
95
95
  isSelected
96
96
  } = props;
97
- console.log('audio', audio);
98
97
  return /*#__PURE__*/_react.default.createElement(AudioGridWrapper, {
99
98
  key: audio === null || audio === void 0 ? void 0 : audio.id,
100
99
  onClick: () => onSelect(audio)
@@ -50,6 +50,14 @@ const imagesQuery = (0, _apollo.gql)`
50
50
  w1600
51
51
  w2400
52
52
  }
53
+ resizedWebp {
54
+ original
55
+ w480
56
+ w800
57
+ w1200
58
+ w1600
59
+ w2400
60
+ }
53
61
  }
54
62
  }
55
63
  `;
@@ -242,6 +250,16 @@ function DelayInput(props) {
242
250
  }
243
251
 
244
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;
245
263
  const [queryImages, {
246
264
  loading,
247
265
  error,
@@ -255,9 +273,9 @@ function ImageSelector(props) {
255
273
  const [currentPage, setCurrentPage] = (0, _react.useState)(0); // page starts with 1, 0 is used to detect initialization
256
274
 
257
275
  const [searchText, setSearchText] = (0, _react.useState)('');
258
- const [selected, setSelected] = (0, _react.useState)([]);
276
+ const [selected, setSelected] = (0, _react.useState)(initialSelected);
259
277
  const [delay, setDelay] = (0, _react.useState)('5');
260
- const [align, setAlign] = (0, _react.useState)(undefined);
278
+ const [align, setAlign] = (0, _react.useState)(initialAlign);
261
279
  const contentWrapperRef = (0, _react.useRef)();
262
280
  const pageSize = 6;
263
281
  const options = [{
@@ -273,14 +291,6 @@ function ImageSelector(props) {
273
291
  label: 'right',
274
292
  isDisabled: false
275
293
  }];
276
- const {
277
- enableMultiSelect = false,
278
- enableCaption = false,
279
- enableUrl = false,
280
- enableAlignment = false,
281
- enableDelay = false,
282
- onChange
283
- } = props;
284
294
 
285
295
  const onSave = () => {
286
296
  let adjustedDelay = +delay;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.theme = exports.mediaSize = exports.default = void 0;
7
+ const mediaSize = {
8
+ xs: 0,
9
+ sm: 576,
10
+ md: 768,
11
+ lg: 960,
12
+ xl: 1200,
13
+ xxl: 1400
14
+ };
15
+ exports.mediaSize = mediaSize;
16
+ const theme = {
17
+ breakpoint: {
18
+ xs: `@media (min-width: ${mediaSize.xs}px)`,
19
+ sm: `@media (min-width: ${mediaSize.sm}px)`,
20
+ md: `@media (min-width: ${mediaSize.md}px)`,
21
+ lg: `@media (min-width: ${mediaSize.lg}px)`,
22
+ xl: `@media (min-width: ${mediaSize.xl}px)`,
23
+ xxl: `@media (min-width: ${mediaSize.xxl}px)`
24
+ }
25
+ };
26
+ exports.theme = theme;
27
+ var _default = theme;
28
+ exports.default = _default;
@@ -3,6 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.BGImageBlock = BGImageBlock;
6
7
  exports.BGImageEditorBlock = BGImageEditorBlock;
7
8
 
8
9
  var _react = _interopRequireWildcard(require("react"));
@@ -13,17 +14,64 @@ var _draftConverter = _interopRequireDefault(require("../../../draft-js/draft-co
13
14
 
14
15
  var _backgroundImage = require("../../../draft-js/buttons/background-image");
15
16
 
16
- var _readr = _interopRequireDefault(require("@mirrormedia/lilith-draft-renderer/lib/website/readr"));
17
-
18
17
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
18
 
20
19
  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); }
21
20
 
22
21
  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; }
23
22
 
24
- const {
25
- BGImageBlock
26
- } = _readr.default.blockRenderers;
23
+ const BGImageRenderWrapper = _styledComponents.default.div`
24
+ padding: 30px;
25
+ position: relative;
26
+ width: 100%;
27
+ height: 100%;
28
+ background-image: url(${({
29
+ image
30
+ }) => image});
31
+ background-size: cover;
32
+ background-position: center center;
33
+ ${({
34
+ textBlockAlign
35
+ }) => {
36
+ if (textBlockAlign === 'left') {
37
+ return `padding-right: 50%;`;
38
+ } else if (textBlockAlign === 'right') {
39
+ return `padding-left: 50%;`;
40
+ } else if (textBlockAlign === 'bottom') {
41
+ return `padding-top: 50%;`;
42
+ }
43
+ }}
44
+ `;
45
+ const BGImageRenderBody = _styledComponents.default.div`
46
+ background: rgba(0, 0, 0, 0.5);
47
+ padding: 4px 20px;
48
+ margin-bottom: 10px;
49
+ `;
50
+
51
+ function BGImageBlock(props) {
52
+ var _image$imageFile, _image$resized, _image$resized2;
53
+
54
+ const {
55
+ block,
56
+ contentState
57
+ } = props;
58
+ const entityKey = block.getEntityAt(0);
59
+ const entity = contentState.getEntity(entityKey);
60
+ const {
61
+ textBlockAlign,
62
+ image,
63
+ body
64
+ } = entity.getData();
65
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(BGImageRenderWrapper, {
66
+ image: (image === null || image === void 0 ? void 0 : (_image$imageFile = image.imageFile) === null || _image$imageFile === void 0 ? void 0 : _image$imageFile.url) || (image === null || image === void 0 ? void 0 : (_image$resized = image.resized) === null || _image$resized === void 0 ? void 0 : _image$resized.w800) || (image === null || image === void 0 ? void 0 : (_image$resized2 = image.resized) === null || _image$resized2 === void 0 ? void 0 : _image$resized2.original),
67
+ textBlockAlign: textBlockAlign
68
+ }, /*#__PURE__*/_react.default.createElement(BGImageRenderBody, {
69
+ dangerouslySetInnerHTML: {
70
+ __html: body
71
+ }
72
+ })));
73
+ }
74
+
27
75
  const BGImageRenderButton = _styledComponents.default.span`
28
76
  cursor: pointer;
29
77
  background-color: white;
@@ -3,6 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.BGVideoBlock = BGVideoBlock;
6
7
  exports.BGVideoEditorBlock = BGVideoEditorBlock;
7
8
 
8
9
  var _react = _interopRequireWildcard(require("react"));
@@ -13,17 +14,74 @@ var _draftConverter = _interopRequireDefault(require("../../../draft-js/draft-co
13
14
 
14
15
  var _backgroundVideo = require("../../../draft-js/buttons/background-video");
15
16
 
16
- var _readr = _interopRequireDefault(require("@mirrormedia/lilith-draft-renderer/lib/website/readr"));
17
-
18
17
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
18
 
20
19
  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); }
21
20
 
22
21
  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; }
23
22
 
24
- const {
25
- BGVideoBlock
26
- } = _readr.default.blockRenderers;
23
+ const BGVideoRenderWrapper = _styledComponents.default.div`
24
+ position: relative;
25
+ padding: 30px;
26
+ width: 100%;
27
+ ${({
28
+ textBlockAlign
29
+ }) => {
30
+ if (textBlockAlign === 'left') {
31
+ return `padding-right: 50%;`;
32
+ } else if (textBlockAlign === 'right') {
33
+ return `padding-left: 50%;`;
34
+ } else if (textBlockAlign === 'bottom') {
35
+ return `padding-top: 50%;`;
36
+ }
37
+ }}
38
+ `;
39
+ const BGVideoRednerVideo = _styledComponents.default.video`
40
+ position: absolute;
41
+ width: 100%;
42
+ height: 100%;
43
+ top: 0;
44
+ left: 0;
45
+ z-index: -1;
46
+ background-color: black;
47
+ `;
48
+ const BGVideoRenderBody = _styledComponents.default.div`
49
+ background: rgba(0, 0, 0, 0.5);
50
+ padding: 4px 20px;
51
+ margin-bottom: 10px;
52
+ `;
53
+
54
+ function BGVideoBlock(props) {
55
+ var _video$file;
56
+
57
+ const {
58
+ block,
59
+ contentState
60
+ } = props;
61
+ const entityKey = block.getEntityAt(0);
62
+ const entity = contentState.getEntity(entityKey);
63
+ const {
64
+ textBlockAlign,
65
+ video,
66
+ body
67
+ } = entity.getData();
68
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(BGVideoRenderWrapper, {
69
+ textBlockAlign: textBlockAlign
70
+ }, /*#__PURE__*/_react.default.createElement(BGVideoRednerVideo, {
71
+ muted: true,
72
+ autoPlay: true,
73
+ loop: true
74
+ }, /*#__PURE__*/_react.default.createElement("source", {
75
+ src: video === null || video === void 0 ? void 0 : video.url
76
+ }), /*#__PURE__*/_react.default.createElement("source", {
77
+ src: video === null || video === void 0 ? void 0 : (_video$file = video.file) === null || _video$file === void 0 ? void 0 : _video$file.url
78
+ })), /*#__PURE__*/_react.default.createElement(BGVideoRenderBody, {
79
+ dangerouslySetInnerHTML: {
80
+ __html: body
81
+ }
82
+ })));
83
+ }
84
+
27
85
  const BGVideoRenderButton = _styledComponents.default.span`
28
86
  cursor: pointer;
29
87
  background-color: white;
@@ -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 ImageBlock(entity);
51
+ return (0, _imageBlock.ImageEditorBlock)(props);
51
52
  }
52
53
 
53
54
  case 'slideshow':
@@ -109,6 +110,11 @@ const AtomicBlock = props => {
109
110
  {
110
111
  return VideoBlock(entity);
111
112
  }
113
+
114
+ case 'AUDIO':
115
+ {
116
+ return AudioBlock(entity);
117
+ }
112
118
  }
113
119
 
114
120
  return null;
@@ -9,6 +9,8 @@ var _react = _interopRequireDefault(require("react"));
9
9
 
10
10
  var _styledComponents = _interopRequireWildcard(require("styled-components"));
11
11
 
12
+ var _theme = _interopRequireDefault(require("./theme"));
13
+
12
14
  var _draftJs = require("draft-js");
13
15
 
14
16
  var _blockRendererFn = require("./block-renderer-fn");
@@ -632,7 +634,9 @@ class RichTextEditor extends _react.default.Component {
632
634
  }));
633
635
  };
634
636
 
635
- return /*#__PURE__*/_react.default.createElement(DraftEditorContainer, {
637
+ return /*#__PURE__*/_react.default.createElement(_styledComponents.ThemeProvider, {
638
+ theme: _theme.default
639
+ }, /*#__PURE__*/_react.default.createElement(DraftEditorContainer, {
636
640
  isEnlarged: isEnlarged
637
641
  }, /*#__PURE__*/_react.default.createElement(DraftEditorWrapper, null, /*#__PURE__*/_react.default.createElement("link", {
638
642
  href: "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css",
@@ -801,7 +805,7 @@ class RichTextEditor extends _react.default.Component {
801
805
  ref: "editor",
802
806
  spellCheck: true,
803
807
  readOnly: readOnly
804
- }))));
808
+ })))));
805
809
  }
806
810
 
807
811
  }
@@ -94,7 +94,6 @@ function AudioGrid(props) {
94
94
  onSelect,
95
95
  isSelected
96
96
  } = props;
97
- console.log('audio', audio);
98
97
  return /*#__PURE__*/_react.default.createElement(AudioGridWrapper, {
99
98
  key: audio === null || audio === void 0 ? void 0 : audio.id,
100
99
  onClick: () => onSelect(audio)
@@ -155,18 +154,6 @@ const AudiosQuery = (0, _apollo.gql)`
155
154
  file {
156
155
  url
157
156
  }
158
- heroImage {
159
- imageFile {
160
- url
161
- }
162
- resized {
163
- w480
164
- w800
165
- w1200
166
- w1600
167
- w2400
168
- }
169
- }
170
157
  }
171
158
  }
172
159
  `;
@@ -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)(undefined);
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;
@@ -206,8 +206,7 @@ function PostSelector(props) {
206
206
  const {
207
207
  onChange,
208
208
  enableMultiSelect = false,
209
- minSelectCount = 1,
210
- maxSelectCount = 3
209
+ minSelectCount = 1
211
210
  } = props;
212
211
 
213
212
  const onSave = () => {
@@ -242,15 +241,9 @@ function PostSelector(props) {
242
241
 
243
242
 
244
243
  if (enableMultiSelect) {
245
- let newSelected = selected.concat([{
244
+ return selected.concat([{
246
245
  post: postEntity
247
246
  }]);
248
-
249
- if (maxSelectCount && newSelected.length >= maxSelectCount) {
250
- newSelected = newSelected.slice(-maxSelectCount);
251
- }
252
-
253
- return newSelected;
254
247
  } // single select
255
248
 
256
249
 
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.theme = exports.mediaSize = exports.default = void 0;
7
+ const mediaSize = {
8
+ xs: 0,
9
+ sm: 576,
10
+ md: 768,
11
+ lg: 960,
12
+ xl: 1200,
13
+ xxl: 1400
14
+ };
15
+ exports.mediaSize = mediaSize;
16
+ const theme = {
17
+ breakpoint: {
18
+ xs: `@media (min-width: ${mediaSize.xs}px)`,
19
+ sm: `@media (min-width: ${mediaSize.sm}px)`,
20
+ md: `@media (min-width: ${mediaSize.md}px)`,
21
+ lg: `@media (min-width: ${mediaSize.lg}px)`,
22
+ xl: `@media (min-width: ${mediaSize.xl}px)`,
23
+ xxl: `@media (min-width: ${mediaSize.xxl}px)`
24
+ },
25
+ fontSize: {
26
+ xs: 'font-size: 14px;',
27
+ sm: 'font-size: 16px;',
28
+ md: 'font-size: 18px;',
29
+ lg: 'font-size: 24px;',
30
+ xl: 'font-size: 28px;'
31
+ },
32
+ margin: {
33
+ default: 'margin: 32px auto;',
34
+ narrow: 'margin: 16px auto;'
35
+ }
36
+ };
37
+ exports.theme = theme;
38
+ var _default = theme;
39
+ exports.default = _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mirrormedia/lilith-draft-editor",
3
- "version": "1.1.0-alpha.2",
3
+ "version": "1.1.0-alpha.20",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -23,16 +23,16 @@
23
23
  "license": "MIT",
24
24
  "dependencies": {
25
25
  "draft-js": "^0.11.7",
26
- "@mirrormedia/lilith-draft-renderer": "1.1.0-alpha.5"
26
+ "@mirrormedia/lilith-draft-renderer": "1.3.0-alpha.3"
27
27
  },
28
28
  "peerDependencies": {
29
- "react": "18.1.0",
30
- "react-dom": "18.1.0",
29
+ "react": "18.2.0",
30
+ "react-dom": "18.2.0",
31
31
  "styled-components": "5.3.5",
32
- "@keystone-6/core": "1.1.1",
33
- "@keystone-ui/button": "^6.0.0",
34
- "@keystone-ui/fields": "^6.0.0",
35
- "@keystone-ui/modals": "^5.0.0"
32
+ "@keystone-6/core": "5.2.0",
33
+ "@keystone-ui/button": "^7.0.2",
34
+ "@keystone-ui/fields": "^7.2.0",
35
+ "@keystone-ui/modals": "^6.0.3"
36
36
  },
37
37
  "files": [
38
38
  "lib"