@contentful/field-editor-rich-text 1.0.2 → 2.0.0-next.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.
- package/CHANGELOG.md +0 -8
- package/README.md +1 -1
- package/dist/ContentfulEditorProvider.d.ts +8 -0
- package/dist/RichTextEditor.d.ts +19 -60
- package/dist/RichTextEditor.styles.d.ts +7 -0
- package/dist/SdkProvider.d.ts +7 -0
- package/dist/Toolbar/EmbedEntityWidget.d.ts +6 -0
- package/dist/Toolbar/StickyToolbarWrapper.d.ts +6 -11
- package/dist/Toolbar/index.d.ts +6 -20
- package/dist/TrackingProvider.d.ts +11 -0
- package/dist/constants/Schema.d.ts +93 -11
- package/dist/dialogs/openRichTextDialog.d.ts +2 -1
- package/dist/dialogs/renderRichTextDialog.d.ts +3 -1
- package/dist/field-editor-rich-text.cjs.development.js +3967 -5304
- 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 +3937 -5274
- package/dist/field-editor-rich-text.esm.js.map +1 -1
- package/dist/helpers/deserializer.d.ts +3 -0
- package/dist/helpers/editor.d.ts +35 -0
- package/dist/helpers/formatDateAndTime.d.ts +15 -0
- package/dist/helpers/getLinkedContentTypeIdsForNodeType.d.ts +26 -2
- package/dist/helpers/newEntitySelectorConfigFromRichTextField.d.ts +5 -1
- package/dist/helpers/sanitizeSlateDoc.d.ts +18 -0
- package/dist/helpers/truncate.d.ts +1 -0
- package/dist/helpers/validations.d.ts +10 -0
- package/dist/plugins/Bold/index.d.ts +12 -64
- package/dist/plugins/Code/index.d.ts +12 -64
- package/dist/plugins/EmbeddedEntity/index.d.ts +10 -0
- package/dist/plugins/EmbeddedEntityBlock/LinkedEntityBlock.d.ts +13 -0
- package/dist/plugins/EmbeddedEntityBlock/ToolbarIcon.d.ts +12 -10
- package/dist/plugins/EmbeddedEntityBlock/Util.d.ts +2 -23
- package/dist/plugins/EmbeddedEntityBlock/index.d.ts +11 -26
- package/dist/plugins/EmbeddedEntityInline/FetchingWrappedInlineEntryCard.d.ts +12 -0
- package/dist/plugins/EmbeddedEntityInline/Util.d.ts +16 -0
- package/dist/plugins/EmbeddedEntityInline/index.d.ts +12 -0
- package/dist/plugins/Heading/index.d.ts +20 -380
- package/dist/plugins/Hr/index.d.ts +13 -61
- package/dist/plugins/Hyperlink/EntryAssetTooltip.d.ts +10 -0
- package/dist/plugins/Hyperlink/HyperlinkModal.d.ts +17 -0
- package/dist/plugins/Hyperlink/index.d.ts +12 -9
- package/dist/plugins/InsertBeforeFirstVoidBlock/index.d.ts +2 -3
- package/dist/plugins/Italic/index.d.ts +12 -64
- package/dist/plugins/List/index.d.ts +15 -114
- package/dist/plugins/NewLine/index.d.ts +2 -0
- package/dist/plugins/Paragraph/index.d.ts +7 -5
- package/dist/plugins/Paste/index.d.ts +2 -7
- package/dist/plugins/Paste/sanitizers/helpers.d.ts +7 -0
- package/dist/plugins/Paste/sanitizers/index.d.ts +3 -0
- package/dist/plugins/Paste/sanitizers/removeComments.d.ts +2 -0
- package/dist/plugins/Paste/sanitizers/sanitizeEntityBlocks.d.ts +6 -0
- package/dist/plugins/Paste/sanitizers/sanitizeTables.d.ts +2 -0
- package/dist/plugins/Quote/index.d.ts +13 -59
- package/dist/plugins/Table/TableActions.d.ts +5 -0
- package/dist/plugins/Table/actions/addColumn.d.ts +4 -0
- package/dist/plugins/Table/actions/addRow.d.ts +3 -0
- package/dist/plugins/Table/actions/index.d.ts +3 -0
- package/dist/plugins/Table/actions/setHeader.d.ts +2 -0
- package/dist/plugins/Table/helpers.d.ts +4 -0
- package/dist/plugins/Table/index.d.ts +186 -0
- package/dist/plugins/TrailingParagraph/index.d.ts +1 -0
- package/dist/plugins/Underline/index.d.ts +12 -0
- package/dist/plugins/shared/EntityStatusIcon.d.ts +8 -0
- package/dist/plugins/shared/FetchingWrappedAssetCard.d.ts +23 -0
- package/dist/plugins/shared/FetchingWrappedEntryCard.d.ts +13 -0
- package/dist/plugins/shared/ToolbarButton.d.ts +15 -0
- package/dist/types.d.ts +25 -0
- package/package.json +31 -29
- package/LICENSE +0 -21
- package/dist/RichTextEditor.spec.d.ts +0 -1
- package/dist/Toolbar/Toolbar.spec.d.ts +0 -1
- package/dist/helpers/browserSupport.d.ts +0 -1
- package/dist/plugins/CommandPalette/CommandMark.d.ts +0 -12
- package/dist/plugins/CommandPalette/CommandPalette.d.ts +0 -10
- package/dist/plugins/CommandPalette/CommandPaletteService.d.ts +0 -20
- package/dist/plugins/CommandPalette/CommandPanel/CommandPanelMenu.d.ts +0 -43
- package/dist/plugins/CommandPalette/CommandPanel/index.d.ts +0 -37
- package/dist/plugins/CommandPalette/Util.d.ts +0 -5
- package/dist/plugins/CommandPalette/index.d.ts +0 -7
- package/dist/plugins/EmbeddedEntityBlock/EmbeddedEntityBlock.d.ts +0 -20
- package/dist/plugins/EmbeddedEntityBlock/EmbeddedEntityBlock.styles.d.ts +0 -3
- package/dist/plugins/EmbeddedEntityBlock/FetchingWrappedAssetCard.d.ts +0 -15
- package/dist/plugins/EmbeddedEntityBlock/FetchingWrappedEntryCard.d.ts +0 -15
- package/dist/plugins/EmbeddedEntryInline/EmbeddedEntryInline.d.ts +0 -21
- package/dist/plugins/EmbeddedEntryInline/EmbeddedEntryInline.styles.d.ts +0 -4
- package/dist/plugins/EmbeddedEntryInline/FetchingWrappedInlineEntryCard.d.ts +0 -14
- package/dist/plugins/EmbeddedEntryInline/ToolbarIcon.d.ts +0 -11
- package/dist/plugins/EmbeddedEntryInline/Utils.d.ts +0 -4
- package/dist/plugins/EmbeddedEntryInline/index.d.ts +0 -12
- package/dist/plugins/EntryEmbedDropdown/index.d.ts +0 -14
- package/dist/plugins/Heading/HeadingDropdown.d.ts +0 -28
- package/dist/plugins/Heading/HeadingDropdownItem.d.ts +0 -57
- package/dist/plugins/Heading/Paragraph.d.ts +0 -58
- package/dist/plugins/Hyperlink/Hyperlink.d.ts +0 -13
- package/dist/plugins/Hyperlink/ToolbarIcon.d.ts +0 -7
- package/dist/plugins/Hyperlink/Util.d.ts +0 -43
- package/dist/plugins/Hyperlink/styles.d.ts +0 -12
- package/dist/plugins/Hyperlink/truncate.d.ts +0 -1
- package/dist/plugins/Hyperlink/useRequestStatus.d.ts +0 -6
- package/dist/plugins/InsertBeforeFirstVoidBlock/Util.d.ts +0 -14
- package/dist/plugins/List/EditListWrapper.d.ts +0 -2
- package/dist/plugins/List/ToolbarDecorator.d.ts +0 -62
- package/dist/plugins/NewLinePlugin/index.d.ts +0 -3
- package/dist/plugins/Paste/Paste.d.ts +0 -1
- package/dist/plugins/Paste/Paste.spec.d.ts +0 -1
- package/dist/plugins/Paste/index.spec.d.ts +0 -1
- package/dist/plugins/PasteHtml/PasteHtml.spec.d.ts +0 -1
- package/dist/plugins/PasteHtml/Serializer.d.ts +0 -1
- package/dist/plugins/PasteHtml/index.d.ts +0 -3
- package/dist/plugins/PasteText/PasteText.spec.d.ts +0 -1
- package/dist/plugins/PasteText/index.d.ts +0 -3
- package/dist/plugins/Quote/QuotePlugin.d.ts +0 -10
- package/dist/plugins/Quote/Util.d.ts +0 -2
- package/dist/plugins/Underlined/index.d.ts +0 -64
- package/dist/plugins/index.d.ts +0 -1
- package/dist/plugins/shared/BlockSelectDecorator.d.ts +0 -63
- package/dist/plugins/shared/BlockToggleDecorator.d.ts +0 -65
- package/dist/plugins/shared/MarkDecorator.d.ts +0 -12
- package/dist/plugins/shared/MarkPlugin.d.ts +0 -9
- package/dist/plugins/shared/MarkToggleDecorator.d.ts +0 -62
- package/dist/plugins/shared/NodeDecorator.d.ts +0 -15
- package/dist/plugins/shared/PasteTestHelpers.d.ts +0 -35
- package/dist/plugins/shared/PluginApi.d.ts +0 -31
- package/dist/plugins/shared/PropTypes.d.ts +0 -15
- package/dist/plugins/shared/ToolbarDropdownListItem.d.ts +0 -14
- package/dist/plugins/shared/ToolbarIcon.d.ts +0 -16
- package/dist/plugins/shared/Util.d.ts +0 -1
- package/dist/plugins/shared/UtilHave.d.ts +0 -24
- package/dist/setupTests.d.ts +0 -1
- package/dist/validations/index.d.ts +0 -9
- package/dist/validations/validations.spec.d.ts +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-editor-rich-text.cjs.production.min.js","sources":["../src/plugins/List/EditListWrapper.js","../src/constants/Schema.js","../src/plugins/shared/PluginApi.js","../src/plugins/shared/ToolbarIcon.js","../src/plugins/shared/PropTypes.js","../src/plugins/shared/UtilHave.js","../src/plugins/shared/MarkPlugin.js","../src/plugins/shared/MarkDecorator.js","../src/plugins/shared/Util.js","../src/plugins/shared/MarkToggleDecorator.js","../src/plugins/Bold/index.js","../src/plugins/Italic/index.js","../src/plugins/Underlined/index.js","../src/plugins/Code/index.js","../src/plugins/shared/BlockToggleDecorator.js","../src/plugins/Quote/Util.js","../src/plugins/shared/NodeDecorator.js","../src/plugins/Quote/QuotePlugin.js","../src/plugins/Quote/index.js","../../../node_modules/regenerator-runtime/runtime.js","../src/plugins/EmbeddedEntityBlock/FetchingWrappedEntryCard.js","../src/plugins/EmbeddedEntityBlock/FetchingWrappedAssetCard.js","../src/dialogs/HypelinkDialog/HyperlinkDialog.jsx","../src/helpers/getLinkedContentTypeIdsForNodeType.js","../src/helpers/newEntitySelectorConfigFromRichTextField.js","../src/validations/index.js","../src/plugins/Hyperlink/Util.js","../src/plugins/Hyperlink/ToolbarIcon.js","../src/plugins/Hyperlink/styles.js","../src/helpers/browserSupport.js","../src/plugins/Hyperlink/useRequestStatus.js","../src/plugins/Hyperlink/Hyperlink.js","../src/plugins/Hyperlink/truncate.js","../src/plugins/Hyperlink/index.js","../src/plugins/shared/ToolbarDropdownListItem.js","../src/plugins/shared/BlockSelectDecorator.js","../src/plugins/Heading/HeadingDropdown.js","../src/plugins/Heading/HeadingDropdownItem.js","../src/plugins/Heading/Paragraph.js","../src/plugins/Heading/index.js","../src/plugins/EmbeddedEntityBlock/Util.js","../src/plugins/EmbeddedEntityBlock/EmbeddedEntityBlock.styles.ts","../src/plugins/EmbeddedEntityBlock/ToolbarIcon.js","../src/plugins/EmbeddedEntityBlock/EmbeddedEntityBlock.js","../src/plugins/EmbeddedEntityBlock/index.js","../src/plugins/EmbeddedEntryInline/Utils.js","../src/plugins/EmbeddedEntryInline/EmbeddedEntryInline.styles.ts","../src/plugins/EmbeddedEntryInline/ToolbarIcon.js","../src/plugins/EmbeddedEntryInline/FetchingWrappedInlineEntryCard.js","../src/plugins/EmbeddedEntryInline/EmbeddedEntryInline.js","../src/plugins/EmbeddedEntryInline/index.js","../src/plugins/List/ToolbarDecorator.js","../src/plugins/List/index.js","../src/plugins/Hr/index.js","../src/plugins/Paste/Paste.js","../src/plugins/Paste/index.js","../src/plugins/PasteHtml/Serializer.js","../src/plugins/CommandPalette/Util.js","../src/plugins/CommandPalette/CommandPaletteService.js","../src/plugins/CommandPalette/CommandPanel/CommandPanelMenu.js","../src/plugins/CommandPalette/CommandPanel/InViewport/InViewport.js","../src/plugins/CommandPalette/CommandPanel/index.js","../src/plugins/CommandPalette/CommandPalette.js","../src/plugins/CommandPalette/CommandMark.js","../src/plugins/CommandPalette/index.js","../src/plugins/index.js","../src/plugins/InsertBeforeFirstVoidBlock/index.js","../src/plugins/InsertBeforeFirstVoidBlock/Util.js","../src/plugins/Paragraph/index.js","../src/plugins/PasteHtml/index.js","../src/plugins/PasteText/index.js","../src/plugins/NewLinePlugin/index.js","../src/plugins/EntryEmbedDropdown/index.js","../src/Toolbar/index.js","../src/Toolbar/StickyToolbarWrapper.js","../src/RichTextEditor.jsx","../src/dialogs/openRichTextDialog.jsx","../src/dialogs/renderRichTextDialog.jsx"],"sourcesContent":["import { BLOCKS } from '@contentful/rich-text-types';\nimport EditList from '@productboard/slate-edit-list';\n\nexport default (opt) => {\n const config = {\n types: [BLOCKS.OL_LIST, BLOCKS.UL_LIST],\n typeItem: BLOCKS.LIST_ITEM,\n typeDefault: BLOCKS.PARAGRAPH,\n ...opt,\n };\n\n const plugin = EditList(config);\n\n return plugin;\n};\n","import fromPairs from 'lodash/fromPairs';\nimport {\n BLOCKS,\n INLINES,\n TOP_LEVEL_BLOCKS,\n VOID_BLOCKS,\n CONTAINERS,\n} from '@contentful/rich-text-types';\n\nimport ListPlugin from '../plugins/List/EditListWrapper';\n\nconst mapVoidTypes = (nodeTypes) => {\n return fromPairs(nodeTypes.map((nodeType) => [nodeType, { isVoid: true }]));\n};\n\nconst listPlugin = ListPlugin();\n\nexport default {\n document: {\n nodes: [\n {\n types: TOP_LEVEL_BLOCKS,\n },\n ],\n },\n blocks: {\n [BLOCKS.PARAGRAPH]: {\n nodes: [\n {\n types: Object.values(INLINES),\n },\n {\n objects: ['text', 'inline'],\n },\n ],\n },\n [BLOCKS.HEADING_1]: {\n nodes: [\n {\n types: Object.values(INLINES),\n },\n {\n objects: ['text', 'inline'],\n },\n ],\n },\n [BLOCKS.HEADING_2]: {\n nodes: [\n {\n types: Object.values(INLINES),\n },\n {\n objects: ['text', 'inline'],\n },\n ],\n },\n [BLOCKS.HEADING_3]: {\n nodes: [\n {\n types: Object.values(INLINES),\n },\n {\n objects: ['text', 'inline'],\n },\n ],\n },\n [BLOCKS.HEADING_4]: {\n nodes: [\n {\n types: Object.values(INLINES),\n },\n {\n objects: ['text', 'inline'],\n },\n ],\n },\n [BLOCKS.HEADING_5]: {\n nodes: [\n {\n types: Object.values(INLINES),\n },\n {\n objects: ['text', 'inline'],\n },\n ],\n },\n [BLOCKS.HEADING_6]: {\n nodes: [\n {\n types: Object.values(INLINES),\n },\n {\n objects: ['text', 'inline'],\n },\n ],\n },\n ...mapVoidTypes(VOID_BLOCKS),\n // The schema for the lists and list-items is defined in the slate-edit-list plugin.\n // Due to the bug in slate@0.44.9 we have to stitch the schema manually.\n // Related bug ticket AUTH-888\n ...listPlugin.schema.blocks,\n [BLOCKS.QUOTE]: {\n nodes: [\n {\n match: [CONTAINERS[BLOCKS.QUOTE].map((type) => ({ type }))],\n min: 1,\n },\n ],\n normalize: (editor, error) => {\n if (error.code === 'child_type_invalid') {\n return editor.unwrapBlockByKey(error.node.key, BLOCKS.QUOTE);\n }\n },\n },\n },\n inlines: {\n [INLINES.HYPERLINK]: {\n nodes: [\n {\n objects: ['text'],\n },\n ],\n },\n [INLINES.ENTRY_HYPERLINK]: {\n nodes: [\n {\n objects: ['text'],\n },\n ],\n },\n [INLINES.ASSET_HYPERLINK]: {\n nodes: [\n {\n objects: ['text'],\n },\n ],\n },\n [INLINES.EMBEDDED_ENTRY]: {\n isVoid: true,\n },\n },\n};\n","import PropTypes from 'prop-types';\n\n/**\n * All known origins for Rich Text actions\n * @type {object}\n */\nexport const actionOrigin = {\n TOOLBAR: 'toolbar-icon',\n SHORTCUT: 'shortcut',\n VIEWPORT: 'viewport-interaction',\n COMMAND_PALETTE: 'command-palette',\n};\n\nconst createActionLogger = (onAction, origin) => (name, data) => {\n onAction(name, { origin, ...data });\n};\n\n/**\n * Creates an api that is passed to editor and toolbar widgets.\n *\n * @param {object} sdk\n * @param {function } onAction\n * @returns {{ sdk: {object}, logViewportAction: {function}, createActionLogger: {function}, createActionLogger: {function} }}\n */\nexport const createRichTextAPI = ({ sdk, onAction }) => {\n const richTextAPI = {\n sdk,\n logViewportAction: createActionLogger(onAction, actionOrigin.VIEWPORT),\n logShortcutAction: createActionLogger(onAction, actionOrigin.SHORTCUT),\n logToolbarAction: createActionLogger(onAction, actionOrigin.TOOLBAR),\n logCommandPaletteAction: createActionLogger(onAction, actionOrigin.COMMAND_PALETTE),\n };\n return richTextAPI;\n};\n\n/**\n * Describes the prop types a Rich Text editor plugin can expect.\n * @type {object}\n */\nexport const EDITOR_PLUGIN_PROP_TYPES = {\n richTextAPI: PropTypes.shape({\n sdk: PropTypes.object.isRequired,\n logViewportAction: PropTypes.func.isRequired,\n logShortcutAction: PropTypes.func.isRequired,\n logToolbarAction: PropTypes.func.isRequired,\n }),\n};\n\n/**\n * Describes the prop types a Rich Text toolbar plugin can expect.\n * @type {object}\n */\nexport const TOOLBAR_PLUGIN_PROP_TYPES = {\n ...EDITOR_PLUGIN_PROP_TYPES,\n editor: PropTypes.object.isRequired,\n onToggle: PropTypes.func.isRequired,\n disabled: PropTypes.bool.isRequired,\n isButton: PropTypes.bool,\n // TODO: Should get rid of this as it's just necessary as a hack to prevent\n // crashes before the user manually set the focus to the Slate input.\n canAutoFocus: PropTypes.bool,\n};\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { css, cx } from 'emotion';\nimport { Button, Tooltip } from '@contentful/f36-components';\nimport tokens from '@contentful/f36-tokens';\n\nconst styles = {\n button: css({\n height: '30px',\n width: '30px',\n marginLeft: tokens.spacing2Xs,\n marginRight: tokens.spacing2Xs,\n }),\n\n tooltip: css({\n zIndex: Number(tokens.zIndexTooltip),\n }),\n};\n\nexport default class ToolbarIcon extends Component {\n static propTypes = {\n isActive: PropTypes.bool.isRequired,\n disabled: PropTypes.bool.isRequired,\n onToggle: PropTypes.func.isRequired,\n children: PropTypes.any.isRequired,\n title: PropTypes.string.isRequired,\n type: PropTypes.string,\n className: PropTypes.string,\n };\n\n handleClick = (event) => {\n event.preventDefault();\n this.props.onToggle(event);\n };\n\n render() {\n const { title, type, isActive, children, className, disabled = false } = this.props;\n\n const button = (\n <Button\n className={cx(styles.button, className)}\n isDisabled={disabled}\n startIcon={children}\n onClick={this.handleClick}\n testId={`toolbar-toggle-${type}`}\n variant={isActive ? 'secondary' : 'transparent'}\n size=\"small\"\n />\n );\n\n if (title) {\n return (\n <Tooltip className={styles.tooltip} placement=\"top\" content={title}>\n {button}\n </Tooltip>\n );\n }\n\n return button;\n }\n}\n","import PropTypes from 'prop-types';\n\nexport const MarkPropTypes = {\n attributes: PropTypes.object.isRequired,\n children: PropTypes.node.isRequired,\n mark: PropTypes.string.isRequired,\n};\n\nexport const NodePropTypes = {\n attributes: PropTypes.object.isRequired,\n children: PropTypes.node.isRequired,\n node: PropTypes.shape({\n type: PropTypes.string.isRequired,\n }).isRequired,\n};\n","export const haveMarks = ({ value }, type) => {\n return value.activeMarks.some((mark) => mark.type === type);\n};\n\nexport const haveBlocks = ({ value }, type) => {\n return value.blocks.some((node) => node.type === type);\n};\n\nexport const haveInlines = ({ value }, type) => {\n return value.inlines.some((inline) => inline.type === type);\n};\n\nexport function haveAnyInlines({ value }) {\n return value.inlines.size > 0;\n}\n\n/**\n * Checks if all inline nodes in the selectin have a certain type.\n * Returns false if there are no inline nodes in the selection.\n *\n * @param {slate.Editor} editor\n * @param {string} type\n * @returns {boolean}\n */\nexport function haveEveryInlineOfType({ value }, type) {\n if (value.inlines.size > 0) {\n return value.inlines.every((inline) => inline.type === type);\n }\n\n return false;\n}\n\nexport const haveTextInSomeBlocks = ({ value }) => {\n if (value.blocks.size > 0) {\n return value.blocks.some((block) => block.text);\n }\n};\n","import isHotkey from 'is-hotkey';\nimport markDecorator from './MarkDecorator';\nimport { haveMarks } from './UtilHave';\nimport { css } from 'emotion';\nimport tokens from '@contentful/f36-tokens';\n\nconst styles = {\n // TODO: Ensure a bold mark on a headline makes the heading appear even\n // bolder. Consider to make headings non-bold by default.\n bold: css({\n color: 'inherit',\n fontWeight: tokens.fontWeightDemiBold,\n }),\n italic: css({\n fontStyle: 'italic',\n lineHeight: 1, // Prevents vertical jitter effect when applying code mark.\n }),\n code: css({\n fontFamily: tokens.fontStackMonospace,\n fontSize: '.9em', // Can't use `rem` to account for code inside a heading.\n }),\n};\n\nexport default function ({ type, tagName, hotkey, richTextAPI }) {\n return {\n renderMark: (props, _editor, next) => {\n if (props.mark.type === type) {\n return markDecorator(tagName, { className: styles[type] })(props);\n }\n return next();\n },\n onKeyDown(event, editor, next) {\n if (isHotkey(hotkey, event)) {\n editor.toggleMark(type);\n\n const action = haveMarks(editor, type) ? 'mark' : 'unmark';\n richTextAPI.logShortcutAction(action, { markType: type });\n return;\n }\n return next();\n },\n };\n}\n","import React from 'react';\nimport { MarkPropTypes } from './PropTypes';\n\nexport default function (Tag, tagProps = {}) {\n const CommonMark = ({ attributes, children }) => {\n return (\n <Tag {...tagProps} {...attributes}>\n {children}\n </Tag>\n );\n };\n\n CommonMark.displayName = `${Tag}-mark`;\n CommonMark.propTypes = MarkPropTypes;\n\n return CommonMark;\n}\n","/**\n * Handles setting the focus in the Slate editor (if possible due to Slate restrictions)\n * when clicking on a toolbar acton while the editor got no focus.\n *\n * Ideally we would always focus the editor in his case, but this might result\n * in a Slate crash if the editor hasn't been manually focused by the user at\n * that point.\n */\nexport const toolbarActionHandlerWithSafeAutoFocus = (component, customHandler) => (event) => {\n event.preventDefault();\n\n const { editor, canAutoFocus } = component.props;\n\n if (!editor.value.selection.isFocused) {\n if (canAutoFocus) {\n editor.focus();\n } else {\n // Note: This is only necessary as Slate in 0.4x in our case crashes when\n // working on the document before the user manually focuses. Attempts at\n // programmatically setting focus and a proper value.selection were in vain.\n // TODO: Upgrade Slate or figure out how to editor.setFocus when clicking\n // a toolbar icon without the editor crashing when starting to type.\n return;\n }\n }\n return customHandler(event);\n};\n","import * as React from 'react';\nimport { haveMarks } from './UtilHave';\nimport { toolbarActionHandlerWithSafeAutoFocus } from './Util';\nimport { TOOLBAR_PLUGIN_PROP_TYPES } from './PluginApi';\n\nexport default ({ type, title, children }) =>\n (Mark) => {\n return class CommonToggleMark extends React.Component {\n static propTypes = TOOLBAR_PLUGIN_PROP_TYPES;\n\n handleToggle = toolbarActionHandlerWithSafeAutoFocus(this, () => {\n const {\n editor,\n onToggle,\n richTextAPI: { logToolbarAction },\n } = this.props;\n onToggle(editor.toggleMark(type));\n const action = haveMarks(editor, type) ? 'mark' : 'unmark';\n logToolbarAction(action, { markType: type });\n });\n\n render() {\n const { editor, disabled } = this.props;\n return (\n <Mark\n type={type}\n title={title}\n onToggle={this.handleToggle}\n isActive={haveMarks(editor, type)}\n disabled={disabled}>\n {children}\n </Mark>\n );\n }\n };\n };\n","import React, { Component } from 'react';\nimport ToolbarIcon from '../shared/ToolbarIcon';\nimport markPlugin from '../shared/MarkPlugin';\nimport markToggleDecorator from '../shared/MarkToggleDecorator';\nimport { MARKS } from '@contentful/rich-text-types';\nimport { FormatBoldIcon } from '@contentful/f36-icons';\n\nexport const BoldPlugin = ({ richTextAPI }) => {\n return markPlugin({\n type: MARKS.BOLD,\n tagName: 'b',\n hotkey: ['mod+b'],\n richTextAPI,\n });\n};\n\nclass Bold extends Component {\n render() {\n return <ToolbarIcon {...this.props} />;\n }\n}\n\nexport default markToggleDecorator({\n type: MARKS.BOLD,\n title: 'Bold',\n children: <FormatBoldIcon />,\n})(Bold);\n","import React, { Component } from 'react';\nimport ToolbarIcon from '../shared/ToolbarIcon';\nimport markPlugin from '../shared/MarkPlugin';\nimport markToggleDecorator from '../shared/MarkToggleDecorator';\nimport { MARKS } from '@contentful/rich-text-types';\nimport { FormatItalicIcon } from '@contentful/f36-icons';\n\nexport const ItalicPlugin = ({ richTextAPI }) => {\n return markPlugin({\n type: MARKS.ITALIC,\n tagName: 'em',\n hotkey: ['mod+i'],\n richTextAPI,\n });\n};\n\nclass Italic extends Component {\n render() {\n return <ToolbarIcon {...this.props} />;\n }\n}\n\nexport default markToggleDecorator({\n type: MARKS.ITALIC,\n title: 'Italic',\n children: <FormatItalicIcon />,\n})(Italic);\n","import React, { Component } from 'react';\nimport ToolbarIcon from '../shared/ToolbarIcon';\nimport markPlugin from '../shared/MarkPlugin';\nimport markToggleDecorator from '../shared/MarkToggleDecorator';\nimport { MARKS } from '@contentful/rich-text-types';\nimport { FormatUnderlinedIcon } from '@contentful/f36-icons';\n\nexport const UnderlinedPlugin = ({ richTextAPI }) => {\n return markPlugin({\n type: MARKS.UNDERLINE,\n tagName: 'u',\n hotkey: ['mod+u'],\n richTextAPI,\n });\n};\n\nclass Underlined extends Component {\n render() {\n return <ToolbarIcon {...this.props} />;\n }\n}\n\nexport default markToggleDecorator({\n type: MARKS.UNDERLINE,\n title: 'Underline',\n children: <FormatUnderlinedIcon />,\n})(Underlined);\n","import React, { Component } from 'react';\nimport ToolbarIcon from '../shared/ToolbarIcon';\nimport markPlugin from '../shared/MarkPlugin';\nimport markToggleDecorator from '../shared/MarkToggleDecorator';\nimport { MARKS } from '@contentful/rich-text-types';\nimport { CodeIcon } from '@contentful/f36-icons';\n\nexport const CodePlugin = ({ richTextAPI }) => {\n return markPlugin({\n type: MARKS.CODE,\n tagName: 'code',\n hotkey: ['mod+/'],\n richTextAPI,\n });\n};\n\nclass Code extends Component {\n render() {\n return <ToolbarIcon {...this.props} />;\n }\n}\n\nexport default markToggleDecorator({\n type: MARKS.CODE,\n title: 'Code',\n children: <CodeIcon />,\n})(Code);\n","import * as React from 'react';\nimport { BLOCKS } from '@contentful/rich-text-types';\nimport { haveBlocks } from './UtilHave';\nimport { toolbarActionHandlerWithSafeAutoFocus } from './Util';\nimport { TOOLBAR_PLUGIN_PROP_TYPES } from './PluginApi';\n\n/**\n * Toggles formatting between a given node type and a plain paragraph.\n *\n * @param {slate.Editor} editor\n * @param {stirng} type\n * @returns {boolean} New toggle state after the change.\n */\nexport const toggleChange = (editor, type) => {\n const isActive = haveBlocks(editor, type);\n editor.setBlocks(isActive ? BLOCKS.PARAGRAPH : type);\n return !isActive;\n};\n\nconst isBlockActive = (editor, type) => haveBlocks(editor, type);\n\nexport default ({ type, title, children, applyChange = toggleChange, isActive = isBlockActive }) =>\n (Block) => {\n return class BlockToggleDecorator extends React.Component {\n static propTypes = TOOLBAR_PLUGIN_PROP_TYPES;\n\n handleToggle = toolbarActionHandlerWithSafeAutoFocus(this, () => {\n const {\n editor,\n onToggle,\n richTextAPI: { logToolbarAction },\n } = this.props;\n const isActive = applyChange(editor, type);\n onToggle(editor);\n const actionName = isActive ? 'insert' : 'remove';\n logToolbarAction(actionName, { nodeType: type });\n });\n\n render() {\n const { editor, disabled, richTextAPI } = this.props;\n\n return (\n <Block\n type={type}\n title={title}\n onToggle={this.handleToggle}\n isActive={isActive(editor, type)}\n disabled={disabled}\n richTextAPI={richTextAPI}>\n {children}\n </Block>\n );\n }\n };\n };\n","import { BLOCKS } from '@contentful/rich-text-types';\n\nconst getParent = (editor) => {\n const range = editor.value.selection;\n\n if (!range.start.key) {\n return null;\n }\n\n const startBlock = editor.value.document.getClosestBlock(range.start.key);\n\n return editor.value.document.getParent(startBlock.key);\n};\n\nexport const isSelectionInQuote = (editor) => {\n const ancestor = getParent(editor);\n\n if (!ancestor) {\n return false;\n }\n\n return ancestor.type === BLOCKS.QUOTE;\n};\n\n/**\n * Toggles formatting between block quote and a plain paragraph.\n *\n * @param {slate.Editor} editor\n * @returns {boolean} New toggle state after the change.\n */\nexport const applyChange = (editor) => {\n const isActive = isSelectionInQuote(editor);\n if (isActive) {\n editor.unwrapBlock(BLOCKS.QUOTE);\n } else {\n editor.setBlocks(BLOCKS.PARAGRAPH).wrapBlock(BLOCKS.QUOTE);\n }\n return !isActive;\n};\n","import * as React from 'react';\nimport { NodePropTypes } from './PropTypes';\nimport { css } from 'emotion';\nimport camelCase from 'lodash/camelCase';\nimport tokens from '@contentful/f36-tokens';\n\nconst headingCss = {\n fontWeight: tokens.fontWeightMedium,\n lineHeight: '1.3',\n margin: `0 0 ${tokens.spacingS}`,\n};\n\nconst styles = {\n paragraph: css({\n lineHeight: tokens.lineHeightDefault,\n marginBottom: '1.5em',\n }),\n bold: css({\n color: 'inherit',\n fontWeight: tokens.fontWeightDemiBold,\n }),\n blockquote: css({\n margin: '0 0 1.3125rem',\n borderLeft: `6px solid ${tokens.gray200}`,\n paddingLeft: '0.875rem',\n fontStyle: 'normal',\n '& a': {\n color: 'inherit',\n },\n }),\n code: css({\n background: tokens.gray200,\n padding: '0px',\n color: tokens.gray700,\n borderRadius: tokens.borderRadiusSmall,\n }),\n textLink: css({\n fontSize: 'inherit',\n }),\n orderedList: css({\n margin: '0 0 1.25rem 1.25rem',\n listStyleType: 'decimal',\n '[data-test-id=\"ordered-list\"]': {\n listStyleType: 'upper-alpha',\n '[data-test-id=\"ordered-list\"]': {\n listStyleType: 'lower-roman',\n '[data-test-id=\"ordered-list\"]': {\n listStyleType: 'lower-alpha',\n },\n },\n },\n '[data-test-id=\"paragraph\"]': {\n margin: 0,\n lineHeight: tokens.lineHeightDefault,\n },\n }),\n unorderedList: css({\n margin: '0 0 1.25rem 1.25rem',\n listStyleType: 'disc',\n '[data-test-id=\"unordered-list\"]': {\n listStyleType: 'circle',\n '[data-test-id=\"unordered-list\"]': {\n listStyleType: 'square',\n },\n },\n '[data-test-id=\"paragraph\"]': {\n margin: 0,\n lineHeight: tokens.lineHeightDefault,\n },\n }),\n listItem: css({\n listStyle: 'inherit',\n margin: 0,\n '[data-test-id=\"ordered-list\"], [data-test-id=\"unordered-list\"]': {\n margin: `0 0 0 ${tokens.spacingL}`,\n },\n }),\n heading1: css({\n ...headingCss,\n fontSize: '1.875rem',\n }),\n heading2: css({\n ...headingCss,\n fontSize: '1.5625rem',\n }),\n heading3: css({\n ...headingCss,\n fontSize: '1.375rem',\n }),\n heading4: css({\n ...headingCss,\n fontSize: '1.25rem',\n }),\n heading5: css({\n ...headingCss,\n fontSize: '1.125rem',\n }),\n heading6: css({\n ...headingCss,\n fontSize: '1rem',\n }),\n};\n\nexport default function (Tag, tagProps = {}) {\n const CommonNode = ({ attributes, children, node }) => {\n return (\n <Tag\n className={styles[camelCase(node.type)]}\n data-test-id={node.type}\n {...tagProps}\n {...attributes}>\n {children}\n </Tag>\n );\n };\n\n CommonNode.displayName = `${Tag}-node`;\n CommonNode.propTypes = NodePropTypes;\n\n return CommonNode;\n}\n","import isHotkey from 'is-hotkey';\nimport { BLOCKS } from '@contentful/rich-text-types';\nimport { applyChange, isSelectionInQuote } from './Util';\nimport commonNode from '../shared/NodeDecorator';\nimport { haveTextInSomeBlocks } from '../shared/UtilHave';\n\nconst newPlugin =\n (defaultType, tagName, hotkey) =>\n ({ type = defaultType, richTextAPI: { logShortcutAction } }) => {\n return {\n renderNode: (props, _editor, next) => {\n if (props.node.type === type) {\n return commonNode(tagName)(props);\n }\n return next();\n },\n onKeyDown: (e, editor, next) => {\n if (isHotkey(hotkey, e)) {\n const isActive = applyChange(editor);\n const actionName = isActive ? 'insert' : 'remove';\n logShortcutAction(actionName, { nodeType: type });\n return;\n }\n if (\n isHotkey('Backspace', e) &&\n isSelectionInQuote(editor) &&\n !haveTextInSomeBlocks(editor)\n ) {\n editor.unwrapBlock(BLOCKS.QUOTE).delete();\n return;\n }\n return next();\n },\n };\n };\n\nconst QuotePlugin = newPlugin(BLOCKS.QUOTE, 'blockquote', ['mod+shift+1']);\n\nexport default QuotePlugin;\n","import React, { Component } from 'react';\nimport { BLOCKS } from '@contentful/rich-text-types';\nimport ToolbarIcon from '../shared/ToolbarIcon';\nimport blockToggleDecorator from '../shared/BlockToggleDecorator';\nimport { applyChange, isSelectionInQuote } from './Util';\nimport { QuoteIcon } from '@contentful/f36-icons';\n\nclass Blockquote extends Component {\n render() {\n return <ToolbarIcon {...this.props} />;\n }\n}\n\n// TODO: Currently it seems this is the only place using `blockToggleDecorator` but we still\n// have to inject a custom `applyChange`. Seems like we could get rid of blockToggleDecorator.\nexport default blockToggleDecorator({\n type: BLOCKS.QUOTE,\n title: 'Blockquote',\n children: <QuoteIcon />,\n applyChange,\n isActive: isSelectionInQuote,\n})(Blockquote);\n\nexport { default as QuotePlugin } from './QuotePlugin';\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, \"\");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n \"GeneratorFunction\"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n","import * as React from 'react';\nimport PropTypes from 'prop-types';\nimport { EntryCard } from '@contentful/f36-components';\nimport {\n useEntities,\n MissingEntityCard,\n WrappedEntryCard,\n} from '@contentful/field-editor-reference';\n\nexport function FetchingWrappedEntryCard(props) {\n const { getOrLoadEntry, loadEntityScheduledActions, entries } = useEntities();\n\n React.useEffect(() => {\n getOrLoadEntry(props.entryId);\n }, [props.entryId]);\n\n const entry = entries[props.entryId];\n\n React.useEffect(() => {\n if (entry) {\n props.onEntityFetchComplete && props.onEntityFetchComplete();\n }\n }, [entry]);\n\n if (entry === 'failed') {\n return (\n <MissingEntityCard\n entityType=\"Entry\"\n isDisabled={props.isDisabled}\n onRemove={props.onRemove}\n />\n );\n }\n\n if (entry === undefined) {\n return <EntryCard isLoading />;\n }\n\n const contentType = props.sdk.space\n .getCachedContentTypes()\n .find((contentType) => contentType.sys.id === entry.sys.contentType.sys.id);\n\n return (\n <WrappedEntryCard\n getAsset={props.sdk.space.getAsset}\n getEntityScheduledActions={loadEntityScheduledActions}\n entryUrl={props.getEntryUrl && props.getEntryUrl(entry.sys.id)}\n isSelected={props.isSelected}\n isDisabled={props.isDisabled}\n localeCode={props.locale}\n defaultLocaleCode={props.sdk.locales.default}\n contentType={contentType}\n entry={entry}\n onEdit={props.onEdit}\n onRemove={props.onRemove}\n isClickable={false}\n />\n );\n}\n\nFetchingWrappedEntryCard.propTypes = {\n sdk: PropTypes.object.isRequired,\n entryId: PropTypes.string.isRequired,\n locale: PropTypes.string.isRequired,\n isDisabled: PropTypes.bool.isRequired,\n isSelected: PropTypes.bool.isRequired,\n onRemove: PropTypes.func,\n onEdit: PropTypes.func,\n getEntryUrl: PropTypes.func,\n onEntityFetchComplete: PropTypes.func,\n};\n","import * as React from 'react';\nimport PropTypes from 'prop-types';\nimport { AssetCard } from '@contentful/f36-components';\nimport {\n useEntities,\n MissingEntityCard,\n WrappedAssetCard,\n} from '@contentful/field-editor-reference';\n\nexport function FetchingWrappedAssetCard(props) {\n const { getOrLoadAsset, loadEntityScheduledActions, assets } = useEntities();\n\n React.useEffect(() => {\n getOrLoadAsset(props.assetId);\n }, [props.assetId]);\n\n const asset = assets[props.assetId];\n\n React.useEffect(() => {\n if (asset) {\n props.onEntityFetchComplete && props.onEntityFetchComplete();\n }\n }, [asset]);\n\n if (asset === 'failed') {\n return (\n <MissingEntityCard\n entityType=\"Asset\"\n isDisabled={props.isDisabled}\n onRemove={props.onRemove}\n />\n );\n }\n\n if (asset === undefined) {\n return <AssetCard size=\"default\" isLoading title=\"\" src=\"\" href=\"\" />;\n }\n\n return (\n <WrappedAssetCard\n getAsset={props.sdk.space.getAsset}\n getEntityScheduledActions={loadEntityScheduledActions}\n getAssetUrl={props.getAssetUrl}\n size=\"default\"\n isSelected={props.isSelected}\n isDisabled={props.isDisabled}\n localeCode={props.locale}\n defaultLocaleCode={props.sdk.locales.default}\n asset={asset}\n onEdit={props.onEdit}\n onRemove={props.onRemove}\n isClickable={false}\n />\n );\n}\n\nFetchingWrappedAssetCard.propTypes = {\n sdk: PropTypes.object.isRequired,\n locale: PropTypes.string.isRequired,\n assetId: PropTypes.string.isRequired,\n isDisabled: PropTypes.bool.isRequired,\n isSelected: PropTypes.bool.isRequired,\n onRemove: PropTypes.func,\n onEdit: PropTypes.func,\n getAssetUrl: PropTypes.func,\n onEntityFetchComplete: PropTypes.func,\n};\n","import React from 'react';\nimport { css } from 'emotion';\nimport PropTypes from 'prop-types';\nimport tokens from '@contentful/f36-tokens';\nimport { EntityProvider } from '@contentful/field-editor-reference';\nimport { FetchingWrappedEntryCard } from '../../plugins/EmbeddedEntityBlock/FetchingWrappedEntryCard';\nimport { FetchingWrappedAssetCard } from '../../plugins/EmbeddedEntityBlock/FetchingWrappedAssetCard';\n\nimport {\n TextLink,\n Button,\n FormControl,\n FormLabel,\n Select,\n TextInput,\n Form,\n ModalContent,\n ModalControls,\n} from '@contentful/f36-components';\n\nexport const LINK_TYPES = {\n URI: 'uri',\n ENTRY: 'Entry',\n ASSET: 'Asset',\n};\n\nfunction isFeaturingEntitySelector(entitySelectorConfigs = {}) {\n return !!entitySelectorConfigs.Entry || !!entitySelectorConfigs.Asset;\n}\n\nfunction entityToLink(entity) {\n const { id, type } = entity.sys;\n return { sys: { id, type: 'Link', linkType: type } };\n}\n\nexport class HyperlinkDialog extends React.Component {\n static propTypes = {\n sdk: PropTypes.object.isRequired,\n labels: PropTypes.shape({\n title: PropTypes.string,\n confirm: PropTypes.string,\n }),\n value: PropTypes.shape({\n text: PropTypes.string,\n uri: PropTypes.string,\n target: PropTypes.object,\n // Will be overwritten accordingly if `uri` or `target.sys.linkType` are set.\n type: PropTypes.oneOf(['uri', 'Entry', 'Asset']),\n }),\n entitySelectorConfigs: PropTypes.object,\n allowedHyperlinkTypes: PropTypes.arrayOf(\n PropTypes.oneOf([LINK_TYPES.ENTRY, LINK_TYPES.ASSET, LINK_TYPES.URI])\n ),\n hideText: PropTypes.bool,\n onClose: PropTypes.func.isRequired,\n };\n\n static defaultProps = {\n labels: {\n title: 'Insert link',\n confirm: 'Insert link',\n },\n value: {},\n hideText: false,\n entitySelectorConfigs: {},\n allowedHyperlinkTypes: [LINK_TYPES.ENTRY, LINK_TYPES.ASSET, LINK_TYPES.URI],\n };\n\n constructor(props) {\n super(props);\n\n const { text, type, uri, target } = props.value;\n const isEntityLink = Boolean(target);\n const entityLinks = {\n [LINK_TYPES.ENTRY]: null,\n [LINK_TYPES.ASSET]: null,\n };\n let linkType = type;\n\n if (isEntityLink) {\n linkType = target.sys.linkType;\n entityLinks[linkType] = target;\n } else if (props.allowedHyperlinkTypes.includes(LINK_TYPES.URI)) {\n linkType = LINK_TYPES.URI;\n } else {\n linkType = props.allowedHyperlinkTypes[0];\n }\n\n this.state = { text, uri, entityLinks, type: linkType };\n }\n\n setTargetEntity(type, entity) {\n this.setState((state) => ({\n entityLinks: {\n ...state.entityLinks,\n [type]: entity ? entityToLink(entity) : undefined,\n },\n }));\n }\n\n getValue() {\n const { text, type, uri } = this.state;\n const value = { type };\n if (text) {\n value.text = text;\n }\n if (type === LINK_TYPES.URI) {\n value.uri = uri;\n } else {\n value.target = this.state.entityLinks[type];\n }\n return value;\n }\n\n isLinkComplete() {\n const { text, type, uri, target } = this.getValue();\n const requiresText = !this.props.hideText;\n if (requiresText && !text) {\n return false;\n }\n return (type === LINK_TYPES.URI && uri) || target;\n }\n\n handleSubmit = (event) => {\n event.preventDefault();\n this.props.onClose(this.getValue());\n };\n\n selectEntry = async () => {\n const { locale, contentTypes } = this.props.entitySelectorConfigs.Entry;\n const entry = await this.props.sdk.dialogs.selectSingleEntry({ locale, contentTypes });\n this.setTargetEntity(LINK_TYPES.ENTRY, entry);\n };\n\n selectAsset = async () => {\n const { locale } = this.props.entitySelectorConfigs.Asset;\n const asset = await this.props.sdk.dialogs.selectSingleAsset({ locale });\n this.setTargetEntity(LINK_TYPES.ASSET, asset);\n };\n\n render() {\n const { labels } = this.props;\n return (\n <EntityProvider sdk={this.props.sdk}>\n <React.Fragment>\n <ModalContent>{this.renderFields()}</ModalContent>\n <ModalControls>\n <Button\n type=\"button\"\n onClick={() => this.props.onClose(null)}\n variant=\"secondary\"\n testId=\"cancel-cta\"\n size=\"small\">\n Cancel\n </Button>\n <Button\n type=\"submit\"\n variant=\"positive\"\n onClick={this.handleSubmit}\n isDisabled={!this.isLinkComplete()}\n testId=\"confirm-cta\"\n size=\"small\">\n {labels.confirm}\n </Button>\n </ModalControls>\n </React.Fragment>\n </EntityProvider>\n );\n }\n\n renderFields() {\n const { hideText, allowedHyperlinkTypes, entitySelectorConfigs } = this.props;\n const { uri, text, type } = this.state;\n const isUriInputAutoFocused = type === LINK_TYPES.URI && (hideText || !!text);\n\n return (\n <Form>\n {hideText ? null : (\n <FormControl id=\"link-text\" isRequired>\n <FormControl.Label>Link text</FormControl.Label>\n <TextInput\n testId=\"link-text-input\"\n name=\"link-text\"\n value={text || ''}\n onChange={(e) => this.setState({ text: e.target.value })}\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus={!isUriInputAutoFocused}\n />\n </FormControl>\n )}\n {isFeaturingEntitySelector(entitySelectorConfigs) && (\n <FormControl id=\"link-type\" name=\"link-type\">\n <FormControl.Label>Link type</FormControl.Label>\n <Select\n value={type}\n onChange={(e) => this.setState({ type: e.target.value })}\n testId=\"link-type-select\">\n {/* Show the option if the link type is allowed or the current link is of type that is no longer valid */}\n {allowedHyperlinkTypes.includes(LINK_TYPES.URI) || type === LINK_TYPES.URI ? (\n <Select.Option value={LINK_TYPES.URI}>URL</Select.Option>\n ) : null}\n {allowedHyperlinkTypes.includes(LINK_TYPES.ENTRY) || type === LINK_TYPES.ENTRY ? (\n <Select.Option value={LINK_TYPES.ENTRY}>Entry</Select.Option>\n ) : null}\n {allowedHyperlinkTypes.includes(LINK_TYPES.ASSET) || type === LINK_TYPES.ASSET ? (\n <Select.Option value={LINK_TYPES.ASSET}>Asset</Select.Option>\n ) : null}\n </Select>\n </FormControl>\n )}\n {type === LINK_TYPES.URI ? (\n <FormControl id=\"link-uri\" isRequired>\n <FormControl.Label>Link target</FormControl.Label>\n <TextInput\n testId=\"link-uri-input\"\n name=\"link-uri\"\n value={uri || ''}\n placeholder=\"https://\"\n onChange={(e) => this.setState({ uri: e.target.value })}\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus={isUriInputAutoFocused}\n />\n <FormControl.HelpText>A protocol may be required, e.g. https://</FormControl.HelpText>\n </FormControl>\n ) : (\n this.renderEntityField()\n )}\n </Form>\n );\n }\n\n renderEntityField() {\n const { type, entityLinks } = this.state;\n const resetEntity = () => this.setTargetEntity(type, null);\n const entityLink = entityLinks[type];\n const isEntitySelectorVisible = !entityLink;\n return (\n <div>\n <FormLabel required htmlFor=\"\">\n Link target\n </FormLabel>\n {!isEntitySelectorVisible && (\n <TextLink\n as=\"button\"\n className={css({ marginLeft: tokens.spacingS })}\n onClick={resetEntity}>\n Remove selection\n </TextLink>\n )}\n {entityLink && (\n <div>\n {type === LINK_TYPES.ENTRY && (\n <FetchingWrappedEntryCard\n sdk={this.props.sdk}\n locale={this.props.entitySelectorConfigs.Entry.locale}\n entryId={entityLink.sys.id}\n isDisabled\n isSelected={false}\n />\n )}\n {type == LINK_TYPES.ASSET && (\n <FetchingWrappedAssetCard\n sdk={this.props.sdk}\n locale={this.props.entitySelectorConfigs.Asset.locale}\n assetId={entityLink.sys.id}\n isDisabled\n isSelected={false}\n />\n )}\n </div>\n )}\n {/* Keep all entity selectors in the DOM for super fast types switching ux.*/}\n {isEntitySelectorVisible && this.renderEntitySelector(type, isEntitySelectorVisible)}\n </div>\n );\n }\n\n renderEntitySelector(type) {\n return (\n <div className={css({ marginTop: tokens.spacingS })}>\n {type === LINK_TYPES.ENTRY && (\n <TextLink as=\"button\" onClick={this.selectEntry}>\n Select entry\n </TextLink>\n )}\n {type === LINK_TYPES.ASSET && (\n <TextLink as=\"button\" onClick={this.selectAsset}>\n Select asset\n </TextLink>\n )}\n </div>\n );\n }\n}\n\nexport const openHyperlinkDialog = (\n dialogs,\n { value, showTextInput, allowedHyperlinkTypes, entitySelectorConfigs }\n) => {\n const isNew = !(value.uri || value.target);\n const props = {\n labels: {\n title: isNew ? 'Insert hyperlink' : 'Edit hyperlink',\n confirm: isNew ? 'Insert' : 'Update',\n },\n value,\n hideText: !showTextInput,\n allowedHyperlinkTypes,\n entitySelectorConfigs,\n };\n\n return dialogs.openCurrent({\n title: props.labels.title,\n width: 'large',\n shouldCloseOnEscapePress: true,\n shouldCloseOnOverlayClick: true,\n allowHeightOverflow: true,\n parameters: {\n type: 'rich-text-hyperlink-dialog',\n ...props,\n },\n });\n};\n","/* eslint-disable you-dont-need-lodash-underscore/find */\nimport flow from 'lodash/flow';\nimport find from 'lodash/find';\nimport get from 'lodash/get';\n\n/**\n * Given a field object and a rich text node type, return a list of valid\n * content type IDs associated with the node type, based on that node type's\n * `linkContentType` validation.\n *\n * If there is no such validation or the validation is empty, return an empty\n * array.\n *\n * The navigation here is explained by the `nodes` validation having signature:\n * { nodes: { [nodeType]: validationObject[] } }\n *\n * We defensively navigate through this object because\n * 1) the field may not have a `validations` array,\n * 2) the `validations` array may be empty,\n * 3) the `validations` array may not have a `nodes` validation,\n * 4) the `nodes` validation may not validate the `nodeType`, and\n * 5) the `nodeType` validations may not have a `linkContentType` validation.\n *\n * Note that passing an empty array will result in all possible content types\n * being whitelisted.\n *\n * @param {object} field\n * @param {string} nodeType\n * @returns {string[]}\n */\nexport default (field, nodeType) =>\n flow(\n (v) => find(v, 'nodes'),\n (v) => get(v, ['nodes', nodeType]),\n (v) => find(v, 'linkContentType'),\n (v) => get(v, 'linkContentType', [])\n )(field.validations);\n","import getLinkedContentTypeIdsForNodeType from './getLinkedContentTypeIdsForNodeType';\n\n/**\n * Returns a config for the entity selector based on a given rich text field and a\n * rich text node type that the entity should be picked for. Takes the field\n * validations for the given node type into account.\n *\n * @param {object} field\n * @param {string} nodeType\n * @returns {object}\n */\nexport default function newEntitySelectorConfigFromRichTextField(field, nodeType) {\n return {\n entityType: getEntityTypeFromRichTextNode(nodeType),\n locale: field.locale || null, // Will fall back to default locale.\n contentTypes: getLinkedContentTypeIdsForNodeType(field, nodeType),\n };\n}\n\nfunction getEntityTypeFromRichTextNode(nodeType) {\n const words = nodeType.split('-');\n if (words.indexOf('entry') !== -1) {\n return 'Entry';\n }\n if (words.indexOf('asset') !== -1) {\n return 'Asset';\n }\n throw new Error(`RichText node type \\`${nodeType}\\` has no associated \\`entityType\\``);\n}\n","/* eslint-disable you-dont-need-lodash-underscore/find */\nimport find from 'lodash/find';\nimport flow from 'lodash/flow';\nimport get from 'lodash/get';\nimport { BLOCKS, INLINES, TOP_LEVEL_BLOCKS } from '@contentful/rich-text-types';\n\n// TODO: Move this into separate package (maybe rich-text-types) and share with FE.\nexport const VALIDATIONS = {\n ENABLED_MARKS: 'enabledMarks',\n ENABLED_NODE_TYPES: 'enabledNodeTypes',\n};\n\nexport const VALIDATABLE_NODE_TYPES = [\n ...TOP_LEVEL_BLOCKS.filter((type) => type !== BLOCKS.PARAGRAPH),\n ...Object.values(INLINES),\n];\n\nconst getRichTextValidation = (field, validationType) =>\n flow(\n (v) => find(v, validationType),\n (v) => get(v, validationType)\n )(field.validations);\n\nconst isFormattingOptionEnabled = (field, validationType, nodeTypeOrMark) => {\n const enabledFormattings = getRichTextValidation(field, validationType);\n\n if (enabledFormattings === undefined) {\n return true;\n }\n\n return enabledFormattings.includes(nodeTypeOrMark);\n};\n\n/**\n * Checks if nodeType is enabled in the Rich Text Editor Field\n *\n * @param {FieldInfo} field\n * @param {string} nodeType\n * @returns {boolean}\n */\nexport const isNodeTypeEnabled = (field, nodeType) =>\n isFormattingOptionEnabled(field, VALIDATIONS.ENABLED_NODE_TYPES, nodeType);\n\n/**\n * Checks if mark is enabled in the Rich Text Editor Field\n *\n * @param {FieldInfo} field\n * @param {string} mark\n * @returns {boolean}\n */\nexport const isMarkEnabled = (field, mark) =>\n isFormattingOptionEnabled(field, VALIDATIONS.ENABLED_MARKS, mark);\n","import { BLOCKS, INLINES } from '@contentful/rich-text-types';\nimport { haveInlines } from '../shared/UtilHave';\nimport { openHyperlinkDialog, LINK_TYPES } from '../../dialogs/HypelinkDialog/HyperlinkDialog';\nimport newEntitySelectorConfigFromRichTextField from '../../helpers/newEntitySelectorConfigFromRichTextField';\nimport { isNodeTypeEnabled } from '../../validations/index';\n\nconst { HYPERLINK, ENTRY_HYPERLINK, ASSET_HYPERLINK } = INLINES;\nconst HYPERLINK_TYPES = [HYPERLINK, ENTRY_HYPERLINK, ASSET_HYPERLINK];\n\nconst nodeToHyperlinkType = {\n [INLINES.ENTRY_HYPERLINK]: LINK_TYPES.ENTRY,\n [INLINES.ASSET_HYPERLINK]: LINK_TYPES.ASSET,\n [INLINES.HYPERLINK]: LINK_TYPES.URI,\n};\n\nfunction getAllowedHyperlinkTypes(field) {\n const hyperlinkTypes = [INLINES.ENTRY_HYPERLINK, INLINES.ASSET_HYPERLINK, INLINES.HYPERLINK];\n if (field.type === 'RichText') {\n return hyperlinkTypes\n .filter((nodeType) => isNodeTypeEnabled(field, nodeType))\n .map((nodeType) => nodeToHyperlinkType[nodeType]);\n }\n\n return hyperlinkTypes.map((nodeType) => nodeToHyperlinkType[nodeType]);\n}\n\nfunction getEntitySelectorConfigs(field) {\n const config = {};\n\n // TODO: Don't pass specific key if CT validation prohibits its type:\n if (isNodeTypeEnabled(field, INLINES.ENTRY_HYPERLINK)) {\n config.Entry = newEntitySelectorConfigFromRichTextField(field, 'entry-hyperlink');\n }\n if (isNodeTypeEnabled(field, INLINES.ASSET_HYPERLINK)) {\n config.Asset = newEntitySelectorConfigFromRichTextField(field, 'asset-hyperlink');\n }\n\n return config;\n}\n\n/**\n * Returns whether or not the current value selection would allow for a user\n * edit on a hyperlink.\n *\n * @param {slate.Value} value\n * @returns {boolean}\n */\nexport function mayEditLink(value) {\n return !value.isExpanded && hasHyperlink(value);\n}\n\n/**\n * Returns whether the given value has any hyperlink node.\n *\n * @param {slate.Value} value\n * @returns {boolean}\n */\nexport function hasHyperlink(value) {\n return HYPERLINK_TYPES.some((type) => haveInlines({ value }, type));\n}\n\n/**\n * Returns whether the given value has any inline node other than hyperlinks.\n *\n * @param {slate.Value} value\n * @returns {boolean}\n */\nexport function hasOnlyHyperlinkInlines(value) {\n return value.inlines.every((inline) => HYPERLINK_TYPES.includes(inline.type));\n}\n\n/**\n * Allows the user to insert/remove a link depending on whether the current\n * selection has a link or not. If there is no link, a dialog is shown for\n * the user.\n *\n * @param {slate.Editor} editor Will be mutated with the required operations.\n * @param {Object} sdk\n * @param {function} logAction\n * @returns {Promise<void>}\n */\nexport async function toggleLink(editor, sdk, logAction) {\n if (hasHyperlink(editor.value)) {\n removeLinks(editor, logAction);\n } else {\n await insertLink(editor, sdk, logAction);\n }\n}\n\nasync function insertLink(change, sdk, logAction) {\n change.blur(); // Ensures modal input auto-focus will work.\n\n logAction('openCreateHyperlinkDialog');\n const showTextInput = !change.value.isExpanded || change.value.fragment.text.trim() === '';\n\n const result = await openHyperlinkDialog(sdk.dialogs, {\n showTextInput,\n value: { text: change.value.fragment.text || '' },\n allowedHyperlinkTypes: getAllowedHyperlinkTypes(sdk.field),\n entitySelectorConfigs: getEntitySelectorConfigs(sdk.field),\n });\n\n if (!result) {\n logAction('cancelCreateHyperlinkDialog');\n change.focus();\n return;\n }\n const { text, type: linkType, uri, target } = result;\n if (showTextInput) {\n if (change.isVoid(change.value.blocks.last())) {\n change.insertBlock(BLOCKS.PARAGRAPH);\n }\n change.insertText(text).moveFocusForward(0 - text.length);\n }\n const data = target ? { target } : { uri };\n change.call(wrapLink, linkType, data);\n const nodeType = linkTypeToNodeType(linkType);\n logAction('insert', { nodeType, linkType });\n\n change.focus();\n}\n\nfunction removeLinks(change, logAction) {\n HYPERLINK_TYPES.forEach((type) => change.unwrapInline(type));\n change.focus();\n logAction('unlinkHyperlinks');\n}\n\n/**\n * Allows the user to edit the first selected link of a given Change by showing\n * a dialog and applying the change.\n *\n * @param {slate.Editor} change Will be mutated with the required operations.\n * @param {Object} sdk\n * @param {function} logAction\n * @returns {Promise<void>}\n */\nexport async function editLink(change, sdk, logAction) {\n const link = change.value.inlines.get(0);\n if (!link) {\n throw new Error('Change object contains no link to be edited.');\n }\n change.blur(); // Ensures modal input auto-focus will work.\n logAction('openEditHyperlinkDialog');\n const { uri: oldUri, target: oldTarget } = link.data.toJSON();\n const result = await openHyperlinkDialog(sdk.dialogs, {\n showTextInput: false,\n value: oldTarget ? { target: oldTarget } : { uri: oldUri },\n allowedHyperlinkTypes: getAllowedHyperlinkTypes(sdk.field),\n entitySelectorConfigs: getEntitySelectorConfigs(sdk.field),\n });\n if (!result) {\n logAction('cancelEditHyperlinkDialog');\n change.focus();\n return;\n }\n\n const { type: linkType, uri, target } = result;\n const nodeType = linkTypeToNodeType(linkType);\n const data = target ? { target } : { uri };\n change.setInlines({ type: nodeType, data });\n logAction('edit', { nodeType, linkType });\n change.focus();\n}\n\nfunction wrapLink(change, linkType, data) {\n change.wrapInline({\n type: linkTypeToNodeType(linkType),\n data,\n });\n change.moveToEnd();\n}\n\nfunction linkTypeToNodeType(linkType) {\n switch (linkType) {\n case 'Entry':\n return ENTRY_HYPERLINK;\n case 'Asset':\n return ASSET_HYPERLINK;\n }\n return HYPERLINK;\n}\n","import React, { Component } from 'react';\nimport { INLINES } from '@contentful/rich-text-types';\nimport ToolbarIcon from '../shared/ToolbarIcon';\nimport { TOOLBAR_PLUGIN_PROP_TYPES } from '../shared/PluginApi';\nimport { toolbarActionHandlerWithSafeAutoFocus } from '../shared/Util';\nimport { hasHyperlink, toggleLink, hasOnlyHyperlinkInlines } from './Util';\nimport { LinkIcon } from '@contentful/f36-icons';\n\nexport default class HyperlinkToolbarIcon extends Component {\n static propTypes = TOOLBAR_PLUGIN_PROP_TYPES;\n\n handleClick = toolbarActionHandlerWithSafeAutoFocus(this, async () => {\n const {\n onToggle,\n editor,\n richTextAPI: { sdk, logToolbarAction },\n } = this.props;\n await toggleLink(editor, sdk, logToolbarAction);\n onToggle(editor);\n });\n\n render() {\n const { disabled, editor } = this.props;\n const isDisabled = disabled || !hasOnlyHyperlinkInlines(editor.value);\n return (\n <ToolbarIcon\n disabled={isDisabled}\n type={INLINES.HYPERLINK}\n title=\"Hyperlink\"\n onToggle={this.handleClick}\n isActive={hasHyperlink(editor.value)}>\n <LinkIcon />\n </ToolbarIcon>\n );\n }\n}\n","import { css } from 'emotion';\nimport tokens from '@contentful/f36-tokens';\n\nexport const hyperlinkTooltipStyles = {\n entityContentType: css({\n color: tokens.gray500,\n marginRight: tokens.spacingXs,\n '&:after': {\n content: '\"\"',\n },\n }),\n entityTitle: css({\n marginRight: tokens.spacingXs,\n }),\n separator: css({\n background: tokens.gray700,\n margin: tokens.spacingXs,\n }),\n};\n\nexport default {\n hyperlinkWrapper: css({\n display: 'inline',\n position: 'static',\n a: {\n fontSize: 'inherit !important',\n },\n }),\n hyperlink: css({\n fontSize: 'inherit !important',\n display: 'inline !important',\n '&:hover': {\n fill: tokens.textColorDark,\n },\n '&:focus': {\n fill: tokens.textColorDark,\n },\n }),\n hyperlinkIEFallback: css({\n color: '#1683d0',\n textDecoration: 'underline',\n }),\n // TODO: use these styles once we can use the icon\n hyperlinkIcon: css({\n position: 'relative',\n top: '4px',\n height: '14px',\n margin: '0 -2px 0 -1px',\n webkitTransition: 'fill 100ms ease-in-out',\n transition: 'fill 100ms ease-in-out',\n '&:hover': {\n fill: tokens.textColorDark,\n },\n '&:focus': {\n fill: tokens.textColorDark,\n },\n }),\n};\n","import { detect as detectBrowser } from 'detect-browser';\n\nconst browser = detectBrowser();\nconst isEdge = !!browser && browser.name === 'ie';\n\n// TODO: Test whether this is still relevant with latest Edge or at least do\n// so after upgrading Slate.js to see if still relevant at all.\nexport const SUPPORTS_NATIVE_SLATE_HYPERLINKS = !isEdge;\n","import React from 'react';\nimport { entityHelpers } from '@contentful/field-editor-shared';\n\nasync function fetchAllData({ sdk, entityId, entityType, localeCode, defaultLocaleCode }) {\n let contentType;\n\n const getEntity = entityType === 'Entry' ? sdk.space.getEntry : sdk.space.getAsset;\n const entity = await getEntity(entityId);\n if (entity.sys.contentType) {\n const contentTypeId = entity.sys.contentType.sys.id;\n contentType = await sdk.space.getContentType(contentTypeId);\n }\n\n const entityTitle =\n entityType === 'Entry'\n ? entityHelpers.getEntryTitle({\n entry: entity,\n contentType,\n localeCode,\n defaultLocaleCode,\n defaultTitle: 'Untitled',\n })\n : entityHelpers.getAssetTitle({\n asset: entity,\n localeCode,\n defaultLocaleCode,\n defaultTitle: 'Untitled',\n });\n\n const entityDescription = entityHelpers.getEntityDescription({\n entity,\n contentType,\n localeCode,\n defaultLocaleCode,\n });\n\n const jobs = await sdk.space.getEntityScheduledActions(entityType, entityId);\n\n const entityStatus = entityHelpers.getEntryStatus(entity.sys);\n\n return {\n jobs,\n entity,\n entityTitle,\n entityDescription,\n entityStatus,\n contentTypeName: contentType ? contentType.name : '',\n };\n}\n\nexport function useRequestStatus({ richTextAPI, target }) {\n const { sdk } = richTextAPI;\n\n const [requestStatus, setRequestStatus] = React.useState({ type: 'loading' });\n\n React.useEffect(() => {\n if (target) {\n fetchAllData({\n sdk,\n entityId: target?.sys?.id,\n entityType: target?.sys?.linkType,\n localeCode: sdk.field.locale,\n defaultLocaleCode: sdk.locales.default,\n })\n .then((entityInfo) => {\n setRequestStatus({ type: 'success', data: entityInfo });\n })\n .catch((e) => {\n console.log(e);\n setRequestStatus({ type: 'error', error: e });\n });\n }\n }, [target]); // eslint-disable-line\n\n return requestStatus;\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { cx } from 'emotion';\nimport isHotKey from 'is-hotkey';\nimport styles from './styles';\nimport { SUPPORTS_NATIVE_SLATE_HYPERLINKS } from '../../helpers/browserSupport';\nimport { useRequestStatus } from './useRequestStatus';\nimport { getScheduleTooltipContent } from '@contentful/field-editor-reference';\nimport { truncate } from './truncate';\n\nimport { TextLink, Tooltip } from '@contentful/f36-components';\n\nfunction isUrl(string) {\n return /^(?:[a-z]+:)?\\/\\//i.test(string) || /^mailto:/i.test(string);\n}\n\n// eslint-disable-next-line react/prop-types\nfunction getEntityInfo({ entityTitle, entityStatus, contentTypeName }) {\n const title = truncate(entityTitle, 60) || 'Untitled';\n\n return `${contentTypeName || 'Asset'} \"${title}\", ${entityStatus}`;\n}\n\nexport default function Hyperlink(props) {\n const { children, node } = props;\n const title = node.data.get('title');\n const uri = node.data.get('uri');\n const href = isUrl(uri) ? uri : 'javascript:void(0)';\n const target = node.data.get('target');\n const requestStatus = useRequestStatus({ richTextAPI: props.richTextAPI, target });\n\n const getTooltipContent = () => {\n if (requestStatus.type === 'loading') {\n return `Loading ${target.sys.linkType.toLowerCase()}...`;\n }\n let tooltipContent = '';\n if (requestStatus.type === 'error') {\n tooltipContent = `${target.sys.linkType} missing or inaccessible`;\n } else {\n const { jobs, ...entityInfo } = requestStatus.data;\n tooltipContent = `${getEntityInfo(entityInfo)}\n ${jobs.length > 0 ? getScheduleTooltipContent({ job: jobs[0], jobsCount: jobs.length }) : ''}`;\n }\n return tooltipContent;\n };\n\n const onKeyDown = (e) => {\n if (isHotKey('enter', e)) {\n e.preventDefault();\n e.stopPropagation(); // Ensure Slate doesn't interpret as new paragraph.\n props.onEdit(e);\n }\n };\n\n const renderLink = ({ tooltipContent }) => {\n return (\n <Tooltip\n content={tooltipContent}\n className={styles.tooltipContainer}\n targetWrapperClassName={styles.hyperlinkWrapper}\n placement=\"bottom\"\n maxWidth=\"auto\">\n {SUPPORTS_NATIVE_SLATE_HYPERLINKS ? (\n <TextLink\n // Allows user to open uri link in new tab.\n href={href}\n rel=\"noopener noreferrer\"\n title={title}\n className={styles.hyperlink}>\n {children}\n </TextLink>\n ) : (\n <span className={cx(styles.hyperlink, styles.hyperlinkIEFallback)}>{children}</span>\n )}\n </Tooltip>\n );\n };\n\n return (\n <span\n {...props.attributes}\n onClick={props.onEdit}\n onKeyDown={(e) => onKeyDown(e)}\n role=\"button\"\n tabIndex={0}>\n {target\n ? renderLink({ tooltipContent: getTooltipContent() })\n : renderLink({ tooltipContent: uri })}\n </span>\n // TODO: Add contentEditable={false} to tooltip to fix text cursor bug\n );\n}\n\nHyperlink.propTypes = {\n attributes: PropTypes.object.isRequired,\n node: PropTypes.object.isRequired,\n children: PropTypes.node,\n editor: PropTypes.object,\n richTextAPI: PropTypes.object.isRequired,\n onEdit: PropTypes.func,\n};\n","export function truncate(str, length) {\n if (str && str.length > length) {\n return (\n str &&\n str\n .substr(0, length + 1) // +1 to look ahead and be replaced below.\n // Get rid of orphan letters but not one letter words (I, a, 2).\n // Try to not have “.” as last character to avoid awkward “....”.\n .replace(/(\\s+\\S(?=\\S)|\\s*)\\.?.$/, '…')\n );\n } else {\n return str;\n }\n}\n","import React from 'react';\nimport isHotkey from 'is-hotkey';\nimport { INLINES } from '@contentful/rich-text-types';\nimport ToolbarIcon from './ToolbarIcon';\nimport Hyperlink from './Hyperlink';\nimport { editLink, mayEditLink, toggleLink, hasOnlyHyperlinkInlines } from './Util';\n\nconst { HYPERLINK, ENTRY_HYPERLINK, ASSET_HYPERLINK } = INLINES;\n\nexport default ToolbarIcon;\n\nexport const HyperlinkPlugin = ({ richTextAPI }) => ({\n renderNode: (props, _editor, next) => {\n const { sdk, logViewportAction } = richTextAPI;\n const { node, editor } = props;\n if (isHyperlink(node.type)) {\n return (\n <Hyperlink\n {...props}\n richTextAPI={richTextAPI}\n onEdit={(event) => {\n event.preventDefault(); // Don't follow `href`\n\n editor.moveToRangeOfNode(node).focus();\n if (mayEditLink(editor.value)) {\n editLink(editor, sdk, logViewportAction);\n }\n }}\n />\n );\n }\n return next();\n },\n onKeyDown: (event, editor, next) => {\n const { sdk, logShortcutAction } = richTextAPI;\n const hotkey = ['mod+k'];\n\n if (isHotkey(hotkey, event) && hasOnlyHyperlinkInlines(editor.value)) {\n if (mayEditLink(editor.value)) {\n editLink(editor, sdk, logShortcutAction);\n } else {\n toggleLink(editor, sdk, logShortcutAction);\n }\n return;\n }\n\n return next();\n },\n normalizeNode: (node, editor, next) => {\n if (isHyperlink(node.type) && node.getInlines().size > 0) {\n return () => {\n node\n .getInlines()\n .forEach((inlineNode) => editor.unwrapInlineByKey(inlineNode.key, node.type));\n };\n }\n next();\n },\n});\n\nfunction isHyperlink(type) {\n return [HYPERLINK, ENTRY_HYPERLINK, ASSET_HYPERLINK].includes(type);\n}\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { Menu } from '@contentful/f36-components';\nimport { css, cx } from 'emotion';\nimport tokens from '@contentful/f36-tokens';\n\nconst styles = {\n root: css({\n fontWeight: tokens.fontWeightDemiBold,\n lineHeight: 1.5,\n }),\n h1: css({\n fontSize: '1.625rem',\n }),\n h2: css({\n fontSize: '1.4375rem',\n }),\n h3: css({\n fontSize: '1.25rem',\n }),\n h4: css({\n fontSize: '1.125rem',\n }),\n h5: css({\n fontSize: '1rem',\n }),\n h6: css({\n fontSize: '0.875rem',\n }),\n};\n\n// Necessary because we can't use kebab-case for style identifiers.\nconst getStyleForType = (type) => type.replace('heading-', 'h');\n\nexport default class ToolbarDropdownListItem extends Component {\n static propTypes = {\n isActive: PropTypes.bool.isRequired,\n onToggle: PropTypes.func.isRequired,\n title: PropTypes.string.isRequired,\n type: PropTypes.string,\n children: PropTypes.node,\n };\n\n handleClick = (event) => {\n /*\n We're using the mousedown event rather than onclick because onclick will\n steal the focus.\n */\n\n event.preventDefault();\n this.props.onToggle(event);\n };\n\n render() {\n const { isActive, title, type, children } = this.props;\n return (\n <Menu.Item\n label={title}\n isInitiallyFocused={isActive}\n data-test-id={`toolbar-toggle-${type}`}\n className={cx(styles.root, styles[getStyleForType(type)])}\n onClick={this.handleClick}>\n {children}\n </Menu.Item>\n );\n }\n}\n","import * as React from 'react';\nimport { haveBlocks } from './UtilHave';\nimport { toolbarActionHandlerWithSafeAutoFocus } from './Util';\nimport { TOOLBAR_PLUGIN_PROP_TYPES } from './PluginApi';\n\nexport default ({\n type,\n title,\n children,\n applyChange = (editor, type) => editor.setBlocks(type),\n }) =>\n (Block) => {\n return class BlockSelectDecorator extends React.Component {\n static propTypes = TOOLBAR_PLUGIN_PROP_TYPES;\n\n handleSelect = toolbarActionHandlerWithSafeAutoFocus(this, () => {\n const {\n editor,\n onToggle,\n richTextAPI: { logToolbarAction },\n } = this.props;\n applyChange(editor, type);\n onToggle(editor);\n logToolbarAction('insert', { nodeType: type });\n });\n\n render() {\n const { editor, disabled } = this.props;\n\n return (\n <Block\n type={type}\n title={title}\n onToggle={this.handleSelect}\n isActive={haveBlocks(editor, type)}\n disabled={disabled}>\n {children}\n </Block>\n );\n }\n };\n };\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { BLOCKS } from '@contentful/rich-text-types';\nimport tokens from '@contentful/f36-tokens';\nimport { css } from 'emotion';\n\nimport { Button, Menu } from '@contentful/f36-components';\n\nimport { ChevronDownIcon } from '@contentful/f36-icons';\n\nconst styles = {\n root: css({\n padding: 0,\n marginRight: tokens.spacing2Xs,\n width: '110px',\n\n [`@media (min-width: ${tokens.contentWidthDefault})`]: {\n width: '145px',\n },\n }),\n};\n\nexport const blockTitles = {\n [BLOCKS.HEADING_1]: 'Heading 1',\n [BLOCKS.HEADING_2]: 'Heading 2',\n [BLOCKS.HEADING_3]: 'Heading 3',\n [BLOCKS.HEADING_4]: 'Heading 4',\n [BLOCKS.HEADING_5]: 'Heading 5',\n [BLOCKS.HEADING_6]: 'Heading 6',\n [BLOCKS.PARAGRAPH]: 'Normal Text',\n [BLOCKS.EMBEDDED_ENTRY]: 'Embedded Entry',\n [BLOCKS.EMBEDDED_ASSET]: 'Embedded Asset',\n};\n\nclass HeadingDropdown extends Component {\n static propTypes = {\n children: PropTypes.node.isRequired,\n isOpen: PropTypes.bool,\n disabled: PropTypes.bool,\n onClose: PropTypes.func,\n onOpen: PropTypes.func,\n currentBlockType: PropTypes.string,\n };\n getStyleNameForChange = () => {\n return blockTitles[this.props.currentBlockType] || blockTitles[BLOCKS.PARAGRAPH];\n };\n\n render() {\n const { onOpen, isOpen, onClose, children } = this.props;\n return (\n <Menu isOpen={isOpen} onClose={onClose} onOpen={onOpen}>\n <Menu.Trigger>\n <Button\n endIcon={<ChevronDownIcon />}\n data-test-id=\"toolbar-heading-toggle\"\n className={styles.root}\n variant=\"transparent\"\n size=\"small\"\n isDisabled={this.props.disabled}>\n {this.getStyleNameForChange()}\n </Button>\n </Menu.Trigger>\n <Menu.List className=\"toolbar-heading-dropdown-list\">{children}</Menu.List>\n </Menu>\n );\n }\n}\n\nexport default HeadingDropdown;\n","import React, { Component } from 'react';\nimport ToolbarDropdownListItem from '../shared/ToolbarDropdownListItem';\nimport blockSelectDecorator from '../shared/BlockSelectDecorator';\nimport { blockTitles } from './HeadingDropdown';\n\nexport default function newHeadingDropdownItem(nodeType) {\n const title = blockTitles[nodeType];\n\n class Heading extends Component {\n static displayName = title.replace(/\\s/g, '');\n render() {\n return (\n <ToolbarDropdownListItem {...this.props} data-test-id={nodeType}>\n {title}\n </ToolbarDropdownListItem>\n );\n }\n }\n\n return blockSelectDecorator({\n type: nodeType,\n title,\n })(Heading);\n}\n","import React, { Component } from 'react';\nimport ToolbarDropdownListItem from '../shared/ToolbarDropdownListItem';\nimport { BLOCKS } from '@contentful/rich-text-types';\nimport blockSelectDecorator from '../shared/BlockSelectDecorator';\nimport { blockTitles } from './HeadingDropdown';\n\nclass Paragraph extends Component {\n render() {\n return (\n <ToolbarDropdownListItem {...this.props}>\n {blockTitles[BLOCKS.PARAGRAPH]}\n </ToolbarDropdownListItem>\n );\n }\n}\n\nexport default blockSelectDecorator({\n type: BLOCKS.PARAGRAPH,\n title: blockTitles[BLOCKS.PARAGRAPH],\n shouldToggle: false,\n})(Paragraph);\n","import isHotkey from 'is-hotkey';\nimport { BLOCKS } from '@contentful/rich-text-types';\nimport { toggleChange } from '../shared/BlockToggleDecorator';\nimport CommonNode from '../shared/NodeDecorator';\nimport newHeadingDropdownItem from './HeadingDropdownItem';\n\nconst newPlugin =\n (defaultType, tagName, hotkey) =>\n ({ type = defaultType, richTextAPI }) => ({\n renderNode: (props, _editor, next) => {\n if (props.node.type === type) {\n return CommonNode(tagName, {})(props);\n }\n return next();\n },\n onKeyDown: (e, editor, next) => {\n if (isHotkey('enter', e)) {\n const currentBlock = editor.value.blocks.get(0);\n if (currentBlock.type === type) {\n const { value } = editor;\n\n if (value.selection.start.offset === 0) {\n const initialRange = value.selection;\n editor.splitBlock().setBlocksAtRange(initialRange, BLOCKS.PARAGRAPH);\n } else {\n editor.splitBlock().setBlocks(BLOCKS.PARAGRAPH);\n }\n\n return;\n }\n } else if (isHotkey(hotkey, e)) {\n const isActive = toggleChange(editor, type);\n const actionName = isActive ? 'insert' : 'remove';\n richTextAPI.logShortcutAction(actionName, { nodeType: type });\n return;\n }\n return next();\n },\n });\n\n// TODO: move hotkeys to components\nexport const Heading1Plugin = newPlugin(BLOCKS.HEADING_1, 'h1', ['mod+opt+1']);\nexport const Heading2Plugin = newPlugin(BLOCKS.HEADING_2, 'h2', ['mod+opt+2']);\nexport const Heading3Plugin = newPlugin(BLOCKS.HEADING_3, 'h3', ['mod+opt+3']);\nexport const Heading4Plugin = newPlugin(BLOCKS.HEADING_4, 'h4', ['mod+opt+4']);\nexport const Heading5Plugin = newPlugin(BLOCKS.HEADING_5, 'h5', ['mod+opt+5']);\nexport const Heading6Plugin = newPlugin(BLOCKS.HEADING_6, 'h6', ['mod+opt+6']);\n\nexport const Heading1 = newHeadingDropdownItem(BLOCKS.HEADING_1);\nexport const Heading2 = newHeadingDropdownItem(BLOCKS.HEADING_2);\nexport const Heading3 = newHeadingDropdownItem(BLOCKS.HEADING_3);\nexport const Heading4 = newHeadingDropdownItem(BLOCKS.HEADING_4);\nexport const Heading5 = newHeadingDropdownItem(BLOCKS.HEADING_5);\nexport const Heading6 = newHeadingDropdownItem(BLOCKS.HEADING_6);\nexport { default as Paragraph } from './Paragraph';\nexport { default as HeadingDropdown } from './HeadingDropdown';\n","import { BLOCKS } from '@contentful/rich-text-types';\nimport { haveTextInSomeBlocks } from '../shared/UtilHave';\nimport newEntitySelectorConfigFromRichTextField from '../../helpers/newEntitySelectorConfigFromRichTextField';\n\n/**\n * Returns whether given value has a block of the given type.\n * @param {slate.Editor} editor\n * @param {string} type\n * @returns {boolean}\n */\nexport const hasBlockOfType = (editor, type) => {\n const blocks = editor.value.blocks;\n return blocks.get(0).type === type;\n};\n\n/**\n * Invokes entity selector modal and inserts block embed.\n * @param {string} nodeType\n * @param {import('@contentful/field-editor-reference/dist/types').FieldExtensionSDK} sdk\n * @param {slate.Editor} editor\n * @param {function} logAction\n */\nexport async function selectEntityAndInsert(nodeType, sdk, editor, logAction) {\n logAction('openCreateEmbedDialog', { nodeType });\n\n const { field, dialogs } = sdk;\n const baseConfig = newEntitySelectorConfigFromRichTextField(field, nodeType);\n const selectEntity =\n baseConfig.entityType === 'Asset' ? dialogs.selectSingleAsset : dialogs.selectSingleEntry;\n const config = { ...baseConfig, withCreate: true };\n try {\n const entity = await selectEntity(config);\n if (!entity) {\n return;\n }\n insertBlock(editor, nodeType, entity);\n logAction('insert', { nodeType });\n } catch (error) {\n if (error) {\n throw error;\n } else {\n logAction('cancelCreateEmbedDialog', { nodeType });\n }\n }\n}\n\nexport const createNode = (nodeType, entity) => ({\n type: nodeType,\n object: 'block',\n data: {\n target: {\n sys: {\n id: entity.sys.id,\n type: 'Link',\n linkType: entity.sys.type,\n },\n },\n },\n});\n\nexport function insertBlock(editor, nodeType, entity, focusNextLine = true) {\n const linkedEntityBlock = createNode(nodeType, entity);\n if (editor.value.blocks.size === 0 || haveTextInSomeBlocks(editor)) {\n editor.insertBlock(linkedEntityBlock);\n } else {\n editor.setBlocks(linkedEntityBlock);\n }\n\n if (focusNextLine) {\n editor.insertBlock(BLOCKS.PARAGRAPH).focus();\n }\n}\n","import { css } from 'emotion';\n\nexport const styles = {\n icon: css({\n marginRight: '10px',\n }),\n};\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { selectEntityAndInsert } from './Util';\nimport { TOOLBAR_PLUGIN_PROP_TYPES } from '../shared/PluginApi';\nimport { toolbarActionHandlerWithSafeAutoFocus } from '../shared/Util';\nimport { styles } from './EmbeddedEntityBlock.styles';\n\nimport { Flex, Icon, Button, Menu } from '@contentful/f36-components';\n\nimport { AssetIcon, EmbeddedEntryBlockIcon } from '@contentful/f36-icons';\n\nexport default class EntityLinkToolbarIcon extends Component {\n static propTypes = {\n ...TOOLBAR_PLUGIN_PROP_TYPES,\n isButton: PropTypes.bool,\n };\n\n static defaultProps = {\n isButton: false,\n };\n\n handleClick = (e) => {\n this.handleAction(e);\n };\n\n handleAction = toolbarActionHandlerWithSafeAutoFocus(this, async () => {\n const {\n editor,\n nodeType,\n richTextAPI: { sdk, logToolbarAction },\n } = this.props;\n await selectEntityAndInsert(nodeType, sdk, editor, logToolbarAction);\n this.props.onToggle(editor);\n });\n\n render() {\n const { nodeType } = this.props;\n const type = getEntityTypeFromNodeType(nodeType);\n const baseClass = `rich-text__${nodeType}`;\n return this.props.isButton ? (\n <Button\n isDisabled={this.props.disabled}\n className={`${baseClass}-button`}\n size=\"small\"\n onClick={this.handleClick}\n startIcon={type === 'Asset' ? <AssetIcon /> : <EmbeddedEntryBlockIcon />}\n variant=\"secondary\"\n testId={`toolbar-toggle-${nodeType}`}>\n {`Embed ${type.toLowerCase()}`}\n </Button>\n ) : (\n <Menu.Item\n disabled={this.props.disabled}\n className={`${baseClass}-list-item`}\n onClick={this.handleClick}\n testId={`toolbar-toggle-${nodeType}`}>\n <Flex alignItems=\"center\" flexDirection=\"row\">\n <Icon\n as={type === 'Asset' ? AssetIcon : EmbeddedEntryBlockIcon}\n className={`rich-text__embedded-entry-list-icon ${styles.icon}`}\n variant=\"secondary\"\n />\n <span>{type}</span>\n </Flex>\n </Menu.Item>\n );\n }\n}\n\n/**\n * Returns the entity type depending on the given node type.\n * @param {string} nodeType\n * @returns {string}\n */\nfunction getEntityTypeFromNodeType(nodeType) {\n const words = nodeType.toLowerCase().split('-');\n if (words.includes('entry')) {\n return 'Entry';\n }\n if (words.includes('asset')) {\n return 'Asset';\n }\n throw new Error(`Node type \\`${nodeType}\\` has no associated \\`entityType\\``);\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { css } from 'emotion';\nimport { FetchingWrappedEntryCard } from './FetchingWrappedEntryCard';\nimport { FetchingWrappedAssetCard } from './FetchingWrappedAssetCard';\n\nconst styles = {\n root: css({\n marginBottom: '1.25rem',\n }),\n};\n\nexport default class LinkedEntityBlock extends React.Component {\n static propTypes = {\n sdk: PropTypes.object.isRequired,\n isSelected: PropTypes.bool.isRequired,\n attributes: PropTypes.object.isRequired,\n editor: PropTypes.object.isRequired,\n node: PropTypes.object.isRequired,\n onEntityFetchComplete: PropTypes.func.isRequired,\n };\n\n getEntitySys() {\n const data = this.props.node.data;\n return {\n id: data.get('target').sys.id,\n type: data.get('target').sys.linkType,\n };\n }\n\n handleEditClick = () => {\n const { type, id } = this.getEntitySys();\n const { navigator } = this.props.sdk;\n const openEntity = type === 'Asset' ? navigator.openAsset : navigator.openEntry;\n return openEntity(id, { slideIn: true });\n };\n\n handleRemoveClick = () => {\n const { editor, node } = this.props;\n editor.moveToRangeOfNode(node);\n editor.removeNodeByKey(node.key);\n editor.focus(); // Click on \"x\" might have removed focus.\n };\n\n render() {\n const { sdk, editor, isSelected } = this.props;\n const isDisabled = editor.props.readOnly || editor.props.actionsDisabled;\n const { id: entityId, type: entityType } = this.getEntitySys();\n return (\n <div {...this.props.attributes} className={styles.root}>\n {entityType === 'Entry' && (\n <FetchingWrappedEntryCard\n sdk={sdk}\n entryId={entityId}\n locale={sdk.field.locale}\n isDisabled={isDisabled}\n isSelected={isSelected}\n onRemove={this.handleRemoveClick}\n onEdit={this.handleEditClick}\n getEntryUrl={() => {\n const getEntryUrl = sdk.parameters.instance.getEntryUrl;\n return typeof getEntryUrl === 'function' ? getEntryUrl(entityId) : '';\n }}\n onEntityFetchComplete={this.props.onEntityFetchComplete}\n />\n )}\n {entityType === 'Asset' && (\n <FetchingWrappedAssetCard\n sdk={sdk}\n assetId={entityId}\n locale={sdk.field.locale}\n isDisabled={isDisabled}\n isSelected={isSelected}\n onRemove={this.handleRemoveClick}\n onEdit={this.handleEditClick}\n getAssetUrl={() => {\n const getAssetUrl = sdk.parameters.instance.getAssetUrl;\n return typeof getAssetUrl === 'function' ? getAssetUrl(entityId) : '';\n }}\n onEntityFetchComplete={this.props.onEntityFetchComplete}\n />\n )}\n </div>\n );\n }\n}\n","import React from 'react';\nimport isHotkey from 'is-hotkey';\n\nimport ToolbarIcon from './ToolbarIcon';\nimport EntityLinkBlock from './EmbeddedEntityBlock';\nimport { BLOCKS } from '@contentful/rich-text-types';\nimport { hasBlockOfType, selectEntityAndInsert } from './Util';\n\nexport default ToolbarIcon;\n\nexport const EmbeddedEntityBlockPlugin = ({\n richTextAPI: { sdk, logShortcutAction, logViewportAction },\n nodeType,\n hotkey,\n}) => {\n return {\n renderNode: (props, _editor, next) => {\n const { node, attributes, key } = props;\n if (node.type === nodeType) {\n return (\n <EntityLinkBlock\n sdk={sdk}\n {...props}\n {...attributes}\n onEntityFetchComplete={() => {\n logViewportAction('linkRendered', { key });\n }}\n />\n );\n }\n return next();\n },\n onKeyDown(e, editor, next) {\n if (hotkey && isHotkey(hotkey, e)) {\n selectEntityAndInsert(nodeType, sdk, editor, logShortcutAction);\n return;\n }\n if (isHotkey('enter', e) && hasBlockOfType(editor, nodeType)) {\n editor.insertBlock(BLOCKS.PARAGRAPH).focus();\n return;\n }\n return next();\n },\n };\n};\n\nexport const EmbeddedEntryBlockPlugin = ({ richTextAPI }) => {\n return EmbeddedEntityBlockPlugin({\n richTextAPI,\n nodeType: BLOCKS.EMBEDDED_ENTRY,\n hotkey: ['mod+shift+e'],\n });\n};\n\nexport const EmbeddedAssetBlockPlugin = ({ richTextAPI }) => {\n return EmbeddedEntityBlockPlugin({\n richTextAPI,\n nodeType: BLOCKS.EMBEDDED_ASSET,\n hotkey: ['mod+shift+a'],\n });\n};\n","import { INLINES } from '@contentful/rich-text-types';\nimport { haveAnyInlines, haveEveryInlineOfType, haveInlines } from '../shared/UtilHave';\nimport newEntitySelectorConfigFromRichTextField from '../../helpers/newEntitySelectorConfigFromRichTextField';\n\nconst createInlineNode = (id) => ({\n type: INLINES.EMBEDDED_ENTRY,\n object: 'inline',\n data: {\n target: {\n sys: {\n id,\n type: 'Link',\n linkType: 'Entry',\n },\n },\n },\n});\n\nexport const insertInline = (editor, entryId, focusNextLine = true) => {\n if (haveInlines(editor, INLINES.EMBEDDED_ENTRY)) {\n editor.setInlines(createInlineNode(entryId));\n } else {\n editor.insertInline(createInlineNode(entryId));\n }\n\n focusNextLine ? editor.moveToStartOfNextText().focus() : null;\n};\n\nexport const hasOnlyInlineEntryInSelection = (editor) => {\n const inlines = editor.value.inlines;\n const selection = editor.value.selection;\n if (inlines.size === 1 && selection.start.key === selection.end.key) {\n return inlines.get(0).type === INLINES.EMBEDDED_ENTRY;\n }\n};\n\n/**\n * Invokes entity selector modal and inserts inline embed.\n * @param {import('@contentful/field-editor-reference/dist/types').FieldExtensionSDK} sdk\n * @param {slate.Editor} editor\n * @param {function} logAction\n */\nexport const selectEntryAndInsert = async (sdk, editor, logAction) => {\n const nodeType = INLINES.EMBEDDED_ENTRY;\n logAction('openCreateEmbedDialog', { nodeType });\n\n const { field, dialogs } = sdk;\n const baseConfig = newEntitySelectorConfigFromRichTextField(field, nodeType);\n const config = { ...baseConfig, withCreate: true };\n try {\n const entry = await dialogs.selectSingleEntry(config);\n if (!entry) {\n return;\n }\n insertInline(editor, entry.sys.id);\n logAction('insert', { nodeType });\n } catch (error) {\n if (error) {\n throw error;\n } else {\n logAction('cancelCreateEmbedDialog', { nodeType });\n }\n }\n};\n\nexport const canInsertInline = (editor) => {\n return !haveAnyInlines(editor) || haveEveryInlineOfType(editor, INLINES.EMBEDDED_ENTRY);\n};\n","import { css } from 'emotion';\n\nexport const styles = {\n icon: css({\n marginRight: '10px',\n }),\n\n root: css({\n margin: '0px 5px',\n fontSize: 'inherit',\n span: {\n webkitUserSelect: 'none',\n mozUserSelect: 'none',\n msUserSelect: 'none',\n userSelect: 'none',\n },\n }),\n};\n","import React, { Component } from 'react';\nimport { INLINES } from '@contentful/rich-text-types';\n\nimport { selectEntryAndInsert, canInsertInline } from './Utils';\nimport { TOOLBAR_PLUGIN_PROP_TYPES } from '../shared/PluginApi';\nimport { toolbarActionHandlerWithSafeAutoFocus } from '../shared/Util';\nimport { styles } from './EmbeddedEntryInline.styles';\n\nimport { Flex, Button, Menu } from '@contentful/f36-components';\n\nimport { EmbeddedEntryInlineIcon } from '@contentful/f36-icons';\n\nexport default class EntryLinkToolbarIcon extends Component {\n static propTypes = TOOLBAR_PLUGIN_PROP_TYPES;\n\n static defaultProps = {\n isButton: false,\n };\n\n handleClick = (e) => {\n this.handleAction(e);\n };\n\n handleAction = toolbarActionHandlerWithSafeAutoFocus(this, async () => {\n const {\n editor,\n richTextAPI: { sdk, logToolbarAction },\n } = this.props;\n await selectEntryAndInsert(sdk, editor, logToolbarAction);\n this.props.onToggle(editor);\n });\n\n render() {\n return this.props.isButton ? (\n <Button\n isDisabled={this.props.disabled}\n className={`${INLINES.EMBEDDED_ENTRY}-button`}\n size=\"small\"\n onClick={(event) => this.handleClick(event)}\n startIcon={<EmbeddedEntryInlineIcon />}\n variant=\"secondary\"\n testId={`toolbar-toggle-${INLINES.EMBEDDED_ENTRY}`}>\n Embed inline entry\n </Button>\n ) : (\n <Menu.Item\n disabled={this.props.disabled || !canInsertInline(this.props.editor)}\n className=\"rich-text__entry-link-block-button\"\n testId={`toolbar-toggle-${INLINES.EMBEDDED_ENTRY}`}\n onClick={this.handleClick}>\n <Flex alignItems=\"center\" flexDirection=\"row\">\n <EmbeddedEntryInlineIcon\n variant=\"secondary\"\n className={`rich-text__embedded-entry-list-icon ${styles.icon}`}\n />\n <span>Inline entry</span>\n </Flex>\n </Menu.Item>\n );\n }\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { css } from 'emotion';\nimport tokens from '@contentful/f36-tokens';\nimport { InlineEntryCard, MenuItem, Text } from '@contentful/f36-components';\nimport { entityHelpers } from '@contentful/field-editor-shared';\nimport { useEntities, ScheduledIconWithTooltip } from '@contentful/field-editor-reference';\n\nimport { INLINES } from '@contentful/rich-text-types';\n\nimport { ClockIcon } from '@contentful/f36-icons';\n\nconst { getEntryTitle, getEntryStatus } = entityHelpers;\n\nconst styles = {\n scheduledIcon: css({\n verticalAlign: 'text-bottom',\n marginRight: tokens.spacing2Xs,\n }),\n};\n\nexport const FetchingWrappedInlineEntryCard = (props) => {\n const { getOrLoadEntry, loadEntityScheduledActions, entries } = useEntities();\n\n React.useEffect(() => {\n getOrLoadEntry(props.entryId);\n }, [props.entryId]);\n\n const entry = entries[props.entryId];\n\n React.useEffect(() => {\n if (entry) {\n props.onEntityFetchComplete && props.onEntityFetchComplete();\n }\n }, [entry]);\n\n if (entry === 'failed') {\n return (\n <InlineEntryCard testId={INLINES.EMBEDDED_ENTRY} isSelected={props.isSelected}>\n <Text>Entry missing or inaccessible</Text>\n </InlineEntryCard>\n );\n }\n\n if (entry === undefined) {\n return <InlineEntryCard isLoading />;\n }\n\n const allContentTypes = props.sdk.space.getCachedContentTypes();\n\n const contentType = allContentTypes.find(\n (contentType) => contentType.sys.id === entry.sys.contentType.sys.id\n );\n const contentTypeName = contentType ? contentType.name : '';\n\n const status = getEntryStatus(entry.sys);\n\n if (status === 'deleted') {\n return (\n <InlineEntryCard\n testId={INLINES.EMBEDDED_ENTRY}\n isSelected={props.isSelected}\n actions={[\n <MenuItem key=\"remove\" onClick={props.onRemove}>\n Remove\n </MenuItem>,\n ]}>\n <Text>Entry missing or inaccessible</Text>\n </InlineEntryCard>\n );\n }\n\n const title = getEntryTitle({\n entry: entry,\n contentType,\n localeCode: props.sdk.field.locale,\n defaultLocaleCode: props.sdk.locales.default,\n defaultTitle: 'Untitled',\n });\n\n return (\n <InlineEntryCard\n testId={INLINES.EMBEDDED_ENTRY}\n isSelected={props.isSelected}\n title={`${contentTypeName}: ${title}`}\n status={status}\n actions={\n !props.isReadOnly\n ? [\n <MenuItem key=\"edit\" onClick={props.onEdit}>\n Edit\n </MenuItem>,\n <MenuItem key=\"edit\" onClick={props.onRemove} isDisabled={props.isDisabled}>\n Remove\n </MenuItem>,\n ]\n : undefined\n }>\n <ScheduledIconWithTooltip\n getEntityScheduledActions={loadEntityScheduledActions}\n entityType=\"Entry\"\n entityId={entry.sys.id}>\n <ClockIcon className={styles.scheduledIcon} variant=\"muted\" testId=\"scheduled-icon\" />\n </ScheduledIconWithTooltip>\n <Text>{title}</Text>\n </InlineEntryCard>\n );\n};\n\nFetchingWrappedInlineEntryCard.propTypes = {\n sdk: PropTypes.object.isRequired,\n entryId: PropTypes.string.isRequired,\n isDisabled: PropTypes.bool.isRequired,\n isSelected: PropTypes.bool.isRequired,\n isReadOnly: PropTypes.bool.isRequired,\n onRemove: PropTypes.func.isRequired,\n onEdit: PropTypes.func.isRequired,\n onEntityFetchComplete: PropTypes.func,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { FetchingWrappedInlineEntryCard } from './FetchingWrappedInlineEntryCard';\nimport { styles } from './EmbeddedEntryInline.styles';\n\nclass EmbeddedEntryInline extends React.Component {\n static propTypes = {\n sdk: PropTypes.object.isRequired,\n isSelected: PropTypes.bool.isRequired,\n attributes: PropTypes.object.isRequired,\n editor: PropTypes.object.isRequired,\n node: PropTypes.object.isRequired,\n onEntityFetchComplete: PropTypes.func.isRequired,\n };\n\n getEntitySys() {\n const data = this.props.node.data;\n return {\n id: data.get('target').sys.id,\n type: data.get('target').sys.linkType,\n };\n }\n\n handleEditClick = () => {\n const { id } = this.getEntitySys();\n return this.props.sdk.navigator.openEntry(id, { slideIn: true });\n };\n\n handleRemoveClick = () => {\n const { editor, node } = this.props;\n editor.removeNodeByKey(node.key);\n };\n\n render() {\n const { sdk, editor, isSelected } = this.props;\n const isDisabled = editor.props.readOnly;\n const isReadOnly = editor.props.actionsDisabled;\n const { id: entryId } = this.getEntitySys();\n return (\n <span {...this.props.attributes} className={styles.root}>\n <FetchingWrappedInlineEntryCard\n sdk={sdk}\n entryId={entryId}\n isSelected={isSelected}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n onRemove={this.handleRemoveClick}\n onEdit={this.handleEditClick}\n onEntityFetchComplete={this.props.onEntityFetchComplete}\n />\n </span>\n );\n }\n}\n\nexport default EmbeddedEntryInline;\n","import React from 'react';\nimport isHotkey from 'is-hotkey';\nimport { INLINES } from '@contentful/rich-text-types';\nimport ToolbarIcon from './ToolbarIcon';\nimport EmbeddedEntryInline from './EmbeddedEntryInline';\n\nimport { selectEntryAndInsert, hasOnlyInlineEntryInSelection, canInsertInline } from './Utils';\n\nexport default ToolbarIcon;\n\nexport const EmbeddedEntryInlinePlugin = ({\n richTextAPI: { sdk, logShortcutAction, logViewportAction },\n}) => ({\n renderNode: (props, _editor, next) => {\n const { node, attributes, key } = props;\n if (node.type === INLINES.EMBEDDED_ENTRY) {\n return (\n <EmbeddedEntryInline\n sdk={sdk}\n {...props}\n {...attributes}\n onEntityFetchComplete={() => {\n logViewportAction('linkRendered', { key });\n }}\n />\n );\n }\n return next();\n },\n onKeyDown: (event, editor, next) => {\n const hotkey = ['mod+shift+2'];\n if (isHotkey(hotkey, event)) {\n if (canInsertInline(editor)) {\n selectEntryAndInsert(sdk, editor, logShortcutAction);\n return;\n }\n }\n if (isHotkey('enter', event)) {\n if (hasOnlyInlineEntryInSelection(editor)) {\n event.preventDefault();\n editor.moveToStartOfNextText();\n return;\n }\n }\n return next();\n },\n});\n","import * as React from 'react';\nimport { TOOLBAR_PLUGIN_PROP_TYPES } from '../shared/PluginApi';\nimport { toolbarActionHandlerWithSafeAutoFocus } from '../shared/Util';\nimport EditList from './EditListWrapper';\n\nconst applyChange = (editor, type, logAction) => {\n const {\n utils,\n changes: { unwrapList, wrapInList },\n } = EditList();\n\n if (utils.isSelectionInList(editor.value)) {\n if (utils.getCurrentList(editor.value).type !== type) {\n const currentList = utils.getCurrentList(editor.value);\n editor.setNodeByKey(currentList.key, type);\n logAction('insert', { nodeType: type });\n } else {\n unwrapList(editor);\n logAction('remove', { nodeType: type });\n }\n } else {\n wrapInList(editor, type);\n logAction('insert', { nodeType: type });\n }\n\n return editor.focus();\n};\n\nconst isActive = (editor, type) => {\n const list = EditList().utils.getCurrentList(editor.value);\n\n if (list) {\n return list.type === type;\n }\n return false;\n};\n\nexport default ({ type, title, children }) =>\n (Block) => {\n return class ToolbarDecorator extends React.Component {\n static propTypes = TOOLBAR_PLUGIN_PROP_TYPES;\n\n handleToggle = toolbarActionHandlerWithSafeAutoFocus(this, () => {\n const {\n editor,\n onToggle,\n richTextAPI: { logToolbarAction },\n } = this.props;\n applyChange(editor, type, logToolbarAction);\n onToggle(editor);\n });\n\n render() {\n const { editor } = this.props;\n return (\n <Block\n type={type}\n title={title}\n onToggle={this.handleToggle}\n isActive={isActive(editor, type)}\n disabled={this.props.disabled}>\n {children}\n </Block>\n );\n }\n };\n };\n","import React from 'react';\nimport { BLOCKS } from '@contentful/rich-text-types';\nimport ToolbarIcon from '../shared/ToolbarIcon';\nimport commonNode from '../shared/NodeDecorator';\nimport listToggleDecorator from './ToolbarDecorator';\nimport EditListWrapper from './EditListWrapper';\nimport { ListBulletedIcon, ListNumberedIcon } from '@contentful/f36-icons';\n\nexport const ListPlugin = () => {\n return {\n ...EditListWrapper(),\n renderNode: (props, _editor, next) => {\n if (props.node.type === BLOCKS.UL_LIST) {\n return commonNode('ul')(props);\n } else if (props.node.type === BLOCKS.OL_LIST) {\n return commonNode('ol')(props);\n } else if (props.node.type === BLOCKS.LIST_ITEM) {\n return commonNode('li')(props);\n }\n return next();\n },\n };\n};\n\nexport const UnorderedList = listToggleDecorator({\n type: BLOCKS.UL_LIST,\n title: 'UL',\n children: <ListBulletedIcon />,\n})((props) => <ToolbarIcon {...props} />);\n\nexport const OrderedList = listToggleDecorator({\n type: BLOCKS.OL_LIST,\n title: 'OL',\n children: <ListNumberedIcon />,\n})((props) => <ToolbarIcon {...props} />);\n","import React, { Component } from 'react';\nimport { BLOCKS } from '@contentful/rich-text-types';\nimport ToolbarIcon from '../shared/ToolbarIcon';\nimport blockSelectDecorator from '../shared/BlockSelectDecorator';\nimport { haveTextInSomeBlocks } from '../shared/UtilHave';\nimport { css, cx } from 'emotion';\nimport tokens from '@contentful/f36-tokens';\nimport { HorizontalRuleIcon } from '@contentful/f36-icons';\n\nconst styles = {\n hr: css`\n height: ${tokens.spacingM};\n background: transparent;\n position: relative;\n margin: 0 0 ${tokens.spacingL};\n &:hover {\n cursor: pointer;\n }\n &::after {\n content: '';\n position: absolute;\n width: 100%;\n height: 1px;\n background: ${tokens.gray300};\n top: 50%;\n }\n `,\n hrSelected: css`\n &::after {\n background: ${tokens.colorPrimary};\n -webkit-box-shadow: 0px 0px 5px ${tokens.colorPrimary};\n box-shadow: 0px 0px 5px ${tokens.colorPrimary};\n }\n `,\n};\n\nexport const HrPlugin = () => {\n return {\n renderNode: (props, _editor, next) => {\n if (props.node.type === BLOCKS.HR) {\n return (\n <hr\n className={cx(styles.hr, props.isSelected && styles.hrSelected)}\n {...props.attributes}\n />\n );\n }\n return next();\n },\n };\n};\n\nclass Hr extends Component {\n render() {\n return <ToolbarIcon {...this.props} />;\n }\n}\n\nexport default blockSelectDecorator({\n type: BLOCKS.HR,\n title: 'HR',\n children: <HorizontalRuleIcon />,\n applyChange: (editor, type) => {\n const hr = {\n type,\n object: 'block',\n };\n\n if (editor.value.blocks.size === 0 || haveTextInSomeBlocks(editor)) {\n editor.insertBlock(hr);\n } else {\n editor.setBlocks(hr);\n }\n\n editor.insertBlock(BLOCKS.PARAGRAPH).focus();\n },\n})(Hr);\n","import * as contentfulSlateJSAdapter from '@contentful/contentful-slatejs-adapter';\nimport { documentToPlainTextString } from '@contentful/rich-text-plain-text-renderer';\nimport schema from '../../constants/Schema';\n\nexport const getCharacterCount = (editor) => {\n const document = contentfulSlateJSAdapter.toContentfulDocument({\n document: editor.value.document.toJSON(),\n schema,\n });\n return documentToPlainTextString(document).length;\n};\n","import { getCharacterCount } from './Paste';\n\n/**\n * This plugin tracks the character count before and after a paste event,\n * including the text selected during the event. This creates parity with our\n * tracking for the markdown editor.\n */\nexport const PastePlugin = ({ richTextAPI: { logShortcutAction } }) => ({\n onPaste(_event, editor, next) {\n const characterCountSelection = global.getSelection().toString().length;\n const characterCountBefore = getCharacterCount(editor);\n\n setTimeout(() => {\n const characterCountAfter = getCharacterCount(editor);\n logShortcutAction('paste', {\n characterCountAfter,\n characterCountBefore,\n characterCountSelection,\n });\n });\n next();\n return;\n },\n});\n","import HtmlSerializer from 'slate-html-serializer';\nimport { BLOCKS, MARKS, INLINES } from '@contentful/rich-text-types';\n\n/**\n * Tags to block types mapping\n */\nconst BLOCK_TAGS = {\n p: BLOCKS.PARAGRAPH,\n ul: BLOCKS.UL_LIST,\n ol: BLOCKS.OL_LIST,\n blockquote: BLOCKS.QUOTE,\n hr: BLOCKS.HR,\n h1: BLOCKS.HEADING_1,\n h2: BLOCKS.HEADING_2,\n h3: BLOCKS.HEADING_3,\n h4: BLOCKS.HEADING_4,\n h5: BLOCKS.HEADING_5,\n h6: BLOCKS.HEADING_6,\n};\n\n/**\n * tags to marks types mapping\n */\nconst MARK_TAGS = {\n strong: MARKS.BOLD,\n b: MARKS.BOLD,\n em: MARKS.ITALIC,\n i: MARKS.ITALIC,\n u: MARKS.UNDERLINE,\n code: MARKS.CODE,\n};\n\nconst isGoogleWrapper = (el) =>\n el.tagName.toLowerCase() === 'b' && el.id.startsWith('docs-internal-guid-');\n\nconst isGoogleBold = (el) => {\n return el.style.fontWeight === '700';\n};\n\nconst isGoogleItalic = (el) => {\n return el.style.fontStyle === 'italic';\n};\n\nconst isGoogleUnderline = (el) => {\n return el.style.textDecoration === 'underline';\n};\n\nconst gDocsRules = {\n deserialize(el, next) {\n const isFromGoogleDocs = !!el.ownerDocument.querySelector('[id*=docs-internal-guid-]');\n\n if (!isFromGoogleDocs) {\n return;\n }\n if (isGoogleWrapper(el)) {\n return next(el.childNodes);\n }\n\n /**\n * Google Docs represent marks with css styles applied to SPAN\n * instead of html tags.\n * */\n if (el.tagName.toLowerCase() === 'span') {\n const marks = [];\n if (isGoogleBold(el)) {\n marks.push(MARKS.BOLD);\n }\n if (isGoogleItalic(el)) {\n marks.push(MARKS.ITALIC);\n }\n if (isGoogleUnderline(el)) {\n marks.push(MARKS.UNDERLINE);\n }\n\n const textNode = {\n object: 'text',\n leaves: [\n {\n object: 'leaf',\n text: el.textContent,\n marks: marks.map((type) => ({ object: 'mark', type })),\n },\n ],\n };\n\n return textNode;\n }\n },\n};\n\nconst listItems = {\n deserialize(el, next) {\n /** list-items in Contentful's schema must have blocks as direct children */\n if (el.tagName.toLowerCase() === 'li') {\n let childNodes = next(el.childNodes);\n\n childNodes = childNodes.map((node) => {\n if (node.object === 'text') {\n return {\n object: 'block',\n type: BLOCKS.PARAGRAPH,\n nodes: [node],\n };\n } else {\n return node;\n }\n });\n\n return {\n object: 'block',\n type: BLOCKS.LIST_ITEM,\n nodes: childNodes,\n };\n }\n },\n};\n\nconst links = {\n deserialize(el, next) {\n if (el.tagName.toLowerCase() === 'a') {\n // we only support links with href,\n // if href is not defined, we should serialize as text\n if (el.getAttribute('href')) {\n return {\n object: 'inline',\n type: INLINES.HYPERLINK,\n nodes: next(el.childNodes),\n data: {\n uri: el.getAttribute('href'),\n },\n };\n } else {\n return next(el.childNodes);\n }\n }\n },\n};\n\nconst macOSTrailingBreak = {\n deserialize(el) {\n if (el.tagName.toLowerCase() === 'br' && el.classList.contains('Apple-interchange-newline')) {\n return null;\n }\n },\n};\n\nconst marks = {\n deserialize(el, next) {\n const mark = MARK_TAGS[el.tagName.toLowerCase()];\n if (mark) {\n return {\n object: 'mark',\n type: mark,\n nodes: next(el.childNodes),\n };\n }\n },\n};\n\nconst blocks = {\n deserialize(el, next) {\n const block = BLOCK_TAGS[el.tagName.toLowerCase()];\n if (block) {\n const childNodes = next(el.childNodes);\n\n return {\n object: 'block',\n type: block,\n nodes: childNodes.length > 0 ? childNodes : [{ object: 'text' }],\n };\n }\n },\n};\n\nconst RULES = [gDocsRules, listItems, links, macOSTrailingBreak, marks, blocks];\n\nexport const create = () => {\n return new HtmlSerializer({\n rules: RULES,\n });\n};\n","const RICH_TEXT_COMMANDS_CONTEXT_MARK_TYPE = 'richTextCommandsContext';\n\n/**\n * @description\n * Returns Command Palette command text or leading slash\n *\n * @param {Slate.Editor} editor\n * @returns {String}\n */\nexport const getCommandText = (editor) => {\n // matches the character / literally (case sensitive)\n if (!editor.value.startText) {\n return null;\n }\n const COMMAND_REGEX = /\\/(\\S*)$/;\n const startOffset = editor.value.selection.start.offset;\n const textBefore = editor.value.startText.text.slice(0, startOffset);\n const result = COMMAND_REGEX.exec(textBefore);\n return result === null ? null : result[1] || result[0];\n};\n\n/**\n * @description\n * Returns Command Palette Decoration if applicable to current text.\n *\n * @param {Slate.Editor} editor\n * @returns {Slate.Decoration?}\n */\nexport const getDecorationOrDefault = (editor) => {\n const value = editor.value;\n if (!value.startText) {\n return null;\n }\n\n const inputValue = getCommandText(editor);\n\n const { selection } = value;\n\n if (inputValue) {\n const decoration = {\n anchor: {\n key: selection.start.key,\n offset: selection.start.offset - (inputValue.length + 1),\n },\n focus: {\n key: selection.start.key,\n offset: selection.start.offset,\n },\n mark: {\n type: RICH_TEXT_COMMANDS_CONTEXT_MARK_TYPE,\n },\n };\n return decoration;\n }\n return null;\n};\n\nexport const hasCommandPaletteMarkType = (markType) => {\n return markType === RICH_TEXT_COMMANDS_CONTEXT_MARK_TYPE;\n};\n\n/**\n * @description\n * Checks if document has command palette decoration\n *\n * @param {Slate.Editor} editor\n * @returns {Boolean}\n */\nexport const hasCommandPaletteDecoration = (editor) => {\n const decorations = editor.value.document.getDecorations(editor);\n\n if (decorations.isEmpty()) {\n return false;\n }\n\n const commandPaletteDecoration = decorations.find(\n (d) => d.mark.type === RICH_TEXT_COMMANDS_CONTEXT_MARK_TYPE\n );\n return Boolean(commandPaletteDecoration);\n};\n\nexport const removeCommand = (editor, command, anchorOffset = 1) => {\n editor.removeTextByKey(\n editor.value.selection.start.key,\n editor.value.selection.start.offset - (command.length + anchorOffset),\n command.length + anchorOffset\n );\n};\n","import { isNodeTypeEnabled } from '../../validations';\nimport { INLINES, BLOCKS } from '@contentful/rich-text-types';\nimport { entityHelpers } from '@contentful/field-editor-shared';\n\nconst ACTIONS = {\n EMBED: 'embed',\n CREATE_EMBED: 'create_embed',\n};\n\nexport async function fetchAssets(sdk, query = '') {\n const assets = await sdk.space.getAssets({ query });\n return assets.items.map((asset) => ({\n contentTypeName: 'Asset',\n displayTitle: asset.fields.title ? asset.fields.title[sdk.field.locale] : 'Untitled',\n id: asset.sys.id,\n entry: asset,\n thumbnail:\n asset.fields.file &&\n asset.fields.file[sdk.field.locale] &&\n `${asset.fields.file[sdk.field.locale].url}?h=30`,\n }));\n}\n\nexport async function fetchEntries(sdk, contentType, query = '') {\n const entries = await sdk.space.getEntries({\n content_type: contentType.sys.id,\n query,\n });\n\n return Promise.all(\n entries.items.map(async (entry) => {\n const description = entityHelpers.getEntityDescription({\n contentType,\n entity: entry,\n localeCode: sdk.field.locale,\n defaultLocaleCode: sdk.locales.default,\n });\n const displayTitle = entityHelpers.getEntryTitle({\n entry,\n contentType,\n localeCode: sdk.field.locale,\n defaultLocaleCode: sdk.locales.default,\n defaultTitle: 'Untitled',\n });\n return {\n contentTypeName: contentType.name,\n displayTitle: displayTitle,\n id: entry.sys.contentType.sys.id,\n description,\n entry,\n };\n })\n );\n}\n\n/**\n * @description\n * Checks the field validations if the current content type is valid to be linked/embedded.\n *\n * @param {Object} field\n * @param {Object} contentType\n * @param {String} embedType\n * @returns {Boolean}\n */\nexport const isValidLinkedContentType = (field, contentType, embedType) => {\n if (field.validations.length === 0) {\n return true;\n }\n\n const nodes = field.validations.filter((val) => val.nodes)[0].nodes;\n\n if (nodes[embedType] === undefined) {\n return true;\n }\n\n return !!nodes[embedType]\n .filter((typeVal) => typeVal.linkContentType)\n .reduce((pre, cur) => [...pre, cur.linkContentType], [])\n .reduce((pre, cur) => [...pre, ...cur], [])\n .find((ct) => ct === contentType.sys.id);\n};\n\nexport const isEmbeddingEnabled = (field) =>\n isNodeTypeEnabled(field, BLOCKS.EMBEDDED_ASSET) ||\n isNodeTypeEnabled(field, BLOCKS.EMBEDDED_ENTRY) ||\n isNodeTypeEnabled(field, INLINES.EMBEDDED_ENTRY);\n\nexport class CommandPaletteActionBuilder {\n constructor(sdk) {\n this.sdk = sdk;\n }\n\n // TODO: Let's create dedicated functions for assets so we do not have to pass a CT.\n\n maybeBuildEmbedAction(embedType, contentType, callback) {\n if (!isNodeTypeEnabled(this.sdk.field, embedType)) {\n return false;\n }\n const isAsset = !contentType;\n if (!isAsset && !isValidLinkedContentType(this.sdk.field, contentType, embedType)) {\n return false;\n }\n\n return buildAction(embedType, contentType, ACTIONS.EMBED, callback);\n }\n\n async maybeBuildCreateAndEmbedAction(embedType, contentType, callback) {\n if (!isNodeTypeEnabled(this.sdk.field, embedType)) {\n return false;\n }\n\n const isAsset = !contentType;\n if (!isAsset) {\n if (!isValidLinkedContentType(this.sdk.field, contentType, embedType)) {\n return false;\n }\n\n const canCreateEntryOfContentType = await this.sdk.access.can('create', {\n sys: {\n type: 'Entry',\n contentType: {\n sys: contentType.sys,\n },\n },\n });\n\n if (canCreateEntryOfContentType === false) {\n return false;\n }\n } else {\n const canCreateAssets = await this.sdk.access.can('create', 'Asset');\n if (canCreateAssets === false) {\n return false;\n }\n }\n\n return buildAction(embedType, contentType, ACTIONS.CREATE_EMBED, callback);\n }\n}\n\nfunction buildAction(embedType, contentType, actionType, callback) {\n const isAsset = !contentType;\n const isInline = embedType === INLINES.EMBEDDED_ENTRY;\n const label = `${actionType === ACTIONS.EMBED ? 'Embed' : 'Create and embed'} ${\n isAsset ? 'Asset' : contentType.name\n } ${isInline ? ' - Inline' : ''}`;\n\n const icon = isInline ? 'EmbeddedEntryInline' : 'EmbeddedEntryBlock';\n\n return {\n label,\n group: isAsset ? 'Assets' : contentType.name,\n callback,\n icon,\n };\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport isHotKey from 'is-hotkey';\nimport cn from 'classnames';\nimport { css } from 'emotion';\nimport tokens from '@contentful/f36-tokens';\nimport uniqBy from 'lodash/uniqBy';\nimport { CloseIcon } from '@contentful/f36-icons';\nimport {\n Spinner,\n SectionHeading,\n SkeletonContainer,\n SkeletonBodyText,\n Icon,\n IconButton,\n} from '@contentful/f36-components';\n\nconst styles = {\n commandPanel: css({\n display: 'block',\n background: tokens.colorWhite,\n boxShadow: '0 2px 5px rgba(0, 0, 0, 0.1), 0 5px 10px -5px rgba(0, 0, 0, 0.3)',\n border: `1px solid ${tokens.gray400}`,\n borderRadius: tokens.borderRadiusMedium,\n fontFamily: tokens.fontStackPrimary,\n width: '500px',\n overflowY: 'auto',\n }),\n commandPanelList: css({\n display: 'block',\n listStyle: 'none',\n margin: 0,\n padding: 0,\n height: '200px',\n overflowY: 'auto',\n }),\n item: css({\n fontSize: tokens.fontSizeM,\n lineHeight: tokens.lineHeightDefault,\n padding: `${tokens.spacingS} ${tokens.spacingXs}`,\n borderBottom: `1px solid ${tokens.gray300}`,\n margin: 0,\n color: tokens.gray900,\n }),\n divider: css({\n fontWeight: tokens.fontWeightDemiBold,\n padding: `${tokens.spacingS} ${tokens.spacingXs}`,\n letterSpacing: tokens.letterSpacingWide,\n fontSize: tokens.fontSizeS,\n textTransform: 'uppercase',\n borderBottom: `1px solid ${tokens.gray400}`,\n margin: 0,\n lineHeight: tokens.lineHeightDefault,\n color: tokens.gray900,\n }),\n icon: css({\n marginRight: 10,\n }),\n isSelected: css({\n background: tokens.gray200,\n }),\n skeletonContainer: css({\n padding: tokens.spacingM,\n height: 200,\n margin: 0,\n }),\n button: css({\n textAlign: 'left',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n border: 'none',\n background: 'transparent',\n fontSize: tokens.fontSizeM,\n }),\n navBar: css({\n display: 'flex',\n bottom: 0,\n background: tokens.gray100,\n padding: `${tokens.spacingS} ${tokens.spacingXs}`,\n width: '100%',\n }),\n loader: css({\n marginLeft: 'auto',\n }),\n thumbnail: css({\n marginRight: 15,\n }),\n instruction: css({\n marginRight: 15,\n color: tokens.gray600,\n }),\n closeButton: css({\n marginLeft: 'auto',\n }),\n};\n\nconst itemPropType = PropTypes.shape({\n label: PropTypes.string,\n icon: PropTypes.string,\n thumbnail: PropTypes.string,\n callback: PropTypes.func,\n});\n\nclass CommandPanelItem extends React.Component {\n static propTypes = {\n isSelected: PropTypes.bool,\n index: PropTypes.number,\n classNames: PropTypes.string,\n item: itemPropType,\n };\n listItemRef = null;\n\n componentDidUpdate() {\n if (this.props.isSelected) {\n this.listItemRef.scrollIntoView({\n block: 'nearest',\n inline: 'start',\n });\n }\n }\n\n render() {\n const { index, classNames, item } = this.props;\n\n return (\n <li\n key={index}\n className={classNames}\n ref={(ref) => {\n this.listItemRef = ref;\n }}>\n <button type=\"button\" className={styles.button} onClick={item.callback && item.callback}>\n {item.icon && <Icon className={styles.icon} as={item.icon} variant=\"secondary\" />}\n {item.thumbnail && <img className={styles.thumbnail} src={item.thumbnail} alt=\"\" />}\n {item.label}\n </button>\n </li>\n );\n }\n}\n\nconst Instruction = ({ children }) => <span className={styles.instruction}>{children}</span>;\nInstruction.propTypes = {\n children: PropTypes.node,\n};\n\nexport class CommandPanel extends React.Component {\n static propTypes = {\n items: PropTypes.arrayOf(itemPropType),\n searchString: PropTypes.string,\n className: PropTypes.string,\n testId: PropTypes.string,\n isLoading: PropTypes.bool,\n isUpdating: PropTypes.bool,\n breadcrumb: PropTypes.string,\n richTextAPI: PropTypes.object,\n onClose: PropTypes.func,\n };\n static defaultProps = {\n className: undefined,\n searchString: '',\n items: [],\n testId: 'cf-ui-command-panel',\n isLoading: true,\n isUpdating: false,\n };\n\n state = {\n selectedKey: 0,\n items: [],\n };\n\n static getDerivedStateFromProps(props, state) {\n const itemsHasUpdated = props.items !== state.originalItems;\n const searchStringHasUpdated = props.searchString !== state.originalSearchString;\n\n const items = props.items.filter((item) =>\n item.label.toLowerCase().includes(props.searchString ? props.searchString.toLowerCase() : '')\n );\n\n return {\n originalItems: props.items,\n originalSearchString: props.searchString,\n items,\n selectedKey: itemsHasUpdated || searchStringHasUpdated ? 0 : state.selectedKey,\n };\n }\n\n componentDidMount() {\n this.props.richTextAPI.logViewportAction('openRichTextCommandsPalette');\n document.addEventListener('keydown', this.handleKeyboard, true);\n }\n\n componentWillUnmount() {\n this.props.richTextAPI.logViewportAction('cancelRichTextCommandsPalette');\n document.removeEventListener('keydown', this.handleKeyboard, true);\n }\n\n handleKeyboard = (e) => {\n if (isHotKey('up', e)) {\n if (this.state.selectedKey === 0) return;\n this.setState((state) => ({\n selectedKey: state.selectedKey - 1,\n }));\n }\n\n if (isHotKey('down', e)) {\n if (this.state.selectedKey === this.state.items.length - 1) return;\n this.setState((state) => ({\n selectedKey: state.selectedKey + 1,\n }));\n }\n\n if (isHotKey('enter', e)) {\n const selectedItem = this.state.items[this.state.selectedKey];\n if (selectedItem && selectedItem.callback) selectedItem.callback();\n }\n };\n\n renderGroups() {\n const groups = uniqBy(\n this.state.items.map((item) => item.group),\n (value) => value\n );\n\n if (!groups.length) {\n return <li className={styles.item}>No results</li>;\n }\n\n return groups.map((groupName, index) => {\n return (\n <React.Fragment key={index}>\n {groupName && (\n <li key={groupName} className={styles.divider}>\n {groupName}\n </li>\n )}\n {this.renderItems(groupName)}\n </React.Fragment>\n );\n });\n }\n\n renderItems(groupName) {\n return this.state.items\n .filter((item) => item.group === groupName)\n .map((item) => {\n const index = this.state.items.indexOf(item);\n const isSelected = index === this.state.selectedKey;\n\n const classNames = cn(styles.item, {\n [styles.isSelected]: isSelected,\n });\n\n return (\n <CommandPanelItem\n item={item}\n classNames={classNames}\n key={index}\n isSelected={isSelected}\n />\n );\n });\n }\n\n renderNavigationBar = () => (\n <div className={styles.navBar}>\n <SectionHeading marginBottom=\"none\">\n {this.props.breadcrumb ? `Embed ${this.props.breadcrumb}` : 'Richtext Commands'}\n </SectionHeading>\n <IconButton\n aria-label=\"Close\"\n className={styles.closeButton}\n icon={<CloseIcon variant=\"muted\" />}\n variant=\"transparent\"\n onClick={this.props.onClose}\n />\n </div>\n );\n\n renderStatusBar = () => (\n <div className={styles.navBar}>\n <span className={styles.instructions}>\n <Instruction>↑ ↓ to navigate</Instruction>\n <Instruction>↵ to confirm</Instruction>\n <Instruction>esc to close</Instruction>\n </span>\n {this.props.isUpdating && (\n <span className={styles.loader}>\n loading <Spinner size=\"small\" />\n </span>\n )}\n </div>\n );\n\n renderSkeleton = () => (\n <li className={styles.skeletonContainer}>\n <SkeletonContainer>\n <SkeletonBodyText numberOfLines={7} />\n </SkeletonContainer>\n </li>\n );\n\n render() {\n const { className, testId, isLoading } = this.props;\n\n const classNames = cn(styles.commandPanel, className);\n\n return (\n <div className={classNames}>\n {this.renderNavigationBar()}\n <ul className={styles.commandPanelList} data-test-id={testId}>\n {isLoading ? this.renderSkeleton() : this.renderGroups()}\n </ul>\n {this.renderStatusBar()}\n </div>\n );\n }\n}\n\nexport default CommandPanel;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { cx, css } from 'emotion';\n\nconst throttle = (delay = 200, fn) => {\n let lastCall = 0;\n const throttleExec = (...args) => {\n const now = new Date().getTime();\n if (now - lastCall < delay) {\n return;\n }\n lastCall = now;\n return fn(...args); // eslint-disable-line\n };\n return throttleExec;\n};\n\nconst defaultProps = {\n testId: 'cf-ui-in-viewport',\n offset: 0,\n};\n\nconst isBrowser = typeof window !== 'undefined';\n\nexport class InViewport extends Component {\n static defaultProps = defaultProps;\n\n tGetDomPosition = null;\n nodeRef = null;\n lastOverflowAt = null;\n\n tOnOverflowTop = this.props.onOverflowTop && throttle(100, this.props.onOverflowTop);\n tOnOverflowBottom = this.props.onOverflowBottom && throttle(100, this.props.onOverflowBottom);\n tOnOverflowRight = this.props.onOverflowRight && throttle(100, this.props.onOverflowRight);\n tOnOverflowLeft = this.props.onOverflowLeft && throttle(100, this.props.onOverflowLeft);\n\n componentDidMount() {\n this.getDomPosition();\n this.bindEventListeners();\n }\n\n componentDidUpdate() {\n this.getDomPosition();\n }\n\n componentWillUnmount() {\n if (isBrowser && this.tGetDomPosition) {\n window.removeEventListener('scroll', this.tGetDomPosition, true);\n window.removeEventListener('resize', this.tGetDomPosition);\n }\n }\n\n getDomPosition = () => {\n if (isBrowser && this.nodeRef) {\n const html = document.documentElement;\n const boundingClientRect = this.nodeRef.getBoundingClientRect();\n const windowWidth = window.innerWidth || html.clientWidth;\n const windowHeight = window.innerHeight || html.clientHeight;\n this.handleOverflow(boundingClientRect, windowWidth, windowHeight);\n }\n };\n\n bindEventListeners = () => {\n this.tGetDomPosition = throttle(600, this.getDomPosition);\n if (isBrowser && this.tGetDomPosition) {\n window.addEventListener('scroll', this.tGetDomPosition, true);\n window.addEventListener('resize', this.tGetDomPosition);\n }\n };\n\n handleOverflow = ({ top, left, bottom, right }, windowWidth, windowHeight) => {\n const { offset } = this.props;\n const topThreshold = 0 - offset;\n const leftThreshold = 0 - offset;\n const rightThreshold = windowWidth + offset;\n const bottomThreshold = windowHeight + offset;\n\n if (top + right + bottom + left !== 0) {\n if (top < topThreshold && this.lastOverflowAt !== 'bottom') {\n this.lastOverflowAt = 'top';\n this.tOnOverflowTop && this.tOnOverflowTop();\n } else if (left < leftThreshold && this.lastOverflowAt !== 'right') {\n this.lastOverflowAt = 'left';\n this.tOnOverflowLeft && this.tOnOverflowLeft();\n } else if (bottom > bottomThreshold && this.lastOverflowAt !== 'top') {\n this.lastOverflowAt = 'bottom';\n this.tOnOverflowBottom && this.tOnOverflowBottom();\n } else if (right > rightThreshold && this.lastOverflowAt !== 'left') {\n this.lastOverflowAt = 'right';\n this.tOnOverflowRight && this.tOnOverflowRight();\n }\n }\n };\n\n render() {\n const {\n className,\n children,\n testId,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onOverflowBottom,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onOverflowLeft,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onOverflowRight,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onOverflowTop,\n ...otherProps\n } = this.props;\n\n const classNames = cx(css({ display: 'inline-block' }), className);\n\n return (\n <div\n ref={(ref) => {\n this.nodeRef = ref;\n }}\n className={classNames}\n data-test-id={testId}\n {...otherProps}>\n {children}\n </div>\n );\n }\n}\n\nInViewport.propTypes = {\n offset: PropTypes.number,\n onOverflowTop: PropTypes.func,\n onOverflowRight: PropTypes.func,\n onOverflowBottom: PropTypes.func,\n onOverflowLeft: PropTypes.func,\n className: PropTypes.string,\n children: PropTypes.any,\n testId: PropTypes.string,\n};\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\nimport { BLOCKS, INLINES } from '@contentful/rich-text-types';\nimport isHotKey from 'is-hotkey';\nimport throttle from 'lodash/throttle';\nimport flatten from 'lodash/flatten';\nimport { insertBlock } from '../../EmbeddedEntityBlock/Util';\nimport { insertInline } from '../../EmbeddedEntryInline/Utils';\nimport { fetchEntries, fetchAssets, CommandPaletteActionBuilder } from '../CommandPaletteService';\nimport { removeCommand } from '../Util';\nimport CommandPanelMenu from './CommandPanelMenu';\nimport { InViewport } from './InViewport/InViewport';\nimport tokens from '@contentful/f36-tokens';\n\nconst DEFAULT_POSITION = {\n top: 0,\n left: 0,\n};\nclass CommandPalette extends React.PureComponent {\n static propTypes = {\n editor: PropTypes.object,\n command: PropTypes.string,\n richTextAPI: PropTypes.object,\n };\n\n state = {\n anchorPosition: DEFAULT_POSITION,\n items: [],\n isLoading: true,\n panelPosition: 'bottom',\n };\n\n paletteDimensions = {\n height: 300,\n width: 300,\n };\n\n async componentDidMount() {\n this.isComponentMounted = true;\n await this.createInitialCommands();\n this.updatePanelPosition();\n this.paletteDimensions = {\n height: this.palette.getBoundingClientRect().height,\n width: this.palette.getBoundingClientRect().width,\n };\n }\n\n componentWillUnmount() {\n this.isComponentMounted = false;\n this.removeEventListeners();\n this.requestUpdate.cancel();\n }\n\n bindEventListeners = () => {\n document.addEventListener('scroll', this.handleScroll, true);\n document.addEventListener('keydown', this.handleKeyboard, true);\n document.addEventListener('click', this.handleOutsideClick, true);\n };\n\n removeEventListeners = () => {\n document.removeEventListener('scroll', this.handleScroll, true);\n document.removeEventListener('keydown', this.handleKeyboard, true);\n document.removeEventListener('click', this.handleOutsideClick, true);\n };\n\n handleOutsideClick = (event) => {\n if (!this.palette.contains(event.target)) {\n this.setState({\n isClosed: true,\n });\n }\n };\n\n requestUpdate = throttle(\n () => {\n if (this.state.currentCommand) {\n this.setState({ isUpdating: true });\n this.createCommands(\n this.state.currentCommand.contentType,\n this.state.currentCommand.type,\n this.props.command\n );\n }\n },\n 1000,\n { leading: true, trailing: false }\n );\n\n componentDidUpdate() {\n if (this.state.currentCommand && this.state.currentCommand.command !== this.props.command) {\n this.requestUpdate();\n } else {\n this.requestUpdate.cancel();\n }\n if (!this.state.isClosed) {\n this.bindEventListeners();\n } else {\n this.removeEventListeners();\n }\n }\n\n createCommand = (label, contentType, entry, type, description, thumbnail) => ({\n label: `${label}${description ? ` - ${description}` : ''}`,\n thumbnail,\n contentType,\n callback: () => {\n const { editor, command, richTextAPI } = this.props;\n const { logCommandPaletteAction } = richTextAPI;\n removeCommand(editor, command);\n switch (type) {\n case INLINES.EMBEDDED_ENTRY:\n insertInline(editor, entry.sys.id, false);\n logCommandPaletteAction('insert', {\n nodeType: INLINES.EMBEDDED_ENTRY,\n });\n break;\n case BLOCKS.EMBEDDED_ASSET:\n insertBlock(editor, BLOCKS.EMBEDDED_ASSET, entry, false);\n logCommandPaletteAction('insert', {\n nodeType: BLOCKS.EMBEDDED_ASSET,\n });\n break;\n default:\n insertBlock(editor, BLOCKS.EMBEDDED_ENTRY, entry, false);\n logCommandPaletteAction('insert', {\n nodeType: BLOCKS.EMBEDDED_ENTRY,\n });\n break;\n }\n },\n });\n\n onCreateAndEmbedEntity = async (contentTypeId, nodeType) => {\n const { richTextAPI, editor, command } = this.props;\n const { sdk } = richTextAPI;\n removeCommand(editor, command);\n const { createAsset, createEntry } = sdk.space;\n const isAsset = contentTypeId === null;\n const createEntity = () => (isAsset ? createAsset({}) : createEntry(contentTypeId, {}));\n const entity = await createEntity();\n const { id: entityId, type: entityType } = entity.sys;\n\n nodeType === INLINES.EMBEDDED_ENTRY\n ? insertInline(editor, entity.sys.id, false)\n : insertBlock(editor, nodeType, entity);\n\n richTextAPI.logCommandPaletteAction('insert', {\n nodeType,\n });\n\n const { navigator } = sdk;\n const openEntity = entityType === 'Asset' ? navigator.openAsset : navigator.openEntry;\n return openEntity(entityId, { slideIn: true });\n };\n\n createContentTypeActions = async (actionBuilder, contentType) => {\n const actions = await Promise.all([\n actionBuilder.maybeBuildEmbedAction(BLOCKS.EMBEDDED_ENTRY, contentType, () => {\n this.setState({ breadcrumb: contentType.name, isLoading: true });\n this.createCommands(contentType);\n this.clearCommand();\n }),\n actionBuilder.maybeBuildEmbedAction(INLINES.EMBEDDED_ENTRY, contentType, () => {\n this.setState({ breadcrumb: contentType.name, isLoading: true });\n this.createCommands(contentType, INLINES.EMBEDDED_ENTRY);\n this.clearCommand();\n }),\n actionBuilder.maybeBuildCreateAndEmbedAction(BLOCKS.EMBEDDED_ENTRY, contentType, () =>\n this.onCreateAndEmbedEntity(contentType.sys.id, BLOCKS.EMBEDDED_ENTRY)\n ),\n actionBuilder.maybeBuildCreateAndEmbedAction(INLINES.EMBEDDED_ENTRY, contentType, () =>\n this.onCreateAndEmbedEntity(contentType.sys.id, INLINES.EMBEDDED_ENTRY)\n ),\n ]);\n return actions.filter((action) => action);\n };\n\n createAssetActions = async (actionBuilder) => {\n const actions = await Promise.all([\n actionBuilder.maybeBuildEmbedAction(BLOCKS.EMBEDDED_ASSET, null, () => {\n this.setState({ breadcrumb: 'Asset', isLoading: true });\n this.createCommands(null, BLOCKS.EMBEDDED_ASSET);\n this.clearCommand();\n }),\n actionBuilder.maybeBuildCreateAndEmbedAction(BLOCKS.EMBEDDED_ASSET, null, () =>\n this.onCreateAndEmbedEntity(null, BLOCKS.EMBEDDED_ASSET)\n ),\n ]);\n return actions.filter((action) => action);\n };\n\n handleScroll = (e) => {\n if (e.target.nodeName !== 'UL') {\n this.updatePanelPosition();\n }\n };\n\n clearCommand = () => {\n if (this.props.command !== '/') {\n removeCommand(this.props.editor, this.props.command, 0);\n }\n };\n\n createCommands = async (contentType, type, command) => {\n this.setState({ isUpdating: true });\n const allEntries = !contentType\n ? await fetchAssets(this.props.richTextAPI.sdk, command)\n : await fetchEntries(this.props.richTextAPI.sdk, contentType, command);\n\n if (this.isComponentMounted) {\n this.setState({\n currentCommand: {\n contentType,\n type,\n command,\n },\n isUpdating: false,\n isLoading: false,\n items: allEntries.map((entry) =>\n this.createCommand(\n entry.displayTitle,\n entry.contentTypeName,\n entry.entry,\n type,\n entry.description,\n entry.thumbnail\n )\n ),\n });\n }\n };\n\n createInitialCommands = async () => {\n const { sdk } = this.props.richTextAPI;\n\n const allContentTypes = sdk.space.getCachedContentTypes();\n\n this.setState({\n isLoading: false,\n });\n\n const actionBuilder = new CommandPaletteActionBuilder(sdk);\n\n const contentTypeActions = flatten(\n await Promise.all(\n allContentTypes.map((ct) => this.createContentTypeActions(actionBuilder, ct))\n )\n );\n\n const assetActions = await this.createAssetActions(actionBuilder);\n\n this.setState((prevState) => ({\n items: [...prevState.items, ...contentTypeActions, ...assetActions],\n }));\n };\n\n handleKeyboard = (e) => {\n const isEscKey = isHotKey('esc', e); // ESC to close menu shouldn't blur editor.\n if (isEscKey || isHotKey('down', e) || isHotKey('up', e) || isHotKey('enter', e)) {\n e.preventDefault();\n e.stopPropagation();\n }\n if (isEscKey || isHotKey('tab', e)) {\n this.setState({\n isClosed: true,\n });\n }\n };\n\n render() {\n // Todo: Revisit tab index.\n /* eslint-disable jsx-a11y/no-noninteractive-tabindex */\n /* eslint-disable jsx-a11y/tabindex-no-positive */\n if (this.state.isClosed) {\n return null;\n }\n const root = window.document.body;\n return ReactDOM.createPortal(\n <div\n tabIndex=\"1\"\n ref={(ref) => {\n this.palette = ref;\n }}\n style={{\n position: 'absolute',\n outline: 'none',\n minWidth: 200,\n top: this.state.anchorPosition.top,\n left: this.state.anchorPosition.left,\n zIndex: tokens.zIndexDropdown,\n }}>\n <InViewport\n onOverflowBottom={() => {\n if (this.state.panelPosition !== 'top') {\n this.setState({ panelPosition: 'top' }, this.updatePanelPosition);\n }\n }}\n onOverflowTop={() => {\n if (this.state.panelPosition !== 'bottom') {\n this.setState({ panelPosition: 'bottom' }, this.updatePanelPosition);\n }\n }}>\n <CommandPanelMenu\n searchString={this.props.command === '/' ? '' : this.props.command}\n items={this.state.items}\n isLoading={this.state.isLoading}\n isUpdating={this.state.isUpdating}\n onClose={() => {\n this.setState({\n isClosed: true,\n });\n }}\n breadcrumb={this.state.breadcrumb}\n richTextAPI={this.props.richTextAPI}\n />\n </InViewport>\n </div>,\n root\n );\n }\n\n updatePanelPosition() {\n const anchorRect = document.getSelection().getRangeAt(0).getBoundingClientRect();\n\n this.setState((prevState) => ({\n anchorPosition: {\n top:\n prevState.panelPosition === 'bottom'\n ? anchorRect.bottom\n : anchorRect.top - this.paletteDimensions.height,\n left: anchorRect.left,\n },\n }));\n }\n}\n\nexport default CommandPalette;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { isEmbeddingEnabled } from './CommandPaletteService';\nimport { hasCommandPaletteDecoration, getCommandText } from './Util';\nimport CommandPanel from './CommandPanel';\nclass CommandPalette extends React.PureComponent {\n static propTypes = {\n editor: PropTypes.object,\n richTextAPI: PropTypes.object,\n };\n\n constructor(props) {\n super(props);\n\n const { field } = this.props.richTextAPI.sdk;\n\n this.state = {\n embedsEnabled: isEmbeddingEnabled(field),\n };\n }\n\n render() {\n if (!hasCommandPaletteDecoration(this.props.editor) || !this.state.embedsEnabled) {\n return null;\n }\n\n return (\n <CommandPanel\n editor={this.props.editor}\n richTextAPI={this.props.richTextAPI}\n command={getCommandText(this.props.editor)}\n />\n );\n }\n}\n\nexport default CommandPalette;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nclass CommandMark extends React.PureComponent {\n static propTypes = {\n children: PropTypes.node.isRequired,\n editor: PropTypes.object,\n attributes: PropTypes.object,\n };\n\n render() {\n // Todo: Revisit tab index.\n /* eslint-disable jsx-a11y/no-noninteractive-tabindex */\n /* eslint-disable jsx-a11y/tabindex-no-positive */\n const { children, attributes } = this.props;\n return (\n <span tabIndex=\"1\" {...attributes} className=\"command-context\">\n {children}\n </span>\n );\n }\n}\n\nexport default CommandMark;\n","import React from 'react';\n\nimport { getDecorationOrDefault, hasCommandPaletteMarkType } from './Util';\nimport CommandPalette from './CommandPalette';\nimport CommandMark from './CommandMark';\n\nexport const CommandPalettePlugin = ({ richTextAPI }) => ({\n /* eslint-disable react/display-name */\n decorateNode: (_node, editor, next) => {\n const others = next();\n\n const decoration = getDecorationOrDefault(editor);\n\n if (decoration) {\n return [...others, decoration];\n }\n\n return [...others];\n },\n renderMark: (props, editor, next) => {\n if (hasCommandPaletteMarkType(props.mark.type)) {\n return (\n <CommandMark attributes={props.attributes} editor={editor}>\n {props.children}\n </CommandMark>\n );\n }\n return next();\n },\n renderEditor: (_props, editor, next) => {\n const children = next();\n return (\n <React.Fragment>\n {children}\n <CommandPalette\n anchor={editor.state.commandMark}\n value={editor.value}\n editor={editor}\n richTextAPI={richTextAPI}\n />\n </React.Fragment>\n );\n },\n});\n","import { BLOCKS } from '@contentful/rich-text-types';\nimport { BoldPlugin } from './Bold';\nimport { ItalicPlugin } from './Italic';\nimport { UnderlinedPlugin } from './Underlined';\nimport { CodePlugin } from './Code';\nimport { QuotePlugin } from './Quote';\nimport { HyperlinkPlugin } from './Hyperlink';\nimport {\n Heading1Plugin,\n Heading2Plugin,\n Heading3Plugin,\n Heading4Plugin,\n Heading5Plugin,\n Heading6Plugin,\n} from './Heading';\n\nimport NewLinePlugin from './NewLinePlugin';\nimport { ParagraphPlugin } from './Paragraph';\n\nimport { EmbeddedAssetBlockPlugin, EmbeddedEntryBlockPlugin } from './EmbeddedEntityBlock';\nimport { EmbeddedEntryInlinePlugin } from './EmbeddedEntryInline';\n\nimport { ListPlugin } from './List';\nimport { HrPlugin } from './Hr';\n\nimport TrailingBlock from '@wikifactory/slate-trailing-block';\nimport { PastePlugin } from './Paste';\nimport { PasteHtmlPlugin } from './PasteHtml';\nimport { PasteTextPlugin } from './PasteText';\n\nimport { CommandPalettePlugin } from './CommandPalette';\nimport { InsertBeforeFirstVoidBlockPlugin } from './InsertBeforeFirstVoidBlock';\n\nimport schema from '../constants/Schema';\n\nexport function buildPlugins(richTextAPI) {\n return [\n { schema },\n InsertBeforeFirstVoidBlockPlugin({ richTextAPI }),\n BoldPlugin({ richTextAPI }),\n ItalicPlugin({ richTextAPI }),\n UnderlinedPlugin({ richTextAPI }),\n CodePlugin({ richTextAPI }),\n QuotePlugin({ richTextAPI }),\n HyperlinkPlugin({ richTextAPI }),\n Heading1Plugin({ richTextAPI }),\n Heading2Plugin({ richTextAPI }),\n Heading3Plugin({ richTextAPI }),\n Heading4Plugin({ richTextAPI }),\n Heading5Plugin({ richTextAPI }),\n Heading6Plugin({ richTextAPI }),\n ParagraphPlugin(),\n HrPlugin({ richTextAPI }),\n EmbeddedEntryInlinePlugin({ richTextAPI }),\n EmbeddedEntryBlockPlugin({ richTextAPI }),\n EmbeddedAssetBlockPlugin({ richTextAPI }),\n ListPlugin({ richTextAPI }),\n PastePlugin({ richTextAPI }),\n PasteHtmlPlugin(),\n PasteTextPlugin(),\n CommandPalettePlugin({ richTextAPI }),\n TrailingBlock({ type: BLOCKS.PARAGRAPH }),\n NewLinePlugin(),\n ];\n}\n","import isHotkey from 'is-hotkey';\nimport { isVoidBlockFirstAndFocused, insertParagraphAndFocusToStartOfDocument } from './Util';\n\n/**\n * Provides a way to insert content before the first void block in the document.\n */\nexport const InsertBeforeFirstVoidBlockPlugin = () => ({\n onKeyDown: (event, editor, next) => {\n if (isHotkey('enter', event) && isVoidBlockFirstAndFocused(editor)) {\n insertParagraphAndFocusToStartOfDocument(editor);\n return;\n }\n\n return next();\n },\n});\n","import { BLOCKS } from '@contentful/rich-text-types';\n/**\n * Checks if the first block in the document is void and is focused.\n *\n * @param {Slate.Editor} editor\n * @returns {Boolean}\n */\nexport function isVoidBlockFirstAndFocused(editor) {\n return (\n editor.value.document.getBlocks().first() === editor.value.focusBlock &&\n editor.isVoid(editor.value.focusBlock)\n );\n}\n\n/**\n * Inserts and focuses an empty paragraph as a first child to the document.\n *\n * @param {Slate.Editor} editor\n * @returns {void}\n */\n\nexport function insertParagraphAndFocusToStartOfDocument(editor) {\n editor.splitBlock().moveToStartOfDocument().setBlocks(BLOCKS.PARAGRAPH).focus();\n}\n","import isHotkey from 'is-hotkey';\nimport { BLOCKS } from '@contentful/rich-text-types';\nimport { toggleChange } from '../shared/BlockToggleDecorator';\nimport CommonNode from '../shared/NodeDecorator';\n\nconst plugin = (type, tagName, tagProps, hotkey) => {\n return {\n renderNode: (props, _editor, next) => {\n if (props.node.type === type) {\n return CommonNode(tagName, tagProps)(props);\n }\n return next();\n },\n onKeyDown: (e, editor, next) => {\n if (isHotkey(hotkey, e)) {\n editor.call(toggleChange, type);\n return;\n }\n return next();\n },\n };\n};\n\n// TODO: move hotkeys to components\nexport const ParagraphPlugin = (type = BLOCKS.PARAGRAPH) =>\n // Can't use <p/> as for e.g. links we need to show a tooltip inside.\n plugin(type, 'div', {}, ['mod+opt+0']);\n","import { getEventTransfer } from 'slate-react';\nimport { create as createSerializer } from './Serializer';\n\n/**\n * The plugin allows to paste html to the Structured Text Editor\n * by deserializing html content from ClipboardEvent into\n * Slate document.\n */\nexport const PasteHtmlPlugin = () => {\n const serializer = createSerializer();\n return {\n onPaste(event, editor, next) {\n const transfer = getEventTransfer(event);\n if (transfer.type != 'html') {\n next();\n return;\n }\n const { document } = serializer.deserialize(transfer.html);\n\n editor.insertFragment(document);\n return;\n },\n };\n};\n","import { getEventTransfer } from 'slate-react';\nimport PlainSerializer from 'slate-plain-serializer';\nimport { BLOCKS } from '@contentful/rich-text-types';\n\n/**\n * This plugin changes how pasting text is handled in the Rich text editor by\n * deserializing text content from ClipboardEvent into a Slate document. We\n * use it to handle converting new lines to paragraphs. Without this plugin,\n * lines of text separated by an empty new line will result in extra empty\n * paragraphs.\n */\nexport const PasteTextPlugin = () => {\n return {\n onPaste(event, editor, next) {\n const transfer = getEventTransfer(event);\n if (transfer.type !== 'text') {\n next();\n return;\n }\n\n const string = transfer.text;\n\n const { document } = PlainSerializer.deserialize(string, {\n defaultBlock: BLOCKS.PARAGRAPH,\n delimiter: '\\n\\n', // We look for double new lines as a delimiter for paragraphs\n });\n\n editor.insertFragment(document);\n return;\n },\n };\n};\n","import isHotkey from 'is-hotkey';\n\nexport default function () {\n return {\n onKeyDown(event, editor, next) {\n if (isHotkey('shift+enter', event)) {\n editor.insertText('\\n');\n return;\n }\n return next();\n },\n };\n}\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { Button, Menu } from '@contentful/f36-components';\n\nimport { PlusIcon, ChevronDownIcon } from '@contentful/f36-icons';\n\nclass EntryEmbedDropdown extends Component {\n static propTypes = {\n children: PropTypes.node.isRequired,\n isOpen: PropTypes.bool,\n disabled: PropTypes.bool,\n onClose: PropTypes.func,\n onOpen: PropTypes.func,\n };\n\n render() {\n const { onOpen, isOpen, onClose, children } = this.props;\n return (\n <Menu placement=\"bottom-end\" isOpen={isOpen} onClose={onClose} onOpen={onOpen}>\n <Menu.Trigger>\n <Button\n endIcon={<ChevronDownIcon />}\n testId=\"toolbar-entry-dropdown-toggle\"\n className=\"toolbar-entry-dropdown-toggle\"\n variant=\"secondary\"\n size=\"small\"\n startIcon={<PlusIcon />}\n isDisabled={this.props.disabled}>\n Embed\n </Button>\n </Menu.Trigger>\n <Menu.List className=\"toolbar-entry-dropdown-list\">{children}</Menu.List>\n </Menu>\n );\n }\n}\n\nexport default EntryEmbedDropdown;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { Flex } from '@contentful/f36-components';\n\nimport Bold from '../plugins/Bold';\nimport Italic from '../plugins/Italic';\nimport Underlined from '../plugins/Underlined';\nimport Code from '../plugins/Code';\nimport Quote from '../plugins/Quote';\nimport {\n Heading1,\n Heading2,\n Heading3,\n Heading4,\n Heading5,\n Heading6,\n Paragraph,\n HeadingDropdown,\n} from '../plugins/Heading';\n\nimport Hyperlink from '../plugins/Hyperlink';\nimport { css } from 'emotion';\n\nimport EmbeddedEntryInline from '../plugins/EmbeddedEntryInline';\nimport EmbeddedEntityBlock from '../plugins/EmbeddedEntityBlock';\nimport EntryEmbedDropdown from '../plugins/EntryEmbedDropdown';\n\nimport { UnorderedList, OrderedList } from '../plugins/List';\nimport Hr from '../plugins/Hr';\n\nimport { BLOCKS, MARKS, INLINES } from '@contentful/rich-text-types';\n\nimport { isNodeTypeEnabled, isMarkEnabled } from '../validations';\nimport tokens from '@contentful/f36-tokens';\n\nconst styles = {\n toolbar: css({\n border: `1px solid ${tokens.gray400}`,\n backgroundColor: tokens.gray100,\n padding: tokens.spacingXs,\n borderRadius: `${tokens.borderRadiusMedium} ${tokens.borderRadiusMedium} 0 0`,\n }),\n divider: css({\n display: 'inline-block',\n height: '21px',\n width: '1px',\n background: tokens.gray300,\n margin: `0 ${tokens.spacing2Xs}`,\n }),\n embedActionsWrapper: css({\n display: ['-webkit-box', '-ms-flexbox', 'flex'],\n webkitAlignSelf: 'flex-start',\n alignSelf: 'flex-start',\n msFlexItemAlign: 'start',\n marginLeft: 'auto',\n }),\n formattingOptionsWrapper: css({\n display: ['-webkit-box', '-ms-flexbox', 'flex'],\n msFlexAlign: 'center',\n webkitBoxAlign: 'center',\n alignItems: 'center',\n msFlexWrap: 'wrap',\n flexWrap: 'wrap',\n marginRight: '20px',\n }),\n};\n\nexport default class Toolbar extends React.Component {\n static propTypes = {\n richTextAPI: PropTypes.object.isRequired,\n isDisabled: PropTypes.bool.isRequired,\n editor: PropTypes.object.isRequired,\n onChange: PropTypes.func.isRequired,\n };\n\n hasMounted = false;\n\n isReadyToSetFocusProgrammatically = false;\n\n state = {\n headingMenuOpen: false,\n canAccessAssets: false,\n ...getValidationInfo(this.props.richTextAPI.sdk.field),\n };\n\n componentDidMount() {\n this.hasMounted = true;\n this.props.richTextAPI.sdk.access.can('read', 'Asset').then((canReadAssets) => {\n if (this.hasMounted) {\n // Prevent setting state on unmounted component\n this.setState({ canAccessAssets: canReadAssets });\n }\n });\n }\n\n componentWillUnmount() {\n this.hasMounted = false;\n }\n\n onChange = (...args) => {\n this.setState({ headingMenuOpen: false });\n this.props.onChange(...args);\n };\n\n handleEmbedDropdownOpen = () =>\n this.setState({\n isEmbedDropdownOpen: true,\n });\n\n handleEmbedDropdownClose = () =>\n this.setState({\n isEmbedDropdownOpen: false,\n });\n\n renderEmbeds = (props) => {\n const field = this.props.richTextAPI.sdk.field;\n\n const inlineEntryEmbedEnabled = isNodeTypeEnabled(field, INLINES.EMBEDDED_ENTRY);\n const blockEntryEmbedEnabled = isNodeTypeEnabled(field, BLOCKS.EMBEDDED_ENTRY);\n const blockAssetEmbedEnabled =\n this.state.canAccessAssets && isNodeTypeEnabled(field, BLOCKS.EMBEDDED_ASSET);\n\n const numEnabledEmbeds = [\n inlineEntryEmbedEnabled,\n blockEntryEmbedEnabled,\n blockAssetEmbedEnabled,\n ].filter(Boolean).length;\n\n return (\n <div className={styles.embedActionsWrapper}>\n {numEnabledEmbeds > 1 ? (\n <EntryEmbedDropdown\n onOpen={this.handleEmbedDropdownOpen}\n isOpen={this.state.isEmbedDropdownOpen}\n disabled={props.disabled}\n onClose={this.handleEmbedDropdownClose}>\n {blockEntryEmbedEnabled && (\n <EmbeddedEntityBlock nodeType={BLOCKS.EMBEDDED_ENTRY} {...props} />\n )}\n {inlineEntryEmbedEnabled && <EmbeddedEntryInline {...props} />}\n {blockAssetEmbedEnabled && (\n <EmbeddedEntityBlock nodeType={BLOCKS.EMBEDDED_ASSET} {...props} />\n )}\n </EntryEmbedDropdown>\n ) : (\n <React.Fragment>\n {blockEntryEmbedEnabled && (\n <EmbeddedEntityBlock nodeType={BLOCKS.EMBEDDED_ENTRY} isButton {...props} />\n )}\n {inlineEntryEmbedEnabled && <EmbeddedEntryInline isButton {...props} />}\n {blockAssetEmbedEnabled && (\n <EmbeddedEntityBlock nodeType={BLOCKS.EMBEDDED_ASSET} isButton {...props} />\n )}\n </React.Fragment>\n )}\n </div>\n );\n };\n\n openHeadingMenu = () =>\n this.setState({\n headingMenuOpen: true,\n });\n\n closeHeadingMenu = () =>\n this.setState({\n headingMenuOpen: false,\n });\n\n render() {\n const { editor, isDisabled, richTextAPI } = this.props;\n if (editor.value.selection.isFocused) {\n // If the Slate input has ever been focused by the user, we can now also\n // programmatically use `editor.setFocus()` without undesired side-effects.\n this.isReadyToSetFocusProgrammatically = true;\n }\n const props = {\n editor,\n onToggle: this.onChange,\n disabled: isDisabled,\n richTextAPI,\n canAutoFocus: this.isReadyToSetFocusProgrammatically,\n };\n const { field } = richTextAPI.sdk;\n const { isAnyHyperlinkEnabled, isAnyListEnabled, isAnyMarkEnabled } = this.state;\n const currentBlockType = props.editor.value.blocks.getIn([0, 'type']);\n return (\n <Flex testId=\"toolbar\" className={styles.toolbar} alignItems=\"center\">\n <div className={styles.formattingOptionsWrapper}>\n <HeadingDropdown\n onOpen={this.openHeadingMenu}\n isToggleActive={true}\n isOpen={this.state.headingMenuOpen}\n onClose={this.closeHeadingMenu}\n currentBlockType={currentBlockType}\n disabled={props.disabled}>\n <Paragraph {...props} />\n {isNodeTypeEnabled(field, BLOCKS.HEADING_1) && <Heading1 {...props} />}\n {isNodeTypeEnabled(field, BLOCKS.HEADING_2) && <Heading2 {...props} />}\n {isNodeTypeEnabled(field, BLOCKS.HEADING_3) && <Heading3 {...props} />}\n {isNodeTypeEnabled(field, BLOCKS.HEADING_4) && <Heading4 {...props} />}\n {isNodeTypeEnabled(field, BLOCKS.HEADING_5) && <Heading5 {...props} />}\n {isNodeTypeEnabled(field, BLOCKS.HEADING_6) && <Heading6 {...props} />}\n </HeadingDropdown>\n {isAnyMarkEnabled && <span className={styles.divider} data-test-id=\"mark-divider\" />}\n {isMarkEnabled(field, MARKS.BOLD) && <Bold {...props} />}\n {isMarkEnabled(field, MARKS.ITALIC) && <Italic {...props} />}\n {isMarkEnabled(field, MARKS.UNDERLINE) && <Underlined {...props} />}\n {isMarkEnabled(field, MARKS.CODE) && <Code {...props} />}\n {isAnyHyperlinkEnabled && (\n <React.Fragment>\n <span className={styles.divider} data-test-id=\"hyperlink-divider\" />\n <Hyperlink {...props} />\n </React.Fragment>\n )}\n {isAnyListEnabled && <span className={styles.divider} data-test-id=\"list-divider\" />}\n {isNodeTypeEnabled(field, BLOCKS.UL_LIST) && <UnorderedList {...props} />}\n {isNodeTypeEnabled(field, BLOCKS.OL_LIST) && <OrderedList {...props} />}\n {isNodeTypeEnabled(field, BLOCKS.QUOTE) && <Quote {...props} />}\n {isNodeTypeEnabled(field, BLOCKS.HR) && <Hr {...props} />}\n </div>\n {this.renderEmbeds(props)}\n </Flex>\n );\n }\n}\n\nfunction getValidationInfo(field) {\n const isAnyMarkEnabled =\n isMarkEnabled(field, MARKS.BOLD) ||\n isMarkEnabled(field, MARKS.ITALIC) ||\n isMarkEnabled(field, MARKS.UNDERLINE) ||\n isMarkEnabled(field, MARKS.CODE);\n\n const isAnyHyperlinkEnabled =\n isNodeTypeEnabled(field, INLINES.HYPERLINK) ||\n isNodeTypeEnabled(field, INLINES.ASSET_HYPERLINK) ||\n isNodeTypeEnabled(field, INLINES.ENTRY_HYPERLINK);\n\n const isAnyListEnabled =\n isNodeTypeEnabled(field, BLOCKS.UL_LIST) ||\n isNodeTypeEnabled(field, BLOCKS.OL_LIST) ||\n isNodeTypeEnabled(field, BLOCKS.QUOTE) ||\n isNodeTypeEnabled(field, BLOCKS.HR);\n return {\n isAnyMarkEnabled,\n isAnyHyperlinkEnabled,\n isAnyListEnabled,\n };\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { css } from 'emotion';\n\nconst styles = {\n nativeSticky: css`\n position: -webkit-sticky;\n position: sticky;\n top: -1px;\n z-index: 2;\n `,\n};\n\nconst StickyToolbarWrapper = ({ isDisabled, children }) => (\n <div className={isDisabled ? '' : styles.nativeSticky}>{children}</div>\n);\n\nStickyToolbarWrapper.propTypes = {\n isDisabled: PropTypes.bool,\n children: PropTypes.node,\n};\n\nexport default StickyToolbarWrapper;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Editor } from 'slate-react';\nimport { Value, Editor as BasicEditor } from 'slate';\nimport noop from 'lodash/noop';\nimport debounce from 'lodash/debounce';\nimport { List, is } from 'immutable';\nimport deepEquals from 'fast-deep-equal';\n\nimport { BLOCKS, EMPTY_DOCUMENT } from '@contentful/rich-text-types';\nimport { toContentfulDocument, toSlatejsDocument } from '@contentful/contentful-slatejs-adapter';\nimport { EntityProvider } from '@contentful/field-editor-reference';\n\nimport schema from './constants/Schema';\nimport { createRichTextAPI } from './plugins/shared/PluginApi';\nimport { buildPlugins } from './plugins';\nimport Toolbar from './Toolbar';\nimport StickyToolbarWrapper from './Toolbar/StickyToolbarWrapper';\nimport { FieldConnector } from '@contentful/field-editor-shared';\nimport { css, cx } from 'emotion';\nimport tokens from '@contentful/f36-tokens';\n\nconst STYLE_EDITOR_BORDER = `1px solid ${tokens.gray400}`;\n\nconst styles = {\n root: css({\n position: 'relative',\n }),\n editor: css({\n borderRadius: `0 0 ${tokens.borderRadiusMedium} ${tokens.borderRadiusMedium}`,\n border: STYLE_EDITOR_BORDER,\n borderTop: 0,\n padding: '20px',\n fontFamily: tokens.fontStackPrimary,\n fontSize: tokens.spacingM,\n minHeight: '380px',\n background: tokens.colorWhite,\n outline: 'none',\n whiteSpace: 'pre-wrap',\n overflowWrap: 'break-word',\n webkitUserModify: 'read-write-plaintext-only',\n a: {\n span: {\n cursor: 'not-allowed',\n '&:hover': {\n cursor: 'not-allowed',\n },\n },\n },\n }),\n hiddenToolbar: css({\n borderTop: STYLE_EDITOR_BORDER,\n }),\n enabled: css({\n background: tokens.colorWhite,\n a: {\n span: {\n cursor: 'pointer',\n '&:hover': {\n cursor: 'pointer',\n },\n },\n },\n }),\n disabled: css({\n background: tokens.gray100,\n }),\n};\n\nconst createSlateValue = (contentfulDocument) => {\n const document = toSlatejsDocument({\n document: contentfulDocument,\n schema,\n });\n const value = Value.fromJSON({\n document,\n schema,\n });\n // Normalize document instead of doing this in the Editor instance as this would\n // trigger unwanted operations that would result in an unwanted version bump.\n // TODO: This normalization step wouldn't be necessary if we had a perfect\n // adapter for the version of Slate we are currently using.\n const editor = new BasicEditor({ readOnly: true, value }, { normalize: true });\n const normalizedValue = editor.value;\n return normalizedValue;\n};\n\nconst EMPTY_SLATE_DOCUMENT = createSlateValue(EMPTY_DOCUMENT);\n\nexport class ConnectedRichTextEditor extends React.Component {\n static propTypes = {\n minHeight: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n sdk: PropTypes.shape({\n field: PropTypes.shape({\n id: PropTypes.string.isRequired,\n locale: PropTypes.string.isRequired,\n }).isRequired,\n access: PropTypes.shape({\n can: PropTypes.func.isRequired,\n }).isRequired,\n parameters: PropTypes.shape({\n instance: PropTypes.shape({\n getEntryUrl: PropTypes.func,\n getAssetUrl: PropTypes.func,\n }).isRequired,\n }),\n }).isRequired,\n value: PropTypes.object,\n isDisabled: PropTypes.bool,\n onChange: PropTypes.func,\n onAction: PropTypes.func,\n isToolbarHidden: PropTypes.bool,\n actionsDisabled: PropTypes.bool,\n };\n\n static defaultProps = {\n value: EMPTY_DOCUMENT,\n onChange: noop,\n onAction: noop,\n isDisabled: false,\n isToolbarHidden: false,\n actionsDisabled: false,\n };\n\n state = {\n lastOperations: List(),\n value:\n this.props.value && this.props.value.nodeType === BLOCKS.DOCUMENT\n ? createSlateValue(this.props.value)\n : EMPTY_SLATE_DOCUMENT,\n };\n\n editor = React.createRef();\n\n richTextAPI = createRichTextAPI({\n sdk: this.props.sdk,\n onAction: this.props.onAction,\n });\n\n slatePlugins = buildPlugins(this.richTextAPI);\n\n onChange = (editor) => {\n const { value, operations } = editor;\n this.setState({\n value,\n lastOperations: operations.filter(isRelevantOperation),\n });\n };\n\n shouldComponentUpdate(nextProps, nextState) {\n if (this.props.isDisabled !== nextProps.isDisabled) {\n return true;\n }\n const isStateValueUpdate = !is(this.state.value, nextState.value);\n const isPropsValueUpdate = this.props.value !== nextProps.value;\n return isStateValueUpdate || isPropsValueUpdate;\n }\n\n callOnChange = debounce(() => {\n const doc = toContentfulDocument({\n document: this.state.value.document.toJSON(),\n schema,\n });\n this.props.onChange(doc);\n }, 500);\n\n componentDidUpdate(prevProps) {\n /* eslint-disable react/no-did-update-set-state */\n const isIncomingChange = () => !deepEquals(prevProps.value, this.props.value);\n const isDocumentChanged = !this.state.lastOperations.isEmpty();\n\n if (!this.props.isDisabled && isDocumentChanged) {\n this.setState({ lastOperations: List() }, () => this.callOnChange());\n } else if (isIncomingChange()) {\n this.setState({\n value: createSlateValue(this.props.value),\n });\n }\n }\n\n // eslint-disable-next-line no-unused-vars\n handleKeyDown = (event, editor, next) => {\n const ESC = 27;\n\n if (event.keyCode === ESC) {\n event.currentTarget.blur();\n }\n\n return next();\n };\n\n render() {\n const classNames = cx(\n styles.editor,\n this.props.minHeight !== undefined ? css({ minHeight: this.props.minHeight }) : undefined,\n this.props.isDisabled ? styles.disabled : styles.enabled,\n this.props.isToolbarHidden && styles.hiddenToolbar\n );\n\n return (\n <div className={styles.root} data-test-id=\"rich-text-editor\">\n {!this.props.isToolbarHidden && (\n <StickyToolbarWrapper isDisabled={this.props.isDisabled}>\n <Toolbar\n editor={this.editor.current || new BasicEditor({ readOnly: true })}\n onChange={this.onChange}\n isDisabled={this.props.isDisabled}\n richTextAPI={this.richTextAPI}\n />\n </StickyToolbarWrapper>\n )}\n\n <Editor\n data-test-id=\"editor\"\n value={this.state.value}\n ref={this.editor}\n onChange={this.onChange}\n onKeyDown={this.handleKeyDown}\n plugins={this.slatePlugins}\n readOnly={this.props.isDisabled}\n className={classNames}\n actionsDisabled={this.props.actionsDisabled}\n options={{\n normalize: false, // No initial normalizaiton as we pass a normalized document.\n }}\n />\n </div>\n );\n }\n}\n\n/**\n * Returns whether a given operation is relevant enough to trigger a save.\n *\n * @param {slate.Operation} op\n * @returns {boolean}\n */\nfunction isRelevantOperation(op) {\n if (op.type === 'set_value') {\n if (op.properties.data) {\n // Relevant for undo/redo that can be empty ops that we want to ignore.\n return false;\n }\n } else if (op.type === 'set_selection') {\n return false;\n }\n return true;\n}\n\nexport default function RichTextEditor(props) {\n /* eslint-disable react/prop-types */\n const { sdk, isInitiallyDisabled, ...otherProps } = props;\n return (\n <EntityProvider sdk={sdk}>\n <FieldConnector\n throttle={0}\n field={sdk.field}\n isInitiallyDisabled={isInitiallyDisabled}\n isEmptyValue={(value) => {\n return !value || deepEquals(value, EMPTY_DOCUMENT);\n }}\n isEqualValues={(value1, value2) => {\n return deepEquals(value1, value2);\n }}>\n {({ lastRemoteValue, disabled, setValue, externalReset }) => {\n return (\n <ConnectedRichTextEditor\n {...otherProps}\n // on external change reset component completely and init with initial value again\n key={`rich-text-editor-${externalReset}`}\n value={lastRemoteValue}\n sdk={sdk}\n isDisabled={disabled}\n onChange={(value) => {\n setValue(value);\n }}\n />\n );\n }}\n </FieldConnector>\n </EntityProvider>\n );\n}\n\nRichTextEditor.defaultProps = {\n isInitiallyDisabled: true,\n};\n","import React from 'react';\nimport { ModalDialogLauncher } from '@contentful/field-editor-shared';\nimport { HyperlinkDialog } from './HypelinkDialog/HyperlinkDialog';\n\nexport const openRichTextDialog = (sdk) => (options) => {\n if (options.parameters && options.parameters.type === 'rich-text-hyperlink-dialog') {\n return ModalDialogLauncher.openDialog(options, ({ onClose }) => {\n return <HyperlinkDialog {...options.parameters} onClose={onClose} sdk={sdk} />;\n });\n }\n return Promise.reject();\n};\n","import React from 'react';\nimport { HyperlinkDialog } from './HypelinkDialog/HyperlinkDialog';\n\nexport const renderRichTextDialog = (sdk) => {\n const parameters = sdk.parameters.invocation;\n if (parameters.type === 'rich-text-hyperlink-dialog') {\n sdk.window.startAutoResizer();\n return <HyperlinkDialog {...sdk.parameters.invocation} onClose={sdk.close} sdk={sdk} />;\n }\n return <div />;\n};\n"],"names":["opt","config","types","BLOCKS","OL_LIST","UL_LIST","typeItem","LIST_ITEM","typeDefault","PARAGRAPH","EditList","mapVoidTypes","nodeTypes","fromPairs","map","nodeType","isVoid","listPlugin","ListPlugin","document","nodes","TOP_LEVEL_BLOCKS","blocks","Object","values","INLINES","objects","HEADING_1","HEADING_2","HEADING_3","HEADING_4","HEADING_5","HEADING_6","VOID_BLOCKS","schema","QUOTE","match","CONTAINERS","type","min","normalize","editor","error","code","unwrapBlockByKey","node","key","inlines","HYPERLINK","ENTRY_HYPERLINK","ASSET_HYPERLINK","EMBEDDED_ENTRY","createActionLogger","onAction","origin","name","data","createRichTextAPI","sdk","logViewportAction","logShortcutAction","logToolbarAction","logCommandPaletteAction","TOOLBAR_PLUGIN_PROP_TYPES","richTextAPI","PropTypes","shape","object","isRequired","func","onToggle","disabled","bool","isButton","canAutoFocus","styles","button","css","height","width","marginLeft","tokens","spacing2Xs","marginRight","tooltip","zIndex","Number","zIndexTooltip","ToolbarIcon","handleClick","event","preventDefault","props","render","this","title","isActive","children","React","Button","className","cx","isDisabled","startIcon","onClick","testId","variant","size","Tooltip","placement","content","Component","propTypes","any","string","MarkPropTypes","attributes","mark","NodePropTypes","haveMarks","value","activeMarks","some","haveBlocks","haveInlines","inline","haveTextInSomeBlocks","block","text","bold","color","fontWeight","fontWeightDemiBold","italic","fontStyle","lineHeight","fontFamily","fontStackMonospace","fontSize","tagName","hotkey","renderMark","_editor","next","Tag","tagProps","CommonMark","displayName","markDecorator","onKeyDown","isHotkey","toggleMark","action","markType","toolbarActionHandlerWithSafeAutoFocus","component","customHandler","selection","isFocused","focus","Mark","handleToggle","_this","React.createElement","Bold","markToggleDecorator","MARKS","BOLD","FormatBoldIcon","ItalicPlugin","markPlugin","ITALIC","Italic","FormatItalicIcon","UnderlinedPlugin","UNDERLINE","Underlined","FormatUnderlinedIcon","CodePlugin","CODE","Code","CodeIcon","toggleChange","setBlocks","isBlockActive","applyChange","Block","isSelectionInQuote","ancestor","range","start","startBlock","getClosestBlock","getParent","unwrapBlock","wrapBlock","headingCss","fontWeightMedium","margin","spacingS","paragraph","lineHeightDefault","marginBottom","blockquote","borderLeft","gray200","paddingLeft","background","padding","gray700","borderRadius","borderRadiusSmall","textLink","orderedList","listStyleType","unorderedList","listItem","listStyle","spacingL","heading1","heading2","heading3","heading4","heading5","heading6","CommonNode","camelCase","QuotePlugin","defaultType","renderNode","commonNode","e","newPlugin","Blockquote","blockToggleDecorator","QuoteIcon","runtime","exports","Op","prototype","hasOwn","hasOwnProperty","$Symbol","Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","define","obj","defineProperty","enumerable","configurable","writable","err","wrap","innerFn","outerFn","self","tryLocsList","generator","create","Generator","context","Context","_invoke","state","method","arg","Error","undefined","done","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","record","tryCatch","makeInvokeMethod","fn","call","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","getPrototypeOf","NativeIteratorPrototype","Gp","defineIteratorMethods","forEach","AsyncIterator","PromiseImpl","previousPromise","callInvokeWithMethodAndArg","resolve","reject","invoke","result","__await","then","unwrapped","TypeError","info","resultName","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","length","i","doneResult","constructor","isGeneratorFunction","genFun","ctor","setPrototypeOf","__proto__","awrap","async","Promise","iter","toString","keys","reverse","pop","skipTempReset","prev","charAt","slice","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","module","regeneratorRuntime","accidentalStrictMode","Function","FetchingWrappedEntryCard","useEntities","getOrLoadEntry","loadEntityScheduledActions","entries","entryId","onEntityFetchComplete","MissingEntityCard","entityType","onRemove","EntryCard","isLoading","contentType","space","getCachedContentTypes","find","sys","id","WrappedEntryCard","getAsset","getEntityScheduledActions","entryUrl","getEntryUrl","isSelected","localeCode","locale","defaultLocaleCode","locales","onEdit","isClickable","FetchingWrappedAssetCard","getOrLoadAsset","assets","assetId","asset","AssetCard","src","href","WrappedAssetCard","getAssetUrl","entityToLink","entity","linkType","HyperlinkDialog","handleSubmit","onClose","getValue","selectEntry","entitySelectorConfigs","Entry","contentTypes","dialogs","selectSingleEntry","setTargetEntity","selectAsset","Asset","selectSingleAsset","uri","target","isEntityLink","Boolean","entityLinks","allowedHyperlinkTypes","includes","setState","isLinkComplete","hideText","labels","EntityProvider","Fragment","ModalContent","renderFields","ModalControls","_this2","confirm","isUriInputAutoFocused","Form","FormControl","Label","TextInput","onChange","_this3","autoFocus","isFeaturingEntitySelector","Select","Option","placeholder","HelpText","renderEntityField","entityLink","isEntitySelectorVisible","FormLabel","required","htmlFor","TextLink","as","_this4","renderEntitySelector","marginTop","oneOf","arrayOf","defaultProps","openHyperlinkDialog","isNew","showTextInput","openCurrent","shouldCloseOnEscapePress","shouldCloseOnOverlayClick","allowHeightOverflow","parameters","field","flow","v","get","validations","newEntitySelectorConfigFromRichTextField","getEntityTypeFromRichTextNode","getLinkedContentTypeIdsForNodeType","words","split","indexOf","isFormattingOptionEnabled","validationType","nodeTypeOrMark","enabledFormattings","getRichTextValidation","isNodeTypeEnabled","isMarkEnabled","HYPERLINK_TYPES","nodeToHyperlinkType","getAllowedHyperlinkTypes","hyperlinkTypes","filter","getEntitySelectorConfigs","mayEditLink","isExpanded","hasHyperlink","hasOnlyHyperlinkInlines","every","toggleLink","logAction","removeLinks","insertLink","change","blur","fragment","trim","last","insertBlock","insertText","moveFocusForward","wrapLink","linkTypeToNodeType","unwrapInline","editLink","link","toJSON","oldUri","oldTarget","setInlines","wrapInline","moveToEnd","HyperlinkToolbarIcon","LinkIcon","hyperlinkWrapper","display","position","a","hyperlink","fill","textColorDark","hyperlinkIEFallback","textDecoration","hyperlinkIcon","top","webkitTransition","transition","browser","detectBrowser","SUPPORTS_NATIVE_SLATE_HYPERLINKS","entityId","getEntity","getEntry","contentTypeId","getContentType","entityTitle","entityHelpers","getEntryTitle","defaultTitle","getAssetTitle","entityDescription","getEntityDescription","jobs","entityStatus","getEntryStatus","contentTypeName","Hyperlink","test","requestStatus","useState","setRequestStatus","useEffect","fetchAllData","_target$sys","_target$sys2","entityInfo","console","log","useRequestStatus","isHotKey","stopPropagation","role","tabIndex","tooltipContent","toLowerCase","str","substr","replace","getScheduleTooltipContent","job","jobsCount","getTooltipContent","tooltipContainer","targetWrapperClassName","maxWidth","rel","HyperlinkPlugin","isHyperlink","moveToRangeOfNode","normalizeNode","getInlines","inlineNode","unwrapInlineByKey","root","h1","h2","h3","h4","h5","h6","getStyleForType","ToolbarDropdownListItem","Menu","Item","label","isInitiallyFocused","handleSelect","contentWidthDefault","blockTitles","EMBEDDED_ASSET","HeadingDropdown","getStyleNameForChange","currentBlockType","isOpen","onOpen","Trigger","endIcon","ChevronDownIcon","List","newHeadingDropdownItem","Heading","blockSelectDecorator","Paragraph","shouldToggle","offset","initialRange","splitBlock","setBlocksAtRange","Heading1Plugin","Heading2Plugin","Heading3Plugin","Heading4Plugin","Heading5Plugin","Heading6Plugin","Heading1","Heading2","Heading3","Heading4","Heading5","Heading6","selectEntityAndInsert","baseConfig","selectEntity","withCreate","focusNextLine","linkedEntityBlock","createNode","EntityLinkToolbarIcon","handleAction","getEntityTypeFromNodeType","baseClass","AssetIcon","EmbeddedEntryBlockIcon","Flex","alignItems","flexDirection","Icon","LinkedEntityBlock","handleEditClick","getEntitySys","navigator","openAsset","openEntry","slideIn","handleRemoveClick","removeNodeByKey","readOnly","actionsDisabled","instance","EmbeddedEntityBlockPlugin","EntityLinkBlock","hasBlockOfType","createInlineNode","insertInline","moveToStartOfNextText","selectEntryAndInsert","canInsertInline","icon","span","webkitUserSelect","mozUserSelect","msUserSelect","userSelect","EntryLinkToolbarIcon","EmbeddedEntryInlineIcon","scheduledIcon","verticalAlign","FetchingWrappedInlineEntryCard","InlineEntryCard","Text","status","actions","MenuItem","isReadOnly","ScheduledIconWithTooltip","ClockIcon","EmbeddedEntryInline","EmbeddedEntryInlinePlugin","end","hasOnlyInlineEntryInSelection","utils","changes","unwrapList","wrapInList","isSelectionInList","getCurrentList","currentList","setNodeByKey","list","UnorderedList","listToggleDecorator","ListBulletedIcon","OrderedList","ListNumberedIcon","hr","spacingM","gray300","hrSelected","colorPrimary","Hr","HR","HorizontalRuleIcon","getCharacterCount","contentfulSlateJSAdapter","documentToPlainTextString","PastePlugin","onPaste","_event","characterCountSelection","global","getSelection","characterCountBefore","setTimeout","characterCountAfter","BLOCK_TAGS","p","ul","ol","MARK_TAGS","strong","b","em","u","RULES","deserialize","el","ownerDocument","querySelector","startsWith","isGoogleWrapper","childNodes","marks","style","isGoogleBold","isGoogleItalic","isGoogleUnderline","leaves","textContent","getAttribute","classList","contains","getCommandText","startText","textBefore","exec","removeCommand","command","anchorOffset","removeTextByKey","fetchAssets","query","getAssets","items","displayTitle","fields","thumbnail","file","url","fetchEntries","getEntries","content_type","all","description","isValidLinkedContentType","embedType","val","typeVal","linkContentType","reduce","pre","cur","ct","CommandPaletteActionBuilder","maybeBuildEmbedAction","callback","buildAction","maybeBuildCreateAndEmbedAction","access","can","actionType","isAsset","isInline","group","commandPanel","colorWhite","boxShadow","border","gray400","borderRadiusMedium","fontStackPrimary","overflowY","commandPanelList","item","fontSizeM","spacingXs","borderBottom","gray900","divider","letterSpacing","letterSpacingWide","fontSizeS","textTransform","skeletonContainer","textAlign","whiteSpace","overflow","textOverflow","navBar","bottom","gray100","loader","instruction","gray600","closeButton","itemPropType","CommandPanelItem","listItemRef","componentDidUpdate","scrollIntoView","index","classNames","ref","alt","number","Instruction","CommandPanel","selectedKey","handleKeyboard","selectedItem","renderNavigationBar","SectionHeading","breadcrumb","IconButton","CloseIcon","renderStatusBar","instructions","isUpdating","Spinner","renderSkeleton","SkeletonContainer","SkeletonBodyText","numberOfLines","getDerivedStateFromProps","itemsHasUpdated","originalItems","searchStringHasUpdated","searchString","originalSearchString","componentDidMount","addEventListener","componentWillUnmount","removeEventListener","renderGroups","groups","uniqBy","groupName","renderItems","_this5","cn","throttle","delay","lastCall","now","Date","getTime","isBrowser","window","InViewport","tGetDomPosition","nodeRef","lastOverflowAt","tOnOverflowTop","onOverflowTop","tOnOverflowBottom","onOverflowBottom","tOnOverflowRight","onOverflowRight","tOnOverflowLeft","onOverflowLeft","getDomPosition","html","documentElement","boundingClientRect","getBoundingClientRect","windowWidth","innerWidth","clientWidth","windowHeight","innerHeight","clientHeight","handleOverflow","bindEventListeners","left","right","leftThreshold","rightThreshold","bottomThreshold","otherProps","DEFAULT_POSITION","CommandPalette","anchorPosition","panelPosition","paletteDimensions","handleScroll","handleOutsideClick","removeEventListeners","palette","isClosed","requestUpdate","currentCommand","createCommands","leading","trailing","createCommand","onCreateAndEmbedEntity","createAsset","createEntry","createEntity","createContentTypeActions","actionBuilder","clearCommand","createAssetActions","nodeName","updatePanelPosition","allEntries","isComponentMounted","createInitialCommands","allContentTypes","flatten","contentTypeActions","assetActions","prevState","isEscKey","cancel","body","ReactDOM","createPortal","outline","minWidth","zIndexDropdown","CommandPanelMenu","anchorRect","getRangeAt","PureComponent","embedsEnabled","decorations","getDecorations","isEmpty","commandPaletteDecoration","d","hasCommandPaletteDecoration","CommandMark","CommandPalettePlugin","decorateNode","_node","others","decoration","inputValue","anchor","getDecorationOrDefault","renderEditor","_props","commandMark","buildPlugins","getBlocks","first","focusBlock","isVoidBlockFirstAndFocused","moveToStartOfDocument","insertParagraphAndFocusToStartOfDocument","EditListWrapper","serializer","HtmlSerializer","rules","transfer","getEventTransfer","insertFragment","PlainSerializer","defaultBlock","delimiter","TrailingBlock","EntryEmbedDropdown","PlusIcon","toolbar","backgroundColor","embedActionsWrapper","webkitAlignSelf","alignSelf","msFlexItemAlign","formattingOptionsWrapper","msFlexAlign","webkitBoxAlign","msFlexWrap","flexWrap","Toolbar","hasMounted","isReadyToSetFocusProgrammatically","headingMenuOpen","canAccessAssets","getValidationInfo","handleEmbedDropdownOpen","isEmbedDropdownOpen","handleEmbedDropdownClose","renderEmbeds","inlineEntryEmbedEnabled","blockEntryEmbedEnabled","blockAssetEmbedEnabled","numEnabledEmbeds","EmbeddedEntityBlock","openHeadingMenu","closeHeadingMenu","canReadAssets","isAnyHyperlinkEnabled","isAnyListEnabled","isAnyMarkEnabled","getIn","isToggleActive","Quote","nativeSticky","StickyToolbarWrapper","STYLE_EDITOR_BORDER","borderTop","minHeight","overflowWrap","webkitUserModify","cursor","hiddenToolbar","enabled","createSlateValue","contentfulDocument","toSlatejsDocument","Value","fromJSON","BasicEditor","EMPTY_SLATE_DOCUMENT","EMPTY_DOCUMENT","ConnectedRichTextEditor","lastOperations","DOCUMENT","createRef","slatePlugins","operations","isRelevantOperation","callOnChange","debounce","doc","toContentfulDocument","handleKeyDown","keyCode","currentTarget","shouldComponentUpdate","nextProps","nextState","is","prevProps","isDocumentChanged","deepEquals","isToolbarHidden","current","Editor","plugins","options","op","properties","RichTextEditor","isInitiallyDisabled","FieldConnector","isEmptyValue","isEqualValues","value1","value2","setValue","externalReset","lastRemoteValue","oneOfType","noop","ModalDialogLauncher","openDialog","invocation","startAutoResizer","close"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"field-editor-rich-text.cjs.production.min.js","sources":["../src/RichTextEditor.styles.ts","../src/constants/Schema.ts","../src/plugins/shared/ToolbarButton.tsx","../src/helpers/editor.ts","../src/helpers/deserializer.ts","../src/ContentfulEditorProvider.ts","../src/plugins/Hr/index.tsx","../src/helpers/validations.ts","../src/SdkProvider.tsx","../src/plugins/Heading/index.tsx","../src/plugins/Quote/index.tsx","../src/plugins/List/index.tsx","../src/plugins/Bold/index.tsx","../src/plugins/Code/index.tsx","../src/plugins/Italic/index.tsx","../src/plugins/Underline/index.tsx","../../../node_modules/regenerator-runtime/runtime.js","../src/plugins/Hyperlink/EntryAssetTooltip.tsx","../src/helpers/truncate.ts","../src/plugins/shared/EntityStatusIcon.tsx","../src/plugins/shared/FetchingWrappedEntryCard.tsx","../src/plugins/shared/FetchingWrappedAssetCard.tsx","../src/helpers/getLinkedContentTypeIdsForNodeType.ts","../src/plugins/Hyperlink/HyperlinkModal.tsx","../src/plugins/Hyperlink/index.tsx","../src/plugins/Table/helpers.ts","../src/TrackingProvider.tsx","../src/plugins/Table/actions/addRow.ts","../src/plugins/Table/actions/addColumn.ts","../src/plugins/Table/TableActions.tsx","../src/plugins/Table/actions/setHeader.ts","../src/plugins/Table/index.tsx","../src/plugins/EmbeddedEntity/index.tsx","../src/plugins/EmbeddedEntityBlock/LinkedEntityBlock.tsx","../src/helpers/newEntitySelectorConfigFromRichTextField.ts","../src/plugins/EmbeddedEntityBlock/Util.ts","../src/plugins/EmbeddedEntityBlock/ToolbarIcon.tsx","../src/plugins/EmbeddedEntityBlock/index.tsx","../src/plugins/EmbeddedEntityInline/FetchingWrappedInlineEntryCard.tsx","../src/plugins/EmbeddedEntityInline/Util.ts","../src/plugins/EmbeddedEntityInline/index.tsx","../src/Toolbar/EmbedEntityWidget.tsx","../src/Toolbar/index.tsx","../src/Toolbar/StickyToolbarWrapper.tsx","../src/plugins/Paste/sanitizers/helpers.tsx","../src/plugins/Paste/sanitizers/removeComments.tsx","../src/plugins/Paste/sanitizers/sanitizeTables.tsx","../src/plugins/Paste/index.tsx","../src/plugins/Paste/sanitizers/sanitizeEntityBlocks.tsx","../src/plugins/Paragraph/index.tsx","../src/helpers/sanitizeSlateDoc.ts","../src/RichTextEditor.tsx","../src/plugins/NewLine/index.tsx","../src/plugins/InsertBeforeFirstVoidBlock/index.tsx","../src/plugins/TrailingParagraph/index.ts","../src/dialogs/HypelinkDialog/HyperlinkDialog.jsx","../src/dialogs/openRichTextDialog.tsx","../src/dialogs/renderRichTextDialog.tsx"],"sourcesContent":["import { css } from 'emotion';\nimport tokens from '@contentful/f36-tokens';\n\nconst STYLE_EDITOR_BORDER = `1px solid ${tokens.gray400}`;\n\nexport const styles = {\n root: css({\n position: 'relative',\n }),\n editor: css({\n borderRadius: `0 0 ${tokens.borderRadiusMedium} ${tokens.borderRadiusMedium}`,\n border: STYLE_EDITOR_BORDER,\n borderTop: 0,\n padding: '20px',\n fontSize: tokens.spacingM,\n fontFamily: tokens.fontStackPrimary,\n minHeight: '400px',\n background: tokens.colorWhite,\n outline: 'none',\n whiteSpace: 'pre-wrap',\n overflowWrap: 'break-word',\n webkitUserModify: 'read-write-plaintext-only',\n a: {\n span: {\n cursor: 'not-allowed',\n '&:hover': {\n cursor: 'not-allowed',\n },\n },\n },\n // We need to reset LIC style due to conflicts between PARAGRAPH styles\n 'ul > li > div': {\n margin: 0,\n },\n }),\n hiddenToolbar: css({\n borderTop: STYLE_EDITOR_BORDER,\n }),\n enabled: css({\n background: tokens.colorWhite,\n a: {\n span: {\n cursor: 'pointer',\n '&:hover': {\n cursor: 'pointer',\n },\n },\n },\n }),\n disabled: css({\n background: tokens.gray100,\n }),\n};\n","import {\n BLOCKS,\n INLINES,\n TOP_LEVEL_BLOCKS,\n VOID_BLOCKS,\n CONTAINERS,\n} from '@contentful/rich-text-types';\n\nconst inlines = Object.values(INLINES).map((type) => ({ type }));\n\nexport default {\n document: {\n nodes: [\n {\n types: TOP_LEVEL_BLOCKS.map((type) => ({ type })),\n },\n ],\n },\n\n blocks: {\n [BLOCKS.PARAGRAPH]: {\n nodes: [\n {\n match: [...inlines, { object: 'text' }],\n },\n ],\n },\n [BLOCKS.HEADING_1]: {\n nodes: [\n {\n match: [...inlines, { object: 'text' }],\n },\n ],\n },\n [BLOCKS.HEADING_2]: {\n nodes: [\n {\n match: [...inlines, { object: 'text' }],\n },\n ],\n },\n [BLOCKS.HEADING_3]: {\n nodes: [\n {\n match: [...inlines, { object: 'text' }],\n },\n ],\n },\n [BLOCKS.HEADING_4]: {\n nodes: [\n {\n match: [...inlines, { object: 'text' }],\n },\n ],\n },\n [BLOCKS.HEADING_5]: {\n nodes: [\n {\n match: [...inlines, { object: 'text' }],\n },\n ],\n },\n [BLOCKS.HEADING_6]: {\n nodes: [\n {\n match: [...inlines, { object: 'text' }],\n },\n ],\n },\n\n ...VOID_BLOCKS.reduce(\n (blocks, nodeType) => ({\n ...blocks,\n [nodeType]: { isVoid: true },\n }),\n {}\n ),\n\n // TODO: add list schema\n\n [BLOCKS.QUOTE]: {\n nodes: [\n {\n match: [CONTAINERS[BLOCKS.QUOTE].map((type) => ({ type }))],\n min: 1,\n },\n ],\n normalize: (editor, error) => {\n if (error.code === 'child_type_invalid') {\n return editor.unwrapBlockByKey(error.node.key, BLOCKS.QUOTE);\n }\n },\n },\n },\n\n inlines: {\n [INLINES.HYPERLINK]: {\n nodes: [\n {\n match: [{ object: 'text' }],\n },\n ],\n },\n [INLINES.ENTRY_HYPERLINK]: {\n nodes: [\n {\n match: [{ object: 'text' }],\n },\n ],\n },\n [INLINES.ASSET_HYPERLINK]: {\n nodes: [\n {\n match: [{ object: 'text' }],\n },\n ],\n },\n [INLINES.EMBEDDED_ENTRY]: {\n isVoid: true,\n },\n },\n};\n","import React, { Component } from 'react';\nimport { css, cx } from 'emotion';\nimport { Button, Tooltip } from '@contentful/f36-components';\nimport tokens from '@contentful/f36-tokens';\n\nconst styles = {\n button: css({\n height: '30px',\n width: '30px',\n marginLeft: tokens.spacing2Xs,\n marginRight: tokens.spacing2Xs,\n }),\n\n tooltip: css({\n zIndex: Number(tokens.zIndexTooltip),\n }),\n};\n\ninterface ToolbarButtonProps {\n onClick: React.MouseEventHandler;\n isActive?: boolean;\n isDisabled?: boolean;\n children: any;\n title: string;\n className?: string;\n testId?: string;\n}\n\nexport class ToolbarButton extends Component<ToolbarButtonProps> {\n handleClick = (event) => {\n event.preventDefault();\n this.props.onClick(event);\n };\n\n render() {\n const { title, testId, isActive, children, className, isDisabled = false } = this.props;\n\n const button = (\n <Button\n className={cx(styles.button, className)}\n isDisabled={isDisabled}\n startIcon={children}\n onClick={this.handleClick}\n testId={testId}\n variant={isActive ? 'secondary' : 'transparent'}\n size=\"small\"\n />\n );\n\n if (title) {\n return (\n <Tooltip className={styles.tooltip} placement=\"bottom\" content={title}>\n {button}\n </Tooltip>\n );\n }\n\n return button;\n }\n}\n","import { Text, Editor, Element, Transforms, Path, Range } from 'slate';\nimport { BLOCKS, INLINES } from '@contentful/rich-text-types';\nimport { CustomElement } from '../types';\nimport { Link } from '@contentful/field-editor-reference/dist/types';\nimport { SPEditor } from '@udecode/plate-core';\n\nexport const LINK_TYPES: INLINES[] = [\n INLINES.HYPERLINK,\n INLINES.ENTRY_HYPERLINK,\n INLINES.ASSET_HYPERLINK,\n];\nconst LIST_TYPES: BLOCKS[] = [BLOCKS.OL_LIST, BLOCKS.UL_LIST];\n\nexport function isBlockSelected(editor, type: string): boolean {\n const [match] = Array.from(\n Editor.nodes(editor, {\n match: (node) => Element.isElement(node) && (node as CustomElement).type === type,\n })\n );\n return !!match;\n}\n\nexport function isVoid(editor, element): boolean {\n const { isVoid: originalIsVoid } = editor;\n\n return element.isVoid || originalIsVoid(element);\n}\n\nexport function hasSelectionText(editor) {\n return editor.selection\n ? Editor.node(editor, editor.selection.focus.path).some(\n (node) => Text.isText(node) && node.text !== ''\n )\n : false;\n}\n\ntype NodeEntry = [CustomElement, Path];\ntype NodeType = BLOCKS | INLINES;\nexport function getNodeEntryFromSelection(\n editor,\n nodeTypeOrTypes: NodeType | NodeType[]\n): NodeEntry | [] {\n if (!editor.selection) return [];\n const nodeTypes = Array.isArray(nodeTypeOrTypes) ? nodeTypeOrTypes : [nodeTypeOrTypes];\n const { path } = editor.selection.focus;\n for (let i = 0; i < path.length; i++) {\n const nodeEntry = Editor.node(editor, path.slice(0, i + 1)) as NodeEntry;\n if (nodeTypes.includes(nodeEntry[0].type as NodeType)) return nodeEntry;\n }\n return [];\n}\n\nexport function isNodeTypeSelected(editor, nodeType: BLOCKS | INLINES): boolean {\n if (!editor) return false;\n const [node] = getNodeEntryFromSelection(editor, nodeType);\n return !!node;\n}\n\nexport function moveToTheNextLine(editor) {\n Transforms.move(editor, { distance: 1, unit: 'line' });\n}\n\nexport function moveToThePreviousLine(editor) {\n Transforms.move(editor, { distance: 1, unit: 'line', reverse: true });\n}\n\nexport function toggleBlock(editor, type: string): void {\n const isActive = isBlockSelected(editor, type);\n const isList = LIST_TYPES.includes(type as BLOCKS);\n const isQuote = type === BLOCKS.QUOTE;\n\n Transforms.unwrapNodes(editor, {\n match: (node) => {\n if (Editor.isEditor(node) || !Element.isElement(node)) {\n return false;\n }\n\n // Lists\n if (isList && LIST_TYPES.includes((node as CustomElement).type as BLOCKS)) {\n return true;\n }\n\n // Quotes\n if (isQuote && (node as CustomElement).type === BLOCKS.QUOTE) {\n return true;\n }\n\n return false;\n },\n split: true,\n });\n const newProperties: Partial<CustomElement> = {\n type: isActive\n ? BLOCKS.PARAGRAPH\n : isList\n ? BLOCKS.LIST_ITEM\n : isQuote\n ? BLOCKS.PARAGRAPH\n : type,\n };\n Transforms.setNodes(editor, newProperties);\n\n if (!isActive && (isList || isQuote)) {\n const block = {\n type,\n data: {},\n children: [],\n };\n Transforms.wrapNodes(editor, block);\n }\n}\n\nexport function getElementFromCurrentSelection(editor) {\n if (!editor.selection) return [];\n\n return Array.from(\n Editor.nodes(editor, {\n at: editor.selection.focus,\n match: (node) => Element.isElement(node),\n })\n ).flat();\n}\n\nexport function isList(editor) {\n const element = getElementFromCurrentSelection(editor);\n\n return element.some(\n (element) =>\n Element.isElement(element) && LIST_TYPES.includes((element as CustomElement).type as BLOCKS)\n );\n}\n\nexport function getTableSize(\n table: CustomElement\n): Record<'numRows' | 'numColumns', number> | null {\n const numRows = table.children.length;\n if (!numRows) return null;\n const [firstRow] = table.children;\n const numColumns = (firstRow as CustomElement).children?.length;\n return { numRows, numColumns };\n}\n\nexport function isFirstChild(path: Path) {\n return path[path.length - 1] === 0;\n}\n\ninterface InsertLinkOptions {\n text: string;\n type: INLINES.HYPERLINK | INLINES.ENTRY_HYPERLINK | INLINES.ASSET_HYPERLINK;\n url?: string;\n target?: Link;\n path?: Path;\n}\n\nexport function insertLink(editor, options: InsertLinkOptions) {\n if (editor.selection) {\n wrapLink(editor, options);\n }\n}\n\nexport function isLinkActive(editor) {\n const [link] = Array.from(\n Editor.nodes(editor, {\n match: (node) =>\n !Editor.isEditor(node) &&\n Element.isElement(node) &&\n LINK_TYPES.includes((node as CustomElement).type as INLINES),\n })\n );\n return !!link;\n}\n\nexport function unwrapLink(editor) {\n Transforms.unwrapNodes(editor, {\n match: (node) =>\n !Editor.isEditor(node) &&\n Element.isElement(node) &&\n LINK_TYPES.includes((node as CustomElement).type as INLINES),\n });\n}\n\nexport function wrapLink(editor, { text, url, target, type, path }: InsertLinkOptions) {\n if (isLinkActive(editor) && !path) {\n unwrapLink(editor);\n }\n\n const { selection } = editor;\n const isCollapsed = selection && Range.isCollapsed(selection);\n const link = {\n type,\n data: {},\n children: isCollapsed ? [{ text }] : [],\n };\n\n if (url) {\n link.data = { uri: url };\n }\n\n if (target) {\n link.data = { target };\n }\n\n // TODO: always set the selection to the end of the inserted link\n if (path) {\n Transforms.setNodes(editor, link, { at: path });\n Transforms.insertText(editor, text, { at: path });\n Transforms.select(editor, path);\n } else if (isCollapsed) {\n Transforms.insertNodes(editor, link);\n } else {\n Transforms.wrapNodes(editor, link, { split: true });\n Transforms.delete(editor);\n Transforms.insertText(editor, text);\n Transforms.collapse(editor, { edge: 'end' });\n }\n}\n\nexport function getAncestorPathFromSelection(editor: SPEditor) {\n if (!editor.selection) return undefined;\n\n return Path.levels(editor.selection.focus.path).find((level) => level.length === 1);\n}\n\nexport function shouldUnwrapBlockquote(editor: SPEditor, type: BLOCKS) {\n const isQuoteSelected = isBlockSelected(editor, BLOCKS.QUOTE);\n const isValidType = [\n BLOCKS.HEADING_1,\n BLOCKS.HEADING_2,\n BLOCKS.HEADING_3,\n BLOCKS.HEADING_4,\n BLOCKS.HEADING_5,\n BLOCKS.HEADING_6,\n\n BLOCKS.OL_LIST,\n BLOCKS.UL_LIST,\n\n BLOCKS.HR,\n ].includes(type);\n\n return isQuoteSelected && isValidType;\n}\n\nexport function unwrapFromRoot(editor: SPEditor) {\n const ancestorPath = getAncestorPathFromSelection(editor);\n Transforms.unwrapNodes(editor, { at: ancestorPath });\n}\n","import {\n getPlatePluginOptions,\n SPEditor,\n Deserialize,\n GetNodeDeserializerRule,\n} from '@udecode/plate-core';\nimport { getLeafDeserializer, getElementDeserializer } from '@udecode/plate-common';\n\nexport function deserializeLeaf(type: string, rules: GetNodeDeserializerRule[]): Deserialize {\n return function (editor: SPEditor) {\n const pluginOptions = getPlatePluginOptions(editor, type);\n\n return {\n leaf: getLeafDeserializer({\n type,\n rules,\n ...pluginOptions.deserialize,\n }),\n };\n };\n}\n\nexport function deserializeElement(type: string, rules: GetNodeDeserializerRule[]): Deserialize {\n return function (editor: SPEditor) {\n const pluginOptions = getPlatePluginOptions(editor, type);\n\n return {\n element: getElementDeserializer({\n type,\n rules,\n ...pluginOptions.deserialize,\n }),\n };\n };\n}\n","import constate from 'constate';\nimport { FieldExtensionSDK } from '@contentful/app-sdk';\nimport { useStoreEditorRef } from '@udecode/plate-core';\n\nexport function getContentfulEditorId(sdk: FieldExtensionSDK) {\n const { entry, field } = sdk;\n const entryId = entry.getSys().id;\n\n return `rich-text-editor-${entryId}-${field.id}-${field.locale}`;\n}\n\ninterface useContentfulEditorHookProps {\n sdk: FieldExtensionSDK;\n}\n\nfunction useContentfulEditorHook({ sdk }: useContentfulEditorHookProps) {\n const editorId = getContentfulEditorId(sdk);\n const editor = useStoreEditorRef(editorId);\n\n return editor;\n}\n\nexport const [ContentfulEditorProvider, useContentfulEditor] = constate(useContentfulEditorHook);\n","import * as React from 'react';\nimport * as Slate from 'slate-react';\nimport { css, cx } from 'emotion';\nimport tokens from '@contentful/f36-tokens';\nimport { HorizontalRuleIcon } from '@contentful/f36-icons';\nimport { ToolbarButton } from '../shared/ToolbarButton';\nimport { Transforms } from 'slate';\nimport { BLOCKS } from '@contentful/rich-text-types';\nimport { getPlatePluginTypes, getRenderElement, PlatePlugin, SPEditor } from '@udecode/plate-core';\nimport { getText, setNodes } from '@udecode/plate-common';\nimport {\n getNodeEntryFromSelection,\n isBlockSelected,\n moveToTheNextLine,\n shouldUnwrapBlockquote,\n unwrapFromRoot,\n} from '../../helpers/editor';\nimport { CustomSlatePluginOptions } from '../../types';\nimport { deserializeElement } from '../../helpers/deserializer';\nimport { useContentfulEditor } from '../../ContentfulEditorProvider';\n\nconst styles = {\n container: css`\n margin: 0 0 ${tokens.spacingL};\n `,\n hr: css`\n margin: 0;\n height: ${tokens.spacingM};\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: ${tokens.gray300};\n top: 50%;\n }\n `,\n hrSelected: css`\n &::after {\n background: ${tokens.colorPrimary};\n -webkit-box-shadow: 0px 0px 5px ${tokens.colorPrimary};\n box-shadow: 0px 0px 5px ${tokens.colorPrimary};\n }\n `,\n};\n\ninterface ToolbarHrButtonProps {\n isDisabled?: boolean;\n}\n\nexport function withHrEvents(editor: SPEditor) {\n return (event: React.KeyboardEvent) => {\n if (!editor) return;\n\n const isEnter = event.keyCode === 13;\n const [, pathToSelectedHr] = getNodeEntryFromSelection(editor, BLOCKS.HR);\n\n if (pathToSelectedHr) {\n if (shouldUnwrapBlockquote(editor, BLOCKS.HR)) {\n unwrapFromRoot(editor);\n }\n\n if (isEnter) {\n event.preventDefault();\n moveToTheNextLine(editor);\n } else if (event.key === 'Backspace') {\n event.preventDefault();\n Transforms.removeNodes(editor, { at: pathToSelectedHr });\n }\n }\n };\n}\n\nexport function ToolbarHrButton(props: ToolbarHrButtonProps) {\n const editor = useContentfulEditor();\n\n function handleOnClick(event: React.MouseEvent<HTMLButtonElement>) {\n event.preventDefault();\n\n if (!editor?.selection) return;\n\n if (shouldUnwrapBlockquote(editor, BLOCKS.HR)) {\n unwrapFromRoot(editor);\n }\n\n const hr = {\n type: BLOCKS.HR,\n data: {},\n children: [{ text: '' }],\n isVoid: true,\n };\n\n const hasText = !!getText(editor, editor.selection.focus.path);\n hasText ? Transforms.insertNodes(editor, hr) : setNodes(editor, hr);\n\n // Move focus to the next paragraph (added by TrailingParagraph plugin)\n moveToTheNextLine(editor);\n\n Slate.ReactEditor.focus(editor);\n }\n\n if (!editor) return null;\n\n return (\n <ToolbarButton\n title=\"HR\"\n isDisabled={props.isDisabled}\n onClick={handleOnClick}\n testId=\"hr-toolbar-button\"\n isActive={isBlockSelected(editor, BLOCKS.HR)}>\n <HorizontalRuleIcon />\n </ToolbarButton>\n );\n}\n\nexport function Hr(props: Slate.RenderLeafProps) {\n const isSelected = Slate.useSelected();\n const isFocused = Slate.useFocused();\n\n return (\n <div {...props.attributes} className={styles.container}>\n <div contentEditable={false}>\n <hr className={cx(styles.hr, isSelected && isFocused ? styles.hrSelected : undefined)} />\n </div>\n {props.children}\n </div>\n );\n}\n\nexport function createHrPlugin(): PlatePlugin {\n return {\n renderElement: getRenderElement(BLOCKS.HR),\n pluginKeys: BLOCKS.HR,\n onKeyDown: withHrEvents,\n voidTypes: getPlatePluginTypes(BLOCKS.HR),\n deserialize: deserializeElement(BLOCKS.HR, [\n {\n nodeNames: ['HR'],\n },\n ]),\n };\n}\n\nexport const withHrOptions: CustomSlatePluginOptions = {\n [BLOCKS.HR]: {\n type: BLOCKS.HR,\n component: Hr,\n },\n};\n","/* eslint-disable you-dont-need-lodash-underscore/find */\nimport find from 'lodash/find';\nimport flow from 'lodash/flow';\nimport get from 'lodash/get';\nimport { BLOCKS, INLINES, TOP_LEVEL_BLOCKS } from '@contentful/rich-text-types';\nimport { FieldExtensionSDK } from '@contentful/app-sdk';\n\n// TODO: Move these into separate package (maybe rich-text-types) and share with FE.\nexport const VALIDATIONS = {\n ENABLED_MARKS: 'enabledMarks',\n ENABLED_NODE_TYPES: 'enabledNodeTypes',\n};\nexport const DEFAULT_ENABLED_NODE_TYPES = [BLOCKS.DOCUMENT, BLOCKS.PARAGRAPH, 'text'];\n\nexport const VALIDATABLE_NODE_TYPES = ([] as Array<BLOCKS | INLINES>)\n .concat(TOP_LEVEL_BLOCKS)\n .filter((type) => type !== BLOCKS.PARAGRAPH)\n .concat(Object.values(INLINES));\n\n// TODO: Memoize\nconst getRichTextValidation = (field, validationType) =>\n flow(\n (v) => find(v, validationType),\n (v) => get(v, validationType)\n )(field.validations);\n\nconst isFormattingOptionEnabled = (field, validationType, nodeTypeOrMark) => {\n const enabledFormattings = getRichTextValidation(field, validationType);\n\n // TODO: In the future, validations will always be opt-in. In that case\n // we don't need this step.\n if (enabledFormattings === undefined) {\n return true;\n }\n\n return DEFAULT_ENABLED_NODE_TYPES.concat(enabledFormattings).includes(nodeTypeOrMark);\n};\n\nexport const isNodeTypeEnabled = (field: FieldExtensionSDK['field'], nodeType): boolean =>\n isFormattingOptionEnabled(field, VALIDATIONS.ENABLED_NODE_TYPES, nodeType);\n\nexport const isMarkEnabled = (field: FieldExtensionSDK['field'], mark) =>\n isFormattingOptionEnabled(field, VALIDATIONS.ENABLED_MARKS, mark);\n","import * as React from 'react';\nimport constate from 'constate';\nimport { FieldExtensionSDK } from '@contentful/app-sdk';\n\ninterface SdkProviderProps {\n sdk: FieldExtensionSDK;\n}\n\nfunction useSdk({ sdk }: SdkProviderProps) {\n const sdkMemo = React.useMemo<FieldExtensionSDK>(() => sdk, []); // eslint-disable-line\n\n return sdkMemo;\n}\n\nexport const [SdkProvider, useSdkContext] = constate(useSdk);\n","import * as React from 'react';\nimport * as Slate from 'slate-react';\nimport { css, cx } from 'emotion';\nimport { Menu, Button } from '@contentful/f36-components';\nimport { ChevronDownIcon } from '@contentful/f36-icons';\nimport tokens from '@contentful/f36-tokens';\nimport { Editor, Transforms, Node } from 'slate';\nimport { BLOCKS } from '@contentful/rich-text-types';\nimport {\n PlatePlugin,\n getRenderElement,\n SPEditor,\n getPlatePluginOptions,\n} from '@udecode/plate-core';\nimport { insertNodes, setNodes, toggleNodeType } from '@udecode/plate-common';\nimport { CustomElement, CustomSlatePluginOptions } from '../../types';\nimport {\n getElementFromCurrentSelection,\n hasSelectionText,\n shouldUnwrapBlockquote,\n unwrapFromRoot,\n} from '../../helpers/editor';\nimport { isNodeTypeEnabled } from '../../helpers/validations';\nimport { useSdkContext } from '../../SdkProvider';\nimport { useContentfulEditor } from '../../ContentfulEditorProvider';\n\nconst styles = {\n dropdown: {\n root: css`\n font-weight: ${tokens.fontWeightDemiBold};\n `,\n [BLOCKS.PARAGRAPH]: css`\n font-size: ${tokens.fontSizeL};\n `,\n [BLOCKS.HEADING_1]: css`\n font-size: 1.625rem;\n `,\n [BLOCKS.HEADING_2]: css`\n font-size: 1.4375rem;\n `,\n [BLOCKS.HEADING_3]: css`\n font-size: 1.25rem;\n `,\n [BLOCKS.HEADING_4]: css`\n font-size: 1.125rem;\n `,\n [BLOCKS.HEADING_5]: css`\n font-size: 1rem;\n `,\n [BLOCKS.HEADING_6]: css`\n font-size: 0.875rem;\n `,\n },\n headings: {\n root: css`\n font-weight: ${tokens.fontWeightMedium};\n line-height: 1.3;\n margin: 0 0 ${tokens.spacingS};\n `,\n [BLOCKS.HEADING_1]: css`\n font-size: 1.875rem;\n `,\n [BLOCKS.HEADING_2]: css`\n font-size: 1.5625rem;\n `,\n [BLOCKS.HEADING_3]: css`\n font-size: 1.375rem;\n `,\n [BLOCKS.HEADING_4]: css`\n font-size: 1.25rem;\n `,\n [BLOCKS.HEADING_5]: css`\n font-size: 1.125rem;\n `,\n [BLOCKS.HEADING_6]: css`\n font-size: 1rem;\n `,\n },\n};\n\nexport function withHeadingEvents(editor: SPEditor) {\n return (event: React.KeyboardEvent) => {\n if (!editor.selection) return;\n\n // Enter a new line on a heading element\n const headings: string[] = [\n BLOCKS.HEADING_1,\n BLOCKS.HEADING_2,\n BLOCKS.HEADING_3,\n BLOCKS.HEADING_4,\n BLOCKS.HEADING_5,\n BLOCKS.HEADING_6,\n ];\n const [currentFragment] = Editor.fragment(\n editor,\n editor.selection.focus.path\n ) as CustomElement[];\n const isEnter = event.keyCode === 13;\n const isCurrentFragmentAHeading = headings.includes(currentFragment.type);\n\n if (isEnter && isCurrentFragmentAHeading) {\n event.preventDefault();\n\n const text = { text: '' };\n const paragraph = { type: BLOCKS.PARAGRAPH, data: {}, children: [text] };\n const heading = { type: currentFragment.type, data: {}, children: [text] };\n\n if (hasSelectionText(editor)) {\n const currentOffset = editor.selection.focus.offset;\n const currentTextLength = Node.string(currentFragment).length;\n const cursorIsAtTheBeginning = currentOffset === 0;\n const cursorIsAtTheEnd = currentTextLength === currentOffset;\n\n if (cursorIsAtTheBeginning) {\n insertNodes(editor, paragraph, { at: editor.selection });\n } else if (cursorIsAtTheEnd) {\n insertNodes(editor, paragraph);\n } else {\n // Otherwise the cursor is in the middle\n Transforms.splitNodes(editor);\n setNodes(editor, paragraph);\n }\n } else {\n setNodes(editor, paragraph);\n insertNodes(editor, heading);\n }\n }\n\n // Toggle heading blocks when pressing cmd/ctrl+alt+1|2|3|4|5|6\n const headingKeyCodes = {\n 49: BLOCKS.HEADING_1,\n 50: BLOCKS.HEADING_2,\n 51: BLOCKS.HEADING_3,\n 52: BLOCKS.HEADING_4,\n 53: BLOCKS.HEADING_5,\n 54: BLOCKS.HEADING_6,\n };\n const isMod = event.ctrlKey || event.metaKey;\n const isAltOrOption = event.altKey;\n const headingKey = headingKeyCodes[event.keyCode];\n\n if (isMod && isAltOrOption && headingKey) {\n event.preventDefault();\n\n if (shouldUnwrapBlockquote(editor, headingKey)) {\n unwrapFromRoot(editor);\n }\n\n toggleNodeType(editor, { activeType: headingKey, inactiveType: BLOCKS.PARAGRAPH });\n }\n };\n}\n\nconst LABELS = {\n [BLOCKS.PARAGRAPH]: 'Normal text',\n [BLOCKS.HEADING_1]: 'Heading 1',\n [BLOCKS.HEADING_2]: 'Heading 2',\n [BLOCKS.HEADING_3]: 'Heading 3',\n [BLOCKS.HEADING_4]: 'Heading 4',\n [BLOCKS.HEADING_5]: 'Heading 5',\n [BLOCKS.HEADING_6]: 'Heading 6',\n};\n\ninterface ToolbarHeadingButtonProps {\n isDisabled?: boolean;\n}\n\nexport function ToolbarHeadingButton(props: ToolbarHeadingButtonProps) {\n const sdk = useSdkContext();\n const editor = useContentfulEditor();\n const [isOpen, setOpen] = React.useState(false);\n const [selected, setSelected] = React.useState<string>(BLOCKS.PARAGRAPH);\n\n React.useEffect(() => {\n if (!editor?.selection) return;\n\n const [element] = getElementFromCurrentSelection(editor);\n const type = (element as CustomElement).type;\n\n setSelected(LABELS[type] ? type : BLOCKS.PARAGRAPH);\n }, [editor?.operations, editor?.selection]); // eslint-disable-line\n\n const [nodeTypesByEnablement, someHeadingsEnabled] = React.useMemo(() => {\n const nodeTypesByEnablement = Object.fromEntries(\n Object.keys(LABELS).map((nodeType) => [nodeType, isNodeTypeEnabled(sdk.field, nodeType)])\n );\n const someHeadingsEnabled = Object.values(nodeTypesByEnablement).filter(Boolean).length > 0;\n return [nodeTypesByEnablement, someHeadingsEnabled];\n }, [sdk.field]);\n\n function handleOnSelectItem(type: BLOCKS): (event: React.MouseEvent<HTMLButtonElement>) => void {\n return (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n\n if (!editor?.selection) return;\n\n setSelected(type);\n setOpen(false);\n\n if (shouldUnwrapBlockquote(editor, type)) {\n unwrapFromRoot(editor);\n }\n\n toggleNodeType(editor, { activeType: type, inactiveType: type });\n\n // TODO: Figure out why focus only works with timeout here.\n setTimeout(() => {\n Slate.ReactEditor.focus(editor);\n }, 0);\n };\n }\n\n if (!editor) return null;\n\n return (\n <Menu isOpen={isOpen} onClose={() => setOpen(false)}>\n <Menu.Trigger>\n <Button\n size=\"small\"\n testId=\"toolbar-heading-toggle\"\n variant=\"transparent\"\n endIcon={<ChevronDownIcon />}\n onClick={() => someHeadingsEnabled && setOpen(!isOpen)}>\n {LABELS[selected]}\n </Button>\n </Menu.Trigger>\n <Menu.List testId=\"dropdown-heading-list\">\n {' '}\n {Object.keys(LABELS)\n .map(\n (nodeType) =>\n nodeTypesByEnablement[nodeType] && (\n <Menu.Item\n key={nodeType}\n isInitiallyFocused={selected === nodeType}\n onClick={handleOnSelectItem(nodeType as BLOCKS)}\n testId={`dropdown-option-${nodeType}`}\n disabled={props.isDisabled}>\n <span className={cx(styles.dropdown.root, styles.dropdown[nodeType])}>\n {LABELS[nodeType]}\n </span>\n </Menu.Item>\n )\n )\n .filter(Boolean)}\n </Menu.List>\n </Menu>\n );\n}\n\nexport function createHeading(Tag, block: BLOCKS) {\n return function Heading(props: Slate.RenderElementProps) {\n return (\n <Tag {...props.attributes} className={cx(styles.headings.root, styles.headings[block])}>\n {props.children}\n </Tag>\n );\n };\n}\n\nexport const H1 = createHeading('h1', BLOCKS.HEADING_1);\nexport const H2 = createHeading('h2', BLOCKS.HEADING_2);\nexport const H3 = createHeading('h3', BLOCKS.HEADING_3);\nexport const H4 = createHeading('h4', BLOCKS.HEADING_4);\nexport const H5 = createHeading('h1', BLOCKS.HEADING_5);\nexport const H6 = createHeading('h1', BLOCKS.HEADING_6);\n\nexport function createHeadingPlugin(): PlatePlugin {\n const headings: string[] = [\n BLOCKS.HEADING_1,\n BLOCKS.HEADING_2,\n BLOCKS.HEADING_3,\n BLOCKS.HEADING_4,\n BLOCKS.HEADING_5,\n BLOCKS.HEADING_6,\n ];\n\n return {\n renderElement: getRenderElement(headings),\n pluginKeys: headings,\n onKeyDown: withHeadingEvents,\n deserialize: (editor) => {\n return {\n element: headings.map((headingType, index) => {\n const options = getPlatePluginOptions(editor, headingType);\n\n return {\n type: headingType,\n deserialize: (element) => {\n const isHeading = element.nodeName === `H${index + 1}`;\n\n if (!isHeading) return;\n\n return {\n type: headingType,\n };\n },\n ...options.deserialize,\n };\n }),\n };\n },\n };\n}\n\nexport const withHeadingOptions: CustomSlatePluginOptions = {\n [BLOCKS.HEADING_1]: {\n type: BLOCKS.HEADING_1,\n component: H1,\n },\n [BLOCKS.HEADING_2]: {\n type: BLOCKS.HEADING_2,\n component: H2,\n },\n [BLOCKS.HEADING_3]: {\n type: BLOCKS.HEADING_3,\n component: H3,\n },\n [BLOCKS.HEADING_4]: {\n type: BLOCKS.HEADING_4,\n component: H4,\n },\n [BLOCKS.HEADING_5]: {\n type: BLOCKS.HEADING_5,\n component: H5,\n },\n [BLOCKS.HEADING_6]: {\n type: BLOCKS.HEADING_6,\n component: H6,\n },\n};\n","import * as React from 'react';\nimport * as Slate from 'slate-react';\nimport { css } from 'emotion';\nimport tokens from '@contentful/f36-tokens';\nimport { QuoteIcon } from '@contentful/f36-icons';\nimport { ToolbarButton } from '../shared/ToolbarButton';\nimport { Transforms, Editor, Node, Element, Text } from 'slate';\nimport { BLOCKS } from '@contentful/rich-text-types';\nimport { PlatePlugin, SPEditor, getRenderElement } from '@udecode/plate-core';\nimport { CustomElement } from '../../types';\nimport { CustomSlatePluginOptions } from 'types';\nimport {\n isBlockSelected,\n toggleBlock,\n hasSelectionText,\n getElementFromCurrentSelection,\n isNodeTypeSelected,\n} from '../../helpers/editor';\nimport { deserializeElement } from '../../helpers/deserializer';\nimport { useContentfulEditor } from '../../ContentfulEditorProvider';\n\nconst styles = {\n blockquote: css({\n margin: '0 0 1.3125rem',\n borderLeft: `6px solid ${tokens.gray200}`,\n paddingLeft: '0.875rem',\n fontStyle: 'normal',\n '& a': {\n color: 'inherit',\n },\n }),\n};\n\ninterface ToolbarQuoteButtonProps {\n isDisabled?: boolean;\n}\n\nconst createBlockQuote = (editor: SPEditor) => {\n if (!editor.selection) return;\n\n toggleBlock(editor, BLOCKS.QUOTE);\n};\n\nexport function withQuoteEvents(editor: SPEditor) {\n return (event: React.KeyboardEvent) => {\n if (!editor.selection) return;\n\n const [currentFragment] = Editor.fragment(\n editor,\n editor.selection.focus.path\n ) as CustomElement[];\n const isEnter = event.keyCode === 13;\n\n if (isEnter && currentFragment?.type === BLOCKS.QUOTE) {\n event.preventDefault();\n\n const text = { text: '' };\n const paragraph = { type: BLOCKS.PARAGRAPH, data: {}, children: [text] };\n\n if (hasSelectionText(editor)) {\n const currentOffset = editor.selection.focus.offset;\n const currentTextLength = Node.string(currentFragment).length;\n const cursorIsAtTheBeginning = currentOffset === 0;\n const cursorIsAtTheEnd = currentTextLength === currentOffset;\n\n if (cursorIsAtTheBeginning) {\n Transforms.insertNodes(editor, paragraph, { at: editor.selection });\n } else if (cursorIsAtTheEnd) {\n Transforms.insertNodes(editor, paragraph);\n } else {\n // Otherwise the cursor is in the middle\n Transforms.splitNodes(editor);\n Transforms.setNodes(editor, paragraph);\n }\n } else {\n Transforms.insertNodes(editor, paragraph);\n }\n }\n\n const isBackspace = event.keyCode === 8;\n const isMod = event.ctrlKey || event.metaKey;\n const isShift = event.shiftKey;\n const isOneKey = event.keyCode === 49;\n\n // shift + cmd/ctrl + 1 = shortcut to toggle blockquote\n if (isMod && isShift && isOneKey && !isNodeTypeSelected(editor, BLOCKS.TABLE)) {\n createBlockQuote(editor);\n }\n\n // On backspace, check if quote is empty. If it's empty, switch the current fragment to a paragraph\n if (isBackspace && currentFragment?.type === BLOCKS.QUOTE) {\n const quoteIsEmpty = (\n getElementFromCurrentSelection(editor)[0] as CustomElement\n ).children.every(\n (item) =>\n Element.isElement(item) &&\n item.children.every((item) => Text.isText(item) && item.text === '')\n );\n\n if (quoteIsEmpty) toggleBlock(editor, BLOCKS.PARAGRAPH);\n }\n };\n}\n\nexport function ToolbarQuoteButton(props: ToolbarQuoteButtonProps) {\n const editor = useContentfulEditor();\n\n function handleOnClick(event: React.MouseEvent<HTMLButtonElement>) {\n event.preventDefault();\n\n if (!editor) return;\n\n createBlockQuote(editor);\n Slate.ReactEditor.focus(editor);\n }\n\n if (!editor) return null;\n\n return (\n <ToolbarButton\n title=\"Blockquote\"\n onClick={handleOnClick}\n testId=\"quote-toolbar-button\"\n isDisabled={props.isDisabled}\n isActive={isBlockSelected(editor, BLOCKS.QUOTE)}>\n <QuoteIcon />\n </ToolbarButton>\n );\n}\n\nexport function Quote(props: Slate.RenderLeafProps) {\n return (\n <blockquote {...props.attributes} className={styles.blockquote}>\n {props.children}\n </blockquote>\n );\n}\n\nexport function createQuotePlugin(): PlatePlugin {\n return {\n pluginKeys: BLOCKS.QUOTE,\n renderElement: getRenderElement(BLOCKS.QUOTE),\n onKeyDown: withQuoteEvents,\n deserialize: deserializeElement(BLOCKS.QUOTE, [{ nodeNames: 'BLOCKQUOTE' }]),\n };\n}\n\nexport const withQuoteOptions: CustomSlatePluginOptions = {\n [BLOCKS.QUOTE]: {\n type: BLOCKS.QUOTE,\n component: Quote,\n },\n};\n","import * as React from 'react';\nimport * as Slate from 'slate-react';\nimport { css } from 'emotion';\nimport { createListPlugin as createPlateListPlugin } from '@udecode/plate-list';\nimport { BLOCKS, LIST_ITEM_BLOCKS } from '@contentful/rich-text-types';\nimport { ListBulletedIcon, ListNumberedIcon } from '@contentful/f36-icons';\nimport { ToolbarButton } from '../shared/ToolbarButton';\nimport { ELEMENT_LI, ELEMENT_UL, ELEMENT_OL, toggleList, ELEMENT_LIC } from '@udecode/plate-list';\nimport { isBlockSelected, unwrapFromRoot, shouldUnwrapBlockquote } from '../../helpers/editor';\nimport { isNodeTypeEnabled } from '../../helpers/validations';\nimport { CustomSlatePluginOptions } from '../../types';\nimport tokens from '@contentful/f36-tokens';\nimport { useSdkContext } from '../../SdkProvider';\nimport { useContentfulEditor } from '../../ContentfulEditorProvider';\n\ninterface ToolbarListButtonProps {\n isDisabled?: boolean;\n}\n\nexport function ToolbarListButton(props: ToolbarListButtonProps) {\n const sdk = useSdkContext();\n const editor = useContentfulEditor();\n\n function handleClick(type: BLOCKS): (event: React.MouseEvent<HTMLButtonElement>) => void {\n return (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n\n if (!editor?.selection) return;\n\n if (shouldUnwrapBlockquote(editor, type)) {\n unwrapFromRoot(editor);\n }\n\n toggleList(editor, { type });\n\n Slate.ReactEditor.focus(editor);\n };\n }\n\n if (!editor) return null;\n\n return (\n <React.Fragment>\n {isNodeTypeEnabled(sdk.field, BLOCKS.UL_LIST) && (\n <ToolbarButton\n title=\"UL\"\n testId=\"ul-toolbar-button\"\n onClick={handleClick(BLOCKS.UL_LIST)}\n isActive={isBlockSelected(editor, BLOCKS.UL_LIST)}\n isDisabled={props.isDisabled}>\n <ListBulletedIcon />\n </ToolbarButton>\n )}\n {isNodeTypeEnabled(sdk.field, BLOCKS.OL_LIST) && (\n <ToolbarButton\n title=\"OL\"\n testId=\"ol-toolbar-button\"\n onClick={handleClick(BLOCKS.OL_LIST)}\n isActive={isBlockSelected(editor, BLOCKS.OL_LIST)}\n isDisabled={props.isDisabled}>\n <ListNumberedIcon />\n </ToolbarButton>\n )}\n </React.Fragment>\n );\n}\n\nconst listStyles = `\n padding: 0;\n margin: 0 0 1.25rem 1.25rem;\n div:first-child {\n margin: 0;\n line-height: ${tokens.lineHeightDefault};\n }\n`;\n\nconst styles = {\n [BLOCKS.UL_LIST]: css`\n ${listStyles}\n list-style-type: disc;\n ul {\n list-style-type: circle;\n ul {\n list-style-type: square;\n }\n }\n `,\n [BLOCKS.OL_LIST]: css`\n ${listStyles}\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 `,\n [BLOCKS.LIST_ITEM]: css`\n margin: 0;\n list-style: inherit;\n ol,\n ul {\n margin: 0 0 0 ${tokens.spacingL};\n }\n `,\n};\n\nexport function createList(Tag, block: BLOCKS) {\n return function List(props: Slate.RenderElementProps) {\n return (\n <Tag {...props.attributes} className={styles[block]}>\n {props.children}\n </Tag>\n );\n };\n}\n\nexport const UL = createList('ul', BLOCKS.UL_LIST);\nexport const OL = createList('ol', BLOCKS.OL_LIST);\nexport const LI = createList('li', BLOCKS.LIST_ITEM);\n\nexport const withListOptions: CustomSlatePluginOptions = {\n // ELEMENT_LIC is a child of li, slatejs does ul > li > lic + ul\n [ELEMENT_LIC]: {\n type: BLOCKS.PARAGRAPH,\n },\n [ELEMENT_LI]: {\n type: BLOCKS.LIST_ITEM,\n component: LI,\n },\n [ELEMENT_UL]: {\n type: BLOCKS.UL_LIST,\n component: UL,\n },\n [ELEMENT_OL]: {\n type: BLOCKS.OL_LIST,\n component: OL,\n },\n};\n\nexport const createListPlugin = () =>\n createPlateListPlugin({\n validLiChildrenTypes: LIST_ITEM_BLOCKS,\n });\n","import * as React from 'react';\nimport * as Slate from 'slate-react';\nimport { css } from 'emotion';\nimport { getRenderLeaf, PlatePlugin } from '@udecode/plate-core';\nimport { MARKS } from '@contentful/rich-text-types';\nimport { getToggleMarkOnKeyDown, isMarkActive, toggleMark } from '@udecode/plate-common';\nimport { FormatBoldIcon } from '@contentful/f36-icons';\nimport { ToolbarButton } from '../shared/ToolbarButton';\nimport { CustomSlatePluginOptions } from 'types';\nimport { useContentfulEditor } from '../../ContentfulEditorProvider';\n\ninterface ToolbarBoldButtonProps {\n isDisabled?: boolean;\n}\n\nexport function ToolbarBoldButton(props: ToolbarBoldButtonProps) {\n const editor = useContentfulEditor();\n\n function handleClick(event: React.MouseEvent<HTMLButtonElement>) {\n event.preventDefault();\n\n if (!editor?.selection) return;\n\n toggleMark(editor, MARKS.BOLD);\n Slate.ReactEditor.focus(editor);\n }\n\n if (!editor) return null;\n\n return (\n <ToolbarButton\n title=\"Bold\"\n testId=\"bold-toolbar-button\"\n onClick={handleClick}\n isActive={isMarkActive(editor, MARKS.BOLD)}\n isDisabled={props.isDisabled}>\n <FormatBoldIcon />\n </ToolbarButton>\n );\n}\n\nconst styles = {\n bold: css({\n fontWeight: 600,\n }),\n};\n\nexport function Bold(props: Slate.RenderLeafProps) {\n return (\n <strong {...props.attributes} className={styles.bold}>\n {props.children}\n </strong>\n );\n}\n\nexport function createBoldPlugin(): PlatePlugin {\n return {\n pluginKeys: MARKS.BOLD,\n renderLeaf: getRenderLeaf(MARKS.BOLD),\n onKeyDown: getToggleMarkOnKeyDown(MARKS.BOLD),\n deserialize: () => {\n return {\n leaf: [\n {\n type: MARKS.BOLD,\n deserialize: (element) => {\n // We ignore it otherwise everything will be bold\n const isGoogleBoldWrapper =\n element.id.startsWith('docs-internal-guid') && element.nodeName === 'B';\n\n const isBold =\n ['600', '700', 'bold'].includes(element.style.fontWeight) ||\n ['STRONG', 'B'].includes(element.nodeName);\n\n if (isGoogleBoldWrapper || !isBold) return;\n\n return {\n [MARKS.BOLD]: true,\n };\n },\n },\n ],\n };\n },\n };\n}\n\nexport const withBoldOptions: CustomSlatePluginOptions = {\n [MARKS.BOLD]: {\n type: MARKS.BOLD,\n component: Bold,\n hotkey: ['mod+b'],\n },\n};\n","import * as React from 'react';\nimport * as Slate from 'slate-react';\nimport { css } from 'emotion';\nimport { PlatePlugin, getRenderLeaf, GetNodeDeserializerRule } from '@udecode/plate-core';\nimport { MARKS } from '@contentful/rich-text-types';\nimport { getToggleMarkOnKeyDown, isMarkActive, toggleMark } from '@udecode/plate-common';\nimport { CodeIcon } from '@contentful/f36-icons';\nimport { ToolbarButton } from '../shared/ToolbarButton';\nimport { CustomSlatePluginOptions } from 'types';\nimport { deserializeLeaf } from '../../helpers/deserializer';\nimport { useContentfulEditor } from '../../ContentfulEditorProvider';\n\ninterface ToolbarCodeButtonProps {\n isDisabled?: boolean;\n}\n\nexport function ToolbarCodeButton(props: ToolbarCodeButtonProps) {\n const editor = useContentfulEditor();\n\n function handleClick(event: React.MouseEvent<HTMLButtonElement>) {\n event.preventDefault();\n\n if (!editor?.selection) return;\n\n toggleMark(editor, MARKS.CODE);\n Slate.ReactEditor.focus(editor);\n }\n\n if (!editor) return null;\n\n return (\n <ToolbarButton\n title=\"Code\"\n testId=\"code-toolbar-button\"\n onClick={handleClick}\n isActive={isMarkActive(editor, MARKS.CODE)}\n isDisabled={props.isDisabled}>\n <CodeIcon />\n </ToolbarButton>\n );\n}\n\nconst styles = {\n code: css({\n fontFamily: 'monospace',\n fontSize: '.9em',\n }),\n};\n\nexport function Code(props: Slate.RenderLeafProps) {\n return (\n <code {...props.attributes} className={styles.code}>\n {props.children}\n </code>\n );\n}\n\nexport function createCodePlugin(): PlatePlugin {\n const deserializeRule: GetNodeDeserializerRule[] = [\n { nodeNames: ['CODE', 'PRE'] },\n { style: { fontFamily: 'monospace' } },\n ];\n\n return {\n pluginKeys: MARKS.CODE,\n renderLeaf: getRenderLeaf(MARKS.CODE),\n onKeyDown: getToggleMarkOnKeyDown(MARKS.CODE),\n deserialize: deserializeLeaf(MARKS.CODE, deserializeRule),\n };\n}\n\nexport const withCodeOptions: CustomSlatePluginOptions = {\n [MARKS.CODE]: {\n type: MARKS.CODE,\n component: Code,\n hotkey: ['mod+/'],\n },\n};\n","import * as React from 'react';\nimport * as Slate from 'slate-react';\nimport { css } from 'emotion';\nimport { PlatePlugin, getRenderLeaf, GetNodeDeserializerRule } from '@udecode/plate-core';\nimport { getToggleMarkOnKeyDown, toggleMark, isMarkActive } from '@udecode/plate-common';\nimport { MARKS } from '@contentful/rich-text-types';\nimport { FormatItalicIcon } from '@contentful/f36-icons';\nimport { ToolbarButton } from '../shared/ToolbarButton';\nimport { CustomSlatePluginOptions } from '../../types';\nimport { deserializeLeaf } from '../../helpers/deserializer';\nimport { useContentfulEditor } from '../../ContentfulEditorProvider';\n\ninterface ToolbarItalicButtonProps {\n isDisabled?: boolean;\n}\n\nexport function ToolbarItalicButton(props: ToolbarItalicButtonProps) {\n const editor = useContentfulEditor();\n\n function handleClick(event: React.MouseEvent<HTMLButtonElement>) {\n event.preventDefault();\n\n if (!editor?.selection) return;\n\n toggleMark(editor, MARKS.ITALIC);\n Slate.ReactEditor.focus(editor);\n }\n\n if (!editor) return null;\n\n return (\n <ToolbarButton\n title=\"Italic\"\n testId=\"italic-toolbar-button\"\n onClick={handleClick}\n isActive={isMarkActive(editor, MARKS.ITALIC)}\n isDisabled={props.isDisabled}>\n <FormatItalicIcon />\n </ToolbarButton>\n );\n}\n\nconst styles = {\n italic: css({\n fontStyle: 'italic',\n }),\n};\n\nexport function Italic(props: Slate.RenderLeafProps) {\n return (\n <em {...props.attributes} className={styles.italic}>\n {props.children}\n </em>\n );\n}\n\nexport function createItalicPlugin(): PlatePlugin {\n const deserializeRules: GetNodeDeserializerRule[] = [\n { nodeNames: ['I', 'EM'] },\n {\n style: {\n fontStyle: ['italic'],\n },\n },\n ];\n\n return {\n pluginKeys: MARKS.ITALIC,\n renderLeaf: getRenderLeaf(MARKS.ITALIC),\n onKeyDown: getToggleMarkOnKeyDown(MARKS.ITALIC),\n deserialize: deserializeLeaf(MARKS.ITALIC, deserializeRules),\n };\n}\n\nexport const withItalicOptions: CustomSlatePluginOptions = {\n [MARKS.ITALIC]: {\n type: MARKS.ITALIC,\n component: Italic,\n hotkey: ['mod+i'],\n },\n};\n","import * as React from 'react';\nimport * as Slate from 'slate-react';\nimport { PlatePlugin, getRenderLeaf, GetNodeDeserializerRule } from '@udecode/plate-core';\nimport { MARKS } from '@contentful/rich-text-types';\nimport { getToggleMarkOnKeyDown, toggleMark, isMarkActive } from '@udecode/plate-common';\nimport { FormatUnderlinedIcon } from '@contentful/f36-icons';\nimport { ToolbarButton } from '../shared/ToolbarButton';\nimport { CustomSlatePluginOptions } from 'types';\nimport { deserializeLeaf } from '../../helpers/deserializer';\nimport { useContentfulEditor } from '../../ContentfulEditorProvider';\n\ninterface ToolbarUnderlineButtonProps {\n isDisabled?: boolean;\n}\n\nexport function ToolbarUnderlineButton(props: ToolbarUnderlineButtonProps) {\n const editor = useContentfulEditor();\n\n function handleClick(event: React.MouseEvent<HTMLButtonElement>) {\n event.preventDefault();\n\n if (!editor?.selection) return;\n\n toggleMark(editor, MARKS.UNDERLINE);\n Slate.ReactEditor.focus(editor);\n }\n\n if (!editor) return null;\n\n return (\n <ToolbarButton\n title=\"Underline\"\n testId=\"underline-toolbar-button\"\n onClick={handleClick}\n isActive={isMarkActive(editor, MARKS.UNDERLINE)}\n isDisabled={props.isDisabled}>\n <FormatUnderlinedIcon />\n </ToolbarButton>\n );\n}\n\nexport function Underline(props: Slate.RenderLeafProps) {\n return <u {...props.attributes}>{props.children}</u>;\n}\n\nexport function createUnderlinePlugin(): PlatePlugin {\n const deserializeRules: GetNodeDeserializerRule[] = [\n { nodeNames: ['U'] },\n {\n style: {\n textDecoration: ['underline'],\n },\n },\n ];\n\n return {\n pluginKeys: MARKS.UNDERLINE,\n renderLeaf: getRenderLeaf(MARKS.UNDERLINE),\n onKeyDown: getToggleMarkOnKeyDown(MARKS.UNDERLINE),\n deserialize: deserializeLeaf(MARKS.UNDERLINE, deserializeRules),\n };\n}\n\nexport const withUnderlineOptions: CustomSlatePluginOptions = {\n [MARKS.UNDERLINE]: {\n type: MARKS.UNDERLINE,\n component: Underline,\n hotkey: ['mod+u'],\n },\n};\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, \"\");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n \"GeneratorFunction\"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n","import * as React from 'react';\nimport {\n ContentEntityType as EntityType,\n ScheduledAction,\n} from '@contentful/field-editor-reference/dist/types';\nimport { entityHelpers, Entry, Asset, FieldExtensionSDK } from '@contentful/field-editor-shared';\nimport { getScheduleTooltipContent } from '@contentful/field-editor-reference';\nimport { truncate } from '../../helpers/truncate';\n\nfunction getEntityInfo({\n entityTitle,\n entityStatus,\n contentTypeName,\n}: {\n entityTitle: string;\n entityStatus: string;\n contentTypeName?: string;\n}) {\n const title = truncate(entityTitle, 60) || 'Untitled';\n\n return `${contentTypeName || 'Asset'} \"${title}\", ${entityStatus}`;\n}\n\ninterface EntryAssetTooltipProps {\n id: string;\n type: EntityType;\n sdk: FieldExtensionSDK;\n}\n\nexport function EntryAssetTooltip({ id, type, sdk }: EntryAssetTooltipProps) {\n const [entityTitle, setEntityTitle] = React.useState('');\n const [entityStatus, setEntityStatus] = React.useState('');\n const [jobs, setJobs] = React.useState<ScheduledAction[]>([]);\n const [isLoading, setIsLoading] = React.useState(true);\n const [hasError, setHasError] = React.useState(false);\n\n React.useEffect(() => {\n async function loadContent() {\n try {\n setIsLoading(true);\n setHasError(false);\n\n const actions = {\n Asset: {\n getEntity: sdk.space.getAsset,\n getEntityTitle: (args) => entityHelpers.getAssetTitle({ ...args, asset: args.entity }),\n },\n Entry: {\n getEntity: sdk.space.getEntry,\n getEntityTitle: (args) => entityHelpers.getEntryTitle({ ...args, entry: args.entity }),\n },\n };\n\n let contentType;\n const entity: Entry | Asset = await actions[type].getEntity(id);\n\n if (entity.sys.contentType) {\n const contentTypeId = entity.sys.contentType.sys.id;\n const contentTypes = sdk.space.getCachedContentTypes();\n contentType = contentTypes.find((ct) => ct.sys.id === contentTypeId);\n }\n\n const entityTitle: string = actions[type].getEntityTitle({\n entity,\n contentType,\n localeCode: sdk.field.locale,\n defaultLocaleCode: sdk.locales.default,\n entityType: type,\n });\n\n const jobs = await sdk.space.getEntityScheduledActions(type, id);\n const entityStatus = entityHelpers.getEntryStatus(entity.sys);\n\n setEntityTitle(entityTitle);\n setEntityStatus(entityStatus);\n setJobs(jobs);\n } catch (err) {\n console.log(err);\n setHasError(true);\n } finally {\n setIsLoading(false);\n }\n }\n\n loadContent();\n }, [id, type, sdk]);\n\n if (isLoading) {\n return <>{`Loading ${type.toLowerCase()}...`}</>;\n }\n\n if (hasError) {\n return <>{`${type} missing or inaccessible`}</>;\n }\n\n return (\n <>\n {getEntityInfo({ entityTitle, contentTypeName: type, entityStatus })}{' '}\n {jobs.length > 0 ? getScheduleTooltipContent({ job: jobs[0], jobsCount: jobs.length }) : ''}\n </>\n );\n}\n","export function truncate(str, length) {\n if (typeof str === 'string' && str.length > length) {\n return (\n str &&\n str\n .substr(0, length + 1) // +1 to look ahead and be replaced below.\n // Get rid of orphan letters but not one letter words (I, a, 2).\n // Try to not have “.” as last character to avoid awkward “....”.\n .replace(/(\\s+\\S(?=\\S)|\\s*)\\.?.$/, '…')\n );\n }\n\n return str;\n}\n","import * as React from 'react';\nimport { Entry, Asset } from '@contentful/field-editor-shared';\nimport { useEntities, ScheduledIconWithTooltip } from '@contentful/field-editor-reference';\nimport { ClockIcon } from '@contentful/f36-icons';\nimport { css } from 'emotion';\nimport tokens from '@contentful/f36-tokens';\n\nconst styles = {\n scheduleIcon: css({\n marginRight: tokens.spacing2Xs,\n }),\n};\n\ninterface EntityStatusIconProps {\n entity: Entry | Asset;\n entityType: 'Entry' | 'Asset';\n}\n\nexport function EntityStatusIcon({ entity, entityType }: EntityStatusIconProps) {\n const { loadEntityScheduledActions } = useEntities();\n\n return (\n <ScheduledIconWithTooltip\n getEntityScheduledActions={loadEntityScheduledActions}\n entityType={entityType}\n entityId={entity.sys.id}>\n <ClockIcon\n className={styles.scheduleIcon}\n size=\"small\"\n color=\"muted\"\n testId=\"schedule-icon\"\n />\n </ScheduledIconWithTooltip>\n );\n}\n","import * as React from 'react';\nimport { EntryCard, MenuItem } from '@contentful/f36-components';\nimport { useEntities, MissingEntityCard, AssetThumbnail } from '@contentful/field-editor-reference';\nimport { FieldExtensionSDK } from '@contentful/app-sdk';\nimport { entityHelpers, File, isValidImage } from '@contentful/field-editor-shared';\nimport { css } from 'emotion';\nimport { EntityStatusIcon } from './EntityStatusIcon';\n\nconst styles = {\n entryCard: css({ cursor: 'pointer' }),\n};\n\ninterface FetchingWrappedEntryCardProps {\n entryId: string;\n isDisabled: boolean;\n isSelected: boolean;\n locale: string;\n sdk: FieldExtensionSDK;\n onEdit?: () => void;\n onRemove?: () => void;\n}\n\ninterface EntryThumbnailProps {\n file: File;\n}\n\nfunction EntryThumbnail({ file }: EntryThumbnailProps) {\n if (!isValidImage(file)) return null;\n\n return <AssetThumbnail file={file as File} />;\n}\n\nexport function FetchingWrappedEntryCard(props: FetchingWrappedEntryCardProps) {\n const { getOrLoadEntry, entries } = useEntities();\n const [file, setFile] = React.useState<File | null>(null);\n const entry = entries[props.entryId];\n const contentType = React.useMemo(() => {\n if (!entry || entry === 'failed') {\n return undefined;\n }\n return props.sdk.space\n .getCachedContentTypes()\n .find((contentType) => contentType.sys.id === entry.sys.contentType.sys.id);\n }, [props.sdk, entry]);\n const defaultLocaleCode = props.sdk.locales.default;\n\n React.useEffect(() => {\n if (!entry || entry === 'failed') return;\n\n entityHelpers\n .getEntryImage(\n {\n entry,\n contentType,\n localeCode: props.locale,\n defaultLocaleCode,\n },\n props.sdk.space.getAsset\n )\n .then(setFile)\n .catch(() => setFile(null));\n }, [entry, contentType, props.locale, defaultLocaleCode, props.sdk, file]);\n\n React.useEffect(() => {\n getOrLoadEntry(props.entryId);\n }, [props.entryId]); // eslint-disable-line\n\n function renderDropdown() {\n if (!props.onEdit || !props.onRemove) return undefined;\n\n return [\n props.onEdit ? (\n <MenuItem\n key=\"edit\"\n testId=\"card-action-edit\"\n onClick={() => {\n props.onEdit && props.onEdit();\n }}>\n Edit\n </MenuItem>\n ) : null,\n props.onRemove ? (\n <MenuItem\n key=\"delete\"\n testId=\"card-action-remove\"\n onClick={() => {\n props.onRemove && props.onRemove();\n }}>\n Remove\n </MenuItem>\n ) : null,\n ].filter((item) => item);\n }\n\n if (entry === undefined) {\n return <EntryCard size=\"default\" isLoading={true} />;\n }\n\n if (entry === 'failed') {\n return (\n <MissingEntityCard\n entityType=\"Entry\"\n isDisabled={props.isDisabled}\n onRemove={props.onRemove}\n />\n );\n }\n\n const entryStatus = entry ? entityHelpers.getEntryStatus(entry.sys) : undefined;\n if (entryStatus === 'deleted') {\n return (\n <MissingEntityCard\n entityType=\"Entry\"\n isDisabled={props.isDisabled}\n onRemove={props.onRemove}\n />\n );\n }\n\n const title = entityHelpers.getEntryTitle({\n entry,\n contentType,\n localeCode: props.locale,\n defaultLocaleCode,\n defaultTitle: 'Untitled',\n });\n\n const description = entityHelpers.getEntityDescription({\n entity: entry,\n contentType,\n localeCode: props.locale,\n defaultLocaleCode,\n });\n\n return (\n <EntryCard\n contentType={contentType?.name}\n title={title}\n description={description}\n size=\"default\"\n isSelected={props.isSelected}\n status={entryStatus}\n className={styles.entryCard}\n thumbnailElement={file ? <EntryThumbnail file={file} /> : undefined}\n icon={<EntityStatusIcon entityType=\"Entry\" entity={entry} />}\n withDragHandle={false}\n actions={renderDropdown()}\n />\n );\n}\n","import * as React from 'react';\nimport { AssetCard, AssetType, Menu, Text } from '@contentful/f36-components';\nimport { useEntities, MissingEntityCard } from '@contentful/field-editor-reference';\n\nimport { FieldExtensionSDK } from '@contentful/app-sdk';\nimport { entityHelpers, File, shortenStorageUnit } from '@contentful/field-editor-shared';\nimport mimetype from '@contentful/mimetype';\nimport { css } from 'emotion';\nimport get from 'lodash/get';\nimport { EntityStatusIcon } from './EntityStatusIcon';\n\nconst styles = {\n assetCard: css({ cursor: 'pointer' }),\n cardDropdown: css({\n width: '300px',\n }),\n truncated: css({\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n }),\n};\ninterface FetchingWrappedAssetCardProps {\n assetId: string;\n isDisabled: boolean;\n isSelected: boolean;\n locale: string;\n onEdit?: () => void;\n onRemove?: () => unknown;\n sdk: FieldExtensionSDK;\n}\n\nfunction downloadAsset(url: string) {\n window.open(url, '_blank', 'noopener,noreferrer');\n}\n\nexport function renderAssetInfo(props: { entityFile: File }) {\n const { entityFile } = props;\n const fileName = get(entityFile, 'fileName');\n const mimeType = get(entityFile, 'contentType');\n const fileSize = get(entityFile, 'details.size');\n const image = get(entityFile, 'details.image');\n return [\n <Menu.SectionTitle key=\"file-section\">File info</Menu.SectionTitle>,\n fileName && (\n <Menu.Item key=\"file-name\">\n <Text isTruncated>{fileName}</Text>\n </Menu.Item>\n ),\n mimeType && (\n <Menu.Item key=\"file-type\">\n <Text isTruncated>{mimeType}</Text>\n </Menu.Item>\n ),\n fileSize && <Menu.Item key=\"file-size\">{shortenStorageUnit(fileSize, 'B')}</Menu.Item>,\n image && <Menu.Item key=\"file-dimentions\">{`${image.width} × ${image.height}`}</Menu.Item>,\n ].filter((item) => item);\n}\n\nexport function renderActions(props: {\n onEdit?: () => void;\n onRemove?: () => void;\n isDisabled: boolean;\n entityFile?: File;\n}) {\n const { entityFile, isDisabled, onEdit, onRemove } = props;\n\n return [\n <Menu.SectionTitle key=\"section-title\">Actions</Menu.SectionTitle>,\n onEdit ? (\n <Menu.Item key=\"edit\" onClick={onEdit} testId=\"card-action-edit\">\n Edit\n </Menu.Item>\n ) : null,\n entityFile ? (\n <Menu.Item\n key=\"download\"\n onClick={() => {\n if (typeof entityFile.url === 'string') {\n downloadAsset(entityFile.url);\n }\n }}\n testId=\"card-action-download\">\n Download\n </Menu.Item>\n ) : null,\n onRemove ? (\n <Menu.Item key=\"remove\" disabled={isDisabled} onClick={onRemove} testId=\"card-action-remove\">\n Remove\n </Menu.Item>\n ) : null,\n ].filter((item) => item);\n}\n\nexport function FetchingWrappedAssetCard(props: FetchingWrappedAssetCardProps) {\n const { getOrLoadAsset, assets } = useEntities();\n const asset = assets[props.assetId];\n const defaultLocaleCode = props.sdk.locales.default;\n const entityFile: File | undefined = asset?.fields?.file\n ? asset.fields.file[props.locale] || asset.fields.file[defaultLocaleCode]\n : undefined;\n\n React.useEffect(() => {\n getOrLoadAsset(props.assetId);\n }, [props.assetId]); // eslint-disable-line\n\n function getAssetSrc() {\n if (!entityFile?.url) return '';\n\n return `${entityFile.url}?h=300`;\n }\n\n function getFileType(): AssetType {\n const groupToIconMap = {\n image: 'image',\n video: 'video',\n audio: 'audio',\n richtext: 'richtext',\n presentation: 'presentation',\n spreadsheet: 'spreadsheet',\n pdfdocument: 'pdf',\n archive: 'archive',\n plaintext: 'plaintext',\n code: 'code',\n markup: 'markup',\n };\n const archive = groupToIconMap['archive'] as AssetType;\n\n if (!entityFile) {\n return archive;\n }\n\n const groupName: keyof typeof groupToIconMap = mimetype.getGroupLabel({\n type: entityFile.contentType,\n fallbackFileName: entityFile.fileName,\n });\n\n return (groupToIconMap[groupName] as AssetType) || archive;\n }\n\n if (asset === undefined) {\n return <AssetCard size=\"small\" isLoading />;\n }\n\n if (asset === 'failed') {\n return (\n <MissingEntityCard\n entityType=\"Asset\"\n isDisabled={props.isDisabled}\n onRemove={props.onRemove}\n />\n );\n }\n\n const status = asset ? entityHelpers.getEntryStatus(asset.sys) : undefined;\n if (status === 'deleted') {\n return (\n <MissingEntityCard\n entityType=\"Asset\"\n asSquare={true}\n isDisabled={props.isDisabled}\n onRemove={props.onRemove}\n />\n );\n }\n\n const entityTitle = entityHelpers.getAssetTitle({\n asset,\n localeCode: props.locale,\n defaultLocaleCode,\n defaultTitle: 'Untitled',\n });\n\n return (\n <AssetCard\n title={entityTitle}\n isSelected={props.isSelected}\n size=\"small\"\n src={getAssetSrc()}\n type={getFileType()}\n status={status}\n icon={<EntityStatusIcon entityType=\"Asset\" entity={asset} />}\n className={styles.assetCard}\n actions={[\n renderActions({\n entityFile,\n isDisabled: props.isDisabled,\n onEdit: props.onEdit,\n onRemove: props.onRemove,\n }),\n entityFile ? renderAssetInfo({ entityFile }) : null,\n ].filter((item) => item)}\n />\n );\n}\n","/* eslint-disable you-dont-need-lodash-underscore/find */\nimport flow from 'lodash/flow';\nimport find from 'lodash/find';\nimport get from 'lodash/get';\n\n/**\n * Given a field object and a rich text node type, return a list of valid\n * content type IDs associated with the node type, based on that node type's\n * `linkContentType` validation.\n *\n * If there is no such validation or the validation is empty, return an empty\n * array.\n *\n * The navigation here is explained by the `nodes` validation having signature:\n * { nodes: { [nodeType]: validationObject[] } }\n *\n * We defensively navigate through this object because\n * 1) the field may not have a `validations` array,\n * 2) the `validations` array may be empty,\n * 3) the `validations` array may not have a `nodes` validation,\n * 4) the `nodes` validation may not validate the `nodeType`, and\n * 5) the `nodeType` validations may not have a `linkContentType` validation.\n *\n * Note that passing an empty array will result in all possible content types\n * being whitelisted.\n *\n * @param {object} field\n * @param {string} nodeType\n * @returns {string[]}\n */\nexport default function getLinkedContentTypeIdsForNodeType(field, nodeType): string[] {\n return flow(\n (v) => find(v, 'nodes'),\n (v) => get(v, ['nodes', nodeType]),\n (v) => find(v, 'linkContentType'),\n (v) => get(v, 'linkContentType', [])\n )(field.validations);\n}\n","import * as React from 'react';\nimport { INLINES } from '@contentful/rich-text-types';\nimport {\n TextLink,\n Button,\n FormControl,\n FormLabel,\n Select,\n TextInput,\n Form,\n ModalContent,\n ModalControls,\n} from '@contentful/f36-components';\nimport { ModalDialogLauncher, FieldExtensionSDK } from '@contentful/field-editor-shared';\nimport { SPEditor } from '@udecode/plate-core';\nimport { Editor, Transforms } from 'slate';\nimport { ReactEditor } from 'slate-react';\nimport { HistoryEditor } from 'slate-history';\nimport { EntityProvider } from '@contentful/field-editor-reference';\nimport { Link } from '@contentful/field-editor-reference/dist/types';\nimport { css } from 'emotion';\nimport tokens from '@contentful/f36-tokens';\nimport { getNodeEntryFromSelection, insertLink, LINK_TYPES } from '../../helpers/editor';\nimport { FetchingWrappedEntryCard } from '../shared/FetchingWrappedEntryCard';\nimport { FetchingWrappedAssetCard } from '../shared/FetchingWrappedAssetCard';\nimport getLinkedContentTypeIdsForNodeType from '../../helpers/getLinkedContentTypeIdsForNodeType';\nimport { isNodeTypeEnabled } from '../../helpers/validations';\n\nconst styles = {\n removeSelectionLabel: css`\n margin-left: ${tokens.spacingS};\n `,\n};\n\ninterface HyperlinkModalProps {\n linkText?: string;\n linkType?: string;\n linkTarget?: string;\n linkEntity?: Link;\n onClose: (value: unknown) => void;\n sdk: FieldExtensionSDK;\n}\n\nconst SYS_LINK_TYPES = {\n [INLINES.ENTRY_HYPERLINK]: 'Entry',\n [INLINES.ASSET_HYPERLINK]: 'Asset',\n};\n\nconst LINK_TYPE_SELECTION_VALUES = {\n [INLINES.HYPERLINK]: 'URL',\n [INLINES.ENTRY_HYPERLINK]: 'Entry',\n [INLINES.ASSET_HYPERLINK]: 'Asset',\n};\n\nexport function HyperlinkModal(props: HyperlinkModalProps) {\n const enabledLinkTypes = LINK_TYPES.filter((nodeType) =>\n isNodeTypeEnabled(props.sdk.field, nodeType)\n );\n const [defaultLinkType] = enabledLinkTypes;\n const [linkText, setLinkText] = React.useState(props.linkText ?? '');\n const [linkType, setLinkType] = React.useState(props.linkType ?? defaultLinkType);\n const [linkTarget, setLinkTarget] = React.useState(props.linkTarget ?? '');\n const [linkEntity, setLinkEntity] = React.useState<Link | null>(props.linkEntity ?? null);\n\n function isLinkComplete() {\n const isRegularLink = linkType === INLINES.HYPERLINK;\n if (isRegularLink) {\n return !!(linkText && linkTarget);\n }\n\n const entityLinks: string[] = Object.keys(SYS_LINK_TYPES);\n const isEntityLink = entityLinks.includes(linkType);\n if (isEntityLink) {\n return !!(linkText && linkEntity);\n }\n\n return false;\n }\n\n function handleOnSubmit(event: React.MouseEvent<HTMLButtonElement>) {\n event.preventDefault();\n\n props.onClose({ linkText, linkType, linkTarget, linkEntity });\n }\n\n function entityToLink(entity): Link {\n const { id, type } = entity.sys;\n\n return { sys: { id, type: 'Link', linkType: type } };\n }\n\n async function selectEntry() {\n const options = {\n locale: props.sdk.field.locale,\n contentTypes: getLinkedContentTypeIdsForNodeType(props.sdk.field, INLINES.ENTRY_HYPERLINK),\n };\n const entry = await props.sdk.dialogs.selectSingleEntry(options);\n setLinkTarget('');\n setLinkEntity(entityToLink(entry));\n }\n\n async function selectAsset() {\n const options = {\n locale: props.sdk.field.locale,\n };\n const asset = await props.sdk.dialogs.selectSingleAsset(options);\n setLinkTarget('');\n setLinkEntity(entityToLink(asset));\n }\n\n function resetLinkEntity(event: React.MouseEvent) {\n event.preventDefault();\n\n setLinkEntity(null);\n }\n\n return (\n <EntityProvider sdk={props.sdk}>\n <React.Fragment>\n <ModalContent>\n <Form>\n <FormControl id=\"link-text\" isRequired>\n <FormControl.Label>Link text</FormControl.Label>\n <TextInput\n testId=\"link-text-input\"\n name=\"link-text\"\n value={linkText}\n onChange={(event) => setLinkText(event.target.value)}\n />\n </FormControl>\n\n {enabledLinkTypes.length > 1 && (\n <FormControl id=\"link-type\">\n <FormControl.Label>Link type</FormControl.Label>\n <Select\n value={linkType}\n onChange={(event: React.ChangeEvent<HTMLSelectElement>) =>\n setLinkType(event.target.value)\n }\n testId=\"link-type-input\">\n {enabledLinkTypes.map((nodeType) => (\n <Select.Option key={nodeType} value={nodeType}>\n {LINK_TYPE_SELECTION_VALUES[nodeType]}\n </Select.Option>\n ))}\n </Select>\n </FormControl>\n )}\n\n {linkType === INLINES.HYPERLINK && (\n <FormControl id=\"linkTarget\" isRequired>\n <FormControl.Label>Link target</FormControl.Label>\n <TextInput\n name=\"linkTarget\"\n value={linkTarget}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => {\n setLinkEntity(null);\n setLinkTarget(event.target.value);\n }}\n testId=\"link-target-input\"\n />\n <FormControl.HelpText>\n A protocol may be required, e.g. https://\n </FormControl.HelpText>\n </FormControl>\n )}\n\n {linkType !== INLINES.HYPERLINK && (\n <div>\n <FormLabel isRequired htmlFor=\"\">\n Link target{' '}\n </FormLabel>\n\n {linkEntity && linkEntity.sys.linkType === SYS_LINK_TYPES[linkType] ? (\n <>\n <TextLink\n testId=\"entity-selection-link\"\n onClick={resetLinkEntity}\n className={styles.removeSelectionLabel}>\n Remove selection\n </TextLink>\n <div>\n {linkType === INLINES.ENTRY_HYPERLINK && (\n <FetchingWrappedEntryCard\n sdk={props.sdk}\n locale={props.sdk.field.locale}\n entryId={linkEntity.sys.id}\n isDisabled={true}\n isSelected={false}\n />\n )}\n {linkType === INLINES.ASSET_HYPERLINK && (\n <FetchingWrappedAssetCard\n sdk={props.sdk}\n locale={props.sdk.field.locale}\n assetId={linkEntity.sys.id}\n isDisabled={true}\n isSelected={false}\n />\n )}\n </div>\n </>\n ) : (\n <div>\n {linkType === INLINES.ENTRY_HYPERLINK && (\n <TextLink testId=\"entity-selection-link\" onClick={selectEntry}>\n Select entry\n </TextLink>\n )}\n {linkType === INLINES.ASSET_HYPERLINK && (\n <TextLink testId=\"entity-selection-link\" onClick={selectAsset}>\n Select asset\n </TextLink>\n )}\n </div>\n )}\n </div>\n )}\n </Form>\n </ModalContent>\n <ModalControls>\n <Button\n type=\"button\"\n onClick={() => props.onClose(null)}\n variant=\"secondary\"\n testId=\"cancel-cta\"\n size=\"small\">\n Cancel\n </Button>\n <Button\n type=\"submit\"\n variant=\"positive\"\n size=\"small\"\n isDisabled={!isLinkComplete()}\n onClick={handleOnSubmit}\n testId=\"confirm-cta\">\n {props.linkType ? 'Update' : 'Insert'}\n </Button>\n </ModalControls>\n </React.Fragment>\n </EntityProvider>\n );\n}\n\ninterface HyperLinkDialogData {\n linkText: string;\n linkType: INLINES.HYPERLINK | INLINES.ASSET_HYPERLINK | INLINES.ENTRY_HYPERLINK;\n linkTarget?: string;\n linkEntity?: Link;\n}\n\nexport async function addOrEditLink(\n editor: ReactEditor & HistoryEditor & SPEditor,\n sdk: FieldExtensionSDK\n) {\n if (!editor.selection) return;\n\n let linkType;\n let linkText;\n let linkTarget;\n let linkEntity;\n\n const [node, path] = getNodeEntryFromSelection(editor, LINK_TYPES);\n if (node && path) {\n linkType = node.type;\n linkText = Editor.string(editor, path);\n linkTarget = (node.data as { uri: string }).uri || '';\n linkEntity = (node.data as { target: Link }).target;\n }\n\n const selectionBeforeBlur = { ...editor.selection };\n const currentLinkText = linkText || Editor.string(editor, editor.selection);\n\n const data = await ModalDialogLauncher.openDialog(\n {\n title: linkType ? 'Edit hyperlink' : 'Insert hyperlink',\n width: 'large',\n shouldCloseOnEscapePress: true,\n shouldCloseOnOverlayClick: true,\n allowHeightOverflow: true,\n },\n ({ onClose }) => {\n return (\n <HyperlinkModal\n linkTarget={linkTarget}\n linkText={currentLinkText}\n linkType={linkType}\n linkEntity={linkEntity}\n onClose={onClose}\n sdk={sdk}\n />\n );\n }\n );\n\n if (!data) return;\n\n const {\n linkText: text,\n linkTarget: url,\n linkType: type,\n linkEntity: target,\n } = data as HyperLinkDialogData;\n\n Transforms.select(editor, selectionBeforeBlur);\n\n insertLink(editor, { text, url, type, target, path });\n\n ReactEditor.focus(editor);\n}\n","import * as React from 'react';\nimport {\n PlatePlugin,\n getRenderElement,\n getPlatePluginTypes,\n getPlatePluginOptions,\n} from '@udecode/plate-core';\nimport { INLINES } from '@contentful/rich-text-types';\nimport { Tooltip, TextLink } from '@contentful/f36-components';\nimport { EntryAssetTooltip } from './EntryAssetTooltip';\nimport { LinkIcon } from '@contentful/f36-icons';\nimport { ToolbarButton } from '../shared/ToolbarButton';\nimport { css } from 'emotion';\nimport tokens from '@contentful/f36-tokens';\nimport { FieldExtensionSDK, Link, ContentEntityType as EntityType } from '@contentful/app-sdk';\nimport { CustomSlatePluginOptions, CustomRenderElementProps } from '../../types';\nimport { useSdkContext } from '../../SdkProvider';\nimport { addOrEditLink } from './HyperlinkModal';\nimport { isLinkActive, LINK_TYPES, unwrapLink } from '../../helpers/editor';\nimport { useContentfulEditor } from '../../ContentfulEditorProvider';\n\nconst styles = {\n hyperlinkWrapper: css({\n display: 'inline',\n position: 'static',\n a: {\n fontSize: 'inherit !important',\n },\n }),\n hyperlink: css({\n fontSize: 'inherit !important',\n display: 'inline !important',\n '&:hover': {\n fill: tokens.gray900,\n },\n '&:focus': {\n fill: tokens.gray900,\n },\n }),\n hyperlinkIEFallback: css({\n color: '#1683d0',\n textDecoration: 'underline',\n }),\n // TODO: use these styles once we can use the icon\n hyperlinkIcon: css({\n position: 'relative',\n top: '4px',\n height: '14px',\n margin: '0 -2px 0 -1px',\n webkitTransition: 'fill 100ms ease-in-out',\n transition: 'fill 100ms ease-in-out',\n '&:hover': {\n fill: tokens.gray900,\n },\n '&:focus': {\n fill: tokens.gray900,\n },\n }),\n};\n\nexport function createHyperlinkPlugin(sdk: FieldExtensionSDK): PlatePlugin {\n return {\n renderElement: getRenderElement(LINK_TYPES),\n pluginKeys: LINK_TYPES,\n inlineTypes: getPlatePluginTypes(LINK_TYPES),\n onKeyDown: buildHyperlinkEventHandler(sdk),\n deserialize: (editor) => {\n const hyperlinkOptions = getPlatePluginOptions(editor, INLINES.HYPERLINK);\n const entryHyperlinkOptions = getPlatePluginOptions(editor, INLINES.ENTRY_HYPERLINK);\n const assetHyperlinkOptions = getPlatePluginOptions(editor, INLINES.ASSET_HYPERLINK);\n\n const isAnchor = (element) =>\n element.nodeName === 'A' &&\n !!element.getAttribute('href') &&\n element.getAttribute('href') !== '#';\n const isEntryAnchor = (element) =>\n isAnchor(element) && element.getAttribute('data-link-type') === 'Entry';\n const isAssetAnchor = (element) =>\n isAnchor(element) && element.getAttribute('data-link-type') === 'Asset';\n\n return {\n element: [\n {\n type: INLINES.HYPERLINK,\n deserialize: (element) => {\n if (!isAnchor(element) || isEntryAnchor(element) || isAssetAnchor(element)) return;\n\n return {\n type: INLINES.HYPERLINK,\n data: {\n uri: element.getAttribute('href'),\n },\n };\n },\n ...hyperlinkOptions.deserialize,\n },\n {\n type: INLINES.ENTRY_HYPERLINK,\n deserialize: (element) => {\n if (!isEntryAnchor(element)) return;\n\n return {\n type: INLINES.ENTRY_HYPERLINK,\n data: {\n target: {\n sys: {\n id: element.getAttribute('data-link-id'),\n linkType: element.getAttribute('data-link-type'),\n type: 'Link',\n },\n },\n },\n };\n },\n ...entryHyperlinkOptions.deserialize,\n },\n {\n type: INLINES.ASSET_HYPERLINK,\n deserialize: (element) => {\n if (!isAssetAnchor(element)) return;\n\n return {\n type: INLINES.ASSET_HYPERLINK,\n data: {\n target: {\n sys: {\n id: element.getAttribute('data-link-id'),\n linkType: element.getAttribute('data-link-type'),\n type: 'Link',\n },\n },\n },\n };\n },\n ...assetHyperlinkOptions.deserialize,\n },\n ],\n };\n },\n };\n}\n\ntype K = 75;\ntype KEvent = React.KeyboardEvent & { keyCode: K };\ntype CtrlEvent = React.KeyboardEvent & { ctrlKey: true };\ntype MetaEvent = React.KeyboardEvent & { metaKey: true };\ntype ModEvent = CtrlEvent | MetaEvent;\ntype HyperlinkEvent = ModEvent & KEvent;\n\nconst isMod = (event: React.KeyboardEvent): event is ModEvent => event.ctrlKey || event.metaKey;\nconst isK = (event: React.KeyboardEvent): event is KEvent => event.keyCode === 75;\nconst wasHyperlinkEventTriggered = (event: React.KeyboardEvent): event is HyperlinkEvent =>\n isMod(event) && isK(event);\n\nexport function buildHyperlinkEventHandler(sdk) {\n return function withHyperlinkEvents(editor) {\n return function handleKeyDown(event: React.KeyboardEvent) {\n if (!editor.selection || !wasHyperlinkEventTriggered(event)) return;\n if (isLinkActive(editor)) {\n unwrapLink(editor);\n } else {\n addOrEditLink(editor, sdk);\n }\n };\n };\n}\n\ntype HyperlinkElementProps = CustomRenderElementProps<{\n uri?: string;\n target?: Link;\n}>;\n\nfunction UrlHyperlink(props: HyperlinkElementProps) {\n const editor = useContentfulEditor();\n const sdk: FieldExtensionSDK = useSdkContext();\n const { uri } = props.element.data;\n\n async function handleClick(event: React.MouseEvent<HTMLAnchorElement>) {\n event.preventDefault();\n event.stopPropagation();\n if (!editor) return;\n addOrEditLink(editor, sdk);\n }\n\n return (\n <Tooltip\n content={uri}\n targetWrapperClassName={styles.hyperlinkWrapper}\n placement=\"bottom\"\n maxWidth=\"auto\">\n <TextLink\n as=\"a\"\n href={uri}\n rel=\"noopener noreferrer\"\n onClick={handleClick}\n className={styles.hyperlink}>\n {props.children}\n </TextLink>\n </Tooltip>\n );\n}\n\nfunction EntityHyperlink(props: HyperlinkElementProps) {\n const editor = useContentfulEditor();\n const sdk: FieldExtensionSDK = useSdkContext();\n const { target } = props.element.data;\n\n if (!target) return null;\n\n async function handleClick(event: React.MouseEvent<HTMLButtonElement>) {\n event.preventDefault();\n event.stopPropagation();\n if (!editor) return;\n addOrEditLink(editor, sdk);\n }\n\n return (\n <Tooltip\n content={\n (\n <EntryAssetTooltip\n id={target.sys.id}\n type={target.sys.linkType as EntityType}\n sdk={sdk}\n />\n ) as unknown as string\n }\n targetWrapperClassName={styles.hyperlinkWrapper}\n placement=\"bottom\"\n maxWidth=\"auto\">\n <TextLink\n as=\"button\"\n onClick={handleClick}\n className={styles.hyperlink}\n data-link-type={target.sys.linkType}\n data-link-id={target.sys.id}>\n {props.children}\n </TextLink>\n </Tooltip>\n );\n}\n\ninterface ToolbarHyperlinkButtonProps {\n isDisabled: boolean | undefined;\n}\n\nexport function ToolbarHyperlinkButton(props: ToolbarHyperlinkButtonProps) {\n const editor = useContentfulEditor();\n const isActive = !!(editor && isLinkActive(editor));\n const sdk: FieldExtensionSDK = useSdkContext();\n\n async function handleClick(event: React.MouseEvent<HTMLButtonElement>) {\n event.preventDefault();\n\n if (!editor) return;\n\n if (isActive) {\n unwrapLink(editor);\n } else {\n addOrEditLink(editor, sdk);\n }\n }\n\n if (!editor) return null;\n\n return (\n <ToolbarButton\n title=\"Hyperlink\"\n testId=\"hyperlink-toolbar-button\"\n onClick={handleClick}\n isActive={isActive}\n isDisabled={props.isDisabled}>\n <LinkIcon />\n </ToolbarButton>\n );\n}\n\nexport const withHyperlinkOptions: CustomSlatePluginOptions = {\n [INLINES.HYPERLINK]: {\n type: INLINES.HYPERLINK,\n component: UrlHyperlink,\n },\n [INLINES.ENTRY_HYPERLINK]: {\n type: INLINES.ENTRY_HYPERLINK,\n component: EntityHyperlink,\n },\n [INLINES.ASSET_HYPERLINK]: {\n type: INLINES.ASSET_HYPERLINK,\n component: EntityHyperlink,\n },\n};\n","import { Transforms } from 'slate';\nimport { SPEditor } from '@udecode/plate-core';\nimport { BLOCKS } from '@contentful/rich-text-types';\nimport { getAbove, getChildren } from '@udecode/plate-common';\nimport {\n ELEMENT_TABLE,\n ELEMENT_TH,\n ELEMENT_TD,\n ELEMENT_TR,\n insertTable,\n} from '@udecode/plate-table';\n\nimport { isBlockSelected, getNodeEntryFromSelection } from '../../helpers/editor';\n\n/**\n * Sets the UI focus to the first cell of the selected table.\n *\n * This is necessary because udecode's plugin sets the focus to the\n * _last_ cell of the table after selection, which is weird.\n */\nfunction moveToFirstCellFromSelectedTable(editor) {\n const [, tablePath] = getNodeEntryFromSelection(editor, BLOCKS.TABLE);\n if (!tablePath) return;\n const firstTableCellPath = tablePath.concat([\n 0, // -> row\n 0, // -> cell\n 0, // -> paragraph\n 0, // -> text node\n ]);\n const anchor = { path: firstTableCellPath, offset: 0 };\n Transforms.setSelection(editor, { anchor, focus: anchor });\n}\n\nexport function insertTableAndFocusFirstCell(editor: SPEditor): void {\n // FIXME: a table should only be allowed at root level. Currently this\n // code adds it at any level\n insertTable(editor, { header: true });\n moveToFirstCellFromSelectedTable(editor);\n}\n\nexport function isTableActive(editor: SPEditor) {\n const tableElements = [ELEMENT_TABLE, ELEMENT_TH, ELEMENT_TR, ELEMENT_TD];\n return tableElements.some((el) => isBlockSelected(editor, el));\n}\n\nexport function isTableHeaderEnabled(editor: SPEditor) {\n const tableItem = getAbove(editor, {\n match: {\n type: BLOCKS.TABLE,\n },\n });\n\n if (!tableItem) {\n return false;\n }\n\n const firstRow = getChildren(tableItem)[0];\n\n if (!firstRow) {\n return false;\n }\n\n return getChildren(firstRow).every(([node]) => {\n return node.type === BLOCKS.TABLE_HEADER_CELL;\n });\n}\n","import * as React from 'react';\nimport constate from 'constate';\n\nexport type RichTextTrackingActionName =\n | 'insertTable'\n | 'insertTableRow'\n | 'insertTableColumn'\n | 'removeTable'\n | 'removeTableRow'\n | 'removeTableColumn'\n | 'paste';\n\nexport type RichTextTrackingActionHandler = (\n name: RichTextTrackingActionName,\n data: Record<string, unknown>\n) => unknown;\n\ninterface TrackingProviderProps {\n onAction: RichTextTrackingActionHandler;\n}\n\nexport interface TrackingProvider {\n onViewportAction: (\n actionName: RichTextTrackingActionName,\n data?: Record<string, unknown>\n ) => ReturnType<TrackingProviderProps['onAction']>;\n}\n\nfunction useTracking({ onAction }: TrackingProviderProps): TrackingProvider {\n const trackingMemo = React.useMemo<TrackingProvider>(\n () => ({\n onViewportAction: (actionName: RichTextTrackingActionName, data = {}) =>\n onAction(actionName, { origin: 'viewport-interaction', ...data }),\n }),\n [] // eslint-disable-line\n );\n\n return trackingMemo;\n}\n\nexport const [TrackingProvider, useTrackingContext] = constate(useTracking);\n","import { Transforms, Path, Editor } from 'slate';\nimport { getAbove, insertNodes, someNode } from '@udecode/plate-common';\nimport { getPlatePluginType, SPEditor, TElement } from '@udecode/plate-core';\nimport { ELEMENT_TABLE, ELEMENT_TR, getEmptyRowNode } from '@udecode/plate-table';\n\nconst addRow = (editor: SPEditor, getNextRowPath: (currentRowPath: Path) => Path) => {\n if (\n someNode(editor, {\n match: { type: getPlatePluginType(editor, ELEMENT_TABLE) },\n })\n ) {\n const currentRowItem = getAbove(editor, {\n match: { type: getPlatePluginType(editor, ELEMENT_TR) },\n });\n\n if (currentRowItem) {\n const [currentRowElem, currentRowPath] = currentRowItem;\n const nextRowPath = getNextRowPath(currentRowPath);\n\n insertNodes<TElement>(\n editor,\n // @ts-expect-error\n getEmptyRowNode(editor, {\n header: false,\n colCount: currentRowElem.children.length,\n }),\n {\n at: nextRowPath,\n // Note: this selects the last cell of the new row\n select: true,\n }\n );\n\n // Select the first cell in the current row\n Transforms.select(editor, Editor.start(editor, nextRowPath));\n }\n }\n};\n\nexport const addRowBelow = (editor: SPEditor) => {\n addRow(editor, (currentRowPath) => {\n return Path.next(currentRowPath);\n });\n};\n\nexport const addRowAbove = (editor: SPEditor) => {\n addRow(editor, (currentRowPath) => {\n // The new row will be in in-place of the old row\n return currentRowPath;\n });\n};\n","import { Path } from 'slate';\nimport { getAbove, insertNodes, someNode } from '@udecode/plate-common';\nimport { getPlatePluginType, SPEditor, TElement } from '@udecode/plate-core';\nimport {\n getEmptyCellNode,\n TablePluginOptions,\n ELEMENT_TABLE,\n ELEMENT_TD,\n ELEMENT_TH,\n} from '@udecode/plate-table';\n\nconst addColumn = (\n editor: SPEditor,\n { header }: TablePluginOptions,\n getNextCellPath: (currentCellPath: Path) => Path\n) => {\n if (\n someNode(editor, {\n match: { type: getPlatePluginType(editor, ELEMENT_TABLE) },\n })\n ) {\n const currentCellItem = getAbove(editor, {\n match: {\n type: [getPlatePluginType(editor, ELEMENT_TD), getPlatePluginType(editor, ELEMENT_TH)],\n },\n });\n\n const currentTableItem = getAbove(editor, {\n match: { type: getPlatePluginType(editor, ELEMENT_TABLE) },\n });\n\n if (currentCellItem && currentTableItem) {\n const nextCellPath = getNextCellPath(currentCellItem[1]);\n const newCellPath = nextCellPath.slice();\n const replacePathPos = newCellPath.length - 2;\n\n currentTableItem[0].children.forEach((_, rowIdx) => {\n newCellPath[replacePathPos] = rowIdx;\n\n insertNodes<TElement>(\n editor,\n // @ts-expect-error\n getEmptyCellNode(editor, { header: header && rowIdx === 0 }),\n {\n at: newCellPath,\n // Select the first cell of the new column\n select: rowIdx === 0,\n }\n );\n });\n }\n }\n};\n\nexport const addColumnRight = (editor: SPEditor, options: TablePluginOptions) => {\n addColumn(editor, options, (currentCellPath) => Path.next(currentCellPath));\n};\n\nexport const addColumnLeft = (editor: SPEditor, options: TablePluginOptions) => {\n addColumn(editor, options, (currentCellPath) => currentCellPath);\n};\n","import React from 'react';\nimport { css } from 'emotion';\nimport * as Slate from 'slate-react';\nimport { SPEditor } from '@udecode/plate-core';\nimport { TablePluginOptions, deleteColumn, deleteRow, deleteTable } from '@udecode/plate-table';\nimport { IconButton, Menu } from '@contentful/f36-components';\nimport { ChevronDownIcon } from '@contentful/f36-icons';\nimport { getAbove } from '@udecode/plate-common';\nimport { BLOCKS } from '@contentful/rich-text-types';\n\nimport { isTableHeaderEnabled } from './helpers';\nimport { useContentfulEditor } from '../../ContentfulEditorProvider';\nimport { getNodeEntryFromSelection, getTableSize } from '../../helpers/editor';\nimport { RichTextTrackingActionName, useTrackingContext } from '../../TrackingProvider';\nimport { addRowAbove, addColumnLeft, addColumnRight, addRowBelow, setHeader } from './actions';\n\nexport const styles = {\n topRight: css({\n position: 'absolute',\n top: '6px',\n right: '5px',\n }),\n};\n\nconst getCurrentTableSize = (editor: SPEditor): Record<'numRows' | 'numColumns', number> | null => {\n const [table] = getNodeEntryFromSelection(editor, BLOCKS.TABLE);\n return table ? getTableSize(table) : null;\n};\n\ntype TableAction = (editor: SPEditor, options: TablePluginOptions) => void;\n\nexport const TableActions = () => {\n const editor = useContentfulEditor();\n const { onViewportAction } = useTrackingContext();\n const [isOpen, setOpen] = React.useState(false);\n const [isHeaderEnabled, setHeaderEnabled] = React.useState(false);\n\n const close = React.useCallback(() => {\n setOpen(false);\n\n if (!editor) return;\n\n // Makes sure we keep the editor in focus when clicking on/out\n // the dropdown menu\n Slate.ReactEditor.focus(editor);\n }, [editor]);\n\n React.useEffect(() => {\n setHeaderEnabled(Boolean(editor && isTableHeaderEnabled(editor)));\n }, [editor]);\n\n const canInsertRowAbove = React.useMemo(() => {\n if (!editor) {\n return false;\n }\n\n const headerCell = getAbove(editor, {\n match: {\n type: BLOCKS.TABLE_HEADER_CELL,\n },\n });\n\n return !headerCell;\n }, [editor]);\n\n const toggleHeader = React.useCallback(() => {\n close();\n\n if (!editor) {\n return;\n }\n\n const value = !isHeaderEnabled;\n\n setHeaderEnabled(value);\n setHeader(editor, value);\n }, [editor, close, isHeaderEnabled]);\n\n const action = React.useCallback(\n (cb: TableAction, type: 'insert' | 'remove', element: 'Table' | 'Row' | 'Column') => () => {\n if (!editor?.selection) return;\n close();\n\n const tableSize = getCurrentTableSize(editor);\n\n cb(editor, { header: isHeaderEnabled });\n\n // Tracking\n const actionName = `${type}Table${element === 'Table' ? '' : element}`;\n onViewportAction(actionName as RichTextTrackingActionName, { tableSize });\n },\n [editor, isHeaderEnabled, close, onViewportAction]\n );\n\n return (\n <Menu\n placement=\"left\"\n isOpen={isOpen}\n onOpen={() => {\n setOpen(true);\n }}\n onClose={close}>\n <Menu.Trigger>\n <IconButton\n size=\"small\"\n variant=\"transparent\"\n tabIndex={-1}\n className={styles.topRight}\n icon={<ChevronDownIcon />}\n aria-label=\"Open table menu\"\n testId=\"cf-table-actions-button\"\n />\n </Menu.Trigger>\n <Menu.List>\n <Menu.Item onClick={action(addRowAbove, 'insert', 'Row')} disabled={!canInsertRowAbove}>\n Add row above\n </Menu.Item>\n <Menu.Item onClick={action(addRowBelow, 'insert', 'Row')}>Add row below</Menu.Item>\n <Menu.Item onClick={action(addColumnLeft, 'insert', 'Column')}>Add column left</Menu.Item>\n <Menu.Item onClick={action(addColumnRight, 'insert', 'Column')}>Add column right</Menu.Item>\n <Menu.Divider />\n <Menu.Item onClick={toggleHeader}>\n {isHeaderEnabled ? 'Disable table header' : 'Enable table header'}\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item onClick={action(deleteRow, 'remove', 'Row')}>Delete row</Menu.Item>\n <Menu.Item onClick={action(deleteColumn, 'remove', 'Column')}>Delete column</Menu.Item>\n <Menu.Item onClick={action(deleteTable, 'remove', 'Table')}>Delete table</Menu.Item>\n </Menu.List>\n </Menu>\n );\n};\n","import { SPEditor } from '@udecode/plate-core';\nimport { BLOCKS } from '@contentful/rich-text-types';\nimport { getAbove, setNodes, getChildren } from '@udecode/plate-common';\n\nexport const setHeader = (editor: SPEditor, enable?: boolean) => {\n const tableItem = getAbove(editor, {\n match: { type: BLOCKS.TABLE },\n });\n\n if (!tableItem) {\n return;\n }\n\n const firstRow = getChildren(tableItem)[0];\n\n if (!firstRow) {\n return;\n }\n\n getChildren(firstRow).forEach(([, path]) => {\n setNodes(\n editor,\n {\n type: enable ? BLOCKS.TABLE_HEADER_CELL : BLOCKS.TABLE_CELL,\n },\n { at: path }\n );\n });\n};\n","import { css } from 'emotion';\nimport * as React from 'react';\nimport * as Slate from 'slate-react';\nimport { SPEditor } from '@udecode/plate-core';\nimport tokens from '@contentful/f36-tokens';\nimport { TableIcon } from '@contentful/f36-icons';\nimport { ToolbarButton } from '../shared/ToolbarButton';\nimport { BLOCKS, CONTAINERS, TableCell, TableHeaderCell } from '@contentful/rich-text-types';\nimport {\n ELEMENT_TD,\n ELEMENT_TR,\n ELEMENT_TH,\n ELEMENT_TABLE,\n createTablePlugin as createTablePluginFromUdecode,\n getTableOnKeyDown,\n} from '@udecode/plate-table';\nimport { documentToPlainTextString } from '@contentful/rich-text-plain-text-renderer';\nimport { toContentfulDocument } from '@contentful/contentful-slatejs-adapter';\n\nimport schema from '../../constants/Schema';\nimport { TableActions } from './TableActions';\nimport { useContentfulEditor } from '../../ContentfulEditorProvider';\nimport { CustomElement, CustomSlatePluginOptions } from '../../types';\nimport { isTableActive, insertTableAndFocusFirstCell } from './helpers';\nimport { TrackingProvider, useTrackingContext } from '../../TrackingProvider';\nimport { Element, Node, Text, Transforms } from 'slate';\n\nconst styles = {\n [BLOCKS.TABLE]: css`\n margin-bottom: 1.5em;\n border-collapse: collapse;\n border-radius: 5px;\n border-style: hidden;\n box-shadow: 0 0 0 1px ${tokens.gray400};\n width: 100%;\n table-layout: fixed;\n overflow: hidden;\n `,\n [BLOCKS.TABLE_ROW]: css`\n border: 1px solid ${tokens.gray400};\n &:hover td {\n background-color: transparent !important;\n }\n `,\n [BLOCKS.TABLE_HEADER_CELL]: css`\n background-color: ${tokens.gray200};\n border: 1px solid ${tokens.gray400};\n padding: 10px 12px;\n font-weight: ${tokens.fontWeightMedium};\n text-align: left;\n min-width: 48px;\n position: relative;\n div:last-child {\n margin-bottom: 0;\n }\n `,\n [BLOCKS.TABLE_CELL]: css`\n border: 1px solid ${tokens.gray400};\n padding: 10px 12px;\n min-width: 48px;\n position: relative;\n div:last-child {\n margin-bottom: 0;\n }\n `,\n};\n\nconst slateNodeToText = (node: CustomElement): string => {\n const contentfulNode = toContentfulDocument({ document: [node], schema });\n return documentToPlainTextString(contentfulNode);\n};\n\nexport const Table = (props: Slate.RenderElementProps) => (\n <table {...props.attributes} className={styles[BLOCKS.TABLE]}>\n <tbody>{props.children}</tbody>\n </table>\n);\n\nexport const TR = (props: Slate.RenderElementProps) => (\n <tr {...props.attributes} className={styles[BLOCKS.TABLE_ROW]}>\n {props.children}\n </tr>\n);\n\nexport const TH = (props: Slate.RenderElementProps) => {\n const isSelected = Slate.useSelected();\n\n return (\n <th\n {...props.attributes}\n // may include `colspan` and/or `rowspan`\n {...(props.element.data as TableHeaderCell['data'])}\n className={styles[BLOCKS.TABLE_HEADER_CELL]}>\n {isSelected && <TableActions />}\n {props.children}\n </th>\n );\n};\nexport const TD = (props: Slate.RenderElementProps) => {\n const isSelected = Slate.useSelected();\n\n return (\n <td\n {...props.attributes}\n // may include `colspan` and/or `rowspan`\n {...(props.element.data as TableCell['data'])}\n className={styles[BLOCKS.TABLE_CELL]}>\n {isSelected && <TableActions />}\n {props.children}\n </td>\n );\n};\n\nexport const withTableOptions: CustomSlatePluginOptions = {\n [ELEMENT_TABLE]: {\n type: BLOCKS.TABLE,\n component: Table,\n },\n [ELEMENT_TR]: {\n type: BLOCKS.TABLE_ROW,\n component: TR,\n },\n [ELEMENT_TH]: {\n type: BLOCKS.TABLE_HEADER_CELL,\n component: TH,\n },\n [ELEMENT_TD]: {\n type: BLOCKS.TABLE_CELL,\n component: TD,\n },\n};\n\nfunction addTableTrackingEvents(editor: SPEditor, { onViewportAction }: TrackingProvider) {\n const { insertData } = editor;\n editor.insertData = (data: DataTransfer) => {\n const html = data.getData('text/html');\n\n if (html) {\n const { children: markupBefore } = editor;\n insertData(data);\n const { children: markupAfter } = editor;\n setTimeout(() => {\n if (hasTables(markupBefore)) return;\n if (hasTables(markupAfter)) {\n onViewportAction('paste', {\n tablePasted: true,\n hasHeadersOutsideFirstRow: hasHeadersOutsideFirstRow(markupAfter),\n });\n }\n }, 1);\n } else {\n insertData(data);\n }\n };\n}\n\nconst paragraph = () => ({ type: BLOCKS.PARAGRAPH, data: {}, children: [] });\n\nfunction addTableNormalization(editor) {\n const { normalizeNode } = editor;\n\n editor.normalizeNode = (entry) => {\n const [node, path] = entry;\n\n // TODO: This should be enforced by sanitizeSlateDoc() but the internal\n // editor value can be different.\n // cf. https://github.com/ianstormtaylor/slate/issues/2206\n const cellTypes: string[] = [BLOCKS.TABLE_CELL, BLOCKS.TABLE_HEADER_CELL];\n if (Element.isElement(node) && cellTypes.includes((node as CustomElement).type)) {\n for (const [child, childPath] of Node.children(editor, path)) {\n if (Text.isText(child)) {\n Transforms.wrapNodes(editor, paragraph(), { at: childPath });\n } else if (!CONTAINERS[node.type].includes(child.type)) {\n const paragraphWithTextFromNode = {\n ...paragraph(),\n children: [{ text: slateNodeToText(child) }],\n };\n Transforms.removeNodes(editor, { at: childPath });\n Transforms.insertNodes(editor, paragraphWithTextFromNode, { at: childPath });\n }\n }\n }\n\n normalizeNode(entry);\n };\n}\n\nfunction hasTables(nodes: CustomElement[]) {\n return nodes.some(({ type }) => {\n return type === BLOCKS.TABLE;\n });\n}\n\nconst isTableHeaderCell = ({ type }) => type === BLOCKS.TABLE_HEADER_CELL;\nfunction hasHeadersOutsideFirstRow(nodes: CustomElement[]) {\n return nodes\n .filter(({ type }) => type === BLOCKS.TABLE)\n .flatMap(({ children }) => children.slice(1) as CustomElement[])\n .some(({ children }) => (children as CustomElement[]).some(isTableHeaderCell));\n}\n\nfunction createWithTableEvents(tracking: TrackingProvider) {\n return function withTableEvents(editor: SPEditor) {\n addTableTrackingEvents(editor, tracking);\n addTableNormalization(editor);\n return getTableOnKeyDown()(editor);\n };\n}\n\nexport const createTablePlugin = (tracking: TrackingProvider) => ({\n ...createTablePluginFromUdecode(),\n onKeyDown: createWithTableEvents(tracking),\n withOverrides: (editor) => {\n const { insertFragment } = editor;\n\n editor.insertFragment = (fragments) => {\n // We need to make sure we have a new, empty and clean paragraph in order to paste tables as-is due to how Slate behaves\n // More info: https://github.com/ianstormtaylor/slate/pull/4489 and https://github.com/ianstormtaylor/slate/issues/4542\n const fragmentHasTable = fragments.some((fragment) => fragment.type === BLOCKS.TABLE);\n if (fragmentHasTable) {\n const emptyParagraph: CustomElement = {\n type: BLOCKS.PARAGRAPH,\n children: [{ text: '' }],\n data: {},\n isVoid: false,\n };\n Transforms.insertNodes(editor, emptyParagraph);\n }\n\n insertFragment(fragments);\n };\n\n return editor;\n },\n});\n\ninterface ToolbarTableButtonProps {\n isDisabled: boolean | undefined;\n}\n\nexport function ToolbarTableButton(props: ToolbarTableButtonProps) {\n const editor = useContentfulEditor();\n const { onViewportAction } = useTrackingContext();\n const isActive = editor && isTableActive(editor);\n\n async function handleClick(event: React.MouseEvent<HTMLButtonElement>) {\n event.preventDefault();\n\n if (!editor) return;\n\n onViewportAction('insertTable');\n insertTableAndFocusFirstCell(editor);\n Slate.ReactEditor.focus(editor);\n }\n\n if (!editor) return null;\n\n return (\n <ToolbarButton\n title=\"Table\"\n testId=\"table-toolbar-button\"\n onClick={handleClick}\n // TODO: active state looks off since the button will be disabled. Do we still need it?\n isActive={isActive}\n isDisabled={props.isDisabled}>\n <TableIcon />\n </ToolbarButton>\n );\n}\n","import * as React from 'react';\nimport { Button, Menu } from '@contentful/f36-components';\n\nimport { PlusIcon, ChevronDownIcon } from '@contentful/f36-icons';\n\ninterface EmbeddedEntityDropdownButtonProps {\n children: React.ReactNode;\n isDisabled: boolean | undefined;\n isOpen: boolean;\n onClose: () => void;\n onToggle: () => void;\n}\n\nexport function EmbeddedEntityDropdownButton({\n children,\n isDisabled,\n isOpen,\n onClose,\n onToggle,\n}: EmbeddedEntityDropdownButtonProps) {\n return (\n <Menu placement=\"bottom-end\" isOpen={isOpen} onClose={onClose} onOpen={onToggle}>\n <Menu.Trigger>\n <Button\n endIcon={<ChevronDownIcon />}\n testId=\"toolbar-entity-dropdown-toggle\"\n variant=\"secondary\"\n size=\"small\"\n startIcon={<PlusIcon />}\n isDisabled={isDisabled}>\n Embed\n </Button>\n </Menu.Trigger>\n <Menu.List className=\"toolbar-entity-dropdown-list\">{children}</Menu.List>\n </Menu>\n );\n}\n","import React from 'react';\nimport { css } from 'emotion';\nimport { FetchingWrappedEntryCard } from '../shared/FetchingWrappedEntryCard';\nimport { FetchingWrappedAssetCard } from '../shared/FetchingWrappedAssetCard';\nimport { useSdkContext } from '../../SdkProvider';\nimport { CustomRenderElementProps } from '../../types';\nimport { ReactEditor, useSelected, useReadOnly } from 'slate-react';\nimport { Transforms } from 'slate';\nimport { useContentfulEditor } from '../../ContentfulEditorProvider';\n\nconst styles = {\n root: css({\n marginBottom: '1.25rem',\n }),\n};\n\ntype LinkedEntityBlockProps = CustomRenderElementProps<{\n target: {\n sys: {\n id: string;\n linkType: 'Entry' | 'Asset';\n type: 'Link';\n };\n };\n}>;\n\nexport function LinkedEntityBlock(props: LinkedEntityBlockProps) {\n const { attributes, children, element } = props;\n const isSelected = useSelected();\n const editor = useContentfulEditor();\n const sdk = useSdkContext();\n const isDisabled = useReadOnly();\n const { id: entityId, linkType: entityType } = element.data.target.sys;\n\n const handleEditClick = () => {\n const openEntity = entityType === 'Asset' ? sdk.navigator.openAsset : sdk.navigator.openEntry;\n return openEntity(entityId, { slideIn: true });\n };\n\n const handleRemoveClick = () => {\n if (!editor) return;\n const pathToElement = ReactEditor.findPath(editor, element);\n Transforms.removeNodes(editor, { at: pathToElement });\n };\n\n return (\n <div\n {...attributes}\n className={styles.root}\n data-entity-type={entityType}\n data-entity-id={entityId}>\n <div contentEditable={false}>\n {entityType === 'Entry' && (\n <FetchingWrappedEntryCard\n sdk={sdk}\n entryId={entityId}\n locale={sdk.field.locale}\n isDisabled={isDisabled}\n isSelected={isSelected}\n onRemove={handleRemoveClick}\n onEdit={handleEditClick}\n />\n )}\n {entityType === 'Asset' && (\n <FetchingWrappedAssetCard\n sdk={sdk}\n assetId={entityId}\n locale={sdk.field.locale}\n isDisabled={isDisabled}\n isSelected={isSelected}\n onRemove={handleRemoveClick}\n onEdit={handleEditClick}\n />\n )}\n </div>\n {children}\n </div>\n );\n}\n","import getLinkedContentTypeIdsForNodeType from './getLinkedContentTypeIdsForNodeType';\n\n/**\n * Returns a config for the entity selector based on a given rich text field and a\n * rich text node type that the entity should be picked for. Takes the field\n * validations for the given node type into account.\n *\n * @param {object} field\n * @param {string} nodeType\n * @returns {object}\n */\nexport default function newEntitySelectorConfigFromRichTextField(field, nodeType) {\n return {\n entityType: getEntityTypeFromRichTextNode(nodeType),\n locale: field.locale || null, // Will fall back to default locale.\n contentTypes: getLinkedContentTypeIdsForNodeType(field, nodeType),\n };\n}\n\nfunction getEntityTypeFromRichTextNode(nodeType): 'Entry' | 'Asset' | never {\n const words = nodeType.split('-');\n if (words.indexOf('entry') !== -1) {\n return 'Entry';\n }\n if (words.indexOf('asset') !== -1) {\n return 'Asset';\n }\n throw new Error(`RichText node type \\`${nodeType}\\` has no associated \\`entityType\\``);\n}\n","import { getText } from '@udecode/plate-common';\nimport { Transforms } from 'slate';\nimport * as Slate from 'slate-react';\nimport newEntitySelectorConfigFromRichTextField from '../../helpers/newEntitySelectorConfigFromRichTextField';\n\nexport async function selectEntityAndInsert(nodeType, sdk, editor, logAction) {\n logAction('openCreateEmbedDialog', { nodeType });\n\n const { field, dialogs } = sdk;\n const baseConfig = newEntitySelectorConfigFromRichTextField(field, nodeType);\n const selectEntity =\n baseConfig.entityType === 'Asset' ? dialogs.selectSingleAsset : dialogs.selectSingleEntry;\n const config = { ...baseConfig, withCreate: true };\n try {\n const { selection } = editor;\n const entity = await selectEntity(config);\n if (!entity) {\n return;\n }\n Transforms.select(editor, selection);\n insertBlock(editor, nodeType, entity);\n logAction('insert', { nodeType });\n } catch (error) {\n if (error) {\n throw error;\n } else {\n logAction('cancelCreateEmbedDialog', { nodeType });\n }\n }\n}\n\nconst createNode = (nodeType, entity) => ({\n type: nodeType,\n data: {\n target: {\n sys: {\n id: entity.sys.id,\n type: 'Link',\n linkType: entity.sys.type,\n },\n },\n },\n children: [{ text: '' }],\n isVoid: true,\n});\n\n// TODO: DRY up copied code from HR\nexport function insertBlock(editor, nodeType, entity) {\n if (!editor?.selection) return;\n\n const linkedEntityBlock = createNode(nodeType, entity);\n\n const hasText = editor.selection && !!getText(editor, editor.selection.focus.path);\n\n if (hasText) {\n Transforms.insertNodes(editor, linkedEntityBlock);\n } else {\n Transforms.setNodes(editor, linkedEntityBlock);\n }\n\n Slate.ReactEditor.focus(editor);\n}\n","import React from 'react';\nimport { Flex, Icon, Button, Menu } from '@contentful/f36-components';\n\nimport { AssetIcon, EmbeddedEntryBlockIcon } from '@contentful/f36-icons';\nimport { selectEntityAndInsert } from './Util';\nimport noop from 'lodash/noop';\nimport { FieldExtensionSDK } from '@contentful/app-sdk';\nimport { useSdkContext } from '../../SdkProvider';\nimport { css } from 'emotion';\nimport { useContentfulEditor } from '../../ContentfulEditorProvider';\n\nexport const styles = {\n icon: css({\n marginRight: '10px',\n }),\n};\n\ninterface EmbeddedEntityBlockToolbarIconProps {\n isButton?: boolean;\n isDisabled: boolean;\n logAction?: () => void;\n nodeType: string;\n onClose: () => void;\n}\n\nexport function EmbeddedEntityBlockToolbarIcon({\n isButton,\n isDisabled,\n logAction,\n nodeType,\n onClose,\n}: EmbeddedEntityBlockToolbarIconProps) {\n const editor = useContentfulEditor();\n const sdk: FieldExtensionSDK = useSdkContext();\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n\n onClose();\n selectEntityAndInsert(nodeType, sdk, editor, logAction || noop);\n };\n\n const type = getEntityTypeFromNodeType(nodeType);\n const baseClass = `rich-text__${nodeType}`;\n return isButton ? (\n <Button\n isDisabled={isDisabled}\n className={`${baseClass}-button`}\n size=\"small\"\n onClick={handleClick}\n startIcon={type === 'Asset' ? <AssetIcon /> : <EmbeddedEntryBlockIcon />}\n variant=\"secondary\"\n testId={`toolbar-toggle-${nodeType}`}>\n {`Embed ${type.toLowerCase()}`}\n </Button>\n ) : (\n <Menu.Item\n disabled={isDisabled}\n className={`${baseClass}-list-item`}\n onClick={handleClick}\n testId={`toolbar-toggle-${nodeType}`}>\n <Flex alignItems=\"center\" flexDirection=\"row\">\n <Icon\n as={type === 'Asset' ? AssetIcon : EmbeddedEntryBlockIcon}\n className={`rich-text__embedded-entry-list-icon ${styles.icon}`}\n variant=\"secondary\"\n />\n <span>{type}</span>\n </Flex>\n </Menu.Item>\n );\n}\n\nfunction getEntityTypeFromNodeType(nodeType: string): string | never {\n const words = nodeType.toLowerCase().split('-');\n if (words.includes('entry')) {\n return 'Entry';\n }\n if (words.includes('asset')) {\n return 'Asset';\n }\n throw new Error(`Node type \\`${nodeType}\\` has no associated \\`entityType\\``);\n}\n","import { KeyboardEvent } from 'react';\nimport { BLOCKS } from '@contentful/rich-text-types';\nimport {\n getRenderElement,\n getPlatePluginTypes,\n PlatePlugin,\n getPlatePluginOptions,\n SPEditor,\n} from '@udecode/plate-core';\nimport { Transforms } from 'slate';\nimport { getNodeEntryFromSelection, moveToTheNextLine } from '../../helpers/editor';\nimport { CustomSlatePluginOptions } from 'types';\nimport { LinkedEntityBlock } from './LinkedEntityBlock';\nimport { selectEntityAndInsert } from './Util';\nimport { FieldExtensionSDK } from '@contentful/app-sdk';\nimport noop from 'lodash/noop';\n\nexport { EmbeddedEntityBlockToolbarIcon as ToolbarIcon } from './ToolbarIcon';\n\nconst createEmbeddedEntityPlugin =\n (nodeType: BLOCKS.EMBEDDED_ENTRY | BLOCKS.EMBEDDED_ASSET) =>\n (sdk: FieldExtensionSDK): PlatePlugin => ({\n renderElement: getRenderElement(nodeType),\n pluginKeys: nodeType,\n onKeyDown: getWithEmbeddedEntityEvents(nodeType, sdk),\n voidTypes: getPlatePluginTypes(nodeType),\n deserialize: (editor) => {\n const options = getPlatePluginOptions(editor, nodeType);\n const entityTypes = {\n [BLOCKS.EMBEDDED_ENTRY]: 'Entry',\n [BLOCKS.EMBEDDED_ASSET]: 'Asset',\n };\n\n return {\n element: [\n {\n type: nodeType,\n deserialize: (element) => {\n const entityType = element.getAttribute('data-entity-type');\n const embeddedEntityId = element.getAttribute('data-entity-id');\n const isBlock = entityType === entityTypes[nodeType];\n\n if (!isBlock) return;\n\n return {\n type: nodeType,\n isVoid: true,\n data: {\n target: {\n sys: {\n id: embeddedEntityId,\n linkType: entityType,\n type: 'Link',\n },\n },\n },\n };\n },\n ...options.deserialize,\n },\n ],\n };\n },\n });\n\nexport const createEmbeddedEntryBlockPlugin = createEmbeddedEntityPlugin(BLOCKS.EMBEDDED_ENTRY);\nexport const createEmbeddedAssetBlockPlugin = createEmbeddedEntityPlugin(BLOCKS.EMBEDDED_ASSET);\n\nexport const withEmbeddedEntryBlockOptions: CustomSlatePluginOptions = {\n [BLOCKS.EMBEDDED_ENTRY]: {\n type: BLOCKS.EMBEDDED_ENTRY,\n component: LinkedEntityBlock,\n },\n};\nexport const withEmbeddedAssetBlockOptions: CustomSlatePluginOptions = {\n [BLOCKS.EMBEDDED_ASSET]: {\n type: BLOCKS.EMBEDDED_ASSET,\n component: LinkedEntityBlock,\n },\n};\n\ntype A = 65;\ntype E = 69;\ntype AEvent = KeyboardEvent & { keyCode: A };\ntype EEvent = KeyboardEvent & { keyCode: E };\ntype ShiftEvent = KeyboardEvent & { shiftKey: true };\ntype CtrlEvent = KeyboardEvent & { ctrlKey: true };\ntype MetaEvent = KeyboardEvent & { metaKey: true };\ntype ModEvent = CtrlEvent | MetaEvent;\ntype EmbeddedAssetEvent = ModEvent & ShiftEvent & AEvent;\ntype EmbeddedEntryEvent = ModEvent & ShiftEvent & EEvent;\n\nconst isA = (event: KeyboardEvent): event is AEvent => event.keyCode === 65;\nconst isE = (event: KeyboardEvent): event is EEvent => event.keyCode === 69;\nconst isMod = (event: KeyboardEvent): event is ModEvent => event.ctrlKey || event.metaKey;\nconst isShift = (event: KeyboardEvent): event is ShiftEvent => event.shiftKey;\nconst wasEmbeddedAssetEventTriggered = (event: KeyboardEvent): event is EmbeddedAssetEvent =>\n isMod(event) && isShift(event) && isA(event);\nconst wasEmbeddedEntryEventTriggered = (event: KeyboardEvent): event is EmbeddedEntryEvent =>\n isMod(event) && isShift(event) && isE(event);\n\nexport function getWithEmbeddedEntityEvents(\n nodeType: BLOCKS.EMBEDDED_ENTRY | BLOCKS.EMBEDDED_ASSET,\n sdk: FieldExtensionSDK\n) {\n return function withEmbeddedEntityEvents(editor: SPEditor) {\n // TODO: Dry up copied code from HR\n return function handleEvent(event: KeyboardEvent) {\n if (!editor) return;\n\n const isEnter = event.keyCode === 13;\n const [, pathToSelectedElement] = getNodeEntryFromSelection(editor, nodeType);\n\n if (pathToSelectedElement) {\n if (isEnter) {\n event.preventDefault();\n moveToTheNextLine(editor);\n } else if (event.key === 'Backspace') {\n event.preventDefault();\n Transforms.removeNodes(editor, { at: pathToSelectedElement });\n }\n } else if (\n (nodeType === BLOCKS.EMBEDDED_ENTRY && wasEmbeddedEntryEventTriggered(event)) ||\n (nodeType === BLOCKS.EMBEDDED_ASSET && wasEmbeddedAssetEventTriggered(event))\n ) {\n selectEntityAndInsert(nodeType, sdk, editor, noop);\n }\n };\n };\n}\n","import React from 'react';\nimport { css } from 'emotion';\nimport tokens from '@contentful/f36-tokens';\nimport { InlineEntryCard, MenuItem } from '@contentful/f36-components';\nimport { ClockIcon } from '@contentful/f36-icons';\nimport { entityHelpers, FieldExtensionSDK } from '@contentful/field-editor-shared';\nimport { useEntities, ScheduledIconWithTooltip } from '@contentful/field-editor-reference';\nimport { INLINES } from '@contentful/rich-text-types';\n\nconst { getEntryTitle, getEntryStatus } = entityHelpers;\n\nconst styles = {\n scheduledIcon: css({\n verticalAlign: 'text-bottom',\n marginRight: tokens.spacing2Xs,\n }),\n};\n\ninterface FetchingWrappedInlineEntryCardProps {\n entryId: string;\n sdk: FieldExtensionSDK;\n isSelected: boolean;\n isDisabled: boolean;\n onEdit: (event: React.MouseEvent<Element, MouseEvent>) => void;\n onRemove: (event: React.MouseEvent<Element, MouseEvent>) => void;\n}\n\nexport function FetchingWrappedInlineEntryCard(props: FetchingWrappedInlineEntryCardProps) {\n const { getOrLoadEntry, loadEntityScheduledActions, entries } = useEntities();\n const entry = React.useMemo(() => entries[props.entryId], [entries, props.entryId]);\n\n const allContentTypes = props.sdk.space.getCachedContentTypes();\n const contentType = React.useMemo(() => {\n if (!entry || entry === 'failed' || !allContentTypes) return undefined;\n\n return allContentTypes.find(\n (contentType) => contentType.sys.id === entry.sys.contentType.sys.id\n );\n }, [allContentTypes, entry]);\n\n const contentTypeName = contentType ? contentType.name : '';\n\n const title = React.useMemo(\n () =>\n getEntryTitle({\n entry,\n contentType,\n localeCode: props.sdk.field.locale,\n defaultLocaleCode: props.sdk.locales.default,\n defaultTitle: 'Untitled',\n }),\n [entry, contentType, props.sdk.field.locale, props.sdk.locales.default]\n );\n\n React.useEffect(() => {\n if (!props.entryId) return;\n getOrLoadEntry(props.entryId);\n // We don't include getOrLoadEntry below because it's part of the constate-derived\n // useEntities(), not props.\n // eslint-disable-next-line\n }, [props.entryId]);\n\n if (entry === 'failed') {\n return (\n <InlineEntryCard\n title=\"Entry missing or inaccessible\"\n testId={INLINES.EMBEDDED_ENTRY}\n isSelected={props.isSelected}\n />\n );\n }\n\n if (entry === undefined) {\n return <InlineEntryCard isLoading />;\n }\n\n const status = getEntryStatus(entry.sys);\n if (status === 'deleted') {\n return (\n <InlineEntryCard\n title=\"Entry missing or inaccessible\"\n testId={INLINES.EMBEDDED_ENTRY}\n isSelected={props.isSelected}\n actions={[\n <MenuItem key=\"remove\" onClick={props.onRemove} testId=\"card-action-remove\">\n Remove\n </MenuItem>,\n ]}\n />\n );\n }\n\n return (\n <InlineEntryCard\n testId={INLINES.EMBEDDED_ENTRY}\n isSelected={props.isSelected}\n title={\n (\n <>\n <span>\n {contentTypeName} {title}\n </span>\n <ScheduledIconWithTooltip\n getEntityScheduledActions={loadEntityScheduledActions}\n entityType=\"Entry\"\n entityId={entry.sys.id}>\n <ClockIcon className={styles.scheduledIcon} variant=\"muted\" testId=\"scheduled-icon\" />\n </ScheduledIconWithTooltip>\n </>\n ) as any\n }\n status={status}\n actions={[\n <MenuItem key=\"edit\" onClick={props.onEdit}>\n Edit\n </MenuItem>,\n <MenuItem\n key=\"edit\"\n onClick={props.onRemove}\n disabled={props.isDisabled}\n testId=\"card-action-remove\">\n Remove\n </MenuItem>,\n ]}\n />\n );\n}\n","import { INLINES } from '@contentful/rich-text-types';\n\nexport function createInlineEntryNode(id: string) {\n return {\n type: INLINES.EMBEDDED_ENTRY,\n children: [{ text: '' }],\n data: {\n target: {\n sys: {\n id,\n type: 'Link',\n linkType: 'Entry',\n },\n },\n },\n };\n}\n","import * as React from 'react';\nimport {\n PlatePlugin,\n getRenderElement,\n getPlatePluginTypes,\n getPlatePluginOptions,\n} from '@udecode/plate-core';\nimport { Transforms } from 'slate';\nimport { INLINES } from '@contentful/rich-text-types';\nimport { useSelected, ReactEditor, useReadOnly } from 'slate-react';\nimport { Button, Menu, Flex } from '@contentful/f36-components';\nimport { EmbeddedEntryInlineIcon } from '@contentful/f36-icons';\nimport { css } from 'emotion';\nimport { Link, FieldExtensionSDK } from '@contentful/app-sdk';\nimport { Entry } from '@contentful/field-editor-shared';\nimport { CustomSlatePluginOptions, CustomRenderElementProps } from '../../types';\nimport newEntitySelectorConfigFromRichTextField from '../../helpers/newEntitySelectorConfigFromRichTextField';\nimport { useSdkContext } from '../../SdkProvider';\nimport { FetchingWrappedInlineEntryCard } from './FetchingWrappedInlineEntryCard';\nimport { createInlineEntryNode } from './Util';\nimport { useContentfulEditor } from '../../ContentfulEditorProvider';\n\nconst styles = {\n icon: css({\n marginRight: '10px',\n }),\n\n root: css({\n margin: '0 1px',\n fontSize: 'inherit',\n span: {\n webkitUserSelect: 'none',\n mozUserSelect: 'none',\n msUserSelect: 'none',\n userSelect: 'none',\n },\n }),\n};\n\ntype EmbeddedEntityInlineProps = CustomRenderElementProps<{\n target: Link;\n}>;\n\nfunction EmbeddedEntityInline(props: EmbeddedEntityInlineProps) {\n const editor = useContentfulEditor();\n const sdk = useSdkContext();\n const isSelected = useSelected();\n const { id: entryId } = props.element.data.target.sys;\n const isDisabled = useReadOnly();\n\n function handleEditClick() {\n return sdk.navigator.openEntry(entryId, { slideIn: true });\n }\n\n function handleRemoveClick() {\n if (!editor) return;\n const pathToElement = ReactEditor.findPath(editor, props.element);\n Transforms.removeNodes(editor, { at: pathToElement });\n }\n\n return (\n <span {...props.attributes} className={styles.root} data-embedded-entity-inline-id={entryId}>\n <span contentEditable={false}>\n <FetchingWrappedInlineEntryCard\n sdk={sdk}\n entryId={entryId}\n isSelected={isSelected}\n isDisabled={isDisabled}\n onRemove={handleRemoveClick}\n onEdit={handleEditClick}\n />\n </span>\n {props.children}\n </span>\n );\n}\n\ninterface ToolbarEmbeddedEntityInlineButtonProps {\n onClose: () => void;\n isDisabled: boolean;\n isButton?: boolean;\n}\n\nasync function selectEntityAndInsert(editor, sdk: FieldExtensionSDK) {\n const config = {\n ...newEntitySelectorConfigFromRichTextField(sdk.field, INLINES.EMBEDDED_ENTRY),\n withCreate: true,\n };\n const selection = editor.selection;\n\n const entry = await sdk.dialogs.selectSingleEntry<Entry>(config);\n ReactEditor.focus(editor); // Dialog steals focus from editor, return it.\n if (!entry) return;\n\n const inlineEntryNode = createInlineEntryNode(entry.sys.id);\n\n // Got to wait until focus is really back on the editor or setSelection() won't work.\n setTimeout(() => {\n Transforms.setSelection(editor, selection);\n Transforms.insertNodes(editor, inlineEntryNode);\n }, 0);\n}\n\nexport function ToolbarEmbeddedEntityInlineButton(props: ToolbarEmbeddedEntityInlineButtonProps) {\n const editor = useContentfulEditor();\n const sdk: FieldExtensionSDK = useSdkContext();\n\n async function handleClick(event) {\n event.preventDefault();\n\n if (!editor) return;\n\n props.onClose();\n\n await selectEntityAndInsert(editor, sdk);\n }\n\n return props.isButton ? (\n <Button\n isDisabled={props.isDisabled}\n className={`${INLINES.EMBEDDED_ENTRY}-button`}\n size=\"small\"\n onClick={handleClick}\n startIcon={<EmbeddedEntryInlineIcon />}\n variant=\"secondary\"\n testId={`toolbar-toggle-${INLINES.EMBEDDED_ENTRY}`}>\n Embed inline entry\n </Button>\n ) : (\n <Menu.Item\n disabled={props.isDisabled}\n className=\"rich-text__entry-link-block-button\"\n testId={`toolbar-toggle-${INLINES.EMBEDDED_ENTRY}`}\n onClick={handleClick}>\n <Flex alignItems=\"center\" flexDirection=\"row\">\n <EmbeddedEntryInlineIcon\n variant=\"secondary\"\n className={`rich-text__embedded-entry-list-icon ${styles.icon}`}\n />\n <span>Inline entry</span>\n </Flex>\n </Menu.Item>\n );\n}\n\nexport function createEmbeddedEntityInlinePlugin(sdk): PlatePlugin {\n return {\n renderElement: getRenderElement(INLINES.EMBEDDED_ENTRY),\n pluginKeys: INLINES.EMBEDDED_ENTRY,\n inlineTypes: getPlatePluginTypes(INLINES.EMBEDDED_ENTRY),\n onKeyDown: getWithEmbeddedEntryInlineEvents(sdk),\n deserialize: (editor) => {\n const options = getPlatePluginOptions(editor, INLINES.EMBEDDED_ENTRY);\n\n return {\n element: [\n {\n type: INLINES.EMBEDDED_ENTRY,\n deserialize: (element) => {\n const entryId = element.getAttribute('data-embedded-entity-inline-id');\n return entryId ? createInlineEntryNode(entryId) : undefined;\n },\n ...options.deserialize,\n },\n ],\n };\n },\n };\n}\n\nexport const withEmbeddedEntityInlineOptions: CustomSlatePluginOptions = {\n [INLINES.EMBEDDED_ENTRY]: {\n type: INLINES.EMBEDDED_ENTRY,\n component: EmbeddedEntityInline,\n },\n};\n\n// TODO: DRY up types from embedded entry block and elsewhere\ntype TWO = 50;\ntype TwoEvent = React.KeyboardEvent & { keyCode: TWO };\ntype ShiftEvent = React.KeyboardEvent & { shiftKey: true };\ntype CtrlEvent = React.KeyboardEvent & { ctrlKey: true };\ntype MetaEvent = React.KeyboardEvent & { metaKey: true };\ntype ModEvent = CtrlEvent | MetaEvent;\ntype EmbeddedEntryInlineEvent = ModEvent & ShiftEvent & TwoEvent;\n\nconst isTwo = (event: React.KeyboardEvent): event is TwoEvent => event.keyCode === 50;\nconst isMod = (event: React.KeyboardEvent): event is ModEvent => event.ctrlKey || event.metaKey;\nconst isShift = (event: React.KeyboardEvent): event is ShiftEvent => event.shiftKey;\nconst wasEmbeddedEntryInlineEventTriggered = (\n event: React.KeyboardEvent\n): event is EmbeddedEntryInlineEvent => isMod(event) && isShift(event) && isTwo(event);\n\nfunction getWithEmbeddedEntryInlineEvents(sdk) {\n return function withEmbeddedEntryInlineEvents(editor) {\n return function handleEvent(event) {\n if (!editor) return;\n\n if (wasEmbeddedEntryInlineEventTriggered(event)) {\n selectEntityAndInsert(editor, sdk);\n }\n };\n };\n}\n","import React, { useState } from 'react';\n\nimport { EmbeddedEntityDropdownButton } from '../plugins/EmbeddedEntity';\nimport { ToolbarIcon as EmbeddedEntityBlockToolbarIcon } from '../plugins/EmbeddedEntityBlock';\nimport { BLOCKS, INLINES } from '@contentful/rich-text-types';\nimport { isNodeTypeEnabled } from '../helpers/validations';\nimport { ToolbarEmbeddedEntityInlineButton } from '../plugins/EmbeddedEntityInline';\nimport { useSdkContext } from '../SdkProvider';\n\nexport interface EmbedEntityWidgetProps {\n isDisabled?: boolean;\n canInsertBlocks?: boolean;\n}\n\nexport const EmbedEntityWidget = ({ isDisabled, canInsertBlocks }: EmbedEntityWidgetProps) => {\n const sdk = useSdkContext();\n const [isEmbedDropdownOpen, setEmbedDropdownOpen] = useState(false);\n const onCloseEntityDropdown = () => setEmbedDropdownOpen(false);\n const onToggleEntityDropdown = () => setEmbedDropdownOpen(!isEmbedDropdownOpen);\n\n const [canAccessAssets, setCanAccessAssets] = useState(false);\n React.useEffect(() => {\n sdk.access.can('read', 'Asset').then(setCanAccessAssets);\n }, [sdk]);\n\n const inlineEntryEmbedEnabled = isNodeTypeEnabled(sdk.field, INLINES.EMBEDDED_ENTRY);\n const blockEntryEmbedEnabled =\n isNodeTypeEnabled(sdk.field, BLOCKS.EMBEDDED_ENTRY) && canInsertBlocks;\n const blockAssetEmbedEnabled =\n canAccessAssets && isNodeTypeEnabled(sdk.field, BLOCKS.EMBEDDED_ASSET) && canInsertBlocks;\n\n const numEnabledEmbeds = [\n inlineEntryEmbedEnabled,\n blockEntryEmbedEnabled,\n blockAssetEmbedEnabled,\n ].filter(Boolean).length;\n\n const shouldDisplayDropdown = numEnabledEmbeds > 1;\n\n // Avoids UI glitching when switching back and forth between\n // different layouts\n React.useEffect(() => {\n if (!shouldDisplayDropdown) {\n setEmbedDropdownOpen(false);\n }\n }, [shouldDisplayDropdown]);\n\n const actions = (\n <>\n {blockEntryEmbedEnabled && (\n <EmbeddedEntityBlockToolbarIcon\n isDisabled={!!isDisabled}\n nodeType={BLOCKS.EMBEDDED_ENTRY}\n onClose={onCloseEntityDropdown}\n isButton={!shouldDisplayDropdown}\n />\n )}\n {inlineEntryEmbedEnabled && (\n <ToolbarEmbeddedEntityInlineButton\n isDisabled={!!isDisabled}\n onClose={onCloseEntityDropdown}\n isButton={!shouldDisplayDropdown}\n />\n )}\n {blockAssetEmbedEnabled && (\n <EmbeddedEntityBlockToolbarIcon\n isDisabled={!!isDisabled}\n nodeType={BLOCKS.EMBEDDED_ASSET}\n onClose={onCloseEntityDropdown}\n isButton={!shouldDisplayDropdown}\n />\n )}\n </>\n );\n\n if (!shouldDisplayDropdown) {\n return actions;\n }\n\n return (\n <EmbeddedEntityDropdownButton\n isDisabled={isDisabled}\n onClose={onCloseEntityDropdown}\n onToggle={onToggleEntityDropdown}\n isOpen={isEmbedDropdownOpen}>\n {actions}\n </EmbeddedEntityDropdownButton>\n );\n};\n","import React, { Fragment } from 'react';\nimport tokens from '@contentful/f36-tokens';\nimport { css } from 'emotion';\nimport { Flex } from '@contentful/f36-components';\nimport { ToolbarHrButton } from '../plugins/Hr';\nimport { ToolbarHeadingButton } from '../plugins/Heading';\nimport { ToolbarQuoteButton } from '../plugins/Quote';\nimport { ToolbarListButton } from '../plugins/List';\nimport { ToolbarBoldButton } from '../plugins/Bold';\nimport { ToolbarCodeButton } from '../plugins/Code';\nimport { ToolbarItalicButton } from '../plugins/Italic';\nimport { ToolbarUnderlineButton } from '../plugins/Underline';\nimport { ToolbarHyperlinkButton } from '../plugins/Hyperlink';\nimport { ToolbarTableButton } from '../plugins/Table';\nimport { BLOCKS, INLINES, MARKS } from '@contentful/rich-text-types';\nimport { isNodeTypeSelected } from '../helpers/editor';\nimport { isNodeTypeEnabled, isMarkEnabled } from '../helpers/validations';\nimport { useSdkContext } from '../SdkProvider';\nimport { FieldExtensionSDK } from '@contentful/app-sdk';\nimport { EmbedEntityWidget } from './EmbedEntityWidget';\nimport { useContentfulEditor } from '../ContentfulEditorProvider';\n\ntype ToolbarProps = {\n isDisabled?: boolean;\n};\n\nconst styles = {\n toolbar: css({\n border: `1px solid ${tokens.gray400}`,\n backgroundColor: tokens.gray100,\n padding: tokens.spacingXs,\n borderRadius: `${tokens.borderRadiusMedium} ${tokens.borderRadiusMedium} 0 0`,\n }),\n divider: css({\n display: 'inline-block',\n height: '21px',\n width: '1px',\n background: tokens.gray300,\n margin: `0 ${tokens.spacing2Xs}`,\n }),\n embedActionsWrapper: css({\n display: ['-webkit-box', '-ms-flexbox', 'flex'],\n webkitAlignSelf: 'flex-start',\n alignSelf: 'flex-start',\n msFlexItemAlign: 'start',\n marginLeft: 'auto',\n }),\n formattingOptionsWrapper: css({\n display: ['-webkit-box', '-ms-flexbox', 'flex'],\n msFlexAlign: 'center',\n webkitBoxAlign: 'center',\n alignItems: 'center',\n msFlexWrap: 'wrap',\n flexWrap: 'wrap',\n marginRight: '20px',\n }),\n};\n\nconst Toolbar = ({ isDisabled }: ToolbarProps) => {\n const sdk = useSdkContext();\n const editor = useContentfulEditor();\n const canInsertBlocks = !isNodeTypeSelected(editor, BLOCKS.TABLE);\n const validationInfo = React.useMemo(() => getValidationInfo(sdk.field), [sdk.field]);\n\n return (\n <Flex testId=\"toolbar\" className={styles.toolbar} alignItems=\"center\">\n <div className={styles.formattingOptionsWrapper}>\n <ToolbarHeadingButton isDisabled={isDisabled || !canInsertBlocks} />\n\n {validationInfo.isAnyMarkEnabled && <span className={styles.divider} />}\n\n {isMarkEnabled(sdk.field, MARKS.BOLD) && <ToolbarBoldButton isDisabled={isDisabled} />}\n {isMarkEnabled(sdk.field, MARKS.ITALIC) && <ToolbarItalicButton isDisabled={isDisabled} />}\n {isMarkEnabled(sdk.field, MARKS.UNDERLINE) && (\n <ToolbarUnderlineButton isDisabled={isDisabled} />\n )}\n {isMarkEnabled(sdk.field, MARKS.CODE) && <ToolbarCodeButton isDisabled={isDisabled} />}\n\n {validationInfo.isAnyHyperlinkEnabled && (\n <Fragment>\n <span className={styles.divider} />\n <ToolbarHyperlinkButton isDisabled={isDisabled} />\n </Fragment>\n )}\n\n {validationInfo.isAnyBlockFormattingEnabled && <span className={styles.divider} />}\n\n {isNodeTypeEnabled(sdk.field, BLOCKS.QUOTE) && (\n <ToolbarQuoteButton isDisabled={isDisabled || !canInsertBlocks} />\n )}\n <ToolbarListButton isDisabled={isDisabled || !canInsertBlocks} />\n {isNodeTypeEnabled(sdk.field, BLOCKS.HR) && (\n <ToolbarHrButton isDisabled={isDisabled || !canInsertBlocks} />\n )}\n {isNodeTypeEnabled(sdk.field, BLOCKS.TABLE) && (\n <ToolbarTableButton isDisabled={isDisabled || !canInsertBlocks} />\n )}\n </div>\n <div className={styles.embedActionsWrapper}>\n <EmbedEntityWidget isDisabled={isDisabled} canInsertBlocks={canInsertBlocks} />\n </div>\n </Flex>\n );\n};\n\nfunction getValidationInfo(field: FieldExtensionSDK['field']): {\n isAnyMarkEnabled: boolean;\n isAnyHyperlinkEnabled: boolean;\n isAnyBlockFormattingEnabled: boolean;\n} {\n const someWithValidation = (vals, validation) => vals.some((val) => validation(field, val));\n\n const isAnyMarkEnabled = someWithValidation(Object.values(MARKS), isMarkEnabled);\n\n const isAnyHyperlinkEnabled = someWithValidation(\n [INLINES.HYPERLINK, INLINES.ASSET_HYPERLINK, INLINES.ENTRY_HYPERLINK],\n isNodeTypeEnabled\n );\n\n const isAnyBlockFormattingEnabled = someWithValidation(\n [BLOCKS.UL_LIST, BLOCKS.OL_LIST, BLOCKS.QUOTE, BLOCKS.HR],\n isNodeTypeEnabled\n );\n\n return {\n isAnyMarkEnabled,\n isAnyHyperlinkEnabled,\n isAnyBlockFormattingEnabled,\n };\n}\n\nexport default Toolbar;\n","import React, { ReactNode } from 'react';\nimport { css } from 'emotion';\n\nconst styles = {\n nativeSticky: css`\n position: -webkit-sticky;\n position: sticky;\n top: -1px;\n z-index: 2;\n `,\n};\n\ntype StickyToolbarProps = {\n isDisabled?: boolean;\n children: ReactNode;\n};\n\nconst StickyToolbarWrapper = ({ isDisabled, children }: StickyToolbarProps) => (\n <div className={isDisabled ? '' : styles.nativeSticky}>{children}</div>\n);\n\nexport default StickyToolbarWrapper;\n","import { SPEditor } from '@udecode/plate-core';\n\nexport type SanitizerTuple = [Document, SPEditor];\n\ntype Predicate = (node: ChildNode) => boolean;\n\nexport const isHTMLElement = (node: ChildNode): node is HTMLElement =>\n node.nodeType === Node.ELEMENT_NODE;\n\nexport const removeChildNodes = (node: ChildNode, predicate: Predicate = Boolean) =>\n Array.from(node.childNodes)\n .filter(predicate)\n .forEach((table) => node.removeChild(table));\n\nexport const removeChildNodesUsingPredicate =\n (predicate: Predicate) =>\n (nodeList: NodeList): Node[] => {\n const nodes = Array.from(nodeList);\n while (nodes.length > 0) {\n const node = nodes.pop() as ChildNode;\n removeChildNodes(node, predicate);\n for (const childNode of Array.from(node.childNodes)) {\n nodes.push(childNode);\n }\n }\n return nodes;\n };\n","import { removeChildNodesUsingPredicate, SanitizerTuple } from './helpers';\n\nconst isComment = (node: ChildNode): node is Comment => node.nodeType === Node.COMMENT_NODE;\n\nconst removeCommentChildren = removeChildNodesUsingPredicate(isComment);\n\nexport const removeComments = ([doc, editor]: SanitizerTuple): SanitizerTuple => {\n removeCommentChildren(doc.childNodes);\n return [doc, editor];\n};\n","import { BLOCKS } from '@contentful/rich-text-types';\nimport { getNodeEntryFromSelection } from '../../../helpers/editor';\nimport { isHTMLElement, removeChildNodesUsingPredicate, SanitizerTuple } from './helpers';\n\nconst TAG_NAME_TABLE = 'TABLE';\nconst TAG_NAME_TABLE_CAPTION = 'CAPTION';\nconst DISALLOWED_TABLE_CHILD_ELEMENTS: Element['tagName'][] = [TAG_NAME_TABLE_CAPTION];\ntype DisallowedTableChildElement = HTMLTableCaptionElement;\n\nconst isTableElement = (node: ChildNode): node is HTMLTableElement =>\n isHTMLElement(node) && node.tagName === TAG_NAME_TABLE;\n\nconst isDisallowedTableChildElement = (node: ChildNode): node is DisallowedTableChildElement =>\n isHTMLElement(node) && DISALLOWED_TABLE_CHILD_ELEMENTS.includes(node.tagName);\n\nconst removeDisallowedTableChildElements = removeChildNodesUsingPredicate(\n isDisallowedTableChildElement\n);\n\nconst removeTableGrandchildren = (nodeList: NodeList) => {\n const nodes = Array.from(nodeList);\n while (nodes.length > 0) {\n const node = nodes.pop() as ChildNode;\n if (isTableElement(node)) {\n removeDisallowedTableChildElements(node.childNodes);\n continue;\n }\n for (const childNode of Array.from(node.childNodes)) {\n nodes.push(childNode);\n }\n }\n return nodes;\n};\n\nexport const sanitizeTables = ([doc, editor]: SanitizerTuple): SanitizerTuple => {\n const [node] = getNodeEntryFromSelection(editor, BLOCKS.TABLE);\n const isTableInCurrentSelection = !!node;\n if (isTableInCurrentSelection) {\n removeDisallowedTableChildElements(doc.childNodes);\n } else {\n removeTableGrandchildren(doc.childNodes);\n }\n return [doc, editor];\n};\n","import { PlatePlugin, SPEditor } from '@udecode/plate-core';\nimport * as sanitizers from './sanitizers';\nimport flow from 'lodash/flow';\n\nconst MIME_TYPE_HTML = 'text/html';\n\n// TODO: Upgrade tslib so we can just flow(...sanitizers);\nconst sanitizeDocument = flow.apply(this, Object.values(sanitizers));\n\nconst sanitizeHtml = (html: string, editor: SPEditor): string => {\n const doc = new DOMParser().parseFromString(html, MIME_TYPE_HTML);\n const [sanitizedDoc] = sanitizeDocument([doc, editor]);\n const sanitizedData = new XMLSerializer().serializeToString(sanitizedDoc);\n return sanitizedData;\n};\n\nconst htmlToDataTransfer = (html: string): DataTransfer => {\n const data = new DataTransfer();\n data.setData(MIME_TYPE_HTML, html);\n return data;\n};\n\nfunction withPasteHandling(editor: SPEditor) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n return (_event: React.KeyboardEvent) => {\n const { insertData } = editor;\n editor.insertData = (data: DataTransfer) => {\n const html = data.getData(MIME_TYPE_HTML);\n if (html) {\n const sanitized = sanitizeHtml(html, editor);\n const newData = htmlToDataTransfer(sanitized);\n insertData(newData);\n } else {\n insertData(data);\n }\n };\n };\n}\n\nexport const createPastePlugin = (): PlatePlugin => ({\n onKeyDown: withPasteHandling,\n});\n","import { isHTMLElement, removeChildNodes, SanitizerTuple } from './helpers';\n\n/**\n * Ensures the text selection from entity block elements is\n * not included in the paste buffer.\n */\nexport const sanitizeEntityBlocks = ([doc, editor]: SanitizerTuple): SanitizerTuple => {\n const nodes = Array.from(doc.childNodes);\n while (nodes.length > 0) {\n const node = nodes.pop() as ChildNode;\n if (isHTMLElement(node) && node.getAttribute('data-entity-type')) {\n removeChildNodes(node);\n continue;\n }\n for (const childNode of Array.from(node.childNodes)) {\n nodes.push(childNode);\n }\n }\n return [doc, editor];\n};\n","import * as React from 'react';\nimport { css } from 'emotion';\nimport { ELEMENT_PARAGRAPH } from '@udecode/plate-paragraph';\nimport { BLOCKS } from '@contentful/rich-text-types';\nimport tokens from '@contentful/f36-tokens';\nimport { RenderElementProps } from 'slate-react';\nimport { PlatePlugin, getRenderElement } from '@udecode/plate-core';\nimport { getToggleElementOnKeyDown } from '@udecode/plate-common';\nimport { CustomSlatePluginOptions } from '../../types';\nimport { deserializeElement } from '../../helpers/deserializer';\n\nconst styles = {\n [BLOCKS.PARAGRAPH]: css`\n line-height: ${tokens.lineHeightDefault};\n margin-bottom: 1.5em;\n `,\n};\n\nexport function Paragraph(props: RenderElementProps) {\n return (\n <div {...props.attributes} className={styles[BLOCKS.PARAGRAPH]}>\n {props.children}\n </div>\n );\n}\n\nexport function createParagraphPlugin(): PlatePlugin {\n const elementKeys: string[] = [ELEMENT_PARAGRAPH, BLOCKS.PARAGRAPH];\n\n return {\n renderElement: getRenderElement(elementKeys),\n pluginKeys: elementKeys,\n onKeyDown: getToggleElementOnKeyDown(BLOCKS.PARAGRAPH),\n deserialize: deserializeElement(BLOCKS.PARAGRAPH, [\n {\n nodeNames: ['P'],\n },\n ]),\n };\n}\n\nexport const withParagraphOptions: CustomSlatePluginOptions = {\n [ELEMENT_PARAGRAPH]: {\n // We convert the default slate plugin `p` to Contentful `BLOCKS.PARAGRAPH`\n type: BLOCKS.PARAGRAPH,\n component: Paragraph,\n },\n [BLOCKS.PARAGRAPH]: {\n type: BLOCKS.PARAGRAPH,\n component: Paragraph,\n hotkey: ['mod+opt+0'],\n },\n};\n","import { BLOCKS, INLINES, VOID_BLOCKS, Text } from '@contentful/rich-text-types';\nimport { CustomElement, TextElement, TextOrCustomElement } from 'types';\nimport values from 'lodash/values'; // eslint-disable-line you-dont-need-lodash-underscore/values\n\ntype NodeType = BLOCKS | INLINES | Text['nodeType'];\n\nconst TEXT_PARENT_NODES: string[] = (VOID_BLOCKS as string[])\n .concat(values(INLINES) as string[])\n .concat(\n BLOCKS.PARAGRAPH,\n BLOCKS.HEADING_1,\n BLOCKS.HEADING_2,\n BLOCKS.HEADING_3,\n BLOCKS.HEADING_4,\n BLOCKS.HEADING_5,\n BLOCKS.HEADING_6\n );\n\nconst isTextElement = (node: TextOrCustomElement): node is TextElement => 'text' in node;\n\nconst wrapNode = (type: BLOCKS, node: TextOrCustomElement): CustomElement => ({\n type,\n data: {},\n children: [node],\n});\n\nfunction wrapOrphanedTextNode(parentNodeType: NodeType, node: TextElement): CustomElement {\n const paragraph = wrapNode(BLOCKS.PARAGRAPH, node);\n switch (parentNodeType) {\n case BLOCKS.OL_LIST:\n case BLOCKS.UL_LIST:\n return wrapNode(BLOCKS.LIST_ITEM, paragraph);\n case BLOCKS.TABLE_ROW:\n return wrapNode(BLOCKS.TABLE_CELL, paragraph);\n case BLOCKS.TABLE:\n return wrapNode(BLOCKS.TABLE_ROW, wrapNode(BLOCKS.TABLE_CELL, paragraph));\n default:\n return paragraph;\n }\n}\n\n/**\n * Ensures \"orphaned\" text node elements (those without a parent capable of\n * validly rendering a text child node) are wrapped with a suitable parent\n * element to prevent failures on the validation layer.\n *\n * It is commonplace for third party plugins (including udecode) to reconcile\n * deletion events by inserting such nodes into their schema. This\n * subprocedure is intended as a guard against such cases.\n */\nexport function sanitizeSlateDoc(\n nodes: TextOrCustomElement[] = [],\n parentNodeType: NodeType = BLOCKS.DOCUMENT\n): TextOrCustomElement[] {\n return nodes.map((node: TextOrCustomElement): TextOrCustomElement => {\n if (isTextElement(node)) {\n return TEXT_PARENT_NODES.includes(parentNodeType)\n ? node\n : wrapOrphanedTextNode(parentNodeType, node);\n }\n return {\n ...node,\n children: sanitizeSlateDoc(node.children, node.type as NodeType),\n };\n });\n}\n\n/**\n * Ensures incoming void nodes have a child leaf text element.\n */\nexport function sanitizeIncomingSlateDoc(nodes: TextOrCustomElement[] = []): TextOrCustomElement[] {\n return nodes.map((node: TextOrCustomElement): TextOrCustomElement => {\n if (isTextElement(node)) {\n return node;\n }\n if (node.isVoid && node.children?.length === 0) {\n return {\n ...node,\n children: [{ text: '', data: {} }],\n };\n }\n return {\n ...node,\n children: sanitizeIncomingSlateDoc(node.children),\n };\n });\n}\n","import React, { useCallback, useState } from 'react';\nimport noop from 'lodash/noop';\nimport { toContentfulDocument, toSlatejsDocument } from '@contentful/contentful-slatejs-adapter';\nimport * as Contentful from '@contentful/rich-text-types';\nimport { EntityProvider } from '@contentful/field-editor-reference';\nimport { css, cx } from 'emotion';\nimport { styles } from './RichTextEditor.styles';\nimport schema from './constants/Schema';\nimport deepEquals from 'fast-deep-equal';\nimport Toolbar from './Toolbar';\nimport StickyToolbarWrapper from './Toolbar/StickyToolbarWrapper';\nimport { createPastePlugin } from './plugins/Paste';\nimport { createListPlugin, withListOptions } from './plugins/List';\nimport {\n Plate,\n createHistoryPlugin,\n createReactPlugin,\n PlatePlugin,\n SPEditor,\n} from '@udecode/plate-core';\nimport { createDeserializeHTMLPlugin } from '@udecode/plate-html-serializer';\nimport { createHrPlugin, withHrOptions } from './plugins/Hr';\nimport { withHeadingOptions, createHeadingPlugin } from './plugins/Heading';\nimport { createBoldPlugin, withBoldOptions } from './plugins/Bold';\nimport { withCodeOptions, createCodePlugin } from './plugins/Code';\nimport { withItalicOptions, createItalicPlugin } from './plugins/Italic';\nimport { createUnderlinePlugin, withUnderlineOptions } from './plugins/Underline';\nimport { createParagraphPlugin, withParagraphOptions } from './plugins/Paragraph';\nimport { createQuotePlugin, withQuoteOptions } from './plugins/Quote';\nimport { createNewLinePlugin } from './plugins/NewLine';\nimport { createInsertBeforeFirstVoidBlockPlugin } from './plugins/InsertBeforeFirstVoidBlock';\nimport { createTablePlugin, withTableOptions } from './plugins/Table';\nimport { createHyperlinkPlugin, withHyperlinkOptions } from './plugins/Hyperlink';\nimport {\n createEmbeddedAssetBlockPlugin,\n createEmbeddedEntryBlockPlugin,\n withEmbeddedAssetBlockOptions,\n withEmbeddedEntryBlockOptions,\n} from './plugins/EmbeddedEntityBlock';\nimport {\n createEmbeddedEntityInlinePlugin,\n withEmbeddedEntityInlineOptions,\n} from './plugins/EmbeddedEntityInline';\nimport { SdkProvider } from './SdkProvider';\nimport {\n RichTextTrackingActionHandler,\n TrackingProvider,\n useTrackingContext,\n} from './TrackingProvider';\nimport { sanitizeIncomingSlateDoc, sanitizeSlateDoc } from './helpers/sanitizeSlateDoc';\nimport { TextOrCustomElement } from './types';\nimport { ContentfulEditorProvider, getContentfulEditorId } from './ContentfulEditorProvider';\nimport { FieldExtensionSDK } from '@contentful/app-sdk';\nimport { FieldConnector } from '@contentful/field-editor-shared';\nimport { createTrailingParagraphPlugin } from './plugins/TrailingParagraph';\n\ntype ConnectedProps = {\n sdk: FieldExtensionSDK;\n onAction?: RichTextTrackingActionHandler;\n minHeight?: string | number;\n value?: object;\n isDisabled?: boolean;\n onChange?: (doc: Contentful.Document) => unknown;\n isToolbarHidden?: boolean;\n actionsDisabled?: boolean;\n};\n\nconst getPlugins = (sdk: FieldExtensionSDK, tracking: TrackingProvider) => {\n const plugins = [\n // Core\n createReactPlugin(),\n createHistoryPlugin(),\n\n // Behavior\n createPastePlugin(),\n\n // Global shortcuts\n createNewLinePlugin(),\n createInsertBeforeFirstVoidBlockPlugin(),\n\n // Block Elements\n createParagraphPlugin(),\n createListPlugin(),\n createHrPlugin(),\n createHeadingPlugin(),\n createQuotePlugin(),\n createTablePlugin(tracking),\n createEmbeddedEntryBlockPlugin(sdk),\n createEmbeddedAssetBlockPlugin(sdk),\n\n // Inline elements\n createHyperlinkPlugin(sdk),\n createEmbeddedEntityInlinePlugin(sdk),\n\n // Marks\n createBoldPlugin(),\n createCodePlugin(),\n createItalicPlugin(),\n createUnderlinePlugin(),\n\n // Other\n createTrailingParagraphPlugin(),\n ];\n\n return plugins.concat([createDeserializeHTMLPlugin({ plugins })] as PlatePlugin<SPEditor>[]);\n};\n\nconst options = {\n // Block elements\n ...withParagraphOptions,\n ...withListOptions,\n ...withHrOptions,\n ...withHeadingOptions,\n ...withQuoteOptions,\n ...withTableOptions,\n ...withEmbeddedEntryBlockOptions,\n ...withEmbeddedAssetBlockOptions,\n\n // Inline elements\n ...withHyperlinkOptions,\n ...withEmbeddedEntityInlineOptions,\n\n // Marks\n ...withBoldOptions,\n ...withCodeOptions,\n ...withItalicOptions,\n ...withUnderlineOptions,\n};\nexport const ConnectedRichTextEditor = (props: ConnectedProps) => {\n const tracking = useTrackingContext();\n\n const docFromAdapter = toSlatejsDocument({\n document: props.value || Contentful.EMPTY_DOCUMENT,\n schema,\n });\n\n const doc = sanitizeIncomingSlateDoc(docFromAdapter);\n\n const [value, setValue] = useState(doc);\n\n const classNames = cx(\n styles.editor,\n props.minHeight !== undefined ? css({ minHeight: props.minHeight }) : undefined,\n props.isDisabled ? styles.disabled : styles.enabled,\n props.isToolbarHidden && styles.hiddenToolbar\n );\n\n const plugins = React.useMemo(() => getPlugins(props.sdk, tracking), [props.sdk, tracking]);\n\n return (\n <div className={styles.root} data-test-id=\"rich-text-editor\">\n <Plate\n id={getContentfulEditorId(props.sdk)}\n initialValue={value}\n plugins={plugins}\n editableProps={{\n className: classNames,\n readOnly: props.isDisabled,\n }}\n onChange={(newValue) => {\n const slateDoc = sanitizeSlateDoc(newValue as TextOrCustomElement[]);\n setValue(slateDoc);\n const contentfulDoc = toContentfulDocument({ document: slateDoc, schema });\n props.onChange?.(contentfulDoc);\n }}\n // @ts-expect-error\n options={options}>\n {!props.isToolbarHidden && (\n <StickyToolbarWrapper isDisabled={props.isDisabled}>\n <Toolbar isDisabled={props.isDisabled} />\n </StickyToolbarWrapper>\n )}\n </Plate>\n </div>\n );\n};\n\ntype Props = ConnectedProps & { isInitiallyDisabled: boolean };\n\nconst RichTextEditor = (props: Props) => {\n const { sdk, isInitiallyDisabled, onAction, ...otherProps } = props;\n const isEmptyValue = useCallback(\n (value) => !value || deepEquals(value, Contentful.EMPTY_DOCUMENT),\n []\n );\n return (\n <EntityProvider sdk={sdk}>\n <SdkProvider sdk={sdk}>\n <TrackingProvider onAction={onAction || noop}>\n <FieldConnector\n throttle={0}\n field={sdk.field}\n isInitiallyDisabled={isInitiallyDisabled}\n isEmptyValue={isEmptyValue}\n isEqualValues={deepEquals}>\n {({ lastRemoteValue, disabled, setValue, externalReset }) => (\n <ContentfulEditorProvider sdk={sdk}>\n <ConnectedRichTextEditor\n {...otherProps}\n key={`rich-text-editor-${externalReset}`}\n value={lastRemoteValue}\n sdk={sdk}\n onAction={onAction || noop}\n isDisabled={disabled}\n onChange={setValue}\n />\n </ContentfulEditorProvider>\n )}\n </FieldConnector>\n </TrackingProvider>\n </SdkProvider>\n </EntityProvider>\n );\n};\n\nexport default RichTextEditor;\n","import { KeyboardEvent } from 'react';\nimport { PlatePlugin, SPEditor } from '@udecode/plate-core';\n\nexport function createNewLinePlugin(): PlatePlugin {\n return {\n onKeyDown: function (editor: SPEditor) {\n return (event: KeyboardEvent) => {\n const isEnter = event.key === 'Enter';\n const isShift = event.shiftKey;\n\n if (isEnter && isShift) {\n event.preventDefault();\n editor.insertText('\\n');\n return true; // To prevent the next handler from running\n }\n\n return false; // something like next()\n };\n },\n };\n}\n","import { PlatePlugin } from '@udecode/plate-core';\nimport { isFirstChild } from '../../helpers/editor';\nimport { ExitBreakPluginOptions, createExitBreakPlugin } from '@udecode/plate-break';\n\nexport function createInsertBeforeFirstVoidBlockPlugin(): PlatePlugin {\n const optionsExitBreakPlugin: ExitBreakPluginOptions = {\n rules: [\n {\n hotkey: 'enter',\n before: true,\n query: { filter: ([node, path]) => isFirstChild(path) && !!node.isVoid },\n },\n ],\n };\n\n return createExitBreakPlugin(optionsExitBreakPlugin);\n}\n","import { BLOCKS } from '@contentful/rich-text-types';\nimport { createTrailingBlockPlugin } from '@udecode/plate-trailing-block';\n\nexport const createTrailingParagraphPlugin = () => {\n return createTrailingBlockPlugin({\n type: BLOCKS.PARAGRAPH,\n level: 0,\n });\n};\n","import React from 'react';\nimport { css } from 'emotion';\nimport PropTypes from 'prop-types';\nimport tokens from '@contentful/f36-tokens';\nimport { EntityProvider } from '@contentful/field-editor-reference';\nimport { FetchingWrappedEntryCard } from '../../plugins/shared/FetchingWrappedEntryCard';\nimport { FetchingWrappedAssetCard } from '../../plugins/shared/FetchingWrappedAssetCard';\n\nimport {\n TextLink,\n Button,\n FormControl,\n FormLabel,\n Select,\n TextInput,\n Form,\n ModalContent,\n ModalControls,\n} from '@contentful/f36-components';\n\nexport const LINK_TYPES = {\n URI: 'uri',\n ENTRY: 'Entry',\n ASSET: 'Asset',\n};\n\nfunction isFeaturingEntitySelector(entitySelectorConfigs = {}) {\n return !!entitySelectorConfigs.Entry || !!entitySelectorConfigs.Asset;\n}\n\nfunction entityToLink(entity) {\n const { id, type } = entity.sys;\n return { sys: { id, type: 'Link', linkType: type } };\n}\n\nexport class HyperlinkDialog extends React.Component {\n static propTypes = {\n sdk: PropTypes.object.isRequired,\n labels: PropTypes.shape({\n title: PropTypes.string,\n confirm: PropTypes.string,\n }),\n value: PropTypes.shape({\n text: PropTypes.string,\n uri: PropTypes.string,\n target: PropTypes.object,\n // Will be overwritten accordingly if `uri` or `target.sys.linkType` are set.\n type: PropTypes.oneOf(['uri', 'Entry', 'Asset']),\n }),\n entitySelectorConfigs: PropTypes.object,\n allowedHyperlinkTypes: PropTypes.arrayOf(\n PropTypes.oneOf([LINK_TYPES.ENTRY, LINK_TYPES.ASSET, LINK_TYPES.URI])\n ),\n hideText: PropTypes.bool,\n onClose: PropTypes.func.isRequired,\n };\n\n static defaultProps = {\n labels: {\n title: 'Insert link',\n confirm: 'Insert link',\n },\n value: {},\n hideText: false,\n entitySelectorConfigs: {},\n allowedHyperlinkTypes: [LINK_TYPES.ENTRY, LINK_TYPES.ASSET, LINK_TYPES.URI],\n };\n\n constructor(props) {\n super(props);\n\n const { text, type, uri, target } = props.value;\n const isEntityLink = Boolean(target);\n const entityLinks = {\n [LINK_TYPES.ENTRY]: null,\n [LINK_TYPES.ASSET]: null,\n };\n let linkType = type;\n\n if (isEntityLink) {\n linkType = target.sys.linkType;\n entityLinks[linkType] = target;\n } else if (props.allowedHyperlinkTypes.includes(LINK_TYPES.URI)) {\n linkType = LINK_TYPES.URI;\n } else {\n linkType = props.allowedHyperlinkTypes[0];\n }\n\n this.state = { text, uri, entityLinks, type: linkType };\n }\n\n setTargetEntity(type, entity) {\n this.setState((state) => ({\n entityLinks: {\n ...state.entityLinks,\n [type]: entity ? entityToLink(entity) : undefined,\n },\n }));\n }\n\n getValue() {\n const { text, type, uri } = this.state;\n const value = { type };\n if (text) {\n value.text = text;\n }\n if (type === LINK_TYPES.URI) {\n value.uri = uri;\n } else {\n value.target = this.state.entityLinks[type];\n }\n return value;\n }\n\n isLinkComplete() {\n const { text, type, uri, target } = this.getValue();\n const requiresText = !this.props.hideText;\n if (requiresText && !text) {\n return false;\n }\n return (type === LINK_TYPES.URI && uri) || target;\n }\n\n handleSubmit = (event) => {\n event.preventDefault();\n this.props.onClose(this.getValue());\n };\n\n selectEntry = async () => {\n const { locale, contentTypes } = this.props.entitySelectorConfigs.Entry;\n const entry = await this.props.sdk.dialogs.selectSingleEntry({ locale, contentTypes });\n this.setTargetEntity(LINK_TYPES.ENTRY, entry);\n };\n\n selectAsset = async () => {\n const { locale } = this.props.entitySelectorConfigs.Asset;\n const asset = await this.props.sdk.dialogs.selectSingleAsset({ locale });\n this.setTargetEntity(LINK_TYPES.ASSET, asset);\n };\n\n render() {\n const { labels } = this.props;\n return (\n <EntityProvider sdk={this.props.sdk}>\n <React.Fragment>\n <ModalContent>{this.renderFields()}</ModalContent>\n <ModalControls>\n <Button\n type=\"button\"\n onClick={() => this.props.onClose(null)}\n variant=\"secondary\"\n testId=\"cancel-cta\"\n size=\"small\">\n Cancel\n </Button>\n <Button\n type=\"submit\"\n variant=\"positive\"\n onClick={this.handleSubmit}\n isDisabled={!this.isLinkComplete()}\n testId=\"confirm-cta\"\n size=\"small\">\n {labels.confirm}\n </Button>\n </ModalControls>\n </React.Fragment>\n </EntityProvider>\n );\n }\n\n renderFields() {\n const { hideText, allowedHyperlinkTypes, entitySelectorConfigs } = this.props;\n const { uri, text, type } = this.state;\n const isUriInputAutoFocused = type === LINK_TYPES.URI && (hideText || !!text);\n\n return (\n <Form>\n {hideText ? null : (\n <FormControl id=\"link-text\" isRequired>\n <FormControl.Label>Link text</FormControl.Label>\n <TextInput\n testId=\"link-text-input\"\n name=\"link-text\"\n value={text || ''}\n onChange={(e) => this.setState({ text: e.target.value })}\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus={!isUriInputAutoFocused}\n />\n </FormControl>\n )}\n {isFeaturingEntitySelector(entitySelectorConfigs) && (\n <FormControl id=\"link-type\" name=\"link-type\">\n <FormControl.Label>Link type</FormControl.Label>\n <Select\n value={type}\n onChange={(e) => this.setState({ type: e.target.value })}\n testId=\"link-type-select\">\n {/* Show the option if the link type is allowed or the current link is of type that is no longer valid */}\n {allowedHyperlinkTypes.includes(LINK_TYPES.URI) || type === LINK_TYPES.URI ? (\n <Select.Option value={LINK_TYPES.URI}>URL</Select.Option>\n ) : null}\n {allowedHyperlinkTypes.includes(LINK_TYPES.ENTRY) || type === LINK_TYPES.ENTRY ? (\n <Select.Option value={LINK_TYPES.ENTRY}>Entry</Select.Option>\n ) : null}\n {allowedHyperlinkTypes.includes(LINK_TYPES.ASSET) || type === LINK_TYPES.ASSET ? (\n <Select.Option value={LINK_TYPES.ASSET}>Asset</Select.Option>\n ) : null}\n </Select>\n </FormControl>\n )}\n {type === LINK_TYPES.URI ? (\n <FormControl id=\"link-uri\" isRequired>\n <FormControl.Label>Link target</FormControl.Label>\n <TextInput\n testId=\"link-target-input\"\n name=\"link-uri\"\n value={uri || ''}\n placeholder=\"https://\"\n onChange={(e) => this.setState({ uri: e.target.value })}\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus={isUriInputAutoFocused}\n />\n <FormControl.HelpText>A protocol may be required, e.g. https://</FormControl.HelpText>\n </FormControl>\n ) : (\n this.renderEntityField()\n )}\n </Form>\n );\n }\n\n renderEntityField() {\n const { type, entityLinks } = this.state;\n const resetEntity = () => this.setTargetEntity(type, null);\n const entityLink = entityLinks[type];\n const isEntitySelectorVisible = !entityLink;\n return (\n <div>\n <FormLabel required htmlFor=\"\">\n Link target\n </FormLabel>\n {!isEntitySelectorVisible && (\n <TextLink\n as=\"button\"\n className={css({ marginLeft: tokens.spacingS })}\n onClick={resetEntity}>\n Remove selection\n </TextLink>\n )}\n {entityLink && (\n <div>\n {type === LINK_TYPES.ENTRY && (\n <FetchingWrappedEntryCard\n sdk={this.props.sdk}\n locale={this.props.entitySelectorConfigs.Entry.locale}\n entryId={entityLink.sys.id}\n isDisabled\n isSelected={false}\n />\n )}\n {type == LINK_TYPES.ASSET && (\n <FetchingWrappedAssetCard\n sdk={this.props.sdk}\n locale={this.props.entitySelectorConfigs.Asset.locale}\n assetId={entityLink.sys.id}\n isDisabled\n isSelected={false}\n />\n )}\n </div>\n )}\n {/* Keep all entity selectors in the DOM for super fast types switching ux.*/}\n {isEntitySelectorVisible && this.renderEntitySelector(type, isEntitySelectorVisible)}\n </div>\n );\n }\n\n renderEntitySelector(type) {\n return (\n <div className={css({ marginTop: tokens.spacingS })}>\n {type === LINK_TYPES.ENTRY && (\n <TextLink as=\"button\" onClick={this.selectEntry}>\n Select entry\n </TextLink>\n )}\n {type === LINK_TYPES.ASSET && (\n <TextLink as=\"button\" onClick={this.selectAsset}>\n Select asset\n </TextLink>\n )}\n </div>\n );\n }\n}\n\nexport const openHyperlinkDialog = (\n dialogs,\n { value, showTextInput, allowedHyperlinkTypes, entitySelectorConfigs }\n) => {\n const isNew = !(value.uri || value.target);\n const props = {\n labels: {\n title: isNew ? 'Insert hyperlink' : 'Edit hyperlink',\n confirm: isNew ? 'Insert' : 'Update',\n },\n value,\n hideText: !showTextInput,\n allowedHyperlinkTypes,\n entitySelectorConfigs,\n };\n\n return dialogs.openCurrent({\n title: props.labels.title,\n width: 'large',\n shouldCloseOnEscapePress: true,\n shouldCloseOnOverlayClick: true,\n allowHeightOverflow: true,\n parameters: {\n type: 'rich-text-hyperlink-dialog',\n ...props,\n },\n });\n};\n","import React from 'react';\nimport { DialogExtensionSDK } from '@contentful/app-sdk';\nimport { ModalDialogLauncher } from '@contentful/field-editor-shared';\nimport { HyperlinkDialog } from './HypelinkDialog/HyperlinkDialog';\n\nexport const openRichTextDialog = (sdk: DialogExtensionSDK) => (options) => {\n if (options.parameters?.type === 'rich-text-hyperlink-dialog') {\n return ModalDialogLauncher.openDialog(options, ({ onClose }) => {\n return <HyperlinkDialog {...options.parameters} onClose={onClose} sdk={sdk} />;\n });\n }\n return Promise.reject();\n};\n","import React from 'react';\nimport { DialogExtensionSDK } from '@contentful/app-sdk';\nimport { HyperlinkDialog } from './HypelinkDialog/HyperlinkDialog';\n\nexport const renderRichTextDialog = (sdk: DialogExtensionSDK) => {\n const parameters = sdk.parameters.invocation as Record<string, unknown>;\n if (parameters?.type === 'rich-text-hyperlink-dialog') {\n sdk.window.startAutoResizer();\n return <HyperlinkDialog {...sdk.parameters.invocation} onClose={sdk.close} sdk={sdk} />;\n }\n return <div />;\n};\n"],"names":["STYLE_EDITOR_BORDER","tokens","gray400","styles","root","css","position","editor","borderRadius","borderRadiusMedium","border","borderTop","padding","fontSize","spacingM","fontFamily","fontStackPrimary","minHeight","background","colorWhite","outline","whiteSpace","overflowWrap","webkitUserModify","a","span","cursor","margin","hiddenToolbar","enabled","disabled","gray100","inlines","Object","values","INLINES","map","type","document","nodes","types","TOP_LEVEL_BLOCKS","blocks","BLOCKS","PARAGRAPH","match","object","HEADING_1","HEADING_2","HEADING_3","HEADING_4","HEADING_5","HEADING_6","VOID_BLOCKS","reduce","nodeType","isVoid","QUOTE","CONTAINERS","min","normalize","error","code","unwrapBlockByKey","node","key","HYPERLINK","ENTRY_HYPERLINK","ASSET_HYPERLINK","EMBEDDED_ENTRY","button","height","width","marginLeft","spacing2Xs","marginRight","tooltip","zIndex","Number","zIndexTooltip","ToolbarButton","event","preventDefault","props","onClick","render","this","title","testId","isActive","children","isDisabled","React","Button","className","cx","startIcon","handleClick","variant","size","Tooltip","placement","content","Component","LINK_TYPES","LIST_TYPES","OL_LIST","UL_LIST","isBlockSelected","Array","from","Editor","Element","isElement","hasSelectionText","selection","focus","path","some","Text","isText","text","getNodeEntryFromSelection","nodeTypeOrTypes","nodeTypes","isArray","i","length","nodeEntry","slice","includes","isNodeTypeSelected","moveToTheNextLine","Transforms","move","distance","unit","toggleBlock","isList","isQuote","unwrapNodes","isEditor","split","setNodes","LIST_ITEM","wrapNodes","data","getElementFromCurrentSelection","at","flat","insertLink","options","url","target","isLinkActive","unwrapLink","isCollapsed","Range","link","uri","insertText","select","insertNodes","collapse","edge","wrapLink","shouldUnwrapBlockquote","isQuoteSelected","isValidType","HR","unwrapFromRoot","ancestorPath","Path","levels","find","level","getAncestorPathFromSelection","deserializeLeaf","rules","pluginOptions","getPlatePluginOptions","leaf","getLeafDeserializer","deserialize","deserializeElement","element","getElementDeserializer","getContentfulEditorId","sdk","field","entry","getSys","id","locale","useContentfulEditorHook","editorId","useStoreEditorRef","constate","ContentfulEditorProvider","useContentfulEditor","container","spacingL","hr","gray300","hrSelected","colorPrimary","withHrEvents","isEnter","keyCode","pathToSelectedHr","removeNodes","ToolbarHrButton","getText","Slate","HorizontalRuleIcon","withHrOptions","component","isSelected","isFocused","attributes","contentEditable","undefined","DEFAULT_ENABLED_NODE_TYPES","DOCUMENT","isFormattingOptionEnabled","validationType","nodeTypeOrMark","enabledFormattings","flow","v","get","validations","getRichTextValidation","concat","isNodeTypeEnabled","isMarkEnabled","mark","useSdk","SdkProvider","useSdkContext","dropdown","fontWeightDemiBold","fontSizeL","headings","fontWeightMedium","spacingS","withHeadingEvents","currentFragment","fragment","isCurrentFragmentAHeading","paragraph","heading","currentOffset","offset","cursorIsAtTheEnd","Node","string","splitNodes","headingKey","ctrlKey","metaKey","altKey","toggleNodeType","activeType","inactiveType","LABELS","ToolbarHeadingButton","isOpen","setOpen","selected","setSelected","operations","nodeTypesByEnablement","fromEntries","keys","filter","Boolean","someHeadingsEnabled","Menu","onClose","Trigger","endIcon","ChevronDownIcon","List","Item","isInitiallyFocused","setTimeout","createHeading","Tag","block","H1","H2","H3","H4","H5","H6","withHeadingOptions","blockquote","borderLeft","gray200","paddingLeft","fontStyle","color","createBlockQuote","withQuoteEvents","isBackspace","shiftKey","TABLE","every","item","ToolbarQuoteButton","QuoteIcon","withQuoteOptions","ToolbarListButton","toggleList","ListBulletedIcon","ListNumberedIcon","listStyles","lineHeightDefault","createList","UL","OL","LI","withListOptions","ELEMENT_LIC","ELEMENT_LI","ELEMENT_UL","ELEMENT_OL","ToolbarBoldButton","toggleMark","MARKS","BOLD","isMarkActive","FormatBoldIcon","bold","fontWeight","withBoldOptions","hotkey","ToolbarCodeButton","CODE","CodeIcon","withCodeOptions","ToolbarItalicButton","ITALIC","FormatItalicIcon","italic","withItalicOptions","ToolbarUnderlineButton","UNDERLINE","FormatUnderlinedIcon","withUnderlineOptions","runtime","exports","Op","prototype","hasOwn","hasOwnProperty","$Symbol","Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","define","obj","value","defineProperty","enumerable","configurable","writable","err","wrap","innerFn","outerFn","self","tryLocsList","generator","create","Generator","context","Context","_invoke","state","method","arg","Error","done","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","record","tryCatch","makeInvokeMethod","fn","call","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","getPrototypeOf","NativeIteratorPrototype","Gp","defineIteratorMethods","forEach","AsyncIterator","PromiseImpl","previousPromise","callInvokeWithMethodAndArg","resolve","reject","invoke","result","__await","then","unwrapped","TypeError","info","resultName","next","nextLoc","pushTryEntry","locs","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","doneResult","constructor","displayName","isGeneratorFunction","genFun","ctor","name","setPrototypeOf","__proto__","awrap","async","Promise","iter","toString","reverse","pop","skipTempReset","prev","charAt","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","module","regeneratorRuntime","accidentalStrictMode","Function","EntryAssetTooltip","entityTitle","setEntityTitle","entityStatus","setEntityStatus","jobs","setJobs","isLoading","setIsLoading","hasError","setHasError","actions","Asset","getEntity","space","getAsset","getEntityTitle","args","entityHelpers","getAssetTitle","asset","entity","Entry","getEntry","getEntryTitle","sys","contentType","contentTypeId","contentTypes","getCachedContentTypes","ct","localeCode","defaultLocaleCode","locales","entityType","getEntityScheduledActions","getEntryStatus","console","log","loadContent","toLowerCase","str","contentTypeName","substr","replace","getEntityInfo","getScheduleTooltipContent","job","jobsCount","scheduleIcon","EntityStatusIcon","useEntities","ScheduledIconWithTooltip","loadEntityScheduledActions","entityId","ClockIcon","entryCard","EntryThumbnail","file","isValidImage","AssetThumbnail","FetchingWrappedEntryCard","getOrLoadEntry","entries","setFile","entryId","getEntryImage","EntryCard","MissingEntityCard","onRemove","entryStatus","defaultTitle","description","getEntityDescription","status","thumbnailElement","icon","withDragHandle","onEdit","MenuItem","renderDropdown","assetCard","cardDropdown","truncated","overflow","textOverflow","renderAssetInfo","entityFile","fileName","mimeType","fileSize","image","SectionTitle","isTruncated","shortenStorageUnit","renderActions","window","open","FetchingWrappedAssetCard","getOrLoadAsset","assets","assetId","fields","AssetCard","asSquare","groupToIconMap","archive","src","video","audio","richtext","presentation","spreadsheet","pdfdocument","plaintext","markup","mimetype","getGroupLabel","fallbackFileName","getLinkedContentTypeIdsForNodeType","removeSelectionLabel","SYS_LINK_TYPES","LINK_TYPE_SELECTION_VALUES","HyperlinkModal","enabledLinkTypes","defaultLinkType","linkText","setLinkText","linkType","setLinkType","linkTarget","setLinkTarget","linkEntity","setLinkEntity","entityToLink","dialogs","selectSingleEntry","selectSingleAsset","EntityProvider","ModalContent","Form","FormControl","isRequired","Label","TextInput","onChange","Select","Option","HelpText","FormLabel","htmlFor","TextLink","ModalControls","addOrEditLink","selectionBeforeBlur","currentLinkText","ModalDialogLauncher","openDialog","shouldCloseOnEscapePress","shouldCloseOnOverlayClick","allowHeightOverflow","ReactEditor","hyperlinkWrapper","display","hyperlink","fill","gray900","hyperlinkIEFallback","textDecoration","hyperlinkIcon","top","webkitTransition","transition","createHyperlinkPlugin","renderElement","getRenderElement","pluginKeys","inlineTypes","getPlatePluginTypes","onKeyDown","buildHyperlinkEventHandler","hyperlinkOptions","entryHyperlinkOptions","assetHyperlinkOptions","isAnchor","nodeName","getAttribute","isEntryAnchor","isAssetAnchor","isMod","isK","wasHyperlinkEventTriggered","EntityHyperlink","stopPropagation","targetWrapperClassName","maxWidth","as","ToolbarHyperlinkButton","LinkIcon","withHyperlinkOptions","href","rel","insertTableAndFocusFirstCell","insertTable","header","tablePath","anchor","setSelection","moveToFirstCellFromSelectedTable","useTracking","onAction","onViewportAction","actionName","origin","TrackingProvider","useTrackingContext","addRow","getNextRowPath","someNode","getPlatePluginType","ELEMENT_TABLE","currentRowItem","getAbove","ELEMENT_TR","currentRowElem","nextRowPath","getEmptyRowNode","colCount","start","addRowBelow","currentRowPath","addRowAbove","addColumn","getNextCellPath","currentCellItem","ELEMENT_TD","ELEMENT_TH","currentTableItem","newCellPath","replacePathPos","_","rowIdx","getEmptyCellNode","addColumnRight","currentCellPath","addColumnLeft","topRight","right","TableActions","useState","isHeaderEnabled","setHeaderEnabled","close","useCallback","useEffect","tableItem","firstRow","getChildren","TABLE_HEADER_CELL","isTableHeaderEnabled","canInsertRowAbove","useMemo","toggleHeader","enable","TABLE_CELL","setHeader","action","cb","tableSize","table","numRows","numColumns","_firstRow$children","getTableSize","getCurrentTableSize","onOpen","IconButton","tabIndex","Divider","deleteRow","deleteColumn","deleteTable","TABLE_ROW","slateNodeToText","contentfulNode","toContentfulDocument","schema","documentToPlainTextString","withTableOptions","hasTables","isTableHeaderCell","createWithTableEvents","tracking","insertData","getData","markupBefore","markupAfter","tablePasted","hasHeadersOutsideFirstRow","flatMap","addTableTrackingEvents","normalizeNode","cellTypes","child","childPath","paragraphWithTextFromNode","addTableNormalization","getTableOnKeyDown","createTablePlugin","createTablePluginFromUdecode","withOverrides","insertFragment","fragments","ToolbarTableButton","el","isTableActive","TableIcon","EmbeddedEntityDropdownButton","onToggle","PlusIcon","marginBottom","LinkedEntityBlock","useSelected","useReadOnly","handleEditClick","navigator","openAsset","openEntry","slideIn","handleRemoveClick","pathToElement","findPath","newEntitySelectorConfigFromRichTextField","getEntityTypeFromRichTextNode","words","indexOf","selectEntityAndInsert","logAction","baseConfig","selectEntity","config","withCreate","insertBlock","linkedEntityBlock","createNode","EmbeddedEntityBlockToolbarIcon","isButton","noop","getEntityTypeFromNodeType","baseClass","AssetIcon","EmbeddedEntryBlockIcon","Flex","alignItems","flexDirection","Icon","createEmbeddedEntityPlugin","getWithEmbeddedEntityEvents","voidTypes","entityTypes","EMBEDDED_ASSET","embeddedEntityId","createEmbeddedEntryBlockPlugin","createEmbeddedAssetBlockPlugin","withEmbeddedEntryBlockOptions","withEmbeddedAssetBlockOptions","isShift","pathToSelectedElement","isE","wasEmbeddedEntryEventTriggered","isA","wasEmbeddedAssetEventTriggered","scheduledIcon","verticalAlign","FetchingWrappedInlineEntryCard","allContentTypes","InlineEntryCard","createInlineEntryNode","webkitUserSelect","mozUserSelect","msUserSelect","userSelect","inlineEntryNode","ToolbarEmbeddedEntityInlineButton","EmbeddedEntryInlineIcon","createEmbeddedEntityInlinePlugin","getWithEmbeddedEntryInlineEvents","withEmbeddedEntityInlineOptions","isTwo","wasEmbeddedEntryInlineEventTriggered","EmbedEntityWidget","canInsertBlocks","isEmbedDropdownOpen","setEmbedDropdownOpen","onCloseEntityDropdown","canAccessAssets","setCanAccessAssets","access","can","inlineEntryEmbedEnabled","blockEntryEmbedEnabled","blockAssetEmbedEnabled","shouldDisplayDropdown","toolbar","backgroundColor","spacingXs","divider","embedActionsWrapper","webkitAlignSelf","alignSelf","msFlexItemAlign","formattingOptionsWrapper","msFlexAlign","webkitBoxAlign","msFlexWrap","flexWrap","Toolbar","validationInfo","isAnyMarkEnabled","someWithValidation","vals","validation","val","isAnyHyperlinkEnabled","isAnyBlockFormattingEnabled","Fragment","nativeSticky","StickyToolbarWrapper","isHTMLElement","ELEMENT_NODE","removeChildNodes","predicate","childNodes","removeChild","removeChildNodesUsingPredicate","nodeList","removeCommentChildren","COMMENT_NODE","DISALLOWED_TABLE_CHILD_ELEMENTS","isTableElement","tagName","removeDisallowedTableChildElements","sanitizeDocument","apply","doc","removeTableGrandchildren","withPasteHandling","_event","html","newData","DataTransfer","setData","htmlToDataTransfer","DOMParser","parseFromString","sanitizedDoc","XMLSerializer","serializeToString","sanitizeHtml","Paragraph","withParagraphOptions","ELEMENT_PARAGRAPH","TEXT_PARENT_NODES","isTextElement","wrapNode","ConnectedRichTextEditor","sanitizeIncomingSlateDoc","toSlatejsDocument","Contentful","setValue","classNames","isToolbarHidden","plugins","elementKeys","createReactPlugin","createHistoryPlugin","createExitBreakPlugin","before","query","getToggleElementOnKeyDown","nodeNames","createPlateListPlugin","validLiChildrenTypes","LIST_ITEM_BLOCKS","headingType","index","renderLeaf","getRenderLeaf","getToggleMarkOnKeyDown","isGoogleBoldWrapper","startsWith","isBold","style","createTrailingBlockPlugin","createDeserializeHTMLPlugin","getPlugins","Plate","initialValue","editableProps","readOnly","newValue","slateDoc","sanitizeSlateDoc","parentNodeType","wrapOrphanedTextNode","contentfulDoc","HyperlinkDialog","handleSubmit","_this","getValue","selectEntry","entitySelectorConfigs","setTargetEntity","selectAsset","isEntityLink","entityLinks","allowedHyperlinkTypes","setState","isLinkComplete","hideText","labels","renderFields","_this2","confirm","isUriInputAutoFocused","e","_this3","autoFocus","isFeaturingEntitySelector","placeholder","renderEntityField","entityLink","isEntitySelectorVisible","required","_this4","renderEntitySelector","marginTop","propTypes","PropTypes","shape","oneOf","arrayOf","bool","func","defaultProps","isInitiallyDisabled","otherProps","isEmptyValue","deepEquals","FieldConnector","throttle","isEqualValues","externalReset","lastRemoteValue","parameters","invocation","startAutoResizer"],"mappings":"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"}
|