@contentful/field-editor-rich-text 2.0.0-next.40 → 2.0.0-next.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -21,11 +21,12 @@ var slate = require('slate');
21
21
  var Slate = require('slate-react');
22
22
  var constate = _interopDefault(require('constate'));
23
23
  var f36Components = require('@contentful/f36-components');
24
- var find = _interopDefault(require('lodash/find'));
25
- var flow = _interopDefault(require('lodash/flow'));
24
+ var mimetype = _interopDefault(require('@contentful/mimetype'));
26
25
  var get = _interopDefault(require('lodash/get'));
27
26
  var f36Icons = require('@contentful/f36-icons');
28
27
  var tokens = _interopDefault(require('@contentful/f36-tokens'));
28
+ var find = _interopDefault(require('lodash/find'));
29
+ var flow = _interopDefault(require('lodash/flow'));
29
30
  var plateList = require('@udecode/plate-list');
30
31
  var castArray = _interopDefault(require('lodash/castArray'));
31
32
  var plateBasicMarks = require('@udecode/plate-basic-marks');
@@ -400,17 +401,8 @@ function getParents(el) {
400
401
  return parents;
401
402
  }
402
403
 
403
- // "modern" Edge was released at 79.x
404
- var IS_EDGE_LEGACY = typeof navigator !== 'undefined' && /*#__PURE__*/ /Edge?\/(?:[0-6][0-9]|[0-7][0-8])/i.test(navigator.userAgent); // Native `beforeInput` events don't work well with react on Chrome 75
405
- // and older, Chrome 76+ can use `beforeInput` though.
406
-
407
- var IS_CHROME_LEGACY = typeof navigator !== 'undefined' && /*#__PURE__*/ /Chrome?\/(?:[0-7][0-5]|[0-6][0-9])/i.test(navigator.userAgent); // COMPAT: Firefox/Edge Legacy don't support the `beforeinput` event
408
- // Chrome Legacy doesn't support `beforeinput` correctly
409
-
410
- var HAS_BEFORE_INPUT_SUPPORT = !IS_CHROME_LEGACY && !IS_EDGE_LEGACY && // globalThis is undefined in older browsers
411
- typeof globalThis !== 'undefined' && globalThis.InputEvent && typeof globalThis.InputEvent.prototype.getTargetRanges === 'function'; // The `getTargetRanges` property isn't recognized.
412
-
413
404
  var IS_SAFARI = typeof navigator !== 'undefined' && /*#__PURE__*/ /Version\/[\d.]+.*Safari/.test(navigator.userAgent);
405
+ var IS_CHROME = /*#__PURE__*/ /(?!Chrom.*OPR)Chrom(?:e|ium)\/([0-9.]+)(:?\s|$)/.test(navigator.userAgent);
414
406
 
415
407
  var LINK_TYPES = [Contentful.INLINES.HYPERLINK, Contentful.INLINES.ENTRY_HYPERLINK, Contentful.INLINES.ASSET_HYPERLINK];
416
408
  function isBlockSelected(editor, type) {
@@ -638,24 +630,179 @@ var _constate = /*#__PURE__*/constate(useSdk),
638
630
  SdkProvider = _constate[0],
639
631
  useSdkContext = _constate[1];
640
632
 
633
+ var styles = {
634
+ scheduleIcon: /*#__PURE__*/emotion.css({
635
+ marginRight: tokens.spacing2Xs
636
+ })
637
+ };
638
+ function EntityStatusIcon(_ref) {
639
+ var entity = _ref.entity,
640
+ entityType = _ref.entityType;
641
+
642
+ var _useEntities = fieldEditorReference.useEntities(),
643
+ loadEntityScheduledActions = _useEntities.loadEntityScheduledActions;
644
+
645
+ return /*#__PURE__*/React.createElement(fieldEditorReference.ScheduledIconWithTooltip, {
646
+ getEntityScheduledActions: loadEntityScheduledActions,
647
+ entityType: entityType,
648
+ entityId: entity.sys.id
649
+ }, /*#__PURE__*/React.createElement(f36Icons.ClockIcon, {
650
+ className: styles.scheduleIcon,
651
+ size: "small",
652
+ color: "muted",
653
+ testId: "schedule-icon"
654
+ }));
655
+ }
656
+
657
+ var styles$1 = {
658
+ assetCard: /*#__PURE__*/emotion.css({
659
+ cursor: 'pointer'
660
+ }),
661
+ cardDropdown: /*#__PURE__*/emotion.css({
662
+ width: '300px'
663
+ }),
664
+ truncated: /*#__PURE__*/emotion.css({
665
+ overflow: 'hidden',
666
+ whiteSpace: 'nowrap',
667
+ textOverflow: 'ellipsis'
668
+ })
669
+ };
670
+
671
+ function downloadAsset(url, fileName) {
672
+ // This method won't work if we have CORS disabled(asset not on the contentful server)
673
+ fetch(url, {
674
+ method: 'GET',
675
+ headers: {}
676
+ }).then(function (response) {
677
+ response.arrayBuffer().then(function (buffer) {
678
+ var url = window.URL.createObjectURL(new Blob([buffer]));
679
+ var link = document.createElement('a');
680
+ link.href = url;
681
+ link.setAttribute('download', fileName); //or any other extension
682
+
683
+ document.body.appendChild(link);
684
+ link.click();
685
+ document.body.removeChild(link);
686
+ });
687
+ })["catch"](function (err) {
688
+ f36Components.Notification.error('Failed to download asset');
689
+ console.log(err);
690
+ });
691
+ }
692
+
693
+ function renderAssetInfo(props) {
694
+ var entityFile = props.entityFile;
695
+ var fileName = get(entityFile, 'fileName');
696
+ var mimeType = get(entityFile, 'contentType');
697
+ var fileSize = get(entityFile, 'details.size');
698
+ var image = get(entityFile, 'details.image');
699
+ return [/*#__PURE__*/React.createElement(f36Components.Menu.SectionTitle, {
700
+ key: "file-section"
701
+ }, "File info"), fileName && /*#__PURE__*/React.createElement(f36Components.Menu.Item, {
702
+ key: "file-name"
703
+ }, /*#__PURE__*/React.createElement(f36Components.Text, {
704
+ isTruncated: true
705
+ }, fileName)), mimeType && /*#__PURE__*/React.createElement(f36Components.Menu.Item, {
706
+ key: "file-type"
707
+ }, /*#__PURE__*/React.createElement(f36Components.Text, {
708
+ isTruncated: true
709
+ }, mimeType)), fileSize && /*#__PURE__*/React.createElement(f36Components.Menu.Item, {
710
+ key: "file-size"
711
+ }, fieldEditorShared.shortenStorageUnit(fileSize, 'B')), image && /*#__PURE__*/React.createElement(f36Components.Menu.Item, {
712
+ key: "file-dimentions"
713
+ }, image.width + " \xD7 " + image.height)].filter(function (item) {
714
+ return item;
715
+ });
716
+ }
717
+ function renderActions(props) {
718
+ var entityFile = props.entityFile,
719
+ isDisabled = props.isDisabled,
720
+ onEdit = props.onEdit,
721
+ onRemove = props.onRemove;
722
+ return [/*#__PURE__*/React.createElement(f36Components.Menu.SectionTitle, {
723
+ key: "section-title"
724
+ }, "Actions"), onEdit ? /*#__PURE__*/React.createElement(f36Components.Menu.Item, {
725
+ key: "edit",
726
+ onClick: onEdit,
727
+ testId: "card-action-edit"
728
+ }, "Edit") : null, entityFile ? /*#__PURE__*/React.createElement(f36Components.Menu.Item, {
729
+ key: "download",
730
+ onClick: function onClick() {
731
+ if (typeof entityFile.url === 'string') {
732
+ downloadAsset(entityFile.url, get(entityFile, 'fileName'));
733
+ }
734
+ },
735
+ testId: "card-action-download"
736
+ }, "Download") : null, onRemove ? /*#__PURE__*/React.createElement(f36Components.Menu.Item, {
737
+ key: "remove",
738
+ disabled: isDisabled,
739
+ onClick: onRemove,
740
+ testId: "card-action-remove"
741
+ }, "Remove") : null].filter(function (item) {
742
+ return item;
743
+ });
744
+ }
641
745
  function FetchingWrappedAssetCard(props) {
642
- var onEntityFetchComplete = props.onEntityFetchComplete,
643
- assetId = props.assetId;
746
+ var _asset$fields;
644
747
 
645
748
  var _useEntities = fieldEditorReference.useEntities(),
646
749
  getOrLoadAsset = _useEntities.getOrLoadAsset,
647
- loadEntityScheduledActions = _useEntities.loadEntityScheduledActions,
648
750
  assets = _useEntities.assets;
649
751
 
752
+ var asset = assets[props.assetId];
753
+ var defaultLocaleCode = props.sdk.locales["default"];
754
+ var entityFile = asset != null && (_asset$fields = asset.fields) != null && _asset$fields.file ? asset.fields.file[props.locale] || asset.fields.file[defaultLocaleCode] : undefined;
755
+ var onEntityFetchComplete = props.onEntityFetchComplete;
650
756
  React.useEffect(function () {
651
- getOrLoadAsset(assetId);
652
- }, [getOrLoadAsset, assetId]);
653
- var asset = assets[assetId];
757
+ getOrLoadAsset(props.assetId);
758
+ }, [props.assetId]); // eslint-disable-line
759
+
654
760
  React.useEffect(function () {
655
- if (asset) {
656
- onEntityFetchComplete == null ? void 0 : onEntityFetchComplete();
761
+ if (!asset) {
762
+ return;
763
+ }
764
+
765
+ onEntityFetchComplete == null ? void 0 : onEntityFetchComplete();
766
+ }, [asset, onEntityFetchComplete]);
767
+
768
+ function getAssetSrc() {
769
+ if (!(entityFile != null && entityFile.url)) return '';
770
+ return entityFile.url + "?h=300";
771
+ }
772
+
773
+ function getFileType() {
774
+ var groupToIconMap = {
775
+ image: 'image',
776
+ video: 'video',
777
+ audio: 'audio',
778
+ richtext: 'richtext',
779
+ presentation: 'presentation',
780
+ spreadsheet: 'spreadsheet',
781
+ pdfdocument: 'pdf',
782
+ archive: 'archive',
783
+ plaintext: 'plaintext',
784
+ code: 'code',
785
+ markup: 'markup'
786
+ };
787
+ var archive = groupToIconMap['archive'];
788
+
789
+ if (!entityFile) {
790
+ return archive;
657
791
  }
658
- }, [onEntityFetchComplete, asset]);
792
+
793
+ var groupName = mimetype.getGroupLabel({
794
+ type: entityFile.contentType,
795
+ fallbackFileName: entityFile.fileName
796
+ });
797
+ return groupToIconMap[groupName] || archive;
798
+ }
799
+
800
+ if (asset === undefined) {
801
+ return /*#__PURE__*/React.createElement(f36Components.AssetCard, {
802
+ size: "small",
803
+ isLoading: true
804
+ });
805
+ }
659
806
 
