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

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,7 +20,7 @@ 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, SuperscriptIcon, SubscriptIcon, 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, MoreHorizontalIcon } 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
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';
@@ -5113,6 +5113,12 @@ var buildMarkEventHandler = function buildMarkEventHandler(type) {
5113
5113
  };
5114
5114
  };
5115
5115
 
5116
+ var styles$c = {
5117
+ isActive: /*#__PURE__*/css({
5118
+ backgroundColor: tokens.blue100,
5119
+ color: tokens.blue600
5120
+ })
5121
+ };
5116
5122
  var createMarkToolbarButton = function createMarkToolbarButton(_ref) {
5117
5123
  var mark = _ref.mark,
5118
5124
  title = _ref.title,
@@ -5131,6 +5137,18 @@ var createMarkToolbarButton = function createMarkToolbarButton(_ref) {
5131
5137
  focus(editor);
5132
5138
  }, [editor]);
5133
5139
  if (!editor) return null;
5140
+
5141
+ if (!icon) {
5142
+ var _cx;
5143
+
5144
+ return /*#__PURE__*/createElement(Menu.Item, {
5145
+ onClick: handleClick,
5146
+ disabled: isDisabled,
5147
+ className: cx((_cx = {}, _cx[styles$c.isActive] = isMarkActive(editor, mark), _cx)),
5148
+ testId: mark + "-toolbar-button"
5149
+ }, title);
5150
+ }
5151
+
5134
5152
  return /*#__PURE__*/createElement(ToolbarButton, {
5135
5153
  title: title,
5136
5154
  testId: mark + "-toolbar-button",
@@ -5149,14 +5167,14 @@ var ToolbarBoldButton = /*#__PURE__*/createMarkToolbarButton({
5149
5167
  mark: MARKS.BOLD,
5150
5168
  icon: /*#__PURE__*/createElement(FormatBoldIcon, null)
5151
5169
  });
5152
- var styles$c = {
5170
+ var styles$d = {
5153
5171
  bold: /*#__PURE__*/css({
5154
5172
  fontWeight: 600
5155
5173
  })
5156
5174
  };
5157
5175
  function Bold(props) {
5158
5176
  return /*#__PURE__*/createElement("strong", _extends({}, props.attributes, {
5159
- className: styles$c.bold
5177
+ className: styles$d.bold
5160
5178
  }), props.children);
5161
5179
  }
5162
5180
 
@@ -5196,7 +5214,11 @@ var ToolbarCodeButton = /*#__PURE__*/createMarkToolbarButton({
5196
5214
  mark: MARKS.CODE,
5197
5215
  icon: /*#__PURE__*/createElement(CodeIcon, null)
5198
5216
  });
5199
- var styles$d = {
5217
+ var ToolbarDropdownCodeButton = /*#__PURE__*/createMarkToolbarButton({
5218
+ title: 'Code',
5219
+ mark: MARKS.CODE
5220
+ });
5221
+ var styles$e = {
5200
5222
  code: /*#__PURE__*/css({
5201
5223
  fontFamily: 'monospace',
5202
5224
  fontSize: '.9em'
@@ -5204,7 +5226,7 @@ var styles$d = {
5204
5226
  };
5205
5227
  function Code(props) {
5206
5228
  return /*#__PURE__*/createElement("code", _extends({}, props.attributes, {
5207
- className: styles$d.code
5229
+ className: styles$e.code
5208
5230
  }), props.children);
5209
5231
  }
5210
5232
  var createCodePlugin = function createCodePlugin() {
@@ -5234,14 +5256,14 @@ var ToolbarItalicButton = /*#__PURE__*/createMarkToolbarButton({
5234
5256
  mark: MARKS.ITALIC,
5235
5257
  icon: /*#__PURE__*/createElement(FormatItalicIcon, null)
5236
5258
  });
5237
- var styles$e = {
5259
+ var styles$f = {
5238
5260
  italic: /*#__PURE__*/css({
5239
5261
  fontStyle: 'italic'
5240
5262
  })
5241
5263
  };
5242
5264
  function Italic(props) {
5243
5265
  return /*#__PURE__*/createElement("em", _extends({}, props.attributes, {
5244
- className: styles$e.italic
5266
+ className: styles$f.italic
5245
5267
  }), props.children);
5246
5268
  }
5247
5269
  var createItalicPlugin = function createItalicPlugin() {
@@ -5306,7 +5328,7 @@ var createUnderlinePlugin = function createUnderlinePlugin() {
5306
5328
  });
5307
5329
  };
5308
5330
 
5309
- var styles$f = {
5331
+ var styles$g = {
5310
5332
  superscript: /*#__PURE__*/css({
5311
5333
  verticalAlign: 'super',
5312
5334
  fontSize: 'smaller'
@@ -5317,9 +5339,13 @@ var ToolbarSuperscriptButton = /*#__PURE__*/createMarkToolbarButton({
5317
5339
  mark: MARKS.SUPERSCRIPT,
5318
5340
  icon: /*#__PURE__*/createElement(SuperscriptIcon, null)
5319
5341
  });
5342
+ var ToolbarDropdownSuperscriptButton = /*#__PURE__*/createMarkToolbarButton({
5343
+ title: 'Superscript',
5344
+ mark: MARKS.SUPERSCRIPT
5345
+ });
5320
5346
  function Superscript(props) {
5321
5347
  return /*#__PURE__*/createElement("sup", _extends({}, props.attributes, {
5322
- className: styles$f.superscript
5348
+ className: styles$g.superscript
5323
5349
  }), props.children);
5324
5350
  }
5325
5351
  var createSuperscriptPlugin = function createSuperscriptPlugin() {
@@ -5337,7 +5363,7 @@ var createSuperscriptPlugin = function createSuperscriptPlugin() {
5337
5363
  });
5338
5364
  };
5339
5365
 
5340
- var styles$g = {
5366
+ var styles$h = {
5341
5367
  subscript: /*#__PURE__*/css({
5342
5368
  verticalAlign: 'sub',
5343
5369
  fontSize: 'smaller'
@@ -5350,9 +5376,13 @@ var ToolbarSubscriptButton = /*#__PURE__*/createMarkToolbarButton({
5350
5376
  viewBox: "0 0 23 18"
5351
5377
  })
5352
5378
  });
5379
+ var ToolbarDropdownSubscriptButton = /*#__PURE__*/createMarkToolbarButton({
5380
+ title: 'Subscript',
5381
+ mark: MARKS.SUBSCRIPT
5382
+ });
5353
5383
  function Subscript(props) {
5354
5384
  return /*#__PURE__*/createElement("sub", _extends({}, props.attributes, {
5355
- className: styles$g.subscript
5385
+ className: styles$h.subscript
5356
5386
  }), props.children);
5357
5387
  }
5358
5388
  var createSubscriptPlugin = function createSubscriptPlugin() {
@@ -5581,10 +5611,10 @@ var createNormalizerPlugin = function createNormalizerPlugin() {
5581
5611
  };
5582
5612
 
5583
5613
  var _templateObject$6, _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);
5614
+ var styles$i = (_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);
5585
5615
  function Paragraph(props) {
5586
5616
  return /*#__PURE__*/createElement("div", _extends({}, props.attributes, {
5587
- className: styles$h[BLOCKS.PARAGRAPH]
5617
+ className: styles$i[BLOCKS.PARAGRAPH]
5588
5618
  }), props.children);
5589
5619
  }
5590
5620
 
@@ -6226,7 +6256,7 @@ var isTable = function isTable(node) {
6226
6256
  return Element.isElement(node) && node.type === BLOCKS.TABLE;
6227
6257
  };
6228
6258
 
6229
- var styles$i = {
6259
+ var styles$j = {
6230
6260
  topRight: /*#__PURE__*/css({
6231
6261
  position: 'absolute',
6232
6262
  top: '6px',
@@ -6315,7 +6345,7 @@ var TableActions = function TableActions() {
6315
6345
  size: "small",
6316
6346
  variant: "transparent",
6317
6347
  tabIndex: -1,
6318
- className: styles$i.topRight,
6348
+ className: styles$j.topRight,
6319
6349
  icon: /*#__PURE__*/React__default.createElement(ChevronDownIcon, null),
6320
6350
  "aria-label": "Open table menu",
6321
6351
  testId: "cf-table-actions-button"
@@ -7264,7 +7294,7 @@ var normalizeEditorValue = function normalizeEditorValue(value, options) {
7264
7294
  };
7265
7295
 
7266
7296
  var STYLE_EDITOR_BORDER = "1px solid " + tokens.gray400;
7267
- var styles$j = {
7297
+ var styles$k = {
7268
7298
  root: /*#__PURE__*/css({
7269
7299
  position: 'relative'
7270
7300
  }),
@@ -7381,13 +7411,19 @@ var EmbedEntityWidget = function EmbedEntityWidget(_ref) {
7381
7411
  }, actions) : null;
7382
7412
  };
7383
7413
 
7384
- var styles$k = {
7414
+ var styles$l = {
7385
7415
  toolbar: /*#__PURE__*/css({
7386
7416
  border: "1px solid " + tokens.gray400,
7387
7417
  backgroundColor: tokens.gray100,
7388
7418
  padding: tokens.spacingXs,
7389
7419
  borderRadius: tokens.borderRadiusMedium + " " + tokens.borderRadiusMedium + " 0 0"
7390
7420
  }),
7421
+ toolbarBtn: /*#__PURE__*/css({
7422
+ height: '30px',
7423
+ width: '30px',
7424
+ marginLeft: tokens.spacing2Xs,
7425
+ marginRight: tokens.spacing2Xs
7426
+ }),
7391
7427
  divider: /*#__PURE__*/css({
7392
7428
  display: 'inline-block',
7393
7429
  height: '21px',
@@ -7413,8 +7449,30 @@ var styles$k = {
7413
7449
  })
7414
7450
  };
7415
7451
 
7416
- var Toolbar = function Toolbar(_ref) {
7417
- var isDisabled = _ref.isDisabled;
7452
+ var Dropdown = function Dropdown(_ref) {
7453
+ var sdk = _ref.sdk,
7454
+ isDisabled = _ref.isDisabled;
7455
+ var editor = useContentfulEditor();
7456
+ var isActive = isMarkActive(editor, MARKS.SUPERSCRIPT) || isMarkActive(editor, MARKS.SUBSCRIPT) || isMarkActive(editor, MARKS.CODE);
7457
+ return /*#__PURE__*/React__default.createElement(Menu, null, /*#__PURE__*/React__default.createElement(Menu.Trigger, null, /*#__PURE__*/React__default.createElement("span", null, /*#__PURE__*/React__default.createElement(IconButton, {
7458
+ size: "small",
7459
+ className: styles$l.toolbarBtn,
7460
+ variant: isActive ? 'secondary' : 'transparent',
7461
+ icon: /*#__PURE__*/React__default.createElement(MoreHorizontalIcon, null),
7462
+ "aria-label": "toggle menu",
7463
+ isDisabled: isDisabled,
7464
+ testId: "dropdown-toolbar-button"
7465
+ }))), /*#__PURE__*/React__default.createElement(Menu.List, null, isMarkEnabled(sdk.field, MARKS.SUPERSCRIPT) && /*#__PURE__*/React__default.createElement(ToolbarDropdownSuperscriptButton, {
7466
+ isDisabled: isDisabled
7467
+ }), isMarkEnabled(sdk.field, MARKS.SUBSCRIPT) && /*#__PURE__*/React__default.createElement(ToolbarDropdownSubscriptButton, {
7468
+ isDisabled: isDisabled
7469
+ }), isMarkEnabled(sdk.field, MARKS.CODE) && /*#__PURE__*/React__default.createElement(ToolbarDropdownCodeButton, {
7470
+ isDisabled: isDisabled
7471
+ })));
7472
+ };
7473
+
7474
+ var Toolbar = function Toolbar(_ref2) {
7475
+ var isDisabled = _ref2.isDisabled;
7418
7476
  var sdk = useSdkContext();
7419
7477
  var editor = useContentfulEditor();
7420
7478
  var canInsertBlocks = !isNodeTypeSelected(editor, BLOCKS.TABLE);
@@ -7423,35 +7481,42 @@ var Toolbar = function Toolbar(_ref) {
7423
7481
  }, [sdk.field]);
7424
7482
  var isListSelected = isNodeTypeSelected(editor, BLOCKS.UL_LIST) || isNodeTypeSelected(editor, BLOCKS.OL_LIST);
7425
7483
  var isBlockquoteSelected = isNodeTypeSelected(editor, BLOCKS.QUOTE);
7426
- var shouldDisableTables = isDisabled || !canInsertBlocks || isListSelected || isBlockquoteSelected;
7484
+ var shouldDisableTables = isDisabled || !canInsertBlocks || isListSelected || isBlockquoteSelected; // We only show the dropdown when: whenever at least bold , italic and underline are available; If nothing that would go inside the dropdown is available, we hide it
7485
+
7486
+ var boldItalicUnderlineAvailable = isMarkEnabled(sdk.field, MARKS.BOLD) || isMarkEnabled(sdk.field, MARKS.ITALIC) || isMarkEnabled(sdk.field, MARKS.UNDERLINE);
7487
+ var dropdownItemsAvailable = isMarkEnabled(sdk.field, MARKS.SUPERSCRIPT) || isMarkEnabled(sdk.field, MARKS.SUBSCRIPT) || isMarkEnabled(sdk.field, MARKS.CODE);
7488
+ var shouldShowDropdown = boldItalicUnderlineAvailable && dropdownItemsAvailable;
7427
7489
  return /*#__PURE__*/React__default.createElement(Flex, {
7428
7490
  testId: "toolbar",
7429
- className: styles$k.toolbar,
7491
+ className: styles$l.toolbar,
7430
7492
  alignItems: "center"
7431
7493
  }, /*#__PURE__*/React__default.createElement("div", {
7432
- className: styles$k.formattingOptionsWrapper
7494
+ className: styles$l.formattingOptionsWrapper
7433
7495
  }, /*#__PURE__*/React__default.createElement(ToolbarHeadingButton, {
7434
7496
  isDisabled: isDisabled || !canInsertBlocks
7435
7497
  }), validationInfo.isAnyMarkEnabled && /*#__PURE__*/React__default.createElement("span", {
7436
- className: styles$k.divider
7498
+ className: styles$l.divider
7437
7499
  }), isMarkEnabled(sdk.field, MARKS.BOLD) && /*#__PURE__*/React__default.createElement(ToolbarBoldButton, {
7438
7500
  isDisabled: isDisabled
7439
7501
  }), isMarkEnabled(sdk.field, MARKS.ITALIC) && /*#__PURE__*/React__default.createElement(ToolbarItalicButton, {
7440
7502
  isDisabled: isDisabled
7441
- }), isMarkEnabled(sdk.field, MARKS.SUPERSCRIPT) && /*#__PURE__*/React__default.createElement(ToolbarSuperscriptButton, {
7503
+ }), isMarkEnabled(sdk.field, MARKS.UNDERLINE) && /*#__PURE__*/React__default.createElement(ToolbarUnderlineButton, {
7442
7504
  isDisabled: isDisabled
7443
- }), isMarkEnabled(sdk.field, MARKS.SUBSCRIPT) && /*#__PURE__*/React__default.createElement(ToolbarSubscriptButton, {
7505
+ }), !boldItalicUnderlineAvailable && isMarkEnabled(sdk.field, MARKS.SUPERSCRIPT) && /*#__PURE__*/React__default.createElement(ToolbarSuperscriptButton, {
7444
7506
  isDisabled: isDisabled
7445
- }), isMarkEnabled(sdk.field, MARKS.UNDERLINE) && /*#__PURE__*/React__default.createElement(ToolbarUnderlineButton, {
7507
+ }), !boldItalicUnderlineAvailable && isMarkEnabled(sdk.field, MARKS.SUBSCRIPT) && /*#__PURE__*/React__default.createElement(ToolbarSubscriptButton, {
7446
7508
  isDisabled: isDisabled
7447
- }), isMarkEnabled(sdk.field, MARKS.CODE) && /*#__PURE__*/React__default.createElement(ToolbarCodeButton, {
7509
+ }), !boldItalicUnderlineAvailable && isMarkEnabled(sdk.field, MARKS.CODE) && /*#__PURE__*/React__default.createElement(ToolbarCodeButton, {
7510
+ isDisabled: isDisabled
7511
+ }), shouldShowDropdown && /*#__PURE__*/React__default.createElement(Dropdown, {
7512
+ sdk: sdk,
7448
7513
  isDisabled: isDisabled
7449
7514
  }), validationInfo.isAnyHyperlinkEnabled && /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("span", {
7450
- className: styles$k.divider
7515
+ className: styles$l.divider
7451
7516
  }), /*#__PURE__*/React__default.createElement(ToolbarHyperlinkButton, {
7452
7517
  isDisabled: isDisabled
7453
7518
  })), validationInfo.isAnyBlockFormattingEnabled && /*#__PURE__*/React__default.createElement("span", {
7454
- className: styles$k.divider
7519
+ className: styles$l.divider
7455
7520
  }), /*#__PURE__*/React__default.createElement(ToolbarListButton, {
7456
7521
  isDisabled: isDisabled || !canInsertBlocks
7457
7522
  }), isNodeTypeEnabled(sdk.field, BLOCKS.QUOTE) && /*#__PURE__*/React__default.createElement(ToolbarQuoteButton, {
@@ -7461,7 +7526,7 @@ var Toolbar = function Toolbar(_ref) {
7461
7526
  }), isNodeTypeEnabled(sdk.field, BLOCKS.TABLE) && /*#__PURE__*/React__default.createElement(ToolbarTableButton, {
7462
7527
  isDisabled: shouldDisableTables
7463
7528
  })), /*#__PURE__*/React__default.createElement("div", {
7464
- className: styles$k.embedActionsWrapper
7529
+ className: styles$l.embedActionsWrapper
7465
7530
  }, /*#__PURE__*/React__default.createElement(EmbedEntityWidget, {
7466
7531
  isDisabled: isDisabled,
7467
7532
  canInsertBlocks: canInsertBlocks
@@ -7486,7 +7551,7 @@ function getValidationInfo(field) {
7486
7551
  }
7487
7552
 
7488
7553
  var _templateObject$b;
7489
- var styles$l = {
7554
+ var styles$m = {
7490
7555
  nativeSticky: /*#__PURE__*/css(_templateObject$b || (_templateObject$b = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n position: -webkit-sticky;\n position: sticky;\n top: -1px;\n z-index: 2;\n "])))
7491
7556
  };
7492
7557
 
@@ -7494,7 +7559,7 @@ var StickyToolbarWrapper = function StickyToolbarWrapper(_ref) {
7494
7559
  var isDisabled = _ref.isDisabled,
7495
7560
  children = _ref.children;
7496
7561
  return /*#__PURE__*/React__default.createElement("div", {
7497
- className: isDisabled ? '' : styles$l.nativeSticky
7562
+ className: isDisabled ? '' : styles$m.nativeSticky
7498
7563
  }, children);
7499
7564
  };
7500
7565
 
@@ -7607,9 +7672,9 @@ var ConnectedRichTextEditor = function ConnectedRichTextEditor(props) {
7607
7672
  setPendingExternalUpdate(true);
7608
7673
  setEditorContent(editor, documentToEditorValue(props.value));
7609
7674
  }, [props.value, id]);
7610
- var classNames = cx(styles$j.editor, props.minHeight !== undefined ? css({
7675
+ var classNames = cx(styles$k.editor, props.minHeight !== undefined ? css({
7611
7676
  minHeight: props.minHeight
7612
- }) : undefined, props.isDisabled ? styles$j.disabled : styles$j.enabled, props.isToolbarHidden && styles$j.hiddenToolbar);
7677
+ }) : undefined, props.isDisabled ? styles$k.disabled : styles$k.enabled, props.isToolbarHidden && styles$k.hiddenToolbar);
7613
7678
  useEffect(function () {
7614
7679
  if (!isFirstRender) {
7615
7680
  return;
@@ -7625,7 +7690,7 @@ var ConnectedRichTextEditor = function ConnectedRichTextEditor(props) {
7625
7690
  }, /*#__PURE__*/React__default.createElement(ContentfulEditorIdProvider, {
7626
7691
  value: id
7627
7692
  }, /*#__PURE__*/React__default.createElement("div", {
7628
- className: styles$j.root,
7693
+ className: styles$k.root,
7629
7694
  "data-test-id": "rich-text-editor"
7630
7695
  }, /*#__PURE__*/React__default.createElement(Plate, {
7631
7696
  id: id,