@contentful/field-editor-rich-text 3.2.0 → 3.2.2

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.
@@ -2,7 +2,7 @@ import React__default, { createContext, useContext, useMemo, useState, useEffect
2
2
  import { MissingEntityCard, WrappedAssetCard, useEntity, useEntityLoader, WrappedEntryCard, ScheduledIconWithTooltip, EntityProvider, getScheduleTooltipContent } from '@contentful/field-editor-reference';
3
3
  import { entityHelpers, ModalDialogLauncher, FieldConnector } from '@contentful/field-editor-shared';
4
4
  import { BLOCKS, INLINES, TEXT_CONTAINERS, HEADINGS, LIST_ITEM_BLOCKS, MARKS, CONTAINERS, TOP_LEVEL_BLOCKS, VOID_BLOCKS, EMPTY_DOCUMENT } from '@contentful/rich-text-types';
5
- import { usePlateEditorRef, usePlateEditorState, toggleNodeType, getText, getAbove, removeMark, setMarks, isMarkActive, getNodes, setNodes, isAncestorEmpty, match, getLastChildPath, wrapNodes, getPluginType, unwrapNodes, isCollapsed, isRangeAcrossBlocks, ELEMENT_DEFAULT, findNode, getParent, getBlockAbove, isSelectionAtBlockStart, isSelectionAtBlockEnd, isFirstChild, insertNodes, moveChildren, isBlockAboveEmpty, mockPlugin, deleteFragment, toggleMark, someHtmlElement, KEY_DESERIALIZE_HTML, hasSingleChild, isLastChild, someNode, getChildren as getChildren$1, queryNode, createDeserializeHtmlPlugin, createDeserializeAstPlugin, createPlateEditor, getPlateSelectors, getPlateActions, Plate } from '@udecode/plate-core';
5
+ import { usePlateEditorRef, usePlateEditorState, toggleNodeType, getText, getAbove, removeMark, setMarks, isMarkActive, getNodes, setNodes, isAncestorEmpty, match, getLastChildPath, wrapNodes, getPluginType, unwrapNodes, isCollapsed, isRangeAcrossBlocks, ELEMENT_DEFAULT, findNode, getParent, getBlockAbove, isSelectionAtBlockStart, isSelectionAtBlockEnd, isFirstChild, insertNodes, moveChildren, isBlockAboveEmpty, mockPlugin, deleteFragment, toggleMark, someHtmlElement, KEY_DESERIALIZE_HTML, hasSingleChild, isLastChild, someNode, getChildren as getChildren$1, unsetNodes, queryNode, createDeserializeHtmlPlugin, createDeserializeAstPlugin, createPlateEditor, getPlateSelectors, getPlateActions, Plate } from '@udecode/plate-core';
6
6
  import { css, cx } from 'emotion';
7
7
  import areEqual from 'fast-deep-equal';
8
8
  import noop from 'lodash-es/noop';
@@ -5306,13 +5306,21 @@ var createUnderlinePlugin = function createUnderlinePlugin() {
5306
5306
  });
5307
5307
  };
5308
5308
 
5309
+ var styles$f = {
5310
+ superscript: /*#__PURE__*/css({
5311
+ verticalAlign: 'super',
5312
+ fontSize: 'smaller'
5313
+ })
5314
+ };
5309
5315
  var ToolbarSuperscriptButton = /*#__PURE__*/createMarkToolbarButton({
5310
5316
  title: 'Superscript',
5311
5317
  mark: MARKS.SUPERSCRIPT,
5312
5318
  icon: /*#__PURE__*/createElement(SuperscriptIcon, null)
5313
5319
  });
5314
5320
  function Superscript(props) {
5315
- return /*#__PURE__*/createElement("sup", _extends({}, props.attributes), props.children);
5321
+ return /*#__PURE__*/createElement("sup", _extends({}, props.attributes, {
5322
+ className: styles$f.superscript
5323
+ }), props.children);
5316
5324
  }