660
807
  if (asset === 'failed') {
661
808
  return /*#__PURE__*/React.createElement(fieldEditorReference.MissingEntityCard, {
@@ -665,48 +812,138 @@ function FetchingWrappedAssetCard(props) {
665
812
  });
666
813
  }
667
814
 
668
- if (asset === undefined) {
669
- return /*#__PURE__*/React.createElement(f36Components.AssetCard, {
670
- size: "default",
671
- isLoading: true
815
+ var status = asset ? fieldEditorShared.entityHelpers.getEntryStatus(asset.sys) : undefined;
816
+
817
+ if (status === 'deleted') {
818
+ return /*#__PURE__*/React.createElement(fieldEditorReference.MissingEntityCard, {
819
+ entityType: "Asset",
820
+ asSquare: true,
821
+ isDisabled: props.isDisabled,
822
+ onRemove: props.onRemove
672
823
  });
673
824
  }
674
825
 
675
- return /*#__PURE__*/React.createElement(fieldEditorReference.WrappedAssetCard, {
676
- getEntityScheduledActions: loadEntityScheduledActions,
677
- size: "small",
678
- isSelected: props.isSelected,
679
- isDisabled: props.isDisabled,
680
- localeCode: props.locale,
681
- defaultLocaleCode: props.sdk.locales["default"],
826
+ var entityTitle = fieldEditorShared.entityHelpers.getAssetTitle({
682
827
  asset: asset,
683
- onEdit: props.onEdit,
684
- onRemove: props.isDisabled ? undefined : props.onRemove,
685
- isClickable: false
828
+ localeCode: props.locale,
829
+ defaultLocaleCode: defaultLocaleCode,
830
+ defaultTitle: 'Untitled'
831
+ });
832
+ return /*#__PURE__*/React.createElement(f36Components.AssetCard, {
833
+ title: entityTitle,
834
+ isSelected: props.isSelected,
835
+ size: "small",
836
+ src: getAssetSrc(),
837
+ type: getFileType(),
838
+ status: status,
839
+ icon: /*#__PURE__*/React.createElement(EntityStatusIcon, {
840
+ entityType: "Asset",
841
+ entity: asset
842
+ }),
843
+ className: styles$1.assetCard,
844
+ actions: [renderActions({
845
+ entityFile: entityFile,
846
+ isDisabled: props.isDisabled,
847
+ onEdit: props.onEdit,
848
+ onRemove: props.onRemove
849
+ }), entityFile ? renderAssetInfo({
850
+ entityFile: entityFile
851
+ }) : null].filter(function (item) {
852
+ return item;
853
+ })
686
854
  });
687
855
  }
688
856
 
689
- function FetchingWrappedEntryCard(props) {
690
- var entryId = props.entryId,
691
- onEntityFetchComplete = props.onEntityFetchComplete;
857
+ var styles$2 = {
858
+ entryCard: /*#__PURE__*/emotion.css({
859
+ cursor: 'pointer'
860
+ })
861
+ };
862
+
863
+ function EntryThumbnail(_ref) {
864
+ var file = _ref.file;
865
+ if (!fieldEditorShared.isValidImage(file)) return null;
866
+ return /*#__PURE__*/React.createElement(fieldEditorReference.AssetThumbnail, {
867
+ file: file
868
+ });
869
+ }
692
870
 
871
+ function FetchingWrappedEntryCard(props) {
693
872
  var _useEntities = fieldEditorReference.useEntities(),
694
873
  getOrLoadEntry = _useEntities.getOrLoadEntry,
695
- loadEntityScheduledActions = _useEntities.loadEntityScheduledActions,
696
- entries = _useEntities.entries;
874
+ entries = _useEntities.entries,
875
+ getOrLoadAsset = _useEntities.getOrLoadAsset;
876
+
877
+ var _React$useState = React.useState(null),
878
+ file = _React$useState[0],
879
+ setFile = _React$useState[1];
880
+
881
+ var entry = entries[props.entryId];
882
+ var contentType = React.useMemo(function () {
883
+ if (!entry || entry === 'failed') {
884
+ return undefined;
885
+ }
697
886
 
887
+ return props.sdk.space.getCachedContentTypes().find(function (contentType) {
888
+ return contentType.sys.id === entry.sys.contentType.sys.id;
889
+ });
890
+ }, [props.sdk, entry]);
891
+ var defaultLocaleCode = props.sdk.locales["default"];
892
+ var onEntityFetchComplete = props.onEntityFetchComplete;
893
+ React.useEffect(function () {
894
+ if (!entry || entry === 'failed') return;
895
+ var subscribed = true;
896
+ fieldEditorShared.entityHelpers.getEntryImage({
897
+ entry: entry,
898
+ contentType: contentType,
899
+ localeCode: props.locale,
900
+ defaultLocaleCode: defaultLocaleCode
901
+ }, getOrLoadAsset)["catch"](function () {
902
+ return null;
903
+ }).then(function (file) {
904
+ if (subscribed) {
905
+ setFile(file);
906
+ }
907
+ });
908
+ return function () {
909
+ subscribed = false;
910
+ };
911
+ }, [entry, contentType, props.locale, defaultLocaleCode, props.sdk, file, getOrLoadAsset]);
698
912
  React.useEffect(function () {
699
- getOrLoadEntry(entryId);
700
- }, [getOrLoadEntry, entryId]);
701
- var entry = entries[entryId];
913
+ getOrLoadEntry(props.entryId);
914
+ }, [props.entryId]); // eslint-disable-line
915
+
702
916
  React.useEffect(function () {
703
- if (entry) {
704
- onEntityFetchComplete == null ? void 0 : onEntityFetchComplete();
917
+ if (!entry) {
918
+ return;
705
919
  }
706
- }, [onEntityFetchComplete, entry]);
920
+
921
+ onEntityFetchComplete == null ? void 0 : onEntityFetchComplete();
922
+ }, [entry, onEntityFetchComplete]);
923
+
924
+ function renderDropdown() {
925
+ if (!props.onEdit || !props.onRemove) return undefined;
926
+ return [props.onEdit ? /*#__PURE__*/React.createElement(f36Components.MenuItem, {
927
+ key: "edit",
928
+ testId: "card-action-edit",
929
+ onClick: function onClick() {
930
+ props.onEdit && props.onEdit();
931
+ }
932
+ }, "Edit") : null, props.onRemove ? /*#__PURE__*/React.createElement(f36Components.MenuItem, {
933
+ key: "delete",
934
+ disabled: props.isDisabled,
935
+ testId: "card-action-remove",
936
+ onClick: function onClick() {
937
+ props.onRemove && props.onRemove();
938
+ }
939
+ }, "Remove") : null].filter(function (item) {
940
+ return item;
941
+ });
942
+ }
707
943
 
708
944
  if (entry === undefined) {
709
945
  return /*#__PURE__*/React.createElement(f36Components.EntryCard, {
946
+ size: "default",
710
947
  isLoading: true
711
948
  });
712
949
  }
@@ -719,26 +956,50 @@ function FetchingWrappedEntryCard(props) {
719
956
  });
720
957
  }
721
958
 
722
- var contentType = props.sdk.space.getCachedContentTypes().find(function (contentType) {
723
- return contentType.sys.id === entry.sys.contentType.sys.id;
959
+ var entryStatus = entry ? fieldEditorShared.entityHelpers.getEntryStatus(entry.sys) : undefined;
960
+
961
+ if (entryStatus === 'deleted') {
962
+ return /*#__PURE__*/React.createElement(fieldEditorReference.MissingEntityCard, {
963
+ entityType: "Entry",
964
+ isDisabled: props.isDisabled,
965
+ onRemove: props.onRemove
966
+ });
967
+ }
968
+
969
+ var title = fieldEditorShared.entityHelpers.getEntryTitle({
970
+ entry: entry,
971
+ contentType: contentType,
972
+ localeCode: props.locale,
973
+ defaultLocaleCode: defaultLocaleCode,
974
+ defaultTitle: 'Untitled'
975
+ });
976
+ var description = fieldEditorShared.entityHelpers.getEntityDescription({
977
+ entity: entry,
978
+ contentType: contentType,
979
+ localeCode: props.locale,
980
+ defaultLocaleCode: defaultLocaleCode
724
981
  });
725
- return /*#__PURE__*/React.createElement(fieldEditorReference.WrappedEntryCard, {
982
+ return /*#__PURE__*/React.createElement(f36Components.EntryCard, {
983
+ contentType: contentType == null ? void 0 : contentType.name,
984
+ title: title,
985
+ description: description,
726
986
  size: "default",
727
- getAsset: props.sdk.space.getAsset,
728
- getEntityScheduledActions: loadEntityScheduledActions,
729
987
  isSelected: props.isSelected,
730
- isDisabled: props.isDisabled,
731
- localeCode: props.locale,
732
- defaultLocaleCode: props.sdk.locales["default"],
733
- contentType: contentType,
734
- entry: entry,
735
- onEdit: props.onEdit,
736
- onRemove: props.isDisabled ? undefined : props.onRemove,
737
- isClickable: false
988
+ status: entryStatus,
989
+ className: styles$2.entryCard,
990
+ thumbnailElement: file ? /*#__PURE__*/React.createElement(EntryThumbnail, {
991
+ file: file
992
+ }) : undefined,
993
+ icon: /*#__PURE__*/React.createElement(EntityStatusIcon, {
994
+ entityType: "Entry",
995
+ entity: entry
996
+ }),
997
+ withDragHandle: false,
998
+ actions: renderDropdown()
738
999
  });
739
1000
  }
740
1001
 
741
- var styles = {
1002
+ var styles$3 = {
742
1003
  root: /*#__PURE__*/emotion.css({
743
1004
  marginBottom: '1.25rem !important',
744
1005
  display: 'block'
@@ -780,17 +1041,17 @@ function LinkedEntityBlock(props) {
780
1041
  };
781
1042
 
782
1043
  return /*#__PURE__*/React__default.createElement("div", Object.assign({}, attributes, {
783
- className: styles.root,
1044
+ className: styles$3.root,
784
1045
  "data-entity-type": entityType,
785
1046
  "data-entity-id": entityId,
786
1047
  // COMPAT: This makes copy & paste work for Firefox
787
- contentEditable: !HAS_BEFORE_INPUT_SUPPORT ? false : undefined,
788
- draggable: !HAS_BEFORE_INPUT_SUPPORT ? true : undefined
1048
+ contentEditable: IS_CHROME ? undefined : false,
1049
+ draggable: IS_CHROME ? true : undefined
789
1050
  }), /*#__PURE__*/React__default.createElement("div", {
790
1051
  // COMPAT: This makes copy & paste work for Chromium/Blink browsers and Safari
791
- contentEditable: HAS_BEFORE_INPUT_SUPPORT ? false : undefined,
792
- draggable: HAS_BEFORE_INPUT_SUPPORT ? true : undefined,
793
- className: styles.container
1052
+ contentEditable: IS_CHROME ? false : undefined,
1053
+ draggable: IS_CHROME ? true : undefined,
1054
+ className: styles$3.container
794
1055
  }, entityType === 'Entry' && /*#__PURE__*/React__default.createElement(FetchingWrappedEntryCard, {
795
1056
  sdk: sdk,
796
1057
  entryId: entityId,
@@ -1738,7 +1999,7 @@ function insertBlock(editor, nodeType, entity) {
1738
1999
  focus(editor);
1739
2000
  }
1740
2001
 
1741
- var styles$1 = {
2002
+ var styles$4 = {
1742
2003
  icon: /*#__PURE__*/emotion.css({
1743
2004
  marginRight: '10px'
1744
2005
  })
@@ -1786,7 +2047,7 @@ function EmbeddedEntityBlockToolbarIcon(_ref) {
1786
2047
  flexDirection: "row"
1787
2048
  }, /*#__PURE__*/React__default.createElement(f36Components.Icon, {
1788
2049
  as: type === 'Asset' ? f36Icons.AssetIcon : f36Icons.EmbeddedEntryBlockIcon,
1789
- className: "rich-text__embedded-entry-list-icon " + styles$1.icon,
2050
+ className: "rich-text__embedded-entry-list-icon " + styles$4.icon,
1790
2051
  variant: "secondary"
1791
2052
  }), /*#__PURE__*/React__default.createElement("span", null, type)));
1792
2053
  }
@@ -1885,7 +2146,7 @@ var createEmbeddedAssetBlockPlugin = /*#__PURE__*/createEmbeddedEntityPlugin(Con
1885
2146
 
1886
2147
  var getEntryTitle = fieldEditorShared.entityHelpers.getEntryTitle,
1887
2148
  getEntryStatus = fieldEditorShared.entityHelpers.getEntryStatus;
1888
- var styles$2 = {
2149
+ var styles$5 = {
1889
2150
  scheduledIcon: /*#__PURE__*/emotion.css({
1890
2151
  verticalAlign: 'text-bottom',
1891
2152
  marginRight: tokens.spacing2Xs
@@ -1956,7 +2217,7 @@ function FetchingWrappedInlineEntryCard(props) {
1956
2217
  actions: [/*#__PURE__*/React__default.createElement(f36Components.MenuItem, {
1957
2218
  key: "remove",
1958
2219
  onClick: props.onRemove,
1959
- testId: "delete"
2220
+ testId: "card-action-remove"
1960
2221
  }, "Remove")]
1961
2222
  });
1962
2223
  }
@@ -1973,14 +2234,14 @@ function FetchingWrappedInlineEntryCard(props) {
1973
2234
  key: "remove",
1974
2235
  onClick: props.onRemove,
1975
2236
  disabled: props.isDisabled,
1976
- testId: "delete"
2237
+ testId: "card-action-remove"
1977
2238
  }, "Remove")]
1978
2239
  }, /*#__PURE__*/React__default.createElement(fieldEditorReference.ScheduledIconWithTooltip, {
1979
2240
  getEntityScheduledActions: loadEntityScheduledActions,
1980
2241
  entityType: "Entry",
1981
2242
  entityId: entry.sys.id
1982
2243
  }, /*#__PURE__*/React__default.createElement(f36Icons.ClockIcon, {
1983
- className: styles$2.scheduledIcon,
2244
+ className: styles$5.scheduledIcon,
1984
2245
  variant: "muted",
1985
2246
  testId: "scheduled-icon"
1986
2247
  })), /*#__PURE__*/React__default.createElement(f36Components.Text, null, title));
@@ -2004,7 +2265,7 @@ function createInlineEntryNode(id) {
2004
2265
  };
2005
2266
  }
2006
2267
 
2007
- var styles$3 = {
2268
+ var styles$6 = {
2008
2269
  icon: /*#__PURE__*/emotion.css({
2009
2270
  marginRight: '10px'
2010
2271
  }),
@@ -2040,15 +2301,15 @@ function EmbeddedEntityInline(props) {
2040
2301
  }
2041
2302
 
2042
2303
  return /*#__PURE__*/React.createElement("span", Object.assign({}, props.attributes, {
2043
- className: styles$3.root,
2304
+ className: styles$6.root,
2044
2305
  "data-embedded-entity-inline-id": entryId,
2045
2306
  // COMPAT: This makes copy & paste work for Firefox
2046
- contentEditable: !HAS_BEFORE_INPUT_SUPPORT ? false : undefined,
2047
- draggable: !HAS_BEFORE_INPUT_SUPPORT ? true : undefined
2307
+ contentEditable: IS_CHROME ? undefined : false,
2308
+ draggable: IS_CHROME ? true : undefined
2048
2309
  }), /*#__PURE__*/React.createElement("span", {
2049
2310
  // COMPAT: This makes copy & paste work for Chromium/Blink browsers and Safari
2050
- contentEditable: HAS_BEFORE_INPUT_SUPPORT ? false : undefined,
2051
- draggable: HAS_BEFORE_INPUT_SUPPORT ? true : undefined
2311
+ contentEditable: IS_CHROME ? false : undefined,
2312
+ draggable: IS_CHROME ? true : undefined
2052
2313
  }, /*#__PURE__*/React.createElement(FetchingWrappedInlineEntryCard, {
2053
2314
  sdk: sdk,
2054
2315
  entryId: entryId,
@@ -2170,7 +2431,7 @@ function ToolbarEmbeddedEntityInlineButton(props) {
2170
2431
  flexDirection: "row"
2171
2432
  }, /*#__PURE__*/React.createElement(f36Icons.EmbeddedEntryInlineIcon, {
2172
2433
  variant: "secondary",
2173
- className: "rich-text__embedded-entry-list-icon " + styles$3.icon
2434
+ className: "rich-text__embedded-entry-list-icon " + styles$6.icon
2174
2435
  }), /*#__PURE__*/React.createElement("span", null, "Inline entry")));
2175
2436
  }
2176
2437
  function createEmbeddedEntityInlinePlugin(sdk) {
@@ -2246,7 +2507,7 @@ var isMarkEnabled = function isMarkEnabled(field, mark) {
2246
2507
  };
2247
2508
 
2248
2509
  var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _dropdown, _LABELS;
2249
- var styles$4 = {
2510
+ var styles$7 = {
2250
2511
  dropdown: (_dropdown = {
2251
2512
  root: /*#__PURE__*/emotion.css(_templateObject || (_templateObject = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n font-weight: ", ";\n "])), tokens.fontWeightDemiBold)
2252
2513
  }, _dropdown[Contentful.BLOCKS.PARAGRAPH] = /*#__PURE__*/emotion.css(_templateObject2 || (_templateObject2 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n font-size: ", ";\n "])), tokens.fontSizeL), _dropdown[Contentful.BLOCKS.HEADING_1] = /*#__PURE__*/emotion.css(_templateObject3 || (_templateObject3 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n font-size: 1.625rem;\n "]))), _dropdown[Contentful.BLOCKS.HEADING_2] = /*#__PURE__*/emotion.css(_templateObject4 || (_templateObject4 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n font-size: 1.4375rem;\n "]))), _dropdown[Contentful.BLOCKS.HEADING_3] = /*#__PURE__*/emotion.css(_templateObject5 || (_templateObject5 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n font-size: 1.25rem;\n "]))), _dropdown[Contentful.BLOCKS.HEADING_4] = /*#__PURE__*/emotion.css(_templateObject6 || (_templateObject6 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n font-size: 1.125rem;\n "]))), _dropdown[Contentful.BLOCKS.HEADING_5] = /*#__PURE__*/emotion.css(_templateObject7 || (_templateObject7 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n font-size: 1rem;\n "]))), _dropdown[Contentful.BLOCKS.HEADING_6] = /*#__PURE__*/emotion.css(_templateObject8 || (_templateObject8 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n font-size: 0.875rem;\n "]))), _dropdown)
@@ -2341,7 +2602,7 @@ function ToolbarHeadingButton(props) {
2341
2602
  testId: "dropdown-option-" + nodeType,
2342
2603
  disabled: props.isDisabled
2343
2604
  }, /*#__PURE__*/React.createElement("span", {
2344
- className: emotion.cx(styles$4.dropdown.root, styles$4.dropdown[nodeType])
2605
+ className: emotion.cx(styles$7.dropdown.root, styles$7.dropdown[nodeType])
2345
2606
  }, LABELS[nodeType]));
2346
2607
  }).filter(Boolean)));
2347
2608
  }
@@ -2411,7 +2672,7 @@ var transformLift = function transformLift(editor, _ref4) {
2411
2672
  };
2412
2673
 
2413
2674
  var _templateObject$1, _templateObject2$1, _templateObject3$1, _templateObject4$1, _templateObject5$1, _templateObject6$1, _templateObject7$1, _templateObject8$1, _dropdown$1, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14, _templateObject15, _headings, _HeadingComponents;
2414
- var styles$5 = {
2675
+ var styles$8 = {
2415
2676
  dropdown: (_dropdown$1 = {
2416
2677
  root: /*#__PURE__*/emotion.css(_templateObject$1 || (_templateObject$1 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n font-weight: ", ";\n "])), tokens.fontWeightDemiBold)
2417
2678
  }, _dropdown$1[Contentful.BLOCKS.PARAGRAPH] = /*#__PURE__*/emotion.css(_templateObject2$1 || (_templateObject2$1 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n font-size: ", ";\n "])), tokens.fontSizeL), _dropdown$1[Contentful.BLOCKS.HEADING_1] = /*#__PURE__*/emotion.css(_templateObject3$1 || (_templateObject3$1 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n font-size: 1.625rem;\n "]))), _dropdown$1[Contentful.BLOCKS.HEADING_2] = /*#__PURE__*/emotion.css(_templateObject4$1 || (_templateObject4$1 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n font-size: 1.4375rem;\n "]))), _dropdown$1[Contentful.BLOCKS.HEADING_3] = /*#__PURE__*/emotion.css(_templateObject5$1 || (_templateObject5$1 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n font-size: 1.25rem;\n "]))), _dropdown$1[Contentful.BLOCKS.HEADING_4] = /*#__PURE__*/emotion.css(_templateObject6$1 || (_templateObject6$1 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n font-size: 1.125rem;\n "]))), _dropdown$1[Contentful.BLOCKS.HEADING_5] = /*#__PURE__*/emotion.css(_templateObject7$1 || (_templateObject7$1 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n font-size: 1rem;\n "]))), _dropdown$1[Contentful.BLOCKS.HEADING_6] = /*#__PURE__*/emotion.css(_templateObject8$1 || (_templateObject8$1 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n font-size: 0.875rem;\n "]))), _dropdown$1),
@@ -2423,7 +2684,7 @@ var styles$5 = {
2423
2684
  function createHeading(Tag, block) {
2424
2685
  return function Heading(props) {
2425
2686
  return /*#__PURE__*/React.createElement(Tag, Object.assign({}, props.attributes, {
2426
- className: emotion.cx(styles$5.headings.root, styles$5.headings[block])
2687
+ className: emotion.cx(styles$8.headings.root, styles$8.headings[block])
2427
2688
  }), props.children);
2428
2689
  };
2429
2690
  }
@@ -2519,7 +2780,7 @@ var createHeadingPlugin = function createHeadingPlugin() {
2519
2780
  };
2520
2781
  };
2521
2782
 
2522
- var styles$6 = {
2783
+ var styles$9 = {
2523
2784
  button: /*#__PURE__*/emotion.css({
2524
2785
  height: '30px',
2525
2786
  width: '30px',
@@ -2545,7 +2806,7 @@ function ToolbarButton(props) {
2545
2806
  };
2546
2807
 
2547
2808
  var button = /*#__PURE__*/React__default.createElement(f36Components.Button, {
2548
- className: emotion.cx(styles$6.button, className),
2809
+ className: emotion.cx(styles$9.button, className),
2549
2810
  isDisabled: isDisabled,
2550
2811
  startIcon: children,
2551
2812
  onClick: handleClick,
@@ -2556,7 +2817,7 @@ function ToolbarButton(props) {
2556
2817
 
2557
2818
  if (title) {
2558
2819
  return /*#__PURE__*/React__default.createElement(f36Components.Tooltip, {
2559
- className: styles$6.tooltip,
2820
+ className: styles$9.tooltip,
2560
2821
  placement: "bottom",
2561
2822
  content: title
2562
2823
  }, button);
@@ -2566,7 +2827,7 @@ function ToolbarButton(props) {
2566
2827
  }
2567
2828
 
2568
2829
  var _templateObject$2, _templateObject2$2, _templateObject3$2;
2569
- var styles$7 = {
2830
+ var styles$a = {
2570
2831
  container: /*#__PURE__*/emotion.css(_templateObject$2 || (_templateObject$2 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n margin: 0 0 ", ";\n "])), tokens.spacingL),
2571
2832
  hr: /*#__PURE__*/emotion.css(_templateObject2$2 || (_templateObject2$2 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n margin: 0;\n height: ", ";\n background: transparent;\n position: relative;\n border: 0;\n user-select: none;\n &:hover {\n cursor: pointer;\n }\n &::after {\n content: '';\n position: absolute;\n width: 100%;\n height: 1px;\n background: ", ";\n top: 50%;\n }\n "])), tokens.spacingM, tokens.gray300),
2572
2833
  hrSelected: /*#__PURE__*/emotion.css(_templateObject3$2 || (_templateObject3$2 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n &::after {\n background: ", ";\n -webkit-box-shadow: 0px 0px 5px ", ";\n box-shadow: 0px 0px 5px ", ";\n }\n "])), tokens.colorPrimary, tokens.colorPrimary, tokens.colorPrimary)
@@ -2624,14 +2885,14 @@ function Hr(props) {
2624
2885
  var isSelected = Slate.useSelected();
2625
2886
  var isFocused = Slate.useFocused();
2626
2887
  return /*#__PURE__*/React.createElement("div", Object.assign({}, props.attributes, {
2627
- className: styles$7.container,
2888
+ className: styles$a.container,
2628
2889
  "data-void-element": Contentful.BLOCKS.HR
2629
2890
  }), /*#__PURE__*/React.createElement("div", {
2630
2891
  draggable: true,
2631
2892
  // Moving `contentEditable` to this div makes it to be selectable when being the first void element, e.g pressing ctrl + a to select everything
2632
2893
  contentEditable: false
2633
2894
  }, /*#__PURE__*/React.createElement("hr", {
2634
- className: emotion.cx(styles$7.hr, isSelected && isFocused ? styles$7.hrSelected : undefined)
2895
+ className: emotion.cx(styles$a.hr, isSelected && isFocused ? styles$a.hrSelected : undefined)
2635
2896
  })), props.children);
2636
2897
  }
2637
2898
  var createHrPlugin = function createHrPlugin() {
@@ -2658,7 +2919,7 @@ var createHrPlugin = function createHrPlugin() {
2658
2919
  };
2659
2920
 
2660
2921
  var _templateObject$3, _SYS_LINK_TYPES, _LINK_TYPE_SELECTION_;
2661
- var styles$8 = {
2922
+ var styles$b = {
2662
2923
  removeSelectionLabel: /*#__PURE__*/emotion.css(_templateObject$3 || (_templateObject$3 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n margin-left: ", ";\n "])), tokens.spacingS)
2663
2924
  };
2664
2925
  var SYS_LINK_TYPES = (_SYS_LINK_TYPES = {}, _SYS_LINK_TYPES[Contentful.INLINES.ENTRY_HYPERLINK] = 'Entry', _SYS_LINK_TYPES[Contentful.INLINES.ASSET_HYPERLINK] = 'Asset', _SYS_LINK_TYPES);
@@ -2841,7 +3102,7 @@ function HyperlinkModal(props) {
2841
3102
  }, "Link target", ' '), linkEntity && linkEntity.sys.linkType === SYS_LINK_TYPES[linkType] ? /*#__PURE__*/React.createElement(React.Fragment, null, !props.readonly && /*#__PURE__*/React.createElement(f36Components.TextLink, {
2842
3103
  testId: "entity-selection-link",
2843
3104
  onClick: resetLinkEntity,
2844
- className: styles$8.removeSelectionLabel
3105
+ className: styles$b.removeSelectionLabel
2845
3106
  }, "Remove selection"), /*#__PURE__*/React.createElement("div", null, linkType === Contentful.INLINES.ENTRY_HYPERLINK && /*#__PURE__*/React.createElement(FetchingWrappedEntryCard, {
2846
3107
  sdk: props.sdk,
2847
3108
  locale: props.sdk.field.locale,
@@ -3182,7 +3443,7 @@ function useEntityInfo(props) {
3182
3443
  return getEntityInfo(status.data);
3183
3444
  }
3184
3445
 
3185
- var styles$9 = {
3446
+ var styles$c = {
3186
3447
  hyperlinkWrapper: /*#__PURE__*/emotion.css({
3187
3448
  display: 'inline',
3188
3449
  position: 'static',
@@ -3227,13 +3488,13 @@ function EntityHyperlink(props) {
3227
3488
 
3228
3489
  return /*#__PURE__*/React.createElement(f36Components.Tooltip, {
3229
3490
  content: tooltipContent,
3230
- targetWrapperClassName: styles$9.hyperlinkWrapper,
3491
+ targetWrapperClassName: styles$c.hyperlinkWrapper,
3231
3492
  placement: "bottom",
3232
3493
  maxWidth: "auto"
3233
3494
  }, /*#__PURE__*/React.createElement(f36Components.TextLink, {
3234
3495
  as: "a",
3235
3496
  onClick: handleClick,
3236
- className: styles$9.hyperlink,
3497
+ className: styles$c.hyperlink,
3237
3498
  "data-link-type": target.sys.linkType,
3238
3499
  "data-link-id": target.sys.id
3239
3500
  }, props.children));
@@ -3257,7 +3518,7 @@ function UrlHyperlink(props) {
3257
3518
 
3258
3519
  return /*#__PURE__*/React.createElement(f36Components.Tooltip, {
3259
3520
  content: uri,
3260
- targetWrapperClassName: styles$9.hyperlinkWrapper,
3521
+ targetWrapperClassName: styles$c.hyperlinkWrapper,
3261
3522
  placement: "bottom",
3262
3523
  maxWidth: "auto"
3263
3524
  }, /*#__PURE__*/React.createElement(f36Components.TextLink, {
@@ -3265,7 +3526,7 @@ function UrlHyperlink(props) {
3265
3526
  href: uri,
3266
3527
  rel: "noopener noreferrer",
3267
3528
  onClick: handleClick,
3268
- className: styles$9.hyperlink
3529
+ className: styles$c.hyperlink
3269
3530
  }, props.children));
3270
3531
  }
3271
3532
 
@@ -3391,12 +3652,12 @@ var createHyperlinkPlugin = function createHyperlinkPlugin(sdk) {
3391
3652
 
3392
3653
  var _templateObject$4, _templateObject2$3, _templateObject3$3, _styles;
3393
3654
  var baseStyle = /*#__PURE__*/emotion.css(_templateObject$4 || (_templateObject$4 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n padding: 0;\n margin: 0 0 1.25rem 1.25rem;\n\n div:first-child {\n margin: 0;\n line-height: ", ";\n }\n"])), tokens.lineHeightDefault);
3394
- var styles$a = (_styles = {}, _styles[Contentful.BLOCKS.UL_LIST] = /*#__PURE__*/emotion.css(_templateObject2$3 || (_templateObject2$3 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n list-style-type: disc;\n ul {\n list-style-type: circle;\n ul {\n list-style-type: square;\n }\n }\n "]))), _styles[Contentful.BLOCKS.OL_LIST] = /*#__PURE__*/emotion.css(_templateObject3$3 || (_templateObject3$3 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n list-style-type: decimal;\n ol {\n list-style-type: upper-alpha;\n ol {\n list-style-type: lower-roman;\n ol {\n list-style-type: lower-alpha;\n }\n }\n }\n "]))), _styles);
3655
+ var styles$d = (_styles = {}, _styles[Contentful.BLOCKS.UL_LIST] = /*#__PURE__*/emotion.css(_templateObject2$3 || (_templateObject2$3 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n list-style-type: disc;\n ul {\n list-style-type: circle;\n ul {\n list-style-type: square;\n }\n }\n "]))), _styles[Contentful.BLOCKS.OL_LIST] = /*#__PURE__*/emotion.css(_templateObject3$3 || (_templateObject3$3 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n list-style-type: decimal;\n ol {\n list-style-type: upper-alpha;\n ol {\n list-style-type: lower-roman;\n ol {\n list-style-type: lower-alpha;\n }\n }\n }\n "]))), _styles);
3395
3656
 
3396
3657
  function createList(Tag, block) {
3397
3658
  return function List(props) {
3398
3659
  return /*#__PURE__*/React.createElement(Tag, Object.assign({}, props.attributes, {
3399
- className: emotion.cx(baseStyle, styles$a[block])
3660
+ className: emotion.cx(baseStyle, styles$d[block])
3400
3661
  }), props.children);
3401
3662
  };
3402
3663
  }
@@ -4377,14 +4638,14 @@ var ToolbarBoldButton = /*#__PURE__*/createMarkToolbarButton({
4377
4638
  mark: Contentful.MARKS.BOLD,
4378
4639
  icon: /*#__PURE__*/React.createElement(f36Icons.FormatBoldIcon, null)
4379
4640
  });
4380
- var styles$b = {
4641
+ var styles$e = {
4381
4642
  bold: /*#__PURE__*/emotion.css({
4382
4643
  fontWeight: 600
4383
4644
  })
4384
4645
  };
4385
4646
  function Bold(props) {
4386
4647
  return /*#__PURE__*/React.createElement("strong", Object.assign({}, props.attributes, {
4387
- className: styles$b.bold
4648
+ className: styles$e.bold
4388
4649
  }), props.children);
4389
4650
  }
4390
4651
 
@@ -4424,7 +4685,7 @@ var ToolbarCodeButton = /*#__PURE__*/createMarkToolbarButton({
4424
4685
  mark: Contentful.MARKS.CODE,
4425
4686
  icon: /*#__PURE__*/React.createElement(f36Icons.CodeIcon, null)
4426
4687
  });
4427
- var styles$c = {
4688
+ var styles$f = {
4428
4689
  code: /*#__PURE__*/emotion.css({
4429
4690
  fontFamily: 'monospace',
4430
4691
  fontSize: '.9em'
@@ -4432,7 +4693,7 @@ var styles$c = {
4432
4693
  };
4433
4694
  function Code(props) {
4434
4695
  return /*#__PURE__*/React.createElement("code", Object.assign({}, props.attributes, {
4435
- className: styles$c.code
4696
+ className: styles$f.code
4436
4697
  }), props.children);
4437
4698
  }
4438
4699
  var createCodePlugin = function createCodePlugin() {
@@ -4462,14 +4723,14 @@ var ToolbarItalicButton = /*#__PURE__*/createMarkToolbarButton({
4462
4723
  mark: Contentful.MARKS.ITALIC,
4463
4724
  icon: /*#__PURE__*/React.createElement(f36Icons.FormatItalicIcon, null)
4464
4725
  });
4465
- var styles$d = {
4726
+ var styles$g = {
4466
4727
  italic: /*#__PURE__*/emotion.css({
4467
4728
  fontStyle: 'italic'
4468
4729
  })
4469
4730
  };
4470
4731
  function Italic(props) {
4471
4732
  return /*#__PURE__*/React.createElement("em", Object.assign({}, props.attributes, {
4472
- className: styles$d.italic
4733
+ className: styles$g.italic
4473
4734
  }), props.children);
4474
4735
  }
4475
4736
  var createItalicPlugin = function createItalicPlugin() {
@@ -4745,10 +5006,10 @@ var createNormalizerPlugin = function createNormalizerPlugin() {
4745
5006
  };
4746
5007
 
4747
5008
  var _templateObject$6, _styles$1;
4748
- var styles$e = (_styles$1 = {}, _styles$1[Contentful.BLOCKS.PARAGRAPH] = /*#__PURE__*/emotion.css(_templateObject$6 || (_templateObject$6 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n line-height: ", ";\n margin-bottom: 1.5em;\n "])), tokens.lineHeightDefault), _styles$1);
5009
+ var styles$h = (_styles$1 = {}, _styles$1[Contentful.BLOCKS.PARAGRAPH] = /*#__PURE__*/emotion.css(_templateObject$6 || (_templateObject$6 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n line-height: ", ";\n margin-bottom: 1.5em;\n "])), tokens.lineHeightDefault), _styles$1);
4749
5010
  function Paragraph(props) {
4750
5011
  return /*#__PURE__*/React.createElement("div", Object.assign({}, props.attributes, {
4751
- className: styles$e[Contentful.BLOCKS.PARAGRAPH]
5012
+ className: styles$h[Contentful.BLOCKS.PARAGRAPH]
4752
5013
  }), props.children);
4753
5014
  }
4754
5015
 
@@ -5569,7 +5830,7 @@ var isTable = function isTable(node) {
5569
5830
  return slate.Element.isElement(node) && node.type === Contentful.BLOCKS.TABLE;
5570
5831
  };
5571
5832
 
5572
- var styles$f = {
5833
+ var styles$i = {
5573
5834
  topRight: /*#__PURE__*/emotion.css({
5574
5835
  position: 'absolute',
5575
5836
  top: '6px',
@@ -5658,7 +5919,7 @@ var TableActions = function TableActions() {
5658
5919
  size: "small",
5659
5920
  variant: "transparent",
5660
5921
  tabIndex: -1,
5661
- className: styles$f.topRight,
5922
+ className: styles$i.topRight,
5662
5923
  icon: /*#__PURE__*/React__default.createElement(f36Icons.ChevronDownIcon, null),
5663
5924
  "aria-label": "Open table menu",
5664
5925
  testId: "cf-table-actions-button"
@@ -6480,6 +6741,42 @@ var disableCorePlugins = {
6480
6741
  eventEditor: true
6481
6742
  };
6482
6743
 
6744
+ var isTextElement = function isTextElement(node) {
6745
+ return 'text' in node;
6746
+ };
6747
+ /**
6748
+ * Ensures all nodes have a child leaf text element. This should be handled by
6749
+ * Slate but its behavior has proven to be buggy and unpredictable.
6750
+ */
6751
+
6752
+
6753
+ function sanitizeIncomingSlateDoc(nodes) {
6754
+ if (nodes === void 0) {
6755
+ nodes = [];
6756
+ }
6757
+
6758
+ return nodes.map(function (node) {
6759
+ var _node$children;
6760
+
6761
+ if (isTextElement(node)) {
6762
+ return node;
6763
+ }
6764
+
6765
+ if (((_node$children = node.children) == null ? void 0 : _node$children.length) === 0) {
6766
+ return _extends({}, node, {
6767
+ children: [{
6768
+ text: '',
6769
+ data: {}
6770
+ }]
6771
+ });
6772
+ }
6773
+
6774
+ return _extends({}, node, {
6775
+ children: sanitizeIncomingSlateDoc(node.children)
6776
+ });
6777
+ });
6778
+ }
6779
+
6483
6780
  /**
6484
6781
  * For legacy reasons, a document may not have any content at all
6485
6782
  * e.g:
@@ -6534,16 +6831,17 @@ var setEditorContent = function setEditorContent(editor, nodes) {
6534
6831
  });
6535
6832
  };
6536
6833
  /**
6537
- * Converts a contenful rich text document to the corresponding slate editor
6834
+ * Converts a Contentful rich text document to the corresponding slate editor
6538
6835
  * value
6539
6836
  */
6540
6837
 
6541
6838
  var documentToEditorValue = function documentToEditorValue(doc) {
6542
- return contentfulSlateJSAdapter.toSlatejsDocument({
6839
+ var slateDoc = contentfulSlateJSAdapter.toSlatejsDocument({
6543
6840
  document: hasContent(doc) ? doc : Contentful.EMPTY_DOCUMENT,
6544
6841
  // TODO: get rid of schema, https://github.com/contentful/field-editors/pull/1065#discussion_r826723248
6545
6842
  schema: schema
6546
6843
  });
6844
+ return sanitizeIncomingSlateDoc(slateDoc);
6547
6845
  };
6548
6846
  var normalizeEditorValue = function normalizeEditorValue(value, options) {
6549
6847
  var editor = plateCore.createPlateEditor(options);
@@ -6555,7 +6853,7 @@ var normalizeEditorValue = function normalizeEditorValue(value, options) {
6555
6853
  };
6556
6854
 
6557
6855
  var STYLE_EDITOR_BORDER = "1px solid " + tokens.gray400;
6558
- var styles$g = {
6856
+ var styles$j = {
6559
6857
  root: /*#__PURE__*/emotion.css({
6560
6858
  position: 'relative'
6561
6859
  }),
@@ -6671,7 +6969,7 @@ var EmbedEntityWidget = function EmbedEntityWidget(_ref) {
6671
6969
  }, actions);
6672
6970
  };
6673
6971
 
6674
- var styles$h = {
6972
+ var styles$k = {
6675
6973
  toolbar: /*#__PURE__*/emotion.css({
6676
6974
  border: "1px solid " + tokens.gray400,
6677
6975
  backgroundColor: tokens.gray100,
@@ -6716,14 +7014,14 @@ var Toolbar = function Toolbar(_ref) {
6716
7014
  var shouldDisableTables = isDisabled || !canInsertBlocks || isListSelected || isBlockquoteSelected;
6717
7015
  return /*#__PURE__*/React__default.createElement(f36Components.Flex, {
6718
7016
  testId: "toolbar",
6719
- className: styles$h.toolbar,
7017
+ className: styles$k.toolbar,
6720
7018
  alignItems: "center"
6721
7019
  }, /*#__PURE__*/React__default.createElement("div", {
6722
- className: styles$h.formattingOptionsWrapper
7020
+ className: styles$k.formattingOptionsWrapper
6723
7021
  }, /*#__PURE__*/React__default.createElement(ToolbarHeadingButton, {
6724
7022
  isDisabled: isDisabled || !canInsertBlocks
6725
7023
  }), validationInfo.isAnyMarkEnabled && /*#__PURE__*/React__default.createElement("span", {
6726
- className: styles$h.divider
7024
+ className: styles$k.divider
6727
7025
  }), isMarkEnabled(sdk.field, Contentful.MARKS.BOLD) && /*#__PURE__*/React__default.createElement(ToolbarBoldButton, {
6728
7026
  isDisabled: isDisabled
6729
7027
  }), isMarkEnabled(sdk.field, Contentful.MARKS.ITALIC) && /*#__PURE__*/React__default.createElement(ToolbarItalicButton, {
@@ -6733,11 +7031,11 @@ var Toolbar = function Toolbar(_ref) {
6733
7031
  }), isMarkEnabled(sdk.field, Contentful.MARKS.CODE) && /*#__PURE__*/React__default.createElement(ToolbarCodeButton, {
6734
7032
  isDisabled: isDisabled
6735
7033
  }), validationInfo.isAnyHyperlinkEnabled && /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("span", {
6736
- className: styles$h.divider
7034
+ className: styles$k.divider
6737
7035
  }), /*#__PURE__*/React__default.createElement(ToolbarHyperlinkButton, {
6738
7036
  isDisabled: isDisabled
6739
7037
  })), validationInfo.isAnyBlockFormattingEnabled && /*#__PURE__*/React__default.createElement("span", {
6740
- className: styles$h.divider
7038
+ className: styles$k.divider
6741
7039
  }), /*#__PURE__*/React__default.createElement(ToolbarListButton, {
6742
7040
  isDisabled: isDisabled || !canInsertBlocks
6743
7041
  }), isNodeTypeEnabled(sdk.field, Contentful.BLOCKS.QUOTE) && /*#__PURE__*/React__default.createElement(ToolbarQuoteButton, {
@@ -6747,7 +7045,7 @@ var Toolbar = function Toolbar(_ref) {
6747
7045
  }), isNodeTypeEnabled(sdk.field, Contentful.BLOCKS.TABLE) && /*#__PURE__*/React__default.createElement(ToolbarTableButton, {
6748
7046
  isDisabled: shouldDisableTables
6749
7047
  })), /*#__PURE__*/React__default.createElement("div", {
6750
- className: styles$h.embedActionsWrapper
7048
+ className: styles$k.embedActionsWrapper
6751
7049
  }, /*#__PURE__*/React__default.createElement(EmbedEntityWidget, {
6752
7050
  isDisabled: isDisabled,
6753
7051
  canInsertBlocks: canInsertBlocks
@@ -6772,7 +7070,7 @@ function getValidationInfo(field) {
6772
7070
  }
6773
7071
 
6774
7072
  var _templateObject$b;
6775
- var styles$i = {
7073
+ var styles$l = {
6776
7074
  nativeSticky: /*#__PURE__*/emotion.css(_templateObject$b || (_templateObject$b = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n position: -webkit-sticky;\n position: sticky;\n top: -1px;\n z-index: 2;\n "])))
6777
7075
  };
6778
7076
 
@@ -6780,7 +7078,7 @@ var StickyToolbarWrapper = function StickyToolbarWrapper(_ref) {
6780
7078
  var isDisabled = _ref.isDisabled,
6781
7079
  children = _ref.children;
6782
7080
  return /*#__PURE__*/React__default.createElement("div", {
6783
- className: isDisabled ? '' : styles$i.nativeSticky
7081
+ className: isDisabled ? '' : styles$l.nativeSticky
6784
7082
  }, children);
6785
7083
  };
6786
7084
 
@@ -6875,9 +7173,9 @@ var ConnectedRichTextEditor = function ConnectedRichTextEditor(props) {
6875
7173
  setPendingExternalUpdate(true);
6876
7174
  setEditorContent(editor, documentToEditorValue(props.value));
6877
7175
  }, [props.value, id]);
6878
- var classNames = emotion.cx(styles$g.editor, props.minHeight !== undefined ? emotion.css({
7176
+ var classNames = emotion.cx(styles$j.editor, props.minHeight !== undefined ? emotion.css({
6879
7177
  minHeight: props.minHeight
6880
- }) : undefined, props.isDisabled ? styles$g.disabled : styles$g.enabled, props.isToolbarHidden && styles$g.hiddenToolbar);
7178
+ }) : undefined, props.isDisabled ? styles$j.disabled : styles$j.enabled, props.isToolbarHidden && styles$j.hiddenToolbar);
6881
7179
  React.useEffect(function () {
6882
7180
  if (!isFirstRender) {
6883
7181
  return;
@@ -6893,7 +7191,7 @@ var ConnectedRichTextEditor = function ConnectedRichTextEditor(props) {
6893
7191
  }, /*#__PURE__*/React__default.createElement(ContentfulEditorIdProvider, {
6894
7192
  value: id
6895
7193
  }, /*#__PURE__*/React__default.createElement("div", {
6896
- className: styles$g.root,
7194
+ className: styles$j.root,
6897
7195
  "data-test-id": "rich-text-editor"
6898
7196
  }, /*#__PURE__*/React__default.createElement(plateCore.Plate, {
6899
7197
  id: id,