@contentful/field-editor-rich-text 3.1.12 → 3.2.1

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.
@@ -20,10 +20,10 @@ import find from 'lodash-es/find';
20
20
  import flow from 'lodash-es/flow';
21
21
  import get from 'lodash-es/get';
22
22
  import tokens from '@contentful/f36-tokens';
23
- import { AssetIcon, EmbeddedEntryBlockIcon, ClockIcon, EmbeddedEntryInlineIcon, ChevronDownIcon, HorizontalRuleIcon, LinkIcon, ListBulletedIcon, ListNumberedIcon, FormatBoldIcon, CodeIcon, FormatItalicIcon, FormatUnderlinedIcon, QuoteIcon, TableIcon, PlusIcon } from '@contentful/f36-icons';
23
+ import { AssetIcon, EmbeddedEntryBlockIcon, ClockIcon, EmbeddedEntryInlineIcon, ChevronDownIcon, HorizontalRuleIcon, LinkIcon, ListBulletedIcon, ListNumberedIcon, FormatBoldIcon, CodeIcon, FormatItalicIcon, FormatUnderlinedIcon, SuperscriptIcon, SubscriptIcon, QuoteIcon, TableIcon, PlusIcon } from '@contentful/f36-icons';
24
24
  import { getListTypes, ELEMENT_LIC, getListItemEntry, isListNested, moveListItemUp, ELEMENT_LI, unwrapList as unwrapList$1, removeFirstListItem, removeListItem, deleteForwardList, deleteFragmentList, normalizeList, createListPlugin as createListPlugin$1, ELEMENT_UL, ELEMENT_OL } from '@udecode/plate-list';
25
25
  import castArray from 'lodash-es/castArray';
26
- import { createBoldPlugin as createBoldPlugin$1, createCodePlugin as createCodePlugin$1, createItalicPlugin as createItalicPlugin$1, createUnderlinePlugin as createUnderlinePlugin$1 } from '@udecode/plate-basic-marks';
26
+ import { createBoldPlugin as createBoldPlugin$1, createCodePlugin as createCodePlugin$1, createItalicPlugin as createItalicPlugin$1, createUnderlinePlugin as createUnderlinePlugin$1, createSuperscriptPlugin as createSuperscriptPlugin$1, createSubscriptPlugin as createSubscriptPlugin$1 } from '@udecode/plate-basic-marks';
27
27
  import isPlainObject from 'is-plain-obj';
28
28
  import { createParagraphPlugin as createParagraphPlugin$1 } from '@udecode/plate-paragraph';
29
29
  import { createSelectOnBackspacePlugin as createSelectOnBackspacePlugin$1 } from '@udecode/plate-select';
@@ -5089,6 +5089,30 @@ function ToolbarListButton(props) {
5089
5089
  }, /*#__PURE__*/createElement(ListNumberedIcon, null)));
5090
5090
  }
5091
5091
 
5092
+ var toggleMarkAndDeactivateConflictingMarks = function toggleMarkAndDeactivateConflictingMarks(editor, mark) {
5093
+ var subs = [MARKS.SUPERSCRIPT, MARKS.SUBSCRIPT];
5094
+ var clear = subs.includes(mark) ? subs : [];
5095
+ toggleMark(editor, {
5096
+ key: mark,
5097
+ clear: clear
5098
+ });
5099
+ };
5100
+ var buildMarkEventHandler = function buildMarkEventHandler(type) {
5101
+ return function (editor, _ref) {
5102
+ var hotkey = _ref.options.hotkey;
5103
+ return function (event) {
5104
+ if (editor.selection && hotkey && isHotkey(hotkey, event)) {
5105
+ event.preventDefault();
5106
+ var isActive = isMarkActive(editor, type);
5107
+ editor.tracking.onShortcutAction(isActive ? 'unmark' : 'mark', {
5108
+ markType: type
5109
+ });
5110
+ toggleMarkAndDeactivateConflictingMarks(editor, type);
5111
+ }
5112
+ };
5113
+ };
5114
+ };
5115
+
5092
5116
  var createMarkToolbarButton = function createMarkToolbarButton(_ref) {
5093
5117
  var mark = _ref.mark,
5094
5118
  title = _ref.title,
@@ -5103,9 +5127,7 @@ var createMarkToolbarButton = function createMarkToolbarButton(_ref) {
5103
5127
  editor.tracking.onToolbarAction(isActive ? 'unmark' : 'mark', {
5104
5128
  markType: mark
5105
5129
  });
5106
- toggleMark(editor, {
5107
- key: mark
5108
- });
5130
+ toggleMarkAndDeactivateConflictingMarks(editor, mark);
5109
5131
  focus(editor);
5110
5132
  }, [editor]);