5317
5325
  var createSuperscriptPlugin = function createSuperscriptPlugin() {
5318
5326
  return createSuperscriptPlugin$1({
@@ -5329,6 +5337,12 @@ var createSuperscriptPlugin = function createSuperscriptPlugin() {
5329
5337
  });
5330
5338
  };
5331
5339
 
5340
+ var styles$g = {
5341
+ subscript: /*#__PURE__*/css({
5342
+ verticalAlign: 'sub',
5343
+ fontSize: 'smaller'
5344
+ })
5345
+ };
5332
5346
  var ToolbarSubscriptButton = /*#__PURE__*/createMarkToolbarButton({
5333
5347
  title: 'Subscript',
5334
5348
  mark: MARKS.SUBSCRIPT,
@@ -5337,7 +5351,9 @@ var ToolbarSubscriptButton = /*#__PURE__*/createMarkToolbarButton({
5337
5351
  })
5338
5352
  });
5339
5353
  function Subscript(props) {
5340
- return /*#__PURE__*/createElement("sub", _extends({}, props.attributes), props.children);
5354
+ return /*#__PURE__*/createElement("sub", _extends({}, props.attributes, {
5355
+ className: styles$g.subscript
5356
+ }), props.children);
5341
5357
  }
5342
5358
  var createSubscriptPlugin = function createSubscriptPlugin() {
5343
5359
  return createSubscriptPlugin$1({
@@ -5565,10 +5581,10 @@ var createNormalizerPlugin = function createNormalizerPlugin() {
5565
5581
  };
5566
5582
 
5567
5583
  var _templateObject$6, _styles$1;
5568
- var styles$f = (_styles$1 = {}, _styles$1[BLOCKS.PARAGRAPH] = /*#__PURE__*/css(_templateObject$6 || (_templateObject$6 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n line-height: ", ";\n margin-bottom: 1.5em;\n "])), tokens.lineHeightDefault), _styles$1);
5584
+ var styles$h = (_styles$1 = {}, _styles$1[BLOCKS.PARAGRAPH] = /*#__PURE__*/css(_templateObject$6 || (_templateObject$6 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n line-height: ", ";\n margin-bottom: 1.5em;\n "])), tokens.lineHeightDefault), _styles$1);
5569
5585
  function Paragraph(props) {
5570
5586
  return /*#__PURE__*/createElement("div", _extends({}, props.attributes, {
5571
- className: styles$f[BLOCKS.PARAGRAPH]
5587
+ className: styles$h[BLOCKS.PARAGRAPH]
5572
5588
  }), props.children);
5573
5589
  }
5574
5590
 
@@ -6210,7 +6226,7 @@ var isTable = function isTable(node) {
6210
6226
  return Element.isElement(node) && node.type === BLOCKS.TABLE;
6211
6227
  };
6212
6228
 
6213
- var styles$g = {
6229
+ var styles$i = {
6214
6230
  topRight: /*#__PURE__*/css({
6215
6231
  position: 'absolute',
6216
6232
  top: '6px',
@@ -6299,7 +6315,7 @@ var TableActions = function TableActions() {
6299
6315
  size: "small",
6300
6316
  variant: "transparent",
6301
6317
  tabIndex: -1,
6302
- className: styles$g.topRight,
6318
+ className: styles$i.topRight,
6303
6319
  icon: /*#__PURE__*/React__default.createElement(ChevronDownIcon, null),
6304
6320
  "aria-label": "Open table menu",
6305
6321
  testId: "cf-table-actions-button"
@@ -6903,7 +6919,11 @@ function ToolbarTableButton(props) {
6903
6919
  }, /*#__PURE__*/createElement(TableIcon, null));
6904
6920
  }
6905
6921
 
6906
- function createTextPlugin() {
6922
+ function createTextPlugin(restrictedMarks) {
6923
+ if (restrictedMarks === void 0) {
6924
+ restrictedMarks = [];
6925
+ }
6926
+
6907
6927
  return {
6908
6928
  key: 'TextPlugin',
6909
6929
  handlers: {
@@ -6968,7 +6988,22 @@ function createTextPlugin() {
6968
6988
 
6969
6989
  fixPasteAsPlainText(editor);
6970
6990
  return editor;
6971
- }
6991
+ },
6992
+ normalizer: [{
6993
+ match: Text.isText,
6994
+ transform: function transform(editor, _ref) {
6995
+ var path = _ref[1];
6996
+ unsetNodes(editor, restrictedMarks, {
6997
+ at: path
6998
+ });
6999
+ },
7000
+ validNode: function validNode(_editor, _ref2) {
7001
+ var node = _ref2[0];
7002
+ return !restrictedMarks.some(function (mark) {
7003
+ return mark in node;
7004
+ });
7005
+ }
7006
+ }]
6972
7007
  };
6973
7008
  }
6974
7009
 
@@ -7098,7 +7133,7 @@ var createVoidsPlugin = function createVoidsPlugin() {
7098
7133
  };
7099
7134
  };
7100
7135
 
7101
- var getPlugins = function getPlugins(sdk, onAction) {
7136
+ var getPlugins = function getPlugins(sdk, onAction, restrictedMarks) {
7102
7137
  return [// AST must come after the HTML deserializer
7103
7138
  createDeserializeHtmlPlugin(), createDeserializeAstPlugin(), createDeserializeDocxPlugin(), // Tracking - This should come first so all plugins below will have access to `editor.tracking`
7104
7139
  createTrackingPlugin(onAction), // Global / Global shortcuts
@@ -7106,7 +7141,7 @@ var getPlugins = function getPlugins(sdk, onAction) {
7106
7141
  createParagraphPlugin(), createListPlugin(), createHrPlugin(), createHeadingPlugin(), createQuotePlugin(), createTablePlugin(), createEmbeddedEntryBlockPlugin(sdk), createEmbeddedAssetBlockPlugin(sdk), // Inline elements
7107
7142
  createHyperlinkPlugin(sdk), createEmbeddedEntityInlinePlugin(sdk), // Marks
7108
7143
  createMarksPlugin(), // Other
7109
- createTrailingParagraphPlugin(), createTextPlugin(), createVoidsPlugin(), createSelectOnBackspacePlugin(), // Pasting content from other sources
7144
+ createTrailingParagraphPlugin(), createTextPlugin(restrictedMarks), createVoidsPlugin(), createSelectOnBackspacePlugin(), // Pasting content from other sources
7110
7145
  createPasteHTMLPlugin(), // These plugins drive their configurations from the list of plugins
7111
7146
  // above. They MUST come last.
7112
7147
  createSoftBreakPlugin(), createExitBreakPlugin(), createResetNodePlugin(), createNormalizerPlugin()];
@@ -7229,7 +7264,7 @@ var normalizeEditorValue = function normalizeEditorValue(value, options) {
7229
7264
  };
7230
7265
 
7231
7266
  var STYLE_EDITOR_BORDER = "1px solid " + tokens.gray400;
7232
- var styles$h = {
7267
+ var styles$j = {
7233
7268
  root: /*#__PURE__*/css({
7234
7269
  position: 'relative'
7235
7270
  }),
@@ -7346,7 +7381,7 @@ var EmbedEntityWidget = function EmbedEntityWidget(_ref) {
7346
7381
  }, actions) : null;
7347
7382
  };
7348
7383
 
7349
- var styles$i = {
7384
+ var styles$k = {
7350
7385
  toolbar: /*#__PURE__*/css({
7351
7386
  border: "1px solid " + tokens.gray400,
7352
7387
  backgroundColor: tokens.gray100,
@@ -7391,14 +7426,14 @@ var Toolbar = function Toolbar(_ref) {
7391
7426
  var shouldDisableTables = isDisabled || !canInsertBlocks || isListSelected || isBlockquoteSelected;
7392
7427
  return /*#__PURE__*/React__default.createElement(Flex, {
7393
7428
  testId: "toolbar",
7394
- className: styles$i.toolbar,
7429
+ className: styles$k.toolbar,
7395
7430
  alignItems: "center"
7396
7431
  }, /*#__PURE__*/React__default.createElement("div", {
7397
- className: styles$i.formattingOptionsWrapper
7432
+ className: styles$k.formattingOptionsWrapper
7398
7433
  }, /*#__PURE__*/React__default.createElement(ToolbarHeadingButton, {
7399
7434
  isDisabled: isDisabled || !canInsertBlocks
7400
7435
  }), validationInfo.isAnyMarkEnabled && /*#__PURE__*/React__default.createElement("span", {
7401
- className: styles$i.divider
7436
+ className: styles$k.divider
7402
7437
  }), isMarkEnabled(sdk.field, MARKS.BOLD) && /*#__PURE__*/React__default.createElement(ToolbarBoldButton, {
7403
7438
  isDisabled: isDisabled
7404
7439
  }), isMarkEnabled(sdk.field, MARKS.ITALIC) && /*#__PURE__*/React__default.createElement(ToolbarItalicButton, {
@@ -7412,11 +7447,11 @@ var Toolbar = function Toolbar(_ref) {
7412
7447
  }), isMarkEnabled(sdk.field, MARKS.CODE) && /*#__PURE__*/React__default.createElement(ToolbarCodeButton, {
7413
7448
  isDisabled: isDisabled
7414
7449
  }), validationInfo.isAnyHyperlinkEnabled && /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("span", {
7415
- className: styles$i.divider
7450
+ className: styles$k.divider
7416
7451
  }), /*#__PURE__*/React__default.createElement(ToolbarHyperlinkButton, {
7417
7452
  isDisabled: isDisabled
7418
7453
  })), validationInfo.isAnyBlockFormattingEnabled && /*#__PURE__*/React__default.createElement("span", {
7419
- className: styles$i.divider
7454
+ className: styles$k.divider
7420
7455
  }), /*#__PURE__*/React__default.createElement(ToolbarListButton, {
7421
7456
  isDisabled: isDisabled || !canInsertBlocks
7422
7457
  }), isNodeTypeEnabled(sdk.field, BLOCKS.QUOTE) && /*#__PURE__*/React__default.createElement(ToolbarQuoteButton, {
@@ -7426,7 +7461,7 @@ var Toolbar = function Toolbar(_ref) {
7426
7461
  }), isNodeTypeEnabled(sdk.field, BLOCKS.TABLE) && /*#__PURE__*/React__default.createElement(ToolbarTableButton, {
7427
7462
  isDisabled: shouldDisableTables
7428
7463
  })), /*#__PURE__*/React__default.createElement("div", {
7429
- className: styles$i.embedActionsWrapper
7464
+ className: styles$k.embedActionsWrapper
7430
7465
  }, /*#__PURE__*/React__default.createElement(EmbedEntityWidget, {
7431
7466
  isDisabled: isDisabled,
7432
7467
  canInsertBlocks: canInsertBlocks
@@ -7451,7 +7486,7 @@ function getValidationInfo(field) {
7451
7486
  }
7452
7487
 
7453
7488
  var _templateObject$b;
7454
- var styles$j = {
7489
+ var styles$l = {
7455
7490
  nativeSticky: /*#__PURE__*/css(_templateObject$b || (_templateObject$b = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n position: -webkit-sticky;\n position: sticky;\n top: -1px;\n z-index: 2;\n "])))
7456
7491
  };
7457
7492
 
@@ -7459,7 +7494,7 @@ var StickyToolbarWrapper = function StickyToolbarWrapper(_ref) {
7459
7494
  var isDisabled = _ref.isDisabled,
7460
7495
  children = _ref.children;
7461
7496
  return /*#__PURE__*/React__default.createElement("div", {
7462
- className: isDisabled ? '' : styles$j.nativeSticky
7497
+ className: isDisabled ? '' : styles$l.nativeSticky
7463
7498
  }, children);
7464
7499
  };
7465
7500
 
@@ -7526,14 +7561,14 @@ var useOnValueChanged = function useOnValueChanged(_ref) {
7526
7561
  }, [editorId, onChange, skip, onSkip]);
7527
7562
  };
7528
7563
 
7529
- var _excluded = ["sdk", "isInitiallyDisabled", "onAction"];
7564
+ var _excluded = ["sdk", "isInitiallyDisabled", "onAction", "restrictedMarks"];
7530
7565
  var ConnectedRichTextEditor = function ConnectedRichTextEditor(props) {
7531
7566
  var id = getContentfulEditorId(props.sdk);
7532
7567
  var plugins = React__default.useMemo(function () {
7533
7568
  var _props$onAction;
7534
7569
 
7535
- return getPlugins(props.sdk, (_props$onAction = props.onAction) != null ? _props$onAction : noop);
7536
- }, [props.sdk, props.onAction]);
7570
+ return getPlugins(props.sdk, (_props$onAction = props.onAction) != null ? _props$onAction : noop, props.restrictedMarks);
7571
+ }, [props.sdk, props.onAction, props.restrictedMarks]);
7537
7572
 
7538
7573
  var _useState = useState(true),
7539
7574
  isFirstRender = _useState[0],
@@ -7572,9 +7607,9 @@ var ConnectedRichTextEditor = function ConnectedRichTextEditor(props) {
7572
7607
  setPendingExternalUpdate(true);
7573
7608
  setEditorContent(editor, documentToEditorValue(props.value));
7574
7609
  }, [props.value, id]);
7575
- var classNames = cx(styles$h.editor, props.minHeight !== undefined ? css({
7610
+ var classNames = cx(styles$j.editor, props.minHeight !== undefined ? css({
7576
7611
  minHeight: props.minHeight
7577
- }) : undefined, props.isDisabled ? styles$h.disabled : styles$h.enabled, props.isToolbarHidden && styles$h.hiddenToolbar);
7612
+ }) : undefined, props.isDisabled ? styles$j.disabled : styles$j.enabled, props.isToolbarHidden && styles$j.hiddenToolbar);
7578
7613
  useEffect(function () {
7579
7614
  if (!isFirstRender) {
7580
7615
  return;
@@ -7590,7 +7625,7 @@ var ConnectedRichTextEditor = function ConnectedRichTextEditor(props) {
7590
7625
  }, /*#__PURE__*/React__default.createElement(ContentfulEditorIdProvider, {
7591
7626
  value: id
7592
7627
  }, /*#__PURE__*/React__default.createElement("div", {
7593
- className: styles$h.root,
7628
+ className: styles$j.root,
7594
7629
  "data-test-id": "rich-text-editor"
7595
7630
  }, /*#__PURE__*/React__default.createElement(Plate, {
7596
7631
  id: id,
@@ -7612,6 +7647,7 @@ var RichTextEditor = function RichTextEditor(props) {
7612
7647
  var sdk = props.sdk,
7613
7648
  isInitiallyDisabled = props.isInitiallyDisabled,
7614
7649
  onAction = props.onAction,
7650
+ restrictedMarks = props.restrictedMarks,
7615
7651
  otherProps = _objectWithoutPropertiesLoose(props, _excluded);
7616
7652
 
7617
7653
  var isEmptyValue = useCallback(function (value) {
@@ -7636,7 +7672,8 @@ var RichTextEditor = function RichTextEditor(props) {
7636
7672
  sdk: sdk,
7637
7673
  onAction: onAction,
7638
7674
  isDisabled: disabled,
7639
- onChange: setValue
7675
+ onChange: setValue,
7676
+ restrictedMarks: restrictedMarks
7640
7677
  }));
7641
7678
  }));
7642
7679
  };