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