@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.
- package/CHANGELOG.md +12 -0
- package/dist/RichTextEditor.d.ts +1 -0
- package/dist/field-editor-rich-text.cjs.development.js +64 -27
- package/dist/field-editor-rich-text.cjs.development.js.map +1 -1
- package/dist/field-editor-rich-text.cjs.production.min.js +1 -1
- package/dist/field-editor-rich-text.cjs.production.min.js.map +1 -1
- package/dist/field-editor-rich-text.esm.js +65 -28
- package/dist/field-editor-rich-text.esm.js.map +1 -1
- package/dist/plugins/Text/createTextPlugin.d.ts +1 -1
- package/dist/plugins/index.d.ts +1 -1
- package/package.json +6 -6
|
@@ -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
|
|
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
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
7429
|
+
className: styles$k.toolbar,
|
|
7395
7430
|
alignItems: "center"
|
|
7396
7431
|
}, /*#__PURE__*/React__default.createElement("div", {
|
|
7397
|
-
className: styles$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
7610
|
+
var classNames = cx(styles$j.editor, props.minHeight !== undefined ? css({
|
|
7576
7611
|
minHeight: props.minHeight
|
|
7577
|
-
}) : undefined, props.isDisabled ? styles$
|
|
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$
|
|
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
|
};
|