Fix File
•
/
home
/
sportsfe...
/
httpdocs
/
clone
/
wp-inclu...
/
js
/
dist
•
File:
editor.js
•
Content:
className: "editor-page-attributes__parent", label: (0,external_wp_i18n_namespaceObject.__)('Parent'), help: (0,external_wp_i18n_namespaceObject.__)('Choose a parent page.'), value: parentPostId, options: parentOptions, onFilterValueChange: (0,external_wp_compose_namespaceObject.debounce)(handleKeydown, 300), onChange: handleChange, hideLabelFromVision: true }); } function PostParentToggle({ isOpen, onClick }) { const parentPost = (0,external_wp_data_namespaceObject.useSelect)(select => { const { getEditedPostAttribute } = select(store_store); const parentPostId = getEditedPostAttribute('parent'); if (!parentPostId) { return null; } const { getEntityRecord } = select(external_wp_coreData_namespaceObject.store); const postTypeSlug = getEditedPostAttribute('type'); return getEntityRecord('postType', postTypeSlug, parentPostId); }, []); const parentTitle = (0,external_wp_element_namespaceObject.useMemo)(() => !parentPost ? (0,external_wp_i18n_namespaceObject.__)('None') : getTitle(parentPost), [parentPost]); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { size: "compact", className: "editor-post-parent__panel-toggle", variant: "tertiary", "aria-expanded": isOpen // translators: %s: Current post parent. , "aria-label": (0,external_wp_i18n_namespaceObject.sprintf)((0,external_wp_i18n_namespaceObject.__)('Change parent: %s'), parentTitle), onClick: onClick, children: parentTitle }); } function ParentRow() { // 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); // Memoize popoverProps to avoid returning a new object every time. const popoverProps = (0,external_wp_element_namespaceObject.useMemo)(() => ({ // Anchor the popover to the middle of the entire row so that it doesn't // move around when the label changes. anchor: popoverAnchor, placement: 'left-start', offset: 36, shift: true }), [popoverAnchor]); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { label: (0,external_wp_i18n_namespaceObject.__)('Parent'), ref: setPopoverAnchor, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Dropdown, { popoverProps: popoverProps, className: "editor-post-parent__panel-dropdown", contentClassName: "editor-post-parent__panel-dialog", focusOnMount: true, renderToggle: ({ isOpen, onToggle }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostParentToggle, { isOpen: isOpen, onClick: onToggle }), renderContent: ({ onClose }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "editor-post-parent", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalInspectorPopoverHeader, { title: (0,external_wp_i18n_namespaceObject.__)('Parent'), onClose: onClose }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { children: [/* translators: The domain name should be a reserved domain name to prevent linking to third party sites outside the WordPress project's control. You may also wish to use wordpress.org or a wordpress.org sub-domain. */ (0,external_wp_i18n_namespaceObject.__)("Child pages inherit characteristics from their parent, such as URL structure. For instance, if 'Web Design' is a child of 'Services', its URL would be example.org/services/web-design."), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("p", { children: [(0,external_wp_i18n_namespaceObject.__)('They also show up as sub-items in the default navigation menu. '), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ExternalLink, { href: (0,external_wp_i18n_namespaceObject.__)('https://wordpress.org/documentation/article/page-post-settings-sidebar/#page-attributes'), children: (0,external_wp_i18n_namespaceObject.__)('Learn more') })] })] }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PageAttributesParent, {})] }) }) }); } /* harmony default export */ const page_attributes_parent = (PageAttributesParent); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/page-attributes/panel.js /** * WordPress dependencies */ /** * Internal dependencies */ const PANEL_NAME = 'page-attributes'; function AttributesPanel() { const { isEnabled, postType } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { getEditedPostAttribute, isEditorPanelEnabled } = select(store_store); const { getPostType } = select(external_wp_coreData_namespaceObject.store); return { isEnabled: isEditorPanelEnabled(PANEL_NAME), postType: getPostType(getEditedPostAttribute('type')) }; }, []); if (!isEnabled || !postType) { return null; } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ParentRow, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(OrderRow, {})] }); } /** * Renders the Page Attributes Panel component. * * @return {Component} The component to be rendered. */ function PageAttributesPanel() { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(page_attributes_check, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(AttributesPanel, {}) }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/add-template.js /** * WordPress dependencies */ const addTemplate = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { fillRule: "evenodd", clipRule: "evenodd", d: "M18.5 5.5V8H20V5.5H22.5V4H20V1.5H18.5V4H16V5.5H18.5ZM13.9624 4H6C4.89543 4 4 4.89543 4 6V18C4 19.1046 4.89543 20 6 20H18C19.1046 20 20 19.1046 20 18V10.0391H18.5V18C18.5 18.2761 18.2761 18.5 18 18.5H10L10 10.4917L16.4589 10.5139L16.4641 9.01389L5.5 8.97618V6C5.5 5.72386 5.72386 5.5 6 5.5H13.9624V4ZM5.5 10.4762V18C5.5 18.2761 5.72386 18.5 6 18.5H8.5L8.5 10.4865L5.5 10.4762Z" }) }); /* harmony default export */ const add_template = (addTemplate); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-template/create-new-template-modal.js /** * WordPress dependencies */ /** * Internal dependencies */ const DEFAULT_TITLE = (0,external_wp_i18n_namespaceObject.__)('Custom Template'); function CreateNewTemplateModal({ onClose }) { const { defaultBlockTemplate, onNavigateToEntityRecord } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { getEditorSettings, getCurrentTemplateId } = select(store_store); return { defaultBlockTemplate: getEditorSettings().defaultBlockTemplate, onNavigateToEntityRecord: getEditorSettings().onNavigateToEntityRecord, getTemplateId: getCurrentTemplateId }; }); const { createTemplate } = unlock((0,external_wp_data_namespaceObject.useDispatch)(store_store)); const [title, setTitle] = (0,external_wp_element_namespaceObject.useState)(''); const [isBusy, setIsBusy] = (0,external_wp_element_namespaceObject.useState)(false); const cancel = () => { setTitle(''); onClose(); }; const submit = async event => { event.preventDefault(); if (isBusy) { return; } setIsBusy(true); const newTemplateContent = defaultBlockTemplate !== null && defaultBlockTemplate !== void 0 ? defaultBlockTemplate : (0,external_wp_blocks_namespaceObject.serialize)([(0,external_wp_blocks_namespaceObject.createBlock)('core/group', { tagName: 'header', layout: { inherit: true } }, [(0,external_wp_blocks_namespaceObject.createBlock)('core/site-title'), (0,external_wp_blocks_namespaceObject.createBlock)('core/site-tagline')]), (0,external_wp_blocks_namespaceObject.createBlock)('core/separator'), (0,external_wp_blocks_namespaceObject.createBlock)('core/group', { tagName: 'main' }, [(0,external_wp_blocks_namespaceObject.createBlock)('core/group', { layout: { inherit: true } }, [(0,external_wp_blocks_namespaceObject.createBlock)('core/post-title')]), (0,external_wp_blocks_namespaceObject.createBlock)('core/post-content', { layout: { inherit: true } })])]); const newTemplate = await createTemplate({ slug: (0,external_wp_url_namespaceObject.cleanForSlug)(title || DEFAULT_TITLE), content: newTemplateContent, title: title || DEFAULT_TITLE }); setIsBusy(false); onNavigateToEntityRecord({ postId: newTemplate.id, postType: 'wp_template' }); cancel(); }; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Modal, { title: (0,external_wp_i18n_namespaceObject.__)('Create custom template'), onRequestClose: cancel, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("form", { className: "editor-post-template__create-form", onSubmit: submit, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { spacing: "3", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.TextControl, { __nextHasNoMarginBottom: true, label: (0,external_wp_i18n_namespaceObject.__)('Name'), value: title, onChange: setTitle, placeholder: DEFAULT_TITLE, disabled: isBusy, help: (0,external_wp_i18n_namespaceObject.__)('Describe the template, e.g. "Post with sidebar". A custom template can be manually applied to any post or page.') }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, { justify: "right", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { variant: "tertiary", onClick: cancel, children: (0,external_wp_i18n_namespaceObject.__)('Cancel') }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { variant: "primary", type: "submit", isBusy: isBusy, "aria-disabled": isBusy, children: (0,external_wp_i18n_namespaceObject.__)('Create') })] })] }) }) }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-template/hooks.js /** * WordPress dependencies */ /** * Internal dependencies */ function useEditedPostContext() { return (0,external_wp_data_namespaceObject.useSelect)(select => { const { getCurrentPostId, getCurrentPostType } = select(store_store); return { postId: getCurrentPostId(), postType: getCurrentPostType() }; }, []); } function useAllowSwitchingTemplates() { const { postType, postId } = useEditedPostContext(); return (0,external_wp_data_namespaceObject.useSelect)(select => { const { getEntityRecord, getEntityRecords } = select(external_wp_coreData_namespaceObject.store); const siteSettings = getEntityRecord('root', 'site'); const templates = getEntityRecords('postType', 'wp_template', { per_page: -1 }); const isPostsPage = +postId === siteSettings?.page_for_posts; // If current page is set front page or posts page, we also need // to check if the current theme has a template for it. If not const isFrontPage = postType === 'page' && +postId === siteSettings?.page_on_front && templates?.some(({ slug }) => slug === 'front-page'); return !isPostsPage && !isFrontPage; }, [postId, postType]); } function useTemplates(postType) { return (0,external_wp_data_namespaceObject.useSelect)(select => select(external_wp_coreData_namespaceObject.store).getEntityRecords('postType', 'wp_template', { per_page: -1, post_type: postType }), [postType]); } function useAvailableTemplates(postType) { const currentTemplateSlug = useCurrentTemplateSlug(); const allowSwitchingTemplate = useAllowSwitchingTemplates(); const templates = useTemplates(postType); return (0,external_wp_element_namespaceObject.useMemo)(() => allowSwitchingTemplate && templates?.filter(template => template.is_custom && template.slug !== currentTemplateSlug && !!template.content.raw // Skip empty templates. ), [templates, currentTemplateSlug, allowSwitchingTemplate]); } function useCurrentTemplateSlug() { const { postType, postId } = useEditedPostContext(); const templates = useTemplates(postType); const entityTemplate = (0,external_wp_data_namespaceObject.useSelect)(select => { const post = select(external_wp_coreData_namespaceObject.store).getEditedEntityRecord('postType', postType, postId); return post?.template; }, [postType, postId]); if (!entityTemplate) { return; } // If a page has a `template` set and is not included in the list // of the theme's templates, do not return it, in order to resolve // to the current theme's default template. return templates?.find(template => template.slug === entityTemplate)?.slug; } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-template/classic-theme.js /** * WordPress dependencies */ /** * Internal dependencies */ const POPOVER_PROPS = { className: 'editor-post-template__dropdown', placement: 'bottom-start' }; function PostTemplateToggle({ isOpen, onClick }) { const templateTitle = (0,external_wp_data_namespaceObject.useSelect)(select => { const templateSlug = select(store_store).getEditedPostAttribute('template'); const { supportsTemplateMode, availableTemplates } = select(store_store).getEditorSettings(); if (!supportsTemplateMode && availableTemplates[templateSlug]) { return availableTemplates[templateSlug]; } const template = select(external_wp_coreData_namespaceObject.store).canUser('create', 'templates') && select(store_store).getCurrentTemplateId(); return template?.title || template?.slug || availableTemplates?.[templateSlug]; }, []); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { __next40pxDefaultSize: true, variant: "tertiary", "aria-expanded": isOpen, "aria-label": (0,external_wp_i18n_namespaceObject.__)('Template options'), onClick: onClick, children: templateTitle !== null && templateTitle !== void 0 ? templateTitle : (0,external_wp_i18n_namespaceObject.__)('Default template') }); } /** * Renders the dropdown content for selecting a post template. * * @param {Object} props The component props. * @param {Function} props.onClose The function to close the dropdown. * * @return {JSX.Element} The rendered dropdown content. */ function PostTemplateDropdownContent({ onClose }) { var _options$find, _selectedOption$value; const allowSwitchingTemplate = useAllowSwitchingTemplates(); const { availableTemplates, fetchedTemplates, selectedTemplateSlug, canCreate, canEdit, currentTemplateId, onNavigateToEntityRecord, getEditorSettings } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { canUser, getEntityRecords } = select(external_wp_coreData_namespaceObject.store); const editorSettings = select(store_store).getEditorSettings(); const canCreateTemplates = canUser('create', 'templates'); const _currentTemplateId = select(store_store).getCurrentTemplateId(); return { availableTemplates: editorSettings.availableTemplates, fetchedTemplates: canCreateTemplates ? getEntityRecords('postType', 'wp_template', { post_type: select(store_store).getCurrentPostType(), per_page: -1 }) : undefined, selectedTemplateSlug: select(store_store).getEditedPostAttribute('template'), canCreate: allowSwitchingTemplate && canCreateTemplates && editorSettings.supportsTemplateMode, canEdit: allowSwitchingTemplate && canCreateTemplates && editorSettings.supportsTemplateMode && !!_currentTemplateId, currentTemplateId: _currentTemplateId, onNavigateToEntityRecord: editorSettings.onNavigateToEntityRecord, getEditorSettings: select(store_store).getEditorSettings }; }, [allowSwitchingTemplate]); const options = (0,external_wp_element_namespaceObject.useMemo)(() => Object.entries({ ...availableTemplates, ...Object.fromEntries((fetchedTemplates !== null && fetchedTemplates !== void 0 ? fetchedTemplates : []).map(({ slug, title }) => [slug, title.rendered])) }).map(([slug, title]) => ({ value: slug, label: title })), [availableTemplates, fetchedTemplates]); const selectedOption = (_options$find = options.find(option => option.value === selectedTemplateSlug)) !== null && _options$find !== void 0 ? _options$find : options.find(option => !option.value); // The default option has '' value. const { editPost } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); const { createSuccessNotice } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); const [isCreateModalOpen, setIsCreateModalOpen] = (0,external_wp_element_namespaceObject.useState)(false); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "editor-post-template__classic-theme-dropdown", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalInspectorPopoverHeader, { title: (0,external_wp_i18n_namespaceObject.__)('Template'), help: (0,external_wp_i18n_namespaceObject.__)('Templates define the way content is displayed when viewing your site.'), actions: canCreate ? [{ icon: add_template, label: (0,external_wp_i18n_namespaceObject.__)('Add template'), onClick: () => setIsCreateModalOpen(true) }] : [], onClose: onClose }), !allowSwitchingTemplate ? /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Notice, { status: "warning", isDismissible: false, children: (0,external_wp_i18n_namespaceObject.__)('The posts page template cannot be changed.') }) : /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.SelectControl, { __next40pxDefaultSize: true, __nextHasNoMarginBottom: true, hideLabelFromVision: true, label: (0,external_wp_i18n_namespaceObject.__)('Template'), value: (_selectedOption$value = selectedOption?.value) !== null && _selectedOption$value !== void 0 ? _selectedOption$value : '', options: options, onChange: slug => editPost({ template: slug || '' }) }), canEdit && onNavigateToEntityRecord && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { variant: "link", onClick: () => { onNavigateToEntityRecord({ postId: currentTemplateId, postType: 'wp_template' }); onClose(); createSuccessNotice((0,external_wp_i18n_namespaceObject.__)('Editing template. Changes made here affect all posts and pages that use the template.'), { type: 'snackbar', actions: [{ label: (0,external_wp_i18n_namespaceObject.__)('Go back'), onClick: () => getEditorSettings().onNavigateToPreviousEntityRecord() }] }); }, children: (0,external_wp_i18n_namespaceObject.__)('Edit template') }) }), isCreateModalOpen && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(CreateNewTemplateModal, { onClose: () => setIsCreateModalOpen(false) })] }); } function ClassicThemeControl() { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Dropdown, { popoverProps: POPOVER_PROPS, focusOnMount: true, renderToggle: ({ isOpen, onToggle }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostTemplateToggle, { isOpen: isOpen, onClick: onToggle }), renderContent: ({ onClose }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostTemplateDropdownContent, { onClose: onClose }) }); } /** * Provides a dropdown menu for selecting and managing post templates. * * The dropdown menu includes a button for toggling the menu, a list of available templates, and options for creating and editing templates. * * @return {JSX.Element} The rendered ClassicThemeControl component. */ /* harmony default export */ const classic_theme = (ClassicThemeControl); ;// CONCATENATED MODULE: external ["wp","warning"] const external_wp_warning_namespaceObject = window["wp"]["warning"]; var external_wp_warning_default = /*#__PURE__*/__webpack_require__.n(external_wp_warning_namespaceObject); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/preferences-modal/enable-panel.js /** * WordPress dependencies */ /** * Internal dependencies */ const { PreferenceBaseOption } = unlock(external_wp_preferences_namespaceObject.privateApis); /* harmony default export */ const enable_panel = ((0,external_wp_compose_namespaceObject.compose)((0,external_wp_data_namespaceObject.withSelect)((select, { panelName }) => { const { isEditorPanelEnabled, isEditorPanelRemoved } = select(store_store); return { isRemoved: isEditorPanelRemoved(panelName), isChecked: isEditorPanelEnabled(panelName) }; }), (0,external_wp_compose_namespaceObject.ifCondition)(({ isRemoved }) => !isRemoved), (0,external_wp_data_namespaceObject.withDispatch)((dispatch, { panelName }) => ({ onChange: () => dispatch(store_store).toggleEditorPanelEnabled(panelName) })))(PreferenceBaseOption)); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/preferences-modal/enable-plugin-document-setting-panel.js /** * WordPress dependencies */ /** * Internal dependencies */ const { Fill, Slot } = (0,external_wp_components_namespaceObject.createSlotFill)('EnablePluginDocumentSettingPanelOption'); const EnablePluginDocumentSettingPanelOption = ({ label, panelName }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(Fill, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(enable_panel, { label: label, panelName: panelName }) }); EnablePluginDocumentSettingPanelOption.Slot = Slot; /* harmony default export */ const enable_plugin_document_setting_panel = (EnablePluginDocumentSettingPanelOption); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/plugin-document-setting-panel/index.js /** * WordPress dependencies */ /** * Internal dependencies */ const { Fill: plugin_document_setting_panel_Fill, Slot: plugin_document_setting_panel_Slot } = (0,external_wp_components_namespaceObject.createSlotFill)('PluginDocumentSettingPanel'); /** * Renders items below the Status & Availability panel in the Document Sidebar. * * @param {Object} props Component properties. * @param {string} props.name Required. A machine-friendly name for the panel. * @param {string} [props.className] An optional class name added to the row. * @param {string} [props.title] The title of the panel * @param {WPBlockTypeIconRender} [props.icon=inherits from the plugin] The [Dashicon](https://developer.wordpress.org/resource/dashicons/) icon slug string, or an SVG WP element, to be rendered when the sidebar is pinned to toolbar. * @param {Element} props.children Children to be rendered * * @example * ```js * // Using ES5 syntax * var el = React.createElement; * var __ = wp.i18n.__; * var registerPlugin = wp.plugins.registerPlugin; * var PluginDocumentSettingPanel = wp.editor.PluginDocumentSettingPanel; * * function MyDocumentSettingPlugin() { * return el( * PluginDocumentSettingPanel, * { * className: 'my-document-setting-plugin', * title: 'My Panel', * name: 'my-panel', * }, * __( 'My Document Setting Panel' ) * ); * } * * registerPlugin( 'my-document-setting-plugin', { * render: MyDocumentSettingPlugin * } ); * ``` * * @example * ```jsx * // Using ESNext syntax * import { registerPlugin } from '@wordpress/plugins'; * import { PluginDocumentSettingPanel } from '@wordpress/editor'; * * const MyDocumentSettingTest = () => ( * <PluginDocumentSettingPanel className="my-document-setting-plugin" title="My Panel" name="my-panel"> * <p>My Document Setting Panel</p> * </PluginDocumentSettingPanel> * ); * * registerPlugin( 'document-setting-test', { render: MyDocumentSettingTest } ); * ``` * * @return {Component} The component to be rendered. */ const PluginDocumentSettingPanel = ({ name, className, title, icon, children }) => { const { name: pluginName } = (0,external_wp_plugins_namespaceObject.usePluginContext)(); const panelName = `${pluginName}/${name}`; const { opened, isEnabled } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { isEditorPanelOpened, isEditorPanelEnabled } = select(store_store); return { opened: isEditorPanelOpened(panelName), isEnabled: isEditorPanelEnabled(panelName) }; }, [panelName]); const { toggleEditorPanelOpened } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); if (undefined === name) { true ? external_wp_warning_default()('PluginDocumentSettingPanel requires a name property.') : 0; } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(enable_plugin_document_setting_panel, { label: title, panelName: panelName }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(plugin_document_setting_panel_Fill, { children: isEnabled && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelBody, { className: className, title: title, icon: icon, opened: opened, onToggle: () => toggleEditorPanelOpened(panelName), children: children }) })] }); }; PluginDocumentSettingPanel.Slot = plugin_document_setting_panel_Slot; /* harmony default export */ const plugin_document_setting_panel = (PluginDocumentSettingPanel); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-settings-menu/plugin-block-settings-menu-item.js /** * WordPress dependencies */ const isEverySelectedBlockAllowed = (selected, allowed) => selected.filter(id => !allowed.includes(id)).length === 0; /** * Plugins may want to add an item to the menu either for every block * or only for the specific ones provided in the `allowedBlocks` component property. * * If there are multiple blocks selected the item will be rendered if every block * is of one allowed type (not necessarily the same). * * @param {string[]} selectedBlocks Array containing the names of the blocks selected * @param {string[]} allowedBlocks Array containing the names of the blocks allowed * @return {boolean} Whether the item will be rendered or not. */ const shouldRenderItem = (selectedBlocks, allowedBlocks) => !Array.isArray(allowedBlocks) || isEverySelectedBlockAllowed(selectedBlocks, allowedBlocks); /** * Renders a new item in the block settings menu. * * @param {Object} props Component props. * @param {Array} [props.allowedBlocks] An array containing a list of block names for which the item should be shown. If not present, it'll be rendered for any block. If multiple blocks are selected, it'll be shown if and only if all of them are in the allowed list. * @param {WPBlockTypeIconRender} [props.icon] The [Dashicon](https://developer.wordpress.org/resource/dashicons/) icon slug string, or an SVG WP element. * @param {string} props.label The menu item text. * @param {Function} props.onClick Callback function to be executed when the user click the menu item. * @param {boolean} [props.small] Whether to render the label or not. * @param {string} [props.role] The ARIA role for the menu item. * * @example * ```js * // Using ES5 syntax * var __ = wp.i18n.__; * var PluginBlockSettingsMenuItem = wp.editor.PluginBlockSettingsMenuItem; * * function doOnClick(){ * // To be called when the user clicks the menu item. * } * * function MyPluginBlockSettingsMenuItem() { * return React.createElement( * PluginBlockSettingsMenuItem, * { * allowedBlocks: [ 'core/paragraph' ], * icon: 'dashicon-name', * label: __( 'Menu item text' ), * onClick: doOnClick, * } * ); * } * ``` * * @example * ```jsx * // Using ESNext syntax * import { __ } from '@wordpress/i18n'; * import { PluginBlockSettingsMenuItem } from '@wordpress/editor'; * * const doOnClick = ( ) => { * // To be called when the user clicks the menu item. * }; * * const MyPluginBlockSettingsMenuItem = () => ( * <PluginBlockSettingsMenuItem * allowedBlocks={ [ 'core/paragraph' ] } * icon='dashicon-name' * label={ __( 'Menu item text' ) } * onClick={ doOnClick } /> * ); * ``` * * @return {Component} The component to be rendered. */ const PluginBlockSettingsMenuItem = ({ allowedBlocks, icon, label, onClick, small, role }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.BlockSettingsMenuControls, { children: ({ selectedBlocks, onClose }) => { if (!shouldRenderItem(selectedBlocks, allowedBlocks)) { return null; } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItem, { onClick: (0,external_wp_compose_namespaceObject.compose)(onClick, onClose), icon: icon, label: small ? label : undefined, role: role, children: !small && label }); } }); /* harmony default export */ const plugin_block_settings_menu_item = (PluginBlockSettingsMenuItem); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/plugin-more-menu-item/index.js /** * WordPress dependencies */ /** * Renders a menu item in `Plugins` group in `More Menu` drop down, and can be used to as a button or link depending on the props provided. * The text within the component appears as the menu item label. * * @param {Object} props Component properties. * @param {string} [props.href] When `href` is provided then the menu item is represented as an anchor rather than button. It corresponds to the `href` attribute of the anchor. * @param {WPBlockTypeIconRender} [props.icon=inherits from the plugin] The [Dashicon](https://developer.wordpress.org/resource/dashicons/) icon slug string, or an SVG WP element, to be rendered to the left of the menu item label. * @param {Function} [props.onClick=noop] The callback function to be executed when the user clicks the menu item. * @param {...*} [props.other] Any additional props are passed through to the underlying [Button](/packages/components/src/button/README.md) component. * * @example * ```js * // Using ES5 syntax * var __ = wp.i18n.__; * var PluginMoreMenuItem = wp.editor.PluginMoreMenuItem; * var moreIcon = wp.element.createElement( 'svg' ); //... svg element. * * function onButtonClick() { * alert( 'Button clicked.' ); * } * * function MyButtonMoreMenuItem() { * return wp.element.createElement( * PluginMoreMenuItem, * { * icon: moreIcon, * onClick: onButtonClick, * }, * __( 'My button title' ) * ); * } * ``` * * @example * ```jsx * // Using ESNext syntax * import { __ } from '@wordpress/i18n'; * import { PluginMoreMenuItem } from '@wordpress/editor'; * import { more } from '@wordpress/icons'; * * function onButtonClick() { * alert( 'Button clicked.' ); * } * * const MyButtonMoreMenuItem = () => ( * <PluginMoreMenuItem * icon={ more } * onClick={ onButtonClick } * > * { __( 'My button title' ) } * </PluginMoreMenuItem> * ); * ``` * * @return {Component} The component to be rendered. */ /* harmony default export */ const plugin_more_menu_item = ((0,external_wp_compose_namespaceObject.compose)((0,external_wp_plugins_namespaceObject.withPluginContext)((context, ownProps) => { var _ownProps$as; return { as: (_ownProps$as = ownProps.as) !== null && _ownProps$as !== void 0 ? _ownProps$as : external_wp_components_namespaceObject.MenuItem, icon: ownProps.icon || context.icon, name: 'core/plugin-more-menu' }; }))(action_item)); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/plugin-post-publish-panel/index.js /** * WordPress dependencies */ const { Fill: plugin_post_publish_panel_Fill, Slot: plugin_post_publish_panel_Slot } = (0,external_wp_components_namespaceObject.createSlotFill)('PluginPostPublishPanel'); /** * Renders provided content to the post-publish panel in the publish flow * (side panel that opens after a user publishes the post). * * @param {Object} props Component properties. * @param {string} [props.className] An optional class name added to the panel. * @param {string} [props.title] Title displayed at the top of the panel. * @param {boolean} [props.initialOpen=false] Whether to have the panel initially opened. When no title is provided it is always opened. * @param {WPBlockTypeIconRender} [props.icon=inherits from the plugin] The [Dashicon](https://developer.wordpress.org/resource/dashicons/) icon slug string, or an SVG WP element, to be rendered when the sidebar is pinned to toolbar. * @param {Element} props.children Children to be rendered * * @example * ```jsx * // Using ESNext syntax * import { __ } from '@wordpress/i18n'; * import { PluginPostPublishPanel } from '@wordpress/editor'; * * const MyPluginPostPublishPanel = () => ( * <PluginPostPublishPanel * className="my-plugin-post-publish-panel" * title={ __( 'My panel title' ) } * initialOpen={ true } * > * { __( 'My panel content' ) } * </PluginPostPublishPanel> * ); * ``` * * @return {Component} The component to be rendered. */ const PluginPostPublishPanel = ({ children, className, title, initialOpen = false, icon }) => { const { icon: pluginIcon } = (0,external_wp_plugins_namespaceObject.usePluginContext)(); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(plugin_post_publish_panel_Fill, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelBody, { className: className, initialOpen: initialOpen || !title, title: title, icon: icon !== null && icon !== void 0 ? icon : pluginIcon, children: children }) }); }; PluginPostPublishPanel.Slot = plugin_post_publish_panel_Slot; /* harmony default export */ const plugin_post_publish_panel = (PluginPostPublishPanel); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/plugin-post-status-info/index.js /** * Defines as extensibility slot for the Summary panel. */ /** * WordPress dependencies */ const { Fill: plugin_post_status_info_Fill, Slot: plugin_post_status_info_Slot } = (0,external_wp_components_namespaceObject.createSlotFill)('PluginPostStatusInfo'); /** * Renders a row in the Summary panel of the Document sidebar. * It should be noted that this is named and implemented around the function it serves * and not its location, which may change in future iterations. * * @param {Object} props Component properties. * @param {string} [props.className] An optional class name added to the row. * @param {Element} props.children Children to be rendered. * * @example * ```js * // Using ES5 syntax * var __ = wp.i18n.__; * var PluginPostStatusInfo = wp.editor.PluginPostStatusInfo; * * function MyPluginPostStatusInfo() { * return React.createElement( * PluginPostStatusInfo, * { * className: 'my-plugin-post-status-info', * }, * __( 'My post status info' ) * ) * } * ``` * * @example * ```jsx * // Using ESNext syntax * import { __ } from '@wordpress/i18n'; * import { PluginPostStatusInfo } from '@wordpress/editor'; * * const MyPluginPostStatusInfo = () => ( * <PluginPostStatusInfo * className="my-plugin-post-status-info" * > * { __( 'My post status info' ) } * </PluginPostStatusInfo> * ); * ``` * * @return {Component} The component to be rendered. */ const PluginPostStatusInfo = ({ children, className }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(plugin_post_status_info_Fill, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelRow, { className: className, children: children }) }); PluginPostStatusInfo.Slot = plugin_post_status_info_Slot; /* harmony default export */ const plugin_post_status_info = (PluginPostStatusInfo); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/plugin-pre-publish-panel/index.js /** * WordPress dependencies */ const { Fill: plugin_pre_publish_panel_Fill, Slot: plugin_pre_publish_panel_Slot } = (0,external_wp_components_namespaceObject.createSlotFill)('PluginPrePublishPanel'); /** * Renders provided content to the pre-publish side panel in the publish flow * (side panel that opens when a user first pushes "Publish" from the main editor). * * @param {Object} props Component props. * @param {string} [props.className] An optional class name added to the panel. * @param {string} [props.title] Title displayed at the top of the panel. * @param {boolean} [props.initialOpen=false] Whether to have the panel initially opened. * When no title is provided it is always opened. * @param {WPBlockTypeIconRender} [props.icon=inherits from the plugin] The [Dashicon](https://developer.wordpress.org/resource/dashicons/) * icon slug string, or an SVG WP element, to be rendered when * the sidebar is pinned to toolbar. * @param {Element} props.children Children to be rendered * * @example * ```jsx * // Using ESNext syntax * import { __ } from '@wordpress/i18n'; * import { PluginPrePublishPanel } from '@wordpress/editor'; * * const MyPluginPrePublishPanel = () => ( * <PluginPrePublishPanel * className="my-plugin-pre-publish-panel" * title={ __( 'My panel title' ) } * initialOpen={ true } * > * { __( 'My panel content' ) } * </PluginPrePublishPanel> * ); * ``` * * @return {Component} The component to be rendered. */ const PluginPrePublishPanel = ({ children, className, title, initialOpen = false, icon }) => { const { icon: pluginIcon } = (0,external_wp_plugins_namespaceObject.usePluginContext)(); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(plugin_pre_publish_panel_Fill, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelBody, { className: className, initialOpen: initialOpen || !title, title: title, icon: icon !== null && icon !== void 0 ? icon : pluginIcon, children: children }) }); }; PluginPrePublishPanel.Slot = plugin_pre_publish_panel_Slot; /* harmony default export */ const plugin_pre_publish_panel = (PluginPrePublishPanel); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/plugin-sidebar/index.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Renders a sidebar when activated. The contents within the `PluginSidebar` will appear as content within the sidebar. * It also automatically renders a corresponding `PluginSidebarMenuItem` component when `isPinnable` flag is set to `true`. * If you wish to display the sidebar, you can with use the `PluginSidebarMoreMenuItem` component or the `wp.data.dispatch` API: * * ```js * wp.data.dispatch( 'core/edit-post' ).openGeneralSidebar( 'plugin-name/sidebar-name' ); * ``` * * @see PluginSidebarMoreMenuItem * * @param {Object} props Element props. * @param {string} props.name A string identifying the sidebar. Must be unique for every sidebar registered within the scope of your plugin. * @param {string} [props.className] An optional class name added to the sidebar body. * @param {string} props.title Title displayed at the top of the sidebar. * @param {boolean} [props.isPinnable=true] Whether to allow to pin sidebar to the toolbar. When set to `true` it also automatically renders a corresponding menu item. * @param {WPBlockTypeIconRender} [props.icon=inherits from the plugin] The [Dashicon](https://developer.wordpress.org/resource/dashicons/) icon slug string, or an SVG WP element, to be rendered when the sidebar is pinned to toolbar. * * @example * ```js * // Using ES5 syntax * var __ = wp.i18n.__; * var el = React.createElement; * var PanelBody = wp.components.PanelBody; * var PluginSidebar = wp.editor.PluginSidebar; * var moreIcon = React.createElement( 'svg' ); //... svg element. * * function MyPluginSidebar() { * return el( * PluginSidebar, * { * name: 'my-sidebar', * title: 'My sidebar title', * icon: moreIcon, * }, * el( * PanelBody, * {}, * __( 'My sidebar content' ) * ) * ); * } * ``` * * @example * ```jsx * // Using ESNext syntax * import { __ } from '@wordpress/i18n'; * import { PanelBody } from '@wordpress/components'; * import { PluginSidebar } from '@wordpress/editor'; * import { more } from '@wordpress/icons'; * * const MyPluginSidebar = () => ( * <PluginSidebar * name="my-sidebar" * title="My sidebar title" * icon={ more } * > * <PanelBody> * { __( 'My sidebar content' ) } * </PanelBody> * </PluginSidebar> * ); * ``` */ function PluginSidebar({ className, ...props }) { const { postTitle, shortcut } = (0,external_wp_data_namespaceObject.useSelect)(select => { return { postTitle: select(store_store).getEditedPostAttribute('title'), shortcut: select(external_wp_keyboardShortcuts_namespaceObject.store).getShortcutRepresentation('core/editor/toggle-sidebar') }; }, []); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(complementary_area, { panelClassName: className, className: "editor-sidebar", smallScreenTitle: postTitle || (0,external_wp_i18n_namespaceObject.__)('(no title)'), scope: "core", toggleShortcut: shortcut, ...props }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/plugin-sidebar-more-menu-item/index.js /** * WordPress dependencies */ /** * Renders a menu item in `Plugins` group in `More Menu` drop down, * and can be used to activate the corresponding `PluginSidebar` component. * The text within the component appears as the menu item label. * * @param {Object} props Component props. * @param {string} props.target A string identifying the target sidebar you wish to be activated by this menu item. Must be the same as the `name` prop you have given to that sidebar. * @param {WPBlockTypeIconRender} [props.icon=inherits from the plugin] The [Dashicon](https://developer.wordpress.org/resource/dashicons/) icon slug string, or an SVG WP element, to be rendered to the left of the menu item label. * * @example * ```js * // Using ES5 syntax * var __ = wp.i18n.__; * var PluginSidebarMoreMenuItem = wp.editor.PluginSidebarMoreMenuItem; * var moreIcon = React.createElement( 'svg' ); //... svg element. * * function MySidebarMoreMenuItem() { * return React.createElement( * PluginSidebarMoreMenuItem, * { * target: 'my-sidebar', * icon: moreIcon, * }, * __( 'My sidebar title' ) * ) * } * ``` * * @example * ```jsx * // Using ESNext syntax * import { __ } from '@wordpress/i18n'; * import { PluginSidebarMoreMenuItem } from '@wordpress/editor'; * import { more } from '@wordpress/icons'; * * const MySidebarMoreMenuItem = () => ( * <PluginSidebarMoreMenuItem * target="my-sidebar" * icon={ more } * > * { __( 'My sidebar title' ) } * </PluginSidebarMoreMenuItem> * ); * ``` * * @return {Component} The component to be rendered. */ function PluginSidebarMoreMenuItem(props) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ComplementaryAreaMoreMenuItem // Menu item is marked with unstable prop for backward compatibility. // @see https://github.com/WordPress/gutenberg/issues/14457 , { __unstableExplicitMenuItem: true, scope: "core", ...props }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-template/swap-template-button.js /** * WordPress dependencies */ /** * Internal dependencies */ function SwapTemplateButton({ onClick }) { const [showModal, setShowModal] = (0,external_wp_element_namespaceObject.useState)(false); const { postType, postId } = useEditedPostContext(); const availableTemplates = useAvailableTemplates(postType); const { editEntityRecord } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); if (!availableTemplates?.length) { return null; } const onTemplateSelect = async template => { editEntityRecord('postType', postType, postId, { template: template.name }, { undoIgnore: true }); setShowModal(false); // Close the template suggestions modal first. onClick(); }; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItem, { onClick: () => setShowModal(true), children: (0,external_wp_i18n_namespaceObject.__)('Swap template') }), showModal && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Modal, { title: (0,external_wp_i18n_namespaceObject.__)('Choose a template'), onRequestClose: () => setShowModal(false), overlayClassName: "editor-post-template__swap-template-modal", isFullScreen: true, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: "editor-post-template__swap-template-modal-content", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TemplatesList, { postType: postType, onSelect: onTemplateSelect }) }) })] }); } function TemplatesList({ postType, onSelect }) { const availableTemplates = useAvailableTemplates(postType); const templatesAsPatterns = (0,external_wp_element_namespaceObject.useMemo)(() => availableTemplates.map(template => ({ name: template.slug, blocks: (0,external_wp_blocks_namespaceObject.parse)(template.content.raw), title: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(template.title.rendered), id: template.id })), [availableTemplates]); const shownTemplates = (0,external_wp_compose_namespaceObject.useAsyncList)(templatesAsPatterns); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalBlockPatternsList, { label: (0,external_wp_i18n_namespaceObject.__)('Templates'), blockPatterns: templatesAsPatterns, shownPatterns: shownTemplates, onClickPattern: onSelect }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-template/reset-default-template.js /** * WordPress dependencies */ /** * Internal dependencies */ function ResetDefaultTemplate({ onClick }) { const currentTemplateSlug = useCurrentTemplateSlug(); const allowSwitchingTemplate = useAllowSwitchingTemplates(); const { postType, postId } = useEditedPostContext(); const { editEntityRecord } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); // The default template in a post is indicated by an empty string. if (!currentTemplateSlug || !allowSwitchingTemplate) { return null; } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItem, { onClick: () => { editEntityRecord('postType', postType, postId, { template: '' }, { undoIgnore: true }); onClick(); }, children: (0,external_wp_i18n_namespaceObject.__)('Use default template') }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-template/create-new-template.js /** * WordPress dependencies */ /** * Internal dependencies */ function CreateNewTemplate({ onClick }) { const { canCreateTemplates } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { canUser } = select(external_wp_coreData_namespaceObject.store); return { canCreateTemplates: canUser('create', 'templates') }; }, []); const [isCreateModalOpen, setIsCreateModalOpen] = (0,external_wp_element_namespaceObject.useState)(false); const allowSwitchingTemplate = useAllowSwitchingTemplates(); // The default template in a post is indicated by an empty string. if (!canCreateTemplates || !allowSwitchingTemplate) { return null; } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItem, { onClick: () => { setIsCreateModalOpen(true); }, children: (0,external_wp_i18n_namespaceObject.__)('Create new template') }), isCreateModalOpen && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(CreateNewTemplateModal, { onClose: () => { setIsCreateModalOpen(false); onClick(); } })] }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-template/block-theme.js /** * WordPress dependencies */ /** * Internal dependencies */ const block_theme_POPOVER_PROPS = { className: 'editor-post-template__dropdown', placement: 'bottom-start' }; function BlockThemeControl({ id }) { const { isTemplateHidden, onNavigateToEntityRecord, getEditorSettings, hasGoBack } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { getRenderingMode, getEditorSettings: _getEditorSettings } = unlock(select(store_store)); const editorSettings = _getEditorSettings(); return { isTemplateHidden: getRenderingMode() === 'post-only', onNavigateToEntityRecord: editorSettings.onNavigateToEntityRecord, getEditorSettings: _getEditorSettings, hasGoBack: editorSettings.hasOwnProperty('onNavigateToPreviousEntityRecord') }; }, []); const { editedRecord: template, hasResolved } = (0,external_wp_coreData_namespaceObject.useEntityRecord)('postType', 'wp_template', id); const { createSuccessNotice } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); const { setRenderingMode } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); const canCreateTemplate = (0,external_wp_data_namespaceObject.useSelect)(select => { var _select$canUser; return (_select$canUser = select(external_wp_coreData_namespaceObject.store).canUser('create', 'templates')) !== null && _select$canUser !== void 0 ? _select$canUser : false; }); if (!hasResolved) { return null; } // The site editor does not have a `onNavigateToPreviousEntityRecord` setting as it uses its own routing // and assigns its own backlink to focusMode pages. const notificationAction = hasGoBack ? [{ label: (0,external_wp_i18n_namespaceObject.__)('Go back'), onClick: () => getEditorSettings().onNavigateToPreviousEntityRecord() }] : undefined; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.DropdownMenu, { popoverProps: block_theme_POPOVER_PROPS, focusOnMount: true, toggleProps: { size: 'compact', variant: 'tertiary', tooltipPosition: 'middle left' }, label: (0,external_wp_i18n_namespaceObject.__)('Template options'), text: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(template.title), icon: null, children: ({ onClose }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.MenuGroup, { children: [canCreateTemplate && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItem, { onClick: () => { onNavigateToEntityRecord({ postId: template.id, postType: 'wp_template' }); onClose(); createSuccessNotice((0,external_wp_i18n_namespaceObject.__)('Editing template. Changes made here affect all posts and pages that use the template.'), { type: 'snackbar', actions: notificationAction }); }, children: (0,external_wp_i18n_namespaceObject.__)('Edit template') }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(SwapTemplateButton, { onClick: onClose }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ResetDefaultTemplate, { onClick: onClose }), canCreateTemplate && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(CreateNewTemplate, { onClick: onClose })] }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuGroup, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItem, { icon: !isTemplateHidden ? library_check : undefined, isSelected: !isTemplateHidden, role: "menuitemcheckbox", onClick: () => { setRenderingMode(isTemplateHidden ? 'template-locked' : 'post-only'); }, children: (0,external_wp_i18n_namespaceObject.__)('Show template') }) })] }) }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-template/panel.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Displays the template controls based on the current editor settings and user permissions. * * @return {JSX.Element|null} The rendered PostTemplatePanel component. */ function PostTemplatePanel() { const { templateId, isBlockTheme } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { getCurrentTemplateId, getEditorSettings } = select(store_store); return { templateId: getCurrentTemplateId(), isBlockTheme: getEditorSettings().__unstableIsBlockBasedTheme }; }, []); const isVisible = (0,external_wp_data_namespaceObject.useSelect)(select => { var _select$canUser; const postTypeSlug = select(store_store).getCurrentPostType(); const postType = select(external_wp_coreData_namespaceObject.store).getPostType(postTypeSlug); if (!postType?.viewable) { return false; } const settings = select(store_store).getEditorSettings(); const hasTemplates = !!settings.availableTemplates && Object.keys(settings.availableTemplates).length > 0; if (hasTemplates) { return true; } if (!settings.supportsTemplateMode) { return false; } const canCreateTemplates = (_select$canUser = select(external_wp_coreData_namespaceObject.store).canUser('create', 'templates')) !== null && _select$canUser !== void 0 ? _select$canUser : false; return canCreateTemplates; }, []); const canViewTemplates = (0,external_wp_data_namespaceObject.useSelect)(select => { var _select$canUser2; return (_select$canUser2 = select(external_wp_coreData_namespaceObject.store).canUser('read', 'templates')) !== null && _select$canUser2 !== void 0 ? _select$canUser2 : false; }, []); if ((!isBlockTheme || !canViewTemplates) && isVisible) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { label: (0,external_wp_i18n_namespaceObject.__)('Template'), children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(classic_theme, {}) }); } if (isBlockTheme && !!templateId) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { label: (0,external_wp_i18n_namespaceObject.__)('Template'), children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(BlockThemeControl, { id: templateId }) }); } return null; } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-author/constants.js const BASE_QUERY = { _fields: 'id,name', context: 'view' // Allows non-admins to perform requests. }; const AUTHORS_QUERY = { who: 'authors', per_page: 50, ...BASE_QUERY }; ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-author/hook.js /** * WordPress dependencies */ /** * Internal dependencies */ function useAuthorsQuery(search) { const { authorId, authors, postAuthor } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { getUser, getUsers } = select(external_wp_coreData_namespaceObject.store); const { getEditedPostAttribute } = select(store_store); const _authorId = getEditedPostAttribute('author'); const query = { ...AUTHORS_QUERY }; if (search) { query.search = search; } return { authorId: _authorId, authors: getUsers(query), postAuthor: getUser(_authorId, BASE_QUERY) }; }, [search]); const authorOptions = (0,external_wp_element_namespaceObject.useMemo)(() => { const fetchedAuthors = (authors !== null && authors !== void 0 ? authors : []).map(author => { return { value: author.id, label: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(author.name) }; }); // Ensure the current author is included in the dropdown list. const foundAuthor = fetchedAuthors.findIndex(({ value }) => postAuthor?.id === value); if (foundAuthor < 0 && postAuthor) { return [{ value: postAuthor.id, label: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(postAuthor.name) }, ...fetchedAuthors]; } return fetchedAuthors; }, [authors, postAuthor]); return { authorId, authorOptions, postAuthor }; } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-author/combobox.js /** * WordPress dependencies */ /** * Internal dependencies */ function PostAuthorCombobox() { const [fieldValue, setFieldValue] = (0,external_wp_element_namespaceObject.useState)(); const { editPost } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); const { authorId, authorOptions } = useAuthorsQuery(fieldValue); /** * Handle author selection. * * @param {number} postAuthorId The selected Author. */ const handleSelect = postAuthorId => { if (!postAuthorId) { return; } editPost({ author: postAuthorId }); }; /** * Handle user input. * * @param {string} inputValue The current value of the input field. */ const handleKeydown = inputValue => { setFieldValue(inputValue); }; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ComboboxControl, { __nextHasNoMarginBottom: true, __next40pxDefaultSize: true, label: (0,external_wp_i18n_namespaceObject.__)('Author'), options: authorOptions, value: authorId, onFilterValueChange: (0,external_wp_compose_namespaceObject.debounce)(handleKeydown, 300), onChange: handleSelect, allowReset: false, hideLabelFromVision: true }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-author/select.js /** * WordPress dependencies */ /** * Internal dependencies */ function PostAuthorSelect() { const { editPost } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); const { authorId, authorOptions } = useAuthorsQuery(); const setAuthorId = value => { const author = Number(value); editPost({ author }); }; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.SelectControl, { __next40pxDefaultSize: true, __nextHasNoMarginBottom: true, className: "post-author-selector", label: (0,external_wp_i18n_namespaceObject.__)('Author'), options: authorOptions, onChange: setAuthorId, value: authorId, hideLabelFromVision: true }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-author/index.js /** * WordPress dependencies */ /** * Internal dependencies */ const minimumUsersForCombobox = 25; /** * Renders the component for selecting the post author. * * @return {Component} The component to be rendered. */ function PostAuthor() { const showCombobox = (0,external_wp_data_namespaceObject.useSelect)(select => { const authors = select(external_wp_coreData_namespaceObject.store).getUsers(AUTHORS_QUERY); return authors?.length >= minimumUsersForCombobox; }, []); if (showCombobox) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostAuthorCombobox, {}); } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostAuthorSelect, {}); } /* harmony default export */ const post_author = (PostAuthor); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-author/check.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Wrapper component that renders its children only if the post type supports the author. * * @param {Object} props The component props. * @param {Element} props.children Children to be rendered. * * @return {Component|null} The component to be rendered. Return `null` if the post type doesn't * supports the author or if there are no authors available. */ function PostAuthorCheck({ children }) { const { hasAssignAuthorAction, hasAuthors } = (0,external_wp_data_namespaceObject.useSelect)(select => { var _post$_links$wpActio; const post = select(store_store).getCurrentPost(); const authors = select(external_wp_coreData_namespaceObject.store).getUsers(AUTHORS_QUERY); return { hasAssignAuthorAction: (_post$_links$wpActio = post._links?.['wp:action-assign-author']) !== null && _post$_links$wpActio !== void 0 ? _post$_links$wpActio : false, hasAuthors: authors?.length >= 1 }; }, []); if (!hasAssignAuthorAction || !hasAuthors) { return null; } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_type_support_check, { supportKeys: "author", children: children }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-author/panel.js /** * WordPress dependencies */ /** * Internal dependencies */ function PostAuthorToggle({ isOpen, onClick }) { const { postAuthor } = useAuthorsQuery(); const authorName = postAuthor?.name || ''; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { size: "compact", className: "editor-post-author__panel-toggle", variant: "tertiary", "aria-expanded": isOpen // translators: %s: Current post link. , "aria-label": (0,external_wp_i18n_namespaceObject.sprintf)((0,external_wp_i18n_namespaceObject.__)('Change author: %s'), authorName), onClick: onClick, children: authorName }); } /** * Renders the Post Author Panel component. * * @return {Component} The component to be rendered. */ function panel_PostAuthor() { // 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); // Memoize popoverProps to avoid returning a new object every time. const popoverProps = (0,external_wp_element_namespaceObject.useMemo)(() => ({ // Anchor the popover to the middle of the entire row so that it doesn't // move around when the label changes. anchor: popoverAnchor, placement: 'left-start', offset: 36, shift: true }), [popoverAnchor]); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostAuthorCheck, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { label: (0,external_wp_i18n_namespaceObject.__)('Author'), ref: setPopoverAnchor, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Dropdown, { popoverProps: popoverProps, contentClassName: "editor-post-author__panel-dialog", focusOnMount: true, renderToggle: ({ isOpen, onToggle }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostAuthorToggle, { isOpen: isOpen, onClick: onToggle }), renderContent: ({ onClose }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "editor-post-author", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalInspectorPopoverHeader, { title: (0,external_wp_i18n_namespaceObject.__)('Author'), onClose: onClose }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_author, { onClose: onClose })] }) }) }) }); } /* harmony default export */ const panel = (panel_PostAuthor); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-comments/index.js /** * WordPress dependencies */ /** * Internal dependencies */ const COMMENT_OPTIONS = [{ label: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [(0,external_wp_i18n_namespaceObject.__)('Open'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { variant: "muted", size: 12, children: (0,external_wp_i18n_namespaceObject.__)('Visitors can add new comments and replies.') })] }), value: 'open' }, { label: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [(0,external_wp_i18n_namespaceObject.__)('Closed'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { variant: "muted", size: 12, children: (0,external_wp_i18n_namespaceObject.__)('Visitors cannot add new comments or replies.') }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { variant: "muted", size: 12, children: (0,external_wp_i18n_namespaceObject.__)('Existing comments remain visible.') })] }), value: 'closed' }]; function PostComments() { const commentStatus = (0,external_wp_data_namespaceObject.useSelect)(select => { var _select$getEditedPost; return (_select$getEditedPost = select(store_store).getEditedPostAttribute('comment_status')) !== null && _select$getEditedPost !== void 0 ? _select$getEditedPost : 'open'; }, []); const { editPost } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); const handleStatus = newCommentStatus => editPost({ comment_status: newCommentStatus }); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("form", { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalVStack, { spacing: 4, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.RadioControl, { className: "editor-change-status__options", hideLabelFromVision: true, label: (0,external_wp_i18n_namespaceObject.__)('Comment status'), options: COMMENT_OPTIONS, onChange: handleStatus, selected: commentStatus }) }) }); } /** * A form for managing comment status. * * @return {JSX.Element} The rendered PostComments component. */ /* harmony default export */ const post_comments = (PostComments); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-pingbacks/index.js /** * WordPress dependencies */ /** * Internal dependencies */ function PostPingbacks() { const pingStatus = (0,external_wp_data_namespaceObject.useSelect)(select => { var _select$getEditedPost; return (_select$getEditedPost = select(store_store).getEditedPostAttribute('ping_status')) !== null && _select$getEditedPost !== void 0 ? _select$getEditedPost : 'open'; }, []); const { editPost } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); const onTogglePingback = () => editPost({ ping_status: pingStatus === 'open' ? 'closed' : 'open' }); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.CheckboxControl, { __nextHasNoMarginBottom: true, label: (0,external_wp_i18n_namespaceObject.__)('Enable pingbacks & trackbacks'), checked: pingStatus === 'open', onChange: onTogglePingback, help: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ExternalLink, { href: (0,external_wp_i18n_namespaceObject.__)('https://wordpress.org/documentation/article/trackbacks-and-pingbacks/'), children: (0,external_wp_i18n_namespaceObject.__)('Learn more about pingbacks & trackbacks') }) }); } /** * Renders a control for enabling or disabling pingbacks and trackbacks * in a WordPress post. * * @module PostPingbacks */ /* harmony default export */ const post_pingbacks = (PostPingbacks); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-discussion/panel.js /** * WordPress dependencies */ /** * Internal dependencies */ const panel_PANEL_NAME = 'discussion-panel'; function ModalContents({ onClose }) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "editor-post-discussion", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalInspectorPopoverHeader, { title: (0,external_wp_i18n_namespaceObject.__)('Discussion'), onClose: onClose }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { spacing: 4, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_type_support_check, { supportKeys: "comments", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_comments, {}) }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_type_support_check, { supportKeys: "trackbacks", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_pingbacks, {}) })] })] }); } function PostDiscussionToggle({ isOpen, onClick }) { const { commentStatus, pingStatus, commentsSupported, trackbacksSupported } = (0,external_wp_data_namespaceObject.useSelect)(select => { var _getEditedPostAttribu, _getEditedPostAttribu2; const { getEditedPostAttribute } = select(store_store); const { getPostType } = select(external_wp_coreData_namespaceObject.store); const postType = getPostType(getEditedPostAttribute('type')); return { commentStatus: (_getEditedPostAttribu = getEditedPostAttribute('comment_status')) !== null && _getEditedPostAttribu !== void 0 ? _getEditedPostAttribu : 'open', pingStatus: (_getEditedPostAttribu2 = getEditedPostAttribute('ping_status')) !== null && _getEditedPostAttribu2 !== void 0 ? _getEditedPostAttribu2 : 'open', commentsSupported: !!postType.supports.comments, trackbacksSupported: !!postType.supports.trackbacks }; }, []); let label; if (commentStatus === 'open') { if (pingStatus === 'open') { label = (0,external_wp_i18n_namespaceObject.__)('Open'); } else { label = trackbacksSupported ? (0,external_wp_i18n_namespaceObject.__)('Comments only') : (0,external_wp_i18n_namespaceObject.__)('Open'); } } else if (pingStatus === 'open') { label = commentsSupported ? (0,external_wp_i18n_namespaceObject.__)('Pings only') : (0,external_wp_i18n_namespaceObject.__)('Pings enabled'); } else { label = (0,external_wp_i18n_namespaceObject.__)('Closed'); } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { size: "compact", className: "editor-post-discussion__panel-toggle", variant: "tertiary", "aria-label": (0,external_wp_i18n_namespaceObject.__)('Change discussion options'), "aria-expanded": isOpen, onClick: onClick, children: label }); } /** * This component allows to update comment and pingback * settings for the current post. Internally there are * checks whether the current post has support for the * above and if the `discussion-panel` panel is enabled. * * @return {JSX.Element|null} The rendered PostDiscussionPanel component. */ function PostDiscussionPanel() { const { isEnabled } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { isEditorPanelEnabled } = select(store_store); return { isEnabled: isEditorPanelEnabled(panel_PANEL_NAME) }; }, []); // 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); // Memoize popoverProps to avoid returning a new object every time. const popoverProps = (0,external_wp_element_namespaceObject.useMemo)(() => ({ // Anchor the popover to the middle of the entire row so that it doesn't // move around when the label changes. anchor: popoverAnchor, placement: 'left-start', offset: 36, shift: true }), [popoverAnchor]); if (!isEnabled) { return null; } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_type_support_check, { supportKeys: ['comments', 'trackbacks'], children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { label: (0,external_wp_i18n_namespaceObject.__)('Discussion'), ref: setPopoverAnchor, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Dropdown, { popoverProps: popoverProps, className: "editor-post-discussion__panel-dropdown", contentClassName: "editor-post-discussion__panel-dialog", focusOnMount: true, renderToggle: ({ isOpen, onToggle }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostDiscussionToggle, { isOpen: isOpen, onClick: onToggle }), renderContent: ({ onClose }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ModalContents, { onClose: onClose }) }) }) }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-excerpt/index.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Renders an editable textarea for the post excerpt. * Templates, template parts and patterns use the `excerpt` field as a description semantically. * Additionally templates and template parts override the `excerpt` field as `description` in * REST API. So this component handles proper labeling and updating the edited entity. * * @param {Object} props - Component props. * @param {boolean} [props.hideLabelFromVision=false] - Whether to visually hide the textarea's label. * @param {boolean} [props.updateOnBlur=false] - Whether to update the post on change or use local state and update on blur. */ function PostExcerpt({ hideLabelFromVision = false, updateOnBlur = false }) { const { excerpt, shouldUseDescriptionLabel, usedAttribute } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { getCurrentPostType, getEditedPostAttribute } = select(store_store); const postType = getCurrentPostType(); // This special case is unfortunate, but the REST API of wp_template and wp_template_part // support the excerpt field throught the "description" field rather than "excerpt". const _usedAttribute = ['wp_template', 'wp_template_part'].includes(postType) ? 'description' : 'excerpt'; return { excerpt: getEditedPostAttribute(_usedAttribute), // There are special cases where we want to label the excerpt as a description. shouldUseDescriptionLabel: ['wp_template', 'wp_template_part', 'wp_block'].includes(postType), usedAttribute: _usedAttribute }; }, []); const { editPost } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); const [localExcerpt, setLocalExcerpt] = (0,external_wp_element_namespaceObject.useState)((0,external_wp_htmlEntities_namespaceObject.decodeEntities)(excerpt)); const updatePost = value => { editPost({ [usedAttribute]: value }); }; const label = shouldUseDescriptionLabel ? (0,external_wp_i18n_namespaceObject.__)('Write a description (optional)') : (0,external_wp_i18n_namespaceObject.__)('Write an excerpt (optional)'); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: "editor-post-excerpt", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.TextareaControl, { __nextHasNoMarginBottom: true, label: label, hideLabelFromVision: hideLabelFromVision, className: "editor-post-excerpt__textarea", onChange: updateOnBlur ? setLocalExcerpt : updatePost, onBlur: updateOnBlur ? () => updatePost(localExcerpt) : undefined, value: updateOnBlur ? localExcerpt : excerpt, help: !shouldUseDescriptionLabel ? /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ExternalLink, { href: (0,external_wp_i18n_namespaceObject.__)('https://wordpress.org/documentation/article/page-post-settings-sidebar/#excerpt'), children: (0,external_wp_i18n_namespaceObject.__)('Learn more about manual excerpts') }) : (0,external_wp_i18n_namespaceObject.__)('Write a description') }) }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-excerpt/check.js /** * Internal dependencies */ /** * Component for checking if the post type supports the excerpt field. * * @param {Object} props Props. * @param {Element} props.children Children to be rendered. * * @return {Component} The component to be rendered. */ function PostExcerptCheck({ children }) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_type_support_check, { supportKeys: "excerpt", children: children }); } /* harmony default export */ const post_excerpt_check = (PostExcerptCheck); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-excerpt/plugin.js /** * Defines as extensibility slot for the Excerpt panel. */ /** * WordPress dependencies */ const { Fill: plugin_Fill, Slot: plugin_Slot } = (0,external_wp_components_namespaceObject.createSlotFill)('PluginPostExcerpt'); /** * Renders a post excerpt panel in the post sidebar. * * @param {Object} props Component properties. * @param {string} [props.className] An optional class name added to the row. * @param {Element} props.children Children to be rendered. * * @example * ```js * // Using ES5 syntax * var __ = wp.i18n.__; * var PluginPostExcerpt = wp.editPost.__experimentalPluginPostExcerpt; * * function MyPluginPostExcerpt() { * return React.createElement( * PluginPostExcerpt, * { * className: 'my-plugin-post-excerpt', * }, * __( 'Post excerpt custom content' ) * ) * } * ``` * * @example * ```jsx * // Using ESNext syntax * import { __ } from '@wordpress/i18n'; * import { __experimentalPluginPostExcerpt as PluginPostExcerpt } from '@wordpress/edit-post'; * * const MyPluginPostExcerpt = () => ( * <PluginPostExcerpt className="my-plugin-post-excerpt"> * { __( 'Post excerpt custom content' ) } * </PluginPostExcerpt> * ); * ``` * * @return {Component} The component to be rendered. */ const PluginPostExcerpt = ({ children, className }) => { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(plugin_Fill, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelRow, { className: className, children: children }) }); }; PluginPostExcerpt.Slot = plugin_Slot; /* harmony default export */ const post_excerpt_plugin = (PluginPostExcerpt); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-excerpt/panel.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Module Constants */ const post_excerpt_panel_PANEL_NAME = 'post-excerpt'; function ExcerptPanel() { const { isOpened, isEnabled, postType } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { isEditorPanelOpened, isEditorPanelEnabled, getCurrentPostType } = select(store_store); return { isOpened: isEditorPanelOpened(post_excerpt_panel_PANEL_NAME), isEnabled: isEditorPanelEnabled(post_excerpt_panel_PANEL_NAME), postType: getCurrentPostType() }; }, []); const { toggleEditorPanelOpened } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); const toggleExcerptPanel = () => toggleEditorPanelOpened(post_excerpt_panel_PANEL_NAME); if (!isEnabled) { return null; } // There are special cases where we want to label the excerpt as a description. const shouldUseDescriptionLabel = ['wp_template', 'wp_template_part', 'wp_block'].includes(postType); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelBody, { title: shouldUseDescriptionLabel ? (0,external_wp_i18n_namespaceObject.__)('Description') : (0,external_wp_i18n_namespaceObject.__)('Excerpt'), opened: isOpened, onToggle: toggleExcerptPanel, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_excerpt_plugin.Slot, { children: fills => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostExcerpt, {}), fills] }) }) }); } /** * Is rendered if the post type supports excerpts and allows editing the excerpt. * * @return {JSX.Element} The rendered PostExcerptPanel component. */ function PostExcerptPanel() { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_excerpt_check, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ExcerptPanel, {}) }); } function PrivatePostExcerptPanel() { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_excerpt_check, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PrivateExcerpt, {}) }); } function PrivateExcerpt() { const { shouldRender, excerpt, shouldBeUsedAsDescription, allowEditing } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { getCurrentPostType, getCurrentPostId, getEditedPostAttribute, isEditorPanelEnabled } = select(store_store); const postType = getCurrentPostType(); const isTemplateOrTemplatePart = ['wp_template', 'wp_template_part'].includes(postType); const isPattern = postType === 'wp_block'; // These post types use the `excerpt` field as a description semantically, so we need to // handle proper labeling and some flows where we should always render them as text. const _shouldBeUsedAsDescription = isTemplateOrTemplatePart || isPattern; const _usedAttribute = isTemplateOrTemplatePart ? 'description' : 'excerpt'; // We need to fetch the entity in this case to check if we'll allow editing. const template = isTemplateOrTemplatePart && select(external_wp_coreData_namespaceObject.store).getEntityRecord('postType', postType, getCurrentPostId()); // For post types that use excerpt as description, we do not abide // by the `isEnabled` panel flag in order to render them as text. const _shouldRender = isEditorPanelEnabled(post_excerpt_panel_PANEL_NAME) || _shouldBeUsedAsDescription; return { excerpt: getEditedPostAttribute(_usedAttribute), shouldRender: _shouldRender, shouldBeUsedAsDescription: _shouldBeUsedAsDescription, // If we should render, allow editing for all post types that are not used as description. // For the rest allow editing only for user generated entities. allowEditing: _shouldRender && (!_shouldBeUsedAsDescription || isPattern || template && template.source === TEMPLATE_ORIGINS.custom && !template.has_theme_file) }; }, []); const [popoverAnchor, setPopoverAnchor] = (0,external_wp_element_namespaceObject.useState)(null); const label = shouldBeUsedAsDescription ? (0,external_wp_i18n_namespaceObject.__)('Description') : (0,external_wp_i18n_namespaceObject.__)('Excerpt'); // Memoize popoverProps to avoid returning a new object every time. const popoverProps = (0,external_wp_element_namespaceObject.useMemo)(() => ({ // Anchor the popover to the middle of the entire row so that it doesn't // move around when the label changes. anchor: popoverAnchor, 'aria-label': label, headerTitle: label, placement: 'left-start', offset: 36, shift: true }), [popoverAnchor, label]); if (!shouldRender) { return false; } const excerptText = !!excerpt && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { align: "left", numberOfLines: 4, truncate: true, children: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(excerpt) }); if (!allowEditing) { return excerptText; } const excerptPlaceholder = shouldBeUsedAsDescription ? (0,external_wp_i18n_namespaceObject.__)('Add a description…') : (0,external_wp_i18n_namespaceObject.__)('Add an excerpt…'); const triggerEditLabel = shouldBeUsedAsDescription ? (0,external_wp_i18n_namespaceObject.__)('Edit description') : (0,external_wp_i18n_namespaceObject.__)('Edit excerpt'); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { children: [excerptText, /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Dropdown, { className: "editor-post-excerpt__dropdown", contentClassName: "editor-post-excerpt__dropdown__content", popoverProps: popoverProps, focusOnMount: true, ref: setPopoverAnchor, renderToggle: ({ onToggle }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { className: "editor-post-excerpt__dropdown__trigger", onClick: onToggle, variant: "link", children: excerptText ? triggerEditLabel : excerptPlaceholder }), renderContent: ({ onClose }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalInspectorPopoverHeader, { title: label, onClose: onClose }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalVStack, { spacing: 4, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_excerpt_plugin.Slot, { children: fills => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostExcerpt, { hideLabelFromVision: true, updateOnBlur: true }), fills] }) }) })] }) })] }); } ;// CONCATENATED MODULE: external ["wp","blob"] const external_wp_blob_namespaceObject = window["wp"]["blob"]; ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/theme-support-check/index.js /** * WordPress dependencies */ /** * Internal dependencies */ function ThemeSupportCheck({ children, supportKeys }) { const { postType, themeSupports } = (0,external_wp_data_namespaceObject.useSelect)(select => { return { postType: select(store_store).getEditedPostAttribute('type'), themeSupports: select(external_wp_coreData_namespaceObject.store).getThemeSupports() }; }, []); const isSupported = (Array.isArray(supportKeys) ? supportKeys : [supportKeys]).some(key => { var _themeSupports$key; const supported = (_themeSupports$key = themeSupports?.[key]) !== null && _themeSupports$key !== void 0 ? _themeSupports$key : false; // 'post-thumbnails' can be boolean or an array of post types. // In the latter case, we need to verify `postType` exists // within `supported`. If `postType` isn't passed, then the check // should fail. if ('post-thumbnails' === key && Array.isArray(supported)) { return supported.includes(postType); } return supported; }); if (!isSupported) { return null; } return children; } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-featured-image/check.js /** * Internal dependencies */ /** * Wrapper component that renders its children only if the post type supports a featured image * and the theme supports post thumbnails. * * @param {Object} props Props. * @param {Element} props.children Children to be rendered. * * @return {Component} The component to be rendered. */ function PostFeaturedImageCheck({ children }) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ThemeSupportCheck, { supportKeys: "post-thumbnails", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_type_support_check, { supportKeys: "thumbnail", children: children }) }); } /* harmony default export */ const post_featured_image_check = (PostFeaturedImageCheck); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-featured-image/index.js /** * WordPress dependencies */ /** * Internal dependencies */ const ALLOWED_MEDIA_TYPES = ['image']; // Used when labels from post type were not yet loaded or when they are not present. const DEFAULT_FEATURE_IMAGE_LABEL = (0,external_wp_i18n_namespaceObject.__)('Featured image'); const DEFAULT_SET_FEATURE_IMAGE_LABEL = (0,external_wp_i18n_namespaceObject.__)('Add a featured image'); const instructions = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { children: (0,external_wp_i18n_namespaceObject.__)('To edit the featured image, you need permission to upload media.') }); function getMediaDetails(media, postId) { var _media$media_details$, _media$media_details$2; if (!media) { return {}; } const defaultSize = (0,external_wp_hooks_namespaceObject.applyFilters)('editor.PostFeaturedImage.imageSize', 'large', media.id, postId); if (defaultSize in ((_media$media_details$ = media?.media_details?.sizes) !== null && _media$media_details$ !== void 0 ? _media$media_details$ : {})) { return { mediaWidth: media.media_details.sizes[defaultSize].width, mediaHeight: media.media_details.sizes[defaultSize].height, mediaSourceUrl: media.media_details.sizes[defaultSize].source_url }; } // Use fallbackSize when defaultSize is not available. const fallbackSize = (0,external_wp_hooks_namespaceObject.applyFilters)('editor.PostFeaturedImage.imageSize', 'thumbnail', media.id, postId); if (fallbackSize in ((_media$media_details$2 = media?.media_details?.sizes) !== null && _media$media_details$2 !== void 0 ? _media$media_details$2 : {})) { return { mediaWidth: media.media_details.sizes[fallbackSize].width, mediaHeight: media.media_details.sizes[fallbackSize].height, mediaSourceUrl: media.media_details.sizes[fallbackSize].source_url }; } // Use full image size when fallbackSize and defaultSize are not available. return { mediaWidth: media.media_details.width, mediaHeight: media.media_details.height, mediaSourceUrl: media.source_url }; } function PostFeaturedImage({ currentPostId, featuredImageId, onUpdateImage, onRemoveImage, media, postType, noticeUI, noticeOperations }) { const toggleRef = (0,external_wp_element_namespaceObject.useRef)(); const [isLoading, setIsLoading] = (0,external_wp_element_namespaceObject.useState)(false); const { getSettings } = (0,external_wp_data_namespaceObject.useSelect)(external_wp_blockEditor_namespaceObject.store); const { mediaSourceUrl } = getMediaDetails(media, currentPostId); function onDropFiles(filesList) { getSettings().mediaUpload({ allowedTypes: ALLOWED_MEDIA_TYPES, filesList, onFileChange([image]) { if ((0,external_wp_blob_namespaceObject.isBlobURL)(image?.url)) { setIsLoading(true); return; } if (image) { onUpdateImage(image); } setIsLoading(false); }, onError(message) { noticeOperations.removeAllNotices(); noticeOperations.createErrorNotice(message); } }); } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(post_featured_image_check, { children: [noticeUI, /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "editor-post-featured-image", children: [media && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { id: `editor-post-featured-image-${featuredImageId}-describedby`, className: "hidden", children: [media.alt_text && (0,external_wp_i18n_namespaceObject.sprintf)( // Translators: %s: The selected image alt text. (0,external_wp_i18n_namespaceObject.__)('Current image: %s'), media.alt_text), !media.alt_text && (0,external_wp_i18n_namespaceObject.sprintf)( // Translators: %s: The selected image filename. (0,external_wp_i18n_namespaceObject.__)('The current image has no alternative text. The file name is: %s'), media.media_details.sizes?.full?.file || media.slug)] }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.MediaUploadCheck, { fallback: instructions, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.MediaUpload, { title: postType?.labels?.featured_image || DEFAULT_FEATURE_IMAGE_LABEL, onSelect: onUpdateImage, unstableFeaturedImageFlow: true, allowedTypes: ALLOWED_MEDIA_TYPES, modalClass: "editor-post-featured-image__media-modal", render: ({ open }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "editor-post-featured-image__container", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.Button, { ref: toggleRef, className: !featuredImageId ? 'editor-post-featured-image__toggle' : 'editor-post-featured-image__preview', onClick: open, "aria-label": !featuredImageId ? null : (0,external_wp_i18n_namespaceObject.__)('Edit or replace the image'), "aria-describedby": !featuredImageId ? null : `editor-post-featured-image-${featuredImageId}-describedby`, children: [!!featuredImageId && media && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("img", { className: "editor-post-featured-image__preview-image", src: mediaSourceUrl, alt: "" }), isLoading && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Spinner, {}), !featuredImageId && !isLoading && (postType?.labels?.set_featured_image || DEFAULT_SET_FEATURE_IMAGE_LABEL)] }), !!featuredImageId && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, { className: "editor-post-featured-image__actions", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { className: "editor-post-featured-image__action", onClick: open, children: (0,external_wp_i18n_namespaceObject.__)('Replace') }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { className: "editor-post-featured-image__action", onClick: () => { onRemoveImage(); toggleRef.current.focus(); }, children: (0,external_wp_i18n_namespaceObject.__)('Remove') })] }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.DropZone, { onFilesDrop: onDropFiles })] }), value: featuredImageId }) })] })] }); } const applyWithSelect = (0,external_wp_data_namespaceObject.withSelect)(select => { const { getMedia, getPostType } = select(external_wp_coreData_namespaceObject.store); const { getCurrentPostId, getEditedPostAttribute } = select(store_store); const featuredImageId = getEditedPostAttribute('featured_media'); return { media: featuredImageId ? getMedia(featuredImageId, { context: 'view' }) : null, currentPostId: getCurrentPostId(), postType: getPostType(getEditedPostAttribute('type')), featuredImageId }; }); const applyWithDispatch = (0,external_wp_data_namespaceObject.withDispatch)((dispatch, { noticeOperations }, { select }) => { const { editPost } = dispatch(store_store); return { onUpdateImage(image) { editPost({ featured_media: image.id }); }, onDropImage(filesList) { select(external_wp_blockEditor_namespaceObject.store).getSettings().mediaUpload({ allowedTypes: ['image'], filesList, onFileChange([image]) { editPost({ featured_media: image.id }); }, onError(message) { noticeOperations.removeAllNotices(); noticeOperations.createErrorNotice(message); } }); }, onRemoveImage() { editPost({ featured_media: 0 }); } }; }); /** * Renders the component for managing the featured image of a post. * * @param {Object} props Props. * @param {number} props.currentPostId ID of the current post. * @param {number} props.featuredImageId ID of the featured image. * @param {Function} props.onUpdateImage Function to call when the image is updated. * @param {Function} props.onRemoveImage Function to call when the image is removed. * @param {Object} props.media The media object representing the featured image. * @param {string} props.postType Post type. * @param {Element} props.noticeUI UI for displaying notices. * @param {Object} props.noticeOperations Operations for managing notices. * * @return {Element} Component to be rendered . */ /* harmony default export */ const post_featured_image = ((0,external_wp_compose_namespaceObject.compose)(external_wp_components_namespaceObject.withNotices, applyWithSelect, applyWithDispatch, (0,external_wp_components_namespaceObject.withFilters)('editor.PostFeaturedImage'))(PostFeaturedImage)); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-featured-image/panel.js /** * WordPress dependencies */ /** * Internal dependencies */ const post_featured_image_panel_PANEL_NAME = 'featured-image'; /** * Renders the panel for the post featured image. * * @param {Object} props Props. * @param {boolean} props.withPanelBody Whether to include the panel body. Default true. * * @return {Component|null} The component to be rendered. * Return Null if the editor panel is disabled for featured image. */ function PostFeaturedImagePanel({ withPanelBody = true }) { var _postType$labels$feat; const { postType, isEnabled, isOpened } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { getEditedPostAttribute, isEditorPanelEnabled, isEditorPanelOpened } = select(store_store); const { getPostType } = select(external_wp_coreData_namespaceObject.store); return { postType: getPostType(getEditedPostAttribute('type')), isEnabled: isEditorPanelEnabled(post_featured_image_panel_PANEL_NAME), isOpened: isEditorPanelOpened(post_featured_image_panel_PANEL_NAME) }; }, []); const { toggleEditorPanelOpened } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); if (!isEnabled) { return null; } if (!withPanelBody) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_featured_image_check, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_featured_image, {}) }); } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_featured_image_check, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelBody, { title: (_postType$labels$feat = postType?.labels?.featured_image) !== null && _postType$labels$feat !== void 0 ? _postType$labels$feat : (0,external_wp_i18n_namespaceObject.__)('Featured image'), opened: isOpened, onToggle: () => toggleEditorPanelOpened(post_featured_image_panel_PANEL_NAME), children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_featured_image, {}) }) }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-format/check.js /** * WordPress dependencies */ /** * Internal dependencies */ function PostFormatCheck({ children }) { const disablePostFormats = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getEditorSettings().disablePostFormats, []); if (disablePostFormats) { return null; } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_type_support_check, { supportKeys: "post-formats", children: children }); } /** * Component check if there are any post formats. * * @param {Object} props The component props. * @param {Element} props.children The child elements to render. * * @return {Component|null} The rendered component or null if post formats are disabled. */ /* harmony default export */ const post_format_check = (PostFormatCheck); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-format/index.js /** * WordPress dependencies */ /** * Internal dependencies */ // All WP post formats, sorted alphabetically by translated name. const POST_FORMATS = [{ id: 'aside', caption: (0,external_wp_i18n_namespaceObject.__)('Aside') }, { id: 'audio', caption: (0,external_wp_i18n_namespaceObject.__)('Audio') }, { id: 'chat', caption: (0,external_wp_i18n_namespaceObject.__)('Chat') }, { id: 'gallery', caption: (0,external_wp_i18n_namespaceObject.__)('Gallery') }, { id: 'image', caption: (0,external_wp_i18n_namespaceObject.__)('Image') }, { id: 'link', caption: (0,external_wp_i18n_namespaceObject.__)('Link') }, { id: 'quote', caption: (0,external_wp_i18n_namespaceObject.__)('Quote') }, { id: 'standard', caption: (0,external_wp_i18n_namespaceObject.__)('Standard') }, { id: 'status', caption: (0,external_wp_i18n_namespaceObject.__)('Status') }, { id: 'video', caption: (0,external_wp_i18n_namespaceObject.__)('Video') }].sort((a, b) => { const normalizedA = a.caption.toUpperCase(); const normalizedB = b.caption.toUpperCase(); if (normalizedA < normalizedB) { return -1; } if (normalizedA > normalizedB) { return 1; } return 0; }); /** * `PostFormat` a component that allows changing the post format while also providing a suggestion for the current post. * * @example * ```jsx * <PostFormat /> * ``` * * @return {JSX.Element} The rendered PostFormat component. */ function PostFormat() { const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(PostFormat); const postFormatSelectorId = `post-format-selector-${instanceId}`; const { postFormat, suggestedFormat, supportedFormats } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { getEditedPostAttribute, getSuggestedPostFormat } = select(store_store); const _postFormat = getEditedPostAttribute('format'); const themeSupports = select(external_wp_coreData_namespaceObject.store).getThemeSupports(); return { postFormat: _postFormat !== null && _postFormat !== void 0 ? _postFormat : 'standard', suggestedFormat: getSuggestedPostFormat(), supportedFormats: themeSupports.formats }; }, []); const formats = POST_FORMATS.filter(format => { // Ensure current format is always in the set. // The current format may not be a format supported by the theme. return supportedFormats?.includes(format.id) || postFormat === format.id; }); const suggestion = formats.find(format => format.id === suggestedFormat); const { editPost } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); const onUpdatePostFormat = format => editPost({ format }); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_format_check, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "editor-post-format", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.RadioControl, { className: "editor-post-format__options", label: (0,external_wp_i18n_namespaceObject.__)('Post Format'), selected: postFormat, onChange: format => onUpdatePostFormat(format), id: postFormatSelectorId, options: formats.map(format => ({ label: format.caption, value: format.id })), hideLabelFromVision: true }), suggestion && suggestion.id !== postFormat && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { className: "editor-post-format__suggestion", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { variant: "link", onClick: () => onUpdatePostFormat(suggestion.id), children: (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: post format */ (0,external_wp_i18n_namespaceObject.__)('Apply suggested format: %s'), suggestion.caption) }) })] }) }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/backup.js /** * WordPress dependencies */ const backup = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { d: "M5.5 12h1.75l-2.5 3-2.5-3H4a8 8 0 113.134 6.35l.907-1.194A6.5 6.5 0 105.5 12zm9.53 1.97l-2.28-2.28V8.5a.75.75 0 00-1.5 0V12a.747.747 0 00.218.529l1.282-.84-1.28.842 2.5 2.5a.75.75 0 101.06-1.061z" }) }); /* harmony default export */ const library_backup = (backup); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-last-revision/check.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Wrapper component that renders its children if the post has more than one revision. * * @param {Object} props Props. * @param {Element} props.children Children to be rendered. * * @return {Component|null} Rendered child components if post has more than one revision, otherwise null. */ function PostLastRevisionCheck({ children }) { const { lastRevisionId, revisionsCount } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { getCurrentPostLastRevisionId, getCurrentPostRevisionsCount } = select(store_store); return { lastRevisionId: getCurrentPostLastRevisionId(), revisionsCount: getCurrentPostRevisionsCount() }; }, []); if (!lastRevisionId || revisionsCount < 2) { return null; } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_type_support_check, { supportKeys: "revisions", children: children }); } /* harmony default export */ const post_last_revision_check = (PostLastRevisionCheck); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-last-revision/index.js /** * WordPress dependencies */ /** * Internal dependencies */ function usePostLastRevisionInfo() { return (0,external_wp_data_namespaceObject.useSelect)(select => { const { getCurrentPostLastRevisionId, getCurrentPostRevisionsCount } = select(store_store); return { lastRevisionId: getCurrentPostLastRevisionId(), revisionsCount: getCurrentPostRevisionsCount() }; }, []); } /** * Renders the component for displaying the last revision of a post. * * @return {Component} The component to be rendered. */ function PostLastRevision() { const { lastRevisionId, revisionsCount } = usePostLastRevisionInfo(); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_last_revision_check, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { href: (0,external_wp_url_namespaceObject.addQueryArgs)('revision.php', { revision: lastRevisionId }), className: "editor-post-last-revision__title", icon: library_backup, iconPosition: "right", text: (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: number of revisions */ (0,external_wp_i18n_namespaceObject.__)('Revisions (%s)'), revisionsCount) }) }); } function PrivatePostLastRevision() { const { lastRevisionId, revisionsCount } = usePostLastRevisionInfo(); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_last_revision_check, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { label: (0,external_wp_i18n_namespaceObject.__)('Revisions'), children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { href: (0,external_wp_url_namespaceObject.addQueryArgs)('revision.php', { revision: lastRevisionId }), className: "editor-private-post-last-revision__button", text: revisionsCount, variant: "tertiary" }) }) }); } /* harmony default export */ const post_last_revision = (PostLastRevision); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-last-revision/panel.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Renders the panel for displaying the last revision of a post. * * @return {Component} The component to be rendered. */ function PostLastRevisionPanel() { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_last_revision_check, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelBody, { className: "editor-post-last-revision__panel", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_last_revision, {}) }) }); } /* harmony default export */ const post_last_revision_panel = (PostLastRevisionPanel); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-locked-modal/index.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * A modal component that is displayed when a post is locked for editing by another user. * The modal provides information about the lock status and options to take over or exit the editor. * * @return {JSX.Element|null} The rendered PostLockedModal component. */ function PostLockedModal() { const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(PostLockedModal); const hookName = 'core/editor/post-locked-modal-' + instanceId; const { autosave, updatePostLock } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); const { isLocked, isTakeover, user, postId, postLockUtils, activePostLock, postType, previewLink } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { isPostLocked, isPostLockTakeover, getPostLockUser, getCurrentPostId, getActivePostLock, getEditedPostAttribute, getEditedPostPreviewLink, getEditorSettings } = select(store_store); const { getPostType } = select(external_wp_coreData_namespaceObject.store); return { isLocked: isPostLocked(), isTakeover: isPostLockTakeover(), user: getPostLockUser(), postId: getCurrentPostId(), postLockUtils: getEditorSettings().postLockUtils, activePostLock: getActivePostLock(), postType: getPostType(getEditedPostAttribute('type')), previewLink: getEditedPostPreviewLink() }; }, []); (0,external_wp_element_namespaceObject.useEffect)(() => { /** * Keep the lock refreshed. * * When the user does not send a heartbeat in a heartbeat-tick * the user is no longer editing and another user can start editing. * * @param {Object} data Data to send in the heartbeat request. */ function sendPostLock(data) { if (isLocked) { return; } data['wp-refresh-post-lock'] = { lock: activePostLock, post_id: postId }; } /** * Refresh post locks: update the lock string or show the dialog if somebody has taken over editing. * * @param {Object} data Data received in the heartbeat request */ function receivePostLock(data) { if (!data['wp-refresh-post-lock']) { return; } const received = data['wp-refresh-post-lock']; if (received.lock_error) { // Auto save and display the takeover modal. autosave(); updatePostLock({ isLocked: true, isTakeover: true, user: { name: received.lock_error.name, avatar: received.lock_error.avatar_src_2x } }); } else if (received.new_lock) { updatePostLock({ isLocked: false, activePostLock: received.new_lock }); } } /** * Unlock the post before the window is exited. */ function releasePostLock() { if (isLocked || !activePostLock) { return; } const data = new window.FormData(); data.append('action', 'wp-remove-post-lock'); data.append('_wpnonce', postLockUtils.unlockNonce); data.append('post_ID', postId); data.append('active_post_lock', activePostLock); if (window.navigator.sendBeacon) { window.navigator.sendBeacon(postLockUtils.ajaxUrl, data); } else { const xhr = new window.XMLHttpRequest(); xhr.open('POST', postLockUtils.ajaxUrl, false); xhr.send(data); } } // Details on these events on the Heartbeat API docs // https://developer.wordpress.org/plugins/javascript/heartbeat-api/ (0,external_wp_hooks_namespaceObject.addAction)('heartbeat.send', hookName, sendPostLock); (0,external_wp_hooks_namespaceObject.addAction)('heartbeat.tick', hookName, receivePostLock); window.addEventListener('beforeunload', releasePostLock); return () => { (0,external_wp_hooks_namespaceObject.removeAction)('heartbeat.send', hookName); (0,external_wp_hooks_namespaceObject.removeAction)('heartbeat.tick', hookName); window.removeEventListener('beforeunload', releasePostLock); }; }, []); if (!isLocked) { return null; } const userDisplayName = user.name; const userAvatar = user.avatar; const unlockUrl = (0,external_wp_url_namespaceObject.addQueryArgs)('post.php', { 'get-post-lock': '1', lockKey: true, post: postId, action: 'edit', _wpnonce: postLockUtils.nonce }); const allPostsUrl = (0,external_wp_url_namespaceObject.addQueryArgs)('edit.php', { post_type: postType?.slug }); const allPostsLabel = (0,external_wp_i18n_namespaceObject.__)('Exit editor'); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Modal, { title: isTakeover ? (0,external_wp_i18n_namespaceObject.__)('Someone else has taken over this post') : (0,external_wp_i18n_namespaceObject.__)('This post is already being edited'), focusOnMount: true, shouldCloseOnClickOutside: false, shouldCloseOnEsc: false, isDismissible: false, size: "medium", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, { alignment: "top", spacing: 6, children: [!!userAvatar && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("img", { src: userAvatar, alt: (0,external_wp_i18n_namespaceObject.__)('Avatar'), className: "editor-post-locked-modal__avatar", width: 64, height: 64 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { children: [!!isTakeover && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { children: (0,external_wp_element_namespaceObject.createInterpolateElement)(userDisplayName ? (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: user's display name */ (0,external_wp_i18n_namespaceObject.__)('<strong>%s</strong> now has editing control of this post (<PreviewLink />). Don’t worry, your changes up to this moment have been saved.'), userDisplayName) : (0,external_wp_i18n_namespaceObject.__)('Another user now has editing control of this post (<PreviewLink />). Don’t worry, your changes up to this moment have been saved.'), { strong: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("strong", {}), PreviewLink: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ExternalLink, { href: previewLink, children: (0,external_wp_i18n_namespaceObject.__)('preview') }) }) }), !isTakeover && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { children: (0,external_wp_element_namespaceObject.createInterpolateElement)(userDisplayName ? (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: user's display name */ (0,external_wp_i18n_namespaceObject.__)('<strong>%s</strong> is currently working on this post (<PreviewLink />), which means you cannot make changes, unless you take over.'), userDisplayName) : (0,external_wp_i18n_namespaceObject.__)('Another user is currently working on this post (<PreviewLink />), which means you cannot make changes, unless you take over.'), { strong: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("strong", {}), PreviewLink: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ExternalLink, { href: previewLink, children: (0,external_wp_i18n_namespaceObject.__)('preview') }) }) }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { children: (0,external_wp_i18n_namespaceObject.__)('If you take over, the other user will lose editing control to the post, but their changes will be saved.') })] }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, { className: "editor-post-locked-modal__buttons", justify: "flex-end", children: [!isTakeover && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { variant: "tertiary", href: unlockUrl, children: (0,external_wp_i18n_namespaceObject.__)('Take over') }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { variant: "primary", href: allPostsUrl, children: allPostsLabel })] })] })] }) }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-pending-status/check.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * This component checks the publishing status of the current post. * If the post is already published or the user doesn't have the * capability to publish, it returns null. * * @param {Object} props Component properties. * @param {Element} props.children Children to be rendered. * * @return {JSX.Element|null} The rendered child elements or null if the post is already published or the user doesn't have the capability to publish. */ function PostPendingStatusCheck({ children }) { const { hasPublishAction, isPublished } = (0,external_wp_data_namespaceObject.useSelect)(select => { var _getCurrentPost$_link; const { isCurrentPostPublished, getCurrentPost } = select(store_store); return { hasPublishAction: (_getCurrentPost$_link = getCurrentPost()._links?.['wp:action-publish']) !== null && _getCurrentPost$_link !== void 0 ? _getCurrentPost$_link : false, isPublished: isCurrentPostPublished() }; }, []); if (isPublished || !hasPublishAction) { return null; } return children; } /* harmony default export */ const post_pending_status_check = (PostPendingStatusCheck); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-pending-status/index.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * A component for displaying and toggling the pending status of a post. * * @return {JSX.Element} The rendered component. */ function PostPendingStatus() { const status = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getEditedPostAttribute('status'), []); const { editPost } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); const togglePendingStatus = () => { const updatedStatus = status === 'pending' ? 'draft' : 'pending'; editPost({ status: updatedStatus }); }; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_pending_status_check, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.CheckboxControl, { __nextHasNoMarginBottom: true, label: (0,external_wp_i18n_namespaceObject.__)('Pending review'), checked: status === 'pending', onChange: togglePendingStatus }) }); } /* harmony default export */ const post_pending_status = (PostPendingStatus); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-preview-button/index.js /** * WordPress dependencies */ /** * Internal dependencies */ function writeInterstitialMessage(targetDocument) { let markup = (0,external_wp_element_namespaceObject.renderToString)( /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "editor-post-preview-button__interstitial-message", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 96 96", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Path, { className: "outer", d: "M48 12c19.9 0 36 16.1 36 36S67.9 84 48 84 12 67.9 12 48s16.1-36 36-36", fill: "none" }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Path, { className: "inner", d: "M69.5 46.4c0-3.9-1.4-6.7-2.6-8.8-1.6-2.6-3.1-4.9-3.1-7.5 0-2.9 2.2-5.7 5.4-5.7h.4C63.9 19.2 56.4 16 48 16c-11.2 0-21 5.7-26.7 14.4h2.1c3.3 0 8.5-.4 8.5-.4 1.7-.1 1.9 2.4.2 2.6 0 0-1.7.2-3.7.3L40 67.5l7-20.9L42 33c-1.7-.1-3.3-.3-3.3-.3-1.7-.1-1.5-2.7.2-2.6 0 0 5.3.4 8.4.4 3.3 0 8.5-.4 8.5-.4 1.7-.1 1.9 2.4.2 2.6 0 0-1.7.2-3.7.3l11.5 34.3 3.3-10.4c1.6-4.5 2.4-7.8 2.4-10.5zM16.1 48c0 12.6 7.3 23.5 18 28.7L18.8 35c-1.7 4-2.7 8.4-2.7 13zm32.5 2.8L39 78.6c2.9.8 5.9 1.3 9 1.3 3.7 0 7.3-.6 10.6-1.8-.1-.1-.2-.3-.2-.4l-9.8-26.9zM76.2 36c0 3.2-.6 6.9-2.4 11.4L64 75.6c9.5-5.5 15.9-15.8 15.9-27.6 0-5.5-1.4-10.8-3.9-15.3.1 1 .2 2.1.2 3.3z", fill: "none" })] }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { children: (0,external_wp_i18n_namespaceObject.__)('Generating preview…') })] })); markup += ` <style> body { margin: 0; } .editor-post-preview-button__interstitial-message { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100vh; width: 100vw; } @-webkit-keyframes paint { 0% { stroke-dashoffset: 0; } } @-moz-keyframes paint { 0% { stroke-dashoffset: 0; } } @-o-keyframes paint { 0% { stroke-dashoffset: 0; } } @keyframes paint { 0% { stroke-dashoffset: 0; } } .editor-post-preview-button__interstitial-message svg { width: 192px; height: 192px; stroke: #555d66; stroke-width: 0.75; } .editor-post-preview-button__interstitial-message svg .outer, .editor-post-preview-button__interstitial-message svg .inner { stroke-dasharray: 280; stroke-dashoffset: 280; -webkit-animation: paint 1.5s ease infinite alternate; -moz-animation: paint 1.5s ease infinite alternate; -o-animation: paint 1.5s ease infinite alternate; animation: paint 1.5s ease infinite alternate; } p { text-align: center; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; } </style> `; /** * Filters the interstitial message shown when generating previews. * * @param {string} markup The preview interstitial markup. */ markup = (0,external_wp_hooks_namespaceObject.applyFilters)('editor.PostPreview.interstitialMarkup', markup); targetDocument.write(markup); targetDocument.title = (0,external_wp_i18n_namespaceObject.__)('Generating preview…'); targetDocument.close(); } /** * Renders a button that opens a new window or tab for the preview, * writes the interstitial message to this window, and then navigates * to the actual preview link. The button is not rendered if the post * is not viewable and disabled if the post is not saveable. * * @param {Object} props The component props. * @param {string} props.className The class name for the button. * @param {string} props.textContent The text content for the button. * @param {boolean} props.forceIsAutosaveable Whether to force autosave. * @param {string} props.role The role attribute for the button. * @param {Function} props.onPreview The callback function for preview event. * * @return {JSX.Element|null} The rendered button component. */ function PostPreviewButton({ className, textContent, forceIsAutosaveable, role, onPreview }) { const { postId, currentPostLink, previewLink, isSaveable, isViewable } = (0,external_wp_data_namespaceObject.useSelect)(select => { var _postType$viewable; const editor = select(store_store); const core = select(external_wp_coreData_namespaceObject.store); const postType = core.getPostType(editor.getCurrentPostType('type')); return { postId: editor.getCurrentPostId(), currentPostLink: editor.getCurrentPostAttribute('link'), previewLink: editor.getEditedPostPreviewLink(), isSaveable: editor.isEditedPostSaveable(), isViewable: (_postType$viewable = postType?.viewable) !== null && _postType$viewable !== void 0 ? _postType$viewable : false }; }, []); const { __unstableSaveForPreview } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); if (!isViewable) { return null; } const targetId = `wp-preview-${postId}`; const openPreviewWindow = async event => { // Our Preview button has its 'href' and 'target' set correctly for a11y // purposes. Unfortunately, though, we can't rely on the default 'click' // handler since sometimes it incorrectly opens a new tab instead of reusing // the existing one. // https://github.com/WordPress/gutenberg/pull/8330 event.preventDefault(); // Open up a Preview tab if needed. This is where we'll show the preview. const previewWindow = window.open('', targetId); // Focus the Preview tab. This might not do anything, depending on the browser's // and user's preferences. // https://html.spec.whatwg.org/multipage/interaction.html#dom-window-focus previewWindow.focus(); writeInterstitialMessage(previewWindow.document); const link = await __unstableSaveForPreview({ forceIsAutosaveable }); previewWindow.location = link; onPreview?.(); }; // Link to the `?preview=true` URL if we have it, since this lets us see // changes that were autosaved since the post was last published. Otherwise, // just link to the post's URL. const href = previewLink || currentPostLink; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { variant: !className ? 'tertiary' : undefined, className: className || 'editor-post-preview', href: href, target: targetId, __experimentalIsFocusable: true, disabled: !isSaveable, onClick: openPreviewWindow, role: role, size: "compact", children: textContent || /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [(0,external_wp_i18n_namespaceObject._x)('Preview', 'imperative verb'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.VisuallyHidden, { as: "span", children: /* translators: accessibility text */ (0,external_wp_i18n_namespaceObject.__)('(opens in a new tab)') })] }) }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-button/label.js /** * WordPress dependencies */ /** * Internal dependencies */ function PublishButtonLabel() { const isSmallerThanMediumViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium', '<'); const { isPublished, isBeingScheduled, isSaving, isPublishing, hasPublishAction, isAutosaving, hasNonPostEntityChanges, postStatusHasChanged, postStatus } = (0,external_wp_data_namespaceObject.useSelect)(select => { var _getCurrentPost$_link; const { isCurrentPostPublished, isEditedPostBeingScheduled, isSavingPost, isPublishingPost, getCurrentPost, getCurrentPostType, isAutosavingPost, getPostEdits, getEditedPostAttribute } = select(store_store); return { isPublished: isCurrentPostPublished(), isBeingScheduled: isEditedPostBeingScheduled(), isSaving: isSavingPost(), isPublishing: isPublishingPost(), hasPublishAction: (_getCurrentPost$_link = getCurrentPost()._links?.['wp:action-publish']) !== null && _getCurrentPost$_link !== void 0 ? _getCurrentPost$_link : false, postType: getCurrentPostType(), isAutosaving: isAutosavingPost(), hasNonPostEntityChanges: select(store_store).hasNonPostEntityChanges(), postStatusHasChanged: !!getPostEdits()?.status, postStatus: getEditedPostAttribute('status') }; }, []); if (isPublishing) { /* translators: button label text should, if possible, be under 16 characters. */ return (0,external_wp_i18n_namespaceObject.__)('Publishing…'); } else if ((isPublished || isBeingScheduled) && isSaving && !isAutosaving) { /* translators: button label text should, if possible, be under 16 characters. */ return (0,external_wp_i18n_namespaceObject.__)('Saving…'); } if (!hasPublishAction) { // TODO: this is because "Submit for review" string is too long in some languages. // @see https://github.com/WordPress/gutenberg/issues/10475 return isSmallerThanMediumViewport ? (0,external_wp_i18n_namespaceObject.__)('Publish') : (0,external_wp_i18n_namespaceObject.__)('Submit for Review'); } if (hasNonPostEntityChanges || isPublished || postStatusHasChanged && !['future', 'publish'].includes(postStatus) || !postStatusHasChanged && postStatus === 'future') { return (0,external_wp_i18n_namespaceObject.__)('Save'); } if (isBeingScheduled) { return (0,external_wp_i18n_namespaceObject.__)('Schedule'); } return (0,external_wp_i18n_namespaceObject.__)('Publish'); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-button/index.js /** * WordPress dependencies */ /** * Internal dependencies */ const post_publish_button_noop = () => {}; class PostPublishButton extends external_wp_element_namespaceObject.Component { constructor(props) { super(props); this.buttonNode = (0,external_wp_element_namespaceObject.createRef)(); this.createOnClick = this.createOnClick.bind(this); this.closeEntitiesSavedStates = this.closeEntitiesSavedStates.bind(this); this.state = { entitiesSavedStatesCallback: false }; } componentDidMount() { if (this.props.focusOnMount) { // This timeout is necessary to make sure the `useEffect` hook of // `useFocusReturn` gets the correct element (the button that opens the // PostPublishPanel) otherwise it will get this button. this.timeoutID = setTimeout(() => { this.buttonNode.current.focus(); }, 0); } } componentWillUnmount() { clearTimeout(this.timeoutID); } createOnClick(callback) { return (...args) => { const { hasNonPostEntityChanges, setEntitiesSavedStatesCallback } = this.props; // If a post with non-post entities is published, but the user // elects to not save changes to the non-post entities, those // entities will still be dirty when the Publish button is clicked. // We also need to check that the `setEntitiesSavedStatesCallback` // prop was passed. See https://github.com/WordPress/gutenberg/pull/37383 if (hasNonPostEntityChanges && setEntitiesSavedStatesCallback) { // The modal for multiple entity saving will open, // hold the callback for saving/publishing the post // so that we can call it if the post entity is checked. this.setState({ entitiesSavedStatesCallback: () => callback(...args) }); // Open the save panel by setting its callback. // To set a function on the useState hook, we must set it // with another function (() => myFunction). Passing the // function on its own will cause an error when called. setEntitiesSavedStatesCallback(() => this.closeEntitiesSavedStates); return post_publish_button_noop; } return callback(...args); }; } closeEntitiesSavedStates(savedEntities) { const { postType, postId } = this.props; const { entitiesSavedStatesCallback } = this.state; this.setState({ entitiesSavedStatesCallback: false }, () => { if (savedEntities && savedEntities.some(elt => elt.kind === 'postType' && elt.name === postType && elt.key === postId)) { // The post entity was checked, call the held callback from `createOnClick`. entitiesSavedStatesCallback(); } }); } render() { const { forceIsDirty, hasPublishAction, isBeingScheduled, isOpen, isPostSavingLocked, isPublishable, isPublished, isSaveable, isSaving, isAutoSaving, isToggle, savePostStatus, onSubmit = post_publish_button_noop, onToggle, visibility, hasNonPostEntityChanges, isSavingNonPostEntityChanges, postStatus, postStatusHasChanged } = this.props; const isButtonDisabled = (isSaving || !isSaveable || isPostSavingLocked || !isPublishable && !forceIsDirty) && (!hasNonPostEntityChanges || isSavingNonPostEntityChanges); const isToggleDisabled = (isPublished || isSaving || !isSaveable || !isPublishable && !forceIsDirty) && (!hasNonPostEntityChanges || isSavingNonPostEntityChanges); // If the new status has not changed explicitely, we derive it from // other factors, like having a publish action, etc.. We need to preserve // this because it affects when to show the pre and post publish panels. // If it has changed though explicitely, we need to respect that. let publishStatus = 'publish'; if (postStatusHasChanged) { publishStatus = postStatus; } else if (!hasPublishAction) { publishStatus = 'pending'; } else if (visibility === 'private') { publishStatus = 'private'; } else if (isBeingScheduled) { publishStatus = 'future'; } const onClickButton = () => { if (isButtonDisabled) { return; } onSubmit(); savePostStatus(publishStatus); }; // Callback to open the publish panel. const onClickToggle = () => { if (isToggleDisabled) { return; } onToggle(); }; const buttonProps = { 'aria-disabled': isButtonDisabled, className: 'editor-post-publish-button', isBusy: !isAutoSaving && isSaving, variant: 'primary', onClick: this.createOnClick(onClickButton) }; const toggleProps = { 'aria-disabled': isToggleDisabled, 'aria-expanded': isOpen, className: 'editor-post-publish-panel__toggle', isBusy: isSaving && isPublished, variant: 'primary', size: 'compact', onClick: this.createOnClick(onClickToggle) }; const componentProps = isToggle ? toggleProps : buttonProps; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { ref: this.buttonNode, ...componentProps, className: `${componentProps.className} editor-post-publish-button__button`, size: "compact", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PublishButtonLabel, {}) }) }); } } /* harmony default export */ const post_publish_button = ((0,external_wp_compose_namespaceObject.compose)([(0,external_wp_data_namespaceObject.withSelect)(select => { var _getCurrentPost$_link; const { isSavingPost, isAutosavingPost, isEditedPostBeingScheduled, getEditedPostVisibility, isCurrentPostPublished, isEditedPostSaveable, isEditedPostPublishable, isPostSavingLocked, getCurrentPost, getCurrentPostType, getCurrentPostId, hasNonPostEntityChanges, isSavingNonPostEntityChanges, getEditedPostAttribute, getPostEdits } = select(store_store); return { isSaving: isSavingPost(), isAutoSaving: isAutosavingPost(), isBeingScheduled: isEditedPostBeingScheduled(), visibility: getEditedPostVisibility(), isSaveable: isEditedPostSaveable(), isPostSavingLocked: isPostSavingLocked(), isPublishable: isEditedPostPublishable(), isPublished: isCurrentPostPublished(), hasPublishAction: (_getCurrentPost$_link = getCurrentPost()._links?.['wp:action-publish']) !== null && _getCurrentPost$_link !== void 0 ? _getCurrentPost$_link : false, postType: getCurrentPostType(), postId: getCurrentPostId(), postStatus: getEditedPostAttribute('status'), postStatusHasChanged: getPostEdits()?.status, hasNonPostEntityChanges: hasNonPostEntityChanges(), isSavingNonPostEntityChanges: isSavingNonPostEntityChanges() }; }), (0,external_wp_data_namespaceObject.withDispatch)(dispatch => { const { editPost, savePost } = dispatch(store_store); return { savePostStatus: status => { editPost({ status }, { undoIgnore: true }); savePost(); } }; })])(PostPublishButton)); ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/wordpress.js /** * WordPress dependencies */ const wordpress = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "-2 -2 24 24", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { d: "M20 10c0-5.51-4.49-10-10-10C4.48 0 0 4.49 0 10c0 5.52 4.48 10 10 10 5.51 0 10-4.48 10-10zM7.78 15.37L4.37 6.22c.55-.02 1.17-.08 1.17-.08.5-.06.44-1.13-.06-1.11 0 0-1.45.11-2.37.11-.18 0-.37 0-.58-.01C4.12 2.69 6.87 1.11 10 1.11c2.33 0 4.45.87 6.05 2.34-.68-.11-1.65.39-1.65 1.58 0 .74.45 1.36.9 2.1.35.61.55 1.36.55 2.46 0 1.49-1.4 5-1.4 5l-3.03-8.37c.54-.02.82-.17.82-.17.5-.05.44-1.25-.06-1.22 0 0-1.44.12-2.38.12-.87 0-2.33-.12-2.33-.12-.5-.03-.56 1.2-.06 1.22l.92.08 1.26 3.41zM17.41 10c.24-.64.74-1.87.43-4.25.7 1.29 1.05 2.71 1.05 4.25 0 3.29-1.73 6.24-4.4 7.78.97-2.59 1.94-5.2 2.92-7.78zM6.1 18.09C3.12 16.65 1.11 13.53 1.11 10c0-1.3.23-2.48.72-3.59C3.25 10.3 4.67 14.2 6.1 18.09zm4.03-6.63l2.58 6.98c-.86.29-1.76.45-2.71.45-.79 0-1.57-.11-2.29-.33.81-2.38 1.62-4.74 2.42-7.1z" }) }); /* harmony default export */ const library_wordpress = (wordpress); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-visibility/utils.js /** * WordPress dependencies */ const visibilityOptions = { public: { label: (0,external_wp_i18n_namespaceObject.__)('Public'), info: (0,external_wp_i18n_namespaceObject.__)('Visible to everyone.') }, private: { label: (0,external_wp_i18n_namespaceObject.__)('Private'), info: (0,external_wp_i18n_namespaceObject.__)('Only visible to site admins and editors.') }, password: { label: (0,external_wp_i18n_namespaceObject.__)('Password protected'), info: (0,external_wp_i18n_namespaceObject.__)('Only those with the password can view this post.') } }; ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-visibility/index.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Allows users to set the visibility of a post. * * @param {Object} props The component props. * @param {Function} props.onClose Function to call when the popover is closed. * @return {JSX.Element} The rendered component. */ function PostVisibility({ onClose }) { const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(PostVisibility); const { status, visibility, password } = (0,external_wp_data_namespaceObject.useSelect)(select => ({ status: select(store_store).getEditedPostAttribute('status'), visibility: select(store_store).getEditedPostVisibility(), password: select(store_store).getEditedPostAttribute('password') })); const { editPost, savePost } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); const [hasPassword, setHasPassword] = (0,external_wp_element_namespaceObject.useState)(!!password); const [showPrivateConfirmDialog, setShowPrivateConfirmDialog] = (0,external_wp_element_namespaceObject.useState)(false); const setPublic = () => { editPost({ status: visibility === 'private' ? 'draft' : status, password: '' }); setHasPassword(false); }; const setPrivate = () => { setShowPrivateConfirmDialog(true); }; const confirmPrivate = () => { editPost({ status: 'private', password: '' }); setHasPassword(false); setShowPrivateConfirmDialog(false); savePost(); }; const handleDialogCancel = () => { setShowPrivateConfirmDialog(false); }; const setPasswordProtected = () => { editPost({ status: visibility === 'private' ? 'draft' : status, password: password || '' }); setHasPassword(true); }; const updatePassword = event => { editPost({ password: event.target.value }); }; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "editor-post-visibility", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalInspectorPopoverHeader, { title: (0,external_wp_i18n_namespaceObject.__)('Visibility'), help: (0,external_wp_i18n_namespaceObject.__)('Control how this post is viewed.'), onClose: onClose }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("fieldset", { className: "editor-post-visibility__fieldset", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.VisuallyHidden, { as: "legend", children: (0,external_wp_i18n_namespaceObject.__)('Visibility') }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostVisibilityChoice, { instanceId: instanceId, value: "public", label: visibilityOptions.public.label, info: visibilityOptions.public.info, checked: visibility === 'public' && !hasPassword, onChange: setPublic }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostVisibilityChoice, { instanceId: instanceId, value: "private", label: visibilityOptions.private.label, info: visibilityOptions.private.info, checked: visibility === 'private', onChange: setPrivate }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostVisibilityChoice, { instanceId: instanceId, value: "password", label: visibilityOptions.password.label, info: visibilityOptions.password.info, checked: hasPassword, onChange: setPasswordProtected }), hasPassword && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "editor-post-visibility__password", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.VisuallyHidden, { as: "label", htmlFor: `editor-post-visibility__password-input-${instanceId}`, children: (0,external_wp_i18n_namespaceObject.__)('Create password') }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("input", { className: "editor-post-visibility__password-input", id: `editor-post-visibility__password-input-${instanceId}`, type: "text", onChange: updatePassword, value: password, placeholder: (0,external_wp_i18n_namespaceObject.__)('Use a secure password') })] })] }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalConfirmDialog, { isOpen: showPrivateConfirmDialog, onConfirm: confirmPrivate, onCancel: handleDialogCancel, confirmButtonText: (0,external_wp_i18n_namespaceObject.__)('Publish'), size: "medium", children: (0,external_wp_i18n_namespaceObject.__)('Would you like to privately publish this post now?') })] }); } function PostVisibilityChoice({ instanceId, value, label, info, ...props }) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "editor-post-visibility__choice", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("input", { type: "radio", name: `editor-post-visibility__setting-${instanceId}`, value: value, id: `editor-post-${value}-${instanceId}`, "aria-describedby": `editor-post-${value}-${instanceId}-description`, className: "editor-post-visibility__radio", ...props }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("label", { htmlFor: `editor-post-${value}-${instanceId}`, className: "editor-post-visibility__label", children: label }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { id: `editor-post-${value}-${instanceId}-description`, className: "editor-post-visibility__info", children: info })] }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-visibility/label.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Returns the label for the current post visibility setting. * * @return {string} Post visibility label. */ function PostVisibilityLabel() { return usePostVisibilityLabel(); } /** * Get the label for the current post visibility setting. * * @return {string} Post visibility label. */ function usePostVisibilityLabel() { const visibility = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getEditedPostVisibility()); return visibilityOptions[visibility]?.label; } ;// CONCATENATED MODULE: ./node_modules/date-fns/toDate.mjs /** * @name toDate * @category Common Helpers * @summary Convert the given argument to an instance of Date. * * @description * Convert the given argument to an instance of Date. * * If the argument is an instance of Date, the function returns its clone. * * If the argument is a number, it is treated as a timestamp. * * If the argument is none of the above, the function returns Invalid Date. * * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`. * * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc). * * @param argument - The value to convert * * @returns The parsed date in the local time zone * * @example * // Clone the date: * const result = toDate(new Date(2014, 1, 11, 11, 30, 30)) * //=> Tue Feb 11 2014 11:30:30 * * @example * // Convert the timestamp to date: * const result = toDate(1392098430000) * //=> Tue Feb 11 2014 11:30:30 */ function toDate(argument) { const argStr = Object.prototype.toString.call(argument); // Clone the date if ( argument instanceof Date || (typeof argument === "object" && argStr === "[object Date]") ) { // Prevent the date to lose the milliseconds when passed to new Date() in IE10 return new argument.constructor(+argument); } else if ( typeof argument === "number" || argStr === "[object Number]" || typeof argument === "string" || argStr === "[object String]" ) { // TODO: Can we get rid of as? return new Date(argument); } else { // TODO: Can we get rid of as? return new Date(NaN); } } // Fallback for modularized imports: /* harmony default export */ const date_fns_toDate = ((/* unused pure expression or super */ null && (toDate))); ;// CONCATENATED MODULE: ./node_modules/date-fns/startOfMonth.mjs /** * @name startOfMonth * @category Month Helpers * @summary Return the start of a month for the given date. * * @description * Return the start of a month for the given date. * The result will be in the local timezone. * * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc). * * @param date - The original date * * @returns The start of a month * * @example * // The start of a month for 2 September 2014 11:55:00: * const result = startOfMonth(new Date(2014, 8, 2, 11, 55, 0)) * //=> Mon Sep 01 2014 00:00:00 */ function startOfMonth(date) { const _date = toDate(date); _date.setDate(1); _date.setHours(0, 0, 0, 0); return _date; } // Fallback for modularized imports: /* harmony default export */ const date_fns_startOfMonth = ((/* unused pure expression or super */ null && (startOfMonth))); ;// CONCATENATED MODULE: ./node_modules/date-fns/endOfMonth.mjs /** * @name endOfMonth * @category Month Helpers * @summary Return the end of a month for the given date. * * @description * Return the end of a month for the given date. * The result will be in the local timezone. * * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc). * * @param date - The original date * * @returns The end of a month * * @example * // The end of a month for 2 September 2014 11:55:00: * const result = endOfMonth(new Date(2014, 8, 2, 11, 55, 0)) * //=> Tue Sep 30 2014 23:59:59.999 */ function endOfMonth(date) { const _date = toDate(date); const month = _date.getMonth(); _date.setFullYear(_date.getFullYear(), month + 1, 0); _date.setHours(23, 59, 59, 999); return _date; } // Fallback for modularized imports: /* harmony default export */ const date_fns_endOfMonth = ((/* unused pure expression or super */ null && (endOfMonth))); ;// CONCATENATED MODULE: ./node_modules/date-fns/constants.mjs /** * @module constants * @summary Useful constants * @description * Collection of useful date constants. * * The constants could be imported from `date-fns/constants`: * * ```ts * import { maxTime, minTime } from "./constants/date-fns/constants"; * * function isAllowedTime(time) { * return time <= maxTime && time >= minTime; * } * ``` */ /** * @constant * @name daysInWeek * @summary Days in 1 week. */ const daysInWeek = 7; /** * @constant * @name daysInYear * @summary Days in 1 year. * * @description * How many days in a year. * * One years equals 365.2425 days according to the formula: * * > Leap year occures every 4 years, except for years that are divisable by 100 and not divisable by 400. * > 1 mean year = (365+1/4-1/100+1/400) days = 365.2425 days */ const daysInYear = 365.2425; /** * @constant * @name maxTime * @summary Maximum allowed time. * * @example * import { maxTime } from "./constants/date-fns/constants"; * * const isValid = 8640000000000001 <= maxTime; * //=> false * * new Date(8640000000000001); * //=> Invalid Date */ const maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1000; /** * @constant * @name minTime * @summary Minimum allowed time. * * @example * import { minTime } from "./constants/date-fns/constants"; * * const isValid = -8640000000000001 >= minTime; * //=> false * * new Date(-8640000000000001) * //=> Invalid Date */ const minTime = -maxTime; /** * @constant * @name millisecondsInWeek * @summary Milliseconds in 1 week. */ const millisecondsInWeek = 604800000; /** * @constant * @name millisecondsInDay * @summary Milliseconds in 1 day. */ const millisecondsInDay = 86400000; /** * @constant * @name millisecondsInMinute * @summary Milliseconds in 1 minute */ const millisecondsInMinute = 60000; /** * @constant * @name millisecondsInHour * @summary Milliseconds in 1 hour */ const millisecondsInHour = 3600000; /** * @constant * @name millisecondsInSecond * @summary Milliseconds in 1 second */ const millisecondsInSecond = 1000; /** * @constant * @name minutesInYear * @summary Minutes in 1 year. */ const minutesInYear = 525600; /** * @constant * @name minutesInMonth * @summary Minutes in 1 month. */ const minutesInMonth = 43200; /** * @constant * @name minutesInDay * @summary Minutes in 1 day. */ const minutesInDay = 1440; /** * @constant * @name minutesInHour * @summary Minutes in 1 hour. */ const minutesInHour = 60; /** * @constant * @name monthsInQuarter * @summary Months in 1 quarter. */ const monthsInQuarter = 3; /** * @constant * @name monthsInYear * @summary Months in 1 year. */ const monthsInYear = 12; /** * @constant * @name quartersInYear * @summary Quarters in 1 year */ const quartersInYear = 4; /** * @constant * @name secondsInHour * @summary Seconds in 1 hour. */ const secondsInHour = 3600; /** * @constant * @name secondsInMinute * @summary Seconds in 1 minute. */ const secondsInMinute = 60; /** * @constant * @name secondsInDay * @summary Seconds in 1 day. */ const secondsInDay = secondsInHour * 24; /** * @constant * @name secondsInWeek * @summary Seconds in 1 week. */ const secondsInWeek = secondsInDay * 7; /** * @constant * @name secondsInYear * @summary Seconds in 1 year. */ const secondsInYear = secondsInDay * daysInYear; /** * @constant * @name secondsInMonth * @summary Seconds in 1 month */ const secondsInMonth = secondsInYear / 12; /** * @constant * @name secondsInQuarter * @summary Seconds in 1 quarter. */ const secondsInQuarter = secondsInMonth * 3; ;// CONCATENATED MODULE: ./node_modules/date-fns/parseISO.mjs /** * The {@link parseISO} function options. */ /** * @name parseISO * @category Common Helpers * @summary Parse ISO string * * @description * Parse the given string in ISO 8601 format and return an instance of Date. * * Function accepts complete ISO 8601 formats as well as partial implementations. * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601 * * If the argument isn't a string, the function cannot parse the string or * the values are invalid, it returns Invalid Date. * * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc). * * @param argument - The value to convert * @param options - An object with options * * @returns The parsed date in the local time zone * * @example * // Convert string '2014-02-11T11:30:30' to date: * const result = parseISO('2014-02-11T11:30:30') * //=> Tue Feb 11 2014 11:30:30 * * @example * // Convert string '+02014101' to date, * // if the additional number of digits in the extended year format is 1: * const result = parseISO('+02014101', { additionalDigits: 1 }) * //=> Fri Apr 11 2014 00:00:00 */ function parseISO(argument, options) { const additionalDigits = options?.additionalDigits ?? 2; const dateStrings = splitDateString(argument); let date; if (dateStrings.date) { const parseYearResult = parseYear(dateStrings.date, additionalDigits); date = parseDate(parseYearResult.restDateString, parseYearResult.year); } if (!date || isNaN(date.getTime())) { return new Date(NaN); } const timestamp = date.getTime(); let time = 0; let offset; if (dateStrings.time) { time = parseTime(dateStrings.time); if (isNaN(time)) { return new Date(NaN); } } if (dateStrings.timezone) { offset = parseTimezone(dateStrings.timezone); if (isNaN(offset)) { return new Date(NaN); } } else { const dirtyDate = new Date(timestamp + time); // JS parsed string assuming it's in UTC timezone // but we need it to be parsed in our timezone // so we use utc values to build date in our timezone. // Year values from 0 to 99 map to the years 1900 to 1999 // so set year explicitly with setFullYear. const result = new Date(0); result.setFullYear( dirtyDate.getUTCFullYear(), dirtyDate.getUTCMonth(), dirtyDate.getUTCDate(), ); result.setHours( dirtyDate.getUTCHours(), dirtyDate.getUTCMinutes(), dirtyDate.getUTCSeconds(), dirtyDate.getUTCMilliseconds(), ); return result; } return new Date(timestamp + time + offset); } const patterns = { dateTimeDelimiter: /[T ]/, timeZoneDelimiter: /[Z ]/i, timezone: /([Z+-].*)$/, }; const dateRegex = /^-?(?:(\d{3})|(\d{2})(?:-?(\d{2}))?|W(\d{2})(?:-?(\d{1}))?|)$/; const timeRegex = /^(\d{2}(?:[.,]\d*)?)(?::?(\d{2}(?:[.,]\d*)?))?(?::?(\d{2}(?:[.,]\d*)?))?$/; const timezoneRegex = /^([+-])(\d{2})(?::?(\d{2}))?$/; function splitDateString(dateString) { const dateStrings = {}; const array = dateString.split(patterns.dateTimeDelimiter); let timeString; // The regex match should only return at maximum two array elements. // [date], [time], or [date, time]. if (array.length > 2) { return dateStrings; } if (/:/.test(array[0])) { timeString = array[0]; } else { dateStrings.date = array[0]; timeString = array[1]; if (patterns.timeZoneDelimiter.test(dateStrings.date)) { dateStrings.date = dateString.split(patterns.timeZoneDelimiter)[0]; timeString = dateString.substr( dateStrings.date.length, dateString.length, ); } } if (timeString) { const token = patterns.timezone.exec(timeString); if (token) { dateStrings.time = timeString.replace(token[1], ""); dateStrings.timezone = token[1]; } else { dateStrings.time = timeString; } } return dateStrings; } function parseYear(dateString, additionalDigits) { const regex = new RegExp( "^(?:(\\d{4}|[+-]\\d{" + (4 + additionalDigits) + "})|(\\d{2}|[+-]\\d{" + (2 + additionalDigits) + "})$)", ); const captures = dateString.match(regex); // Invalid ISO-formatted year if (!captures) return { year: NaN, restDateString: "" }; const year = captures[1] ? parseInt(captures[1]) : null; const century = captures[2] ? parseInt(captures[2]) : null; // either year or century is null, not both return { year: century === null ? year : century * 100, restDateString: dateString.slice((captures[1] || captures[2]).length), }; } function parseDate(dateString, year) { // Invalid ISO-formatted year if (year === null) return new Date(NaN); const captures = dateString.match(dateRegex); // Invalid ISO-formatted string if (!captures) return new Date(NaN); const isWeekDate = !!captures[4]; const dayOfYear = parseDateUnit(captures[1]); const month = parseDateUnit(captures[2]) - 1; const day = parseDateUnit(captures[3]); const week = parseDateUnit(captures[4]); const dayOfWeek = parseDateUnit(captures[5]) - 1; if (isWeekDate) { if (!validateWeekDate(year, week, dayOfWeek)) { return new Date(NaN); } return dayOfISOWeekYear(year, week, dayOfWeek); } else { const date = new Date(0); if ( !validateDate(year, month, day) || !validateDayOfYearDate(year, dayOfYear) ) { return new Date(NaN); } date.setUTCFullYear(year, month, Math.max(dayOfYear, day)); return date; } } function parseDateUnit(value) { return value ? parseInt(value) : 1; } function parseTime(timeString) { const captures = timeString.match(timeRegex); if (!captures) return NaN; // Invalid ISO-formatted time const hours = parseTimeUnit(captures[1]); const minutes = parseTimeUnit(captures[2]); const seconds = parseTimeUnit(captures[3]); if (!validateTime(hours, minutes, seconds)) { return NaN; } return ( hours * millisecondsInHour + minutes * millisecondsInMinute + seconds * 1000 ); } function parseTimeUnit(value) { return (value && parseFloat(value.replace(",", "."))) || 0; } function parseTimezone(timezoneString) { if (timezoneString === "Z") return 0; const captures = timezoneString.match(timezoneRegex); if (!captures) return 0; const sign = captures[1] === "+" ? -1 : 1; const hours = parseInt(captures[2]); const minutes = (captures[3] && parseInt(captures[3])) || 0; if (!validateTimezone(hours, minutes)) { return NaN; } return sign * (hours * millisecondsInHour + minutes * millisecondsInMinute); } function dayOfISOWeekYear(isoWeekYear, week, day) { const date = new Date(0); date.setUTCFullYear(isoWeekYear, 0, 4); const fourthOfJanuaryDay = date.getUTCDay() || 7; const diff = (week - 1) * 7 + day + 1 - fourthOfJanuaryDay; date.setUTCDate(date.getUTCDate() + diff); return date; } // Validation functions // February is null to handle the leap year (using ||) const daysInMonths = [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; function isLeapYearIndex(year) { return year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0); } function validateDate(year, month, date) { return ( month >= 0 && month <= 11 && date >= 1 && date <= (daysInMonths[month] || (isLeapYearIndex(year) ? 29 : 28)) ); } function validateDayOfYearDate(year, dayOfYear) { return dayOfYear >= 1 && dayOfYear <= (isLeapYearIndex(year) ? 366 : 365); } function validateWeekDate(_year, week, day) { return week >= 1 && week <= 53 && day >= 0 && day <= 6; } function validateTime(hours, minutes, seconds) { if (hours === 24) { return minutes === 0 && seconds === 0; } return ( seconds >= 0 && seconds < 60 && minutes >= 0 && minutes < 60 && hours >= 0 && hours < 25 ); } function validateTimezone(_hours, minutes) { return minutes >= 0 && minutes <= 59; } // Fallback for modularized imports: /* harmony default export */ const date_fns_parseISO = ((/* unused pure expression or super */ null && (parseISO))); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-schedule/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ const { PrivatePublishDateTimePicker } = unlock(external_wp_blockEditor_namespaceObject.privateApis); /** * Renders the PostSchedule component. It allows the user to schedule a post. * * @param {Object} props Props. * @param {Function} props.onClose Function to close the component. * * @return {Component} The component to be rendered. */ function PostSchedule(props) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PrivatePostSchedule, { ...props, showPopoverHeaderActions: true, isCompact: false }); } function PrivatePostSchedule({ onClose, showPopoverHeaderActions, isCompact }) { const { postDate, postType } = (0,external_wp_data_namespaceObject.useSelect)(select => ({ postDate: select(store_store).getEditedPostAttribute('date'), postType: select(store_store).getCurrentPostType() }), []); const { editPost } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); const onUpdateDate = date => editPost({ date }); const [previewedMonth, setPreviewedMonth] = (0,external_wp_element_namespaceObject.useState)(startOfMonth(new Date(postDate))); // Pick up published and schduled site posts. const eventsByPostType = (0,external_wp_data_namespaceObject.useSelect)(select => select(external_wp_coreData_namespaceObject.store).getEntityRecords('postType', postType, { status: 'publish,future', after: startOfMonth(previewedMonth).toISOString(), before: endOfMonth(previewedMonth).toISOString(), exclude: [select(store_store).getCurrentPostId()], per_page: 100, _fields: 'id,date' }), [previewedMonth, postType]); const events = (0,external_wp_element_namespaceObject.useMemo)(() => (eventsByPostType || []).map(({ date: eventDate }) => ({ date: new Date(eventDate) })), [eventsByPostType]); const settings = (0,external_wp_date_namespaceObject.getSettings)(); // To know if the current timezone is a 12 hour time with look for "a" in the time format // We also make sure this a is not escaped by a "/" const is12HourTime = /a(?!\\)/i.test(settings.formats.time.toLowerCase() // Test only the lower case a. .replace(/\\\\/g, '') // Replace "//" with empty strings. .split('').reverse().join('') // Reverse the string and test for "a" not followed by a slash. ); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PrivatePublishDateTimePicker, { currentDate: postDate, onChange: onUpdateDate, is12Hour: is12HourTime, events: events, onMonthPreviewed: date => setPreviewedMonth(parseISO(date)), onClose: onClose, isCompact: isCompact, showPopoverHeaderActions: showPopoverHeaderActions }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-schedule/label.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Renders the PostScheduleLabel component. * * @param {Object} props Props. * * @return {Component} The component to be rendered. */ function PostScheduleLabel(props) { return usePostScheduleLabel(props); } /** * Custom hook to get the label for post schedule. * * @param {Object} options Options for the hook. * @param {boolean} options.full Whether to get the full label or not. Default is false. * * @return {string} The label for post schedule. */ function usePostScheduleLabel({ full = false } = {}) { const { date, isFloating } = (0,external_wp_data_namespaceObject.useSelect)(select => ({ date: select(store_store).getEditedPostAttribute('date'), isFloating: select(store_store).isEditedPostDateFloating() }), []); return full ? getFullPostScheduleLabel(date) : getPostScheduleLabel(date, { isFloating }); } function getFullPostScheduleLabel(dateAttribute) { const date = (0,external_wp_date_namespaceObject.getDate)(dateAttribute); const timezoneAbbreviation = getTimezoneAbbreviation(); const formattedDate = (0,external_wp_date_namespaceObject.dateI18n)( // translators: If using a space between 'g:i' and 'a', use a non-breaking space. (0,external_wp_i18n_namespaceObject._x)('F j, Y g:i\xa0a', 'post schedule full date format'), date); return (0,external_wp_i18n_namespaceObject.isRTL)() ? `${timezoneAbbreviation} ${formattedDate}` : `${formattedDate} ${timezoneAbbreviation}`; } function getPostScheduleLabel(dateAttribute, { isFloating = false, now = new Date() } = {}) { if (!dateAttribute || isFloating) { return (0,external_wp_i18n_namespaceObject.__)('Immediately'); } // If the user timezone does not equal the site timezone then using words // like 'tomorrow' is confusing, so show the full date. if (!isTimezoneSameAsSiteTimezone(now)) { return getFullPostScheduleLabel(dateAttribute); } const date = (0,external_wp_date_namespaceObject.getDate)(dateAttribute); if (isSameDay(date, now)) { return (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %s: Time of day the post is scheduled for. (0,external_wp_i18n_namespaceObject.__)('Today at %s'), // translators: If using a space between 'g:i' and 'a', use a non-breaking space. (0,external_wp_date_namespaceObject.dateI18n)((0,external_wp_i18n_namespaceObject._x)('g:i\xa0a', 'post schedule time format'), date)); } const tomorrow = new Date(now); tomorrow.setDate(tomorrow.getDate() + 1); if (isSameDay(date, tomorrow)) { return (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %s: Time of day the post is scheduled for. (0,external_wp_i18n_namespaceObject.__)('Tomorrow at %s'), // translators: If using a space between 'g:i' and 'a', use a non-breaking space. (0,external_wp_date_namespaceObject.dateI18n)((0,external_wp_i18n_namespaceObject._x)('g:i\xa0a', 'post schedule time format'), date)); } if (date.getFullYear() === now.getFullYear()) { return (0,external_wp_date_namespaceObject.dateI18n)( // translators: If using a space between 'g:i' and 'a', use a non-breaking space. (0,external_wp_i18n_namespaceObject._x)('F j g:i\xa0a', 'post schedule date format without year'), date); } return (0,external_wp_date_namespaceObject.dateI18n)( // translators: Use a non-breaking space between 'g:i' and 'a' if appropriate. (0,external_wp_i18n_namespaceObject._x)('F j, Y g:i\xa0a', 'post schedule full date format'), date); } function getTimezoneAbbreviation() { const { timezone } = (0,external_wp_date_namespaceObject.getSettings)(); if (timezone.abbr && isNaN(Number(timezone.abbr))) { return timezone.abbr; } const symbol = timezone.offset < 0 ? '' : '+'; return `UTC${symbol}${timezone.offsetFormatted}`; } function isTimezoneSameAsSiteTimezone(date) { const { timezone } = (0,external_wp_date_namespaceObject.getSettings)(); const siteOffset = Number(timezone.offset); const dateOffset = -1 * (date.getTimezoneOffset() / 60); return siteOffset === dateOffset; } function isSameDay(left, right) { return left.getDate() === right.getDate() && left.getMonth() === right.getMonth() && left.getFullYear() === right.getFullYear(); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-taxonomies/most-used-terms.js /** * WordPress dependencies */ /** * Internal dependencies */ const MIN_MOST_USED_TERMS = 3; const DEFAULT_QUERY = { per_page: 10, orderby: 'count', order: 'desc', hide_empty: true, _fields: 'id,name,count', context: 'view' }; function MostUsedTerms({ onSelect, taxonomy }) { const { _terms, showTerms } = (0,external_wp_data_namespaceObject.useSelect)(select => { const mostUsedTerms = select(external_wp_coreData_namespaceObject.store).getEntityRecords('taxonomy', taxonomy.slug, DEFAULT_QUERY); return { _terms: mostUsedTerms, showTerms: mostUsedTerms?.length >= MIN_MOST_USED_TERMS }; }, [taxonomy.slug]); if (!showTerms) { return null; } const terms = unescapeTerms(_terms); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "editor-post-taxonomies__flat-term-most-used", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.BaseControl.VisualLabel, { as: "h3", className: "editor-post-taxonomies__flat-term-most-used-label", children: taxonomy.labels.most_used }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("ul", { role: "list", className: "editor-post-taxonomies__flat-term-most-used-list", children: terms.map(term => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("li", { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { variant: "link", onClick: () => onSelect(term), children: term.name }) }, term.id)) })] }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-taxonomies/flat-term-selector.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Shared reference to an empty array for cases where it is important to avoid * returning a new array reference on every invocation. * * @type {Array<any>} */ const flat_term_selector_EMPTY_ARRAY = []; /** * Module constants */ const MAX_TERMS_SUGGESTIONS = 20; const flat_term_selector_DEFAULT_QUERY = { per_page: MAX_TERMS_SUGGESTIONS, _fields: 'id,name', context: 'view' }; const isSameTermName = (termA, termB) => unescapeString(termA).toLowerCase() === unescapeString(termB).toLowerCase(); const termNamesToIds = (names, terms) => { return names.map(termName => terms.find(term => isSameTermName(term.name, termName))?.id).filter(id => id !== undefined); }; function FlatTermSelector({ slug }) { var _taxonomy$labels$add_, _taxonomy$labels$sing2; const [values, setValues] = (0,external_wp_element_namespaceObject.useState)([]); const [search, setSearch] = (0,external_wp_element_namespaceObject.useState)(''); const debouncedSearch = (0,external_wp_compose_namespaceObject.useDebounce)(setSearch, 500); const { terms, termIds, taxonomy, hasAssignAction, hasCreateAction, hasResolvedTerms } = (0,external_wp_data_namespaceObject.useSelect)(select => { var _post$_links, _post$_links2; const { getCurrentPost, getEditedPostAttribute } = select(store_store); const { getEntityRecords, getTaxonomy, hasFinishedResolution } = select(external_wp_coreData_namespaceObject.store); const post = getCurrentPost(); const _taxonomy = getTaxonomy(slug); const _termIds = _taxonomy ? getEditedPostAttribute(_taxonomy.rest_base) : flat_term_selector_EMPTY_ARRAY; const query = { ...flat_term_selector_DEFAULT_QUERY, include: _termIds.join(','), per_page: -1 }; return { hasCreateAction: _taxonomy ? (_post$_links = post._links?.['wp:action-create-' + _taxonomy.rest_base]) !== null && _post$_links !== void 0 ? _post$_links : false : false, hasAssignAction: _taxonomy ? (_post$_links2 = post._links?.['wp:action-assign-' + _taxonomy.rest_base]) !== null && _post$_links2 !== void 0 ? _post$_links2 : false : false, taxonomy: _taxonomy, termIds: _termIds, terms: _termIds.length ? getEntityRecords('taxonomy', slug, query) : flat_term_selector_EMPTY_ARRAY, hasResolvedTerms: hasFinishedResolution('getEntityRecords', ['taxonomy', slug, query]) }; }, [slug]); const { searchResults } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { getEntityRecords } = select(external_wp_coreData_namespaceObject.store); return { searchResults: !!search ? getEntityRecords('taxonomy', slug, { ...flat_term_selector_DEFAULT_QUERY, search }) : flat_term_selector_EMPTY_ARRAY }; }, [search, slug]); // Update terms state only after the selectors are resolved. // We're using this to avoid terms temporarily disappearing on slow networks // while core data makes REST API requests. (0,external_wp_element_namespaceObject.useEffect)(() => { if (hasResolvedTerms) { const newValues = (terms !== null && terms !== void 0 ? terms : []).map(term => unescapeString(term.name)); setValues(newValues); } }, [terms, hasResolvedTerms]); const suggestions = (0,external_wp_element_namespaceObject.useMemo)(() => { return (searchResults !== null && searchResults !== void 0 ? searchResults : []).map(term => unescapeString(term.name)); }, [searchResults]); const { editPost } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); const { saveEntityRecord } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); const { createErrorNotice } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); if (!hasAssignAction) { return null; } async function findOrCreateTerm(term) { try { const newTerm = await saveEntityRecord('taxonomy', slug, term, { throwOnError: true }); return unescapeTerm(newTerm); } catch (error) { if (error.code !== 'term_exists') { throw error; } return { id: error.data.term_id, name: term.name }; } } function onUpdateTerms(newTermIds) { editPost({ [taxonomy.rest_base]: newTermIds }); } function onChange(termNames) { const availableTerms = [...(terms !== null && terms !== void 0 ? terms : []), ...(searchResults !== null && searchResults !== void 0 ? searchResults : [])]; const uniqueTerms = termNames.reduce((acc, name) => { if (!acc.some(n => n.toLowerCase() === name.toLowerCase())) { acc.push(name); } return acc; }, []); const newTermNames = uniqueTerms.filter(termName => !availableTerms.find(term => isSameTermName(term.name, termName))); // Optimistically update term values. // The selector will always re-fetch terms later. setValues(uniqueTerms); if (newTermNames.length === 0) { onUpdateTerms(termNamesToIds(uniqueTerms, availableTerms)); return; } if (!hasCreateAction) { return; } Promise.all(newTermNames.map(termName => findOrCreateTerm({ name: termName }))).then(newTerms => { const newAvailableTerms = availableTerms.concat(newTerms); onUpdateTerms(termNamesToIds(uniqueTerms, newAvailableTerms)); }).catch(error => { createErrorNotice(error.message, { type: 'snackbar' }); // In case of a failure, try assigning available terms. // This will invalidate the optimistic update. onUpdateTerms(termNamesToIds(uniqueTerms, availableTerms)); }); } function appendTerm(newTerm) { var _taxonomy$labels$sing; if (termIds.includes(newTerm.id)) { return; } const newTermIds = [...termIds, newTerm.id]; const defaultName = slug === 'post_tag' ? (0,external_wp_i18n_namespaceObject.__)('Tag') : (0,external_wp_i18n_namespaceObject.__)('Term'); const termAddedMessage = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: term name. */ (0,external_wp_i18n_namespaceObject._x)('%s added', 'term'), (_taxonomy$labels$sing = taxonomy?.labels?.singular_name) !== null && _taxonomy$labels$sing !== void 0 ? _taxonomy$labels$sing : defaultName); (0,external_wp_a11y_namespaceObject.speak)(termAddedMessage, 'assertive'); onUpdateTerms(newTermIds); } const newTermLabel = (_taxonomy$labels$add_ = taxonomy?.labels?.add_new_item) !== null && _taxonomy$labels$add_ !== void 0 ? _taxonomy$labels$add_ : slug === 'post_tag' ? (0,external_wp_i18n_namespaceObject.__)('Add new tag') : (0,external_wp_i18n_namespaceObject.__)('Add new Term'); const singularName = (_taxonomy$labels$sing2 = taxonomy?.labels?.singular_name) !== null && _taxonomy$labels$sing2 !== void 0 ? _taxonomy$labels$sing2 : slug === 'post_tag' ? (0,external_wp_i18n_namespaceObject.__)('Tag') : (0,external_wp_i18n_namespaceObject.__)('Term'); const termAddedLabel = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: term name. */ (0,external_wp_i18n_namespaceObject._x)('%s added', 'term'), singularName); const termRemovedLabel = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: term name. */ (0,external_wp_i18n_namespaceObject._x)('%s removed', 'term'), singularName); const removeTermLabel = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: term name. */ (0,external_wp_i18n_namespaceObject._x)('Remove %s', 'term'), singularName); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.FormTokenField, { __next40pxDefaultSize: true, value: values, suggestions: suggestions, onChange: onChange, onInputChange: debouncedSearch, maxSuggestions: MAX_TERMS_SUGGESTIONS, label: newTermLabel, messages: { added: termAddedLabel, removed: termRemovedLabel, remove: removeTermLabel } }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(MostUsedTerms, { taxonomy: taxonomy, onSelect: appendTerm })] }); } /* harmony default export */ const flat_term_selector = ((0,external_wp_components_namespaceObject.withFilters)('editor.PostTaxonomyType')(FlatTermSelector)); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-panel/maybe-tags-panel.js /** * WordPress dependencies */ /** * Internal dependencies */ const TagsPanel = () => { const panelBodyTitle = [(0,external_wp_i18n_namespaceObject.__)('Suggestion:'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { className: "editor-post-publish-panel__link", children: (0,external_wp_i18n_namespaceObject.__)('Add tags') }, "label")]; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.PanelBody, { initialOpen: false, title: panelBodyTitle, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { children: (0,external_wp_i18n_namespaceObject.__)('Tags help users and search engines navigate your site and find your content. Add a few keywords to describe your post.') }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(flat_term_selector, { slug: "post_tag" })] }); }; const MaybeTagsPanel = () => { const { hasTags, isPostTypeSupported } = (0,external_wp_data_namespaceObject.useSelect)(select => { const postType = select(store_store).getCurrentPostType(); const tagsTaxonomy = select(external_wp_coreData_namespaceObject.store).getTaxonomy('post_tag'); const _isPostTypeSupported = tagsTaxonomy?.types?.includes(postType); const areTagsFetched = tagsTaxonomy !== undefined; const tags = tagsTaxonomy && select(store_store).getEditedPostAttribute(tagsTaxonomy.rest_base); return { hasTags: !!tags?.length, isPostTypeSupported: areTagsFetched && _isPostTypeSupported }; }, []); const [hadTagsWhenOpeningThePanel] = (0,external_wp_element_namespaceObject.useState)(hasTags); if (!isPostTypeSupported) { return null; } /* * We only want to show the tag panel if the post didn't have * any tags when the user hit the Publish button. * * We can't use the prop.hasTags because it'll change to true * if the user adds a new tag within the pre-publish panel. * This would force a re-render and a new prop.hasTags check, * hiding this panel and keeping the user from adding * more than one tag. */ if (!hadTagsWhenOpeningThePanel) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TagsPanel, {}); } return null; }; /* harmony default export */ const maybe_tags_panel = (MaybeTagsPanel); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-panel/maybe-post-format-panel.js /** * WordPress dependencies */ /** * Internal dependencies */ const getSuggestion = (supportedFormats, suggestedPostFormat) => { const formats = POST_FORMATS.filter(format => supportedFormats?.includes(format.id)); return formats.find(format => format.id === suggestedPostFormat); }; const PostFormatSuggestion = ({ suggestedPostFormat, suggestionText, onUpdatePostFormat }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { variant: "link", onClick: () => onUpdatePostFormat(suggestedPostFormat), children: suggestionText }); function PostFormatPanel() { const { currentPostFormat, suggestion } = (0,external_wp_data_namespaceObject.useSelect)(select => { var _select$getThemeSuppo; const { getEditedPostAttribute, getSuggestedPostFormat } = select(store_store); const supportedFormats = (_select$getThemeSuppo = select(external_wp_coreData_namespaceObject.store).getThemeSupports().formats) !== null && _select$getThemeSuppo !== void 0 ? _select$getThemeSuppo : []; return { currentPostFormat: getEditedPostAttribute('format'), suggestion: getSuggestion(supportedFormats, getSuggestedPostFormat()) }; }, []); const { editPost } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); const onUpdatePostFormat = format => editPost({ format }); const panelBodyTitle = [(0,external_wp_i18n_namespaceObject.__)('Suggestion:'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { className: "editor-post-publish-panel__link", children: (0,external_wp_i18n_namespaceObject.__)('Use a post format') }, "label")]; if (!suggestion || suggestion.id === currentPostFormat) { return null; } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.PanelBody, { initialOpen: false, title: panelBodyTitle, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { children: (0,external_wp_i18n_namespaceObject.__)('Your theme uses post formats to highlight different kinds of content, like images or videos. Apply a post format to see this special styling.') }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostFormatSuggestion, { onUpdatePostFormat: onUpdatePostFormat, suggestedPostFormat: suggestion.id, suggestionText: (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: post format */ (0,external_wp_i18n_namespaceObject.__)('Apply the "%1$s" format.'), suggestion.caption) }) })] }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-taxonomies/hierarchical-term-selector.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Module Constants */ const hierarchical_term_selector_DEFAULT_QUERY = { per_page: -1, orderby: 'name', order: 'asc', _fields: 'id,name,parent', context: 'view' }; const MIN_TERMS_COUNT_FOR_FILTER = 8; const hierarchical_term_selector_EMPTY_ARRAY = []; /** * Sort Terms by Selected. * * @param {Object[]} termsTree Array of terms in tree format. * @param {number[]} terms Selected terms. * * @return {Object[]} Sorted array of terms. */ function sortBySelected(termsTree, terms) { const treeHasSelection = termTree => { if (terms.indexOf(termTree.id) !== -1) { return true; } if (undefined === termTree.children) { return false; } return termTree.children.map(treeHasSelection).filter(child => child).length > 0; }; const termOrChildIsSelected = (termA, termB) => { const termASelected = treeHasSelection(termA); const termBSelected = treeHasSelection(termB); if (termASelected === termBSelected) { return 0; } if (termASelected && !termBSelected) { return -1; } if (!termASelected && termBSelected) { return 1; } return 0; }; const newTermTree = [...termsTree]; newTermTree.sort(termOrChildIsSelected); return newTermTree; } /** * Find term by parent id or name. * * @param {Object[]} terms Array of Terms. * @param {number|string} parent id. * @param {string} name Term name. * @return {Object} Term object. */ function findTerm(terms, parent, name) { return terms.find(term => { return (!term.parent && !parent || parseInt(term.parent) === parseInt(parent)) && term.name.toLowerCase() === name.toLowerCase(); }); } /** * Get filter matcher function. * * @param {string} filterValue Filter value. * @return {(function(Object): (Object|boolean))} Matcher function. */ function getFilterMatcher(filterValue) { const matchTermsForFilter = originalTerm => { if ('' === filterValue) { return originalTerm; } // Shallow clone, because we'll be filtering the term's children and // don't want to modify the original term. const term = { ...originalTerm }; // Map and filter the children, recursive so we deal with grandchildren // and any deeper levels. if (term.children.length > 0) { term.children = term.children.map(matchTermsForFilter).filter(child => child); } // If the term's name contains the filterValue, or it has children // (i.e. some child matched at some point in the tree) then return it. if (-1 !== term.name.toLowerCase().indexOf(filterValue.toLowerCase()) || term.children.length > 0) { return term; } // Otherwise, return false. After mapping, the list of terms will need // to have false values filtered out. return false; }; return matchTermsForFilter; } /** * Hierarchical term selector. * * @param {Object} props Component props. * @param {string} props.slug Taxonomy slug. * @return {Element} Hierarchical term selector component. */ function HierarchicalTermSelector({ slug }) { var _taxonomy$labels$sear, _taxonomy$name; const [adding, setAdding] = (0,external_wp_element_namespaceObject.useState)(false); const [formName, setFormName] = (0,external_wp_element_namespaceObject.useState)(''); /** * @type {[number|'', Function]} */ const [formParent, setFormParent] = (0,external_wp_element_namespaceObject.useState)(''); const [showForm, setShowForm] = (0,external_wp_element_namespaceObject.useState)(false); const [filterValue, setFilterValue] = (0,external_wp_element_namespaceObject.useState)(''); const [filteredTermsTree, setFilteredTermsTree] = (0,external_wp_element_namespaceObject.useState)([]); const debouncedSpeak = (0,external_wp_compose_namespaceObject.useDebounce)(external_wp_a11y_namespaceObject.speak, 500); const { hasCreateAction, hasAssignAction, terms, loading, availableTerms, taxonomy } = (0,external_wp_data_namespaceObject.useSelect)(select => { var _post$_links, _post$_links2; const { getCurrentPost, getEditedPostAttribute } = select(store_store); const { getTaxonomy, getEntityRecords, isResolving } = select(external_wp_coreData_namespaceObject.store); const _taxonomy = getTaxonomy(slug); const post = getCurrentPost(); return { hasCreateAction: _taxonomy ? (_post$_links = post._links?.['wp:action-create-' + _taxonomy.rest_base]) !== null && _post$_links !== void 0 ? _post$_links : false : false, hasAssignAction: _taxonomy ? (_post$_links2 = post._links?.['wp:action-assign-' + _taxonomy.rest_base]) !== null && _post$_links2 !== void 0 ? _post$_links2 : false : false, terms: _taxonomy ? getEditedPostAttribute(_taxonomy.rest_base) : hierarchical_term_selector_EMPTY_ARRAY, loading: isResolving('getEntityRecords', ['taxonomy', slug, hierarchical_term_selector_DEFAULT_QUERY]), availableTerms: getEntityRecords('taxonomy', slug, hierarchical_term_selector_DEFAULT_QUERY) || hierarchical_term_selector_EMPTY_ARRAY, taxonomy: _taxonomy }; }, [slug]); const { editPost } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); const { saveEntityRecord } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); const availableTermsTree = (0,external_wp_element_namespaceObject.useMemo)(() => sortBySelected(buildTermsTree(availableTerms), terms), // Remove `terms` from the dependency list to avoid reordering every time // checking or unchecking a term. [availableTerms]); const { createErrorNotice } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); if (!hasAssignAction) { return null; } /** * Append new term. * * @param {Object} term Term object. * @return {Promise} A promise that resolves to save term object. */ const addTerm = term => { return saveEntityRecord('taxonomy', slug, term, { throwOnError: true }); }; /** * Update terms for post. * * @param {number[]} termIds Term ids. */ const onUpdateTerms = termIds => { editPost({ [taxonomy.rest_base]: termIds }); }; /** * Handler for checking term. * * @param {number} termId */ const onChange = termId => { const hasTerm = terms.includes(termId); const newTerms = hasTerm ? terms.filter(id => id !== termId) : [...terms, termId]; onUpdateTerms(newTerms); }; const onChangeFormName = value => { setFormName(value); }; /** * Handler for changing form parent. * * @param {number|''} parentId Parent post id. */ const onChangeFormParent = parentId => { setFormParent(parentId); }; const onToggleForm = () => { setShowForm(!showForm); }; const onAddTerm = async event => { var _taxonomy$labels$sing; event.preventDefault(); if (formName === '' || adding) { return; } // Check if the term we are adding already exists. const existingTerm = findTerm(availableTerms, formParent, formName); if (existingTerm) { // If the term we are adding exists but is not selected select it. if (!terms.some(term => term === existingTerm.id)) { onUpdateTerms([...terms, existingTerm.id]); } setFormName(''); setFormParent(''); return; } setAdding(true); let newTerm; try { newTerm = await addTerm({ name: formName, parent: formParent ? formParent : undefined }); } catch (error) { createErrorNotice(error.message, { type: 'snackbar' }); return; } const defaultName = slug === 'category' ? (0,external_wp_i18n_namespaceObject.__)('Category') : (0,external_wp_i18n_namespaceObject.__)('Term'); const termAddedMessage = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: taxonomy name */ (0,external_wp_i18n_namespaceObject._x)('%s added', 'term'), (_taxonomy$labels$sing = taxonomy?.labels?.singular_name) !== null && _taxonomy$labels$sing !== void 0 ? _taxonomy$labels$sing : defaultName); (0,external_wp_a11y_namespaceObject.speak)(termAddedMessage, 'assertive'); setAdding(false); setFormName(''); setFormParent(''); onUpdateTerms([...terms, newTerm.id]); }; const setFilter = value => { const newFilteredTermsTree = availableTermsTree.map(getFilterMatcher(value)).filter(term => term); const getResultCount = termsTree => { let count = 0; for (let i = 0; i < termsTree.length; i++) { count++; if (undefined !== termsTree[i].children) { count += getResultCount(termsTree[i].children); } } return count; }; setFilterValue(value); setFilteredTermsTree(newFilteredTermsTree); const resultCount = getResultCount(newFilteredTermsTree); const resultsFoundMessage = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %d: number of results */ (0,external_wp_i18n_namespaceObject._n)('%d result found.', '%d results found.', resultCount), resultCount); debouncedSpeak(resultsFoundMessage, 'assertive'); }; const renderTerms = renderedTerms => { return renderedTerms.map(term => { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "editor-post-taxonomies__hierarchical-terms-choice", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.CheckboxControl, { __nextHasNoMarginBottom: true, checked: terms.indexOf(term.id) !== -1, onChange: () => { const termId = parseInt(term.id, 10); onChange(termId); }, label: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(term.name) }), !!term.children.length && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: "editor-post-taxonomies__hierarchical-terms-subchoices", children: renderTerms(term.children) })] }, term.id); }); }; const labelWithFallback = (labelProperty, fallbackIsCategory, fallbackIsNotCategory) => { var _taxonomy$labels$labe; return (_taxonomy$labels$labe = taxonomy?.labels?.[labelProperty]) !== null && _taxonomy$labels$labe !== void 0 ? _taxonomy$labels$labe : slug === 'category' ? fallbackIsCategory : fallbackIsNotCategory; }; const newTermButtonLabel = labelWithFallback('add_new_item', (0,external_wp_i18n_namespaceObject.__)('Add new category'), (0,external_wp_i18n_namespaceObject.__)('Add new term')); const newTermLabel = labelWithFallback('new_item_name', (0,external_wp_i18n_namespaceObject.__)('Add new category'), (0,external_wp_i18n_namespaceObject.__)('Add new term')); const parentSelectLabel = labelWithFallback('parent_item', (0,external_wp_i18n_namespaceObject.__)('Parent Category'), (0,external_wp_i18n_namespaceObject.__)('Parent Term')); const noParentOption = `— ${parentSelectLabel} —`; const newTermSubmitLabel = newTermButtonLabel; const filterLabel = (_taxonomy$labels$sear = taxonomy?.labels?.search_items) !== null && _taxonomy$labels$sear !== void 0 ? _taxonomy$labels$sear : (0,external_wp_i18n_namespaceObject.__)('Search Terms'); const groupLabel = (_taxonomy$name = taxonomy?.name) !== null && _taxonomy$name !== void 0 ? _taxonomy$name : (0,external_wp_i18n_namespaceObject.__)('Terms'); const showFilter = availableTerms.length >= MIN_TERMS_COUNT_FOR_FILTER; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.Flex, { direction: "column", gap: "4", children: [showFilter && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.TextControl, { __nextHasNoMarginBottom: true, label: filterLabel, value: filterValue, onChange: setFilter }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: "editor-post-taxonomies__hierarchical-terms-list", tabIndex: "0", role: "group", "aria-label": groupLabel, children: renderTerms('' !== filterValue ? filteredTermsTree : availableTermsTree) }), !loading && hasCreateAction && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.FlexItem, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { onClick: onToggleForm, className: "editor-post-taxonomies__hierarchical-terms-add", "aria-expanded": showForm, variant: "link", children: newTermButtonLabel }) }), showForm && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("form", { onSubmit: onAddTerm, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.Flex, { direction: "column", gap: "4", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.TextControl, { __next40pxDefaultSize: true, __nextHasNoMarginBottom: true, className: "editor-post-taxonomies__hierarchical-terms-input", label: newTermLabel, value: formName, onChange: onChangeFormName, required: true }), !!availableTerms.length && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.TreeSelect, { __next40pxDefaultSize: true, __nextHasNoMarginBottom: true, label: parentSelectLabel, noOptionLabel: noParentOption, onChange: onChangeFormParent, selectedId: formParent, tree: availableTermsTree }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.FlexItem, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { __next40pxDefaultSize: true, variant: "secondary", type: "submit", className: "editor-post-taxonomies__hierarchical-terms-submit", children: newTermSubmitLabel }) })] }) })] }); } /* harmony default export */ const hierarchical_term_selector = ((0,external_wp_components_namespaceObject.withFilters)('editor.PostTaxonomyType')(HierarchicalTermSelector)); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-panel/maybe-category-panel.js /** * WordPress dependencies */ /** * Internal dependencies */ function MaybeCategoryPanel() { const hasNoCategory = (0,external_wp_data_namespaceObject.useSelect)(select => { const postType = select(store_store).getCurrentPostType(); const { canUser, getEntityRecord, getTaxonomy } = select(external_wp_coreData_namespaceObject.store); const categoriesTaxonomy = getTaxonomy('category'); const defaultCategoryId = canUser('read', 'settings') ? getEntityRecord('root', 'site')?.default_category : undefined; const defaultCategory = defaultCategoryId ? getEntityRecord('taxonomy', 'category', defaultCategoryId) : undefined; const postTypeSupportsCategories = categoriesTaxonomy && categoriesTaxonomy.types.some(type => type === postType); const categories = categoriesTaxonomy && select(store_store).getEditedPostAttribute(categoriesTaxonomy.rest_base); // This boolean should return true if everything is loaded // ( categoriesTaxonomy, defaultCategory ) // and the post has not been assigned a category different than "uncategorized". return !!categoriesTaxonomy && !!defaultCategory && postTypeSupportsCategories && (categories?.length === 0 || categories?.length === 1 && defaultCategory?.id === categories[0]); }, []); const [shouldShowPanel, setShouldShowPanel] = (0,external_wp_element_namespaceObject.useState)(false); (0,external_wp_element_namespaceObject.useEffect)(() => { // We use state to avoid hiding the panel if the user edits the categories // and adds one within the panel itself (while visible). if (hasNoCategory) { setShouldShowPanel(true); } }, [hasNoCategory]); if (!shouldShowPanel) { return null; } const panelBodyTitle = [(0,external_wp_i18n_namespaceObject.__)('Suggestion:'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { className: "editor-post-publish-panel__link", children: (0,external_wp_i18n_namespaceObject.__)('Assign a category') }, "label")]; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.PanelBody, { initialOpen: false, title: panelBodyTitle, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { children: (0,external_wp_i18n_namespaceObject.__)('Categories provide a helpful way to group related posts together and to quickly tell readers what a post is about.') }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(hierarchical_term_selector, { slug: "category" })] }); } /* harmony default export */ const maybe_category_panel = (MaybeCategoryPanel); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-panel/maybe-upload-media.js /** * WordPress dependencies */ /** * Internal dependencies */ function flattenBlocks(blocks) { const result = []; blocks.forEach(block => { result.push(block); result.push(...flattenBlocks(block.innerBlocks)); }); return result; } function Image(block) { const { selectBlock } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_blockEditor_namespaceObject.store); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__unstableMotion.img, { tabIndex: 0, role: "button", "aria-label": (0,external_wp_i18n_namespaceObject.__)('Select image block.'), onClick: () => { selectBlock(block.clientId); }, onKeyDown: event => { if (event.key === 'Enter' || event.key === ' ') { selectBlock(block.clientId); event.preventDefault(); } }, alt: block.attributes.alt, src: block.attributes.url, animate: { opacity: 1 }, exit: { opacity: 0, scale: 0 }, style: { width: '36px', height: '36px', objectFit: 'cover', borderRadius: '2px', cursor: 'pointer' }, whileHover: { scale: 1.08 } }, block.clientId); } function maybe_upload_media_PostFormatPanel() { const [isUploading, setIsUploading] = (0,external_wp_element_namespaceObject.useState)(false); const { editorBlocks, mediaUpload } = (0,external_wp_data_namespaceObject.useSelect)(select => ({ editorBlocks: select(store_store).getEditorBlocks(), mediaUpload: select(external_wp_blockEditor_namespaceObject.store).getSettings().mediaUpload }), []); const externalImages = flattenBlocks(editorBlocks).filter(block => block.name === 'core/image' && block.attributes.url && !block.attributes.id); const { updateBlockAttributes } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_blockEditor_namespaceObject.store); if (!mediaUpload || !externalImages.length) { return null; } const panelBodyTitle = [(0,external_wp_i18n_namespaceObject.__)('Suggestion:'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { className: "editor-post-publish-panel__link", children: (0,external_wp_i18n_namespaceObject.__)('External media') }, "label")]; function uploadImages() { setIsUploading(true); Promise.all(externalImages.map(image => window.fetch(image.attributes.url.includes('?') ? image.attributes.url : image.attributes.url + '?').then(response => response.blob()).then(blob => new Promise((resolve, reject) => { mediaUpload({ filesList: [blob], onFileChange: ([media]) => { if ((0,external_wp_blob_namespaceObject.isBlobURL)(media.url)) { return; } updateBlockAttributes(image.clientId, { id: media.id, url: media.url }); resolve(); }, onError() { reject(); } }); })))).finally(() => { setIsUploading(false); }); } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.PanelBody, { initialOpen: true, title: panelBodyTitle, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { children: (0,external_wp_i18n_namespaceObject.__)('Upload external images to the Media Library. Images from different domains may load slowly, display incorrectly, or be removed unexpectedly.') }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { style: { display: 'inline-flex', flexWrap: 'wrap', gap: '8px' }, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__unstableAnimatePresence, { children: externalImages.map(image => { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(Image, { ...image }, image.clientId); }) }), isUploading ? /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Spinner, {}) : /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { variant: "primary", onClick: uploadImages, children: (0,external_wp_i18n_namespaceObject.__)('Upload') })] })] }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-panel/prepublish.js /** * WordPress dependencies */ /** * Internal dependencies */ function PostPublishPanelPrepublish({ children }) { const { isBeingScheduled, isRequestingSiteIcon, hasPublishAction, siteIconUrl, siteTitle, siteHome } = (0,external_wp_data_namespaceObject.useSelect)(select => { var _getCurrentPost$_link; const { getCurrentPost, isEditedPostBeingScheduled } = select(store_store); const { getEntityRecord, isResolving } = select(external_wp_coreData_namespaceObject.store); const siteData = getEntityRecord('root', '__unstableBase', undefined) || {}; return { hasPublishAction: (_getCurrentPost$_link = getCurrentPost()._links?.['wp:action-publish']) !== null && _getCurrentPost$_link !== void 0 ? _getCurrentPost$_link : false, isBeingScheduled: isEditedPostBeingScheduled(), isRequestingSiteIcon: isResolving('getEntityRecord', ['root', '__unstableBase', undefined]), siteIconUrl: siteData.site_icon_url, siteTitle: siteData.name, siteHome: siteData.home && (0,external_wp_url_namespaceObject.filterURLForDisplay)(siteData.home) }; }, []); let siteIcon = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Icon, { className: "components-site-icon", size: "36px", icon: library_wordpress }); if (siteIconUrl) { siteIcon = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("img", { alt: (0,external_wp_i18n_namespaceObject.__)('Site Icon'), className: "components-site-icon", src: siteIconUrl }); } if (isRequestingSiteIcon) { siteIcon = null; } let prePublishTitle, prePublishBodyText; if (!hasPublishAction) { prePublishTitle = (0,external_wp_i18n_namespaceObject.__)('Are you ready to submit for review?'); prePublishBodyText = (0,external_wp_i18n_namespaceObject.__)('When you’re ready, submit your work for review, and an Editor will be able to approve it for you.'); } else if (isBeingScheduled) { prePublishTitle = (0,external_wp_i18n_namespaceObject.__)('Are you ready to schedule?'); prePublishBodyText = (0,external_wp_i18n_namespaceObject.__)('Your work will be published at the specified date and time.'); } else { prePublishTitle = (0,external_wp_i18n_namespaceObject.__)('Are you ready to publish?'); prePublishBodyText = (0,external_wp_i18n_namespaceObject.__)('Double-check your settings before publishing.'); } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "editor-post-publish-panel__prepublish", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("strong", { children: prePublishTitle }) }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { children: prePublishBodyText }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "components-site-card", children: [siteIcon, /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "components-site-info", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { className: "components-site-name", children: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(siteTitle) || (0,external_wp_i18n_namespaceObject.__)('(Untitled)') }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { className: "components-site-home", children: siteHome })] })] }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(maybe_upload_media_PostFormatPanel, {}), hasPublishAction && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelBody, { initialOpen: false, title: [(0,external_wp_i18n_namespaceObject.__)('Visibility:'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { className: "editor-post-publish-panel__link", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostVisibilityLabel, {}) }, "label")], children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostVisibility, {}) }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelBody, { initialOpen: false, title: [(0,external_wp_i18n_namespaceObject.__)('Publish:'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { className: "editor-post-publish-panel__link", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostScheduleLabel, {}) }, "label")], children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostSchedule, {}) })] }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostFormatPanel, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(maybe_tags_panel, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(maybe_category_panel, {}), children] }); } /* harmony default export */ const prepublish = (PostPublishPanelPrepublish); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-panel/postpublish.js /** * WordPress dependencies */ /** * Internal dependencies */ const POSTNAME = '%postname%'; const PAGENAME = '%pagename%'; /** * Returns URL for a future post. * * @param {Object} post Post object. * * @return {string} PostPublish URL. */ const getFuturePostUrl = post => { const { slug } = post; if (post.permalink_template.includes(POSTNAME)) { return post.permalink_template.replace(POSTNAME, slug); } if (post.permalink_template.includes(PAGENAME)) { return post.permalink_template.replace(PAGENAME, slug); } return post.permalink_template; }; function postpublish_CopyButton({ text, onCopy, children }) { const ref = (0,external_wp_compose_namespaceObject.useCopyToClipboard)(text, onCopy); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { variant: "secondary", ref: ref, children: children }); } class PostPublishPanelPostpublish extends external_wp_element_namespaceObject.Component { constructor() { super(...arguments); this.state = { showCopyConfirmation: false }; this.onCopy = this.onCopy.bind(this); this.onSelectInput = this.onSelectInput.bind(this); this.postLink = (0,external_wp_element_namespaceObject.createRef)(); } componentDidMount() { if (this.props.focusOnMount) { this.postLink.current.focus(); } } componentWillUnmount() { clearTimeout(this.dismissCopyConfirmation); } onCopy() { this.setState({ showCopyConfirmation: true }); clearTimeout(this.dismissCopyConfirmation); this.dismissCopyConfirmation = setTimeout(() => { this.setState({ showCopyConfirmation: false }); }, 4000); } onSelectInput(event) { event.target.select(); } render() { const { children, isScheduled, post, postType } = this.props; const postLabel = postType?.labels?.singular_name; const viewPostLabel = postType?.labels?.view_item; const addNewPostLabel = postType?.labels?.add_new_item; const link = post.status === 'future' ? getFuturePostUrl(post) : post.link; const addLink = (0,external_wp_url_namespaceObject.addQueryArgs)('post-new.php', { post_type: post.type }); const postPublishNonLinkHeader = isScheduled ? /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [(0,external_wp_i18n_namespaceObject.__)('is now scheduled. It will go live on'), ' ', /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostScheduleLabel, {}), "."] }) : (0,external_wp_i18n_namespaceObject.__)('is now live.'); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "post-publish-panel__postpublish", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.PanelBody, { className: "post-publish-panel__postpublish-header", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("a", { ref: this.postLink, href: link, children: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(post.title) || (0,external_wp_i18n_namespaceObject.__)('(no title)') }), ' ', postPublishNonLinkHeader] }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.PanelBody, { children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { className: "post-publish-panel__postpublish-subheader", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("strong", { children: (0,external_wp_i18n_namespaceObject.__)('What’s next?') }) }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "post-publish-panel__postpublish-post-address-container", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.TextControl, { __nextHasNoMarginBottom: true, className: "post-publish-panel__postpublish-post-address", readOnly: true, label: (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: post type singular name */ (0,external_wp_i18n_namespaceObject.__)('%s address'), postLabel), value: (0,external_wp_url_namespaceObject.safeDecodeURIComponent)(link), onFocus: this.onSelectInput }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: "post-publish-panel__postpublish-post-address__copy-button-wrap", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(postpublish_CopyButton, { text: link, onCopy: this.onCopy, children: this.state.showCopyConfirmation ? (0,external_wp_i18n_namespaceObject.__)('Copied!') : (0,external_wp_i18n_namespaceObject.__)('Copy') }) })] }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "post-publish-panel__postpublish-buttons", children: [!isScheduled && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { variant: "primary", href: link, children: viewPostLabel }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { variant: isScheduled ? 'primary' : 'secondary', href: addLink, children: addNewPostLabel })] })] }), children] }); } } /* harmony default export */ const postpublish = ((0,external_wp_data_namespaceObject.withSelect)(select => { const { getEditedPostAttribute, getCurrentPost, isCurrentPostScheduled } = select(store_store); const { getPostType } = select(external_wp_coreData_namespaceObject.store); return { post: getCurrentPost(), postType: getPostType(getEditedPostAttribute('type')), isScheduled: isCurrentPostScheduled() }; })(PostPublishPanelPostpublish)); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-panel/index.js /** * WordPress dependencies */ /** * Internal dependencies */ class PostPublishPanel extends external_wp_element_namespaceObject.Component { constructor() { super(...arguments); this.onSubmit = this.onSubmit.bind(this); } componentDidUpdate(prevProps) { // Automatically collapse the publish sidebar when a post // is published and the user makes an edit. if (prevProps.isPublished && !this.props.isSaving && this.props.isDirty) { this.props.onClose(); } } onSubmit() { const { onClose, hasPublishAction, isPostTypeViewable } = this.props; if (!hasPublishAction || !isPostTypeViewable) { onClose(); } } render() { const { forceIsDirty, isBeingScheduled, isPublished, isPublishSidebarEnabled, isScheduled, isSaving, isSavingNonPostEntityChanges, onClose, onTogglePublishSidebar, PostPublishExtension, PrePublishExtension, ...additionalProps } = this.props; const { hasPublishAction, isDirty, isPostTypeViewable, ...propsForPanel } = additionalProps; const isPublishedOrScheduled = isPublished || isScheduled && isBeingScheduled; const isPrePublish = !isPublishedOrScheduled && !isSaving; const isPostPublish = isPublishedOrScheduled && !isSaving; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "editor-post-publish-panel", ...propsForPanel, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: "editor-post-publish-panel__header", children: isPostPublish ? /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { onClick: onClose, icon: close_small, label: (0,external_wp_i18n_namespaceObject.__)('Close panel') }) : /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: "editor-post-publish-panel__header-publish-button", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_publish_button, { focusOnMount: true, onSubmit: this.onSubmit, forceIsDirty: forceIsDirty }) }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: "editor-post-publish-panel__header-cancel-button", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { __experimentalIsFocusable: true, disabled: isSavingNonPostEntityChanges, onClick: onClose, variant: "secondary", size: "compact", children: (0,external_wp_i18n_namespaceObject.__)('Cancel') }) })] }) }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "editor-post-publish-panel__content", children: [isPrePublish && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(prepublish, { children: PrePublishExtension && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PrePublishExtension, {}) }), isPostPublish && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(postpublish, { focusOnMount: true, children: PostPublishExtension && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostPublishExtension, {}) }), isSaving && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Spinner, {})] }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: "editor-post-publish-panel__footer", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.CheckboxControl, { __nextHasNoMarginBottom: true, label: (0,external_wp_i18n_namespaceObject.__)('Always show pre-publish checks.'), checked: isPublishSidebarEnabled, onChange: onTogglePublishSidebar }) })] }); } } /* harmony default export */ const post_publish_panel = ((0,external_wp_compose_namespaceObject.compose)([(0,external_wp_data_namespaceObject.withSelect)(select => { var _getCurrentPost$_link; const { getPostType } = select(external_wp_coreData_namespaceObject.store); const { getCurrentPost, getEditedPostAttribute, isCurrentPostPublished, isCurrentPostScheduled, isEditedPostBeingScheduled, isEditedPostDirty, isAutosavingPost, isSavingPost, isSavingNonPostEntityChanges } = select(store_store); const { isPublishSidebarEnabled } = select(store_store); const postType = getPostType(getEditedPostAttribute('type')); return { hasPublishAction: (_getCurrentPost$_link = getCurrentPost()._links?.['wp:action-publish']) !== null && _getCurrentPost$_link !== void 0 ? _getCurrentPost$_link : false, isPostTypeViewable: postType?.viewable, isBeingScheduled: isEditedPostBeingScheduled(), isDirty: isEditedPostDirty(), isPublished: isCurrentPostPublished(), isPublishSidebarEnabled: isPublishSidebarEnabled(), isSaving: isSavingPost() && !isAutosavingPost(), isSavingNonPostEntityChanges: isSavingNonPostEntityChanges(), isScheduled: isCurrentPostScheduled() }; }), (0,external_wp_data_namespaceObject.withDispatch)((dispatch, { isPublishSidebarEnabled }) => { const { disablePublishSidebar, enablePublishSidebar } = dispatch(store_store); return { onTogglePublishSidebar: () => { if (isPublishSidebarEnabled) { disablePublishSidebar(); } else { enablePublishSidebar(); } } }; }), external_wp_components_namespaceObject.withFocusReturn, external_wp_components_namespaceObject.withConstrainedTabbing])(PostPublishPanel)); ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/cloud-upload.js /** * WordPress dependencies */ const cloudUpload = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { d: "M17.3 10.1c0-2.5-2.1-4.4-4.8-4.4-2.2 0-4.1 1.4-4.6 3.3h-.2C5.7 9 4 10.7 4 12.8c0 2.1 1.7 3.8 3.7 3.8h9c1.8 0 3.2-1.5 3.2-3.3.1-1.6-1.1-2.9-2.6-3.2zm-.5 5.1h-4v-2.4L14 14l1-1-3-3-3 3 1 1 1.2-1.2v2.4H7.7c-1.2 0-2.2-1.1-2.2-2.3s1-2.4 2.2-2.4H9l.3-1.1c.4-1.3 1.7-2.2 3.2-2.2 1.8 0 3.3 1.3 3.3 2.9v1.3l1.3.2c.8.1 1.4.9 1.4 1.8 0 1-.8 1.8-1.7 1.8z" }) }); /* harmony default export */ const cloud_upload = (cloudUpload); ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/icon/index.js /** * WordPress dependencies */ /** @typedef {{icon: JSX.Element, size?: number} & import('@wordpress/primitives').SVGProps} IconProps */ /** * Return an SVG icon. * * @param {IconProps} props icon is the SVG component to render * size is a number specifiying the icon size in pixels * Other props will be passed to wrapped SVG component * @param {import('react').ForwardedRef<HTMLElement>} ref The forwarded ref to the SVG element. * * @return {JSX.Element} Icon component */ function Icon({ icon, size = 24, ...props }, ref) { return (0,external_wp_element_namespaceObject.cloneElement)(icon, { width: size, height: size, ...props, ref }); } /* harmony default export */ const icon = ((0,external_wp_element_namespaceObject.forwardRef)(Icon)); ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/cloud.js /** * WordPress dependencies */ const cloud = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { d: "M17.3 10.1c0-2.5-2.1-4.4-4.8-4.4-2.2 0-4.1 1.4-4.6 3.3h-.2C5.7 9 4 10.7 4 12.8c0 2.1 1.7 3.8 3.7 3.8h9c1.8 0 3.2-1.5 3.2-3.3.1-1.6-1.1-2.9-2.6-3.2zm-.5 5.1h-9c-1.2 0-2.2-1.1-2.2-2.3s1-2.4 2.2-2.4h1.3l.3-1.1c.4-1.3 1.7-2.2 3.2-2.2 1.8 0 3.3 1.3 3.3 2.9v1.3l1.3.2c.8.1 1.4.9 1.4 1.8-.1 1-.9 1.8-1.8 1.8z" }) }); /* harmony default export */ const library_cloud = (cloud); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-status/index.js /** * WordPress dependencies */ /** * Internal dependencies */ const labels = { 'auto-draft': (0,external_wp_i18n_namespaceObject.__)('Draft'), draft: (0,external_wp_i18n_namespaceObject.__)('Draft'), pending: (0,external_wp_i18n_namespaceObject.__)('Pending'), private: (0,external_wp_i18n_namespaceObject.__)('Private'), future: (0,external_wp_i18n_namespaceObject.__)('Scheduled'), publish: (0,external_wp_i18n_namespaceObject.__)('Published') }; const STATUS_OPTIONS = [{ label: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [(0,external_wp_i18n_namespaceObject.__)('Draft'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { variant: "muted", size: 12, children: (0,external_wp_i18n_namespaceObject.__)('Not ready to publish.') })] }), value: 'draft' }, { label: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [(0,external_wp_i18n_namespaceObject.__)('Pending'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { variant: "muted", size: 12, children: (0,external_wp_i18n_namespaceObject.__)('Waiting for review before publishing.') })] }), value: 'pending' }, { label: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [(0,external_wp_i18n_namespaceObject.__)('Private'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { variant: "muted", size: 12, children: (0,external_wp_i18n_namespaceObject.__)('Only visible to site admins and editors.') })] }), value: 'private' }, { label: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [(0,external_wp_i18n_namespaceObject.__)('Scheduled'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { variant: "muted", size: 12, children: (0,external_wp_i18n_namespaceObject.__)('Publish automatically on a chosen date.') })] }), value: 'future' }, { label: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [(0,external_wp_i18n_namespaceObject.__)('Published'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { variant: "muted", size: 12, children: (0,external_wp_i18n_namespaceObject.__)('Visible to everyone.') })] }), value: 'publish' }]; const DESIGN_POST_TYPES = [TEMPLATE_POST_TYPE, TEMPLATE_PART_POST_TYPE, PATTERN_POST_TYPE, NAVIGATION_POST_TYPE]; function PostStatus() { const { status, date, password, postId, postType, canEdit } = (0,external_wp_data_namespaceObject.useSelect)(select => { var _getCurrentPost$_link; const { getEditedPostAttribute, getCurrentPostId, getCurrentPostType, getCurrentPost } = select(store_store); return { status: getEditedPostAttribute('status'), date: getEditedPostAttribute('date'), password: getEditedPostAttribute('password'), postId: getCurrentPostId(), postType: getCurrentPostType(), canEdit: (_getCurrentPost$_link = getCurrentPost()._links?.['wp:action-publish']) !== null && _getCurrentPost$_link !== void 0 ? _getCurrentPost$_link : false }; }, []); const [showPassword, setShowPassword] = (0,external_wp_element_namespaceObject.useState)(!!password); const passwordInputId = (0,external_wp_compose_namespaceObject.useInstanceId)(PostStatus, 'editor-change-status__password-input'); const { editEntityRecord } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); const [popoverAnchor, setPopoverAnchor] = (0,external_wp_element_namespaceObject.useState)(null); // Memoize popoverProps to avoid returning a new object every time. const popoverProps = (0,external_wp_element_namespaceObject.useMemo)(() => ({ // Anchor the popover to the middle of the entire row so that it doesn't // move around when the label changes. anchor: popoverAnchor, 'aria-label': (0,external_wp_i18n_namespaceObject.__)('Status & visibility'), headerTitle: (0,external_wp_i18n_namespaceObject.__)('Status & visibility'), placement: 'left-start', offset: 36, shift: true }), [popoverAnchor]); if (DESIGN_POST_TYPES.includes(postType)) { return null; } const updatePost = ({ status: newStatus = status, password: newPassword = password, date: newDate = date }) => { editEntityRecord('postType', postType, postId, { status: newStatus, date: newDate, password: newPassword }); }; const handleTogglePassword = value => { setShowPassword(value); if (!value) { updatePost({ password: '' }); } }; const handleStatus = value => { let newDate = date; let newPassword = password; if (status === 'future' && new Date(date) > new Date()) { newDate = null; } if (value === 'private' && password) { newPassword = ''; } updatePost({ status: value, date: newDate, password: newPassword }); }; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { label: (0,external_wp_i18n_namespaceObject.__)('Status'), ref: setPopoverAnchor, children: canEdit ? /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Dropdown, { className: "editor-post-status", contentClassName: "editor-change-status__content", popoverProps: popoverProps, focusOnMount: true, renderToggle: ({ onToggle }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { variant: "tertiary", size: "compact", onClick: onToggle, "aria-label": (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %s: Current post status. (0,external_wp_i18n_namespaceObject.__)('Change post status: %s'), labels[status]), children: labels[status] }), renderContent: ({ onClose }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalInspectorPopoverHeader, { title: (0,external_wp_i18n_namespaceObject.__)('Status & visibility'), onClose: onClose }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("form", { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { spacing: 4, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.RadioControl, { className: "editor-change-status__options", hideLabelFromVision: true, label: (0,external_wp_i18n_namespaceObject.__)('Status'), options: STATUS_OPTIONS, onChange: handleStatus, selected: status === 'auto-draft' ? 'draft' : status }), status === 'future' && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: "editor-change-status__publish-date-wrapper", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PrivatePostSchedule, { showPopoverHeaderActions: false, isCompact: true }) }), status !== 'private' && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { as: "fieldset", spacing: 4, className: "editor-change-status__password-fieldset", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.CheckboxControl, { __nextHasNoMarginBottom: true, label: (0,external_wp_i18n_namespaceObject.__)('Password protected'), help: (0,external_wp_i18n_namespaceObject.__)('Only visible to those who know the password'), checked: showPassword, onChange: handleTogglePassword }), showPassword && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: "editor-change-status__password-input", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.TextControl, { label: (0,external_wp_i18n_namespaceObject.__)('Password'), onChange: value => updatePost({ password: value }), value: password, placeholder: (0,external_wp_i18n_namespaceObject.__)('Use a secure password'), type: "text", id: passwordInputId, __next40pxDefaultSize: true, __nextHasNoMarginBottom: true }) })] })] }) })] }) }) : /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: "editor-post-status is-read-only", children: labels[status] }) }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-saved-state/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ /** * Component showing whether the post is saved or not and providing save * buttons. * * @param {Object} props Component props. * @param {?boolean} props.forceIsDirty Whether to force the post to be marked * as dirty. * @return {import('react').ComponentType} The component. */ function PostSavedState({ forceIsDirty }) { const [forceSavedMessage, setForceSavedMessage] = (0,external_wp_element_namespaceObject.useState)(false); const isLargeViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('small'); const { isAutosaving, isDirty, isNew, isPublished, isSaveable, isSaving, isScheduled, hasPublishAction, showIconLabels, postStatus, postStatusHasChanged } = (0,external_wp_data_namespaceObject.useSelect)(select => { var _getCurrentPost$_link; const { isEditedPostNew, isCurrentPostPublished, isCurrentPostScheduled, isEditedPostDirty, isSavingPost, isEditedPostSaveable, getCurrentPost, isAutosavingPost, getEditedPostAttribute, getPostEdits } = select(store_store); const { get } = select(external_wp_preferences_namespaceObject.store); return { isAutosaving: isAutosavingPost(), isDirty: forceIsDirty || isEditedPostDirty(), isNew: isEditedPostNew(), isPublished: isCurrentPostPublished(), isSaving: isSavingPost(), isSaveable: isEditedPostSaveable(), isScheduled: isCurrentPostScheduled(), hasPublishAction: (_getCurrentPost$_link = getCurrentPost()?._links?.['wp:action-publish']) !== null && _getCurrentPost$_link !== void 0 ? _getCurrentPost$_link : false, showIconLabels: get('core', 'showIconLabels'), postStatus: getEditedPostAttribute('status'), postStatusHasChanged: !!getPostEdits()?.status }; }, [forceIsDirty]); const isPending = postStatus === 'pending'; const { savePost } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); const wasSaving = (0,external_wp_compose_namespaceObject.usePrevious)(isSaving); (0,external_wp_element_namespaceObject.useEffect)(() => { let timeoutId; if (wasSaving && !isSaving) { setForceSavedMessage(true); timeoutId = setTimeout(() => { setForceSavedMessage(false); }, 1000); } return () => clearTimeout(timeoutId); }, [isSaving]); // Once the post has been submitted for review this button // is not needed for the contributor role. if (!hasPublishAction && isPending) { return null; } // We shouldn't render the button if the post has not one of the following statuses: pending, draft, auto-draft. // The reason for this is that this button handles the `save as pending` and `save draft` actions. // An exception for this is when the post has a custom status and there should be a way to save changes without // having to publish. This should be handled better in the future when custom statuses have better support. // @see https://github.com/WordPress/gutenberg/issues/3144. const isIneligibleStatus = !['pending', 'draft', 'auto-draft'].includes(postStatus) && STATUS_OPTIONS.map(({ value }) => value).includes(postStatus); if (isPublished || isScheduled || isIneligibleStatus || postStatusHasChanged && ['pending', 'draft'].includes(postStatus)) { return null; } /* translators: button label text should, if possible, be under 16 characters. */ const label = isPending ? (0,external_wp_i18n_namespaceObject.__)('Save as pending') : (0,external_wp_i18n_namespaceObject.__)('Save draft'); /* translators: button label text should, if possible, be under 16 characters. */ const shortLabel = (0,external_wp_i18n_namespaceObject.__)('Save'); const isSaved = forceSavedMessage || !isNew && !isDirty; const isSavedState = isSaving || isSaved; const isDisabled = isSaving || isSaved || !isSaveable; let text; if (isSaving) { text = isAutosaving ? (0,external_wp_i18n_namespaceObject.__)('Autosaving') : (0,external_wp_i18n_namespaceObject.__)('Saving'); } else if (isSaved) { text = (0,external_wp_i18n_namespaceObject.__)('Saved'); } else if (isLargeViewport) { text = label; } else if (showIconLabels) { text = shortLabel; } // Use common Button instance for all saved states so that focus is not // lost. return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.Button, { className: isSaveable || isSaving ? dist_clsx({ 'editor-post-save-draft': !isSavedState, 'editor-post-saved-state': isSavedState, 'is-saving': isSaving, 'is-autosaving': isAutosaving, 'is-saved': isSaved, [(0,external_wp_components_namespaceObject.__unstableGetAnimateClassName)({ type: 'loading' })]: isSaving }) : undefined, onClick: isDisabled ? undefined : () => savePost() /* * We want the tooltip to show the keyboard shortcut only when the * button does something, i.e. when it's not disabled. */, shortcut: isDisabled ? undefined : external_wp_keycodes_namespaceObject.displayShortcut.primary('s'), variant: "tertiary", size: "compact", icon: isLargeViewport ? undefined : cloud_upload, label: text || label, "aria-disabled": isDisabled, children: [isSavedState && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(icon, { icon: isSaved ? library_check : library_cloud }), text] }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-schedule/check.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Wrapper component that renders its children only if post has a publish action. * * @param {Object} props Props. * @param {Element} props.children Children to be rendered. * * @return {Component} - The component to be rendered or null if there is no publish action. */ function PostScheduleCheck({ children }) { const hasPublishAction = (0,external_wp_data_namespaceObject.useSelect)(select => { var _select$getCurrentPos; return (_select$getCurrentPos = select(store_store).getCurrentPost()._links?.['wp:action-publish']) !== null && _select$getCurrentPos !== void 0 ? _select$getCurrentPos : false; }, []); if (!hasPublishAction) { return null; } return children; } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-schedule/panel.js /** * WordPress dependencies */ /** * Internal dependencies */ const panel_DESIGN_POST_TYPES = [TEMPLATE_POST_TYPE, TEMPLATE_PART_POST_TYPE, PATTERN_POST_TYPE, NAVIGATION_POST_TYPE]; /** * Renders the Post Schedule Panel component. * * @return {Component} The component to be rendered. */ function PostSchedulePanel() { const [popoverAnchor, setPopoverAnchor] = (0,external_wp_element_namespaceObject.useState)(null); const postType = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getCurrentPostType(), []); // Memoize popoverProps to avoid returning a new object every time. const popoverProps = (0,external_wp_element_namespaceObject.useMemo)(() => ({ // Anchor the popover to the middle of the entire row so that it doesn't // move around when the label changes. anchor: popoverAnchor, 'aria-label': (0,external_wp_i18n_namespaceObject.__)('Change publish date'), placement: 'left-start', offset: 36, shift: true }), [popoverAnchor]); const label = usePostScheduleLabel(); const fullLabel = usePostScheduleLabel({ full: true }); if (panel_DESIGN_POST_TYPES.includes(postType)) { return null; } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostScheduleCheck, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { label: (0,external_wp_i18n_namespaceObject.__)('Publish'), ref: setPopoverAnchor, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Dropdown, { popoverProps: popoverProps, focusOnMount: true, className: "editor-post-schedule__panel-dropdown", contentClassName: "editor-post-schedule__dialog", renderToggle: ({ onToggle, isOpen }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { size: "compact", className: "editor-post-schedule__dialog-toggle", variant: "tertiary", tooltipPosition: "middle left", onClick: onToggle, "aria-label": (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %s: Current post date. (0,external_wp_i18n_namespaceObject.__)('Change date: %s'), label), label: fullLabel, showTooltip: label !== fullLabel, "aria-expanded": isOpen, children: label }), renderContent: ({ onClose }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostSchedule, { onClose: onClose }) }) }) }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-slug/check.js /** * Internal dependencies */ function PostSlugCheck({ children }) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_type_support_check, { supportKeys: "slug", children: children }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-slug/index.js /** * WordPress dependencies */ /** * Internal dependencies */ function PostSlugControl() { const postSlug = (0,external_wp_data_namespaceObject.useSelect)(select => { return (0,external_wp_url_namespaceObject.safeDecodeURIComponent)(select(store_store).getEditedPostSlug()); }, []); const { editPost } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); const [forceEmptyField, setForceEmptyField] = (0,external_wp_element_namespaceObject.useState)(false); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.TextControl, { __nextHasNoMarginBottom: true, label: (0,external_wp_i18n_namespaceObject.__)('Slug'), autoComplete: "off", spellCheck: "false", value: forceEmptyField ? '' : postSlug, onChange: newValue => { editPost({ slug: newValue }); // When we delete the field the permalink gets // reverted to the original value. // The forceEmptyField logic allows the user to have // the field temporarily empty while typing. if (!newValue) { if (!forceEmptyField) { setForceEmptyField(true); } return; } if (forceEmptyField) { setForceEmptyField(false); } }, onBlur: event => { editPost({ slug: (0,external_wp_url_namespaceObject.cleanForSlug)(event.target.value) }); if (forceEmptyField) { setForceEmptyField(false); } }, className: "editor-post-slug" }); } function PostSlug() { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostSlugCheck, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostSlugControl, {}) }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-sticky/check.js /** * WordPress dependencies */ /** * Internal dependencies */ function PostStickyCheck({ children }) { const { hasStickyAction, postType } = (0,external_wp_data_namespaceObject.useSelect)(select => { var _post$_links$wpActio; const post = select(store_store).getCurrentPost(); return { hasStickyAction: (_post$_links$wpActio = post._links?.['wp:action-sticky']) !== null && _post$_links$wpActio !== void 0 ? _post$_links$wpActio : false, postType: select(store_store).getCurrentPostType() }; }, []); if (postType !== 'post' || !hasStickyAction) { return null; } return children; } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-sticky/index.js /** * WordPress dependencies */ /** * Internal dependencies */ function PostSticky() { const postSticky = (0,external_wp_data_namespaceObject.useSelect)(select => { var _select$getEditedPost; return (_select$getEditedPost = select(store_store).getEditedPostAttribute('sticky')) !== null && _select$getEditedPost !== void 0 ? _select$getEditedPost : false; }, []); const { editPost } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostStickyCheck, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { label: (0,external_wp_i18n_namespaceObject.__)('Sticky'), children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ToggleControl, { className: "editor-post-sticky__toggle-control", label: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.VisuallyHidden, { children: (0,external_wp_i18n_namespaceObject.__)('Sticky') }), checked: postSticky, onChange: () => editPost({ sticky: !postSticky }) }) }) }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-switch-to-draft-button/index.js /** * WordPress dependencies */ /** * Internal dependencies */ // TODO: deprecate.. function PostSwitchToDraftButton() { const [showConfirmDialog, setShowConfirmDialog] = (0,external_wp_element_namespaceObject.useState)(false); const { editPost, savePost } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); const { isSaving, isPublished, isScheduled } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { isSavingPost, isCurrentPostPublished, isCurrentPostScheduled } = select(store_store); return { isSaving: isSavingPost(), isPublished: isCurrentPostPublished(), isScheduled: isCurrentPostScheduled() }; }, []); const isDisabled = isSaving || !isPublished && !isScheduled; let alertMessage; let confirmButtonText; if (isPublished) { alertMessage = (0,external_wp_i18n_namespaceObject.__)('Are you sure you want to unpublish this post?'); confirmButtonText = (0,external_wp_i18n_namespaceObject.__)('Unpublish'); } else if (isScheduled) { alertMessage = (0,external_wp_i18n_namespaceObject.__)('Are you sure you want to unschedule this post?'); confirmButtonText = (0,external_wp_i18n_namespaceObject.__)('Unschedule'); } const handleConfirm = () => { setShowConfirmDialog(false); editPost({ status: 'draft' }); savePost(); }; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { __next40pxDefaultSize: true, className: "editor-post-switch-to-draft", onClick: () => { if (!isDisabled) { setShowConfirmDialog(true); } }, "aria-disabled": isDisabled, variant: "secondary", style: { flexGrow: '1', justifyContent: 'center' }, children: (0,external_wp_i18n_namespaceObject.__)('Switch to draft') }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalConfirmDialog, { isOpen: showConfirmDialog, onConfirm: handleConfirm, onCancel: () => setShowConfirmDialog(false), confirmButtonText: confirmButtonText, children: alertMessage })] }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-sync-status/index.js /** * WordPress dependencies */ /** * Internal dependencies */ function PostSyncStatus() { const { syncStatus, postType } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { getEditedPostAttribute } = select(store_store); const meta = getEditedPostAttribute('meta'); // When the post is first created, the top level wp_pattern_sync_status is not set so get meta value instead. const currentSyncStatus = meta?.wp_pattern_sync_status === 'unsynced' ? 'unsynced' : getEditedPostAttribute('wp_pattern_sync_status'); return { syncStatus: currentSyncStatus, postType: getEditedPostAttribute('type') }; }); if (postType !== 'wp_block') { return null; } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { label: (0,external_wp_i18n_namespaceObject.__)('Sync status'), children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: "editor-post-sync-status__value", children: syncStatus === 'unsynced' ? (0,external_wp_i18n_namespaceObject._x)('Not synced', 'pattern (singular)') : (0,external_wp_i18n_namespaceObject._x)('Synced', 'pattern (singular)') }) }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-taxonomies/index.js /** * WordPress dependencies */ /** * Internal dependencies */ const post_taxonomies_identity = x => x; function PostTaxonomies({ taxonomyWrapper = post_taxonomies_identity }) { const { postType, taxonomies } = (0,external_wp_data_namespaceObject.useSelect)(select => { return { postType: select(store_store).getCurrentPostType(), taxonomies: select(external_wp_coreData_namespaceObject.store).getTaxonomies({ per_page: -1 }) }; }, []); const visibleTaxonomies = (taxonomies !== null && taxonomies !== void 0 ? taxonomies : []).filter(taxonomy => // In some circumstances .visibility can end up as undefined so optional chaining operator required. // https://github.com/WordPress/gutenberg/issues/40326 taxonomy.types.includes(postType) && taxonomy.visibility?.show_ui); return visibleTaxonomies.map(taxonomy => { const TaxonomyComponent = taxonomy.hierarchical ? hierarchical_term_selector : flat_term_selector; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_element_namespaceObject.Fragment, { children: taxonomyWrapper( /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TaxonomyComponent, { slug: taxonomy.slug }), taxonomy) }, `taxonomy-${taxonomy.slug}`); }); } /* harmony default export */ const post_taxonomies = (PostTaxonomies); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-taxonomies/check.js /** * WordPress dependencies */ /** * Internal dependencies */ function PostTaxonomiesCheck({ children }) { const hasTaxonomies = (0,external_wp_data_namespaceObject.useSelect)(select => { const postType = select(store_store).getCurrentPostType(); const taxonomies = select(external_wp_coreData_namespaceObject.store).getTaxonomies({ per_page: -1 }); return taxonomies?.some(taxonomy => taxonomy.types.includes(postType)); }, []); if (!hasTaxonomies) { return null; } return children; } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-taxonomies/panel.js /** * WordPress dependencies */ /** * Internal dependencies */ function TaxonomyPanel({ taxonomy, children }) { const slug = taxonomy?.slug; const panelName = slug ? `taxonomy-panel-${slug}` : ''; const { isEnabled, isOpened } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { isEditorPanelEnabled, isEditorPanelOpened } = select(store_store); return { isEnabled: slug ? isEditorPanelEnabled(panelName) : false, isOpened: slug ? isEditorPanelOpened(panelName) : false }; }, [panelName, slug]); const { toggleEditorPanelOpened } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); if (!isEnabled) { return null; } const taxonomyMenuName = taxonomy?.labels?.menu_name; if (!taxonomyMenuName) { return null; } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelBody, { title: taxonomyMenuName, opened: isOpened, onToggle: () => toggleEditorPanelOpened(panelName), children: children }); } function panel_PostTaxonomies() { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostTaxonomiesCheck, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_taxonomies, { taxonomyWrapper: (content, taxonomy) => { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TaxonomyPanel, { taxonomy: taxonomy, children: content }); } }) }); } /* harmony default export */ const post_taxonomies_panel = (panel_PostTaxonomies); // EXTERNAL MODULE: ./node_modules/react-autosize-textarea/lib/index.js var lib = __webpack_require__(4132); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-text-editor/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ /** * Displays the Post Text Editor along with content in Visual and Text mode. * * @return {JSX.Element|null} The rendered PostTextEditor component. */ function PostTextEditor() { const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(PostTextEditor); const { content, blocks, type, id } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { getEditedEntityRecord } = select(external_wp_coreData_namespaceObject.store); const { getCurrentPostType, getCurrentPostId } = select(store_store); const _type = getCurrentPostType(); const _id = getCurrentPostId(); const editedRecord = getEditedEntityRecord('postType', _type, _id); return { content: editedRecord?.content, blocks: editedRecord?.blocks, type: _type, id: _id }; }, []); const { editEntityRecord } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); // Replicates the logic found in getEditedPostContent(). const value = (0,external_wp_element_namespaceObject.useMemo)(() => { if (content instanceof Function) { return content({ blocks }); } else if (blocks) { // If we have parsed blocks already, they should be our source of truth. // Parsing applies block deprecations and legacy block conversions that // unparsed content will not have. return (0,external_wp_blocks_namespaceObject.__unstableSerializeAndClean)(blocks); } return content; }, [content, blocks]); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.VisuallyHidden, { as: "label", htmlFor: `post-content-${instanceId}`, children: (0,external_wp_i18n_namespaceObject.__)('Type text or HTML') }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(lib/* default */.A, { autoComplete: "off", dir: "auto", value: value, onChange: event => { editEntityRecord('postType', type, id, { content: event.target.value, blocks: undefined, selection: undefined }); }, className: "editor-post-text-editor", id: `post-content-${instanceId}`, placeholder: (0,external_wp_i18n_namespaceObject.__)('Start writing with text or HTML') })] }); } ;// CONCATENATED MODULE: external ["wp","dom"] const external_wp_dom_namespaceObject = window["wp"]["dom"]; ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-title/constants.js const DEFAULT_CLASSNAMES = 'wp-block wp-block-post-title block-editor-block-list__block editor-post-title editor-post-title__input rich-text'; const REGEXP_NEWLINES = /[\r\n]+/g; ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-title/use-post-title-focus.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Custom hook that manages the focus behavior of the post title input field. * * @param {Element} forwardedRef - The forwarded ref for the input field. * * @return {Object} - The ref object. */ function usePostTitleFocus(forwardedRef) { const ref = (0,external_wp_element_namespaceObject.useRef)(); const { isCleanNewPost } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { isCleanNewPost: _isCleanNewPost } = select(store_store); return { isCleanNewPost: _isCleanNewPost() }; }, []); (0,external_wp_element_namespaceObject.useImperativeHandle)(forwardedRef, () => ({ focus: () => { ref?.current?.focus(); } })); (0,external_wp_element_namespaceObject.useEffect)(() => { if (!ref.current) { return; } const { defaultView } = ref.current.ownerDocument; const { name, parent } = defaultView; const ownerDocument = name === 'editor-canvas' ? parent.document : defaultView.document; const { activeElement, body } = ownerDocument; // Only autofocus the title when the post is entirely empty. This should // only happen for a new post, which means we focus the title on new // post so the author can start typing right away, without needing to // click anything. if (isCleanNewPost && (!activeElement || body === activeElement)) { ref.current.focus(); } }, [isCleanNewPost]); return { ref }; } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-title/use-post-title.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Custom hook for managing the post title in the editor. * * @return {Object} An object containing the current title and a function to update the title. */ function usePostTitle() { const { editPost } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); const { title } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { getEditedPostAttribute } = select(store_store); return { title: getEditedPostAttribute('title') }; }, []); function updateTitle(newTitle) { editPost({ title: newTitle }); } return { title, setTitle: updateTitle }; } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-title/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ function PostTitle(_, forwardedRef) { const { placeholder, hasFixedToolbar } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { getSettings } = select(external_wp_blockEditor_namespaceObject.store); const { titlePlaceholder, hasFixedToolbar: _hasFixedToolbar } = getSettings(); return { placeholder: titlePlaceholder, hasFixedToolbar: _hasFixedToolbar }; }, []); const [isSelected, setIsSelected] = (0,external_wp_element_namespaceObject.useState)(false); const { ref: focusRef } = usePostTitleFocus(forwardedRef); const { title, setTitle: onUpdate } = usePostTitle(); const [selection, setSelection] = (0,external_wp_element_namespaceObject.useState)({}); const { clearSelectedBlock, insertBlocks, insertDefaultBlock } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_blockEditor_namespaceObject.store); function onChange(value) { onUpdate(value.replace(REGEXP_NEWLINES, ' ')); } function onInsertBlockAfter(blocks) { insertBlocks(blocks, 0); } function onSelect() { setIsSelected(true); clearSelectedBlock(); } function onUnselect() { setIsSelected(false); setSelection({}); } function onEnterPress() { insertDefaultBlock(undefined, undefined, 0); } function onKeyDown(event) { if (event.keyCode === external_wp_keycodes_namespaceObject.ENTER) { event.preventDefault(); onEnterPress(); } } function onPaste(event) { const clipboardData = event.clipboardData; let plainText = ''; let html = ''; // IE11 only supports `Text` as an argument for `getData` and will // otherwise throw an invalid argument error, so we try the standard // arguments first, then fallback to `Text` if they fail. try { plainText = clipboardData.getData('text/plain'); html = clipboardData.getData('text/html'); } catch (error1) { try { html = clipboardData.getData('Text'); } catch (error2) { // Some browsers like UC Browser paste plain text by default and // don't support clipboardData at all, so allow default // behaviour. return; } } // Allows us to ask for this information when we get a report. window.console.log('Received HTML:\n\n', html); window.console.log('Received plain text:\n\n', plainText); const content = (0,external_wp_blocks_namespaceObject.pasteHandler)({ HTML: html, plainText }); event.preventDefault(); if (!content.length) { return; } if (typeof content !== 'string') { const [firstBlock] = content; if (!title && (firstBlock.name === 'core/heading' || firstBlock.name === 'core/paragraph')) { // Strip HTML to avoid unwanted HTML being added to the title. // In the majority of cases it is assumed that HTML in the title // is undesirable. const contentNoHTML = (0,external_wp_dom_namespaceObject.__unstableStripHTML)(firstBlock.attributes.content); onUpdate(contentNoHTML); onInsertBlockAfter(content.slice(1)); } else { onInsertBlockAfter(content); } } else { const value = { ...(0,external_wp_richText_namespaceObject.create)({ html: title }), ...selection }; // Strip HTML to avoid unwanted HTML being added to the title. // In the majority of cases it is assumed that HTML in the title // is undesirable. const contentNoHTML = (0,external_wp_dom_namespaceObject.__unstableStripHTML)(content); const newValue = (0,external_wp_richText_namespaceObject.insert)(value, (0,external_wp_richText_namespaceObject.create)({ html: contentNoHTML })); onUpdate((0,external_wp_richText_namespaceObject.toHTMLString)({ value: newValue })); setSelection({ start: newValue.start, end: newValue.end }); } } const decodedPlaceholder = (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(placeholder) || (0,external_wp_i18n_namespaceObject.__)('Add title'); const { ref: richTextRef } = (0,external_wp_richText_namespaceObject.__unstableUseRichText)({ value: title, onChange, placeholder: decodedPlaceholder, selectionStart: selection.start, selectionEnd: selection.end, onSelectionChange(newStart, newEnd) { setSelection(sel => { const { start, end } = sel; if (start === newStart && end === newEnd) { return sel; } return { start: newStart, end: newEnd }; }); }, __unstableDisableFormats: false }); // The wp-block className is important for editor styles. // This same block is used in both the visual and the code editor. const className = dist_clsx(DEFAULT_CLASSNAMES, { 'is-selected': isSelected, 'has-fixed-toolbar': hasFixedToolbar }); return ( /*#__PURE__*/ /* eslint-disable jsx-a11y/heading-has-content, jsx-a11y/no-noninteractive-element-to-interactive-role */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(post_type_support_check, { supportKeys: "title", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("h1", { ref: (0,external_wp_compose_namespaceObject.useMergeRefs)([richTextRef, focusRef]), contentEditable: true, className: className, "aria-label": decodedPlaceholder, role: "textbox", "aria-multiline": "true", onFocus: onSelect, onBlur: onUnselect, onKeyDown: onKeyDown, onKeyPress: onUnselect, onPaste: onPaste }) }) /* eslint-enable jsx-a11y/heading-has-content, jsx-a11y/no-noninteractive-element-to-interactive-role */ ); } /** * Renders the `PostTitle` component. * * @param {Object} _ Unused parameter. * @param {Element} forwardedRef Forwarded ref for the component. * * @return {Component} The rendered PostTitle component. */ /* harmony default export */ const post_title = ((0,external_wp_element_namespaceObject.forwardRef)(PostTitle)); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-title/post-title-raw.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ /** * Renders a raw post title input field. * * @param {Object} _ Unused parameter. * @param {Element} forwardedRef Reference to the component's DOM node. * * @return {Component} The rendered component. */ function PostTitleRaw(_, forwardedRef) { const { placeholder, hasFixedToolbar } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { getSettings } = select(external_wp_blockEditor_namespaceObject.store); const { titlePlaceholder, hasFixedToolbar: _hasFixedToolbar } = getSettings(); return { placeholder: titlePlaceholder, hasFixedToolbar: _hasFixedToolbar }; }, []); const [isSelected, setIsSelected] = (0,external_wp_element_namespaceObject.useState)(false); const { title, setTitle: onUpdate } = usePostTitle(); const { ref: focusRef } = usePostTitleFocus(forwardedRef); function onChange(value) { onUpdate(value.replace(REGEXP_NEWLINES, ' ')); } function onSelect() { setIsSelected(true); } function onUnselect() { setIsSelected(false); } // The wp-block className is important for editor styles. // This same block is used in both the visual and the code editor. const className = dist_clsx(DEFAULT_CLASSNAMES, { 'is-selected': isSelected, 'has-fixed-toolbar': hasFixedToolbar, 'is-raw-text': true }); const decodedPlaceholder = (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(placeholder) || (0,external_wp_i18n_namespaceObject.__)('Add title'); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.TextareaControl, { ref: focusRef, value: title, onChange: onChange, onFocus: onSelect, onBlur: onUnselect, label: placeholder, className: className, placeholder: decodedPlaceholder, hideLabelFromVision: true, autoComplete: "off", dir: "auto", rows: 1, __nextHasNoMarginBottom: true }); } /* harmony default export */ const post_title_raw = ((0,external_wp_element_namespaceObject.forwardRef)(PostTitleRaw)); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-trash/index.js /** * WordPress dependencies */ /** * Internal dependencies */ function PostTrash() { const { isNew, isDeleting, postId } = (0,external_wp_data_namespaceObject.useSelect)(select => { const store = select(store_store); return { isNew: store.isEditedPostNew(), isDeleting: store.isDeletingPost(), postId: store.getCurrentPostId() }; }, []); const { trashPost } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); const [showConfirmDialog, setShowConfirmDialog] = (0,external_wp_element_namespaceObject.useState)(false); if (isNew || !postId) { return null; } const handleConfirm = () => { setShowConfirmDialog(false); trashPost(); }; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { __next40pxDefaultSize: true, className: "editor-post-trash", isDestructive: true, variant: "secondary", isBusy: isDeleting, "aria-disabled": isDeleting, onClick: isDeleting ? undefined : () => setShowConfirmDialog(true), children: (0,external_wp_i18n_namespaceObject.__)('Move to trash') }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalConfirmDialog, { isOpen: showConfirmDialog, onConfirm: handleConfirm, onCancel: () => setShowConfirmDialog(false), confirmButtonText: (0,external_wp_i18n_namespaceObject.__)('Move to trash'), size: "medium", children: (0,external_wp_i18n_namespaceObject.__)('Are you sure you want to move this post to the trash?') })] }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-trash/check.js /** * WordPress dependencies */ /** * Internal dependencies */ function PostTrashCheck({ children }) { const { canTrashPost } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { isEditedPostNew, getCurrentPostId, getCurrentPostType } = select(store_store); const { getPostType, canUser } = select(external_wp_coreData_namespaceObject.store); const postType = getPostType(getCurrentPostType()); const postId = getCurrentPostId(); const isNew = isEditedPostNew(); const resource = postType?.rest_base || ''; // eslint-disable-line camelcase const canUserDelete = postId && resource ? canUser('delete', resource, postId) : false; return { canTrashPost: (!isNew || postId) && canUserDelete }; }, []); if (!canTrashPost) { return null; } return children; } ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/copy-small.js /** * WordPress dependencies */ const copySmall = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { fillRule: "evenodd", clipRule: "evenodd", d: "M5.625 5.5h9.75c.069 0 .125.056.125.125v9.75a.125.125 0 0 1-.125.125h-9.75a.125.125 0 0 1-.125-.125v-9.75c0-.069.056-.125.125-.125ZM4 5.625C4 4.728 4.728 4 5.625 4h9.75C16.273 4 17 4.728 17 5.625v9.75c0 .898-.727 1.625-1.625 1.625h-9.75A1.625 1.625 0 0 1 4 15.375v-9.75Zm14.5 11.656v-9H20v9C20 18.8 18.77 20 17.251 20H6.25v-1.5h11.001c.69 0 1.249-.528 1.249-1.219Z" }) }); /* harmony default export */ const copy_small = (copySmall); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-url/index.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Renders the `PostURL` component. * * @example * ```jsx * <PostURL /> * ``` * * @param {Function} onClose Callback function to be executed when the popover is closed. * * @return {Component} The rendered PostURL component. */ function PostURL({ onClose }) { const { isEditable, postSlug, postLink, permalinkPrefix, permalinkSuffix, permalink } = (0,external_wp_data_namespaceObject.useSelect)(select => { var _post$_links$wpActio; const post = select(store_store).getCurrentPost(); const postTypeSlug = select(store_store).getCurrentPostType(); const postType = select(external_wp_coreData_namespaceObject.store).getPostType(postTypeSlug); const permalinkParts = select(store_store).getPermalinkParts(); const hasPublishAction = (_post$_links$wpActio = post?._links?.['wp:action-publish']) !== null && _post$_links$wpActio !== void 0 ? _post$_links$wpActio : false; return { isEditable: select(store_store).isPermalinkEditable() && hasPublishAction, postSlug: (0,external_wp_url_namespaceObject.safeDecodeURIComponent)(select(store_store).getEditedPostSlug()), viewPostLabel: postType?.labels.view_item, postLink: post.link, permalinkPrefix: permalinkParts?.prefix, permalinkSuffix: permalinkParts?.suffix, permalink: (0,external_wp_url_namespaceObject.safeDecodeURIComponent)(select(store_store).getPermalink()) }; }, []); const { editPost } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); const { createNotice } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); const [forceEmptyField, setForceEmptyField] = (0,external_wp_element_namespaceObject.useState)(false); const copyButtonRef = (0,external_wp_compose_namespaceObject.useCopyToClipboard)(permalink, () => { createNotice('info', (0,external_wp_i18n_namespaceObject.__)('Copied URL to clipboard.'), { isDismissible: true, type: 'snackbar' }); }); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "editor-post-url", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalInspectorPopoverHeader, { title: (0,external_wp_i18n_namespaceObject.__)('Link'), onClose: onClose }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { spacing: 3, children: [isEditable && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { children: [(0,external_wp_i18n_namespaceObject.__)('Customize the last part of the URL. '), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ExternalLink, { href: (0,external_wp_i18n_namespaceObject.__)('https://wordpress.org/documentation/article/page-post-settings-sidebar/#permalink'), children: (0,external_wp_i18n_namespaceObject.__)('Learn more.') })] }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { children: [isEditable && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalInputControl, { __next40pxDefaultSize: true, prefix: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalInputControlPrefixWrapper, { children: "/" }), suffix: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { icon: copy_small, ref: copyButtonRef, label: (0,external_wp_i18n_namespaceObject.__)('Copy') }), label: (0,external_wp_i18n_namespaceObject.__)('Link'), hideLabelFromVision: true, value: forceEmptyField ? '' : postSlug, autoComplete: "off", spellCheck: "false", type: "text", className: "editor-post-url__input", onChange: newValue => { editPost({ slug: newValue }); // When we delete the field the permalink gets // reverted to the original value. // The forceEmptyField logic allows the user to have // the field temporarily empty while typing. if (!newValue) { if (!forceEmptyField) { setForceEmptyField(true); } return; } if (forceEmptyField) { setForceEmptyField(false); } }, onBlur: event => { editPost({ slug: (0,external_wp_url_namespaceObject.cleanForSlug)(event.target.value) }); if (forceEmptyField) { setForceEmptyField(false); } }, help: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.ExternalLink, { className: "editor-post-url__link", href: postLink, target: "_blank", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { className: "editor-post-url__link-prefix", children: permalinkPrefix }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { className: "editor-post-url__link-slug", children: postSlug }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { className: "editor-post-url__link-suffix", children: permalinkSuffix })] }) }), !isEditable && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ExternalLink, { className: "editor-post-url__link", href: postLink, target: "_blank", children: postLink })] })] })] }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-url/check.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Check if the post URL is valid and visible. * * @param {Object} props The component props. * @param {Element} props.children The child components. * * @return {Component|null} The child components if the post URL is valid and visible, otherwise null. */ function PostURLCheck({ children }) { const isVisible = (0,external_wp_data_namespaceObject.useSelect)(select => { const postTypeSlug = select(store_store).getCurrentPostType(); const postType = select(external_wp_coreData_namespaceObject.store).getPostType(postTypeSlug); if (!postType?.viewable) { return false; } const post = select(store_store).getCurrentPost(); if (!post.link) { return false; } const permalinkParts = select(store_store).getPermalinkParts(); if (!permalinkParts) { return false; } return true; }, []); if (!isVisible) { return null; } return children; } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-url/label.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Represents a label component for a post URL. * * @return {Component} The PostURLLabel component. */ function PostURLLabel() { return usePostURLLabel(); } /** * Custom hook to get the label for the post URL. * * @return {string} The filtered and decoded post URL label. */ function usePostURLLabel() { const postLink = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getPermalink(), []); return (0,external_wp_url_namespaceObject.filterURLForDisplay)((0,external_wp_url_namespaceObject.safeDecodeURIComponent)(postLink)); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-url/panel.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Renders the `PostURLPanel` component. * * @return {JSX.Element} The rendered PostURLPanel component. */ function PostURLPanel() { // 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); // Memoize popoverProps to avoid returning a new object every time. const popoverProps = (0,external_wp_element_namespaceObject.useMemo)(() => ({ // Anchor the popover to the middle of the entire row so that it doesn't // move around when the label changes. anchor: popoverAnchor, placement: 'left-start', offset: 36, shift: true }), [popoverAnchor]); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostURLCheck, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { label: (0,external_wp_i18n_namespaceObject.__)('Link'), ref: setPopoverAnchor, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Dropdown, { popoverProps: popoverProps, className: "editor-post-url__panel-dropdown", contentClassName: "editor-post-url__panel-dialog", focusOnMount: true, renderToggle: ({ isOpen, onToggle }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostURLToggle, { isOpen: isOpen, onClick: onToggle }), renderContent: ({ onClose }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostURL, { onClose: onClose }) }) }) }); } function PostURLToggle({ isOpen, onClick }) { const { slug, isFrontPage, postLink } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { getCurrentPostId, getCurrentPost } = select(store_store); const { getEditedEntityRecord } = select(external_wp_coreData_namespaceObject.store); const siteSettings = getEditedEntityRecord('root', 'site'); const _id = getCurrentPostId(); return { slug: select(store_store).getEditedPostSlug(), isFrontPage: siteSettings?.page_on_front === _id, postLink: getCurrentPost()?.link }; }, []); const decodedSlug = (0,external_wp_url_namespaceObject.safeDecodeURIComponent)(slug); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { size: "compact", className: "editor-post-url__panel-toggle", variant: "tertiary", "aria-expanded": isOpen // translators: %s: Current post link. , "aria-label": (0,external_wp_i18n_namespaceObject.sprintf)((0,external_wp_i18n_namespaceObject.__)('Change link: %s'), decodedSlug), onClick: onClick, children: isFrontPage ? postLink : /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: ["/", decodedSlug] }) }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-visibility/check.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Determines if the current post can be edited (published) * and passes this information to the provided render function. * * @param {Object} props The component props. * @param {Function} props.render Function to render the component. * Receives an object with a `canEdit` property. * @return {JSX.Element} The rendered component. */ function PostVisibilityCheck({ render }) { const canEdit = (0,external_wp_data_namespaceObject.useSelect)(select => { var _select$getCurrentPos; return (_select$getCurrentPos = select(store_store).getCurrentPost()._links?.['wp:action-publish']) !== null && _select$getCurrentPos !== void 0 ? _select$getCurrentPos : false; }); return render({ canEdit }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/info.js /** * WordPress dependencies */ const info = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { d: "M12 3.2c-4.8 0-8.8 3.9-8.8 8.8 0 4.8 3.9 8.8 8.8 8.8 4.8 0 8.8-3.9 8.8-8.8 0-4.8-4-8.8-8.8-8.8zm0 16c-4 0-7.2-3.3-7.2-7.2C4.8 8 8 4.8 12 4.8s7.2 3.3 7.2 7.2c0 4-3.2 7.2-7.2 7.2zM11 17h2v-6h-2v6zm0-8h2V7h-2v2z" }) }); /* harmony default export */ const library_info = (info); ;// CONCATENATED MODULE: external ["wp","wordcount"] const external_wp_wordcount_namespaceObject = window["wp"]["wordcount"]; ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/word-count/index.js /** * WordPress dependencies */ /** * Internal dependencies */ function WordCount() { const content = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getEditedPostAttribute('content'), []); /* * translators: If your word count is based on single characters (e.g. East Asian characters), * enter 'characters_excluding_spaces' or 'characters_including_spaces'. Otherwise, enter 'words'. * Do not translate into your own language. */ const wordCountType = (0,external_wp_i18n_namespaceObject._x)('words', 'Word count type. Do not translate!'); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { className: "word-count", children: (0,external_wp_wordcount_namespaceObject.count)(content, wordCountType) }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/time-to-read/index.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Average reading rate - based on average taken from * https://irisreading.com/average-reading-speed-in-various-languages/ * (Characters/minute used for Chinese rather than words). * * @type {number} A rough estimate of the average reading rate across multiple languages. */ const AVERAGE_READING_RATE = 189; function TimeToRead() { const content = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getEditedPostAttribute('content'), []); /* * translators: If your word count is based on single characters (e.g. East Asian characters), * enter 'characters_excluding_spaces' or 'characters_including_spaces'. Otherwise, enter 'words'. * Do not translate into your own language. */ const wordCountType = (0,external_wp_i18n_namespaceObject._x)('words', 'Word count type. Do not translate!'); const minutesToRead = Math.round((0,external_wp_wordcount_namespaceObject.count)(content, wordCountType) / AVERAGE_READING_RATE); const minutesToReadString = minutesToRead === 0 ? (0,external_wp_element_namespaceObject.createInterpolateElement)((0,external_wp_i18n_namespaceObject.__)('<span>< 1</span> minute'), { span: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", {}) }) : (0,external_wp_element_namespaceObject.createInterpolateElement)((0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s is the number of minutes the post will take to read. */ (0,external_wp_i18n_namespaceObject._n)('<span>%d</span> minute', '<span>%d</span> minutes', minutesToRead), minutesToRead), { span: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", {}) }); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { className: "time-to-read", children: minutesToReadString }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/character-count/index.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Renders the character count of the post content. * * @return {number} The character count. */ function CharacterCount() { const content = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getEditedPostAttribute('content'), []); return (0,external_wp_wordcount_namespaceObject.count)(content, 'characters_including_spaces'); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/table-of-contents/panel.js /** * WordPress dependencies */ /** * Internal dependencies */ function TableOfContentsPanel({ hasOutlineItemsDisabled, onRequestClose }) { const { headingCount, paragraphCount, numberOfBlocks } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { getGlobalBlockCount } = select(external_wp_blockEditor_namespaceObject.store); return { headingCount: getGlobalBlockCount('core/heading'), paragraphCount: getGlobalBlockCount('core/paragraph'), numberOfBlocks: getGlobalBlockCount() }; }, []); return ( /*#__PURE__*/ /* * Disable reason: The `list` ARIA role is redundant but * Safari+VoiceOver won't announce the list otherwise. */ /* eslint-disable jsx-a11y/no-redundant-roles */ (0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: "table-of-contents__wrapper", role: "note", "aria-label": (0,external_wp_i18n_namespaceObject.__)('Document Statistics'), tabIndex: "0", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("ul", { role: "list", className: "table-of-contents__counts", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("li", { className: "table-of-contents__count", children: [(0,external_wp_i18n_namespaceObject.__)('Words'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(WordCount, {})] }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("li", { className: "table-of-contents__count", children: [(0,external_wp_i18n_namespaceObject.__)('Characters'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { className: "table-of-contents__number", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(CharacterCount, {}) })] }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("li", { className: "table-of-contents__count", children: [(0,external_wp_i18n_namespaceObject.__)('Time to read'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TimeToRead, {})] }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("li", { className: "table-of-contents__count", children: [(0,external_wp_i18n_namespaceObject.__)('Headings'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { className: "table-of-contents__number", children: headingCount })] }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("li", { className: "table-of-contents__count", children: [(0,external_wp_i18n_namespaceObject.__)('Paragraphs'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { className: "table-of-contents__number", children: paragraphCount })] }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("li", { className: "table-of-contents__count", children: [(0,external_wp_i18n_namespaceObject.__)('Blocks'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { className: "table-of-contents__number", children: numberOfBlocks })] })] }) }), headingCount > 0 && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("hr", {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("h2", { className: "table-of-contents__title", children: (0,external_wp_i18n_namespaceObject.__)('Document Outline') }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(DocumentOutline, { onSelect: onRequestClose, hasOutlineItemsDisabled: hasOutlineItemsDisabled })] })] }) /* eslint-enable jsx-a11y/no-redundant-roles */ ); } /* harmony default export */ const table_of_contents_panel = (TableOfContentsPanel); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/table-of-contents/index.js /** * WordPress dependencies */ /** * Internal dependencies */ function TableOfContents({ hasOutlineItemsDisabled, repositionDropdown, ...props }, ref) { const hasBlocks = (0,external_wp_data_namespaceObject.useSelect)(select => !!select(external_wp_blockEditor_namespaceObject.store).getBlockCount(), []); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Dropdown, { popoverProps: { placement: repositionDropdown ? 'right' : 'bottom' }, className: "table-of-contents", contentClassName: "table-of-contents__popover", renderToggle: ({ isOpen, onToggle }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { ...props, ref: ref, onClick: hasBlocks ? onToggle : undefined, icon: library_info, "aria-expanded": isOpen, "aria-haspopup": "true" /* translators: button label text should, if possible, be under 16 characters. */, label: (0,external_wp_i18n_namespaceObject.__)('Details'), tooltipPosition: "bottom", "aria-disabled": !hasBlocks }), renderContent: ({ onClose }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(table_of_contents_panel, { onRequestClose: onClose, hasOutlineItemsDisabled: hasOutlineItemsDisabled }) }); } /* harmony default export */ const table_of_contents = ((0,external_wp_element_namespaceObject.forwardRef)(TableOfContents)); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/unsaved-changes-warning/index.js /** * WordPress dependencies */ /** * Warns the user if there are unsaved changes before leaving the editor. * Compatible with Post Editor and Site Editor. * * @return {Component} The component. */ function UnsavedChangesWarning() { const { __experimentalGetDirtyEntityRecords } = (0,external_wp_data_namespaceObject.useSelect)(external_wp_coreData_namespaceObject.store); (0,external_wp_element_namespaceObject.useEffect)(() => { /** * Warns the user if there are unsaved changes before leaving the editor. * * @param {Event} event `beforeunload` event. * * @return {string | undefined} Warning prompt message, if unsaved changes exist. */ const warnIfUnsavedChanges = event => { // We need to call the selector directly in the listener to avoid race // conditions with `BrowserURL` where `componentDidUpdate` gets the // new value of `isEditedPostDirty` before this component does, // causing this component to incorrectly think a trashed post is still dirty. const dirtyEntityRecords = __experimentalGetDirtyEntityRecords(); if (dirtyEntityRecords.length > 0) { event.returnValue = (0,external_wp_i18n_namespaceObject.__)('You have unsaved changes. If you proceed, they will be lost.'); return event.returnValue; } }; window.addEventListener('beforeunload', warnIfUnsavedChanges); return () => { window.removeEventListener('beforeunload', warnIfUnsavedChanges); }; }, [__experimentalGetDirtyEntityRecords]); return null; } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/provider/with-registry-provider.js /** * WordPress dependencies */ /** * Internal dependencies */ function getSubRegistry(subRegistries, registry, useSubRegistry) { if (!useSubRegistry) { return registry; } let subRegistry = subRegistries.get(registry); if (!subRegistry) { subRegistry = (0,external_wp_data_namespaceObject.createRegistry)({ 'core/block-editor': external_wp_blockEditor_namespaceObject.storeConfig }, registry); // Todo: The interface store should also be created per instance. subRegistry.registerStore('core/editor', storeConfig); subRegistries.set(registry, subRegistry); } return subRegistry; } const withRegistryProvider = (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(WrappedComponent => ({ useSubRegistry = true, ...props }) => { const registry = (0,external_wp_data_namespaceObject.useRegistry)(); const [subRegistries] = (0,external_wp_element_namespaceObject.useState)(() => new WeakMap()); const subRegistry = getSubRegistry(subRegistries, registry, useSubRegistry); if (subRegistry === registry) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(WrappedComponent, { registry: registry, ...props }); } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_data_namespaceObject.RegistryProvider, { value: subRegistry, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(WrappedComponent, { registry: subRegistry, ...props }) }); }, 'withRegistryProvider'); /* harmony default export */ const with_registry_provider = (withRegistryProvider); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/media-categories/index.js /** * The `editor` settings here need to be in sync with the corresponding ones in `editor` package. * See `packages/editor/src/components/media-categories/index.js`. * * In the future we could consider creating an Openvese package that can be used in both `editor` and `site-editor`. * The rest of the settings would still need to be in sync though. */ /** * WordPress dependencies */ /** * Internal dependencies */ /** @typedef {import('@wordpress/block-editor').InserterMediaRequest} InserterMediaRequest */ /** @typedef {import('@wordpress/block-editor').InserterMediaItem} InserterMediaItem */ /** @typedef {import('@wordpress/block-editor').InserterMediaCategory} InserterMediaCategory */ const getExternalLink = (url, text) => `<a ${getExternalLinkAttributes(url)}>${text}</a>`; const getExternalLinkAttributes = url => `href="${url}" target="_blank" rel="noreferrer noopener"`; const getOpenverseLicense = (license, licenseVersion) => { let licenseName = license.trim(); // PDM has no abbreviation if (license !== 'pdm') { licenseName = license.toUpperCase().replace('SAMPLING', 'Sampling'); } // If version is known, append version to the name. // The license has to have a version to be valid. Only // PDM (public domain mark) doesn't have a version. if (licenseVersion) { licenseName += ` ${licenseVersion}`; } // For licenses other than public-domain marks, prepend 'CC' to the name. if (!['pdm', 'cc0'].includes(license)) { licenseName = `CC ${licenseName}`; } return licenseName; }; const getOpenverseCaption = item => { const { title, foreign_landing_url: foreignLandingUrl, creator, creator_url: creatorUrl, license, license_version: licenseVersion, license_url: licenseUrl } = item; const fullLicense = getOpenverseLicense(license, licenseVersion); const _creator = (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(creator); let _caption; if (_creator) { _caption = title ? (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %1s: Title of a media work from Openverse; %2s: Name of the work's creator; %3s: Work's licence e.g: "CC0 1.0". (0,external_wp_i18n_namespaceObject._x)('"%1$s" by %2$s/ %3$s', 'caption'), getExternalLink(foreignLandingUrl, (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(title)), creatorUrl ? getExternalLink(creatorUrl, _creator) : _creator, licenseUrl ? getExternalLink(`${licenseUrl}?ref=openverse`, fullLicense) : fullLicense) : (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %1s: Link attributes for a given Openverse media work; %2s: Name of the work's creator; %3s: Works's licence e.g: "CC0 1.0". (0,external_wp_i18n_namespaceObject._x)('<a %1$s>Work</a> by %2$s/ %3$s', 'caption'), getExternalLinkAttributes(foreignLandingUrl), creatorUrl ? getExternalLink(creatorUrl, _creator) : _creator, licenseUrl ? getExternalLink(`${licenseUrl}?ref=openverse`, fullLicense) : fullLicense); } else { _caption = title ? (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %1s: Title of a media work from Openverse; %2s: Work's licence e.g: "CC0 1.0". (0,external_wp_i18n_namespaceObject._x)('"%1$s"/ %2$s', 'caption'), getExternalLink(foreignLandingUrl, (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(title)), licenseUrl ? getExternalLink(`${licenseUrl}?ref=openverse`, fullLicense) : fullLicense) : (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %1s: Link attributes for a given Openverse media work; %2s: Works's licence e.g: "CC0 1.0". (0,external_wp_i18n_namespaceObject._x)('<a %1$s>Work</a>/ %2$s', 'caption'), getExternalLinkAttributes(foreignLandingUrl), licenseUrl ? getExternalLink(`${licenseUrl}?ref=openverse`, fullLicense) : fullLicense); } return _caption.replace(/\s{2}/g, ' '); }; const coreMediaFetch = async (query = {}) => { const mediaItems = await (0,external_wp_data_namespaceObject.resolveSelect)(external_wp_coreData_namespaceObject.store).getMediaItems({ ...query, orderBy: !!query?.search ? 'relevance' : 'date' }); return mediaItems.map(mediaItem => ({ ...mediaItem, alt: mediaItem.alt_text, url: mediaItem.source_url, previewUrl: mediaItem.media_details?.sizes?.medium?.source_url, caption: mediaItem.caption?.raw })); }; /** @type {InserterMediaCategory[]} */ const inserterMediaCategories = [{ name: 'images', labels: { name: (0,external_wp_i18n_namespaceObject.__)('Images'), search_items: (0,external_wp_i18n_namespaceObject.__)('Search images') }, mediaType: 'image', async fetch(query = {}) { return coreMediaFetch({ ...query, media_type: 'image' }); } }, { name: 'videos', labels: { name: (0,external_wp_i18n_namespaceObject.__)('Videos'), search_items: (0,external_wp_i18n_namespaceObject.__)('Search videos') }, mediaType: 'video', async fetch(query = {}) { return coreMediaFetch({ ...query, media_type: 'video' }); } }, { name: 'audio', labels: { name: (0,external_wp_i18n_namespaceObject.__)('Audio'), search_items: (0,external_wp_i18n_namespaceObject.__)('Search audio') }, mediaType: 'audio', async fetch(query = {}) { return coreMediaFetch({ ...query, media_type: 'audio' }); } }, { name: 'openverse', labels: { name: (0,external_wp_i18n_namespaceObject.__)('Openverse'), search_items: (0,external_wp_i18n_namespaceObject.__)('Search Openverse') }, mediaType: 'image', async fetch(query = {}) { const defaultArgs = { mature: false, excluded_source: 'flickr,inaturalist,wikimedia', license: 'pdm,cc0' }; const finalQuery = { ...query, ...defaultArgs }; const mapFromInserterMediaRequest = { per_page: 'page_size', search: 'q' }; const url = new URL('https://api.openverse.org/v1/images/'); Object.entries(finalQuery).forEach(([key, value]) => { const queryKey = mapFromInserterMediaRequest[key] || key; url.searchParams.set(queryKey, value); }); const response = await window.fetch(url, { headers: { 'User-Agent': 'WordPress/inserter-media-fetch' } }); const jsonResponse = await response.json(); const results = jsonResponse.results; return results.map(result => ({ ...result, // This is a temp solution for better titles, until Openverse API // completes the cleaning up of some titles of their upstream data. title: result.title?.toLowerCase().startsWith('file:') ? result.title.slice(5) : result.title, sourceId: result.id, id: undefined, caption: getOpenverseCaption(result), previewUrl: result.thumbnail })); }, getReportUrl: ({ sourceId }) => `https://wordpress.org/openverse/image/${sourceId}/report/`, isExternalResource: true }]; /* harmony default export */ const media_categories = (inserterMediaCategories); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/utils/media-upload/index.js /** * WordPress dependencies */ /** * Internal dependencies */ const media_upload_noop = () => {}; /** * Upload a media file when the file upload button is activated. * Wrapper around mediaUpload() that injects the current post ID. * * @param {Object} $0 Parameters object passed to the function. * @param {?Object} $0.additionalData Additional data to include in the request. * @param {string} $0.allowedTypes Array with the types of media that can be uploaded, if unset all types are allowed. * @param {Array} $0.filesList List of files. * @param {?number} $0.maxUploadFileSize Maximum upload size in bytes allowed for the site. * @param {Function} $0.onError Function called when an error happens. * @param {Function} $0.onFileChange Function called each time a file or a temporary representation of the file is available. */ function mediaUpload({ additionalData = {}, allowedTypes, filesList, maxUploadFileSize, onError = media_upload_noop, onFileChange }) { const { getCurrentPost, getEditorSettings } = (0,external_wp_data_namespaceObject.select)(store_store); const wpAllowedMimeTypes = getEditorSettings().allowedMimeTypes; maxUploadFileSize = maxUploadFileSize || getEditorSettings().maxUploadFileSize; const currentPost = getCurrentPost(); // Templates and template parts' numerical ID is stored in `wp_id`. const currentPostId = typeof currentPost?.id === 'number' ? currentPost.id : currentPost?.wp_id; const postData = currentPostId ? { post: currentPostId } : {}; (0,external_wp_mediaUtils_namespaceObject.uploadMedia)({ allowedTypes, filesList, onFileChange, additionalData: { ...postData, ...additionalData }, maxUploadFileSize, onError: ({ message }) => onError(message), wpAllowedMimeTypes }); } // EXTERNAL MODULE: ./node_modules/deepmerge/dist/cjs.js var cjs = __webpack_require__(66); var cjs_default = /*#__PURE__*/__webpack_require__.n(cjs); ;// CONCATENATED MODULE: ./node_modules/is-plain-object/dist/is-plain-object.mjs /*! * is-plain-object <https://github.com/jonschlinkert/is-plain-object> * * Copyright (c) 2014-2017, Jon Schlinkert. * Released under the MIT License. */ function isObject(o) { return Object.prototype.toString.call(o) === '[object Object]'; } function isPlainObject(o) { var ctor,prot; if (isObject(o) === false) return false; // If has modified constructor ctor = o.constructor; if (ctor === undefined) return true; // If has modified prototype prot = ctor.prototype; if (isObject(prot) === false) return false; // If constructor does not have an Object-specific method if (prot.hasOwnProperty('isPrototypeOf') === false) { return false; } // Most likely a plain Object return true; } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/global-styles-provider/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ const { GlobalStylesContext: global_styles_provider_GlobalStylesContext, cleanEmptyObject } = unlock(external_wp_blockEditor_namespaceObject.privateApis); function mergeBaseAndUserConfigs(base, user) { return cjs_default()(base, user, { // We only pass as arrays the presets, // in which case we want the new array of values // to override the old array (no merging). isMergeableObject: isPlainObject }); } function useGlobalStylesUserConfig() { const { globalStylesId, isReady, settings, styles, _links } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { getEditedEntityRecord, hasFinishedResolution } = select(external_wp_coreData_namespaceObject.store); const _globalStylesId = select(external_wp_coreData_namespaceObject.store).__experimentalGetCurrentGlobalStylesId(); const record = _globalStylesId ? getEditedEntityRecord('root', 'globalStyles', _globalStylesId) : undefined; let hasResolved = false; if (hasFinishedResolution('__experimentalGetCurrentGlobalStylesId')) { hasResolved = _globalStylesId ? hasFinishedResolution('getEditedEntityRecord', ['root', 'globalStyles', _globalStylesId]) : true; } return { globalStylesId: _globalStylesId, isReady: hasResolved, settings: record?.settings, styles: record?.styles, _links: record?._links }; }, []); const { getEditedEntityRecord } = (0,external_wp_data_namespaceObject.useSelect)(external_wp_coreData_namespaceObject.store); const { editEntityRecord } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); const config = (0,external_wp_element_namespaceObject.useMemo)(() => { return { settings: settings !== null && settings !== void 0 ? settings : {}, styles: styles !== null && styles !== void 0 ? styles : {}, _links: _links !== null && _links !== void 0 ? _links : {} }; }, [settings, styles, _links]); const setConfig = (0,external_wp_element_namespaceObject.useCallback)( /** * Set the global styles config. * @param {Function|Object} callbackOrObject If the callbackOrObject is a function, pass the current config to the callback so the consumer can merge values. * Otherwise, overwrite the current config with the incoming object. * @param {Object} options Options for editEntityRecord Core selector. */ (callbackOrObject, options = {}) => { var _record$styles, _record$settings, _record$_links; const record = getEditedEntityRecord('root', 'globalStyles', globalStylesId); const currentConfig = { styles: (_record$styles = record?.styles) !== null && _record$styles !== void 0 ? _record$styles : {}, settings: (_record$settings = record?.settings) !== null && _record$settings !== void 0 ? _record$settings : {}, _links: (_record$_links = record?._links) !== null && _record$_links !== void 0 ? _record$_links : {} }; const updatedConfig = typeof callbackOrObject === 'function' ? callbackOrObject(currentConfig) : callbackOrObject; editEntityRecord('root', 'globalStyles', globalStylesId, { styles: cleanEmptyObject(updatedConfig.styles) || {}, settings: cleanEmptyObject(updatedConfig.settings) || {}, _links: cleanEmptyObject(updatedConfig._links) || {} }, options); }, [globalStylesId, editEntityRecord, getEditedEntityRecord]); return [isReady, config, setConfig]; } function useGlobalStylesBaseConfig() { const baseConfig = (0,external_wp_data_namespaceObject.useSelect)(select => { return select(external_wp_coreData_namespaceObject.store).__experimentalGetCurrentThemeBaseGlobalStyles(); }, []); return [!!baseConfig, baseConfig]; } function useGlobalStylesContext() { const [isUserConfigReady, userConfig, setUserConfig] = useGlobalStylesUserConfig(); const [isBaseConfigReady, baseConfig] = useGlobalStylesBaseConfig(); const mergedConfig = (0,external_wp_element_namespaceObject.useMemo)(() => { if (!baseConfig || !userConfig) { return {}; } return mergeBaseAndUserConfigs(baseConfig, userConfig); }, [userConfig, baseConfig]); const context = (0,external_wp_element_namespaceObject.useMemo)(() => { return { isReady: isUserConfigReady && isBaseConfigReady, user: userConfig, base: baseConfig, merged: mergedConfig, setUserConfig }; }, [mergedConfig, userConfig, baseConfig, setUserConfig, isUserConfigReady, isBaseConfigReady]); return context; } function GlobalStylesProvider({ children }) { const context = useGlobalStylesContext(); if (!context.isReady) { return null; } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(global_styles_provider_GlobalStylesContext.Provider, { value: context, children: children }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/provider/use-block-editor-settings.js /** * WordPress dependencies */ /** * Internal dependencies */ const EMPTY_BLOCKS_LIST = []; const DEFAULT_STYLES = {}; function __experimentalReusableBlocksSelect(select) { var _select$getEntityReco; return (_select$getEntityReco = select(external_wp_coreData_namespaceObject.store).getEntityRecords('postType', 'wp_block', { per_page: -1 })) !== null && _select$getEntityReco !== void 0 ? _select$getEntityReco : EMPTY_BLOCKS_LIST; } const BLOCK_EDITOR_SETTINGS = ['__experimentalBlockDirectory', '__experimentalDiscussionSettings', '__experimentalFeatures', '__experimentalGlobalStylesBaseStyles', '__unstableGalleryWithImageBlocks', 'alignWide', 'blockInspectorTabs', 'allowedMimeTypes', 'bodyPlaceholder', 'canLockBlocks', 'capabilities', 'clearBlockSelection', 'codeEditingEnabled', 'colors', 'disableCustomColors', 'disableCustomFontSizes', 'disableCustomSpacingSizes', 'disableCustomGradients', 'disableLayoutStyles', 'enableCustomLineHeight', 'enableCustomSpacing', 'enableCustomUnits', 'enableOpenverseMediaCategory', 'fontSizes', 'gradients', 'generateAnchors', 'onNavigateToEntityRecord', 'imageDefaultSize', 'imageDimensions', 'imageEditing', 'imageSizes', 'isRTL', 'locale', 'maxWidth', 'postContentAttributes', 'postsPerPage', 'readOnly', 'sectionRootClientId', 'styles', 'titlePlaceholder', 'supportsLayout', 'widgetTypesToHideFromLegacyWidgetBlock', '__unstableHasCustomAppender', '__unstableIsPreviewMode', '__unstableResolvedAssets', '__unstableIsBlockBasedTheme', '__experimentalArchiveTitleTypeLabel', '__experimentalArchiveTitleNameLabel']; const { globalStylesDataKey, selectBlockPatternsKey, reusableBlocksSelectKey } = unlock(external_wp_blockEditor_namespaceObject.privateApis); /** * React hook used to compute the block editor settings to use for the post editor. * * @param {Object} settings EditorProvider settings prop. * @param {string} postType Editor root level post type. * @param {string} postId Editor root level post ID. * @param {string} renderingMode Editor rendering mode. * * @return {Object} Block Editor Settings. */ function useBlockEditorSettings(settings, postType, postId, renderingMode) { var _mergedGlobalStyles$s, _settings$__experimen, _settings$__experimen2; const isLargeViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium'); const { allowRightClickOverrides, blockTypes, focusMode, hasFixedToolbar, isDistractionFree, keepCaretInsideBlock, hasUploadPermissions, hiddenBlockTypes, canUseUnfilteredHTML, userCanCreatePages, pageOnFront, pageForPosts, userPatternCategories, restBlockPatternCategories, sectionRootClientId } = (0,external_wp_data_namespaceObject.useSelect)(select => { var _canUser; const { canUser, getRawEntityRecord, getEntityRecord, getUserPatternCategories, getBlockPatternCategories } = select(external_wp_coreData_namespaceObject.store); const { get } = select(external_wp_preferences_namespaceObject.store); const { getBlockTypes } = select(external_wp_blocks_namespaceObject.store); const { getBlocksByName, getBlockAttributes } = select(external_wp_blockEditor_namespaceObject.store); const siteSettings = canUser('read', 'settings') ? getEntityRecord('root', 'site') : undefined; function getSectionRootBlock() { var _getBlocksByName$find; if (renderingMode === 'template-locked') { var _getBlocksByName$; return (_getBlocksByName$ = getBlocksByName('core/post-content')?.[0]) !== null && _getBlocksByName$ !== void 0 ? _getBlocksByName$ : ''; } return (_getBlocksByName$find = getBlocksByName('core/group').find(clientId => getBlockAttributes(clientId)?.tagName === 'main')) !== null && _getBlocksByName$find !== void 0 ? _getBlocksByName$find : ''; } return { allowRightClickOverrides: get('core', 'allowRightClickOverrides'), blockTypes: getBlockTypes(), canUseUnfilteredHTML: getRawEntityRecord('postType', postType, postId)?._links?.hasOwnProperty('wp:action-unfiltered-html'), focusMode: get('core', 'focusMode'), hasFixedToolbar: get('core', 'fixedToolbar') || !isLargeViewport, hiddenBlockTypes: get('core', 'hiddenBlockTypes'), isDistractionFree: get('core', 'distractionFree'), keepCaretInsideBlock: get('core', 'keepCaretInsideBlock'), hasUploadPermissions: (_canUser = canUser('create', 'media')) !== null && _canUser !== void 0 ? _canUser : true, userCanCreatePages: canUser('create', 'pages'), pageOnFront: siteSettings?.page_on_front, pageForPosts: siteSettings?.page_for_posts, userPatternCategories: getUserPatternCategories(), restBlockPatternCategories: getBlockPatternCategories(), sectionRootClientId: getSectionRootBlock() }; }, [postType, postId, isLargeViewport, renderingMode]); const { merged: mergedGlobalStyles } = useGlobalStylesContext(); const globalStylesData = (_mergedGlobalStyles$s = mergedGlobalStyles.styles) !== null && _mergedGlobalStyles$s !== void 0 ? _mergedGlobalStyles$s : DEFAULT_STYLES; const settingsBlockPatterns = (_settings$__experimen = settings.__experimentalAdditionalBlockPatterns) !== null && _settings$__experimen !== void 0 ? _settings$__experimen : // WP 6.0 settings.__experimentalBlockPatterns; // WP 5.9 const settingsBlockPatternCategories = (_settings$__experimen2 = settings.__experimentalAdditionalBlockPatternCategories) !== null && _settings$__experimen2 !== void 0 ? _settings$__experimen2 : // WP 6.0 settings.__experimentalBlockPatternCategories; // WP 5.9 const blockPatterns = (0,external_wp_element_namespaceObject.useMemo)(() => [...(settingsBlockPatterns || [])].filter(({ postTypes }) => { return !postTypes || Array.isArray(postTypes) && postTypes.includes(postType); }), [settingsBlockPatterns, postType]); const blockPatternCategories = (0,external_wp_element_namespaceObject.useMemo)(() => [...(settingsBlockPatternCategories || []), ...(restBlockPatternCategories || [])].filter((x, index, arr) => index === arr.findIndex(y => x.name === y.name)), [settingsBlockPatternCategories, restBlockPatternCategories]); const { undo, setIsInserterOpened } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); const { saveEntityRecord } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); /** * Creates a Post entity. * This is utilised by the Link UI to allow for on-the-fly creation of Posts/Pages. * * @param {Object} options parameters for the post being created. These mirror those used on 3rd param of saveEntityRecord. * @return {Object} the post type object that was created. */ const createPageEntity = (0,external_wp_element_namespaceObject.useCallback)(options => { if (!userCanCreatePages) { return Promise.reject({ message: (0,external_wp_i18n_namespaceObject.__)('You do not have permission to create Pages.') }); } return saveEntityRecord('postType', 'page', options); }, [saveEntityRecord, userCanCreatePages]); const allowedBlockTypes = (0,external_wp_element_namespaceObject.useMemo)(() => { // Omit hidden block types if exists and non-empty. if (hiddenBlockTypes && hiddenBlockTypes.length > 0) { // Defer to passed setting for `allowedBlockTypes` if provided as // anything other than `true` (where `true` is equivalent to allow // all block types). const defaultAllowedBlockTypes = true === settings.allowedBlockTypes ? blockTypes.map(({ name }) => name) : settings.allowedBlockTypes || []; return defaultAllowedBlockTypes.filter(type => !hiddenBlockTypes.includes(type)); } return settings.allowedBlockTypes; }, [settings.allowedBlockTypes, hiddenBlockTypes, blockTypes]); const forceDisableFocusMode = settings.focusMode === false; return (0,external_wp_element_namespaceObject.useMemo)(() => { const blockEditorSettings = { ...Object.fromEntries(Object.entries(settings).filter(([key]) => BLOCK_EDITOR_SETTINGS.includes(key))), [globalStylesDataKey]: globalStylesData, allowedBlockTypes, allowRightClickOverrides, focusMode: focusMode && !forceDisableFocusMode, hasFixedToolbar, isDistractionFree, keepCaretInsideBlock, mediaUpload: hasUploadPermissions ? mediaUpload : undefined, __experimentalBlockPatterns: blockPatterns, [selectBlockPatternsKey]: select => { const { hasFinishedResolution, getBlockPatternsForPostType } = unlock(select(external_wp_coreData_namespaceObject.store)); const patterns = getBlockPatternsForPostType(postType); return hasFinishedResolution('getBlockPatterns') ? patterns : undefined; }, [reusableBlocksSelectKey]: __experimentalReusableBlocksSelect, __experimentalBlockPatternCategories: blockPatternCategories, __experimentalUserPatternCategories: userPatternCategories, __experimentalFetchLinkSuggestions: (search, searchOptions) => (0,external_wp_coreData_namespaceObject.__experimentalFetchLinkSuggestions)(search, searchOptions, settings), inserterMediaCategories: media_categories, __experimentalFetchRichUrlData: external_wp_coreData_namespaceObject.__experimentalFetchUrlData, // Todo: This only checks the top level post, not the post within a template or any other entity that can be edited. // This might be better as a generic "canUser" selector. __experimentalCanUserUseUnfilteredHTML: canUseUnfilteredHTML, //Todo: this is only needed for native and should probably be removed. __experimentalUndo: undo, // Check whether we want all site editor frames to have outlines // including the navigation / pattern / parts editors. outlineMode: postType === 'wp_template', // Check these two properties: they were not present in the site editor. __experimentalCreatePageEntity: createPageEntity, __experimentalUserCanCreatePages: userCanCreatePages, pageOnFront, pageForPosts, __experimentalPreferPatternsOnRoot: postType === 'wp_template', templateLock: postType === 'wp_navigation' ? 'insert' : settings.templateLock, template: postType === 'wp_navigation' ? [['core/navigation', {}, []]] : settings.template, __experimentalSetIsInserterOpened: setIsInserterOpened }; lock(blockEditorSettings, { sectionRootClientId }); return blockEditorSettings; }, [allowedBlockTypes, allowRightClickOverrides, focusMode, forceDisableFocusMode, hasFixedToolbar, isDistractionFree, keepCaretInsideBlock, settings, hasUploadPermissions, userPatternCategories, blockPatterns, blockPatternCategories, canUseUnfilteredHTML, undo, createPageEntity, userCanCreatePages, pageOnFront, pageForPosts, postType, setIsInserterOpened, sectionRootClientId, globalStylesData]); } /* harmony default export */ const use_block_editor_settings = (useBlockEditorSettings); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/provider/disable-non-page-content-blocks.js /** * WordPress dependencies */ const DEFAULT_CONTENT_ONLY_BLOCKS = ['core/post-title', 'core/post-featured-image', 'core/post-content', 'core/template-part']; /** * Component that when rendered, makes it so that the site editor allows only * page content to be edited. */ function DisableNonPageContentBlocks() { const contentOnlyBlocks = (0,external_wp_hooks_namespaceObject.applyFilters)('editor.postContentBlockTypes', DEFAULT_CONTENT_ONLY_BLOCKS); // Note that there are two separate subscription because the result for each // returns a new array. const contentOnlyIds = (0,external_wp_data_namespaceObject.useSelect)(select => { const { getBlocksByName, getBlockParents, getBlockName } = select(external_wp_blockEditor_namespaceObject.store); return getBlocksByName(contentOnlyBlocks).filter(clientId => getBlockParents(clientId).every(parentClientId => { const parentBlockName = getBlockName(parentClientId); return ( // Ignore descendents of the query block. parentBlockName !== 'core/query' && // Enable only the top-most block. !contentOnlyBlocks.includes(parentBlockName) ); })); }, []); const disabledIds = (0,external_wp_data_namespaceObject.useSelect)(select => { const { getBlocksByName, getBlockOrder } = select(external_wp_blockEditor_namespaceObject.store); return getBlocksByName(['core/template-part']).flatMap(clientId => getBlockOrder(clientId)); }, []); const registry = (0,external_wp_data_namespaceObject.useRegistry)(); (0,external_wp_element_namespaceObject.useEffect)(() => { const { setBlockEditingMode, unsetBlockEditingMode } = registry.dispatch(external_wp_blockEditor_namespaceObject.store); registry.batch(() => { setBlockEditingMode('', 'disabled'); for (const clientId of contentOnlyIds) { setBlockEditingMode(clientId, 'contentOnly'); } for (const clientId of disabledIds) { setBlockEditingMode(clientId, 'disabled'); } }); return () => { registry.batch(() => { unsetBlockEditingMode(''); for (const clientId of contentOnlyIds) { unsetBlockEditingMode(clientId); } for (const clientId of disabledIds) { unsetBlockEditingMode(clientId); } }); }; }, [contentOnlyIds, disabledIds, registry]); return null; } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/provider/navigation-block-editing-mode.js /** * WordPress dependencies */ /** * For the Navigation block editor, we need to force the block editor to contentOnly for that block. * * Set block editing mode to contentOnly when entering Navigation focus mode. * this ensures that non-content controls on the block will be hidden and thus * the user can focus on editing the Navigation Menu content only. */ function NavigationBlockEditingMode() { // In the navigation block editor, // the navigation block is the only root block. const blockClientId = (0,external_wp_data_namespaceObject.useSelect)(select => select(external_wp_blockEditor_namespaceObject.store).getBlockOrder()?.[0], []); const { setBlockEditingMode, unsetBlockEditingMode } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_blockEditor_namespaceObject.store); (0,external_wp_element_namespaceObject.useEffect)(() => { if (!blockClientId) { return; } setBlockEditingMode(blockClientId, 'contentOnly'); return () => { unsetBlockEditingMode(blockClientId); }; }, [blockClientId, unsetBlockEditingMode, setBlockEditingMode]); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/provider/use-hide-blocks-from-inserter.js /** * WordPress dependencies */ // These post types are "structural" block lists. // We should be allowed to use // the post content and template parts blocks within them. const POST_TYPES_ALLOWING_POST_CONTENT_TEMPLATE_PART = ['wp_block', 'wp_template', 'wp_template_part']; /** * In some specific contexts, * the template part and post content blocks need to be hidden. * * @param {string} postType Post Type * @param {string} mode Rendering mode */ function useHideBlocksFromInserter(postType, mode) { (0,external_wp_element_namespaceObject.useEffect)(() => { /* * Prevent adding template part in the editor. */ (0,external_wp_hooks_namespaceObject.addFilter)('blockEditor.__unstableCanInsertBlockType', 'removeTemplatePartsFromInserter', (canInsert, blockType) => { if (!POST_TYPES_ALLOWING_POST_CONTENT_TEMPLATE_PART.includes(postType) && blockType.name === 'core/template-part' && mode === 'post-only') { return false; } return canInsert; }); /* * Prevent adding post content block (except in query block) in the editor. */ (0,external_wp_hooks_namespaceObject.addFilter)('blockEditor.__unstableCanInsertBlockType', 'removePostContentFromInserter', (canInsert, blockType, rootClientId, { getBlockParentsByBlockName }) => { if (!POST_TYPES_ALLOWING_POST_CONTENT_TEMPLATE_PART.includes(postType) && blockType.name === 'core/post-content') { return getBlockParentsByBlockName(rootClientId, 'core/query').length > 0; } return canInsert; }); return () => { (0,external_wp_hooks_namespaceObject.removeFilter)('blockEditor.__unstableCanInsertBlockType', 'removeTemplatePartsFromInserter'); (0,external_wp_hooks_namespaceObject.removeFilter)('blockEditor.__unstableCanInsertBlockType', 'removePostContentFromInserter'); }; }, [postType, mode]); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/keyboard.js /** * WordPress dependencies */ const keyboard = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_primitives_namespaceObject.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { d: "m16 15.5h-8v-1.5h8zm-7.5-2.5h-2v-2h2zm3 0h-2v-2h2zm3 0h-2v-2h2zm3 0h-2v-2h2zm-9-3h-2v-2h2zm3 0h-2v-2h2zm3 0h-2v-2h2zm3 0h-2v-2h2z" }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { d: "m18.5 6.5h-13a.5.5 0 0 0 -.5.5v9.5a.5.5 0 0 0 .5.5h13a.5.5 0 0 0 .5-.5v-9.5a.5.5 0 0 0 -.5-.5zm-13-1.5h13a2 2 0 0 1 2 2v9.5a2 2 0 0 1 -2 2h-13a2 2 0 0 1 -2-2v-9.5a2 2 0 0 1 2-2z" })] }); /* harmony default export */ const library_keyboard = (keyboard); ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/list-view.js /** * WordPress dependencies */ const listView = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { d: "M3 6h11v1.5H3V6Zm3.5 5.5h11V13h-11v-1.5ZM21 17H10v1.5h11V17Z" }) }); /* harmony default export */ const list_view = (listView); ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/code.js /** * WordPress dependencies */ const code = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { d: "M20.8 10.7l-4.3-4.3-1.1 1.1 4.3 4.3c.1.1.1.3 0 .4l-4.3 4.3 1.1 1.1 4.3-4.3c.7-.8.7-1.9 0-2.6zM4.2 11.8l4.3-4.3-1-1-4.3 4.3c-.7.7-.7 1.8 0 2.5l4.3 4.3 1.1-1.1-4.3-4.3c-.2-.1-.2-.3-.1-.4z" }) }); /* harmony default export */ const library_code = (code); ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/drawer-left.js /** * WordPress dependencies */ const drawerLeft = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { width: "24", height: "24", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { fillRule: "evenodd", clipRule: "evenodd", d: "M18 4H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zM8.5 18.5H6c-.3 0-.5-.2-.5-.5V6c0-.3.2-.5.5-.5h2.5v13zm10-.5c0 .3-.2.5-.5.5h-8v-13h8c.3 0 .5.2.5.5v12z" }) }); /* harmony default export */ const drawer_left = (drawerLeft); ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/drawer-right.js /** * WordPress dependencies */ const drawerRight = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { width: "24", height: "24", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { fillRule: "evenodd", clipRule: "evenodd", d: "M18 4H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-4 14.5H6c-.3 0-.5-.2-.5-.5V6c0-.3.2-.5.5-.5h8v13zm4.5-.5c0 .3-.2.5-.5.5h-2.5v-13H18c.3 0 .5.2.5.5v12z" }) }); /* harmony default export */ const drawer_right = (drawerRight); ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/block-default.js /** * WordPress dependencies */ const blockDefault = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { d: "M19 8h-1V6h-5v2h-2V6H6v2H5c-1.1 0-2 .9-2 2v8c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-8c0-1.1-.9-2-2-2zm.5 10c0 .3-.2.5-.5.5H5c-.3 0-.5-.2-.5-.5v-8c0-.3.2-.5.5-.5h14c.3 0 .5.2.5.5v8z" }) }); /* harmony default export */ const block_default = (blockDefault); ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/format-list-bullets.js /** * WordPress dependencies */ const formatListBullets = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { d: "M11.1 15.8H20v-1.5h-8.9v1.5zm0-8.6v1.5H20V7.2h-8.9zM6 13c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-7c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z" }) }); /* harmony default export */ const format_list_bullets = (formatListBullets); ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/external.js /** * WordPress dependencies */ const external = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { d: "M19.5 4.5h-7V6h4.44l-5.97 5.97 1.06 1.06L18 7.06v4.44h1.5v-7Zm-13 1a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-3H17v3a.5.5 0 0 1-.5.5h-10a.5.5 0 0 1-.5-.5v-10a.5.5 0 0 1 .5-.5h3V5.5h-3Z" }) }); /* harmony default export */ const library_external = (external); ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/pencil.js /** * WordPress dependencies */ const pencil = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { d: "m19 7-3-3-8.5 8.5-1 4 4-1L19 7Zm-7 11.5H5V20h7v-1.5Z" }) }); /* harmony default export */ const library_pencil = (pencil); ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/edit.js /** * Internal dependencies */ /* harmony default export */ const edit = (library_pencil); ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/pattern-rename-modal/index.js /** * WordPress dependencies */ /** * Internal dependencies */ const { RenamePatternModal } = unlock(external_wp_patterns_namespaceObject.privateApis); const modalName = 'editor/pattern-rename'; function PatternRenameModal() { const { record, postType } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { getCurrentPostType, getCurrentPostId } = select(store_store); const { getEditedEntityRecord } = select(external_wp_coreData_namespaceObject.store); const _postType = getCurrentPostType(); return { record: getEditedEntityRecord('postType', _postType, getCurrentPostId()), postType: _postType }; }, []); const { closeModal } = (0,external_wp_data_namespaceObject.useDispatch)(store); const isActive = (0,external_wp_data_namespaceObject.useSelect)(select => select(store).isModalActive(modalName)); if (!isActive || postType !== PATTERN_POST_TYPE) {
•
Search:
•
Replace:
1
2
3
Function
Edit by line
Download
Information
Rename
Copy
Move
Delete
Chmod
List