: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
function PatternsListHeader({
filteredBlockPatternsLength
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalHeading, {
className: "block-editor-block-patterns-explorer__search-results-count",
children: (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %d: number of patterns. */
(0,external_wp_i18n_namespaceObject._n)('%d pattern found', '%d patterns found', filteredBlockPatternsLength), filteredBlockPatternsLength)
const container = (0,external_wp_element_namespaceObject.useRef)();
const debouncedSpeak = (0,external_wp_compose_namespaceObject.useDebounce)(external_wp_a11y_namespaceObject.speak, 500);
const [destinationRootClientId, onInsertBlocks] = use_insertion_point({
const [patterns,, onClickPattern] = use_patterns_state(onInsertBlocks, destinationRootClientId, selectedCategory);
const registeredPatternCategories = (0,external_wp_element_namespaceObject.useMemo)(() => patternCategories.map(patternCategory => patternCategory.name), [patternCategories]);
const filteredBlockPatterns = (0,external_wp_element_namespaceObject.useMemo)(() => {
const filteredPatterns = patterns.filter(pattern => {
if (selectedCategory === allPatternsCategory.name) {
if (selectedCategory === myPatternsCategory.name && pattern.type === INSERTER_PATTERN_TYPES.user) {
if (selectedCategory === 'uncategorized') {
const hasKnownCategory = pattern.categories.some(category => registeredPatternCategories.includes(category));
return !pattern.categories?.length || !hasKnownCategory;
return pattern.categories?.includes(selectedCategory);
return searchItems(filteredPatterns, searchValue);
}, [searchValue, patterns, selectedCategory, registeredPatternCategories]);
// Announce search results on change.
(0,external_wp_element_namespaceObject.useEffect)(() => {
const count = filteredBlockPatterns.length;
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.', count), count);
debouncedSpeak(resultsFoundMessage);
}, [searchValue, debouncedSpeak, filteredBlockPatterns.length]);
const pagingProps = usePatternsPaging(filteredBlockPatterns, selectedCategory, container);
// Reset page when search value changes.
const [previousSearchValue, setPreviousSearchValue] = (0,external_wp_element_namespaceObject.useState)(searchValue);
if (searchValue !== previousSearchValue) {
setPreviousSearchValue(searchValue);
pagingProps.changePage(1);
const hasItems = !!filteredBlockPatterns?.length;
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", {
className: "block-editor-block-patterns-explorer__list",
children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PatternsListHeader, {
filterValue: searchValue,
filteredBlockPatternsLength: filteredBlockPatterns.length
}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(inserter_listbox, {
children: hasItems && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, {
children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(block_patterns_list, {
shownPatterns: pagingProps.categoryPatternsAsyncList,
blockPatterns: pagingProps.categoryPatterns,
onClickPattern: onClickPattern,
}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(Pagination, {
/* harmony default export */ const pattern_list = (PatternList);
;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/block-patterns-tab/use-pattern-categories.js
function hasRegisteredCategory(pattern, allCategories) {
if (!pattern.categories || !pattern.categories.length) {
return pattern.categories.some(cat => allCategories.some(category => category.name === cat));
function usePatternCategories(rootClientId, sourceFilter = 'all') {
const [patterns, allCategories] = use_patterns_state(undefined, rootClientId);
const filteredPatterns = (0,external_wp_element_namespaceObject.useMemo)(() => sourceFilter === 'all' ? patterns : patterns.filter(pattern => !isPatternFiltered(pattern, sourceFilter)), [sourceFilter, patterns]);
// Remove any empty categories.
const populatedCategories = (0,external_wp_element_namespaceObject.useMemo)(() => {
const categories = allCategories.filter(category => filteredPatterns.some(pattern => pattern.categories?.includes(category.name))).sort((a, b) => a.label.localeCompare(b.label));
if (filteredPatterns.some(pattern => !hasRegisteredCategory(pattern, allCategories)) && !categories.find(category => category.name === 'uncategorized')) {
label: (0,external_wp_i18n_namespaceObject._x)('Uncategorized')
if (filteredPatterns.some(pattern => pattern.type === INSERTER_PATTERN_TYPES.user)) {
categories.unshift(myPatternsCategory);
if (filteredPatterns.length > 0) {
name: allPatternsCategory.name,
label: allPatternsCategory.label
(0,external_wp_a11y_namespaceObject.speak)((0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %d: number of categories . */
(0,external_wp_i18n_namespaceObject._n)('%d category button displayed.', '%d category buttons displayed.', categories.length), categories.length));
}, [allCategories, filteredPatterns]);
return populatedCategories;
;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/block-patterns-explorer/index.js
function PatternsExplorer({
const [searchValue, setSearchValue] = (0,external_wp_element_namespaceObject.useState)('');
const [selectedCategory, setSelectedCategory] = (0,external_wp_element_namespaceObject.useState)(initialCategory?.name);
const patternCategories = usePatternCategories(rootClientId);
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", {
className: "block-editor-block-patterns-explorer",
children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(pattern_explorer_sidebar, {
selectedCategory: selectedCategory,
patternCategories: patternCategories,
onClickCategory: setSelectedCategory,
searchValue: searchValue,
setSearchValue: setSearchValue
}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(pattern_list, {
searchValue: searchValue,
selectedCategory: selectedCategory,
patternCategories: patternCategories,
rootClientId: rootClientId
function PatternsExplorerModal({
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Modal, {
title: (0,external_wp_i18n_namespaceObject.__)('Patterns'),
onRequestClose: onModalClose,
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PatternsExplorer, {
/* harmony default export */ const block_patterns_explorer = (PatternsExplorerModal);
;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/mobile-tab-navigation.js
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalVStack, {
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalView, {
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalSpacer, {
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, {
children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalNavigatorBackButton, {
// TODO: This style override is also used in ToolsPanelHeader.
// It should be supported out-of-the-box by Button.
icon: (0,external_wp_i18n_namespaceObject.isRTL)() ? chevron_right : chevron_left,
label: (0,external_wp_i18n_namespaceObject.__)('Back')
}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalSpacer, {
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalHeading, {
function MobileTabNavigation({
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalNavigatorProvider, {
className: "block-editor-inserter__mobile-tab-navigation",
children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalNavigatorScreen, {
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalItemGroup, {
children: categories.map(category => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalNavigatorButton, {
path: `/category/${category.name}`,
as: external_wp_components_namespaceObject.__experimentalItem,
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, {
children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.FlexBlock, {
}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(build_module_icon, {
icon: (0,external_wp_i18n_namespaceObject.isRTL)() ? chevron_left : chevron_right
}), categories.map(category => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalNavigatorScreen, {
path: `/category/${category.name}`,
children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ScreenHeader, {
title: (0,external_wp_i18n_namespaceObject.__)('Back')
;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/block-patterns-tab/patterns-filter.js
const getShouldDisableSyncFilter = sourceFilter => sourceFilter !== 'all';
const getShouldDisableNonUserSources = category => {
return category.name === myPatternsCategory.name;
function PatternsFilter({
// If the category is `myPatterns` then we need to set the source filter to `user`, but
// we do this by deriving from props rather than calling setPatternSourceFilter otherwise
// the user may be confused when switching to another category if the haven't explicity set
// this filter themselves.
const currentPatternSourceFilter = category.name === myPatternsCategory.name ? INSERTER_PATTERN_TYPES.user : patternSourceFilter;
// We need to disable the sync filter option if the source filter is not 'all' or 'user'
// otherwise applying them will just result in no patterns being shown.
const shouldDisableSyncFilter = getShouldDisableSyncFilter(currentPatternSourceFilter);
// We also need to disable the directory and theme source filter options if the category
// is `myPatterns` otherwise applying them will also just result in no patterns being shown.
const shouldDisableNonUserSources = getShouldDisableNonUserSources(category);
const patternSyncMenuOptions = (0,external_wp_element_namespaceObject.useMemo)(() => [{
label: (0,external_wp_i18n_namespaceObject._x)('All', 'patterns')
value: INSERTER_SYNC_TYPES.full,
label: (0,external_wp_i18n_namespaceObject._x)('Synced', 'patterns'),
disabled: shouldDisableSyncFilter
value: INSERTER_SYNC_TYPES.unsynced,
label: (0,external_wp_i18n_namespaceObject._x)('Not synced', 'patterns'),
disabled: shouldDisableSyncFilter
}], [shouldDisableSyncFilter]);
const patternSourceMenuOptions = (0,external_wp_element_namespaceObject.useMemo)(() => [{
label: (0,external_wp_i18n_namespaceObject._x)('All', 'patterns'),
disabled: shouldDisableNonUserSources
value: INSERTER_PATTERN_TYPES.directory,
label: (0,external_wp_i18n_namespaceObject.__)('Pattern Directory'),
disabled: shouldDisableNonUserSources
value: INSERTER_PATTERN_TYPES.theme,
label: (0,external_wp_i18n_namespaceObject.__)('Theme & Plugins'),
disabled: shouldDisableNonUserSources
value: INSERTER_PATTERN_TYPES.user,
label: (0,external_wp_i18n_namespaceObject.__)('User')
}], [shouldDisableNonUserSources]);
function handleSetSourceFilterChange(newSourceFilter) {
setPatternSourceFilter(newSourceFilter);
if (getShouldDisableSyncFilter(newSourceFilter)) {
setPatternSyncFilter('all');
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_ReactJSXRuntime_namespaceObject.Fragment, {
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.DropdownMenu, {
label: (0,external_wp_i18n_namespaceObject.__)('Filter patterns'),
icon: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(build_module_icon, {
icon: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.SVG, {
xmlns: "http://www.w3.org/2000/svg",
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Path, {
d: "M10 17.5H14V16H10V17.5ZM6 6V7.5H18V6H6ZM8 12.5H16V11H8V12.5Z",
children: () => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, {
children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuGroup, {
label: (0,external_wp_i18n_namespaceObject.__)('Source'),
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItemsChoice, {
choices: patternSourceMenuOptions,
handleSetSourceFilterChange(value);
scrollContainerRef.current?.scrollTo(0, 0);
value: currentPatternSourceFilter
}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuGroup, {
label: (0,external_wp_i18n_namespaceObject.__)('Type'),
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItemsChoice, {
choices: patternSyncMenuOptions,
setPatternSyncFilter(value);
scrollContainerRef.current?.scrollTo(0, 0);
}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", {
className: "block-editor-tool-selector__help",
children: (0,external_wp_element_namespaceObject.createInterpolateElement)((0,external_wp_i18n_namespaceObject.__)('Patterns are available from the <Link>WordPress.org Pattern Directory</Link>, bundled in the active theme, or created by users on this site. Only patterns created on this site can be synced.'), {
Link: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ExternalLink, {
href: (0,external_wp_i18n_namespaceObject.__)('https://wordpress.org/patterns/')
;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/block-patterns-tab/pattern-category-previews.js
const pattern_category_previews_noop = () => {};
function PatternCategoryPreviews({
onHover = pattern_category_previews_noop,
const [allPatterns,, onClickPattern] = use_patterns_state(onInsert, rootClientId, category?.name);
const [patternSyncFilter, setPatternSyncFilter] = (0,external_wp_element_namespaceObject.useState)('all');
const [patternSourceFilter, setPatternSourceFilter] = (0,external_wp_element_namespaceObject.useState)('all');
const availableCategories = usePatternCategories(rootClientId, patternSourceFilter);
const scrollContainerRef = (0,external_wp_element_namespaceObject.useRef)();
const currentCategoryPatterns = (0,external_wp_element_namespaceObject.useMemo)(() => allPatterns.filter(pattern => {
if (isPatternFiltered(pattern, patternSourceFilter, patternSyncFilter)) {
if (category.name === allPatternsCategory.name) {
if (category.name === myPatternsCategory.name && pattern.type === INSERTER_PATTERN_TYPES.user) {
if (category.name === 'uncategorized') {
// The uncategorized category should show all the patterns without any category...
if (!pattern.categories) {
// ...or with no available category.
return !pattern.categories.some(catName => availableCategories.some(c => c.name === catName));
return pattern.categories?.includes(category.name);
}), [allPatterns, availableCategories, category.name, patternSourceFilter, patternSyncFilter]);
const pagingProps = usePatternsPaging(currentCategoryPatterns, category, scrollContainerRef);
// Hide block pattern preview on unmount.
// eslint-disable-next-line react-hooks/exhaustive-deps
(0,external_wp_element_namespaceObject.useEffect)(() => () => onHover(null), []);
const onSetPatternSyncFilter = (0,external_wp_element_namespaceObject.useCallback)(value => {
setPatternSyncFilter(value);
}, [setPatternSyncFilter, changePage]);
const onSetPatternSourceFilter = (0,external_wp_element_namespaceObject.useCallback)(value => {
setPatternSourceFilter(value);
}, [setPatternSourceFilter, changePage]);
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, {
children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, {
className: "block-editor-inserter__patterns-category-panel-header",
children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, {
children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.FlexBlock, {
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalHeading, {
className: "block-editor-inserter__patterns-category-panel-title",
}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PatternsFilter, {
patternSyncFilter: patternSyncFilter,