UNPKG

@atlaskit/editor-plugin-media

Version:

Media plugin for @atlaskit/editor-core

546 lines (544 loc) 26.5 kB
import _defineProperty from "@babel/runtime/helpers/defineProperty"; import _extends from "@babel/runtime/helpers/extends"; import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray"; function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } import React from 'react'; import { ACTION, ACTION_SUBJECT, ACTION_SUBJECT_ID, EVENT_TYPE } from '@atlaskit/editor-common/analytics'; import { alignmentIcons, buildLayoutButtons, layoutToMessages, wrappingIcons } from '@atlaskit/editor-common/card'; import { calcMinWidth, DEFAULT_IMAGE_HEIGHT, DEFAULT_IMAGE_WIDTH } from '@atlaskit/editor-common/media-single'; import commonMessages, { cardMessages } from '@atlaskit/editor-common/messages'; import { NodeSelection } from '@atlaskit/editor-prosemirror/state'; import { findParentNodeOfType, hasParentNode, hasParentNodeOfType, removeSelectedNode } from '@atlaskit/editor-prosemirror/utils'; import { akEditorDefaultLayoutWidth, akEditorFullWidthLayoutWidth } from '@atlaskit/editor-shared-styles'; import DownloadIcon from '@atlaskit/icon/glyph/download'; import RemoveIcon from '@atlaskit/icon/glyph/editor/remove'; import { mediaFilmstripItemDOMSelector } from '@atlaskit/media-filmstrip'; import { messages } from '@atlaskit/media-ui'; import { getBooleanFF } from '@atlaskit/platform-feature-flags'; import { showLinkingToolbar } from '../commands/linking'; import { MediaInlineNodeSelector, MediaSingleNodeSelector } from '../nodeviews/styles'; import { getPluginState as getMediaAltTextPluginState } from '../pm-plugins/alt-text'; import { getMediaLinkingState } from '../pm-plugins/linking'; import { stateKey } from '../pm-plugins/plugin-key'; import ImageBorderItem from '../ui/ImageBorder'; import { FullWidthDisplay, PixelEntry } from '../ui/PixelEntry'; import { currentMediaNodeBorderMark } from '../utils/current-media-node'; import { isVideo } from '../utils/media-single'; import { altTextButton, getAltTextToolbar } from './alt-text'; import { changeInlineToMediaCard, changeMediaCardToInline, removeInlineCard, setBorderMark, toggleBorderMark, updateMediaSingleWidth } from './commands'; import { FilePreviewItem } from './filePreviewItem'; import { shouldShowImageBorder } from './imageBorder'; import { LayoutGroup } from './layout-group'; import { getLinkingToolbar, shouldShowMediaLinkToolbar } from './linking'; import { LinkToolbarAppearance } from './linking-toolbar-appearance'; import { calcNewLayout, downloadMedia, getMaxToolbarWidth, getPixelWidthOfElement, getSelectedLayoutIcon, getSelectedMediaSingle, removeMediaGroupNode } from './utils'; var remove = function remove(state, dispatch) { if (dispatch) { dispatch(removeSelectedNode(state.tr)); } return true; }; var handleRemoveMediaGroup = function handleRemoveMediaGroup(state, dispatch) { var tr = removeMediaGroupNode(state); if (dispatch) { dispatch(tr); } return true; }; var generateMediaCardFloatingToolbar = function generateMediaCardFloatingToolbar(state, intl, mediaPluginState, hoverDecoration, editorAnalyticsAPI) { var mediaGroup = state.schema.nodes.mediaGroup; var items = [{ id: 'editor.media.view.switcher', type: 'dropdown', title: intl.formatMessage(messages.changeView), options: [{ id: 'editor.media.view.switcher.inline', title: intl.formatMessage(cardMessages.inline), selected: false, disabled: false, onClick: changeMediaCardToInline(editorAnalyticsAPI), testId: 'inline-appearance' }, { id: 'editor.media.view.switcher.thumbnail', title: intl.formatMessage(messages.displayThumbnail), selected: true, disabled: false, onClick: function onClick() { return true; }, testId: 'thumbnail-appearance' }] }, { type: 'separator' }, { type: 'custom', fallback: [], render: function render() { return /*#__PURE__*/React.createElement(FilePreviewItem, { key: "editor.media.card.preview", mediaPluginState: mediaPluginState, intl: intl }); } }, { type: 'separator' }, { id: 'editor.media.card.download', type: 'button', icon: DownloadIcon, onClick: function onClick() { downloadMedia(mediaPluginState); return true; }, title: intl.formatMessage(messages.download) }, { type: 'separator' }, { type: 'copy-button', items: [{ state: state, formatMessage: intl.formatMessage, nodeType: mediaGroup }, { type: 'separator' }] }, { id: 'editor.media.delete', type: 'button', appearance: 'danger', focusEditoronEnter: true, icon: RemoveIcon, onMouseEnter: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(mediaGroup, true), onMouseLeave: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(mediaGroup, false), onFocus: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(mediaGroup, true), onBlur: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(mediaGroup, false), title: intl.formatMessage(commonMessages.remove), onClick: handleRemoveMediaGroup, testId: 'media-toolbar-remove-button' }]; return items; }; var generateMediaInlineFloatingToolbar = function generateMediaInlineFloatingToolbar(state, intl, mediaPluginState, hoverDecoration, editorAnalyticsAPI) { var mediaInline = state.schema.nodes.mediaInline; var items = [{ id: 'editor.media.view.switcher', type: 'dropdown', title: intl.formatMessage(messages.changeView), options: [{ id: 'editor.media.view.switcher.inline', title: intl.formatMessage(cardMessages.inline), selected: true, disabled: false, onClick: function onClick() { return true; }, testId: 'inline-appearance' }, { id: 'editor.media.view.switcher.thumbnail', title: intl.formatMessage(messages.displayThumbnail), selected: false, disabled: false, onClick: changeInlineToMediaCard(editorAnalyticsAPI), testId: 'thumbnail-appearance' }] }, { type: 'separator' }, { type: 'custom', fallback: [], render: function render() { return /*#__PURE__*/React.createElement(FilePreviewItem, { key: "editor.media.card.preview", mediaPluginState: mediaPluginState, intl: intl }); } }, { type: 'separator' }, { id: 'editor.media.card.download', type: 'button', icon: DownloadIcon, onClick: function onClick() { downloadMedia(mediaPluginState); return true; }, title: intl.formatMessage(messages.download) }, { type: 'separator' }, { type: 'copy-button', items: [{ state: state, formatMessage: intl.formatMessage, nodeType: mediaInline }, { type: 'separator' }] }, { id: 'editor.media.delete', type: 'button', appearance: 'danger', focusEditoronEnter: true, icon: RemoveIcon, onMouseEnter: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(mediaInline, true), onMouseLeave: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(mediaInline, false), onFocus: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(mediaInline, true), onBlur: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(mediaInline, false), title: intl.formatMessage(commonMessages.remove), onClick: removeInlineCard, testId: 'media-toolbar-remove-button' }]; return items; }; var generateMediaSingleFloatingToolbar = function generateMediaSingleFloatingToolbar(state, intl, options, pluginState, mediaLinkingState, pluginInjectionApi, getEditorFeatureFlags) { var _pluginInjectionApi$d; var mediaSingle = state.schema.nodes.mediaSingle; var allowResizing = options.allowResizing, allowLinking = options.allowLinking, allowAdvancedToolBarOptions = options.allowAdvancedToolBarOptions, allowResizingInTables = options.allowResizingInTables, allowAltTextOnImages = options.allowAltTextOnImages; var toolbarButtons = []; var _ref = (_pluginInjectionApi$d = pluginInjectionApi === null || pluginInjectionApi === void 0 ? void 0 : pluginInjectionApi.decorations.actions) !== null && _pluginInjectionApi$d !== void 0 ? _pluginInjectionApi$d : {}, hoverDecoration = _ref.hoverDecoration; if (shouldShowImageBorder(state)) { toolbarButtons.push({ type: 'custom', fallback: [], render: function render(editorView) { if (!editorView) { return null; } var dispatch = editorView.dispatch, state = editorView.state; var borderMark = currentMediaNodeBorderMark(state); return /*#__PURE__*/React.createElement(ImageBorderItem, { toggleBorder: function toggleBorder() { var _pluginInjectionApi$a; toggleBorderMark(pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$a = pluginInjectionApi.analytics) === null || _pluginInjectionApi$a === void 0 ? void 0 : _pluginInjectionApi$a.actions)(state, dispatch); }, setBorder: function setBorder(attrs) { var _pluginInjectionApi$a2; setBorderMark(pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$a2 = pluginInjectionApi.analytics) === null || _pluginInjectionApi$a2 === void 0 ? void 0 : _pluginInjectionApi$a2.actions)(attrs)(state, dispatch); }, borderMark: borderMark, intl: intl }); } }); toolbarButtons.push({ type: 'separator' }); } if (allowAdvancedToolBarOptions) { var _pluginInjectionApi$a3; var widthPlugin = pluginInjectionApi === null || pluginInjectionApi === void 0 ? void 0 : pluginInjectionApi.width; var isChangingLayoutDisabled = false; var selectedNode = getSelectedMediaSingle(state); if (getBooleanFF('platform.editor.media.extended-resize-experience')) { var _widthPlugin$sharedSt; var contentWidth = widthPlugin === null || widthPlugin === void 0 || (_widthPlugin$sharedSt = widthPlugin.sharedState.currentState()) === null || _widthPlugin$sharedSt === void 0 ? void 0 : _widthPlugin$sharedSt.lineLength; var selectedNodeMaxWidth = pluginState.currentMaxWidth || contentWidth; if (selectedNode && selectedNodeMaxWidth && selectedNode.node.attrs.width >= selectedNodeMaxWidth) { isChangingLayoutDisabled = true; } } var layoutButtons = buildLayoutButtons(state, intl, state.schema.nodes.mediaSingle, widthPlugin, pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$a3 = pluginInjectionApi.analytics) === null || _pluginInjectionApi$a3 === void 0 ? void 0 : _pluginInjectionApi$a3.actions, allowResizing, allowResizingInTables, true, true, isChangingLayoutDisabled); if (getBooleanFF('platform.editor.media.grouped-layout') && selectedNode) { var selectedLayoutIcon = getSelectedLayoutIcon([].concat(_toConsumableArray(alignmentIcons), _toConsumableArray(wrappingIcons)), selectedNode.node); if (selectedLayoutIcon && layoutButtons.length) { var _options = { render: function render(props) { return /*#__PURE__*/React.createElement(LayoutGroup, _extends({ layoutButtons: layoutButtons }, props)); }, width: 156, height: 32 }; var trigger = { id: 'media-single-layout', testId: 'media-single-layout-dropdown-trigger', type: 'dropdown', options: _options, title: intl.formatMessage(layoutToMessages[selectedLayoutIcon.value]), icon: selectedLayoutIcon.icon }; toolbarButtons = [].concat(_toConsumableArray(toolbarButtons), [trigger, { type: 'separator' }]); } } else { toolbarButtons = [].concat(_toConsumableArray(toolbarButtons), _toConsumableArray(layoutButtons)); if (layoutButtons.length) { toolbarButtons.push({ type: 'separator' }); } } // Pixel Entry Toolbar Support var selection = state.selection; var isWithinTable = hasParentNodeOfType([state.schema.nodes.table])(selection); if (getBooleanFF('platform.editor.media.extended-resize-experience') && allowResizing && (!isWithinTable || allowResizingInTables === true)) { var selectedMediaSingleNode = getSelectedMediaSingle(state); var sizeInput = { type: 'custom', fallback: [], render: function render(editorView) { var _widthPlugin$sharedSt2, _pluginInjectionApi$m; if (!editorView || !selectedMediaSingleNode) { return null; } var state = editorView.state, dispatch = editorView.dispatch; var contentWidth = (widthPlugin === null || widthPlugin === void 0 || (_widthPlugin$sharedSt2 = widthPlugin.sharedState.currentState()) === null || _widthPlugin$sharedSt2 === void 0 ? void 0 : _widthPlugin$sharedSt2.lineLength) || akEditorDefaultLayoutWidth; var selectedMediaNode = selectedMediaSingleNode.node.content.firstChild; if (!selectedMediaNode) { return null; } var _selectedMediaSingleN = selectedMediaSingleNode.node.attrs, mediaSingleWidth = _selectedMediaSingleN.width, widthType = _selectedMediaSingleN.widthType, layout = _selectedMediaSingleN.layout; var _selectedMediaNode$at = selectedMediaNode.attrs, mediaWidth = _selectedMediaNode$at.width, mediaHeight = _selectedMediaNode$at.height; var maxWidthForNestedNode = pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$m = pluginInjectionApi.media.sharedState.currentState()) === null || _pluginInjectionApi$m === void 0 ? void 0 : _pluginInjectionApi$m.currentMaxWidth; var maxWidth = maxWidthForNestedNode || akEditorFullWidthLayoutWidth; var isVideoFile = isVideo(selectedMediaNode.attrs.__fileMimeType); var minWidth = calcMinWidth(isVideoFile, maxWidthForNestedNode || contentWidth); var hasPixelType = widthType === 'pixel'; var pixelWidthFromElement = getPixelWidthOfElement(editorView, selectedMediaSingleNode.pos + 1, // get pos of media node mediaWidth || DEFAULT_IMAGE_WIDTH); var pixelWidth = hasPixelType ? mediaSingleWidth : pixelWidthFromElement; //hasParentNode will return falsey value if selection depth === 0 var isNested = hasParentNode(function (n) { return n.type !== state.schema.nodes.doc; })(state.selection); return /*#__PURE__*/React.createElement(PixelEntry, { intl: intl, width: pluginState.isResizing ? pluginState.resizingWidth : pixelWidth, showMigration: !pluginState.isResizing && !hasPixelType, mediaWidth: mediaWidth || DEFAULT_IMAGE_WIDTH, mediaHeight: mediaHeight || DEFAULT_IMAGE_HEIGHT, minWidth: minWidth, maxWidth: maxWidth, onChange: function onChange(valid) { if (valid) { hoverDecoration === null || hoverDecoration === void 0 || hoverDecoration(mediaSingle, true, 'warning')(editorView.state, dispatch, editorView); } else { hoverDecoration === null || hoverDecoration === void 0 || hoverDecoration(mediaSingle, false)(editorView.state, dispatch, editorView); } }, onSubmit: function onSubmit(_ref2) { var _pluginInjectionApi$a4; var width = _ref2.width, validation = _ref2.validation; var newLayout = calcNewLayout(width, layout, contentWidth, options.fullWidthEnabled, isNested); updateMediaSingleWidth(pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$a4 = pluginInjectionApi.analytics) === null || _pluginInjectionApi$a4 === void 0 ? void 0 : _pluginInjectionApi$a4.actions)(width, validation, newLayout)(state, dispatch); }, onMigrate: function onMigrate() { var tr = state.tr.setNodeMarkup(selectedMediaSingleNode.pos, undefined, _objectSpread(_objectSpread({}, selectedMediaSingleNode.node.attrs), {}, { width: pixelWidthFromElement, widthType: 'pixel' })); tr.setMeta('scrollIntoView', false); tr.setSelection(NodeSelection.create(tr.doc, selectedMediaSingleNode.pos)); dispatch(tr); } }); } }; if (pluginState.isResizing) { // If the image is resizing // then return pixel entry component or full width label as the only toolbar item if (!selectedMediaSingleNode) { return []; } var layout = selectedMediaSingleNode.node.attrs.layout; if (layout === 'full-width') { var fullWidthLabel = { type: 'custom', fallback: [], render: function render() { return /*#__PURE__*/React.createElement(FullWidthDisplay, { intl: intl }); } }; return [fullWidthLabel]; } return [sizeInput]; } toolbarButtons.push(sizeInput); toolbarButtons.push({ type: 'separator' }); } if (allowLinking && shouldShowMediaLinkToolbar(state)) { toolbarButtons.push({ type: 'custom', fallback: [], render: function render(editorView, idx) { if (editorView !== null && editorView !== void 0 && editorView.state) { var editLink = function editLink() { if (editorView) { var _state = editorView.state, dispatch = editorView.dispatch; showLinkingToolbar(_state, dispatch); } }; var openLink = function openLink() { if (editorView) { var _pluginInjectionApi$a5; var tr = editorView.state.tr, dispatch = editorView.dispatch; pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$a5 = pluginInjectionApi.analytics) === null || _pluginInjectionApi$a5 === void 0 || _pluginInjectionApi$a5.actions.attachAnalyticsEvent({ eventType: EVENT_TYPE.TRACK, action: ACTION.VISITED, actionSubject: ACTION_SUBJECT.MEDIA, actionSubjectId: ACTION_SUBJECT_ID.LINK })(tr); dispatch(tr); return true; } }; return /*#__PURE__*/React.createElement(LinkToolbarAppearance, { key: idx, editorState: editorView.state, intl: intl, mediaLinkingState: mediaLinkingState, onAddLink: editLink, onEditLink: editLink, onOpenLink: openLink }); } return null; } }); } } if (allowAltTextOnImages) { var _pluginInjectionApi$a6; toolbarButtons.push(altTextButton(intl, state, pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$a6 = pluginInjectionApi.analytics) === null || _pluginInjectionApi$a6 === void 0 ? void 0 : _pluginInjectionApi$a6.actions), { type: 'separator' }); } var removeButton = { id: 'editor.media.delete', type: 'button', appearance: 'danger', focusEditoronEnter: true, icon: RemoveIcon, onMouseEnter: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(mediaSingle, true), onMouseLeave: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(mediaSingle, false), onFocus: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(mediaSingle, true), onBlur: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(mediaSingle, false), title: intl.formatMessage(commonMessages.remove), onClick: remove, testId: 'media-toolbar-remove-button' }; var items = [].concat(_toConsumableArray(toolbarButtons), [{ type: 'copy-button', items: [{ state: state, formatMessage: intl.formatMessage, nodeType: mediaSingle }, { type: 'separator' }] }, removeButton]); return items; }; export var floatingToolbar = function floatingToolbar(state, intl) { var _pluginInjectionApi$d2; var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var pluginInjectionApi = arguments.length > 3 ? arguments[3] : undefined; var _state$schema$nodes = state.schema.nodes, media = _state$schema$nodes.media, mediaInline = _state$schema$nodes.mediaInline, mediaSingle = _state$schema$nodes.mediaSingle, mediaGroup = _state$schema$nodes.mediaGroup; var altTextValidator = options.altTextValidator, allowLinking = options.allowLinking, allowAltTextOnImages = options.allowAltTextOnImages, providerFactory = options.providerFactory, allowMediaInline = options.allowMediaInline, allowResizing = options.allowResizing, getEditorFeatureFlags = options.getEditorFeatureFlags; var mediaPluginState = stateKey.getState(state); var mediaLinkingState = getMediaLinkingState(state); var _ref3 = (_pluginInjectionApi$d2 = pluginInjectionApi === null || pluginInjectionApi === void 0 ? void 0 : pluginInjectionApi.decorations.actions) !== null && _pluginInjectionApi$d2 !== void 0 ? _pluginInjectionApi$d2 : {}, hoverDecoration = _ref3.hoverDecoration; if (!mediaPluginState) { return; } var nodeType = allowMediaInline ? [mediaInline, mediaSingle, media] : [mediaSingle]; var baseToolbar = { title: 'Media floating controls', nodeType: nodeType, getDomRef: function getDomRef() { return mediaPluginState.element; } }; if (allowLinking && mediaLinkingState && mediaLinkingState.visible && shouldShowMediaLinkToolbar(state)) { var linkingToolbar = getLinkingToolbar(baseToolbar, mediaLinkingState, state, intl, pluginInjectionApi, providerFactory); if (linkingToolbar) { return linkingToolbar; } } if (allowAltTextOnImages) { var mediaAltTextPluginState = getMediaAltTextPluginState(state); if (mediaAltTextPluginState.isAltTextEditorOpen) { var _pluginInjectionApi$f; return getAltTextToolbar(baseToolbar, { altTextValidator: altTextValidator, forceFocusSelector: pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$f = pluginInjectionApi.floatingToolbar.actions) === null || _pluginInjectionApi$f === void 0 ? void 0 : _pluginInjectionApi$f.forceFocusSelector }); } } var items = []; var parentMediaGroupNode = findParentNodeOfType(mediaGroup)(state.selection); var selectedNodeType; if (state.selection instanceof NodeSelection) { selectedNodeType = state.selection.node.type; } if (allowMediaInline && (parentMediaGroupNode === null || parentMediaGroupNode === void 0 ? void 0 : parentMediaGroupNode.node.type) === mediaGroup) { var _pluginInjectionApi$a7; var mediaOffset = state.selection.$from.parentOffset + 1; baseToolbar.getDomRef = function () { var _mediaPluginState$ele; var selector = mediaFilmstripItemDOMSelector(mediaOffset); return (_mediaPluginState$ele = mediaPluginState.element) === null || _mediaPluginState$ele === void 0 ? void 0 : _mediaPluginState$ele.querySelector(selector); }; items = generateMediaCardFloatingToolbar(state, intl, mediaPluginState, hoverDecoration, pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$a7 = pluginInjectionApi.analytics) === null || _pluginInjectionApi$a7 === void 0 ? void 0 : _pluginInjectionApi$a7.actions); } else if (allowMediaInline && selectedNodeType && selectedNodeType === mediaInline) { var _pluginInjectionApi$a8; baseToolbar.getDomRef = function () { var _mediaPluginState$ele2; var element = (_mediaPluginState$ele2 = mediaPluginState.element) === null || _mediaPluginState$ele2 === void 0 ? void 0 : _mediaPluginState$ele2.querySelector(".".concat(MediaInlineNodeSelector)); return element || mediaPluginState.element; }; items = generateMediaInlineFloatingToolbar(state, intl, mediaPluginState, hoverDecoration, pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$a8 = pluginInjectionApi.analytics) === null || _pluginInjectionApi$a8 === void 0 ? void 0 : _pluginInjectionApi$a8.actions); } else { baseToolbar.getDomRef = function () { var _mediaPluginState$ele3; var element = (_mediaPluginState$ele3 = mediaPluginState.element) === null || _mediaPluginState$ele3 === void 0 ? void 0 : _mediaPluginState$ele3.querySelector(".".concat(MediaSingleNodeSelector)); return element || mediaPluginState.element; }; items = generateMediaSingleFloatingToolbar(state, intl, options, mediaPluginState, mediaLinkingState, pluginInjectionApi, getEditorFeatureFlags); } var toolbarConfig = _objectSpread(_objectSpread({}, baseToolbar), {}, { items: items, scrollable: true }); if (getBooleanFF('platform.editor.media.extended-resize-experience') && allowResizing) { return _objectSpread(_objectSpread({}, toolbarConfig), {}, { width: mediaPluginState.isResizing ? undefined : getMaxToolbarWidth() }); } return toolbarConfig; };