: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", {
className: dist_clsx('block-editor-url-popover__link-viewer', className),
children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(LinkViewerURL, {
}), onEditLinkClick && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, {
label: (0,external_wp_i18n_namespaceObject.__)('Edit'),
onClick: onEditLinkClick,
;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/url-popover/link-editor.js
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("form", {
className: dist_clsx('block-editor-url-popover__link-editor', className),
children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(url_input, {
__nextHasNoMarginBottom: true,
onChange: onChangeInputValue,
autocompleteRef: autocompleteRef
}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, {
label: (0,external_wp_i18n_namespaceObject.__)('Apply'),
;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/url-popover/index.js
__experimentalPopoverLegacyPositionToPlacement
} = unlock(external_wp_components_namespaceObject.privateApis);
const DEFAULT_PLACEMENT = 'bottom';
const URLPopover = (0,external_wp_element_namespaceObject.forwardRef)(({
// The DEFAULT_PLACEMENT value is assigned inside the function's body
focusOnMount = 'firstElement',
if (position !== undefined) {
external_wp_deprecated_default()('`position` prop in wp.blockEditor.URLPopover', {
alternative: '`placement` prop'
// Compute popover's placement:
// - give priority to `placement` prop, if defined
// - otherwise, compute it from the legacy `position` prop (if defined)
// - finally, fallback to the DEFAULT_PLACEMENT.
if (placement !== undefined) {
computedPlacement = placement;
} else if (position !== undefined) {
computedPlacement = __experimentalPopoverLegacyPositionToPlacement(position);
computedPlacement = computedPlacement || DEFAULT_PLACEMENT;
const [isSettingsExpanded, setIsSettingsExpanded] = (0,external_wp_element_namespaceObject.useState)(false);
const showSettings = !!renderSettings && isSettingsExpanded;
const toggleSettingsVisibility = () => {
setIsSettingsExpanded(!isSettingsExpanded);
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.Popover, {
className: "block-editor-url-popover",
focusOnMount: focusOnMount,
placement: computedPlacement,
children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", {
className: "block-editor-url-popover__input-container",
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", {
className: "block-editor-url-popover__row",
children: [children, !!renderSettings && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, {
className: "block-editor-url-popover__settings-toggle",
label: (0,external_wp_i18n_namespaceObject.__)('Link settings'),
onClick: toggleSettingsVisibility,
"aria-expanded": isSettingsExpanded,
}), showSettings && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", {
className: "block-editor-url-popover__settings",
children: renderSettings()
}), additionalControls && !showSettings && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", {
className: "block-editor-url-popover__additional-controls",
children: additionalControls
URLPopover.LinkEditor = LinkEditor;
URLPopover.LinkViewer = LinkViewer;
* @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/url-popover/README.md
/* harmony default export */ const url_popover = (URLPopover);
;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/media-placeholder/index.js
const media_placeholder_noop = () => {};
const InsertFromURLPopover = ({
}) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(url_popover, {
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("form", {
className: "block-editor-media-placeholder__url-input-form",
children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("input", {
className: "block-editor-media-placeholder__url-input-field",
"aria-label": (0,external_wp_i18n_namespaceObject.__)('URL'),
placeholder: (0,external_wp_i18n_namespaceObject.__)('Paste or type URL'),
}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, {
className: "block-editor-media-placeholder__url-input-submit-button",
label: (0,external_wp_i18n_namespaceObject.__)('Apply'),
const URLSelectionUI = ({
// Use internal state instead of a ref to make sure that the component
// re-renders when the popover's anchor updates.
const [popoverAnchor, setPopoverAnchor] = (0,external_wp_element_namespaceObject.useState)(null);
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", {
className: "block-editor-media-placeholder__url-input-container",
children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, {
className: "block-editor-media-placeholder__button",
isPressed: isURLInputVisible,
children: (0,external_wp_i18n_namespaceObject.__)('Insert from URL')
}), isURLInputVisible && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(InsertFromURLPopover, {
popoverAnchor: popoverAnchor
function MediaPlaceholder({
onFilesPreUpload = media_placeholder_noop,
onHTMLDrop: deprecatedOnHTMLDrop,
if (deprecatedOnHTMLDrop) {
external_wp_deprecated_default()('wp.blockEditor.MediaPlaceholder onHTMLDrop prop', {
const mediaUpload = (0,external_wp_data_namespaceObject.useSelect)(select => {
return getSettings().mediaUpload;
const [src, setSrc] = (0,external_wp_element_namespaceObject.useState)('');
const [isURLInputVisible, setIsURLInputVisible] = (0,external_wp_element_namespaceObject.useState)(false);
(0,external_wp_element_namespaceObject.useEffect)(() => {
setSrc((_value$src = value?.src) !== null && _value$src !== void 0 ? _value$src : '');
const onlyAllowsImages = () => {
if (!allowedTypes || allowedTypes.length === 0) {
return allowedTypes.every(allowedType => allowedType === 'image' || allowedType.startsWith('image/'));
const onChangeSrc = event => {
setSrc(event.target.value);
const openURLInput = () => {
setIsURLInputVisible(true);
const closeURLInput = () => {
setIsURLInputVisible(false);
const onSubmitSrc = event => {
if (src && onSelectURL) {
const onFilesUpload = files => {
// Since the setMedia function runs multiple times per upload group
// and is passed newMedia containing every item in its group each time, we must
// filter out whatever this upload group had previously returned to the
// gallery before adding and returning the image array with replacement newMedia
// Define an array to store urls from newMedia between subsequent function calls.
let lastMediaPassed = [];
// Remove any images this upload group is responsible for (lastMediaPassed).
// Their replacements are contained in newMedia.
const filteredMedia = (value !== null && value !== void 0 ? value : []).filter(item => {
// If Item has id, only remove it if lastMediaPassed has an item with that id.
return !lastMediaPassed.some(
// Be sure to convert to number for comparison.
}) => Number(id) === Number(item.id));
// Compare transient images via .includes since gallery may append extra info onto the url.
return !lastMediaPassed.some(({
}) => item.url.includes(urlSlug));
// Return the filtered media array along with newMedia.
onSelect(filteredMedia.concat(newMedia));
// Reset lastMediaPassed and set it with ids and urls from newMedia.
lastMediaPassed = newMedia.map(media => {
// Add everything up to '.fileType' to compare via .includes.
const cutOffIndex = media.url.lastIndexOf('.');
const urlSlug = media.url.slice(0, cutOffIndex);
setMedia = ([media]) => onSelect(media);
async function handleBlocksDrop(blocks) {
if (!blocks || !Array.isArray(blocks)) {
function recursivelyFindMediaFromBlocks(_blocks) {
return _blocks.flatMap(block => (block.name === 'core/image' || block.name === 'core/audio' || block.name === 'core/video') && block.attributes.url ? [block] : recursivelyFindMediaFromBlocks(block.innerBlocks));
const mediaBlocks = recursivelyFindMediaFromBlocks(blocks);
if (!mediaBlocks.length) {
const uploadedMediaList = await Promise.all(mediaBlocks.map(block => block.attributes.id ? block.attributes : new Promise((resolve, reject) => {
window.fetch(block.attributes.url).then(response => response.blob()).then(blob => mediaUpload({
title: block.attributes.title,
alt_text: block.attributes.alt,
caption: block.attributes.caption
onFileChange: ([media]) => {
})).catch(() => resolve(block.attributes.url));
}))).catch(err => onError(err));
onSelect(uploadedMediaList);
onSelect(uploadedMediaList[0]);
async function onHTMLDrop(HTML) {
const blocks = (0,external_wp_blocks_namespaceObject.pasteHandler)({
return await handleBlocksDrop(blocks);
const onUpload = event => {
onFilesUpload(event.target.files);
const defaultRenderPlaceholder = content => {
if (!mediaUpload && !onSelectURL) {
instructions = (0,external_wp_i18n_namespaceObject.__)('To edit this block, you need permission to upload media.');
if (instructions === undefined || title === undefined) {
const typesAllowed = allowedTypes !== null && allowedTypes !== void 0 ? allowedTypes : [];
const [firstAllowedType] = typesAllowed;
const isOneType = 1 === typesAllowed.length;
const isAudio = isOneType && 'audio' === firstAllowedType;
const isImage = isOneType && 'image' === firstAllowedType;
const isVideo = isOneType && 'video' === firstAllowedType;
if (instructions === undefined && mediaUpload) {
instructions = (0,external_wp_i18n_namespaceObject.__)('Upload a media file or pick one from your media library.');
instructions = (0,external_wp_i18n_namespaceObject.__)('Upload an audio file, pick one from your media library, or add one with a URL.');
instructions = (0,external_wp_i18n_namespaceObject.__)('Upload an image file, pick one from your media library, or add one with a URL.');
instructions = (0,external_wp_i18n_namespaceObject.__)('Upload a video file, pick one from your media library, or add one with a URL.');
if (title === undefined) {
title = (0,external_wp_i18n_namespaceObject.__)('Media');
title = (0,external_wp_i18n_namespaceObject.__)('Audio');
title = (0,external_wp_i18n_namespaceObject.__)('Image');
title = (0,external_wp_i18n_namespaceObject.__)('Video');
const placeholderClassName = dist_clsx('block-editor-media-placeholder', className, {
'is-appender': isAppender
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.Placeholder, {
instructions: instructions,
className: placeholderClassName,
onDoubleClick: onDoubleClick,
children: [content, children]
const renderPlaceholder = placeholder !== null && placeholder !== void 0 ? placeholder : defaultRenderPlaceholder;
const renderDropZone = () => {
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.DropZone, {
onFilesDrop: onFilesUpload,
const renderCancelLink = () => {
return onCancel && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, {
className: "block-editor-media-placeholder__cancel-button",
title: (0,external_wp_i18n_namespaceObject.__)('Cancel'),
children: (0,external_wp_i18n_namespaceObject.__)('Cancel')
const renderUrlSelectionUI = () => {
return onSelectURL && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(URLSelectionUI, {
isURLInputVisible: isURLInputVisible,
onChangeSrc: onChangeSrc,
onSubmitSrc: onSubmitSrc,
openURLInput: openURLInput,
closeURLInput: closeURLInput
const renderFeaturedImageToggle = () => {
return onToggleFeaturedImage && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", {
className: "block-editor-media-placeholder__url-input-container",
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, {
className: "block-editor-media-placeholder__button",
onClick: onToggleFeaturedImage,