[ Index ]

PHP Cross Reference of WordPress Trunk (Updated Daily)

Search

title

Body

[close]

/wp-includes/js/dist/ -> patterns.js (source)

   1  /******/ (() => { // webpackBootstrap
   2  /******/     "use strict";
   3  /******/     // The require scope
   4  /******/     var __webpack_require__ = {};
   5  /******/     
   6  /************************************************************************/
   7  /******/     /* webpack/runtime/define property getters */
   8  /******/     (() => {
   9  /******/         // define getter functions for harmony exports
  10  /******/         __webpack_require__.d = (exports, definition) => {
  11  /******/             for(var key in definition) {
  12  /******/                 if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
  13  /******/                     Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
  14  /******/                 }
  15  /******/             }
  16  /******/         };
  17  /******/     })();
  18  /******/     
  19  /******/     /* webpack/runtime/hasOwnProperty shorthand */
  20  /******/     (() => {
  21  /******/         __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
  22  /******/     })();
  23  /******/     
  24  /******/     /* webpack/runtime/make namespace object */
  25  /******/     (() => {
  26  /******/         // define __esModule on exports
  27  /******/         __webpack_require__.r = (exports) => {
  28  /******/             if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
  29  /******/                 Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
  30  /******/             }
  31  /******/             Object.defineProperty(exports, '__esModule', { value: true });
  32  /******/         };
  33  /******/     })();
  34  /******/     
  35  /************************************************************************/
  36  var __webpack_exports__ = {};
  37  // ESM COMPAT FLAG
  38  __webpack_require__.r(__webpack_exports__);
  39  
  40  // EXPORTS
  41  __webpack_require__.d(__webpack_exports__, {
  42    privateApis: () => (/* reexport */ privateApis),
  43    store: () => (/* reexport */ store)
  44  });
  45  
  46  // NAMESPACE OBJECT: ./node_modules/@wordpress/patterns/build-module/store/actions.js
  47  var actions_namespaceObject = {};
  48  __webpack_require__.r(actions_namespaceObject);
  49  __webpack_require__.d(actions_namespaceObject, {
  50    convertSyncedPatternToStatic: () => (convertSyncedPatternToStatic),
  51    createPattern: () => (createPattern),
  52    createPatternFromFile: () => (createPatternFromFile),
  53    setEditingPattern: () => (setEditingPattern)
  54  });
  55  
  56  // NAMESPACE OBJECT: ./node_modules/@wordpress/patterns/build-module/store/selectors.js
  57  var selectors_namespaceObject = {};
  58  __webpack_require__.r(selectors_namespaceObject);
  59  __webpack_require__.d(selectors_namespaceObject, {
  60    isEditingPattern: () => (selectors_isEditingPattern)
  61  });
  62  
  63  ;// external ["wp","data"]
  64  const external_wp_data_namespaceObject = window["wp"]["data"];
  65  ;// ./node_modules/@wordpress/patterns/build-module/store/reducer.js
  66  
  67  function isEditingPattern(state = {}, action) {
  68    if (action?.type === "SET_EDITING_PATTERN") {
  69      return {
  70        ...state,
  71        [action.clientId]: action.isEditing
  72      };
  73    }
  74    return state;
  75  }
  76  var reducer_default = (0,external_wp_data_namespaceObject.combineReducers)({
  77    isEditingPattern
  78  });
  79  
  80  
  81  ;// external ["wp","blocks"]
  82  const external_wp_blocks_namespaceObject = window["wp"]["blocks"];
  83  ;// external ["wp","coreData"]
  84  const external_wp_coreData_namespaceObject = window["wp"]["coreData"];
  85  ;// external ["wp","blockEditor"]
  86  const external_wp_blockEditor_namespaceObject = window["wp"]["blockEditor"];
  87  ;// ./node_modules/@wordpress/patterns/build-module/constants.js
  88  const PATTERN_TYPES = {
  89    theme: "pattern",
  90    user: "wp_block"
  91  };
  92  const PATTERN_DEFAULT_CATEGORY = "all-patterns";
  93  const PATTERN_USER_CATEGORY = "my-patterns";
  94  const EXCLUDED_PATTERN_SOURCES = [
  95    "core",
  96    "pattern-directory/core",
  97    "pattern-directory/featured"
  98  ];
  99  const PATTERN_SYNC_TYPES = {
 100    full: "fully",
 101    unsynced: "unsynced"
 102  };
 103  const PARTIAL_SYNCING_SUPPORTED_BLOCKS = {
 104    "core/paragraph": ["content"],
 105    "core/heading": ["content"],
 106    "core/button": ["text", "url", "linkTarget", "rel"],
 107    "core/image": ["id", "url", "title", "alt", "caption"]
 108  };
 109  const PATTERN_OVERRIDES_BINDING_SOURCE = "core/pattern-overrides";
 110  
 111  
 112  ;// ./node_modules/@wordpress/patterns/build-module/store/actions.js
 113  
 114  
 115  
 116  
 117  const createPattern = (title, syncType, content, categories) => async ({ registry }) => {
 118    const meta = syncType === PATTERN_SYNC_TYPES.unsynced ? {
 119      wp_pattern_sync_status: syncType
 120    } : void 0;
 121    const reusableBlock = {
 122      title,
 123      content,
 124      status: "publish",
 125      meta,
 126      wp_pattern_category: categories
 127    };
 128    const updatedRecord = await registry.dispatch(external_wp_coreData_namespaceObject.store).saveEntityRecord("postType", "wp_block", reusableBlock);
 129    return updatedRecord;
 130  };
 131  const createPatternFromFile = (file, categories) => async ({ dispatch }) => {
 132    const fileContent = await file.text();
 133    let parsedContent;
 134    try {
 135      parsedContent = JSON.parse(fileContent);
 136    } catch (e) {
 137      throw new Error("Invalid JSON file");
 138    }
 139    if (parsedContent.__file !== "wp_block" || !parsedContent.title || !parsedContent.content || typeof parsedContent.title !== "string" || typeof parsedContent.content !== "string" || parsedContent.syncStatus && typeof parsedContent.syncStatus !== "string") {
 140      throw new Error("Invalid pattern JSON file");
 141    }
 142    const pattern = await dispatch.createPattern(
 143      parsedContent.title,
 144      parsedContent.syncStatus,
 145      parsedContent.content,
 146      categories
 147    );
 148    return pattern;
 149  };
 150  const convertSyncedPatternToStatic = (clientId) => ({ registry }) => {
 151    const patternBlock = registry.select(external_wp_blockEditor_namespaceObject.store).getBlock(clientId);
 152    const existingOverrides = patternBlock.attributes?.content;
 153    function cloneBlocksAndRemoveBindings(blocks) {
 154      return blocks.map((block) => {
 155        let metadata = block.attributes.metadata;
 156        if (metadata) {
 157          metadata = { ...metadata };
 158          delete metadata.id;
 159          delete metadata.bindings;
 160          if (existingOverrides?.[metadata.name]) {
 161            for (const [attributeName, value] of Object.entries(
 162              existingOverrides[metadata.name]
 163            )) {
 164              if (!(0,external_wp_blocks_namespaceObject.getBlockType)(block.name)?.attributes[attributeName]) {
 165                continue;
 166              }
 167              block.attributes[attributeName] = value;
 168            }
 169          }
 170        }
 171        return (0,external_wp_blocks_namespaceObject.cloneBlock)(
 172          block,
 173          {
 174            metadata: metadata && Object.keys(metadata).length > 0 ? metadata : void 0
 175          },
 176          cloneBlocksAndRemoveBindings(block.innerBlocks)
 177        );
 178      });
 179    }
 180    const patternInnerBlocks = registry.select(external_wp_blockEditor_namespaceObject.store).getBlocks(patternBlock.clientId);
 181    registry.dispatch(external_wp_blockEditor_namespaceObject.store).replaceBlocks(
 182      patternBlock.clientId,
 183      cloneBlocksAndRemoveBindings(patternInnerBlocks)
 184    );
 185  };
 186  function setEditingPattern(clientId, isEditing) {
 187    return {
 188      type: "SET_EDITING_PATTERN",
 189      clientId,
 190      isEditing
 191    };
 192  }
 193  
 194  
 195  ;// ./node_modules/@wordpress/patterns/build-module/store/constants.js
 196  const STORE_NAME = "core/patterns";
 197  
 198  
 199  ;// ./node_modules/@wordpress/patterns/build-module/store/selectors.js
 200  function selectors_isEditingPattern(state, clientId) {
 201    return state.isEditingPattern[clientId];
 202  }
 203  
 204  
 205  ;// external ["wp","privateApis"]
 206  const external_wp_privateApis_namespaceObject = window["wp"]["privateApis"];
 207  ;// ./node_modules/@wordpress/patterns/build-module/lock-unlock.js
 208  
 209  const { lock, unlock } = (0,external_wp_privateApis_namespaceObject.__dangerousOptInToUnstableAPIsOnlyForCoreModules)(
 210    "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.",
 211    "@wordpress/patterns"
 212  );
 213  
 214  
 215  ;// ./node_modules/@wordpress/patterns/build-module/store/index.js
 216  
 217  
 218  
 219  
 220  
 221  
 222  const storeConfig = {
 223    reducer: reducer_default
 224  };
 225  const store = (0,external_wp_data_namespaceObject.createReduxStore)(STORE_NAME, {
 226    ...storeConfig
 227  });
 228  (0,external_wp_data_namespaceObject.register)(store);
 229  unlock(store).registerPrivateActions(actions_namespaceObject);
 230  unlock(store).registerPrivateSelectors(selectors_namespaceObject);
 231  
 232  
 233  ;// external "ReactJSXRuntime"
 234  const external_ReactJSXRuntime_namespaceObject = window["ReactJSXRuntime"];
 235  ;// external ["wp","components"]
 236  const external_wp_components_namespaceObject = window["wp"]["components"];
 237  ;// external ["wp","element"]
 238  const external_wp_element_namespaceObject = window["wp"]["element"];
 239  ;// external ["wp","i18n"]
 240  const external_wp_i18n_namespaceObject = window["wp"]["i18n"];
 241  ;// ./node_modules/@wordpress/patterns/build-module/api/index.js
 242  
 243  function isOverridableBlock(block) {
 244    return Object.keys(PARTIAL_SYNCING_SUPPORTED_BLOCKS).includes(
 245      block.name
 246    ) && !!block.attributes.metadata?.name && !!block.attributes.metadata?.bindings && Object.values(block.attributes.metadata.bindings).some(
 247      (binding) => binding.source === "core/pattern-overrides"
 248    );
 249  }
 250  function hasOverridableBlocks(blocks) {
 251    return blocks.some((block) => {
 252      if (isOverridableBlock(block)) {
 253        return true;
 254      }
 255      return hasOverridableBlocks(block.innerBlocks);
 256    });
 257  }
 258  
 259  
 260  ;// ./node_modules/@wordpress/patterns/build-module/components/overrides-panel.js
 261  
 262  
 263  
 264  
 265  
 266  
 267  
 268  
 269  const { BlockQuickNavigation } = unlock(external_wp_blockEditor_namespaceObject.privateApis);
 270  function OverridesPanel() {
 271    const allClientIds = (0,external_wp_data_namespaceObject.useSelect)(
 272      (select) => select(external_wp_blockEditor_namespaceObject.store).getClientIdsWithDescendants(),
 273      []
 274    );
 275    const { getBlock } = (0,external_wp_data_namespaceObject.useSelect)(external_wp_blockEditor_namespaceObject.store);
 276    const clientIdsWithOverrides = (0,external_wp_element_namespaceObject.useMemo)(
 277      () => allClientIds.filter((clientId) => {
 278        const block = getBlock(clientId);
 279        return isOverridableBlock(block);
 280      }),
 281      [allClientIds, getBlock]
 282    );
 283    if (!clientIdsWithOverrides?.length) {
 284      return null;
 285    }
 286    return /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelBody, { title: (0,external_wp_i18n_namespaceObject.__)("Overrides"), children: /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(BlockQuickNavigation, { clientIds: clientIdsWithOverrides }) });
 287  }
 288  
 289  
 290  ;// external ["wp","notices"]
 291  const external_wp_notices_namespaceObject = window["wp"]["notices"];
 292  ;// external ["wp","compose"]
 293  const external_wp_compose_namespaceObject = window["wp"]["compose"];
 294  ;// external ["wp","htmlEntities"]
 295  const external_wp_htmlEntities_namespaceObject = window["wp"]["htmlEntities"];
 296  ;// ./node_modules/@wordpress/patterns/build-module/components/category-selector.js
 297  
 298  
 299  
 300  
 301  
 302  
 303  const unescapeString = (arg) => {
 304    return (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(arg);
 305  };
 306  const CATEGORY_SLUG = "wp_pattern_category";
 307  function CategorySelector({
 308    categoryTerms,
 309    onChange,
 310    categoryMap
 311  }) {
 312    const [search, setSearch] = (0,external_wp_element_namespaceObject.useState)("");
 313    const debouncedSearch = (0,external_wp_compose_namespaceObject.useDebounce)(setSearch, 500);
 314    const suggestions = (0,external_wp_element_namespaceObject.useMemo)(() => {
 315      return Array.from(categoryMap.values()).map((category) => unescapeString(category.label)).filter((category) => {
 316        if (search !== "") {
 317          return category.toLowerCase().includes(search.toLowerCase());
 318        }
 319        return true;
 320      }).sort((a, b) => a.localeCompare(b));
 321    }, [search, categoryMap]);
 322    function handleChange(termNames) {
 323      const uniqueTerms = termNames.reduce((terms, newTerm) => {
 324        if (!terms.some(
 325          (term) => term.toLowerCase() === newTerm.toLowerCase()
 326        )) {
 327          terms.push(newTerm);
 328        }
 329        return terms;
 330      }, []);
 331      onChange(uniqueTerms);
 332    }
 333    return /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
 334      external_wp_components_namespaceObject.FormTokenField,
 335      {
 336        className: "patterns-menu-items__convert-modal-categories",
 337        value: categoryTerms,
 338        suggestions,
 339        onChange: handleChange,
 340        onInputChange: debouncedSearch,
 341        label: (0,external_wp_i18n_namespaceObject.__)("Categories"),
 342        tokenizeOnBlur: true,
 343        __experimentalExpandOnFocus: true,
 344        __next40pxDefaultSize: true,
 345        __nextHasNoMarginBottom: true
 346      }
 347    );
 348  }
 349  
 350  
 351  ;// ./node_modules/@wordpress/patterns/build-module/private-hooks.js
 352  
 353  
 354  
 355  
 356  function useAddPatternCategory() {
 357    const { saveEntityRecord, invalidateResolution } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store);
 358    const { corePatternCategories, userPatternCategories } = (0,external_wp_data_namespaceObject.useSelect)(
 359      (select) => {
 360        const { getUserPatternCategories, getBlockPatternCategories } = select(external_wp_coreData_namespaceObject.store);
 361        return {
 362          corePatternCategories: getBlockPatternCategories(),
 363          userPatternCategories: getUserPatternCategories()
 364        };
 365      },
 366      []
 367    );
 368    const categoryMap = (0,external_wp_element_namespaceObject.useMemo)(() => {
 369      const uniqueCategories = /* @__PURE__ */ new Map();
 370      userPatternCategories.forEach((category) => {
 371        uniqueCategories.set(category.label.toLowerCase(), {
 372          label: category.label,
 373          name: category.name,
 374          id: category.id
 375        });
 376      });
 377      corePatternCategories.forEach((category) => {
 378        if (!uniqueCategories.has(category.label.toLowerCase()) && // There are two core categories with `Post` label so explicitly remove the one with
 379        // the `query` slug to avoid any confusion.
 380        category.name !== "query") {
 381          uniqueCategories.set(category.label.toLowerCase(), {
 382            label: category.label,
 383            name: category.name
 384          });
 385        }
 386      });
 387      return uniqueCategories;
 388    }, [userPatternCategories, corePatternCategories]);
 389    async function findOrCreateTerm(term) {
 390      try {
 391        const existingTerm = categoryMap.get(term.toLowerCase());
 392        if (existingTerm?.id) {
 393          return existingTerm.id;
 394        }
 395        const termData = existingTerm ? { name: existingTerm.label, slug: existingTerm.name } : { name: term };
 396        const newTerm = await saveEntityRecord(
 397          "taxonomy",
 398          CATEGORY_SLUG,
 399          termData,
 400          { throwOnError: true }
 401        );
 402        invalidateResolution("getUserPatternCategories");
 403        return newTerm.id;
 404      } catch (error) {
 405        if (error.code !== "term_exists") {
 406          throw error;
 407        }
 408        return error.data.term_id;
 409      }
 410    }
 411    return { categoryMap, findOrCreateTerm };
 412  }
 413  
 414  
 415  ;// ./node_modules/@wordpress/patterns/build-module/components/create-pattern-modal.js
 416  
 417  
 418  
 419  
 420  
 421  
 422  
 423  
 424  
 425  
 426  
 427  
 428  function CreatePatternModal({
 429    className = "patterns-menu-items__convert-modal",
 430    modalTitle,
 431    ...restProps
 432  }) {
 433    const defaultModalTitle = (0,external_wp_data_namespaceObject.useSelect)(
 434      (select) => select(external_wp_coreData_namespaceObject.store).getPostType(PATTERN_TYPES.user)?.labels?.add_new_item,
 435      []
 436    );
 437    return /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
 438      external_wp_components_namespaceObject.Modal,
 439      {
 440        title: modalTitle || defaultModalTitle,
 441        onRequestClose: restProps.onClose,
 442        overlayClassName: className,
 443        focusOnMount: "firstContentElement",
 444        size: "small",
 445        children: /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(CreatePatternModalContents, { ...restProps })
 446      }
 447    );
 448  }
 449  function CreatePatternModalContents({
 450    confirmLabel = (0,external_wp_i18n_namespaceObject.__)("Add"),
 451    defaultCategories = [],
 452    content,
 453    onClose,
 454    onError,
 455    onSuccess,
 456    defaultSyncType = PATTERN_SYNC_TYPES.full,
 457    defaultTitle = ""
 458  }) {
 459    const [syncType, setSyncType] = (0,external_wp_element_namespaceObject.useState)(defaultSyncType);
 460    const [categoryTerms, setCategoryTerms] = (0,external_wp_element_namespaceObject.useState)(defaultCategories);
 461    const [title, setTitle] = (0,external_wp_element_namespaceObject.useState)(defaultTitle);
 462    const [isSaving, setIsSaving] = (0,external_wp_element_namespaceObject.useState)(false);
 463    const { createPattern } = unlock((0,external_wp_data_namespaceObject.useDispatch)(store));
 464    const { createErrorNotice } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store);
 465    const { categoryMap, findOrCreateTerm } = useAddPatternCategory();
 466    async function onCreate(patternTitle, sync) {
 467      if (!title || isSaving) {
 468        return;
 469      }
 470      try {
 471        setIsSaving(true);
 472        const categories = await Promise.all(
 473          categoryTerms.map(
 474            (termName) => findOrCreateTerm(termName)
 475          )
 476        );
 477        const newPattern = await createPattern(
 478          patternTitle,
 479          sync,
 480          typeof content === "function" ? content() : content,
 481          categories
 482        );
 483        onSuccess({
 484          pattern: newPattern,
 485          categoryId: PATTERN_DEFAULT_CATEGORY
 486        });
 487      } catch (error) {
 488        createErrorNotice(error.message, {
 489          type: "snackbar",
 490          id: "pattern-create"
 491        });
 492        onError?.();
 493      } finally {
 494        setIsSaving(false);
 495        setCategoryTerms([]);
 496        setTitle("");
 497      }
 498    }
 499    return /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
 500      "form",
 501      {
 502        onSubmit: (event) => {
 503          event.preventDefault();
 504          onCreate(title, syncType);
 505        },
 506        children: /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { spacing: "5", children: [
 507          /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
 508            external_wp_components_namespaceObject.TextControl,
 509            {
 510              label: (0,external_wp_i18n_namespaceObject.__)("Name"),
 511              value: title,
 512              onChange: setTitle,
 513              placeholder: (0,external_wp_i18n_namespaceObject.__)("My pattern"),
 514              className: "patterns-create-modal__name-input",
 515              __nextHasNoMarginBottom: true,
 516              __next40pxDefaultSize: true
 517            }
 518          ),
 519          /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
 520            CategorySelector,
 521            {
 522              categoryTerms,
 523              onChange: setCategoryTerms,
 524              categoryMap
 525            }
 526          ),
 527          /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
 528            external_wp_components_namespaceObject.ToggleControl,
 529            {
 530              __nextHasNoMarginBottom: true,
 531              label: (0,external_wp_i18n_namespaceObject._x)("Synced", "pattern (singular)"),
 532              help: (0,external_wp_i18n_namespaceObject.__)(
 533                "Sync this pattern across multiple locations."
 534              ),
 535              checked: syncType === PATTERN_SYNC_TYPES.full,
 536              onChange: () => {
 537                setSyncType(
 538                  syncType === PATTERN_SYNC_TYPES.full ? PATTERN_SYNC_TYPES.unsynced : PATTERN_SYNC_TYPES.full
 539                );
 540              }
 541            }
 542          ),
 543          /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, { justify: "right", children: [
 544            /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
 545              external_wp_components_namespaceObject.Button,
 546              {
 547                __next40pxDefaultSize: true,
 548                variant: "tertiary",
 549                onClick: () => {
 550                  onClose();
 551                  setTitle("");
 552                },
 553                children: (0,external_wp_i18n_namespaceObject.__)("Cancel")
 554              }
 555            ),
 556            /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
 557              external_wp_components_namespaceObject.Button,
 558              {
 559                __next40pxDefaultSize: true,
 560                variant: "primary",
 561                type: "submit",
 562                "aria-disabled": !title || isSaving,
 563                isBusy: isSaving,
 564                children: confirmLabel
 565              }
 566            )
 567          ] })
 568        ] })
 569      }
 570    );
 571  }
 572  
 573  
 574  ;// ./node_modules/@wordpress/patterns/build-module/components/duplicate-pattern-modal.js
 575  
 576  
 577  
 578  
 579  
 580  
 581  
 582  function getTermLabels(pattern, categories) {
 583    if (pattern.type !== PATTERN_TYPES.user) {
 584      return categories.core?.filter(
 585        (category) => pattern.categories?.includes(category.name)
 586      ).map((category) => category.label);
 587    }
 588    return categories.user?.filter(
 589      (category) => pattern.wp_pattern_category?.includes(category.id)
 590    ).map((category) => category.label);
 591  }
 592  function useDuplicatePatternProps({ pattern, onSuccess }) {
 593    const { createSuccessNotice } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store);
 594    const categories = (0,external_wp_data_namespaceObject.useSelect)((select) => {
 595      const { getUserPatternCategories, getBlockPatternCategories } = select(external_wp_coreData_namespaceObject.store);
 596      return {
 597        core: getBlockPatternCategories(),
 598        user: getUserPatternCategories()
 599      };
 600    });
 601    if (!pattern) {
 602      return null;
 603    }
 604    return {
 605      content: pattern.content,
 606      defaultCategories: getTermLabels(pattern, categories),
 607      defaultSyncType: pattern.type !== PATTERN_TYPES.user ? PATTERN_SYNC_TYPES.unsynced : pattern.wp_pattern_sync_status || PATTERN_SYNC_TYPES.full,
 608      defaultTitle: (0,external_wp_i18n_namespaceObject.sprintf)(
 609        /* translators: %s: Existing pattern title */
 610        (0,external_wp_i18n_namespaceObject._x)("%s (Copy)", "pattern"),
 611        typeof pattern.title === "string" ? pattern.title : pattern.title.raw
 612      ),
 613      onSuccess: ({ pattern: newPattern }) => {
 614        createSuccessNotice(
 615          (0,external_wp_i18n_namespaceObject.sprintf)(
 616            // translators: %s: The new pattern's title e.g. 'Call to action (copy)'.
 617            (0,external_wp_i18n_namespaceObject._x)('"%s" duplicated.', "pattern"),
 618            newPattern.title.raw
 619          ),
 620          {
 621            type: "snackbar",
 622            id: "patterns-create"
 623          }
 624        );
 625        onSuccess?.({ pattern: newPattern });
 626      }
 627    };
 628  }
 629  function DuplicatePatternModal({
 630    pattern,
 631    onClose,
 632    onSuccess
 633  }) {
 634    const duplicatedProps = useDuplicatePatternProps({ pattern, onSuccess });
 635    if (!pattern) {
 636      return null;
 637    }
 638    return /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
 639      CreatePatternModal,
 640      {
 641        modalTitle: (0,external_wp_i18n_namespaceObject.__)("Duplicate pattern"),
 642        confirmLabel: (0,external_wp_i18n_namespaceObject.__)("Duplicate"),
 643        onClose,
 644        onError: onClose,
 645        ...duplicatedProps
 646      }
 647    );
 648  }
 649  
 650  
 651  ;// ./node_modules/@wordpress/patterns/build-module/components/rename-pattern-modal.js
 652  
 653  
 654  
 655  
 656  
 657  
 658  
 659  
 660  function RenamePatternModal({
 661    onClose,
 662    onError,
 663    onSuccess,
 664    pattern,
 665    ...props
 666  }) {
 667    const originalName = (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(pattern.title);
 668    const [name, setName] = (0,external_wp_element_namespaceObject.useState)(originalName);
 669    const [isSaving, setIsSaving] = (0,external_wp_element_namespaceObject.useState)(false);
 670    const {
 671      editEntityRecord,
 672      __experimentalSaveSpecifiedEntityEdits: saveSpecifiedEntityEdits
 673    } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store);
 674    const { createSuccessNotice, createErrorNotice } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store);
 675    const onRename = async (event) => {
 676      event.preventDefault();
 677      if (!name || name === pattern.title || isSaving) {
 678        return;
 679      }
 680      try {
 681        await editEntityRecord("postType", pattern.type, pattern.id, {
 682          title: name
 683        });
 684        setIsSaving(true);
 685        setName("");
 686        onClose?.();
 687        const savedRecord = await saveSpecifiedEntityEdits(
 688          "postType",
 689          pattern.type,
 690          pattern.id,
 691          ["title"],
 692          { throwOnError: true }
 693        );
 694        onSuccess?.(savedRecord);
 695        createSuccessNotice((0,external_wp_i18n_namespaceObject.__)("Pattern renamed"), {
 696          type: "snackbar",
 697          id: "pattern-update"
 698        });
 699      } catch (error) {
 700        onError?.();
 701        const errorMessage = error.message && error.code !== "unknown_error" ? error.message : (0,external_wp_i18n_namespaceObject.__)("An error occurred while renaming the pattern.");
 702        createErrorNotice(errorMessage, {
 703          type: "snackbar",
 704          id: "pattern-update"
 705        });
 706      } finally {
 707        setIsSaving(false);
 708        setName("");
 709      }
 710    };
 711    const onRequestClose = () => {
 712      onClose?.();
 713      setName("");
 714    };
 715    return /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
 716      external_wp_components_namespaceObject.Modal,
 717      {
 718        title: (0,external_wp_i18n_namespaceObject.__)("Rename"),
 719        ...props,
 720        onRequestClose: onClose,
 721        focusOnMount: "firstContentElement",
 722        size: "small",
 723        children: /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)("form", { onSubmit: onRename, children: /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { spacing: "5", children: [
 724          /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
 725            external_wp_components_namespaceObject.TextControl,
 726            {
 727              __nextHasNoMarginBottom: true,
 728              __next40pxDefaultSize: true,
 729              label: (0,external_wp_i18n_namespaceObject.__)("Name"),
 730              value: name,
 731              onChange: setName,
 732              required: true
 733            }
 734          ),
 735          /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, { justify: "right", children: [
 736            /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
 737              external_wp_components_namespaceObject.Button,
 738              {
 739                __next40pxDefaultSize: true,
 740                variant: "tertiary",
 741                onClick: onRequestClose,
 742                children: (0,external_wp_i18n_namespaceObject.__)("Cancel")
 743              }
 744            ),
 745            /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
 746              external_wp_components_namespaceObject.Button,
 747              {
 748                __next40pxDefaultSize: true,
 749                variant: "primary",
 750                type: "submit",
 751                children: (0,external_wp_i18n_namespaceObject.__)("Save")
 752              }
 753            )
 754          ] })
 755        ] }) })
 756      }
 757    );
 758  }
 759  
 760  
 761  ;// external ["wp","primitives"]
 762  const external_wp_primitives_namespaceObject = window["wp"]["primitives"];
 763  ;// ./node_modules/@wordpress/icons/build-module/library/symbol.js
 764  
 765  
 766  var symbol_default = /* @__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: "M21.3 10.8l-5.6-5.6c-.7-.7-1.8-.7-2.5 0l-5.6 5.6c-.7.7-.7 1.8 0 2.5l5.6 5.6c.3.3.8.5 1.2.5s.9-.2 1.2-.5l5.6-5.6c.8-.7.8-1.9.1-2.5zm-1 1.4l-5.6 5.6c-.1.1-.3.1-.4 0l-5.6-5.6c-.1-.1-.1-.3 0-.4l5.6-5.6s.1-.1.2-.1.1 0 .2.1l5.6 5.6c.1.1.1.3 0 .4zm-16.6-.4L10 5.5l-1-1-6.3 6.3c-.7.7-.7 1.8 0 2.5L9 19.5l1.1-1.1-6.3-6.3c-.2 0-.2-.2-.1-.3z" }) });
 767  
 768  
 769  ;// ./node_modules/@wordpress/patterns/build-module/components/pattern-convert-button.js
 770  
 771  
 772  
 773  
 774  
 775  
 776  
 777  
 778  
 779  
 780  
 781  
 782  
 783  
 784  function PatternConvertButton({
 785    clientIds,
 786    rootClientId,
 787    closeBlockSettingsMenu
 788  }) {
 789    const { createSuccessNotice } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store);
 790    const { replaceBlocks, updateBlockAttributes } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_blockEditor_namespaceObject.store);
 791    const { setEditingPattern } = unlock((0,external_wp_data_namespaceObject.useDispatch)(store));
 792    const [isModalOpen, setIsModalOpen] = (0,external_wp_element_namespaceObject.useState)(false);
 793    const { getBlockAttributes } = (0,external_wp_data_namespaceObject.useSelect)(external_wp_blockEditor_namespaceObject.store);
 794    const canConvert = (0,external_wp_data_namespaceObject.useSelect)(
 795      (select) => {
 796        const { canUser } = select(external_wp_coreData_namespaceObject.store);
 797        const {
 798          getBlocksByClientId: getBlocksByClientId2,
 799          canInsertBlockType,
 800          getBlockRootClientId
 801        } = select(external_wp_blockEditor_namespaceObject.store);
 802        const rootId = rootClientId || (clientIds.length > 0 ? getBlockRootClientId(clientIds[0]) : void 0);
 803        const blocks = getBlocksByClientId2(clientIds) ?? [];
 804        const hasReusableBlockSupport = (blockName) => {
 805          const blockType = (0,external_wp_blocks_namespaceObject.getBlockType)(blockName);
 806          const hasParent = blockType && "parent" in blockType;
 807          return (0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockName, "reusable", !hasParent);
 808        };
 809        const isSyncedPattern = blocks.length === 1 && blocks[0] && (0,external_wp_blocks_namespaceObject.isReusableBlock)(blocks[0]) && !!select(external_wp_coreData_namespaceObject.store).getEntityRecord(
 810          "postType",
 811          "wp_block",
 812          blocks[0].attributes.ref
 813        );
 814        const isUnsyncedPattern = window?.__experimentalContentOnlyPatternInsertion && blocks.length === 1 && blocks?.[0]?.attributes?.metadata?.patternName;
 815        const _canConvert = (
 816          // Hide when this is already a pattern.
 817          !isUnsyncedPattern && !isSyncedPattern && // Hide when patterns are disabled.
 818          canInsertBlockType("core/block", rootId) && blocks.every(
 819            (block) => (
 820              // Guard against the case where a regular block has *just* been converted.
 821              !!block && // Hide on invalid blocks.
 822              block.isValid && // Hide when block doesn't support being made into a pattern.
 823              hasReusableBlockSupport(block.name)
 824            )
 825          ) && // Hide when current doesn't have permission to do that.
 826          // Blocks refers to the wp_block post type, this checks the ability to create a post of that type.
 827          !!canUser("create", {
 828            kind: "postType",
 829            name: "wp_block"
 830          })
 831        );
 832        return _canConvert;
 833      },
 834      [clientIds, rootClientId]
 835    );
 836    const { getBlocksByClientId } = (0,external_wp_data_namespaceObject.useSelect)(external_wp_blockEditor_namespaceObject.store);
 837    const getContent = (0,external_wp_element_namespaceObject.useCallback)(
 838      () => (0,external_wp_blocks_namespaceObject.serialize)(getBlocksByClientId(clientIds)),
 839      [getBlocksByClientId, clientIds]
 840    );
 841    if (!canConvert) {
 842      return null;
 843    }
 844    const handleSuccess = ({ pattern }) => {
 845      if (pattern.wp_pattern_sync_status === PATTERN_SYNC_TYPES.unsynced) {
 846        if (clientIds?.length === 1) {
 847          const existingAttributes = getBlockAttributes(clientIds[0]);
 848          updateBlockAttributes(clientIds[0], {
 849            metadata: {
 850              ...existingAttributes?.metadata ? existingAttributes.metadata : {},
 851              patternName: `core/block/$pattern.id}`,
 852              name: pattern.title.raw
 853            }
 854          });
 855        }
 856      } else {
 857        const newBlock = (0,external_wp_blocks_namespaceObject.createBlock)("core/block", {
 858          ref: pattern.id
 859        });
 860        replaceBlocks(clientIds, newBlock);
 861        setEditingPattern(newBlock.clientId, true);
 862        closeBlockSettingsMenu();
 863      }
 864      createSuccessNotice(
 865        pattern.wp_pattern_sync_status === PATTERN_SYNC_TYPES.unsynced ? (0,external_wp_i18n_namespaceObject.sprintf)(
 866          // translators: %s: the name the user has given to the pattern.
 867          (0,external_wp_i18n_namespaceObject.__)("Unsynced pattern created: %s"),
 868          pattern.title.raw
 869        ) : (0,external_wp_i18n_namespaceObject.sprintf)(
 870          // translators: %s: the name the user has given to the pattern.
 871          (0,external_wp_i18n_namespaceObject.__)("Synced pattern created: %s"),
 872          pattern.title.raw
 873        ),
 874        {
 875          type: "snackbar",
 876          id: "convert-to-pattern-success"
 877        }
 878      );
 879      setIsModalOpen(false);
 880    };
 881    return /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [
 882      /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
 883        external_wp_components_namespaceObject.MenuItem,
 884        {
 885          icon: symbol_default,
 886          onClick: () => setIsModalOpen(true),
 887          "aria-expanded": isModalOpen,
 888          "aria-haspopup": "dialog",
 889          children: (0,external_wp_i18n_namespaceObject.__)("Create pattern")
 890        }
 891      ),
 892      isModalOpen && /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
 893        CreatePatternModal,
 894        {
 895          content: getContent,
 896          onSuccess: (pattern) => {
 897            handleSuccess(pattern);
 898          },
 899          onError: () => {
 900            setIsModalOpen(false);
 901          },
 902          onClose: () => {
 903            setIsModalOpen(false);
 904          }
 905        }
 906      )
 907    ] });
 908  }
 909  
 910  
 911  ;// external ["wp","url"]
 912  const external_wp_url_namespaceObject = window["wp"]["url"];
 913  ;// ./node_modules/@wordpress/patterns/build-module/components/patterns-manage-button.js
 914  
 915  
 916  
 917  
 918  
 919  
 920  
 921  
 922  
 923  
 924  function PatternsManageButton({ clientId }) {
 925    const {
 926      attributes,
 927      canDetach,
 928      isVisible,
 929      managePatternsUrl,
 930      isSyncedPattern,
 931      isUnsyncedPattern
 932    } = (0,external_wp_data_namespaceObject.useSelect)(
 933      (select) => {
 934        const { canRemoveBlock, getBlock } = select(external_wp_blockEditor_namespaceObject.store);
 935        const { canUser } = select(external_wp_coreData_namespaceObject.store);
 936        const block = getBlock(clientId);
 937        const _isUnsyncedPattern = window?.__experimentalContentOnlyPatternInsertion && !!block?.attributes?.metadata?.patternName;
 938        const _isSyncedPattern = !!block && (0,external_wp_blocks_namespaceObject.isReusableBlock)(block) && !!canUser("update", {
 939          kind: "postType",
 940          name: "wp_block",
 941          id: block.attributes.ref
 942        });
 943        return {
 944          attributes: block.attributes,
 945          // For unsynced patterns, detaching is simply removing the `patternName` attribute.
 946          // For synced patterns, the `core:block` block is replaced with its inner blocks,
 947          // so checking whether `canRemoveBlock` is possible is required.
 948          canDetach: _isUnsyncedPattern || _isSyncedPattern && canRemoveBlock(clientId),
 949          isUnsyncedPattern: _isUnsyncedPattern,
 950          isSyncedPattern: _isSyncedPattern,
 951          isVisible: _isUnsyncedPattern || _isSyncedPattern,
 952          // The site editor and templates both check whether the user
 953          // has edit_theme_options capabilities. We can leverage that here
 954          // and omit the manage patterns link if the user can't access it.
 955          managePatternsUrl: canUser("create", {
 956            kind: "postType",
 957            name: "wp_template"
 958          }) ? (0,external_wp_url_namespaceObject.addQueryArgs)("site-editor.php", {
 959            p: "/pattern"
 960          }) : (0,external_wp_url_namespaceObject.addQueryArgs)("edit.php", {
 961            post_type: "wp_block"
 962          })
 963        };
 964      },
 965      [clientId]
 966    );
 967    const { updateBlockAttributes } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_blockEditor_namespaceObject.store);
 968    const { convertSyncedPatternToStatic } = unlock(
 969      (0,external_wp_data_namespaceObject.useDispatch)(store)
 970    );
 971    if (!isVisible) {
 972      return null;
 973    }
 974    return /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [
 975      canDetach && /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
 976        external_wp_components_namespaceObject.MenuItem,
 977        {
 978          onClick: () => {
 979            if (isSyncedPattern) {
 980              convertSyncedPatternToStatic(clientId);
 981            }
 982            if (isUnsyncedPattern) {
 983              const {
 984                patternName,
 985                ...attributesWithoutPatternName
 986              } = attributes?.metadata ?? {};
 987              updateBlockAttributes(clientId, {
 988                metadata: attributesWithoutPatternName
 989              });
 990            }
 991          },
 992          children: (0,external_wp_i18n_namespaceObject.__)("Detach")
 993        }
 994      ),
 995      /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItem, { href: managePatternsUrl, children: (0,external_wp_i18n_namespaceObject.__)("Manage patterns") })
 996    ] });
 997  }
 998  var patterns_manage_button_default = PatternsManageButton;
 999  
1000  
1001  ;// ./node_modules/@wordpress/patterns/build-module/components/index.js
1002  
1003  
1004  
1005  
1006  function PatternsMenuItems({ rootClientId }) {
1007    return /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.BlockSettingsMenuControls, { children: ({ selectedClientIds, onClose }) => /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [
1008      /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
1009        PatternConvertButton,
1010        {
1011          clientIds: selectedClientIds,
1012          rootClientId,
1013          closeBlockSettingsMenu: onClose
1014        }
1015      ),
1016      selectedClientIds.length === 1 && /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
1017        patterns_manage_button_default,
1018        {
1019          clientId: selectedClientIds[0]
1020        }
1021      )
1022    ] }) });
1023  }
1024  
1025  
1026  ;// external ["wp","a11y"]
1027  const external_wp_a11y_namespaceObject = window["wp"]["a11y"];
1028  ;// ./node_modules/@wordpress/patterns/build-module/components/rename-pattern-category-modal.js
1029  
1030  
1031  
1032  
1033  
1034  
1035  
1036  
1037  
1038  
1039  function RenamePatternCategoryModal({
1040    category,
1041    existingCategories,
1042    onClose,
1043    onError,
1044    onSuccess,
1045    ...props
1046  }) {
1047    const id = (0,external_wp_element_namespaceObject.useId)();
1048    const textControlRef = (0,external_wp_element_namespaceObject.useRef)();
1049    const [name, setName] = (0,external_wp_element_namespaceObject.useState)((0,external_wp_htmlEntities_namespaceObject.decodeEntities)(category.name));
1050    const [isSaving, setIsSaving] = (0,external_wp_element_namespaceObject.useState)(false);
1051    const [validationMessage, setValidationMessage] = (0,external_wp_element_namespaceObject.useState)(false);
1052    const validationMessageId = validationMessage ? `patterns-rename-pattern-category-modal__validation-message-$id}` : void 0;
1053    const { saveEntityRecord, invalidateResolution } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store);
1054    const { createErrorNotice, createSuccessNotice } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store);
1055    const onChange = (newName) => {
1056      if (validationMessage) {
1057        setValidationMessage(void 0);
1058      }
1059      setName(newName);
1060    };
1061    const onSave = async (event) => {
1062      event.preventDefault();
1063      if (isSaving) {
1064        return;
1065      }
1066      if (!name || name === category.name) {
1067        const message = (0,external_wp_i18n_namespaceObject.__)("Please enter a new name for this category.");
1068        (0,external_wp_a11y_namespaceObject.speak)(message, "assertive");
1069        setValidationMessage(message);
1070        textControlRef.current?.focus();
1071        return;
1072      }
1073      if (existingCategories.patternCategories.find((existingCategory) => {
1074        return existingCategory.id !== category.id && existingCategory.label.toLowerCase() === name.toLowerCase();
1075      })) {
1076        const message = (0,external_wp_i18n_namespaceObject.__)(
1077          "This category already exists. Please use a different name."
1078        );
1079        (0,external_wp_a11y_namespaceObject.speak)(message, "assertive");
1080        setValidationMessage(message);
1081        textControlRef.current?.focus();
1082        return;
1083      }
1084      try {
1085        setIsSaving(true);
1086        const savedRecord = await saveEntityRecord(
1087          "taxonomy",
1088          CATEGORY_SLUG,
1089          {
1090            id: category.id,
1091            slug: category.slug,
1092            name
1093          }
1094        );
1095        invalidateResolution("getUserPatternCategories");
1096        onSuccess?.(savedRecord);
1097        onClose();
1098        createSuccessNotice((0,external_wp_i18n_namespaceObject.__)("Pattern category renamed."), {
1099          type: "snackbar",
1100          id: "pattern-category-update"
1101        });
1102      } catch (error) {
1103        onError?.();
1104        createErrorNotice(error.message, {
1105          type: "snackbar",
1106          id: "pattern-category-update"
1107        });
1108      } finally {
1109        setIsSaving(false);
1110        setName("");
1111      }
1112    };
1113    const onRequestClose = () => {
1114      onClose();
1115      setName("");
1116    };
1117    return /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
1118      external_wp_components_namespaceObject.Modal,
1119      {
1120        title: (0,external_wp_i18n_namespaceObject.__)("Rename"),
1121        onRequestClose,
1122        ...props,
1123        children: /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)("form", { onSubmit: onSave, children: /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { spacing: "5", children: [
1124          /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { spacing: "2", children: [
1125            /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
1126              external_wp_components_namespaceObject.TextControl,
1127              {
1128                ref: textControlRef,
1129                __nextHasNoMarginBottom: true,
1130                __next40pxDefaultSize: true,
1131                label: (0,external_wp_i18n_namespaceObject.__)("Name"),
1132                value: name,
1133                onChange,
1134                "aria-describedby": validationMessageId,
1135                required: true
1136              }
1137            ),
1138            validationMessage && /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
1139              "span",
1140              {
1141                className: "patterns-rename-pattern-category-modal__validation-message",
1142                id: validationMessageId,
1143                children: validationMessage
1144              }
1145            )
1146          ] }),
1147          /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, { justify: "right", children: [
1148            /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
1149              external_wp_components_namespaceObject.Button,
1150              {
1151                __next40pxDefaultSize: true,
1152                variant: "tertiary",
1153                onClick: onRequestClose,
1154                children: (0,external_wp_i18n_namespaceObject.__)("Cancel")
1155              }
1156            ),
1157            /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
1158              external_wp_components_namespaceObject.Button,
1159              {
1160                __next40pxDefaultSize: true,
1161                variant: "primary",
1162                type: "submit",
1163                "aria-disabled": !name || name === category.name || isSaving,
1164                isBusy: isSaving,
1165                children: (0,external_wp_i18n_namespaceObject.__)("Save")
1166              }
1167            )
1168          ] })
1169        ] }) })
1170      }
1171    );
1172  }
1173  
1174  
1175  ;// ./node_modules/@wordpress/patterns/build-module/components/allow-overrides-modal.js
1176  
1177  
1178  
1179  
1180  
1181  function AllowOverridesModal({
1182    placeholder,
1183    initialName = "",
1184    onClose,
1185    onSave
1186  }) {
1187    const [editedBlockName, setEditedBlockName] = (0,external_wp_element_namespaceObject.useState)(initialName);
1188    const descriptionId = (0,external_wp_element_namespaceObject.useId)();
1189    const isNameValid = !!editedBlockName.trim();
1190    const handleSubmit = () => {
1191      if (editedBlockName !== initialName) {
1192        const message = (0,external_wp_i18n_namespaceObject.sprintf)(
1193          /* translators: %s: new name/label for the block */
1194          (0,external_wp_i18n_namespaceObject.__)('Block name changed to: "%s".'),
1195          editedBlockName
1196        );
1197        (0,external_wp_a11y_namespaceObject.speak)(message, "assertive");
1198      }
1199      onSave(editedBlockName);
1200      onClose();
1201    };
1202    return /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
1203      external_wp_components_namespaceObject.Modal,
1204      {
1205        title: (0,external_wp_i18n_namespaceObject.__)("Enable overrides"),
1206        onRequestClose: onClose,
1207        focusOnMount: "firstContentElement",
1208        aria: { describedby: descriptionId },
1209        size: "small",
1210        children: /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
1211          "form",
1212          {
1213            onSubmit: (event) => {
1214              event.preventDefault();
1215              if (!isNameValid) {
1216                return;
1217              }
1218              handleSubmit();
1219            },
1220            children: /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { spacing: "6", children: [
1221              /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { id: descriptionId, children: (0,external_wp_i18n_namespaceObject.__)(
1222                "Overrides are changes you make to a block within a synced pattern instance. Use overrides to customize a synced pattern instance to suit its new context. Name this block to specify an override."
1223              ) }),
1224              /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
1225                external_wp_components_namespaceObject.TextControl,
1226                {
1227                  __nextHasNoMarginBottom: true,
1228                  __next40pxDefaultSize: true,
1229                  value: editedBlockName,
1230                  label: (0,external_wp_i18n_namespaceObject.__)("Name"),
1231                  help: (0,external_wp_i18n_namespaceObject.__)(
1232                    'For example, if you are creating a recipe pattern, you use "Recipe Title", "Recipe Description", etc.'
1233                  ),
1234                  placeholder,
1235                  onChange: setEditedBlockName
1236                }
1237              ),
1238              /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, { justify: "right", children: [
1239                /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
1240                  external_wp_components_namespaceObject.Button,
1241                  {
1242                    __next40pxDefaultSize: true,
1243                    variant: "tertiary",
1244                    onClick: onClose,
1245                    children: (0,external_wp_i18n_namespaceObject.__)("Cancel")
1246                  }
1247                ),
1248                /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
1249                  external_wp_components_namespaceObject.Button,
1250                  {
1251                    __next40pxDefaultSize: true,
1252                    "aria-disabled": !isNameValid,
1253                    variant: "primary",
1254                    type: "submit",
1255                    children: (0,external_wp_i18n_namespaceObject.__)("Enable")
1256                  }
1257                )
1258              ] })
1259            ] })
1260          }
1261        )
1262      }
1263    );
1264  }
1265  function DisallowOverridesModal({ onClose, onSave }) {
1266    const descriptionId = (0,external_wp_element_namespaceObject.useId)();
1267    return /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
1268      external_wp_components_namespaceObject.Modal,
1269      {
1270        title: (0,external_wp_i18n_namespaceObject.__)("Disable overrides"),
1271        onRequestClose: onClose,
1272        aria: { describedby: descriptionId },
1273        size: "small",
1274        children: /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
1275          "form",
1276          {
1277            onSubmit: (event) => {
1278              event.preventDefault();
1279              onSave();
1280              onClose();
1281            },
1282            children: /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { spacing: "6", children: [
1283              /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { id: descriptionId, children: (0,external_wp_i18n_namespaceObject.__)(
1284                "Are you sure you want to disable overrides? Disabling overrides will revert all applied overrides for this block throughout instances of this pattern."
1285              ) }),
1286              /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, { justify: "right", children: [
1287                /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
1288                  external_wp_components_namespaceObject.Button,
1289                  {
1290                    __next40pxDefaultSize: true,
1291                    variant: "tertiary",
1292                    onClick: onClose,
1293                    children: (0,external_wp_i18n_namespaceObject.__)("Cancel")
1294                  }
1295                ),
1296                /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
1297                  external_wp_components_namespaceObject.Button,
1298                  {
1299                    __next40pxDefaultSize: true,
1300                    variant: "primary",
1301                    type: "submit",
1302                    children: (0,external_wp_i18n_namespaceObject.__)("Disable")
1303                  }
1304                )
1305              ] })
1306            ] })
1307          }
1308        )
1309      }
1310    );
1311  }
1312  
1313  
1314  ;// ./node_modules/@wordpress/patterns/build-module/components/pattern-overrides-controls.js
1315  
1316  
1317  
1318  
1319  
1320  
1321  
1322  function PatternOverridesControls({
1323    attributes,
1324    setAttributes,
1325    name: blockName
1326  }) {
1327    const controlId = (0,external_wp_element_namespaceObject.useId)();
1328    const [showAllowOverridesModal, setShowAllowOverridesModal] = (0,external_wp_element_namespaceObject.useState)(false);
1329    const [showDisallowOverridesModal, setShowDisallowOverridesModal] = (0,external_wp_element_namespaceObject.useState)(false);
1330    const hasName = !!attributes.metadata?.name;
1331    const defaultBindings = attributes.metadata?.bindings?.__default;
1332    const hasOverrides = hasName && defaultBindings?.source === PATTERN_OVERRIDES_BINDING_SOURCE;
1333    const isConnectedToOtherSources = defaultBindings?.source && defaultBindings.source !== PATTERN_OVERRIDES_BINDING_SOURCE;
1334    const { updateBlockBindings } = (0,external_wp_blockEditor_namespaceObject.useBlockBindingsUtils)();
1335    function updateBindings(isChecked, customName) {
1336      if (customName) {
1337        setAttributes({
1338          metadata: {
1339            ...attributes.metadata,
1340            name: customName
1341          }
1342        });
1343      }
1344      updateBlockBindings({
1345        __default: isChecked ? { source: PATTERN_OVERRIDES_BINDING_SOURCE } : void 0
1346      });
1347    }
1348    if (isConnectedToOtherSources) {
1349      return null;
1350    }
1351    const hasUnsupportedImageAttributes = blockName === "core/image" && !!attributes.href?.length;
1352    const helpText = !hasOverrides && hasUnsupportedImageAttributes ? (0,external_wp_i18n_namespaceObject.__)(
1353      `Overrides currently don't support image links. Remove the link first before enabling overrides.`
1354    ) : (0,external_wp_i18n_namespaceObject.__)(
1355      "Allow changes to this block throughout instances of this pattern."
1356    );
1357    return /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [
1358      /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.InspectorControls, { group: "advanced", children: /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
1359        external_wp_components_namespaceObject.BaseControl,
1360        {
1361          __nextHasNoMarginBottom: true,
1362          id: controlId,
1363          label: (0,external_wp_i18n_namespaceObject.__)("Overrides"),
1364          help: helpText,
1365          children: /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
1366            external_wp_components_namespaceObject.Button,
1367            {
1368              __next40pxDefaultSize: true,
1369              className: "pattern-overrides-control__allow-overrides-button",
1370              variant: "secondary",
1371              "aria-haspopup": "dialog",
1372              onClick: () => {
1373                if (hasOverrides) {
1374                  setShowDisallowOverridesModal(true);
1375                } else {
1376                  setShowAllowOverridesModal(true);
1377                }
1378              },
1379              disabled: !hasOverrides && hasUnsupportedImageAttributes,
1380              accessibleWhenDisabled: true,
1381              children: hasOverrides ? (0,external_wp_i18n_namespaceObject.__)("Disable overrides") : (0,external_wp_i18n_namespaceObject.__)("Enable overrides")
1382            }
1383          )
1384        }
1385      ) }),
1386      showAllowOverridesModal && /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
1387        AllowOverridesModal,
1388        {
1389          initialName: attributes.metadata?.name,
1390          onClose: () => setShowAllowOverridesModal(false),
1391          onSave: (newName) => {
1392            updateBindings(true, newName);
1393          }
1394        }
1395      ),
1396      showDisallowOverridesModal && /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
1397        DisallowOverridesModal,
1398        {
1399          onClose: () => setShowDisallowOverridesModal(false),
1400          onSave: () => updateBindings(false)
1401        }
1402      )
1403    ] });
1404  }
1405  var pattern_overrides_controls_default = PatternOverridesControls;
1406  
1407  
1408  ;// ./node_modules/@wordpress/patterns/build-module/components/reset-overrides-control.js
1409  
1410  
1411  
1412  
1413  
1414  const CONTENT = "content";
1415  function ResetOverridesControl(props) {
1416    const name = props.attributes.metadata?.name;
1417    const registry = (0,external_wp_data_namespaceObject.useRegistry)();
1418    const isOverridden = (0,external_wp_data_namespaceObject.useSelect)(
1419      (select) => {
1420        if (!name) {
1421          return;
1422        }
1423        const { getBlockAttributes, getBlockParentsByBlockName } = select(external_wp_blockEditor_namespaceObject.store);
1424        const [patternClientId] = getBlockParentsByBlockName(
1425          props.clientId,
1426          "core/block",
1427          true
1428        );
1429        if (!patternClientId) {
1430          return;
1431        }
1432        const overrides = getBlockAttributes(patternClientId)[CONTENT];
1433        if (!overrides) {
1434          return;
1435        }
1436        return overrides.hasOwnProperty(name);
1437      },
1438      [props.clientId, name]
1439    );
1440    function onClick() {
1441      const { getBlockAttributes, getBlockParentsByBlockName } = registry.select(external_wp_blockEditor_namespaceObject.store);
1442      const [patternClientId] = getBlockParentsByBlockName(
1443        props.clientId,
1444        "core/block",
1445        true
1446      );
1447      if (!patternClientId) {
1448        return;
1449      }
1450      const overrides = getBlockAttributes(patternClientId)[CONTENT];
1451      if (!overrides.hasOwnProperty(name)) {
1452        return;
1453      }
1454      const { updateBlockAttributes, __unstableMarkLastChangeAsPersistent } = registry.dispatch(external_wp_blockEditor_namespaceObject.store);
1455      __unstableMarkLastChangeAsPersistent();
1456      let newOverrides = { ...overrides };
1457      delete newOverrides[name];
1458      if (!Object.keys(newOverrides).length) {
1459        newOverrides = void 0;
1460      }
1461      updateBlockAttributes(patternClientId, {
1462        [CONTENT]: newOverrides
1463      });
1464    }
1465    return /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__unstableBlockToolbarLastItem, { children: /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ToolbarGroup, { children: /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ToolbarButton, { onClick, disabled: !isOverridden, children: (0,external_wp_i18n_namespaceObject.__)("Reset") }) }) });
1466  }
1467  
1468  
1469  ;// ./node_modules/@wordpress/icons/build-module/library/copy.js
1470  
1471  
1472  var copy_default = /* @__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)(
1473    external_wp_primitives_namespaceObject.Path,
1474    {
1475      fillRule: "evenodd",
1476      clipRule: "evenodd",
1477      d: "M5 4.5h11a.5.5 0 0 1 .5.5v11a.5.5 0 0 1-.5.5H5a.5.5 0 0 1-.5-.5V5a.5.5 0 0 1 .5-.5ZM3 5a2 2 0 0 1 2-2h11a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5Zm17 3v10.75c0 .69-.56 1.25-1.25 1.25H6v1.5h12.75a2.75 2.75 0 0 0 2.75-2.75V8H20Z"
1478    }
1479  ) });
1480  
1481  
1482  ;// ./node_modules/@wordpress/patterns/build-module/components/pattern-overrides-block-controls.js
1483  
1484  
1485  
1486  
1487  
1488  
1489  
1490  
1491  
1492  
1493  const { useBlockDisplayTitle } = unlock(external_wp_blockEditor_namespaceObject.privateApis);
1494  function PatternOverridesToolbarIndicator({ clientIds }) {
1495    const isSingleBlockSelected = clientIds.length === 1;
1496    const { icon, firstBlockName } = (0,external_wp_data_namespaceObject.useSelect)(
1497      (select) => {
1498        const { getBlockAttributes, getBlockNamesByClientId } = select(external_wp_blockEditor_namespaceObject.store);
1499        const { getBlockType, getActiveBlockVariation } = select(external_wp_blocks_namespaceObject.store);
1500        const blockTypeNames = getBlockNamesByClientId(clientIds);
1501        const _firstBlockTypeName = blockTypeNames[0];
1502        const firstBlockType = getBlockType(_firstBlockTypeName);
1503        let _icon;
1504        if (isSingleBlockSelected) {
1505          const match = getActiveBlockVariation(
1506            _firstBlockTypeName,
1507            getBlockAttributes(clientIds[0])
1508          );
1509          _icon = match?.icon || firstBlockType.icon;
1510        } else {
1511          const isSelectionOfSameType = new Set(blockTypeNames).size === 1;
1512          _icon = isSelectionOfSameType ? firstBlockType.icon : copy_default;
1513        }
1514        return {
1515          icon: _icon,
1516          firstBlockName: getBlockAttributes(clientIds[0]).metadata.name
1517        };
1518      },
1519      [clientIds, isSingleBlockSelected]
1520    );
1521    const firstBlockTitle = useBlockDisplayTitle({
1522      clientId: clientIds[0],
1523      maximumLength: 35
1524    });
1525    const blockDescription = isSingleBlockSelected ? (0,external_wp_i18n_namespaceObject.sprintf)(
1526      /* translators: 1: The block type's name. 2: The block's user-provided name (the same as the override name). */
1527      (0,external_wp_i18n_namespaceObject.__)('This %1$s is editable using the "%2$s" override.'),
1528      firstBlockTitle.toLowerCase(),
1529      firstBlockName
1530    ) : (0,external_wp_i18n_namespaceObject.__)("These blocks are editable using overrides.");
1531    const descriptionId = (0,external_wp_element_namespaceObject.useId)();
1532    return /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ToolbarItem, { children: (toggleProps) => /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
1533      external_wp_components_namespaceObject.DropdownMenu,
1534      {
1535        className: "patterns-pattern-overrides-toolbar-indicator",
1536        label: firstBlockTitle,
1537        popoverProps: {
1538          placement: "bottom-start",
1539          className: "patterns-pattern-overrides-toolbar-indicator__popover"
1540        },
1541        icon: /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(
1542          external_wp_blockEditor_namespaceObject.BlockIcon,
1543          {
1544            icon,
1545            className: "patterns-pattern-overrides-toolbar-indicator-icon",
1546            showColors: true
1547          }
1548        ) }),
1549        toggleProps: {
1550          description: blockDescription,
1551          ...toggleProps
1552        },
1553        menuProps: {
1554          orientation: "both",
1555          "aria-describedby": descriptionId
1556        },
1557        children: () => /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { id: descriptionId, children: blockDescription })
1558      }
1559    ) });
1560  }
1561  function PatternOverridesBlockControls() {
1562    const { clientIds, hasPatternOverrides, hasParentPattern } = (0,external_wp_data_namespaceObject.useSelect)(
1563      (select) => {
1564        const {
1565          getBlockAttributes,
1566          getSelectedBlockClientIds,
1567          getBlockParentsByBlockName
1568        } = select(external_wp_blockEditor_namespaceObject.store);
1569        const selectedClientIds = getSelectedBlockClientIds();
1570        const _hasPatternOverrides = selectedClientIds.every(
1571          (clientId) => Object.values(
1572            getBlockAttributes(clientId)?.metadata?.bindings ?? {}
1573          ).some(
1574            (binding) => binding?.source === PATTERN_OVERRIDES_BINDING_SOURCE
1575          )
1576        );
1577        const _hasParentPattern = selectedClientIds.every(
1578          (clientId) => getBlockParentsByBlockName(clientId, "core/block", true).length > 0
1579        );
1580        return {
1581          clientIds: selectedClientIds,
1582          hasPatternOverrides: _hasPatternOverrides,
1583          hasParentPattern: _hasParentPattern
1584        };
1585      },
1586      []
1587    );
1588    return hasPatternOverrides && hasParentPattern ? /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.BlockControls, { group: "parent", children: /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(PatternOverridesToolbarIndicator, { clientIds }) }) : null;
1589  }
1590  
1591  
1592  ;// ./node_modules/@wordpress/patterns/build-module/private-apis.js
1593  
1594  
1595  
1596  
1597  
1598  
1599  
1600  
1601  
1602  
1603  
1604  
1605  
1606  const privateApis = {};
1607  lock(privateApis, {
1608    OverridesPanel: OverridesPanel,
1609    CreatePatternModal: CreatePatternModal,
1610    CreatePatternModalContents: CreatePatternModalContents,
1611    DuplicatePatternModal: DuplicatePatternModal,
1612    isOverridableBlock: isOverridableBlock,
1613    hasOverridableBlocks: hasOverridableBlocks,
1614    useDuplicatePatternProps: useDuplicatePatternProps,
1615    RenamePatternModal: RenamePatternModal,
1616    PatternsMenuItems: PatternsMenuItems,
1617    RenamePatternCategoryModal: RenamePatternCategoryModal,
1618    PatternOverridesControls: pattern_overrides_controls_default,
1619    ResetOverridesControl: ResetOverridesControl,
1620    PatternOverridesBlockControls: PatternOverridesBlockControls,
1621    useAddPatternCategory: useAddPatternCategory,
1622    PATTERN_TYPES: PATTERN_TYPES,
1623    PATTERN_DEFAULT_CATEGORY: PATTERN_DEFAULT_CATEGORY,
1624    PATTERN_USER_CATEGORY: PATTERN_USER_CATEGORY,
1625    EXCLUDED_PATTERN_SOURCES: EXCLUDED_PATTERN_SOURCES,
1626    PATTERN_SYNC_TYPES: PATTERN_SYNC_TYPES,
1627    PARTIAL_SYNCING_SUPPORTED_BLOCKS: PARTIAL_SYNCING_SUPPORTED_BLOCKS
1628  });
1629  
1630  
1631  ;// ./node_modules/@wordpress/patterns/build-module/index.js
1632  
1633  
1634  
1635  
1636  (window.wp = window.wp || {}).patterns = __webpack_exports__;
1637  /******/ })()
1638  ;


Generated : Thu Oct 30 08:20:06 2025 Cross-referenced by PHPXref