5111
5133
  if (!editor) return null;
@@ -5122,24 +5144,6 @@ var createMarkToolbarButton = function createMarkToolbarButton(_ref) {
5122
5144
  return Mark;
5123
5145
  };
5124
5146
 
5125
- var buildMarkEventHandler = function buildMarkEventHandler(type) {
5126
- return function (editor, _ref) {
5127
- var hotkey = _ref.options.hotkey;
5128
- return function (event) {
5129
- if (editor.selection && hotkey && isHotkey(hotkey, event)) {
5130
- event.preventDefault();
5131
- var isActive = isMarkActive(editor, type);
5132
- editor.tracking.onShortcutAction(isActive ? 'unmark' : 'mark', {
5133
- markType: type
5134
- });
5135
- toggleMark(editor, {
5136
- key: type
5137
- });
5138
- }
5139
- };
5140
- };
5141
- };
5142
-
5143
5147
  var ToolbarBoldButton = /*#__PURE__*/createMarkToolbarButton({
5144
5148
  title: 'Bold',
5145
5149
  mark: MARKS.BOLD,
@@ -5302,10 +5306,74 @@ var createUnderlinePlugin = function createUnderlinePlugin() {
5302
5306
  });
5303
5307
  };
5304
5308
 
5309
+ var styles$f = {
5310
+ superscript: /*#__PURE__*/css({
5311
+ verticalAlign: 'super',
5312
+ fontSize: 'smaller'
5313
+ })
5314
+ };
5315
+ var ToolbarSuperscriptButton = /*#__PURE__*/createMarkToolbarButton({
5316
+ title: 'Superscript',
5317
+ mark: MARKS.SUPERSCRIPT,
5318
+ icon: /*#__PURE__*/createElement(SuperscriptIcon, null)
5319
+ });
5320
+ function Superscript(props) {
5321
+ return /*#__PURE__*/createElement("sup", _extends({}, props.attributes, {
5322
+ className: styles$f.superscript
5323
+ }), props.children);
5324
+ }
5325
+ var createSuperscriptPlugin = function createSuperscriptPlugin() {
5326
+ return createSuperscriptPlugin$1({
5327
+ type: MARKS.SUPERSCRIPT,
5328
+ component: Superscript,
5329
+ handlers: {
5330
+ onKeyDown: buildMarkEventHandler(MARKS.SUPERSCRIPT)
5331
+ },
5332
+ deserializeHtml: {
5333
+ rules: [{
5334
+ validNodeName: ['SUP']
5335
+ }]
5336
+ }
5337
+ });
5338
+ };
5339
+
5340
+ var styles$g = {
5341
+ subscript: /*#__PURE__*/css({
5342
+ verticalAlign: 'sub',
5343
+ fontSize: 'smaller'
5344
+ })
5345
+ };
5346
+ var ToolbarSubscriptButton = /*#__PURE__*/createMarkToolbarButton({
5347
+ title: 'Subscript',
5348
+ mark: MARKS.SUBSCRIPT,
5349
+ icon: /*#__PURE__*/createElement(SubscriptIcon, {
5350
+ viewBox: "0 0 23 18"
5351
+ })
5352
+ });
5353
+ function Subscript(props) {
5354
+ return /*#__PURE__*/createElement("sub", _extends({}, props.attributes, {
5355
+ className: styles$g.subscript
5356
+ }), props.children);
5357
+ }
5358
+ var createSubscriptPlugin = function createSubscriptPlugin() {
5359
+ return createSubscriptPlugin$1({
5360
+ type: MARKS.SUBSCRIPT,
5361
+ component: Subscript,
5362
+ handlers: {
5363
+ onKeyDown: buildMarkEventHandler(MARKS.SUBSCRIPT)
5364
+ },
5365
+ deserializeHtml: {
5366
+ rules: [{
5367
+ validNodeName: ['SUB']
5368
+ }]
5369
+ }
5370
+ });
5371
+ };
5372
+
5305
5373
  var createMarksPlugin = function createMarksPlugin() {
5306
5374
  return {
5307
5375
  key: 'Marks',
5308
- plugins: [createBoldPlugin(), createCodePlugin(), createItalicPlugin(), createUnderlinePlugin()]
5376
+ plugins: [createBoldPlugin(), createCodePlugin(), createItalicPlugin(), createUnderlinePlugin(), createSuperscriptPlugin(), createSubscriptPlugin()]
5309
5377
  };
5310
5378
  };
5311
5379
 
@@ -5513,10 +5581,10 @@ var createNormalizerPlugin = function createNormalizerPlugin() {
5513
5581
  };
5514
5582
 
5515
5583
  var _templateObject$6, _styles$1;
5516
- 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);
5517
5585
  function Paragraph(props) {
5518
5586
  return /*#__PURE__*/createElement("div", _extends({}, props.attributes, {
5519
- className: styles$f[BLOCKS.PARAGRAPH]
5587
+ className: styles$h[BLOCKS.PARAGRAPH]
5520
5588
  }), props.children);
5521
5589
  }
5522
5590
 
@@ -6158,7 +6226,7 @@ var isTable = function isTable(node) {
6158
6226
  return Element.isElement(node) && node.type === BLOCKS.TABLE;
6159
6227
  };
6160
6228
 
6161
- var styles$g = {
6229
+ var styles$i = {
6162
6230
  topRight: /*#__PURE__*/css({
6163
6231
  position: 'absolute',
6164
6232
  top: '6px',
@@ -6247,7 +6315,7 @@ var TableActions = function TableActions() {
6247
6315
  size: "small",
6248
6316
  variant: "transparent",
6249
6317
  tabIndex: -1,
6250
- className: styles$g.topRight,
6318
+ className: styles$i.topRight,
6251
6319
  icon: /*#__PURE__*/React__default.createElement(ChevronDownIcon, null),
6252
6320
  "aria-label": "Open table menu",
6253
6321
  testId: "cf-table-actions-button"
@@ -7177,7 +7245,7 @@ var normalizeEditorValue = function normalizeEditorValue(value, options) {
7177
7245
  };
7178
7246
 
7179
7247
  var STYLE_EDITOR_BORDER = "1px solid " + tokens.gray400;
7180
- var styles$h = {
7248
+ var styles$j = {
7181
7249
  root: /*#__PURE__*/css({
7182
7250
  position: 'relative'
7183
7251
  }),
@@ -7294,7 +7362,7 @@ var EmbedEntityWidget = function EmbedEntityWidget(_ref) {
7294
7362
  }, actions) : null;
7295
7363
  };
7296
7364
 
7297
- var styles$i = {
7365
+ var styles$k = {
7298
7366
  toolbar: /*#__PURE__*/css({
7299
7367
  border: "1px solid " + tokens.gray400,
7300
7368
  backgroundColor: tokens.gray100,
@@ -7339,28 +7407,32 @@ var Toolbar = function Toolbar(_ref) {
7339
7407
  var shouldDisableTables = isDisabled || !canInsertBlocks || isListSelected || isBlockquoteSelected;
7340
7408
  return /*#__PURE__*/React__default.createElement(Flex, {
7341
7409
  testId: "toolbar",
7342
- className: styles$i.toolbar,
7410
+ className: styles$k.toolbar,
7343
7411
  alignItems: "center"
7344
7412
  }, /*#__PURE__*/React__default.createElement("div", {
7345
- className: styles$i.formattingOptionsWrapper
7413
+ className: styles$k.formattingOptionsWrapper
7346
7414
  }, /*#__PURE__*/React__default.createElement(ToolbarHeadingButton, {
7347
7415
  isDisabled: isDisabled || !canInsertBlocks
7348
7416
  }), validationInfo.isAnyMarkEnabled && /*#__PURE__*/React__default.createElement("span", {
7349
- className: styles$i.divider
7417
+ className: styles$k.divider
7350
7418
  }), isMarkEnabled(sdk.field, MARKS.BOLD) && /*#__PURE__*/React__default.createElement(ToolbarBoldButton, {
7351
7419
  isDisabled: isDisabled
7352
7420
  }), isMarkEnabled(sdk.field, MARKS.ITALIC) && /*#__PURE__*/React__default.createElement(ToolbarItalicButton, {
7353
7421
  isDisabled: isDisabled
7422
+ }), isMarkEnabled(sdk.field, MARKS.SUPERSCRIPT) && /*#__PURE__*/React__default.createElement(ToolbarSuperscriptButton, {
7423
+ isDisabled: isDisabled
7424
+ }), isMarkEnabled(sdk.field, MARKS.SUBSCRIPT) && /*#__PURE__*/React__default.createElement(ToolbarSubscriptButton, {
7425
+ isDisabled: isDisabled
7354
7426
  }), isMarkEnabled(sdk.field, MARKS.UNDERLINE) && /*#__PURE__*/React__default.createElement(ToolbarUnderlineButton, {
7355
7427
  isDisabled: isDisabled
7356
7428
  }), isMarkEnabled(sdk.field, MARKS.CODE) && /*#__PURE__*/React__default.createElement(ToolbarCodeButton, {
7357
7429
  isDisabled: isDisabled
7358
7430
  }), validationInfo.isAnyHyperlinkEnabled && /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("span", {
7359
- className: styles$i.divider
7431
+ className: styles$k.divider
7360
7432
  }), /*#__PURE__*/React__default.createElement(ToolbarHyperlinkButton, {
7361
7433
  isDisabled: isDisabled
7362
7434
  })), validationInfo.isAnyBlockFormattingEnabled && /*#__PURE__*/React__default.createElement("span", {
7363
- className: styles$i.divider
7435
+ className: styles$k.divider
7364
7436
  }), /*#__PURE__*/React__default.createElement(ToolbarListButton, {
7365
7437
  isDisabled: isDisabled || !canInsertBlocks
7366
7438
  }), isNodeTypeEnabled(sdk.field, BLOCKS.QUOTE) && /*#__PURE__*/React__default.createElement(ToolbarQuoteButton, {
@@ -7370,7 +7442,7 @@ var Toolbar = function Toolbar(_ref) {
7370
7442
  }), isNodeTypeEnabled(sdk.field, BLOCKS.TABLE) && /*#__PURE__*/React__default.createElement(ToolbarTableButton, {
7371
7443
  isDisabled: shouldDisableTables
7372
7444
  })), /*#__PURE__*/React__default.createElement("div", {
7373
- className: styles$i.embedActionsWrapper
7445
+ className: styles$k.embedActionsWrapper
7374
7446
  }, /*#__PURE__*/React__default.createElement(EmbedEntityWidget, {
7375
7447
  isDisabled: isDisabled,
7376
7448
  canInsertBlocks: canInsertBlocks
@@ -7395,7 +7467,7 @@ function getValidationInfo(field) {
7395
7467
  }
7396
7468
 
7397
7469
  var _templateObject$b;
7398
- var styles$j = {
7470
+ var styles$l = {
7399
7471
  nativeSticky: /*#__PURE__*/css(_templateObject$b || (_templateObject$b = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n position: -webkit-sticky;\n position: sticky;\n top: -1px;\n z-index: 2;\n "])))
7400
7472
  };
7401
7473
 
@@ -7403,7 +7475,7 @@ var StickyToolbarWrapper = function StickyToolbarWrapper(_ref) {
7403
7475
  var isDisabled = _ref.isDisabled,
7404
7476
  children = _ref.children;
7405
7477
  return /*#__PURE__*/React__default.createElement("div", {
7406
- className: isDisabled ? '' : styles$j.nativeSticky
7478
+ className: isDisabled ? '' : styles$l.nativeSticky
7407
7479
  }, children);
7408
7480
  };
7409
7481
 
@@ -7516,9 +7588,9 @@ var ConnectedRichTextEditor = function ConnectedRichTextEditor(props) {
7516
7588
  setPendingExternalUpdate(true);
7517
7589
  setEditorContent(editor, documentToEditorValue(props.value));
7518
7590
  }, [props.value, id]);
7519
- var classNames = cx(styles$h.editor, props.minHeight !== undefined ? css({
7591
+ var classNames = cx(styles$j.editor, props.minHeight !== undefined ? css({
7520
7592
  minHeight: props.minHeight
7521
- }) : undefined, props.isDisabled ? styles$h.disabled : styles$h.enabled, props.isToolbarHidden && styles$h.hiddenToolbar);
7593
+ }) : undefined, props.isDisabled ? styles$j.disabled : styles$j.enabled, props.isToolbarHidden && styles$j.hiddenToolbar);
7522
7594
  useEffect(function () {
7523
7595
  if (!isFirstRender) {
7524
7596
  return;
@@ -7534,7 +7606,7 @@ var ConnectedRichTextEditor = function ConnectedRichTextEditor(props) {
7534
7606
  }, /*#__PURE__*/React__default.createElement(ContentfulEditorIdProvider, {
7535
7607
  value: id
7536
7608
  }, /*#__PURE__*/React__default.createElement("div", {
7537
- className: styles$h.root,
7609
+ className: styles$j.root,
7538
7610
  "data-test-id": "rich-text-editor"
7539
7611
  }, /*#__PURE__*/React__default.createElement(Plate, {
7540
7612
  id: id,