[ Index ] |
PHP Cross Reference of WordPress Trunk (Updated Daily) |
[Summary view] [Print] [Text view]
1 /******/ (() => { // webpackBootstrap 2 /******/ var __webpack_modules__ = ({ 3 4 /***/ 4306: 5 /***/ (function(module, exports) { 6 7 var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! 8 autosize 4.0.4 9 license: MIT 10 http://www.jacklmoore.com/autosize 11 */ 12 (function (global, factory) { 13 if (true) { 14 !(__WEBPACK_AMD_DEFINE_ARRAY__ = [module, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), 15 __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? 16 (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), 17 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); 18 } else { var mod; } 19 })(this, function (module, exports) { 20 'use strict'; 21 22 var map = typeof Map === "function" ? new Map() : function () { 23 var keys = []; 24 var values = []; 25 26 return { 27 has: function has(key) { 28 return keys.indexOf(key) > -1; 29 }, 30 get: function get(key) { 31 return values[keys.indexOf(key)]; 32 }, 33 set: function set(key, value) { 34 if (keys.indexOf(key) === -1) { 35 keys.push(key); 36 values.push(value); 37 } 38 }, 39 delete: function _delete(key) { 40 var index = keys.indexOf(key); 41 if (index > -1) { 42 keys.splice(index, 1); 43 values.splice(index, 1); 44 } 45 } 46 }; 47 }(); 48 49 var createEvent = function createEvent(name) { 50 return new Event(name, { bubbles: true }); 51 }; 52 try { 53 new Event('test'); 54 } catch (e) { 55 // IE does not support `new Event()` 56 createEvent = function createEvent(name) { 57 var evt = document.createEvent('Event'); 58 evt.initEvent(name, true, false); 59 return evt; 60 }; 61 } 62 63 function assign(ta) { 64 if (!ta || !ta.nodeName || ta.nodeName !== 'TEXTAREA' || map.has(ta)) return; 65 66 var heightOffset = null; 67 var clientWidth = null; 68 var cachedHeight = null; 69 70 function init() { 71 var style = window.getComputedStyle(ta, null); 72 73 if (style.resize === 'vertical') { 74 ta.style.resize = 'none'; 75 } else if (style.resize === 'both') { 76 ta.style.resize = 'horizontal'; 77 } 78 79 if (style.boxSizing === 'content-box') { 80 heightOffset = -(parseFloat(style.paddingTop) + parseFloat(style.paddingBottom)); 81 } else { 82 heightOffset = parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth); 83 } 84 // Fix when a textarea is not on document body and heightOffset is Not a Number 85 if (isNaN(heightOffset)) { 86 heightOffset = 0; 87 } 88 89 update(); 90 } 91 92 function changeOverflow(value) { 93 { 94 // Chrome/Safari-specific fix: 95 // When the textarea y-overflow is hidden, Chrome/Safari do not reflow the text to account for the space 96 // made available by removing the scrollbar. The following forces the necessary text reflow. 97 var width = ta.style.width; 98 ta.style.width = '0px'; 99 // Force reflow: 100 /* jshint ignore:start */ 101 ta.offsetWidth; 102 /* jshint ignore:end */ 103 ta.style.width = width; 104 } 105 106 ta.style.overflowY = value; 107 } 108 109 function getParentOverflows(el) { 110 var arr = []; 111 112 while (el && el.parentNode && el.parentNode instanceof Element) { 113 if (el.parentNode.scrollTop) { 114 arr.push({ 115 node: el.parentNode, 116 scrollTop: el.parentNode.scrollTop 117 }); 118 } 119 el = el.parentNode; 120 } 121 122 return arr; 123 } 124 125 function resize() { 126 if (ta.scrollHeight === 0) { 127 // If the scrollHeight is 0, then the element probably has display:none or is detached from the DOM. 128 return; 129 } 130 131 var overflows = getParentOverflows(ta); 132 var docTop = document.documentElement && document.documentElement.scrollTop; // Needed for Mobile IE (ticket #240) 133 134 ta.style.height = ''; 135 ta.style.height = ta.scrollHeight + heightOffset + 'px'; 136 137 // used to check if an update is actually necessary on window.resize 138 clientWidth = ta.clientWidth; 139 140 // prevents scroll-position jumping 141 overflows.forEach(function (el) { 142 el.node.scrollTop = el.scrollTop; 143 }); 144 145 if (docTop) { 146 document.documentElement.scrollTop = docTop; 147 } 148 } 149 150 function update() { 151 resize(); 152 153 var styleHeight = Math.round(parseFloat(ta.style.height)); 154 var computed = window.getComputedStyle(ta, null); 155 156 // Using offsetHeight as a replacement for computed.height in IE, because IE does not account use of border-box 157 var actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(computed.height)) : ta.offsetHeight; 158 159 // The actual height not matching the style height (set via the resize method) indicates that 160 // the max-height has been exceeded, in which case the overflow should be allowed. 161 if (actualHeight < styleHeight) { 162 if (computed.overflowY === 'hidden') { 163 changeOverflow('scroll'); 164 resize(); 165 actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(window.getComputedStyle(ta, null).height)) : ta.offsetHeight; 166 } 167 } else { 168 // Normally keep overflow set to hidden, to avoid flash of scrollbar as the textarea expands. 169 if (computed.overflowY !== 'hidden') { 170 changeOverflow('hidden'); 171 resize(); 172 actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(window.getComputedStyle(ta, null).height)) : ta.offsetHeight; 173 } 174 } 175 176 if (cachedHeight !== actualHeight) { 177 cachedHeight = actualHeight; 178 var evt = createEvent('autosize:resized'); 179 try { 180 ta.dispatchEvent(evt); 181 } catch (err) { 182 // Firefox will throw an error on dispatchEvent for a detached element 183 // https://bugzilla.mozilla.org/show_bug.cgi?id=889376 184 } 185 } 186 } 187 188 var pageResize = function pageResize() { 189 if (ta.clientWidth !== clientWidth) { 190 update(); 191 } 192 }; 193 194 var destroy = function (style) { 195 window.removeEventListener('resize', pageResize, false); 196 ta.removeEventListener('input', update, false); 197 ta.removeEventListener('keyup', update, false); 198 ta.removeEventListener('autosize:destroy', destroy, false); 199 ta.removeEventListener('autosize:update', update, false); 200 201 Object.keys(style).forEach(function (key) { 202 ta.style[key] = style[key]; 203 }); 204 205 map.delete(ta); 206 }.bind(ta, { 207 height: ta.style.height, 208 resize: ta.style.resize, 209 overflowY: ta.style.overflowY, 210 overflowX: ta.style.overflowX, 211 wordWrap: ta.style.wordWrap 212 }); 213 214 ta.addEventListener('autosize:destroy', destroy, false); 215 216 // IE9 does not fire onpropertychange or oninput for deletions, 217 // so binding to onkeyup to catch most of those events. 218 // There is no way that I know of to detect something like 'cut' in IE9. 219 if ('onpropertychange' in ta && 'oninput' in ta) { 220 ta.addEventListener('keyup', update, false); 221 } 222 223 window.addEventListener('resize', pageResize, false); 224 ta.addEventListener('input', update, false); 225 ta.addEventListener('autosize:update', update, false); 226 ta.style.overflowX = 'hidden'; 227 ta.style.wordWrap = 'break-word'; 228 229 map.set(ta, { 230 destroy: destroy, 231 update: update 232 }); 233 234 init(); 235 } 236 237 function destroy(ta) { 238 var methods = map.get(ta); 239 if (methods) { 240 methods.destroy(); 241 } 242 } 243 244 function update(ta) { 245 var methods = map.get(ta); 246 if (methods) { 247 methods.update(); 248 } 249 } 250 251 var autosize = null; 252 253 // Do nothing in Node.js environment and IE8 (or lower) 254 if (typeof window === 'undefined' || typeof window.getComputedStyle !== 'function') { 255 autosize = function autosize(el) { 256 return el; 257 }; 258 autosize.destroy = function (el) { 259 return el; 260 }; 261 autosize.update = function (el) { 262 return el; 263 }; 264 } else { 265 autosize = function autosize(el, options) { 266 if (el) { 267 Array.prototype.forEach.call(el.length ? el : [el], function (x) { 268 return assign(x, options); 269 }); 270 } 271 return el; 272 }; 273 autosize.destroy = function (el) { 274 if (el) { 275 Array.prototype.forEach.call(el.length ? el : [el], destroy); 276 } 277 return el; 278 }; 279 autosize.update = function (el) { 280 if (el) { 281 Array.prototype.forEach.call(el.length ? el : [el], update); 282 } 283 return el; 284 }; 285 } 286 287 exports.default = autosize; 288 module.exports = exports['default']; 289 }); 290 291 /***/ }), 292 293 /***/ 6109: 294 /***/ ((module) => { 295 296 // This code has been refactored for 140 bytes 297 // You can see the original here: https://github.com/twolfson/computedStyle/blob/04cd1da2e30fa45844f95f5cb1ac898e9b9ef050/lib/computedStyle.js 298 var computedStyle = function (el, prop, getComputedStyle) { 299 getComputedStyle = window.getComputedStyle; 300 301 // In one fell swoop 302 return ( 303 // If we have getComputedStyle 304 getComputedStyle ? 305 // Query it 306 // TODO: From CSS-Query notes, we might need (node, null) for FF 307 getComputedStyle(el) : 308 309 // Otherwise, we are in IE and use currentStyle 310 el.currentStyle 311 )[ 312 // Switch to camelCase for CSSOM 313 // DEV: Grabbed from jQuery 314 // https://github.com/jquery/jquery/blob/1.9-stable/src/css.js#L191-L194 315 // https://github.com/jquery/jquery/blob/1.9-stable/src/core.js#L593-L597 316 prop.replace(/-(\w)/gi, function (word, letter) { 317 return letter.toUpperCase(); 318 }) 319 ]; 320 }; 321 322 module.exports = computedStyle; 323 324 325 /***/ }), 326 327 /***/ 66: 328 /***/ ((module) => { 329 330 "use strict"; 331 332 333 var isMergeableObject = function isMergeableObject(value) { 334 return isNonNullObject(value) 335 && !isSpecial(value) 336 }; 337 338 function isNonNullObject(value) { 339 return !!value && typeof value === 'object' 340 } 341 342 function isSpecial(value) { 343 var stringValue = Object.prototype.toString.call(value); 344 345 return stringValue === '[object RegExp]' 346 || stringValue === '[object Date]' 347 || isReactElement(value) 348 } 349 350 // see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25 351 var canUseSymbol = typeof Symbol === 'function' && Symbol.for; 352 var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7; 353 354 function isReactElement(value) { 355 return value.$$typeof === REACT_ELEMENT_TYPE 356 } 357 358 function emptyTarget(val) { 359 return Array.isArray(val) ? [] : {} 360 } 361 362 function cloneUnlessOtherwiseSpecified(value, options) { 363 return (options.clone !== false && options.isMergeableObject(value)) 364 ? deepmerge(emptyTarget(value), value, options) 365 : value 366 } 367 368 function defaultArrayMerge(target, source, options) { 369 return target.concat(source).map(function(element) { 370 return cloneUnlessOtherwiseSpecified(element, options) 371 }) 372 } 373 374 function getMergeFunction(key, options) { 375 if (!options.customMerge) { 376 return deepmerge 377 } 378 var customMerge = options.customMerge(key); 379 return typeof customMerge === 'function' ? customMerge : deepmerge 380 } 381 382 function getEnumerableOwnPropertySymbols(target) { 383 return Object.getOwnPropertySymbols 384 ? Object.getOwnPropertySymbols(target).filter(function(symbol) { 385 return Object.propertyIsEnumerable.call(target, symbol) 386 }) 387 : [] 388 } 389 390 function getKeys(target) { 391 return Object.keys(target).concat(getEnumerableOwnPropertySymbols(target)) 392 } 393 394 function propertyIsOnObject(object, property) { 395 try { 396 return property in object 397 } catch(_) { 398 return false 399 } 400 } 401 402 // Protects from prototype poisoning and unexpected merging up the prototype chain. 403 function propertyIsUnsafe(target, key) { 404 return propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet, 405 && !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain, 406 && Object.propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable. 407 } 408 409 function mergeObject(target, source, options) { 410 var destination = {}; 411 if (options.isMergeableObject(target)) { 412 getKeys(target).forEach(function(key) { 413 destination[key] = cloneUnlessOtherwiseSpecified(target[key], options); 414 }); 415 } 416 getKeys(source).forEach(function(key) { 417 if (propertyIsUnsafe(target, key)) { 418 return 419 } 420 421 if (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) { 422 destination[key] = getMergeFunction(key, options)(target[key], source[key], options); 423 } else { 424 destination[key] = cloneUnlessOtherwiseSpecified(source[key], options); 425 } 426 }); 427 return destination 428 } 429 430 function deepmerge(target, source, options) { 431 options = options || {}; 432 options.arrayMerge = options.arrayMerge || defaultArrayMerge; 433 options.isMergeableObject = options.isMergeableObject || isMergeableObject; 434 // cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge() 435 // implementations can use it. The caller may not replace it. 436 options.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified; 437 438 var sourceIsArray = Array.isArray(source); 439 var targetIsArray = Array.isArray(target); 440 var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray; 441 442 if (!sourceAndTargetTypesMatch) { 443 return cloneUnlessOtherwiseSpecified(source, options) 444 } else if (sourceIsArray) { 445 return options.arrayMerge(target, source, options) 446 } else { 447 return mergeObject(target, source, options) 448 } 449 } 450 451 deepmerge.all = function deepmergeAll(array, options) { 452 if (!Array.isArray(array)) { 453 throw new Error('first argument should be an array') 454 } 455 456 return array.reduce(function(prev, next) { 457 return deepmerge(prev, next, options) 458 }, {}) 459 }; 460 461 var deepmerge_1 = deepmerge; 462 463 module.exports = deepmerge_1; 464 465 466 /***/ }), 467 468 /***/ 5215: 469 /***/ ((module) => { 470 471 "use strict"; 472 473 474 // do not edit .js files directly - edit src/index.jst 475 476 477 478 module.exports = function equal(a, b) { 479 if (a === b) return true; 480 481 if (a && b && typeof a == 'object' && typeof b == 'object') { 482 if (a.constructor !== b.constructor) return false; 483 484 var length, i, keys; 485 if (Array.isArray(a)) { 486 length = a.length; 487 if (length != b.length) return false; 488 for (i = length; i-- !== 0;) 489 if (!equal(a[i], b[i])) return false; 490 return true; 491 } 492 493 494 495 if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags; 496 if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf(); 497 if (a.toString !== Object.prototype.toString) return a.toString() === b.toString(); 498 499 keys = Object.keys(a); 500 length = keys.length; 501 if (length !== Object.keys(b).length) return false; 502 503 for (i = length; i-- !== 0;) 504 if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false; 505 506 for (i = length; i-- !== 0;) { 507 var key = keys[i]; 508 509 if (!equal(a[key], b[key])) return false; 510 } 511 512 return true; 513 } 514 515 // true if both NaN, false otherwise 516 return a!==a && b!==b; 517 }; 518 519 520 /***/ }), 521 522 /***/ 461: 523 /***/ ((module, __unused_webpack_exports, __webpack_require__) => { 524 525 // Load in dependencies 526 var computedStyle = __webpack_require__(6109); 527 528 /** 529 * Calculate the `line-height` of a given node 530 * @param {HTMLElement} node Element to calculate line height of. Must be in the DOM. 531 * @returns {Number} `line-height` of the element in pixels 532 */ 533 function lineHeight(node) { 534 // Grab the line-height via style 535 var lnHeightStr = computedStyle(node, 'line-height'); 536 var lnHeight = parseFloat(lnHeightStr, 10); 537 538 // If the lineHeight did not contain a unit (i.e. it was numeric), convert it to ems (e.g. '2.3' === '2.3em') 539 if (lnHeightStr === lnHeight + '') { 540 // Save the old lineHeight style and update the em unit to the element 541 var _lnHeightStyle = node.style.lineHeight; 542 node.style.lineHeight = lnHeightStr + 'em'; 543 544 // Calculate the em based height 545 lnHeightStr = computedStyle(node, 'line-height'); 546 lnHeight = parseFloat(lnHeightStr, 10); 547 548 // Revert the lineHeight style 549 if (_lnHeightStyle) { 550 node.style.lineHeight = _lnHeightStyle; 551 } else { 552 delete node.style.lineHeight; 553 } 554 } 555 556 // If the lineHeight is in `pt`, convert it to pixels (4px for 3pt) 557 // DEV: `em` units are converted to `pt` in IE6 558 // Conversion ratio from https://developer.mozilla.org/en-US/docs/Web/CSS/length 559 if (lnHeightStr.indexOf('pt') !== -1) { 560 lnHeight *= 4; 561 lnHeight /= 3; 562 // Otherwise, if the lineHeight is in `mm`, convert it to pixels (96px for 25.4mm) 563 } else if (lnHeightStr.indexOf('mm') !== -1) { 564 lnHeight *= 96; 565 lnHeight /= 25.4; 566 // Otherwise, if the lineHeight is in `cm`, convert it to pixels (96px for 2.54cm) 567 } else if (lnHeightStr.indexOf('cm') !== -1) { 568 lnHeight *= 96; 569 lnHeight /= 2.54; 570 // Otherwise, if the lineHeight is in `in`, convert it to pixels (96px for 1in) 571 } else if (lnHeightStr.indexOf('in') !== -1) { 572 lnHeight *= 96; 573 // Otherwise, if the lineHeight is in `pc`, convert it to pixels (12pt for 1pc) 574 } else if (lnHeightStr.indexOf('pc') !== -1) { 575 lnHeight *= 16; 576 } 577 578 // Continue our computation 579 lnHeight = Math.round(lnHeight); 580 581 // If the line-height is "normal", calculate by font-size 582 if (lnHeightStr === 'normal') { 583 // Create a temporary node 584 var nodeName = node.nodeName; 585 var _node = document.createElement(nodeName); 586 _node.innerHTML = ' '; 587 588 // If we have a text area, reset it to only 1 row 589 // https://github.com/twolfson/line-height/issues/4 590 if (nodeName.toUpperCase() === 'TEXTAREA') { 591 _node.setAttribute('rows', '1'); 592 } 593 594 // Set the font-size of the element 595 var fontSizeStr = computedStyle(node, 'font-size'); 596 _node.style.fontSize = fontSizeStr; 597 598 // Remove default padding/border which can affect offset height 599 // https://github.com/twolfson/line-height/issues/4 600 // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetHeight 601 _node.style.padding = '0px'; 602 _node.style.border = '0px'; 603 604 // Append it to the body 605 var body = document.body; 606 body.appendChild(_node); 607 608 // Assume the line height of the element is the height 609 var height = _node.offsetHeight; 610 lnHeight = height; 611 612 // Remove our child from the DOM 613 body.removeChild(_node); 614 } 615 616 // Return the calculated height 617 return lnHeight; 618 } 619 620 // Export lineHeight 621 module.exports = lineHeight; 622 623 624 /***/ }), 625 626 /***/ 628: 627 /***/ ((module, __unused_webpack_exports, __webpack_require__) => { 628 629 "use strict"; 630 /** 631 * Copyright (c) 2013-present, Facebook, Inc. 632 * 633 * This source code is licensed under the MIT license found in the 634 * LICENSE file in the root directory of this source tree. 635 */ 636 637 638 639 var ReactPropTypesSecret = __webpack_require__(4067); 640 641 function emptyFunction() {} 642 function emptyFunctionWithReset() {} 643 emptyFunctionWithReset.resetWarningCache = emptyFunction; 644 645 module.exports = function() { 646 function shim(props, propName, componentName, location, propFullName, secret) { 647 if (secret === ReactPropTypesSecret) { 648 // It is still safe when called from React. 649 return; 650 } 651 var err = new Error( 652 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' + 653 'Use PropTypes.checkPropTypes() to call them. ' + 654 'Read more at http://fb.me/use-check-prop-types' 655 ); 656 err.name = 'Invariant Violation'; 657 throw err; 658 }; 659 shim.isRequired = shim; 660 function getShim() { 661 return shim; 662 }; 663 // Important! 664 // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`. 665 var ReactPropTypes = { 666 array: shim, 667 bigint: shim, 668 bool: shim, 669 func: shim, 670 number: shim, 671 object: shim, 672 string: shim, 673 symbol: shim, 674 675 any: shim, 676 arrayOf: getShim, 677 element: shim, 678 elementType: shim, 679 instanceOf: getShim, 680 node: shim, 681 objectOf: getShim, 682 oneOf: getShim, 683 oneOfType: getShim, 684 shape: getShim, 685 exact: getShim, 686 687 checkPropTypes: emptyFunctionWithReset, 688 resetWarningCache: emptyFunction 689 }; 690 691 ReactPropTypes.PropTypes = ReactPropTypes; 692 693 return ReactPropTypes; 694 }; 695 696 697 /***/ }), 698 699 /***/ 5826: 700 /***/ ((module, __unused_webpack_exports, __webpack_require__) => { 701 702 /** 703 * Copyright (c) 2013-present, Facebook, Inc. 704 * 705 * This source code is licensed under the MIT license found in the 706 * LICENSE file in the root directory of this source tree. 707 */ 708 709 if (false) { var throwOnDirectAccess, ReactIs; } else { 710 // By explicitly using `prop-types` you are opting into new production behavior. 711 // http://fb.me/prop-types-in-prod 712 module.exports = __webpack_require__(628)(); 713 } 714 715 716 /***/ }), 717 718 /***/ 4067: 719 /***/ ((module) => { 720 721 "use strict"; 722 /** 723 * Copyright (c) 2013-present, Facebook, Inc. 724 * 725 * This source code is licensed under the MIT license found in the 726 * LICENSE file in the root directory of this source tree. 727 */ 728 729 730 731 var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; 732 733 module.exports = ReactPropTypesSecret; 734 735 736 /***/ }), 737 738 /***/ 4462: 739 /***/ (function(__unused_webpack_module, exports, __webpack_require__) { 740 741 "use strict"; 742 743 var __extends = (this && this.__extends) || (function () { 744 var extendStatics = Object.setPrototypeOf || 745 ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || 746 function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; 747 return function (d, b) { 748 extendStatics(d, b); 749 function __() { this.constructor = d; } 750 d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); 751 }; 752 })(); 753 var __assign = (this && this.__assign) || Object.assign || function(t) { 754 for (var s, i = 1, n = arguments.length; i < n; i++) { 755 s = arguments[i]; 756 for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) 757 t[p] = s[p]; 758 } 759 return t; 760 }; 761 var __rest = (this && this.__rest) || function (s, e) { 762 var t = {}; 763 for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) 764 t[p] = s[p]; 765 if (s != null && typeof Object.getOwnPropertySymbols === "function") 766 for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) 767 t[p[i]] = s[p[i]]; 768 return t; 769 }; 770 exports.__esModule = true; 771 var React = __webpack_require__(1609); 772 var PropTypes = __webpack_require__(5826); 773 var autosize = __webpack_require__(4306); 774 var _getLineHeight = __webpack_require__(461); 775 var getLineHeight = _getLineHeight; 776 var RESIZED = "autosize:resized"; 777 /** 778 * A light replacement for built-in textarea component 779 * which automaticaly adjusts its height to match the content 780 */ 781 var TextareaAutosizeClass = /** @class */ (function (_super) { 782 __extends(TextareaAutosizeClass, _super); 783 function TextareaAutosizeClass() { 784 var _this = _super !== null && _super.apply(this, arguments) || this; 785 _this.state = { 786 lineHeight: null 787 }; 788 _this.textarea = null; 789 _this.onResize = function (e) { 790 if (_this.props.onResize) { 791 _this.props.onResize(e); 792 } 793 }; 794 _this.updateLineHeight = function () { 795 if (_this.textarea) { 796 _this.setState({ 797 lineHeight: getLineHeight(_this.textarea) 798 }); 799 } 800 }; 801 _this.onChange = function (e) { 802 var onChange = _this.props.onChange; 803 _this.currentValue = e.currentTarget.value; 804 onChange && onChange(e); 805 }; 806 return _this; 807 } 808 TextareaAutosizeClass.prototype.componentDidMount = function () { 809 var _this = this; 810 var _a = this.props, maxRows = _a.maxRows, async = _a.async; 811 if (typeof maxRows === "number") { 812 this.updateLineHeight(); 813 } 814 if (typeof maxRows === "number" || async) { 815 /* 816 the defer is needed to: 817 - force "autosize" to activate the scrollbar when this.props.maxRows is passed 818 - support StyledComponents (see #71) 819 */ 820 setTimeout(function () { return _this.textarea && autosize(_this.textarea); }); 821 } 822 else { 823 this.textarea && autosize(this.textarea); 824 } 825 if (this.textarea) { 826 this.textarea.addEventListener(RESIZED, this.onResize); 827 } 828 }; 829 TextareaAutosizeClass.prototype.componentWillUnmount = function () { 830 if (this.textarea) { 831 this.textarea.removeEventListener(RESIZED, this.onResize); 832 autosize.destroy(this.textarea); 833 } 834 }; 835 TextareaAutosizeClass.prototype.render = function () { 836 var _this = this; 837 var _a = this, _b = _a.props, onResize = _b.onResize, maxRows = _b.maxRows, onChange = _b.onChange, style = _b.style, innerRef = _b.innerRef, children = _b.children, props = __rest(_b, ["onResize", "maxRows", "onChange", "style", "innerRef", "children"]), lineHeight = _a.state.lineHeight; 838 var maxHeight = maxRows && lineHeight ? lineHeight * maxRows : null; 839 return (React.createElement("textarea", __assign({}, props, { onChange: this.onChange, style: maxHeight ? __assign({}, style, { maxHeight: maxHeight }) : style, ref: function (element) { 840 _this.textarea = element; 841 if (typeof _this.props.innerRef === 'function') { 842 _this.props.innerRef(element); 843 } 844 else if (_this.props.innerRef) { 845 _this.props.innerRef.current = element; 846 } 847 } }), children)); 848 }; 849 TextareaAutosizeClass.prototype.componentDidUpdate = function () { 850 this.textarea && autosize.update(this.textarea); 851 }; 852 TextareaAutosizeClass.defaultProps = { 853 rows: 1, 854 async: false 855 }; 856 TextareaAutosizeClass.propTypes = { 857 rows: PropTypes.number, 858 maxRows: PropTypes.number, 859 onResize: PropTypes.func, 860 innerRef: PropTypes.any, 861 async: PropTypes.bool 862 }; 863 return TextareaAutosizeClass; 864 }(React.Component)); 865 exports.TextareaAutosize = React.forwardRef(function (props, ref) { 866 return React.createElement(TextareaAutosizeClass, __assign({}, props, { innerRef: ref })); 867 }); 868 869 870 /***/ }), 871 872 /***/ 4132: 873 /***/ ((__unused_webpack_module, exports, __webpack_require__) => { 874 875 "use strict"; 876 var __webpack_unused_export__; 877 878 __webpack_unused_export__ = true; 879 var TextareaAutosize_1 = __webpack_require__(4462); 880 exports.A = TextareaAutosize_1.TextareaAutosize; 881 882 883 /***/ }), 884 885 /***/ 9681: 886 /***/ ((module) => { 887 888 var characterMap = { 889 "À": "A", 890 "Á": "A", 891 "Â": "A", 892 "Ã": "A", 893 "Ä": "A", 894 "Å": "A", 895 "Ấ": "A", 896 "Ắ": "A", 897 "Ẳ": "A", 898 "Ẵ": "A", 899 "Ặ": "A", 900 "Æ": "AE", 901 "Ầ": "A", 902 "Ằ": "A", 903 "Ȃ": "A", 904 "Ả": "A", 905 "Ạ": "A", 906 "Ẩ": "A", 907 "Ẫ": "A", 908 "Ậ": "A", 909 "Ç": "C", 910 "Ḉ": "C", 911 "È": "E", 912 "É": "E", 913 "Ê": "E", 914 "Ë": "E", 915 "Ế": "E", 916 "Ḗ": "E", 917 "Ề": "E", 918 "Ḕ": "E", 919 "Ḝ": "E", 920 "Ȇ": "E", 921 "Ẻ": "E", 922 "Ẽ": "E", 923 "Ẹ": "E", 924 "Ể": "E", 925 "Ễ": "E", 926 "Ệ": "E", 927 "Ì": "I", 928 "Í": "I", 929 "Î": "I", 930 "Ï": "I", 931 "Ḯ": "I", 932 "Ȋ": "I", 933 "Ỉ": "I", 934 "Ị": "I", 935 "Ð": "D", 936 "Ñ": "N", 937 "Ò": "O", 938 "Ó": "O", 939 "Ô": "O", 940 "Õ": "O", 941 "Ö": "O", 942 "Ø": "O", 943 "Ố": "O", 944 "Ṍ": "O", 945 "Ṓ": "O", 946 "Ȏ": "O", 947 "Ỏ": "O", 948 "Ọ": "O", 949 "Ổ": "O", 950 "Ỗ": "O", 951 "Ộ": "O", 952 "Ờ": "O", 953 "Ở": "O", 954 "Ỡ": "O", 955 "Ớ": "O", 956 "Ợ": "O", 957 "Ù": "U", 958 "Ú": "U", 959 "Û": "U", 960 "Ü": "U", 961 "Ủ": "U", 962 "Ụ": "U", 963 "Ử": "U", 964 "Ữ": "U", 965 "Ự": "U", 966 "Ý": "Y", 967 "à": "a", 968 "á": "a", 969 "â": "a", 970 "ã": "a", 971 "ä": "a", 972 "å": "a", 973 "ấ": "a", 974 "ắ": "a", 975 "ẳ": "a", 976 "ẵ": "a", 977 "ặ": "a", 978 "æ": "ae", 979 "ầ": "a", 980 "ằ": "a", 981 "ȃ": "a", 982 "ả": "a", 983 "ạ": "a", 984 "ẩ": "a", 985 "ẫ": "a", 986 "ậ": "a", 987 "ç": "c", 988 "ḉ": "c", 989 "è": "e", 990 "é": "e", 991 "ê": "e", 992 "ë": "e", 993 "ế": "e", 994 "ḗ": "e", 995 "ề": "e", 996 "ḕ": "e", 997 "ḝ": "e", 998 "ȇ": "e", 999 "ẻ": "e", 1000 "ẽ": "e", 1001 "ẹ": "e", 1002 "ể": "e", 1003 "ễ": "e", 1004 "ệ": "e", 1005 "ì": "i", 1006 "í": "i", 1007 "î": "i", 1008 "ï": "i", 1009 "ḯ": "i", 1010 "ȋ": "i", 1011 "ỉ": "i", 1012 "ị": "i", 1013 "ð": "d", 1014 "ñ": "n", 1015 "ò": "o", 1016 "ó": "o", 1017 "ô": "o", 1018 "õ": "o", 1019 "ö": "o", 1020 "ø": "o", 1021 "ố": "o", 1022 "ṍ": "o", 1023 "ṓ": "o", 1024 "ȏ": "o", 1025 "ỏ": "o", 1026 "ọ": "o", 1027 "ổ": "o", 1028 "ỗ": "o", 1029 "ộ": "o", 1030 "ờ": "o", 1031 "ở": "o", 1032 "ỡ": "o", 1033 "ớ": "o", 1034 "ợ": "o", 1035 "ù": "u", 1036 "ú": "u", 1037 "û": "u", 1038 "ü": "u", 1039 "ủ": "u", 1040 "ụ": "u", 1041 "ử": "u", 1042 "ữ": "u", 1043 "ự": "u", 1044 "ý": "y", 1045 "ÿ": "y", 1046 "Ā": "A", 1047 "ā": "a", 1048 "Ă": "A", 1049 "ă": "a", 1050 "Ą": "A", 1051 "ą": "a", 1052 "Ć": "C", 1053 "ć": "c", 1054 "Ĉ": "C", 1055 "ĉ": "c", 1056 "Ċ": "C", 1057 "ċ": "c", 1058 "Č": "C", 1059 "č": "c", 1060 "C̆": "C", 1061 "c̆": "c", 1062 "Ď": "D", 1063 "ď": "d", 1064 "Đ": "D", 1065 "đ": "d", 1066 "Ē": "E", 1067 "ē": "e", 1068 "Ĕ": "E", 1069 "ĕ": "e", 1070 "Ė": "E", 1071 "ė": "e", 1072 "Ę": "E", 1073 "ę": "e", 1074 "Ě": "E", 1075 "ě": "e", 1076 "Ĝ": "G", 1077 "Ǵ": "G", 1078 "ĝ": "g", 1079 "ǵ": "g", 1080 "Ğ": "G", 1081 "ğ": "g", 1082 "Ġ": "G", 1083 "ġ": "g", 1084 "Ģ": "G", 1085 "ģ": "g", 1086 "Ĥ": "H", 1087 "ĥ": "h", 1088 "Ħ": "H", 1089 "ħ": "h", 1090 "Ḫ": "H", 1091 "ḫ": "h", 1092 "Ĩ": "I", 1093 "ĩ": "i", 1094 "Ī": "I", 1095 "ī": "i", 1096 "Ĭ": "I", 1097 "ĭ": "i", 1098 "Į": "I", 1099 "į": "i", 1100 "İ": "I", 1101 "ı": "i", 1102 "IJ": "IJ", 1103 "ij": "ij", 1104 "Ĵ": "J", 1105 "ĵ": "j", 1106 "Ķ": "K", 1107 "ķ": "k", 1108 "Ḱ": "K", 1109 "ḱ": "k", 1110 "K̆": "K", 1111 "k̆": "k", 1112 "Ĺ": "L", 1113 "ĺ": "l", 1114 "Ļ": "L", 1115 "ļ": "l", 1116 "Ľ": "L", 1117 "ľ": "l", 1118 "Ŀ": "L", 1119 "ŀ": "l", 1120 "Ł": "l", 1121 "ł": "l", 1122 "Ḿ": "M", 1123 "ḿ": "m", 1124 "M̆": "M", 1125 "m̆": "m", 1126 "Ń": "N", 1127 "ń": "n", 1128 "Ņ": "N", 1129 "ņ": "n", 1130 "Ň": "N", 1131 "ň": "n", 1132 "ʼn": "n", 1133 "N̆": "N", 1134 "n̆": "n", 1135 "Ō": "O", 1136 "ō": "o", 1137 "Ŏ": "O", 1138 "ŏ": "o", 1139 "Ő": "O", 1140 "ő": "o", 1141 "Œ": "OE", 1142 "œ": "oe", 1143 "P̆": "P", 1144 "p̆": "p", 1145 "Ŕ": "R", 1146 "ŕ": "r", 1147 "Ŗ": "R", 1148 "ŗ": "r", 1149 "Ř": "R", 1150 "ř": "r", 1151 "R̆": "R", 1152 "r̆": "r", 1153 "Ȓ": "R", 1154 "ȓ": "r", 1155 "Ś": "S", 1156 "ś": "s", 1157 "Ŝ": "S", 1158 "ŝ": "s", 1159 "Ş": "S", 1160 "Ș": "S", 1161 "ș": "s", 1162 "ş": "s", 1163 "Š": "S", 1164 "š": "s", 1165 "Ţ": "T", 1166 "ţ": "t", 1167 "ț": "t", 1168 "Ț": "T", 1169 "Ť": "T", 1170 "ť": "t", 1171 "Ŧ": "T", 1172 "ŧ": "t", 1173 "T̆": "T", 1174 "t̆": "t", 1175 "Ũ": "U", 1176 "ũ": "u", 1177 "Ū": "U", 1178 "ū": "u", 1179 "Ŭ": "U", 1180 "ŭ": "u", 1181 "Ů": "U", 1182 "ů": "u", 1183 "Ű": "U", 1184 "ű": "u", 1185 "Ų": "U", 1186 "ų": "u", 1187 "Ȗ": "U", 1188 "ȗ": "u", 1189 "V̆": "V", 1190 "v̆": "v", 1191 "Ŵ": "W", 1192 "ŵ": "w", 1193 "Ẃ": "W", 1194 "ẃ": "w", 1195 "X̆": "X", 1196 "x̆": "x", 1197 "Ŷ": "Y", 1198 "ŷ": "y", 1199 "Ÿ": "Y", 1200 "Y̆": "Y", 1201 "y̆": "y", 1202 "Ź": "Z", 1203 "ź": "z", 1204 "Ż": "Z", 1205 "ż": "z", 1206 "Ž": "Z", 1207 "ž": "z", 1208 "ſ": "s", 1209 "ƒ": "f", 1210 "Ơ": "O", 1211 "ơ": "o", 1212 "Ư": "U", 1213 "ư": "u", 1214 "Ǎ": "A", 1215 "ǎ": "a", 1216 "Ǐ": "I", 1217 "ǐ": "i", 1218 "Ǒ": "O", 1219 "ǒ": "o", 1220 "Ǔ": "U", 1221 "ǔ": "u", 1222 "Ǖ": "U", 1223 "ǖ": "u", 1224 "Ǘ": "U", 1225 "ǘ": "u", 1226 "Ǚ": "U", 1227 "ǚ": "u", 1228 "Ǜ": "U", 1229 "ǜ": "u", 1230 "Ứ": "U", 1231 "ứ": "u", 1232 "Ṹ": "U", 1233 "ṹ": "u", 1234 "Ǻ": "A", 1235 "ǻ": "a", 1236 "Ǽ": "AE", 1237 "ǽ": "ae", 1238 "Ǿ": "O", 1239 "ǿ": "o", 1240 "Þ": "TH", 1241 "þ": "th", 1242 "Ṕ": "P", 1243 "ṕ": "p", 1244 "Ṥ": "S", 1245 "ṥ": "s", 1246 "X́": "X", 1247 "x́": "x", 1248 "Ѓ": "Г", 1249 "ѓ": "г", 1250 "Ќ": "К", 1251 "ќ": "к", 1252 "A̋": "A", 1253 "a̋": "a", 1254 "E̋": "E", 1255 "e̋": "e", 1256 "I̋": "I", 1257 "i̋": "i", 1258 "Ǹ": "N", 1259 "ǹ": "n", 1260 "Ồ": "O", 1261 "ồ": "o", 1262 "Ṑ": "O", 1263 "ṑ": "o", 1264 "Ừ": "U", 1265 "ừ": "u", 1266 "Ẁ": "W", 1267 "ẁ": "w", 1268 "Ỳ": "Y", 1269 "ỳ": "y", 1270 "Ȁ": "A", 1271 "ȁ": "a", 1272 "Ȅ": "E", 1273 "ȅ": "e", 1274 "Ȉ": "I", 1275 "ȉ": "i", 1276 "Ȍ": "O", 1277 "ȍ": "o", 1278 "Ȑ": "R", 1279 "ȑ": "r", 1280 "Ȕ": "U", 1281 "ȕ": "u", 1282 "B̌": "B", 1283 "b̌": "b", 1284 "Č̣": "C", 1285 "č̣": "c", 1286 "Ê̌": "E", 1287 "ê̌": "e", 1288 "F̌": "F", 1289 "f̌": "f", 1290 "Ǧ": "G", 1291 "ǧ": "g", 1292 "Ȟ": "H", 1293 "ȟ": "h", 1294 "J̌": "J", 1295 "ǰ": "j", 1296 "Ǩ": "K", 1297 "ǩ": "k", 1298 "M̌": "M", 1299 "m̌": "m", 1300 "P̌": "P", 1301 "p̌": "p", 1302 "Q̌": "Q", 1303 "q̌": "q", 1304 "Ř̩": "R", 1305 "ř̩": "r", 1306 "Ṧ": "S", 1307 "ṧ": "s", 1308 "V̌": "V", 1309 "v̌": "v", 1310 "W̌": "W", 1311 "w̌": "w", 1312 "X̌": "X", 1313 "x̌": "x", 1314 "Y̌": "Y", 1315 "y̌": "y", 1316 "A̧": "A", 1317 "a̧": "a", 1318 "B̧": "B", 1319 "b̧": "b", 1320 "Ḑ": "D", 1321 "ḑ": "d", 1322 "Ȩ": "E", 1323 "ȩ": "e", 1324 "Ɛ̧": "E", 1325 "ɛ̧": "e", 1326 "Ḩ": "H", 1327 "ḩ": "h", 1328 "I̧": "I", 1329 "i̧": "i", 1330 "Ɨ̧": "I", 1331 "ɨ̧": "i", 1332 "M̧": "M", 1333 "m̧": "m", 1334 "O̧": "O", 1335 "o̧": "o", 1336 "Q̧": "Q", 1337 "q̧": "q", 1338 "U̧": "U", 1339 "u̧": "u", 1340 "X̧": "X", 1341 "x̧": "x", 1342 "Z̧": "Z", 1343 "z̧": "z", 1344 "й":"и", 1345 "Й":"И", 1346 "ё":"е", 1347 "Ё":"Е", 1348 }; 1349 1350 var chars = Object.keys(characterMap).join('|'); 1351 var allAccents = new RegExp(chars, 'g'); 1352 var firstAccent = new RegExp(chars, ''); 1353 1354 function matcher(match) { 1355 return characterMap[match]; 1356 } 1357 1358 var removeAccents = function(string) { 1359 return string.replace(allAccents, matcher); 1360 }; 1361 1362 var hasAccents = function(string) { 1363 return !!string.match(firstAccent); 1364 }; 1365 1366 module.exports = removeAccents; 1367 module.exports.has = hasAccents; 1368 module.exports.remove = removeAccents; 1369 1370 1371 /***/ }), 1372 1373 /***/ 1609: 1374 /***/ ((module) => { 1375 1376 "use strict"; 1377 module.exports = window["React"]; 1378 1379 /***/ }) 1380 1381 /******/ }); 1382 /************************************************************************/ 1383 /******/ // The module cache 1384 /******/ var __webpack_module_cache__ = {}; 1385 /******/ 1386 /******/ // The require function 1387 /******/ function __webpack_require__(moduleId) { 1388 /******/ // Check if module is in cache 1389 /******/ var cachedModule = __webpack_module_cache__[moduleId]; 1390 /******/ if (cachedModule !== undefined) { 1391 /******/ return cachedModule.exports; 1392 /******/ } 1393 /******/ // Create a new module (and put it into the cache) 1394 /******/ var module = __webpack_module_cache__[moduleId] = { 1395 /******/ // no module.id needed 1396 /******/ // no module.loaded needed 1397 /******/ exports: {} 1398 /******/ }; 1399 /******/ 1400 /******/ // Execute the module function 1401 /******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); 1402 /******/ 1403 /******/ // Return the exports of the module 1404 /******/ return module.exports; 1405 /******/ } 1406 /******/ 1407 /************************************************************************/ 1408 /******/ /* webpack/runtime/compat get default export */ 1409 /******/ (() => { 1410 /******/ // getDefaultExport function for compatibility with non-harmony modules 1411 /******/ __webpack_require__.n = (module) => { 1412 /******/ var getter = module && module.__esModule ? 1413 /******/ () => (module['default']) : 1414 /******/ () => (module); 1415 /******/ __webpack_require__.d(getter, { a: getter }); 1416 /******/ return getter; 1417 /******/ }; 1418 /******/ })(); 1419 /******/ 1420 /******/ /* webpack/runtime/define property getters */ 1421 /******/ (() => { 1422 /******/ // define getter functions for harmony exports 1423 /******/ __webpack_require__.d = (exports, definition) => { 1424 /******/ for(var key in definition) { 1425 /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { 1426 /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); 1427 /******/ } 1428 /******/ } 1429 /******/ }; 1430 /******/ })(); 1431 /******/ 1432 /******/ /* webpack/runtime/hasOwnProperty shorthand */ 1433 /******/ (() => { 1434 /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) 1435 /******/ })(); 1436 /******/ 1437 /******/ /* webpack/runtime/make namespace object */ 1438 /******/ (() => { 1439 /******/ // define __esModule on exports 1440 /******/ __webpack_require__.r = (exports) => { 1441 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { 1442 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 1443 /******/ } 1444 /******/ Object.defineProperty(exports, '__esModule', { value: true }); 1445 /******/ }; 1446 /******/ })(); 1447 /******/ 1448 /************************************************************************/ 1449 var __webpack_exports__ = {}; 1450 // This entry need to be wrapped in an IIFE because it need to be in strict mode. 1451 (() => { 1452 "use strict"; 1453 // ESM COMPAT FLAG 1454 __webpack_require__.r(__webpack_exports__); 1455 1456 // EXPORTS 1457 __webpack_require__.d(__webpack_exports__, { 1458 AlignmentToolbar: () => (/* reexport */ AlignmentToolbar), 1459 Autocomplete: () => (/* reexport */ Autocomplete), 1460 AutosaveMonitor: () => (/* reexport */ autosave_monitor), 1461 BlockAlignmentToolbar: () => (/* reexport */ BlockAlignmentToolbar), 1462 BlockControls: () => (/* reexport */ BlockControls), 1463 BlockEdit: () => (/* reexport */ BlockEdit), 1464 BlockEditorKeyboardShortcuts: () => (/* reexport */ BlockEditorKeyboardShortcuts), 1465 BlockFormatControls: () => (/* reexport */ BlockFormatControls), 1466 BlockIcon: () => (/* reexport */ BlockIcon), 1467 BlockInspector: () => (/* reexport */ BlockInspector), 1468 BlockList: () => (/* reexport */ BlockList), 1469 BlockMover: () => (/* reexport */ BlockMover), 1470 BlockNavigationDropdown: () => (/* reexport */ BlockNavigationDropdown), 1471 BlockSelectionClearer: () => (/* reexport */ BlockSelectionClearer), 1472 BlockSettingsMenu: () => (/* reexport */ BlockSettingsMenu), 1473 BlockTitle: () => (/* reexport */ BlockTitle), 1474 BlockToolbar: () => (/* reexport */ BlockToolbar), 1475 CharacterCount: () => (/* reexport */ CharacterCount), 1476 ColorPalette: () => (/* reexport */ ColorPalette), 1477 ContrastChecker: () => (/* reexport */ ContrastChecker), 1478 CopyHandler: () => (/* reexport */ CopyHandler), 1479 DefaultBlockAppender: () => (/* reexport */ DefaultBlockAppender), 1480 DocumentBar: () => (/* reexport */ DocumentBar), 1481 DocumentOutline: () => (/* reexport */ DocumentOutline), 1482 DocumentOutlineCheck: () => (/* reexport */ DocumentOutlineCheck), 1483 EditorHistoryRedo: () => (/* reexport */ editor_history_redo), 1484 EditorHistoryUndo: () => (/* reexport */ editor_history_undo), 1485 EditorKeyboardShortcuts: () => (/* reexport */ EditorKeyboardShortcuts), 1486 EditorKeyboardShortcutsRegister: () => (/* reexport */ register_shortcuts), 1487 EditorNotices: () => (/* reexport */ editor_notices), 1488 EditorProvider: () => (/* reexport */ provider), 1489 EditorSnackbars: () => (/* reexport */ EditorSnackbars), 1490 EntitiesSavedStates: () => (/* reexport */ EntitiesSavedStates), 1491 ErrorBoundary: () => (/* reexport */ error_boundary), 1492 FontSizePicker: () => (/* reexport */ FontSizePicker), 1493 InnerBlocks: () => (/* reexport */ InnerBlocks), 1494 Inserter: () => (/* reexport */ Inserter), 1495 InspectorAdvancedControls: () => (/* reexport */ InspectorAdvancedControls), 1496 InspectorControls: () => (/* reexport */ InspectorControls), 1497 LocalAutosaveMonitor: () => (/* reexport */ local_autosave_monitor), 1498 MediaPlaceholder: () => (/* reexport */ MediaPlaceholder), 1499 MediaUpload: () => (/* reexport */ MediaUpload), 1500 MediaUploadCheck: () => (/* reexport */ MediaUploadCheck), 1501 MultiSelectScrollIntoView: () => (/* reexport */ MultiSelectScrollIntoView), 1502 NavigableToolbar: () => (/* reexport */ NavigableToolbar), 1503 ObserveTyping: () => (/* reexport */ ObserveTyping), 1504 PageAttributesCheck: () => (/* reexport */ page_attributes_check), 1505 PageAttributesOrder: () => (/* reexport */ PageAttributesOrderWithChecks), 1506 PageAttributesPanel: () => (/* reexport */ PageAttributesPanel), 1507 PageAttributesParent: () => (/* reexport */ page_attributes_parent), 1508 PageTemplate: () => (/* reexport */ classic_theme), 1509 PanelColorSettings: () => (/* reexport */ PanelColorSettings), 1510 PlainText: () => (/* reexport */ PlainText), 1511 PluginBlockSettingsMenuItem: () => (/* reexport */ plugin_block_settings_menu_item), 1512 PluginDocumentSettingPanel: () => (/* reexport */ plugin_document_setting_panel), 1513 PluginMoreMenuItem: () => (/* reexport */ plugin_more_menu_item), 1514 PluginPostPublishPanel: () => (/* reexport */ plugin_post_publish_panel), 1515 PluginPostStatusInfo: () => (/* reexport */ plugin_post_status_info), 1516 PluginPrePublishPanel: () => (/* reexport */ plugin_pre_publish_panel), 1517 PluginPreviewMenuItem: () => (/* reexport */ plugin_preview_menu_item), 1518 PluginSidebar: () => (/* reexport */ PluginSidebar), 1519 PluginSidebarMoreMenuItem: () => (/* reexport */ PluginSidebarMoreMenuItem), 1520 PostAuthor: () => (/* reexport */ post_author), 1521 PostAuthorCheck: () => (/* reexport */ PostAuthorCheck), 1522 PostAuthorPanel: () => (/* reexport */ panel), 1523 PostComments: () => (/* reexport */ post_comments), 1524 PostDiscussionPanel: () => (/* reexport */ PostDiscussionPanel), 1525 PostExcerpt: () => (/* reexport */ PostExcerpt), 1526 PostExcerptCheck: () => (/* reexport */ post_excerpt_check), 1527 PostExcerptPanel: () => (/* reexport */ PostExcerptPanel), 1528 PostFeaturedImage: () => (/* reexport */ post_featured_image), 1529 PostFeaturedImageCheck: () => (/* reexport */ post_featured_image_check), 1530 PostFeaturedImagePanel: () => (/* reexport */ PostFeaturedImagePanel), 1531 PostFormat: () => (/* reexport */ PostFormat), 1532 PostFormatCheck: () => (/* reexport */ post_format_check), 1533 PostLastRevision: () => (/* reexport */ post_last_revision), 1534 PostLastRevisionCheck: () => (/* reexport */ post_last_revision_check), 1535 PostLastRevisionPanel: () => (/* reexport */ post_last_revision_panel), 1536 PostLockedModal: () => (/* reexport */ PostLockedModal), 1537 PostPendingStatus: () => (/* reexport */ post_pending_status), 1538 PostPendingStatusCheck: () => (/* reexport */ post_pending_status_check), 1539 PostPingbacks: () => (/* reexport */ post_pingbacks), 1540 PostPreviewButton: () => (/* reexport */ PostPreviewButton), 1541 PostPublishButton: () => (/* reexport */ post_publish_button), 1542 PostPublishButtonLabel: () => (/* reexport */ PublishButtonLabel), 1543 PostPublishPanel: () => (/* reexport */ post_publish_panel), 1544 PostSavedState: () => (/* reexport */ PostSavedState), 1545 PostSchedule: () => (/* reexport */ PostSchedule), 1546 PostScheduleCheck: () => (/* reexport */ PostScheduleCheck), 1547 PostScheduleLabel: () => (/* reexport */ PostScheduleLabel), 1548 PostSchedulePanel: () => (/* reexport */ PostSchedulePanel), 1549 PostSlug: () => (/* reexport */ PostSlug), 1550 PostSlugCheck: () => (/* reexport */ PostSlugCheck), 1551 PostSticky: () => (/* reexport */ PostSticky), 1552 PostStickyCheck: () => (/* reexport */ PostStickyCheck), 1553 PostSwitchToDraftButton: () => (/* reexport */ PostSwitchToDraftButton), 1554 PostSyncStatus: () => (/* reexport */ PostSyncStatus), 1555 PostTaxonomies: () => (/* reexport */ post_taxonomies), 1556 PostTaxonomiesCheck: () => (/* reexport */ PostTaxonomiesCheck), 1557 PostTaxonomiesFlatTermSelector: () => (/* reexport */ FlatTermSelector), 1558 PostTaxonomiesHierarchicalTermSelector: () => (/* reexport */ HierarchicalTermSelector), 1559 PostTaxonomiesPanel: () => (/* reexport */ post_taxonomies_panel), 1560 PostTemplatePanel: () => (/* reexport */ PostTemplatePanel), 1561 PostTextEditor: () => (/* reexport */ PostTextEditor), 1562 PostTitle: () => (/* reexport */ post_title), 1563 PostTitleRaw: () => (/* reexport */ post_title_raw), 1564 PostTrash: () => (/* reexport */ PostTrash), 1565 PostTrashCheck: () => (/* reexport */ PostTrashCheck), 1566 PostTypeSupportCheck: () => (/* reexport */ post_type_support_check), 1567 PostURL: () => (/* reexport */ PostURL), 1568 PostURLCheck: () => (/* reexport */ PostURLCheck), 1569 PostURLLabel: () => (/* reexport */ PostURLLabel), 1570 PostURLPanel: () => (/* reexport */ PostURLPanel), 1571 PostVisibility: () => (/* reexport */ PostVisibility), 1572 PostVisibilityCheck: () => (/* reexport */ PostVisibilityCheck), 1573 PostVisibilityLabel: () => (/* reexport */ PostVisibilityLabel), 1574 RichText: () => (/* reexport */ RichText), 1575 RichTextShortcut: () => (/* reexport */ RichTextShortcut), 1576 RichTextToolbarButton: () => (/* reexport */ RichTextToolbarButton), 1577 ServerSideRender: () => (/* reexport */ (external_wp_serverSideRender_default())), 1578 SkipToSelectedBlock: () => (/* reexport */ SkipToSelectedBlock), 1579 TableOfContents: () => (/* reexport */ table_of_contents), 1580 TextEditorGlobalKeyboardShortcuts: () => (/* reexport */ TextEditorGlobalKeyboardShortcuts), 1581 ThemeSupportCheck: () => (/* reexport */ ThemeSupportCheck), 1582 TimeToRead: () => (/* reexport */ TimeToRead), 1583 URLInput: () => (/* reexport */ URLInput), 1584 URLInputButton: () => (/* reexport */ URLInputButton), 1585 URLPopover: () => (/* reexport */ URLPopover), 1586 UnsavedChangesWarning: () => (/* reexport */ UnsavedChangesWarning), 1587 VisualEditorGlobalKeyboardShortcuts: () => (/* reexport */ VisualEditorGlobalKeyboardShortcuts), 1588 Warning: () => (/* reexport */ Warning), 1589 WordCount: () => (/* reexport */ WordCount), 1590 WritingFlow: () => (/* reexport */ WritingFlow), 1591 __unstableRichTextInputEvent: () => (/* reexport */ __unstableRichTextInputEvent), 1592 cleanForSlug: () => (/* reexport */ cleanForSlug), 1593 createCustomColorsHOC: () => (/* reexport */ createCustomColorsHOC), 1594 getColorClassName: () => (/* reexport */ getColorClassName), 1595 getColorObjectByAttributeValues: () => (/* reexport */ getColorObjectByAttributeValues), 1596 getColorObjectByColorValue: () => (/* reexport */ getColorObjectByColorValue), 1597 getFontSize: () => (/* reexport */ getFontSize), 1598 getFontSizeClass: () => (/* reexport */ getFontSizeClass), 1599 getTemplatePartIcon: () => (/* reexport */ getTemplatePartIcon), 1600 mediaUpload: () => (/* reexport */ mediaUpload), 1601 privateApis: () => (/* reexport */ privateApis), 1602 registerEntityAction: () => (/* reexport */ api_registerEntityAction), 1603 store: () => (/* reexport */ store_store), 1604 storeConfig: () => (/* reexport */ storeConfig), 1605 transformStyles: () => (/* reexport */ external_wp_blockEditor_namespaceObject.transformStyles), 1606 unregisterEntityAction: () => (/* reexport */ api_unregisterEntityAction), 1607 useEntitiesSavedStatesIsDirty: () => (/* reexport */ useIsDirty), 1608 usePostScheduleLabel: () => (/* reexport */ usePostScheduleLabel), 1609 usePostURLLabel: () => (/* reexport */ usePostURLLabel), 1610 usePostVisibilityLabel: () => (/* reexport */ usePostVisibilityLabel), 1611 userAutocompleter: () => (/* reexport */ user), 1612 withColorContext: () => (/* reexport */ withColorContext), 1613 withColors: () => (/* reexport */ withColors), 1614 withFontSizes: () => (/* reexport */ withFontSizes) 1615 }); 1616 1617 // NAMESPACE OBJECT: ./node_modules/@wordpress/editor/build-module/store/selectors.js 1618 var selectors_namespaceObject = {}; 1619 __webpack_require__.r(selectors_namespaceObject); 1620 __webpack_require__.d(selectors_namespaceObject, { 1621 __experimentalGetDefaultTemplatePartAreas: () => (__experimentalGetDefaultTemplatePartAreas), 1622 __experimentalGetDefaultTemplateType: () => (__experimentalGetDefaultTemplateType), 1623 __experimentalGetDefaultTemplateTypes: () => (__experimentalGetDefaultTemplateTypes), 1624 __experimentalGetTemplateInfo: () => (__experimentalGetTemplateInfo), 1625 __unstableIsEditorReady: () => (__unstableIsEditorReady), 1626 canInsertBlockType: () => (canInsertBlockType), 1627 canUserUseUnfilteredHTML: () => (canUserUseUnfilteredHTML), 1628 didPostSaveRequestFail: () => (didPostSaveRequestFail), 1629 didPostSaveRequestSucceed: () => (didPostSaveRequestSucceed), 1630 getActivePostLock: () => (getActivePostLock), 1631 getAdjacentBlockClientId: () => (getAdjacentBlockClientId), 1632 getAutosaveAttribute: () => (getAutosaveAttribute), 1633 getBlock: () => (getBlock), 1634 getBlockAttributes: () => (getBlockAttributes), 1635 getBlockCount: () => (getBlockCount), 1636 getBlockHierarchyRootClientId: () => (getBlockHierarchyRootClientId), 1637 getBlockIndex: () => (getBlockIndex), 1638 getBlockInsertionPoint: () => (getBlockInsertionPoint), 1639 getBlockListSettings: () => (getBlockListSettings), 1640 getBlockMode: () => (getBlockMode), 1641 getBlockName: () => (getBlockName), 1642 getBlockOrder: () => (getBlockOrder), 1643 getBlockRootClientId: () => (getBlockRootClientId), 1644 getBlockSelectionEnd: () => (getBlockSelectionEnd), 1645 getBlockSelectionStart: () => (getBlockSelectionStart), 1646 getBlocks: () => (getBlocks), 1647 getBlocksByClientId: () => (getBlocksByClientId), 1648 getClientIdsOfDescendants: () => (getClientIdsOfDescendants), 1649 getClientIdsWithDescendants: () => (getClientIdsWithDescendants), 1650 getCurrentPost: () => (getCurrentPost), 1651 getCurrentPostAttribute: () => (getCurrentPostAttribute), 1652 getCurrentPostId: () => (getCurrentPostId), 1653 getCurrentPostLastRevisionId: () => (getCurrentPostLastRevisionId), 1654 getCurrentPostRevisionsCount: () => (getCurrentPostRevisionsCount), 1655 getCurrentPostType: () => (getCurrentPostType), 1656 getCurrentTemplateId: () => (getCurrentTemplateId), 1657 getDeviceType: () => (getDeviceType), 1658 getEditedPostAttribute: () => (getEditedPostAttribute), 1659 getEditedPostContent: () => (getEditedPostContent), 1660 getEditedPostPreviewLink: () => (getEditedPostPreviewLink), 1661 getEditedPostSlug: () => (getEditedPostSlug), 1662 getEditedPostVisibility: () => (getEditedPostVisibility), 1663 getEditorBlocks: () => (getEditorBlocks), 1664 getEditorMode: () => (getEditorMode), 1665 getEditorSelection: () => (getEditorSelection), 1666 getEditorSelectionEnd: () => (getEditorSelectionEnd), 1667 getEditorSelectionStart: () => (getEditorSelectionStart), 1668 getEditorSettings: () => (getEditorSettings), 1669 getFirstMultiSelectedBlockClientId: () => (getFirstMultiSelectedBlockClientId), 1670 getGlobalBlockCount: () => (getGlobalBlockCount), 1671 getInserterItems: () => (getInserterItems), 1672 getLastMultiSelectedBlockClientId: () => (getLastMultiSelectedBlockClientId), 1673 getMultiSelectedBlockClientIds: () => (getMultiSelectedBlockClientIds), 1674 getMultiSelectedBlocks: () => (getMultiSelectedBlocks), 1675 getMultiSelectedBlocksEndClientId: () => (getMultiSelectedBlocksEndClientId), 1676 getMultiSelectedBlocksStartClientId: () => (getMultiSelectedBlocksStartClientId), 1677 getNextBlockClientId: () => (getNextBlockClientId), 1678 getPermalink: () => (getPermalink), 1679 getPermalinkParts: () => (getPermalinkParts), 1680 getPostEdits: () => (getPostEdits), 1681 getPostLockUser: () => (getPostLockUser), 1682 getPostTypeLabel: () => (getPostTypeLabel), 1683 getPreviousBlockClientId: () => (getPreviousBlockClientId), 1684 getRenderingMode: () => (getRenderingMode), 1685 getSelectedBlock: () => (getSelectedBlock), 1686 getSelectedBlockClientId: () => (getSelectedBlockClientId), 1687 getSelectedBlockCount: () => (getSelectedBlockCount), 1688 getSelectedBlocksInitialCaretPosition: () => (getSelectedBlocksInitialCaretPosition), 1689 getStateBeforeOptimisticTransaction: () => (getStateBeforeOptimisticTransaction), 1690 getSuggestedPostFormat: () => (getSuggestedPostFormat), 1691 getTemplate: () => (getTemplate), 1692 getTemplateLock: () => (getTemplateLock), 1693 hasChangedContent: () => (hasChangedContent), 1694 hasEditorRedo: () => (hasEditorRedo), 1695 hasEditorUndo: () => (hasEditorUndo), 1696 hasInserterItems: () => (hasInserterItems), 1697 hasMultiSelection: () => (hasMultiSelection), 1698 hasNonPostEntityChanges: () => (hasNonPostEntityChanges), 1699 hasSelectedBlock: () => (hasSelectedBlock), 1700 hasSelectedInnerBlock: () => (hasSelectedInnerBlock), 1701 inSomeHistory: () => (inSomeHistory), 1702 isAncestorMultiSelected: () => (isAncestorMultiSelected), 1703 isAutosavingPost: () => (isAutosavingPost), 1704 isBlockInsertionPointVisible: () => (isBlockInsertionPointVisible), 1705 isBlockMultiSelected: () => (isBlockMultiSelected), 1706 isBlockSelected: () => (isBlockSelected), 1707 isBlockValid: () => (isBlockValid), 1708 isBlockWithinSelection: () => (isBlockWithinSelection), 1709 isCaretWithinFormattedText: () => (isCaretWithinFormattedText), 1710 isCleanNewPost: () => (isCleanNewPost), 1711 isCurrentPostPending: () => (isCurrentPostPending), 1712 isCurrentPostPublished: () => (isCurrentPostPublished), 1713 isCurrentPostScheduled: () => (isCurrentPostScheduled), 1714 isDeletingPost: () => (isDeletingPost), 1715 isEditedPostAutosaveable: () => (isEditedPostAutosaveable), 1716 isEditedPostBeingScheduled: () => (isEditedPostBeingScheduled), 1717 isEditedPostDateFloating: () => (isEditedPostDateFloating), 1718 isEditedPostDirty: () => (isEditedPostDirty), 1719 isEditedPostEmpty: () => (isEditedPostEmpty), 1720 isEditedPostNew: () => (isEditedPostNew), 1721 isEditedPostPublishable: () => (isEditedPostPublishable), 1722 isEditedPostSaveable: () => (isEditedPostSaveable), 1723 isEditorPanelEnabled: () => (isEditorPanelEnabled), 1724 isEditorPanelOpened: () => (isEditorPanelOpened), 1725 isEditorPanelRemoved: () => (isEditorPanelRemoved), 1726 isFirstMultiSelectedBlock: () => (isFirstMultiSelectedBlock), 1727 isInserterOpened: () => (isInserterOpened), 1728 isListViewOpened: () => (isListViewOpened), 1729 isMultiSelecting: () => (isMultiSelecting), 1730 isPermalinkEditable: () => (isPermalinkEditable), 1731 isPostAutosavingLocked: () => (isPostAutosavingLocked), 1732 isPostLockTakeover: () => (isPostLockTakeover), 1733 isPostLocked: () => (isPostLocked), 1734 isPostSavingLocked: () => (isPostSavingLocked), 1735 isPreviewingPost: () => (isPreviewingPost), 1736 isPublishSidebarEnabled: () => (isPublishSidebarEnabled), 1737 isPublishSidebarOpened: () => (isPublishSidebarOpened), 1738 isPublishingPost: () => (isPublishingPost), 1739 isSavingNonPostEntityChanges: () => (isSavingNonPostEntityChanges), 1740 isSavingPost: () => (isSavingPost), 1741 isSelectionEnabled: () => (isSelectionEnabled), 1742 isTyping: () => (isTyping), 1743 isValidTemplate: () => (isValidTemplate) 1744 }); 1745 1746 // NAMESPACE OBJECT: ./node_modules/@wordpress/editor/build-module/store/actions.js 1747 var actions_namespaceObject = {}; 1748 __webpack_require__.r(actions_namespaceObject); 1749 __webpack_require__.d(actions_namespaceObject, { 1750 __experimentalTearDownEditor: () => (__experimentalTearDownEditor), 1751 __unstableSaveForPreview: () => (__unstableSaveForPreview), 1752 autosave: () => (autosave), 1753 clearSelectedBlock: () => (clearSelectedBlock), 1754 closePublishSidebar: () => (closePublishSidebar), 1755 createUndoLevel: () => (createUndoLevel), 1756 disablePublishSidebar: () => (disablePublishSidebar), 1757 editPost: () => (editPost), 1758 enablePublishSidebar: () => (enablePublishSidebar), 1759 enterFormattedText: () => (enterFormattedText), 1760 exitFormattedText: () => (exitFormattedText), 1761 hideInsertionPoint: () => (hideInsertionPoint), 1762 insertBlock: () => (insertBlock), 1763 insertBlocks: () => (insertBlocks), 1764 insertDefaultBlock: () => (insertDefaultBlock), 1765 lockPostAutosaving: () => (lockPostAutosaving), 1766 lockPostSaving: () => (lockPostSaving), 1767 mergeBlocks: () => (mergeBlocks), 1768 moveBlockToPosition: () => (moveBlockToPosition), 1769 moveBlocksDown: () => (moveBlocksDown), 1770 moveBlocksUp: () => (moveBlocksUp), 1771 multiSelect: () => (multiSelect), 1772 openPublishSidebar: () => (openPublishSidebar), 1773 receiveBlocks: () => (receiveBlocks), 1774 redo: () => (redo), 1775 refreshPost: () => (refreshPost), 1776 removeBlock: () => (removeBlock), 1777 removeBlocks: () => (removeBlocks), 1778 removeEditorPanel: () => (removeEditorPanel), 1779 replaceBlock: () => (replaceBlock), 1780 replaceBlocks: () => (replaceBlocks), 1781 resetBlocks: () => (resetBlocks), 1782 resetEditorBlocks: () => (resetEditorBlocks), 1783 resetPost: () => (resetPost), 1784 savePost: () => (savePost), 1785 selectBlock: () => (selectBlock), 1786 setDeviceType: () => (setDeviceType), 1787 setEditedPost: () => (setEditedPost), 1788 setIsInserterOpened: () => (setIsInserterOpened), 1789 setIsListViewOpened: () => (setIsListViewOpened), 1790 setRenderingMode: () => (setRenderingMode), 1791 setTemplateValidity: () => (setTemplateValidity), 1792 setupEditor: () => (setupEditor), 1793 setupEditorState: () => (setupEditorState), 1794 showInsertionPoint: () => (showInsertionPoint), 1795 startMultiSelect: () => (startMultiSelect), 1796 startTyping: () => (startTyping), 1797 stopMultiSelect: () => (stopMultiSelect), 1798 stopTyping: () => (stopTyping), 1799 switchEditorMode: () => (switchEditorMode), 1800 synchronizeTemplate: () => (synchronizeTemplate), 1801 toggleBlockMode: () => (toggleBlockMode), 1802 toggleDistractionFree: () => (toggleDistractionFree), 1803 toggleEditorPanelEnabled: () => (toggleEditorPanelEnabled), 1804 toggleEditorPanelOpened: () => (toggleEditorPanelOpened), 1805 togglePublishSidebar: () => (togglePublishSidebar), 1806 toggleSelection: () => (toggleSelection), 1807 trashPost: () => (trashPost), 1808 undo: () => (undo), 1809 unlockPostAutosaving: () => (unlockPostAutosaving), 1810 unlockPostSaving: () => (unlockPostSaving), 1811 updateBlock: () => (updateBlock), 1812 updateBlockAttributes: () => (updateBlockAttributes), 1813 updateBlockListSettings: () => (updateBlockListSettings), 1814 updateEditorSettings: () => (updateEditorSettings), 1815 updatePost: () => (updatePost), 1816 updatePostLock: () => (updatePostLock) 1817 }); 1818 1819 // NAMESPACE OBJECT: ./node_modules/@wordpress/editor/build-module/store/private-actions.js 1820 var store_private_actions_namespaceObject = {}; 1821 __webpack_require__.r(store_private_actions_namespaceObject); 1822 __webpack_require__.d(store_private_actions_namespaceObject, { 1823 createTemplate: () => (createTemplate), 1824 hideBlockTypes: () => (hideBlockTypes), 1825 registerEntityAction: () => (registerEntityAction), 1826 registerPostTypeActions: () => (registerPostTypeActions), 1827 removeTemplates: () => (removeTemplates), 1828 revertTemplate: () => (revertTemplate), 1829 saveDirtyEntities: () => (saveDirtyEntities), 1830 setCurrentTemplateId: () => (setCurrentTemplateId), 1831 setIsReady: () => (setIsReady), 1832 showBlockTypes: () => (showBlockTypes), 1833 unregisterEntityAction: () => (unregisterEntityAction) 1834 }); 1835 1836 // NAMESPACE OBJECT: ./node_modules/@wordpress/editor/build-module/store/private-selectors.js 1837 var store_private_selectors_namespaceObject = {}; 1838 __webpack_require__.r(store_private_selectors_namespaceObject); 1839 __webpack_require__.d(store_private_selectors_namespaceObject, { 1840 getEntityActions: () => (private_selectors_getEntityActions), 1841 getInserterSidebarToggleRef: () => (getInserterSidebarToggleRef), 1842 getInsertionPoint: () => (getInsertionPoint), 1843 getListViewToggleRef: () => (getListViewToggleRef), 1844 getPostBlocksByName: () => (getPostBlocksByName), 1845 getPostIcon: () => (getPostIcon), 1846 hasPostMetaChanges: () => (hasPostMetaChanges), 1847 isEntityReady: () => (private_selectors_isEntityReady) 1848 }); 1849 1850 // NAMESPACE OBJECT: ./node_modules/@wordpress/interface/build-module/store/actions.js 1851 var store_actions_namespaceObject = {}; 1852 __webpack_require__.r(store_actions_namespaceObject); 1853 __webpack_require__.d(store_actions_namespaceObject, { 1854 closeModal: () => (closeModal), 1855 disableComplementaryArea: () => (disableComplementaryArea), 1856 enableComplementaryArea: () => (enableComplementaryArea), 1857 openModal: () => (openModal), 1858 pinItem: () => (pinItem), 1859 setDefaultComplementaryArea: () => (setDefaultComplementaryArea), 1860 setFeatureDefaults: () => (setFeatureDefaults), 1861 setFeatureValue: () => (setFeatureValue), 1862 toggleFeature: () => (toggleFeature), 1863 unpinItem: () => (unpinItem) 1864 }); 1865 1866 // NAMESPACE OBJECT: ./node_modules/@wordpress/interface/build-module/store/selectors.js 1867 var store_selectors_namespaceObject = {}; 1868 __webpack_require__.r(store_selectors_namespaceObject); 1869 __webpack_require__.d(store_selectors_namespaceObject, { 1870 getActiveComplementaryArea: () => (getActiveComplementaryArea), 1871 isComplementaryAreaLoading: () => (isComplementaryAreaLoading), 1872 isFeatureActive: () => (isFeatureActive), 1873 isItemPinned: () => (isItemPinned), 1874 isModalActive: () => (isModalActive) 1875 }); 1876 1877 // NAMESPACE OBJECT: ./node_modules/@wordpress/interface/build-module/index.js 1878 var build_module_namespaceObject = {}; 1879 __webpack_require__.r(build_module_namespaceObject); 1880 __webpack_require__.d(build_module_namespaceObject, { 1881 ActionItem: () => (action_item), 1882 ComplementaryArea: () => (complementary_area), 1883 ComplementaryAreaMoreMenuItem: () => (ComplementaryAreaMoreMenuItem), 1884 FullscreenMode: () => (fullscreen_mode), 1885 InterfaceSkeleton: () => (interface_skeleton), 1886 NavigableRegion: () => (navigable_region), 1887 PinnedItems: () => (pinned_items), 1888 store: () => (store) 1889 }); 1890 1891 ;// CONCATENATED MODULE: external ["wp","data"] 1892 const external_wp_data_namespaceObject = window["wp"]["data"]; 1893 ;// CONCATENATED MODULE: external ["wp","coreData"] 1894 const external_wp_coreData_namespaceObject = window["wp"]["coreData"]; 1895 ;// CONCATENATED MODULE: external ["wp","element"] 1896 const external_wp_element_namespaceObject = window["wp"]["element"]; 1897 ;// CONCATENATED MODULE: external ["wp","compose"] 1898 const external_wp_compose_namespaceObject = window["wp"]["compose"]; 1899 ;// CONCATENATED MODULE: external ["wp","hooks"] 1900 const external_wp_hooks_namespaceObject = window["wp"]["hooks"]; 1901 ;// CONCATENATED MODULE: external ["wp","blockEditor"] 1902 const external_wp_blockEditor_namespaceObject = window["wp"]["blockEditor"]; 1903 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/store/defaults.js 1904 /** 1905 * WordPress dependencies 1906 */ 1907 1908 1909 /** 1910 * The default post editor settings. 1911 * 1912 * @property {boolean|Array} allowedBlockTypes Allowed block types 1913 * @property {boolean} richEditingEnabled Whether rich editing is enabled or not 1914 * @property {boolean} codeEditingEnabled Whether code editing is enabled or not 1915 * @property {boolean} fontLibraryEnabled Whether the font library is enabled or not. 1916 * @property {boolean} enableCustomFields Whether the WordPress custom fields are enabled or not. 1917 * true = the user has opted to show the Custom Fields panel at the bottom of the editor. 1918 * false = the user has opted to hide the Custom Fields panel at the bottom of the editor. 1919 * undefined = the current environment does not support Custom Fields, so the option toggle in Preferences -> Panels to enable the Custom Fields panel is not displayed. 1920 * @property {number} autosaveInterval How often in seconds the post will be auto-saved via the REST API. 1921 * @property {number} localAutosaveInterval How often in seconds the post will be backed up to sessionStorage. 1922 * @property {Array?} availableTemplates The available post templates 1923 * @property {boolean} disablePostFormats Whether or not the post formats are disabled 1924 * @property {Array?} allowedMimeTypes List of allowed mime types and file extensions 1925 * @property {number} maxUploadFileSize Maximum upload file size 1926 * @property {boolean} supportsLayout Whether the editor supports layouts. 1927 */ 1928 const EDITOR_SETTINGS_DEFAULTS = { 1929 ...external_wp_blockEditor_namespaceObject.SETTINGS_DEFAULTS, 1930 richEditingEnabled: true, 1931 codeEditingEnabled: true, 1932 fontLibraryEnabled: true, 1933 enableCustomFields: undefined, 1934 defaultRenderingMode: 'post-only' 1935 }; 1936 1937 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/dataviews/store/reducer.js 1938 /** 1939 * WordPress dependencies 1940 */ 1941 1942 function isReady(state = {}, action) { 1943 switch (action.type) { 1944 case 'SET_IS_READY': 1945 return { 1946 ...state, 1947 [action.kind]: { 1948 ...state[action.kind], 1949 [action.name]: true 1950 } 1951 }; 1952 } 1953 return state; 1954 } 1955 function actions(state = {}, action) { 1956 var _state$action$kind$ac; 1957 switch (action.type) { 1958 case 'REGISTER_ENTITY_ACTION': 1959 return { 1960 ...state, 1961 [action.kind]: { 1962 ...state[action.kind], 1963 [action.name]: [...((_state$action$kind$ac = state[action.kind]?.[action.name]) !== null && _state$action$kind$ac !== void 0 ? _state$action$kind$ac : []).filter(_action => _action.id !== action.config.id), action.config] 1964 } 1965 }; 1966 case 'UNREGISTER_ENTITY_ACTION': 1967 { 1968 var _state$action$kind$ac2; 1969 return { 1970 ...state, 1971 [action.kind]: { 1972 ...state[action.kind], 1973 [action.name]: ((_state$action$kind$ac2 = state[action.kind]?.[action.name]) !== null && _state$action$kind$ac2 !== void 0 ? _state$action$kind$ac2 : []).filter(_action => _action.id !== action.actionId) 1974 } 1975 }; 1976 } 1977 } 1978 return state; 1979 } 1980 /* harmony default export */ const reducer = ((0,external_wp_data_namespaceObject.combineReducers)({ 1981 actions, 1982 isReady 1983 })); 1984 1985 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/store/reducer.js 1986 /** 1987 * WordPress dependencies 1988 */ 1989 1990 1991 /** 1992 * Internal dependencies 1993 */ 1994 1995 1996 1997 /** 1998 * Returns a post attribute value, flattening nested rendered content using its 1999 * raw value in place of its original object form. 2000 * 2001 * @param {*} value Original value. 2002 * 2003 * @return {*} Raw value. 2004 */ 2005 function getPostRawValue(value) { 2006 if (value && 'object' === typeof value && 'raw' in value) { 2007 return value.raw; 2008 } 2009 return value; 2010 } 2011 2012 /** 2013 * Returns true if the two object arguments have the same keys, or false 2014 * otherwise. 2015 * 2016 * @param {Object} a First object. 2017 * @param {Object} b Second object. 2018 * 2019 * @return {boolean} Whether the two objects have the same keys. 2020 */ 2021 function hasSameKeys(a, b) { 2022 const keysA = Object.keys(a).sort(); 2023 const keysB = Object.keys(b).sort(); 2024 return keysA.length === keysB.length && keysA.every((key, index) => keysB[index] === key); 2025 } 2026 2027 /** 2028 * Returns true if, given the currently dispatching action and the previously 2029 * dispatched action, the two actions are editing the same post property, or 2030 * false otherwise. 2031 * 2032 * @param {Object} action Currently dispatching action. 2033 * @param {Object} previousAction Previously dispatched action. 2034 * 2035 * @return {boolean} Whether actions are updating the same post property. 2036 */ 2037 function isUpdatingSamePostProperty(action, previousAction) { 2038 return action.type === 'EDIT_POST' && hasSameKeys(action.edits, previousAction.edits); 2039 } 2040 2041 /** 2042 * Returns true if, given the currently dispatching action and the previously 2043 * dispatched action, the two actions are modifying the same property such that 2044 * undo history should be batched. 2045 * 2046 * @param {Object} action Currently dispatching action. 2047 * @param {Object} previousAction Previously dispatched action. 2048 * 2049 * @return {boolean} Whether to overwrite present state. 2050 */ 2051 function shouldOverwriteState(action, previousAction) { 2052 if (action.type === 'RESET_EDITOR_BLOCKS') { 2053 return !action.shouldCreateUndoLevel; 2054 } 2055 if (!previousAction || action.type !== previousAction.type) { 2056 return false; 2057 } 2058 return isUpdatingSamePostProperty(action, previousAction); 2059 } 2060 function postId(state = null, action) { 2061 switch (action.type) { 2062 case 'SET_EDITED_POST': 2063 return action.postId; 2064 } 2065 return state; 2066 } 2067 function templateId(state = null, action) { 2068 switch (action.type) { 2069 case 'SET_CURRENT_TEMPLATE_ID': 2070 return action.id; 2071 } 2072 return state; 2073 } 2074 function postType(state = null, action) { 2075 switch (action.type) { 2076 case 'SET_EDITED_POST': 2077 return action.postType; 2078 } 2079 return state; 2080 } 2081 2082 /** 2083 * Reducer returning whether the post blocks match the defined template or not. 2084 * 2085 * @param {Object} state Current state. 2086 * @param {Object} action Dispatched action. 2087 * 2088 * @return {boolean} Updated state. 2089 */ 2090 function template(state = { 2091 isValid: true 2092 }, action) { 2093 switch (action.type) { 2094 case 'SET_TEMPLATE_VALIDITY': 2095 return { 2096 ...state, 2097 isValid: action.isValid 2098 }; 2099 } 2100 return state; 2101 } 2102 2103 /** 2104 * Reducer returning current network request state (whether a request to 2105 * the WP REST API is in progress, successful, or failed). 2106 * 2107 * @param {Object} state Current state. 2108 * @param {Object} action Dispatched action. 2109 * 2110 * @return {Object} Updated state. 2111 */ 2112 function saving(state = {}, action) { 2113 switch (action.type) { 2114 case 'REQUEST_POST_UPDATE_START': 2115 case 'REQUEST_POST_UPDATE_FINISH': 2116 return { 2117 pending: action.type === 'REQUEST_POST_UPDATE_START', 2118 options: action.options || {} 2119 }; 2120 } 2121 return state; 2122 } 2123 2124 /** 2125 * Reducer returning deleting post request state. 2126 * 2127 * @param {Object} state Current state. 2128 * @param {Object} action Dispatched action. 2129 * 2130 * @return {Object} Updated state. 2131 */ 2132 function deleting(state = {}, action) { 2133 switch (action.type) { 2134 case 'REQUEST_POST_DELETE_START': 2135 case 'REQUEST_POST_DELETE_FINISH': 2136 return { 2137 pending: action.type === 'REQUEST_POST_DELETE_START' 2138 }; 2139 } 2140 return state; 2141 } 2142 2143 /** 2144 * Post Lock State. 2145 * 2146 * @typedef {Object} PostLockState 2147 * 2148 * @property {boolean} isLocked Whether the post is locked. 2149 * @property {?boolean} isTakeover Whether the post editing has been taken over. 2150 * @property {?boolean} activePostLock Active post lock value. 2151 * @property {?Object} user User that took over the post. 2152 */ 2153 2154 /** 2155 * Reducer returning the post lock status. 2156 * 2157 * @param {PostLockState} state Current state. 2158 * @param {Object} action Dispatched action. 2159 * 2160 * @return {PostLockState} Updated state. 2161 */ 2162 function postLock(state = { 2163 isLocked: false 2164 }, action) { 2165 switch (action.type) { 2166 case 'UPDATE_POST_LOCK': 2167 return action.lock; 2168 } 2169 return state; 2170 } 2171 2172 /** 2173 * Post saving lock. 2174 * 2175 * When post saving is locked, the post cannot be published or updated. 2176 * 2177 * @param {PostLockState} state Current state. 2178 * @param {Object} action Dispatched action. 2179 * 2180 * @return {PostLockState} Updated state. 2181 */ 2182 function postSavingLock(state = {}, action) { 2183 switch (action.type) { 2184 case 'LOCK_POST_SAVING': 2185 return { 2186 ...state, 2187 [action.lockName]: true 2188 }; 2189 case 'UNLOCK_POST_SAVING': 2190 { 2191 const { 2192 [action.lockName]: removedLockName, 2193 ...restState 2194 } = state; 2195 return restState; 2196 } 2197 } 2198 return state; 2199 } 2200 2201 /** 2202 * Post autosaving lock. 2203 * 2204 * When post autosaving is locked, the post will not autosave. 2205 * 2206 * @param {PostLockState} state Current state. 2207 * @param {Object} action Dispatched action. 2208 * 2209 * @return {PostLockState} Updated state. 2210 */ 2211 function postAutosavingLock(state = {}, action) { 2212 switch (action.type) { 2213 case 'LOCK_POST_AUTOSAVING': 2214 return { 2215 ...state, 2216 [action.lockName]: true 2217 }; 2218 case 'UNLOCK_POST_AUTOSAVING': 2219 { 2220 const { 2221 [action.lockName]: removedLockName, 2222 ...restState 2223 } = state; 2224 return restState; 2225 } 2226 } 2227 return state; 2228 } 2229 2230 /** 2231 * Reducer returning the post editor setting. 2232 * 2233 * @param {Object} state Current state. 2234 * @param {Object} action Dispatched action. 2235 * 2236 * @return {Object} Updated state. 2237 */ 2238 function editorSettings(state = EDITOR_SETTINGS_DEFAULTS, action) { 2239 switch (action.type) { 2240 case 'UPDATE_EDITOR_SETTINGS': 2241 return { 2242 ...state, 2243 ...action.settings 2244 }; 2245 } 2246 return state; 2247 } 2248 function renderingMode(state = 'post-only', action) { 2249 switch (action.type) { 2250 case 'SET_RENDERING_MODE': 2251 return action.mode; 2252 } 2253 return state; 2254 } 2255 2256 /** 2257 * Reducer returning the editing canvas device type. 2258 * 2259 * @param {Object} state Current state. 2260 * @param {Object} action Dispatched action. 2261 * 2262 * @return {Object} Updated state. 2263 */ 2264 function deviceType(state = 'Desktop', action) { 2265 switch (action.type) { 2266 case 'SET_DEVICE_TYPE': 2267 return action.deviceType; 2268 } 2269 return state; 2270 } 2271 2272 /** 2273 * Reducer storing the list of all programmatically removed panels. 2274 * 2275 * @param {Array} state Current state. 2276 * @param {Object} action Action object. 2277 * 2278 * @return {Array} Updated state. 2279 */ 2280 function removedPanels(state = [], action) { 2281 switch (action.type) { 2282 case 'REMOVE_PANEL': 2283 if (!state.includes(action.panelName)) { 2284 return [...state, action.panelName]; 2285 } 2286 } 2287 return state; 2288 } 2289 2290 /** 2291 * Reducer to set the block inserter panel open or closed. 2292 * 2293 * Note: this reducer interacts with the list view panel reducer 2294 * to make sure that only one of the two panels is open at the same time. 2295 * 2296 * @param {Object} state Current state. 2297 * @param {Object} action Dispatched action. 2298 */ 2299 function blockInserterPanel(state = false, action) { 2300 switch (action.type) { 2301 case 'SET_IS_LIST_VIEW_OPENED': 2302 return action.isOpen ? false : state; 2303 case 'SET_IS_INSERTER_OPENED': 2304 return action.value; 2305 } 2306 return state; 2307 } 2308 2309 /** 2310 * Reducer to set the list view panel open or closed. 2311 * 2312 * Note: this reducer interacts with the inserter panel reducer 2313 * to make sure that only one of the two panels is open at the same time. 2314 * 2315 * @param {Object} state Current state. 2316 * @param {Object} action Dispatched action. 2317 */ 2318 function listViewPanel(state = false, action) { 2319 switch (action.type) { 2320 case 'SET_IS_INSERTER_OPENED': 2321 return action.value ? false : state; 2322 case 'SET_IS_LIST_VIEW_OPENED': 2323 return action.isOpen; 2324 } 2325 return state; 2326 } 2327 2328 /** 2329 * This reducer does nothing aside initializing a ref to the list view toggle. 2330 * We will have a unique ref per "editor" instance. 2331 * 2332 * @param {Object} state 2333 * @return {Object} Reference to the list view toggle button. 2334 */ 2335 function listViewToggleRef(state = { 2336 current: null 2337 }) { 2338 return state; 2339 } 2340 2341 /** 2342 * This reducer does nothing aside initializing a ref to the inserter sidebar toggle. 2343 * We will have a unique ref per "editor" instance. 2344 * 2345 * @param {Object} state 2346 * @return {Object} Reference to the inserter sidebar toggle button. 2347 */ 2348 function inserterSidebarToggleRef(state = { 2349 current: null 2350 }) { 2351 return state; 2352 } 2353 function publishSidebarActive(state = false, action) { 2354 switch (action.type) { 2355 case 'OPEN_PUBLISH_SIDEBAR': 2356 return true; 2357 case 'CLOSE_PUBLISH_SIDEBAR': 2358 return false; 2359 case 'TOGGLE_PUBLISH_SIDEBAR': 2360 return !state; 2361 } 2362 return state; 2363 } 2364 /* harmony default export */ const store_reducer = ((0,external_wp_data_namespaceObject.combineReducers)({ 2365 postId, 2366 postType, 2367 templateId, 2368 saving, 2369 deleting, 2370 postLock, 2371 template, 2372 postSavingLock, 2373 editorSettings, 2374 postAutosavingLock, 2375 renderingMode, 2376 deviceType, 2377 removedPanels, 2378 blockInserterPanel, 2379 inserterSidebarToggleRef, 2380 listViewPanel, 2381 listViewToggleRef, 2382 publishSidebarActive, 2383 dataviews: reducer 2384 })); 2385 2386 ;// CONCATENATED MODULE: external ["wp","blocks"] 2387 const external_wp_blocks_namespaceObject = window["wp"]["blocks"]; 2388 ;// CONCATENATED MODULE: external ["wp","date"] 2389 const external_wp_date_namespaceObject = window["wp"]["date"]; 2390 ;// CONCATENATED MODULE: external ["wp","url"] 2391 const external_wp_url_namespaceObject = window["wp"]["url"]; 2392 ;// CONCATENATED MODULE: external ["wp","deprecated"] 2393 const external_wp_deprecated_namespaceObject = window["wp"]["deprecated"]; 2394 var external_wp_deprecated_default = /*#__PURE__*/__webpack_require__.n(external_wp_deprecated_namespaceObject); 2395 ;// CONCATENATED MODULE: external ["wp","primitives"] 2396 const external_wp_primitives_namespaceObject = window["wp"]["primitives"]; 2397 ;// CONCATENATED MODULE: external "ReactJSXRuntime" 2398 const external_ReactJSXRuntime_namespaceObject = window["ReactJSXRuntime"]; 2399 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/layout.js 2400 /** 2401 * WordPress dependencies 2402 */ 2403 2404 2405 const layout = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 2406 xmlns: "http://www.w3.org/2000/svg", 2407 viewBox: "0 0 24 24", 2408 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 2409 d: "M18 5.5H6a.5.5 0 00-.5.5v3h13V6a.5.5 0 00-.5-.5zm.5 5H10v8h8a.5.5 0 00.5-.5v-7.5zm-10 0h-3V18a.5.5 0 00.5.5h2.5v-8zM6 4h12a2 2 0 012 2v12a2 2 0 01-2 2H6a2 2 0 01-2-2V6a2 2 0 012-2z" 2410 }) 2411 }); 2412 /* harmony default export */ const library_layout = (layout); 2413 2414 ;// CONCATENATED MODULE: external ["wp","preferences"] 2415 const external_wp_preferences_namespaceObject = window["wp"]["preferences"]; 2416 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/store/constants.js 2417 /** 2418 * Set of post properties for which edits should assume a merging behavior, 2419 * assuming an object value. 2420 * 2421 * @type {Set} 2422 */ 2423 const EDIT_MERGE_PROPERTIES = new Set(['meta']); 2424 2425 /** 2426 * Constant for the store module (or reducer) key. 2427 * 2428 * @type {string} 2429 */ 2430 const STORE_NAME = 'core/editor'; 2431 const SAVE_POST_NOTICE_ID = 'SAVE_POST_NOTICE_ID'; 2432 const TRASH_POST_NOTICE_ID = 'TRASH_POST_NOTICE_ID'; 2433 const PERMALINK_POSTNAME_REGEX = /%(?:postname|pagename)%/; 2434 const ONE_MINUTE_IN_MS = 60 * 1000; 2435 const AUTOSAVE_PROPERTIES = ['title', 'excerpt', 'content']; 2436 const TEMPLATE_PART_AREA_DEFAULT_CATEGORY = 'uncategorized'; 2437 const TEMPLATE_POST_TYPE = 'wp_template'; 2438 const TEMPLATE_PART_POST_TYPE = 'wp_template_part'; 2439 const PATTERN_POST_TYPE = 'wp_block'; 2440 const NAVIGATION_POST_TYPE = 'wp_navigation'; 2441 const TEMPLATE_ORIGINS = { 2442 custom: 'custom', 2443 theme: 'theme', 2444 plugin: 'plugin' 2445 }; 2446 const TEMPLATE_POST_TYPES = ['wp_template', 'wp_template_part']; 2447 const GLOBAL_POST_TYPES = [...TEMPLATE_POST_TYPES, 'wp_block', 'wp_navigation']; 2448 2449 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/header.js 2450 /** 2451 * WordPress dependencies 2452 */ 2453 2454 2455 const header = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 2456 xmlns: "http://www.w3.org/2000/svg", 2457 viewBox: "0 0 24 24", 2458 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 2459 d: "M18.5 10.5H10v8h8a.5.5 0 00.5-.5v-7.5zm-10 0h-3V18a.5.5 0 00.5.5h2.5v-8zM6 4h12a2 2 0 012 2v12a2 2 0 01-2 2H6a2 2 0 01-2-2V6a2 2 0 012-2z" 2460 }) 2461 }); 2462 /* harmony default export */ const library_header = (header); 2463 2464 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/footer.js 2465 /** 2466 * WordPress dependencies 2467 */ 2468 2469 2470 const footer = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 2471 xmlns: "http://www.w3.org/2000/svg", 2472 viewBox: "0 0 24 24", 2473 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 2474 fillRule: "evenodd", 2475 d: "M18 5.5h-8v8h8.5V6a.5.5 0 00-.5-.5zm-9.5 8h-3V6a.5.5 0 01.5-.5h2.5v8zM6 4h12a2 2 0 012 2v12a2 2 0 01-2 2H6a2 2 0 01-2-2V6a2 2 0 012-2z" 2476 }) 2477 }); 2478 /* harmony default export */ const library_footer = (footer); 2479 2480 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/sidebar.js 2481 /** 2482 * WordPress dependencies 2483 */ 2484 2485 2486 const sidebar = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 2487 xmlns: "http://www.w3.org/2000/svg", 2488 viewBox: "0 0 24 24", 2489 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 2490 d: "M18 5.5H6a.5.5 0 00-.5.5v3h13V6a.5.5 0 00-.5-.5zm.5 5H10v8h8a.5.5 0 00.5-.5v-7.5zM6 4h12a2 2 0 012 2v12a2 2 0 01-2 2H6a2 2 0 01-2-2V6a2 2 0 012-2z" 2491 }) 2492 }); 2493 /* harmony default export */ const library_sidebar = (sidebar); 2494 2495 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/symbol-filled.js 2496 /** 2497 * WordPress dependencies 2498 */ 2499 2500 2501 const symbolFilled = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 2502 xmlns: "http://www.w3.org/2000/svg", 2503 viewBox: "0 0 24 24", 2504 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 2505 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-17.6 1L10 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" 2506 }) 2507 }); 2508 /* harmony default export */ const symbol_filled = (symbolFilled); 2509 2510 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/utils/get-template-part-icon.js 2511 /** 2512 * WordPress dependencies 2513 */ 2514 2515 /** 2516 * Helper function to retrieve the corresponding icon by name. 2517 * 2518 * @param {string} iconName The name of the icon. 2519 * 2520 * @return {Object} The corresponding icon. 2521 */ 2522 function getTemplatePartIcon(iconName) { 2523 if ('header' === iconName) { 2524 return library_header; 2525 } else if ('footer' === iconName) { 2526 return library_footer; 2527 } else if ('sidebar' === iconName) { 2528 return library_sidebar; 2529 } 2530 return symbol_filled; 2531 } 2532 2533 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/store/selectors.js 2534 /** 2535 * WordPress dependencies 2536 */ 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 /** 2549 * Internal dependencies 2550 */ 2551 2552 2553 2554 2555 /** 2556 * Shared reference to an empty object for cases where it is important to avoid 2557 * returning a new object reference on every invocation, as in a connected or 2558 * other pure component which performs `shouldComponentUpdate` check on props. 2559 * This should be used as a last resort, since the normalized data should be 2560 * maintained by the reducer result in state. 2561 */ 2562 const EMPTY_OBJECT = {}; 2563 2564 /** 2565 * Returns true if any past editor history snapshots exist, or false otherwise. 2566 * 2567 * @param {Object} state Global application state. 2568 * 2569 * @return {boolean} Whether undo history exists. 2570 */ 2571 const hasEditorUndo = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => () => { 2572 return select(external_wp_coreData_namespaceObject.store).hasUndo(); 2573 }); 2574 2575 /** 2576 * Returns true if any future editor history snapshots exist, or false 2577 * otherwise. 2578 * 2579 * @param {Object} state Global application state. 2580 * 2581 * @return {boolean} Whether redo history exists. 2582 */ 2583 const hasEditorRedo = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => () => { 2584 return select(external_wp_coreData_namespaceObject.store).hasRedo(); 2585 }); 2586 2587 /** 2588 * Returns true if the currently edited post is yet to be saved, or false if 2589 * the post has been saved. 2590 * 2591 * @param {Object} state Global application state. 2592 * 2593 * @return {boolean} Whether the post is new. 2594 */ 2595 function isEditedPostNew(state) { 2596 return getCurrentPost(state).status === 'auto-draft'; 2597 } 2598 2599 /** 2600 * Returns true if content includes unsaved changes, or false otherwise. 2601 * 2602 * @param {Object} state Editor state. 2603 * 2604 * @return {boolean} Whether content includes unsaved changes. 2605 */ 2606 function hasChangedContent(state) { 2607 const edits = getPostEdits(state); 2608 return 'content' in edits; 2609 } 2610 2611 /** 2612 * Returns true if there are unsaved values for the current edit session, or 2613 * false if the editing state matches the saved or new post. 2614 * 2615 * @param {Object} state Global application state. 2616 * 2617 * @return {boolean} Whether unsaved values exist. 2618 */ 2619 const isEditedPostDirty = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => state => { 2620 // Edits should contain only fields which differ from the saved post (reset 2621 // at initial load and save complete). Thus, a non-empty edits state can be 2622 // inferred to contain unsaved values. 2623 const postType = getCurrentPostType(state); 2624 const postId = getCurrentPostId(state); 2625 return select(external_wp_coreData_namespaceObject.store).hasEditsForEntityRecord('postType', postType, postId); 2626 }); 2627 2628 /** 2629 * Returns true if there are unsaved edits for entities other than 2630 * the editor's post, and false otherwise. 2631 * 2632 * @param {Object} state Global application state. 2633 * 2634 * @return {boolean} Whether there are edits or not. 2635 */ 2636 const hasNonPostEntityChanges = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => state => { 2637 const dirtyEntityRecords = select(external_wp_coreData_namespaceObject.store).__experimentalGetDirtyEntityRecords(); 2638 const { 2639 type, 2640 id 2641 } = getCurrentPost(state); 2642 return dirtyEntityRecords.some(entityRecord => entityRecord.kind !== 'postType' || entityRecord.name !== type || entityRecord.key !== id); 2643 }); 2644 2645 /** 2646 * Returns true if there are no unsaved values for the current edit session and 2647 * if the currently edited post is new (has never been saved before). 2648 * 2649 * @param {Object} state Global application state. 2650 * 2651 * @return {boolean} Whether new post and unsaved values exist. 2652 */ 2653 function isCleanNewPost(state) { 2654 return !isEditedPostDirty(state) && isEditedPostNew(state); 2655 } 2656 2657 /** 2658 * Returns the post currently being edited in its last known saved state, not 2659 * including unsaved edits. Returns an object containing relevant default post 2660 * values if the post has not yet been saved. 2661 * 2662 * @param {Object} state Global application state. 2663 * 2664 * @return {Object} Post object. 2665 */ 2666 const getCurrentPost = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => state => { 2667 const postId = getCurrentPostId(state); 2668 const postType = getCurrentPostType(state); 2669 const post = select(external_wp_coreData_namespaceObject.store).getRawEntityRecord('postType', postType, postId); 2670 if (post) { 2671 return post; 2672 } 2673 2674 // This exists for compatibility with the previous selector behavior 2675 // which would guarantee an object return based on the editor reducer's 2676 // default empty object state. 2677 return EMPTY_OBJECT; 2678 }); 2679 2680 /** 2681 * Returns the post type of the post currently being edited. 2682 * 2683 * @param {Object} state Global application state. 2684 * 2685 * @return {string} Post type. 2686 */ 2687 function getCurrentPostType(state) { 2688 return state.postType; 2689 } 2690 2691 /** 2692 * Returns the ID of the post currently being edited, or null if the post has 2693 * not yet been saved. 2694 * 2695 * @param {Object} state Global application state. 2696 * 2697 * @return {?number} ID of current post. 2698 */ 2699 function getCurrentPostId(state) { 2700 return state.postId; 2701 } 2702 2703 /** 2704 * Returns the template ID currently being rendered/edited 2705 * 2706 * @param {Object} state Global application state. 2707 * 2708 * @return {string?} Template ID. 2709 */ 2710 function getCurrentTemplateId(state) { 2711 return state.templateId; 2712 } 2713 2714 /** 2715 * Returns the number of revisions of the post currently being edited. 2716 * 2717 * @param {Object} state Global application state. 2718 * 2719 * @return {number} Number of revisions. 2720 */ 2721 function getCurrentPostRevisionsCount(state) { 2722 var _getCurrentPost$_link; 2723 return (_getCurrentPost$_link = getCurrentPost(state)._links?.['version-history']?.[0]?.count) !== null && _getCurrentPost$_link !== void 0 ? _getCurrentPost$_link : 0; 2724 } 2725 2726 /** 2727 * Returns the last revision ID of the post currently being edited, 2728 * or null if the post has no revisions. 2729 * 2730 * @param {Object} state Global application state. 2731 * 2732 * @return {?number} ID of the last revision. 2733 */ 2734 function getCurrentPostLastRevisionId(state) { 2735 var _getCurrentPost$_link2; 2736 return (_getCurrentPost$_link2 = getCurrentPost(state)._links?.['predecessor-version']?.[0]?.id) !== null && _getCurrentPost$_link2 !== void 0 ? _getCurrentPost$_link2 : null; 2737 } 2738 2739 /** 2740 * Returns any post values which have been changed in the editor but not yet 2741 * been saved. 2742 * 2743 * @param {Object} state Global application state. 2744 * 2745 * @return {Object} Object of key value pairs comprising unsaved edits. 2746 */ 2747 const getPostEdits = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => state => { 2748 const postType = getCurrentPostType(state); 2749 const postId = getCurrentPostId(state); 2750 return select(external_wp_coreData_namespaceObject.store).getEntityRecordEdits('postType', postType, postId) || EMPTY_OBJECT; 2751 }); 2752 2753 /** 2754 * Returns an attribute value of the saved post. 2755 * 2756 * @param {Object} state Global application state. 2757 * @param {string} attributeName Post attribute name. 2758 * 2759 * @return {*} Post attribute value. 2760 */ 2761 function getCurrentPostAttribute(state, attributeName) { 2762 switch (attributeName) { 2763 case 'type': 2764 return getCurrentPostType(state); 2765 case 'id': 2766 return getCurrentPostId(state); 2767 default: 2768 const post = getCurrentPost(state); 2769 if (!post.hasOwnProperty(attributeName)) { 2770 break; 2771 } 2772 return getPostRawValue(post[attributeName]); 2773 } 2774 } 2775 2776 /** 2777 * Returns a single attribute of the post being edited, preferring the unsaved 2778 * edit if one exists, but merging with the attribute value for the last known 2779 * saved state of the post (this is needed for some nested attributes like meta). 2780 * 2781 * @param {Object} state Global application state. 2782 * @param {string} attributeName Post attribute name. 2783 * 2784 * @return {*} Post attribute value. 2785 */ 2786 const getNestedEditedPostProperty = (0,external_wp_data_namespaceObject.createSelector)((state, attributeName) => { 2787 const edits = getPostEdits(state); 2788 if (!edits.hasOwnProperty(attributeName)) { 2789 return getCurrentPostAttribute(state, attributeName); 2790 } 2791 return { 2792 ...getCurrentPostAttribute(state, attributeName), 2793 ...edits[attributeName] 2794 }; 2795 }, (state, attributeName) => [getCurrentPostAttribute(state, attributeName), getPostEdits(state)[attributeName]]); 2796 2797 /** 2798 * Returns a single attribute of the post being edited, preferring the unsaved 2799 * edit if one exists, but falling back to the attribute for the last known 2800 * saved state of the post. 2801 * 2802 * @param {Object} state Global application state. 2803 * @param {string} attributeName Post attribute name. 2804 * 2805 * @return {*} Post attribute value. 2806 */ 2807 function getEditedPostAttribute(state, attributeName) { 2808 // Special cases. 2809 switch (attributeName) { 2810 case 'content': 2811 return getEditedPostContent(state); 2812 } 2813 2814 // Fall back to saved post value if not edited. 2815 const edits = getPostEdits(state); 2816 if (!edits.hasOwnProperty(attributeName)) { 2817 return getCurrentPostAttribute(state, attributeName); 2818 } 2819 2820 // Merge properties are objects which contain only the patch edit in state, 2821 // and thus must be merged with the current post attribute. 2822 if (EDIT_MERGE_PROPERTIES.has(attributeName)) { 2823 return getNestedEditedPostProperty(state, attributeName); 2824 } 2825 return edits[attributeName]; 2826 } 2827 2828 /** 2829 * Returns an attribute value of the current autosave revision for a post, or 2830 * null if there is no autosave for the post. 2831 * 2832 * @deprecated since 5.6. Callers should use the `getAutosave( postType, postId, userId )` selector 2833 * from the '@wordpress/core-data' package and access properties on the returned 2834 * autosave object using getPostRawValue. 2835 * 2836 * @param {Object} state Global application state. 2837 * @param {string} attributeName Autosave attribute name. 2838 * 2839 * @return {*} Autosave attribute value. 2840 */ 2841 const getAutosaveAttribute = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (state, attributeName) => { 2842 if (!AUTOSAVE_PROPERTIES.includes(attributeName) && attributeName !== 'preview_link') { 2843 return; 2844 } 2845 const postType = getCurrentPostType(state); 2846 2847 // Currently template autosaving is not supported. 2848 if (postType === 'wp_template') { 2849 return false; 2850 } 2851 const postId = getCurrentPostId(state); 2852 const currentUserId = select(external_wp_coreData_namespaceObject.store).getCurrentUser()?.id; 2853 const autosave = select(external_wp_coreData_namespaceObject.store).getAutosave(postType, postId, currentUserId); 2854 if (autosave) { 2855 return getPostRawValue(autosave[attributeName]); 2856 } 2857 }); 2858 2859 /** 2860 * Returns the current visibility of the post being edited, preferring the 2861 * unsaved value if different than the saved post. The return value is one of 2862 * "private", "password", or "public". 2863 * 2864 * @param {Object} state Global application state. 2865 * 2866 * @return {string} Post visibility. 2867 */ 2868 function getEditedPostVisibility(state) { 2869 const status = getEditedPostAttribute(state, 'status'); 2870 if (status === 'private') { 2871 return 'private'; 2872 } 2873 const password = getEditedPostAttribute(state, 'password'); 2874 if (password) { 2875 return 'password'; 2876 } 2877 return 'public'; 2878 } 2879 2880 /** 2881 * Returns true if post is pending review. 2882 * 2883 * @param {Object} state Global application state. 2884 * 2885 * @return {boolean} Whether current post is pending review. 2886 */ 2887 function isCurrentPostPending(state) { 2888 return getCurrentPost(state).status === 'pending'; 2889 } 2890 2891 /** 2892 * Return true if the current post has already been published. 2893 * 2894 * @param {Object} state Global application state. 2895 * @param {Object?} currentPost Explicit current post for bypassing registry selector. 2896 * 2897 * @return {boolean} Whether the post has been published. 2898 */ 2899 function isCurrentPostPublished(state, currentPost) { 2900 const post = currentPost || getCurrentPost(state); 2901 return ['publish', 'private'].indexOf(post.status) !== -1 || post.status === 'future' && !(0,external_wp_date_namespaceObject.isInTheFuture)(new Date(Number((0,external_wp_date_namespaceObject.getDate)(post.date)) - ONE_MINUTE_IN_MS)); 2902 } 2903 2904 /** 2905 * Returns true if post is already scheduled. 2906 * 2907 * @param {Object} state Global application state. 2908 * 2909 * @return {boolean} Whether current post is scheduled to be posted. 2910 */ 2911 function isCurrentPostScheduled(state) { 2912 return getCurrentPost(state).status === 'future' && !isCurrentPostPublished(state); 2913 } 2914 2915 /** 2916 * Return true if the post being edited can be published. 2917 * 2918 * @param {Object} state Global application state. 2919 * 2920 * @return {boolean} Whether the post can been published. 2921 */ 2922 function isEditedPostPublishable(state) { 2923 const post = getCurrentPost(state); 2924 2925 // TODO: Post being publishable should be superset of condition of post 2926 // being saveable. Currently this restriction is imposed at UI. 2927 // 2928 // See: <PostPublishButton /> (`isButtonEnabled` assigned by `isSaveable`). 2929 2930 return isEditedPostDirty(state) || ['publish', 'private', 'future'].indexOf(post.status) === -1; 2931 } 2932 2933 /** 2934 * Returns true if the post can be saved, or false otherwise. A post must 2935 * contain a title, an excerpt, or non-empty content to be valid for save. 2936 * 2937 * @param {Object} state Global application state. 2938 * 2939 * @return {boolean} Whether the post can be saved. 2940 */ 2941 function isEditedPostSaveable(state) { 2942 if (isSavingPost(state)) { 2943 return false; 2944 } 2945 2946 // TODO: Post should not be saveable if not dirty. Cannot be added here at 2947 // this time since posts where meta boxes are present can be saved even if 2948 // the post is not dirty. Currently this restriction is imposed at UI, but 2949 // should be moved here. 2950 // 2951 // See: `isEditedPostPublishable` (includes `isEditedPostDirty` condition) 2952 // See: <PostSavedState /> (`forceIsDirty` prop) 2953 // See: <PostPublishButton /> (`forceIsDirty` prop) 2954 // See: https://github.com/WordPress/gutenberg/pull/4184. 2955 2956 return !!getEditedPostAttribute(state, 'title') || !!getEditedPostAttribute(state, 'excerpt') || !isEditedPostEmpty(state) || external_wp_element_namespaceObject.Platform.OS === 'native'; 2957 } 2958 2959 /** 2960 * Returns true if the edited post has content. A post has content if it has at 2961 * least one saveable block or otherwise has a non-empty content property 2962 * assigned. 2963 * 2964 * @param {Object} state Global application state. 2965 * 2966 * @return {boolean} Whether post has content. 2967 */ 2968 const isEditedPostEmpty = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => state => { 2969 // While the condition of truthy content string is sufficient to determine 2970 // emptiness, testing saveable blocks length is a trivial operation. Since 2971 // this function can be called frequently, optimize for the fast case as a 2972 // condition of the mere existence of blocks. Note that the value of edited 2973 // content takes precedent over block content, and must fall through to the 2974 // default logic. 2975 const postId = getCurrentPostId(state); 2976 const postType = getCurrentPostType(state); 2977 const record = select(external_wp_coreData_namespaceObject.store).getEditedEntityRecord('postType', postType, postId); 2978 if (typeof record.content !== 'function') { 2979 return !record.content; 2980 } 2981 const blocks = getEditedPostAttribute(state, 'blocks'); 2982 if (blocks.length === 0) { 2983 return true; 2984 } 2985 2986 // Pierce the abstraction of the serializer in knowing that blocks are 2987 // joined with newlines such that even if every individual block 2988 // produces an empty save result, the serialized content is non-empty. 2989 if (blocks.length > 1) { 2990 return false; 2991 } 2992 2993 // There are two conditions under which the optimization cannot be 2994 // assumed, and a fallthrough to getEditedPostContent must occur: 2995 // 2996 // 1. getBlocksForSerialization has special treatment in omitting a 2997 // single unmodified default block. 2998 // 2. Comment delimiters are omitted for a freeform or unregistered 2999 // block in its serialization. The freeform block specifically may 3000 // produce an empty string in its saved output. 3001 // 3002 // For all other content, the single block is assumed to make a post 3003 // non-empty, if only by virtue of its own comment delimiters. 3004 const blockName = blocks[0].name; 3005 if (blockName !== (0,external_wp_blocks_namespaceObject.getDefaultBlockName)() && blockName !== (0,external_wp_blocks_namespaceObject.getFreeformContentHandlerName)()) { 3006 return false; 3007 } 3008 return !getEditedPostContent(state); 3009 }); 3010 3011 /** 3012 * Returns true if the post can be autosaved, or false otherwise. 3013 * 3014 * @param {Object} state Global application state. 3015 * @param {Object} autosave A raw autosave object from the REST API. 3016 * 3017 * @return {boolean} Whether the post can be autosaved. 3018 */ 3019 const isEditedPostAutosaveable = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => state => { 3020 // A post must contain a title, an excerpt, or non-empty content to be valid for autosaving. 3021 if (!isEditedPostSaveable(state)) { 3022 return false; 3023 } 3024 3025 // A post is not autosavable when there is a post autosave lock. 3026 if (isPostAutosavingLocked(state)) { 3027 return false; 3028 } 3029 const postType = getCurrentPostType(state); 3030 3031 // Currently template autosaving is not supported. 3032 if (postType === 'wp_template') { 3033 return false; 3034 } 3035 const postId = getCurrentPostId(state); 3036 const hasFetchedAutosave = select(external_wp_coreData_namespaceObject.store).hasFetchedAutosaves(postType, postId); 3037 const currentUserId = select(external_wp_coreData_namespaceObject.store).getCurrentUser()?.id; 3038 3039 // Disable reason - this line causes the side-effect of fetching the autosave 3040 // via a resolver, moving below the return would result in the autosave never 3041 // being fetched. 3042 // eslint-disable-next-line @wordpress/no-unused-vars-before-return 3043 const autosave = select(external_wp_coreData_namespaceObject.store).getAutosave(postType, postId, currentUserId); 3044 3045 // If any existing autosaves have not yet been fetched, this function is 3046 // unable to determine if the post is autosaveable, so return false. 3047 if (!hasFetchedAutosave) { 3048 return false; 3049 } 3050 3051 // If we don't already have an autosave, the post is autosaveable. 3052 if (!autosave) { 3053 return true; 3054 } 3055 3056 // To avoid an expensive content serialization, use the content dirtiness 3057 // flag in place of content field comparison against the known autosave. 3058 // This is not strictly accurate, and relies on a tolerance toward autosave 3059 // request failures for unnecessary saves. 3060 if (hasChangedContent(state)) { 3061 return true; 3062 } 3063 3064 // If title, excerpt, or meta have changed, the post is autosaveable. 3065 return ['title', 'excerpt', 'meta'].some(field => getPostRawValue(autosave[field]) !== getEditedPostAttribute(state, field)); 3066 }); 3067 3068 /** 3069 * Return true if the post being edited is being scheduled. Preferring the 3070 * unsaved status values. 3071 * 3072 * @param {Object} state Global application state. 3073 * 3074 * @return {boolean} Whether the post has been published. 3075 */ 3076 function isEditedPostBeingScheduled(state) { 3077 const date = getEditedPostAttribute(state, 'date'); 3078 // Offset the date by one minute (network latency). 3079 const checkedDate = new Date(Number((0,external_wp_date_namespaceObject.getDate)(date)) - ONE_MINUTE_IN_MS); 3080 return (0,external_wp_date_namespaceObject.isInTheFuture)(checkedDate); 3081 } 3082 3083 /** 3084 * Returns whether the current post should be considered to have a "floating" 3085 * date (i.e. that it would publish "Immediately" rather than at a set time). 3086 * 3087 * Unlike in the PHP backend, the REST API returns a full date string for posts 3088 * where the 0000-00-00T00:00:00 placeholder is present in the database. To 3089 * infer that a post is set to publish "Immediately" we check whether the date 3090 * and modified date are the same. 3091 * 3092 * @param {Object} state Editor state. 3093 * 3094 * @return {boolean} Whether the edited post has a floating date value. 3095 */ 3096 function isEditedPostDateFloating(state) { 3097 const date = getEditedPostAttribute(state, 'date'); 3098 const modified = getEditedPostAttribute(state, 'modified'); 3099 3100 // This should be the status of the persisted post 3101 // It shouldn't use the "edited" status otherwise it breaks the 3102 // inferred post data floating status 3103 // See https://github.com/WordPress/gutenberg/issues/28083. 3104 const status = getCurrentPost(state).status; 3105 if (status === 'draft' || status === 'auto-draft' || status === 'pending') { 3106 return date === modified || date === null; 3107 } 3108 return false; 3109 } 3110 3111 /** 3112 * Returns true if the post is currently being deleted, or false otherwise. 3113 * 3114 * @param {Object} state Editor state. 3115 * 3116 * @return {boolean} Whether post is being deleted. 3117 */ 3118 function isDeletingPost(state) { 3119 return !!state.deleting.pending; 3120 } 3121 3122 /** 3123 * Returns true if the post is currently being saved, or false otherwise. 3124 * 3125 * @param {Object} state Global application state. 3126 * 3127 * @return {boolean} Whether post is being saved. 3128 */ 3129 function isSavingPost(state) { 3130 return !!state.saving.pending; 3131 } 3132 3133 /** 3134 * Returns true if non-post entities are currently being saved, or false otherwise. 3135 * 3136 * @param {Object} state Global application state. 3137 * 3138 * @return {boolean} Whether non-post entities are being saved. 3139 */ 3140 const isSavingNonPostEntityChanges = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => state => { 3141 const entitiesBeingSaved = select(external_wp_coreData_namespaceObject.store).__experimentalGetEntitiesBeingSaved(); 3142 const { 3143 type, 3144 id 3145 } = getCurrentPost(state); 3146 return entitiesBeingSaved.some(entityRecord => entityRecord.kind !== 'postType' || entityRecord.name !== type || entityRecord.key !== id); 3147 }); 3148 3149 /** 3150 * Returns true if a previous post save was attempted successfully, or false 3151 * otherwise. 3152 * 3153 * @param {Object} state Global application state. 3154 * 3155 * @return {boolean} Whether the post was saved successfully. 3156 */ 3157 const didPostSaveRequestSucceed = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => state => { 3158 const postType = getCurrentPostType(state); 3159 const postId = getCurrentPostId(state); 3160 return !select(external_wp_coreData_namespaceObject.store).getLastEntitySaveError('postType', postType, postId); 3161 }); 3162 3163 /** 3164 * Returns true if a previous post save was attempted but failed, or false 3165 * otherwise. 3166 * 3167 * @param {Object} state Global application state. 3168 * 3169 * @return {boolean} Whether the post save failed. 3170 */ 3171 const didPostSaveRequestFail = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => state => { 3172 const postType = getCurrentPostType(state); 3173 const postId = getCurrentPostId(state); 3174 return !!select(external_wp_coreData_namespaceObject.store).getLastEntitySaveError('postType', postType, postId); 3175 }); 3176 3177 /** 3178 * Returns true if the post is autosaving, or false otherwise. 3179 * 3180 * @param {Object} state Global application state. 3181 * 3182 * @return {boolean} Whether the post is autosaving. 3183 */ 3184 function isAutosavingPost(state) { 3185 return isSavingPost(state) && Boolean(state.saving.options?.isAutosave); 3186 } 3187 3188 /** 3189 * Returns true if the post is being previewed, or false otherwise. 3190 * 3191 * @param {Object} state Global application state. 3192 * 3193 * @return {boolean} Whether the post is being previewed. 3194 */ 3195 function isPreviewingPost(state) { 3196 return isSavingPost(state) && Boolean(state.saving.options?.isPreview); 3197 } 3198 3199 /** 3200 * Returns the post preview link 3201 * 3202 * @param {Object} state Global application state. 3203 * 3204 * @return {string | undefined} Preview Link. 3205 */ 3206 function getEditedPostPreviewLink(state) { 3207 if (state.saving.pending || isSavingPost(state)) { 3208 return; 3209 } 3210 let previewLink = getAutosaveAttribute(state, 'preview_link'); 3211 // Fix for issue: https://github.com/WordPress/gutenberg/issues/33616 3212 // If the post is draft, ignore the preview link from the autosave record, 3213 // because the preview could be a stale autosave if the post was switched from 3214 // published to draft. 3215 // See: https://github.com/WordPress/gutenberg/pull/37952. 3216 if (!previewLink || 'draft' === getCurrentPost(state).status) { 3217 previewLink = getEditedPostAttribute(state, 'link'); 3218 if (previewLink) { 3219 previewLink = (0,external_wp_url_namespaceObject.addQueryArgs)(previewLink, { 3220 preview: true 3221 }); 3222 } 3223 } 3224 const featuredImageId = getEditedPostAttribute(state, 'featured_media'); 3225 if (previewLink && featuredImageId) { 3226 return (0,external_wp_url_namespaceObject.addQueryArgs)(previewLink, { 3227 _thumbnail_id: featuredImageId 3228 }); 3229 } 3230 return previewLink; 3231 } 3232 3233 /** 3234 * Returns a suggested post format for the current post, inferred only if there 3235 * is a single block within the post and it is of a type known to match a 3236 * default post format. Returns null if the format cannot be determined. 3237 * 3238 * @return {?string} Suggested post format. 3239 */ 3240 const getSuggestedPostFormat = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => () => { 3241 const blocks = select(external_wp_blockEditor_namespaceObject.store).getBlocks(); 3242 if (blocks.length > 2) { 3243 return null; 3244 } 3245 let name; 3246 // If there is only one block in the content of the post grab its name 3247 // so we can derive a suitable post format from it. 3248 if (blocks.length === 1) { 3249 name = blocks[0].name; 3250 // Check for core/embed `video` and `audio` eligible suggestions. 3251 if (name === 'core/embed') { 3252 const provider = blocks[0].attributes?.providerNameSlug; 3253 if (['youtube', 'vimeo'].includes(provider)) { 3254 name = 'core/video'; 3255 } else if (['spotify', 'soundcloud'].includes(provider)) { 3256 name = 'core/audio'; 3257 } 3258 } 3259 } 3260 3261 // If there are two blocks in the content and the last one is a text blocks 3262 // grab the name of the first one to also suggest a post format from it. 3263 if (blocks.length === 2 && blocks[1].name === 'core/paragraph') { 3264 name = blocks[0].name; 3265 } 3266 3267 // We only convert to default post formats in core. 3268 switch (name) { 3269 case 'core/image': 3270 return 'image'; 3271 case 'core/quote': 3272 case 'core/pullquote': 3273 return 'quote'; 3274 case 'core/gallery': 3275 return 'gallery'; 3276 case 'core/video': 3277 return 'video'; 3278 case 'core/audio': 3279 return 'audio'; 3280 default: 3281 return null; 3282 } 3283 }); 3284 3285 /** 3286 * Returns the content of the post being edited. 3287 * 3288 * @param {Object} state Global application state. 3289 * 3290 * @return {string} Post content. 3291 */ 3292 const getEditedPostContent = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => state => { 3293 const postId = getCurrentPostId(state); 3294 const postType = getCurrentPostType(state); 3295 const record = select(external_wp_coreData_namespaceObject.store).getEditedEntityRecord('postType', postType, postId); 3296 if (record) { 3297 if (typeof record.content === 'function') { 3298 return record.content(record); 3299 } else if (record.blocks) { 3300 return (0,external_wp_blocks_namespaceObject.__unstableSerializeAndClean)(record.blocks); 3301 } else if (record.content) { 3302 return record.content; 3303 } 3304 } 3305 return ''; 3306 }); 3307 3308 /** 3309 * Returns true if the post is being published, or false otherwise. 3310 * 3311 * @param {Object} state Global application state. 3312 * 3313 * @return {boolean} Whether post is being published. 3314 */ 3315 function isPublishingPost(state) { 3316 return isSavingPost(state) && !isCurrentPostPublished(state) && getEditedPostAttribute(state, 'status') === 'publish'; 3317 } 3318 3319 /** 3320 * Returns whether the permalink is editable or not. 3321 * 3322 * @param {Object} state Editor state. 3323 * 3324 * @return {boolean} Whether or not the permalink is editable. 3325 */ 3326 function isPermalinkEditable(state) { 3327 const permalinkTemplate = getEditedPostAttribute(state, 'permalink_template'); 3328 return PERMALINK_POSTNAME_REGEX.test(permalinkTemplate); 3329 } 3330 3331 /** 3332 * Returns the permalink for the post. 3333 * 3334 * @param {Object} state Editor state. 3335 * 3336 * @return {?string} The permalink, or null if the post is not viewable. 3337 */ 3338 function getPermalink(state) { 3339 const permalinkParts = getPermalinkParts(state); 3340 if (!permalinkParts) { 3341 return null; 3342 } 3343 const { 3344 prefix, 3345 postName, 3346 suffix 3347 } = permalinkParts; 3348 if (isPermalinkEditable(state)) { 3349 return prefix + postName + suffix; 3350 } 3351 return prefix; 3352 } 3353 3354 /** 3355 * Returns the slug for the post being edited, preferring a manually edited 3356 * value if one exists, then a sanitized version of the current post title, and 3357 * finally the post ID. 3358 * 3359 * @param {Object} state Editor state. 3360 * 3361 * @return {string} The current slug to be displayed in the editor 3362 */ 3363 function getEditedPostSlug(state) { 3364 return getEditedPostAttribute(state, 'slug') || (0,external_wp_url_namespaceObject.cleanForSlug)(getEditedPostAttribute(state, 'title')) || getCurrentPostId(state); 3365 } 3366 3367 /** 3368 * Returns the permalink for a post, split into its three parts: the prefix, 3369 * the postName, and the suffix. 3370 * 3371 * @param {Object} state Editor state. 3372 * 3373 * @return {Object} An object containing the prefix, postName, and suffix for 3374 * the permalink, or null if the post is not viewable. 3375 */ 3376 function getPermalinkParts(state) { 3377 const permalinkTemplate = getEditedPostAttribute(state, 'permalink_template'); 3378 if (!permalinkTemplate) { 3379 return null; 3380 } 3381 const postName = getEditedPostAttribute(state, 'slug') || getEditedPostAttribute(state, 'generated_slug'); 3382 const [prefix, suffix] = permalinkTemplate.split(PERMALINK_POSTNAME_REGEX); 3383 return { 3384 prefix, 3385 postName, 3386 suffix 3387 }; 3388 } 3389 3390 /** 3391 * Returns whether the post is locked. 3392 * 3393 * @param {Object} state Global application state. 3394 * 3395 * @return {boolean} Is locked. 3396 */ 3397 function isPostLocked(state) { 3398 return state.postLock.isLocked; 3399 } 3400 3401 /** 3402 * Returns whether post saving is locked. 3403 * 3404 * @param {Object} state Global application state. 3405 * 3406 * @return {boolean} Is locked. 3407 */ 3408 function isPostSavingLocked(state) { 3409 return Object.keys(state.postSavingLock).length > 0; 3410 } 3411 3412 /** 3413 * Returns whether post autosaving is locked. 3414 * 3415 * @param {Object} state Global application state. 3416 * 3417 * @return {boolean} Is locked. 3418 */ 3419 function isPostAutosavingLocked(state) { 3420 return Object.keys(state.postAutosavingLock).length > 0; 3421 } 3422 3423 /** 3424 * Returns whether the edition of the post has been taken over. 3425 * 3426 * @param {Object} state Global application state. 3427 * 3428 * @return {boolean} Is post lock takeover. 3429 */ 3430 function isPostLockTakeover(state) { 3431 return state.postLock.isTakeover; 3432 } 3433 3434 /** 3435 * Returns details about the post lock user. 3436 * 3437 * @param {Object} state Global application state. 3438 * 3439 * @return {Object} A user object. 3440 */ 3441 function getPostLockUser(state) { 3442 return state.postLock.user; 3443 } 3444 3445 /** 3446 * Returns the active post lock. 3447 * 3448 * @param {Object} state Global application state. 3449 * 3450 * @return {Object} The lock object. 3451 */ 3452 function getActivePostLock(state) { 3453 return state.postLock.activePostLock; 3454 } 3455 3456 /** 3457 * Returns whether or not the user has the unfiltered_html capability. 3458 * 3459 * @param {Object} state Editor state. 3460 * 3461 * @return {boolean} Whether the user can or can't post unfiltered HTML. 3462 */ 3463 function canUserUseUnfilteredHTML(state) { 3464 return Boolean(getCurrentPost(state)._links?.hasOwnProperty('wp:action-unfiltered-html')); 3465 } 3466 3467 /** 3468 * Returns whether the pre-publish panel should be shown 3469 * or skipped when the user clicks the "publish" button. 3470 * 3471 * @return {boolean} Whether the pre-publish panel should be shown or not. 3472 */ 3473 const isPublishSidebarEnabled = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => () => !!select(external_wp_preferences_namespaceObject.store).get('core', 'isPublishSidebarEnabled')); 3474 3475 /** 3476 * Return the current block list. 3477 * 3478 * @param {Object} state 3479 * @return {Array} Block list. 3480 */ 3481 const getEditorBlocks = (0,external_wp_data_namespaceObject.createSelector)(state => { 3482 return getEditedPostAttribute(state, 'blocks') || (0,external_wp_blocks_namespaceObject.parse)(getEditedPostContent(state)); 3483 }, state => [getEditedPostAttribute(state, 'blocks'), getEditedPostContent(state)]); 3484 3485 /** 3486 * Returns true if the given panel was programmatically removed, or false otherwise. 3487 * All panels are not removed by default. 3488 * 3489 * @param {Object} state Global application state. 3490 * @param {string} panelName A string that identifies the panel. 3491 * 3492 * @return {boolean} Whether or not the panel is removed. 3493 */ 3494 function isEditorPanelRemoved(state, panelName) { 3495 return state.removedPanels.includes(panelName); 3496 } 3497 3498 /** 3499 * Returns true if the given panel is enabled, or false otherwise. Panels are 3500 * enabled by default. 3501 * 3502 * @param {Object} state Global application state. 3503 * @param {string} panelName A string that identifies the panel. 3504 * 3505 * @return {boolean} Whether or not the panel is enabled. 3506 */ 3507 const isEditorPanelEnabled = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (state, panelName) => { 3508 // For backward compatibility, we check edit-post 3509 // even though now this is in "editor" package. 3510 const inactivePanels = select(external_wp_preferences_namespaceObject.store).get('core', 'inactivePanels'); 3511 return !isEditorPanelRemoved(state, panelName) && !inactivePanels?.includes(panelName); 3512 }); 3513 3514 /** 3515 * Returns true if the given panel is open, or false otherwise. Panels are 3516 * closed by default. 3517 * 3518 * @param {Object} state Global application state. 3519 * @param {string} panelName A string that identifies the panel. 3520 * 3521 * @return {boolean} Whether or not the panel is open. 3522 */ 3523 const isEditorPanelOpened = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (state, panelName) => { 3524 // For backward compatibility, we check edit-post 3525 // even though now this is in "editor" package. 3526 const openPanels = select(external_wp_preferences_namespaceObject.store).get('core', 'openPanels'); 3527 return !!openPanels?.includes(panelName); 3528 }); 3529 3530 /** 3531 * A block selection object. 3532 * 3533 * @typedef {Object} WPBlockSelection 3534 * 3535 * @property {string} clientId A block client ID. 3536 * @property {string} attributeKey A block attribute key. 3537 * @property {number} offset An attribute value offset, based on the rich 3538 * text value. See `wp.richText.create`. 3539 */ 3540 3541 /** 3542 * Returns the current selection start. 3543 * 3544 * @param {Object} state 3545 * @return {WPBlockSelection} The selection start. 3546 * 3547 * @deprecated since Gutenberg 10.0.0. 3548 */ 3549 function getEditorSelectionStart(state) { 3550 external_wp_deprecated_default()("select('core/editor').getEditorSelectionStart", { 3551 since: '5.8', 3552 alternative: "select('core/editor').getEditorSelection" 3553 }); 3554 return getEditedPostAttribute(state, 'selection')?.selectionStart; 3555 } 3556 3557 /** 3558 * Returns the current selection end. 3559 * 3560 * @param {Object} state 3561 * @return {WPBlockSelection} The selection end. 3562 * 3563 * @deprecated since Gutenberg 10.0.0. 3564 */ 3565 function getEditorSelectionEnd(state) { 3566 external_wp_deprecated_default()("select('core/editor').getEditorSelectionStart", { 3567 since: '5.8', 3568 alternative: "select('core/editor').getEditorSelection" 3569 }); 3570 return getEditedPostAttribute(state, 'selection')?.selectionEnd; 3571 } 3572 3573 /** 3574 * Returns the current selection. 3575 * 3576 * @param {Object} state 3577 * @return {WPBlockSelection} The selection end. 3578 */ 3579 function getEditorSelection(state) { 3580 return getEditedPostAttribute(state, 'selection'); 3581 } 3582 3583 /** 3584 * Is the editor ready 3585 * 3586 * @param {Object} state 3587 * @return {boolean} is Ready. 3588 */ 3589 function __unstableIsEditorReady(state) { 3590 return !!state.postId; 3591 } 3592 3593 /** 3594 * Returns the post editor settings. 3595 * 3596 * @param {Object} state Editor state. 3597 * 3598 * @return {Object} The editor settings object. 3599 */ 3600 function getEditorSettings(state) { 3601 return state.editorSettings; 3602 } 3603 3604 /** 3605 * Returns the post editor's rendering mode. 3606 * 3607 * @param {Object} state Editor state. 3608 * 3609 * @return {string} Rendering mode. 3610 */ 3611 function getRenderingMode(state) { 3612 return state.renderingMode; 3613 } 3614 3615 /** 3616 * Returns the current editing canvas device type. 3617 * 3618 * @param {Object} state Global application state. 3619 * 3620 * @return {string} Device type. 3621 */ 3622 const getDeviceType = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => state => { 3623 const editorMode = select(external_wp_blockEditor_namespaceObject.store).__unstableGetEditorMode(); 3624 if (editorMode === 'zoom-out') { 3625 return 'Desktop'; 3626 } 3627 return state.deviceType; 3628 }); 3629 3630 /** 3631 * Returns true if the list view is opened. 3632 * 3633 * @param {Object} state Global application state. 3634 * 3635 * @return {boolean} Whether the list view is opened. 3636 */ 3637 function isListViewOpened(state) { 3638 return state.listViewPanel; 3639 } 3640 3641 /** 3642 * Returns true if the inserter is opened. 3643 * 3644 * @param {Object} state Global application state. 3645 * 3646 * @return {boolean} Whether the inserter is opened. 3647 */ 3648 function isInserterOpened(state) { 3649 return !!state.blockInserterPanel; 3650 } 3651 3652 /** 3653 * Returns the current editing mode. 3654 * 3655 * @param {Object} state Global application state. 3656 * 3657 * @return {string} Editing mode. 3658 */ 3659 const getEditorMode = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => () => { 3660 var _select$get; 3661 return (_select$get = select(external_wp_preferences_namespaceObject.store).get('core', 'editorMode')) !== null && _select$get !== void 0 ? _select$get : 'visual'; 3662 }); 3663 3664 /* 3665 * Backward compatibility 3666 */ 3667 3668 /** 3669 * Returns state object prior to a specified optimist transaction ID, or `null` 3670 * if the transaction corresponding to the given ID cannot be found. 3671 * 3672 * @deprecated since Gutenberg 9.7.0. 3673 */ 3674 function getStateBeforeOptimisticTransaction() { 3675 external_wp_deprecated_default()("select('core/editor').getStateBeforeOptimisticTransaction", { 3676 since: '5.7', 3677 hint: 'No state history is kept on this store anymore' 3678 }); 3679 return null; 3680 } 3681 /** 3682 * Returns true if an optimistic transaction is pending commit, for which the 3683 * before state satisfies the given predicate function. 3684 * 3685 * @deprecated since Gutenberg 9.7.0. 3686 */ 3687 function inSomeHistory() { 3688 external_wp_deprecated_default()("select('core/editor').inSomeHistory", { 3689 since: '5.7', 3690 hint: 'No state history is kept on this store anymore' 3691 }); 3692 return false; 3693 } 3694 function getBlockEditorSelector(name) { 3695 return (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (state, ...args) => { 3696 external_wp_deprecated_default()("`wp.data.select( 'core/editor' )." + name + '`', { 3697 since: '5.3', 3698 alternative: "`wp.data.select( 'core/block-editor' )." + name + '`', 3699 version: '6.2' 3700 }); 3701 return select(external_wp_blockEditor_namespaceObject.store)[name](...args); 3702 }); 3703 } 3704 3705 /** 3706 * @see getBlockName in core/block-editor store. 3707 */ 3708 const getBlockName = getBlockEditorSelector('getBlockName'); 3709 3710 /** 3711 * @see isBlockValid in core/block-editor store. 3712 */ 3713 const isBlockValid = getBlockEditorSelector('isBlockValid'); 3714 3715 /** 3716 * @see getBlockAttributes in core/block-editor store. 3717 */ 3718 const getBlockAttributes = getBlockEditorSelector('getBlockAttributes'); 3719 3720 /** 3721 * @see getBlock in core/block-editor store. 3722 */ 3723 const getBlock = getBlockEditorSelector('getBlock'); 3724 3725 /** 3726 * @see getBlocks in core/block-editor store. 3727 */ 3728 const getBlocks = getBlockEditorSelector('getBlocks'); 3729 3730 /** 3731 * @see getClientIdsOfDescendants in core/block-editor store. 3732 */ 3733 const getClientIdsOfDescendants = getBlockEditorSelector('getClientIdsOfDescendants'); 3734 3735 /** 3736 * @see getClientIdsWithDescendants in core/block-editor store. 3737 */ 3738 const getClientIdsWithDescendants = getBlockEditorSelector('getClientIdsWithDescendants'); 3739 3740 /** 3741 * @see getGlobalBlockCount in core/block-editor store. 3742 */ 3743 const getGlobalBlockCount = getBlockEditorSelector('getGlobalBlockCount'); 3744 3745 /** 3746 * @see getBlocksByClientId in core/block-editor store. 3747 */ 3748 const getBlocksByClientId = getBlockEditorSelector('getBlocksByClientId'); 3749 3750 /** 3751 * @see getBlockCount in core/block-editor store. 3752 */ 3753 const getBlockCount = getBlockEditorSelector('getBlockCount'); 3754 3755 /** 3756 * @see getBlockSelectionStart in core/block-editor store. 3757 */ 3758 const getBlockSelectionStart = getBlockEditorSelector('getBlockSelectionStart'); 3759 3760 /** 3761 * @see getBlockSelectionEnd in core/block-editor store. 3762 */ 3763 const getBlockSelectionEnd = getBlockEditorSelector('getBlockSelectionEnd'); 3764 3765 /** 3766 * @see getSelectedBlockCount in core/block-editor store. 3767 */ 3768 const getSelectedBlockCount = getBlockEditorSelector('getSelectedBlockCount'); 3769 3770 /** 3771 * @see hasSelectedBlock in core/block-editor store. 3772 */ 3773 const hasSelectedBlock = getBlockEditorSelector('hasSelectedBlock'); 3774 3775 /** 3776 * @see getSelectedBlockClientId in core/block-editor store. 3777 */ 3778 const getSelectedBlockClientId = getBlockEditorSelector('getSelectedBlockClientId'); 3779 3780 /** 3781 * @see getSelectedBlock in core/block-editor store. 3782 */ 3783 const getSelectedBlock = getBlockEditorSelector('getSelectedBlock'); 3784 3785 /** 3786 * @see getBlockRootClientId in core/block-editor store. 3787 */ 3788 const getBlockRootClientId = getBlockEditorSelector('getBlockRootClientId'); 3789 3790 /** 3791 * @see getBlockHierarchyRootClientId in core/block-editor store. 3792 */ 3793 const getBlockHierarchyRootClientId = getBlockEditorSelector('getBlockHierarchyRootClientId'); 3794 3795 /** 3796 * @see getAdjacentBlockClientId in core/block-editor store. 3797 */ 3798 const getAdjacentBlockClientId = getBlockEditorSelector('getAdjacentBlockClientId'); 3799 3800 /** 3801 * @see getPreviousBlockClientId in core/block-editor store. 3802 */ 3803 const getPreviousBlockClientId = getBlockEditorSelector('getPreviousBlockClientId'); 3804 3805 /** 3806 * @see getNextBlockClientId in core/block-editor store. 3807 */ 3808 const getNextBlockClientId = getBlockEditorSelector('getNextBlockClientId'); 3809 3810 /** 3811 * @see getSelectedBlocksInitialCaretPosition in core/block-editor store. 3812 */ 3813 const getSelectedBlocksInitialCaretPosition = getBlockEditorSelector('getSelectedBlocksInitialCaretPosition'); 3814 3815 /** 3816 * @see getMultiSelectedBlockClientIds in core/block-editor store. 3817 */ 3818 const getMultiSelectedBlockClientIds = getBlockEditorSelector('getMultiSelectedBlockClientIds'); 3819 3820 /** 3821 * @see getMultiSelectedBlocks in core/block-editor store. 3822 */ 3823 const getMultiSelectedBlocks = getBlockEditorSelector('getMultiSelectedBlocks'); 3824 3825 /** 3826 * @see getFirstMultiSelectedBlockClientId in core/block-editor store. 3827 */ 3828 const getFirstMultiSelectedBlockClientId = getBlockEditorSelector('getFirstMultiSelectedBlockClientId'); 3829 3830 /** 3831 * @see getLastMultiSelectedBlockClientId in core/block-editor store. 3832 */ 3833 const getLastMultiSelectedBlockClientId = getBlockEditorSelector('getLastMultiSelectedBlockClientId'); 3834 3835 /** 3836 * @see isFirstMultiSelectedBlock in core/block-editor store. 3837 */ 3838 const isFirstMultiSelectedBlock = getBlockEditorSelector('isFirstMultiSelectedBlock'); 3839 3840 /** 3841 * @see isBlockMultiSelected in core/block-editor store. 3842 */ 3843 const isBlockMultiSelected = getBlockEditorSelector('isBlockMultiSelected'); 3844 3845 /** 3846 * @see isAncestorMultiSelected in core/block-editor store. 3847 */ 3848 const isAncestorMultiSelected = getBlockEditorSelector('isAncestorMultiSelected'); 3849 3850 /** 3851 * @see getMultiSelectedBlocksStartClientId in core/block-editor store. 3852 */ 3853 const getMultiSelectedBlocksStartClientId = getBlockEditorSelector('getMultiSelectedBlocksStartClientId'); 3854 3855 /** 3856 * @see getMultiSelectedBlocksEndClientId in core/block-editor store. 3857 */ 3858 const getMultiSelectedBlocksEndClientId = getBlockEditorSelector('getMultiSelectedBlocksEndClientId'); 3859 3860 /** 3861 * @see getBlockOrder in core/block-editor store. 3862 */ 3863 const getBlockOrder = getBlockEditorSelector('getBlockOrder'); 3864 3865 /** 3866 * @see getBlockIndex in core/block-editor store. 3867 */ 3868 const getBlockIndex = getBlockEditorSelector('getBlockIndex'); 3869 3870 /** 3871 * @see isBlockSelected in core/block-editor store. 3872 */ 3873 const isBlockSelected = getBlockEditorSelector('isBlockSelected'); 3874 3875 /** 3876 * @see hasSelectedInnerBlock in core/block-editor store. 3877 */ 3878 const hasSelectedInnerBlock = getBlockEditorSelector('hasSelectedInnerBlock'); 3879 3880 /** 3881 * @see isBlockWithinSelection in core/block-editor store. 3882 */ 3883 const isBlockWithinSelection = getBlockEditorSelector('isBlockWithinSelection'); 3884 3885 /** 3886 * @see hasMultiSelection in core/block-editor store. 3887 */ 3888 const hasMultiSelection = getBlockEditorSelector('hasMultiSelection'); 3889 3890 /** 3891 * @see isMultiSelecting in core/block-editor store. 3892 */ 3893 const isMultiSelecting = getBlockEditorSelector('isMultiSelecting'); 3894 3895 /** 3896 * @see isSelectionEnabled in core/block-editor store. 3897 */ 3898 const isSelectionEnabled = getBlockEditorSelector('isSelectionEnabled'); 3899 3900 /** 3901 * @see getBlockMode in core/block-editor store. 3902 */ 3903 const getBlockMode = getBlockEditorSelector('getBlockMode'); 3904 3905 /** 3906 * @see isTyping in core/block-editor store. 3907 */ 3908 const isTyping = getBlockEditorSelector('isTyping'); 3909 3910 /** 3911 * @see isCaretWithinFormattedText in core/block-editor store. 3912 */ 3913 const isCaretWithinFormattedText = getBlockEditorSelector('isCaretWithinFormattedText'); 3914 3915 /** 3916 * @see getBlockInsertionPoint in core/block-editor store. 3917 */ 3918 const getBlockInsertionPoint = getBlockEditorSelector('getBlockInsertionPoint'); 3919 3920 /** 3921 * @see isBlockInsertionPointVisible in core/block-editor store. 3922 */ 3923 const isBlockInsertionPointVisible = getBlockEditorSelector('isBlockInsertionPointVisible'); 3924 3925 /** 3926 * @see isValidTemplate in core/block-editor store. 3927 */ 3928 const isValidTemplate = getBlockEditorSelector('isValidTemplate'); 3929 3930 /** 3931 * @see getTemplate in core/block-editor store. 3932 */ 3933 const getTemplate = getBlockEditorSelector('getTemplate'); 3934 3935 /** 3936 * @see getTemplateLock in core/block-editor store. 3937 */ 3938 const getTemplateLock = getBlockEditorSelector('getTemplateLock'); 3939 3940 /** 3941 * @see canInsertBlockType in core/block-editor store. 3942 */ 3943 const canInsertBlockType = getBlockEditorSelector('canInsertBlockType'); 3944 3945 /** 3946 * @see getInserterItems in core/block-editor store. 3947 */ 3948 const getInserterItems = getBlockEditorSelector('getInserterItems'); 3949 3950 /** 3951 * @see hasInserterItems in core/block-editor store. 3952 */ 3953 const hasInserterItems = getBlockEditorSelector('hasInserterItems'); 3954 3955 /** 3956 * @see getBlockListSettings in core/block-editor store. 3957 */ 3958 const getBlockListSettings = getBlockEditorSelector('getBlockListSettings'); 3959 3960 /** 3961 * Returns the default template types. 3962 * 3963 * @param {Object} state Global application state. 3964 * 3965 * @return {Object} The template types. 3966 */ 3967 function __experimentalGetDefaultTemplateTypes(state) { 3968 return getEditorSettings(state)?.defaultTemplateTypes; 3969 } 3970 3971 /** 3972 * Returns the default template part areas. 3973 * 3974 * @param {Object} state Global application state. 3975 * 3976 * @return {Array} The template part areas. 3977 */ 3978 const __experimentalGetDefaultTemplatePartAreas = (0,external_wp_data_namespaceObject.createSelector)(state => { 3979 var _getEditorSettings$de; 3980 const areas = (_getEditorSettings$de = getEditorSettings(state)?.defaultTemplatePartAreas) !== null && _getEditorSettings$de !== void 0 ? _getEditorSettings$de : []; 3981 return areas.map(item => { 3982 return { 3983 ...item, 3984 icon: getTemplatePartIcon(item.icon) 3985 }; 3986 }); 3987 }, state => [getEditorSettings(state)?.defaultTemplatePartAreas]); 3988 3989 /** 3990 * Returns a default template type searched by slug. 3991 * 3992 * @param {Object} state Global application state. 3993 * @param {string} slug The template type slug. 3994 * 3995 * @return {Object} The template type. 3996 */ 3997 const __experimentalGetDefaultTemplateType = (0,external_wp_data_namespaceObject.createSelector)((state, slug) => { 3998 var _Object$values$find; 3999 const templateTypes = __experimentalGetDefaultTemplateTypes(state); 4000 if (!templateTypes) { 4001 return EMPTY_OBJECT; 4002 } 4003 return (_Object$values$find = Object.values(templateTypes).find(type => type.slug === slug)) !== null && _Object$values$find !== void 0 ? _Object$values$find : EMPTY_OBJECT; 4004 }, state => [__experimentalGetDefaultTemplateTypes(state)]); 4005 4006 /** 4007 * Given a template entity, return information about it which is ready to be 4008 * rendered, such as the title, description, and icon. 4009 * 4010 * @param {Object} state Global application state. 4011 * @param {Object} template The template for which we need information. 4012 * @return {Object} Information about the template, including title, description, and icon. 4013 */ 4014 const __experimentalGetTemplateInfo = (0,external_wp_data_namespaceObject.createSelector)((state, template) => { 4015 if (!template) { 4016 return EMPTY_OBJECT; 4017 } 4018 const { 4019 description, 4020 slug, 4021 title, 4022 area 4023 } = template; 4024 const { 4025 title: defaultTitle, 4026 description: defaultDescription 4027 } = __experimentalGetDefaultTemplateType(state, slug); 4028 const templateTitle = typeof title === 'string' ? title : title?.rendered; 4029 const templateDescription = typeof description === 'string' ? description : description?.raw; 4030 const templateIcon = __experimentalGetDefaultTemplatePartAreas(state).find(item => area === item.area)?.icon || library_layout; 4031 return { 4032 title: templateTitle && templateTitle !== slug ? templateTitle : defaultTitle || slug, 4033 description: templateDescription || defaultDescription, 4034 icon: templateIcon 4035 }; 4036 }, state => [__experimentalGetDefaultTemplateTypes(state), __experimentalGetDefaultTemplatePartAreas(state)]); 4037 4038 /** 4039 * Returns a post type label depending on the current post. 4040 * 4041 * @param {Object} state Global application state. 4042 * 4043 * @return {string|undefined} The post type label if available, otherwise undefined. 4044 */ 4045 const getPostTypeLabel = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => state => { 4046 const currentPostType = getCurrentPostType(state); 4047 const postType = select(external_wp_coreData_namespaceObject.store).getPostType(currentPostType); 4048 // Disable reason: Post type labels object is shaped like this. 4049 // eslint-disable-next-line camelcase 4050 return postType?.labels?.singular_name; 4051 }); 4052 4053 /** 4054 * Returns true if the publish sidebar is opened. 4055 * 4056 * @param {Object} state Global application state 4057 * 4058 * @return {boolean} Whether the publish sidebar is open. 4059 */ 4060 function isPublishSidebarOpened(state) { 4061 return state.publishSidebarActive; 4062 } 4063 4064 ;// CONCATENATED MODULE: external ["wp","a11y"] 4065 const external_wp_a11y_namespaceObject = window["wp"]["a11y"]; 4066 ;// CONCATENATED MODULE: external ["wp","apiFetch"] 4067 const external_wp_apiFetch_namespaceObject = window["wp"]["apiFetch"]; 4068 var external_wp_apiFetch_default = /*#__PURE__*/__webpack_require__.n(external_wp_apiFetch_namespaceObject); 4069 ;// CONCATENATED MODULE: external ["wp","notices"] 4070 const external_wp_notices_namespaceObject = window["wp"]["notices"]; 4071 ;// CONCATENATED MODULE: external ["wp","i18n"] 4072 const external_wp_i18n_namespaceObject = window["wp"]["i18n"]; 4073 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/store/local-autosave.js 4074 /** 4075 * Function returning a sessionStorage key to set or retrieve a given post's 4076 * automatic session backup. 4077 * 4078 * Keys are crucially prefixed with 'wp-autosave-' so that wp-login.php's 4079 * `loggedout` handler can clear sessionStorage of any user-private content. 4080 * 4081 * @see https://github.com/WordPress/wordpress-develop/blob/6dad32d2aed47e6c0cf2aee8410645f6d7aba6bd/src/wp-login.php#L103 4082 * 4083 * @param {string} postId Post ID. 4084 * @param {boolean} isPostNew Whether post new. 4085 * 4086 * @return {string} sessionStorage key 4087 */ 4088 function postKey(postId, isPostNew) { 4089 return `wp-autosave-block-editor-post-$isPostNew ? 'auto-draft' : postId}`; 4090 } 4091 function localAutosaveGet(postId, isPostNew) { 4092 return window.sessionStorage.getItem(postKey(postId, isPostNew)); 4093 } 4094 function localAutosaveSet(postId, isPostNew, title, content, excerpt) { 4095 window.sessionStorage.setItem(postKey(postId, isPostNew), JSON.stringify({ 4096 post_title: title, 4097 content, 4098 excerpt 4099 })); 4100 } 4101 function localAutosaveClear(postId, isPostNew) { 4102 window.sessionStorage.removeItem(postKey(postId, isPostNew)); 4103 } 4104 4105 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/store/utils/notice-builder.js 4106 /** 4107 * WordPress dependencies 4108 */ 4109 4110 4111 /** 4112 * Internal dependencies 4113 */ 4114 4115 4116 /** 4117 * Builds the arguments for a success notification dispatch. 4118 * 4119 * @param {Object} data Incoming data to build the arguments from. 4120 * 4121 * @return {Array} Arguments for dispatch. An empty array signals no 4122 * notification should be sent. 4123 */ 4124 function getNotificationArgumentsForSaveSuccess(data) { 4125 var _postType$viewable; 4126 const { 4127 previousPost, 4128 post, 4129 postType 4130 } = data; 4131 // Autosaves are neither shown a notice nor redirected. 4132 if (data.options?.isAutosave) { 4133 return []; 4134 } 4135 const publishStatus = ['publish', 'private', 'future']; 4136 const isPublished = publishStatus.includes(previousPost.status); 4137 const willPublish = publishStatus.includes(post.status); 4138 const willTrash = post.status === 'trash' && previousPost.status !== 'trash'; 4139 let noticeMessage; 4140 let shouldShowLink = (_postType$viewable = postType?.viewable) !== null && _postType$viewable !== void 0 ? _postType$viewable : false; 4141 let isDraft; 4142 4143 // Always should a notice, which will be spoken for accessibility. 4144 if (willTrash) { 4145 noticeMessage = postType.labels.item_trashed; 4146 shouldShowLink = false; 4147 } else if (!isPublished && !willPublish) { 4148 // If saving a non-published post, don't show notice. 4149 noticeMessage = (0,external_wp_i18n_namespaceObject.__)('Draft saved.'); 4150 isDraft = true; 4151 } else if (isPublished && !willPublish) { 4152 // If undoing publish status, show specific notice. 4153 noticeMessage = postType.labels.item_reverted_to_draft; 4154 shouldShowLink = false; 4155 } else if (!isPublished && willPublish) { 4156 // If publishing or scheduling a post, show the corresponding 4157 // publish message. 4158 noticeMessage = { 4159 publish: postType.labels.item_published, 4160 private: postType.labels.item_published_privately, 4161 future: postType.labels.item_scheduled 4162 }[post.status]; 4163 } else { 4164 // Generic fallback notice. 4165 noticeMessage = postType.labels.item_updated; 4166 } 4167 const actions = []; 4168 if (shouldShowLink) { 4169 actions.push({ 4170 label: isDraft ? (0,external_wp_i18n_namespaceObject.__)('View Preview') : postType.labels.view_item, 4171 url: post.link 4172 }); 4173 } 4174 return [noticeMessage, { 4175 id: SAVE_POST_NOTICE_ID, 4176 type: 'snackbar', 4177 actions 4178 }]; 4179 } 4180 4181 /** 4182 * Builds the fail notification arguments for dispatch. 4183 * 4184 * @param {Object} data Incoming data to build the arguments with. 4185 * 4186 * @return {Array} Arguments for dispatch. An empty array signals no 4187 * notification should be sent. 4188 */ 4189 function getNotificationArgumentsForSaveFail(data) { 4190 const { 4191 post, 4192 edits, 4193 error 4194 } = data; 4195 if (error && 'rest_autosave_no_changes' === error.code) { 4196 // Autosave requested a new autosave, but there were no changes. This shouldn't 4197 // result in an error notice for the user. 4198 return []; 4199 } 4200 const publishStatus = ['publish', 'private', 'future']; 4201 const isPublished = publishStatus.indexOf(post.status) !== -1; 4202 // If the post was being published, we show the corresponding publish error message 4203 // Unless we publish an "updating failed" message. 4204 const messages = { 4205 publish: (0,external_wp_i18n_namespaceObject.__)('Publishing failed.'), 4206 private: (0,external_wp_i18n_namespaceObject.__)('Publishing failed.'), 4207 future: (0,external_wp_i18n_namespaceObject.__)('Scheduling failed.') 4208 }; 4209 let noticeMessage = !isPublished && publishStatus.indexOf(edits.status) !== -1 ? messages[edits.status] : (0,external_wp_i18n_namespaceObject.__)('Updating failed.'); 4210 4211 // Check if message string contains HTML. Notice text is currently only 4212 // supported as plaintext, and stripping the tags may muddle the meaning. 4213 if (error.message && !/<\/?[^>]*>/.test(error.message)) { 4214 noticeMessage = [noticeMessage, error.message].join(' '); 4215 } 4216 return [noticeMessage, { 4217 id: SAVE_POST_NOTICE_ID 4218 }]; 4219 } 4220 4221 /** 4222 * Builds the trash fail notification arguments for dispatch. 4223 * 4224 * @param {Object} data 4225 * 4226 * @return {Array} Arguments for dispatch. 4227 */ 4228 function getNotificationArgumentsForTrashFail(data) { 4229 return [data.error.message && data.error.code !== 'unknown_error' ? data.error.message : (0,external_wp_i18n_namespaceObject.__)('Trashing failed'), { 4230 id: TRASH_POST_NOTICE_ID 4231 }]; 4232 } 4233 4234 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/store/actions.js 4235 /** 4236 * WordPress dependencies 4237 */ 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 /** 4250 * Internal dependencies 4251 */ 4252 4253 4254 4255 4256 /** 4257 * Returns an action generator used in signalling that editor has initialized with 4258 * the specified post object and editor settings. 4259 * 4260 * @param {Object} post Post object. 4261 * @param {Object} edits Initial edited attributes object. 4262 * @param {Array?} template Block Template. 4263 */ 4264 const setupEditor = (post, edits, template) => ({ 4265 dispatch 4266 }) => { 4267 dispatch.setEditedPost(post.type, post.id); 4268 // Apply a template for new posts only, if exists. 4269 const isNewPost = post.status === 'auto-draft'; 4270 if (isNewPost && template) { 4271 // In order to ensure maximum of a single parse during setup, edits are 4272 // included as part of editor setup action. Assume edited content as 4273 // canonical if provided, falling back to post. 4274 let content; 4275 if ('content' in edits) { 4276 content = edits.content; 4277 } else { 4278 content = post.content.raw; 4279 } 4280 let blocks = (0,external_wp_blocks_namespaceObject.parse)(content); 4281 blocks = (0,external_wp_blocks_namespaceObject.synchronizeBlocksWithTemplate)(blocks, template); 4282 dispatch.resetEditorBlocks(blocks, { 4283 __unstableShouldCreateUndoLevel: false 4284 }); 4285 } 4286 if (edits && Object.values(edits).some(([key, edit]) => { 4287 var _post$key$raw; 4288 return edit !== ((_post$key$raw = post[key]?.raw) !== null && _post$key$raw !== void 0 ? _post$key$raw : post[key]); 4289 })) { 4290 dispatch.editPost(edits); 4291 } 4292 }; 4293 4294 /** 4295 * Returns an action object signalling that the editor is being destroyed and 4296 * that any necessary state or side-effect cleanup should occur. 4297 * 4298 * @deprecated 4299 * 4300 * @return {Object} Action object. 4301 */ 4302 function __experimentalTearDownEditor() { 4303 external_wp_deprecated_default()("wp.data.dispatch( 'core/editor' ).__experimentalTearDownEditor", { 4304 since: '6.5' 4305 }); 4306 return { 4307 type: 'DO_NOTHING' 4308 }; 4309 } 4310 4311 /** 4312 * Returns an action object used in signalling that the latest version of the 4313 * post has been received, either by initialization or save. 4314 * 4315 * @deprecated Since WordPress 6.0. 4316 */ 4317 function resetPost() { 4318 external_wp_deprecated_default()("wp.data.dispatch( 'core/editor' ).resetPost", { 4319 since: '6.0', 4320 version: '6.3', 4321 alternative: 'Initialize the editor with the setupEditorState action' 4322 }); 4323 return { 4324 type: 'DO_NOTHING' 4325 }; 4326 } 4327 4328 /** 4329 * Returns an action object used in signalling that a patch of updates for the 4330 * latest version of the post have been received. 4331 * 4332 * @return {Object} Action object. 4333 * @deprecated since Gutenberg 9.7.0. 4334 */ 4335 function updatePost() { 4336 external_wp_deprecated_default()("wp.data.dispatch( 'core/editor' ).updatePost", { 4337 since: '5.7', 4338 alternative: 'Use the core entities store instead' 4339 }); 4340 return { 4341 type: 'DO_NOTHING' 4342 }; 4343 } 4344 4345 /** 4346 * Setup the editor state. 4347 * 4348 * @deprecated 4349 * 4350 * @param {Object} post Post object. 4351 */ 4352 function setupEditorState(post) { 4353 external_wp_deprecated_default()("wp.data.dispatch( 'core/editor' ).setupEditorState", { 4354 since: '6.5', 4355 alternative: "wp.data.dispatch( 'core/editor' ).setEditedPost" 4356 }); 4357 return setEditedPost(post.type, post.id); 4358 } 4359 4360 /** 4361 * Returns an action that sets the current post Type and post ID. 4362 * 4363 * @param {string} postType Post Type. 4364 * @param {string} postId Post ID. 4365 * 4366 * @return {Object} Action object. 4367 */ 4368 function setEditedPost(postType, postId) { 4369 return { 4370 type: 'SET_EDITED_POST', 4371 postType, 4372 postId 4373 }; 4374 } 4375 4376 /** 4377 * Returns an action object used in signalling that attributes of the post have 4378 * been edited. 4379 * 4380 * @param {Object} edits Post attributes to edit. 4381 * @param {Object} options Options for the edit. 4382 */ 4383 const editPost = (edits, options) => ({ 4384 select, 4385 registry 4386 }) => { 4387 const { 4388 id, 4389 type 4390 } = select.getCurrentPost(); 4391 registry.dispatch(external_wp_coreData_namespaceObject.store).editEntityRecord('postType', type, id, edits, options); 4392 }; 4393 4394 /** 4395 * Action for saving the current post in the editor. 4396 * 4397 * @param {Object} options 4398 */ 4399 const savePost = (options = {}) => async ({ 4400 select, 4401 dispatch, 4402 registry 4403 }) => { 4404 if (!select.isEditedPostSaveable()) { 4405 return; 4406 } 4407 const content = select.getEditedPostContent(); 4408 if (!options.isAutosave) { 4409 dispatch.editPost({ 4410 content 4411 }, { 4412 undoIgnore: true 4413 }); 4414 } 4415 const previousRecord = select.getCurrentPost(); 4416 let edits = { 4417 id: previousRecord.id, 4418 ...registry.select(external_wp_coreData_namespaceObject.store).getEntityRecordNonTransientEdits('postType', previousRecord.type, previousRecord.id), 4419 content 4420 }; 4421 dispatch({ 4422 type: 'REQUEST_POST_UPDATE_START', 4423 options 4424 }); 4425 let error = false; 4426 try { 4427 edits = await (0,external_wp_hooks_namespaceObject.applyFiltersAsync)('editor.preSavePost', edits, options); 4428 } catch (err) { 4429 error = err; 4430 } 4431 if (!error) { 4432 try { 4433 await registry.dispatch(external_wp_coreData_namespaceObject.store).saveEntityRecord('postType', previousRecord.type, edits, options); 4434 } catch (err) { 4435 error = err.message && err.code !== 'unknown_error' ? err.message : (0,external_wp_i18n_namespaceObject.__)('An error occurred while updating.'); 4436 } 4437 } 4438 if (!error) { 4439 error = registry.select(external_wp_coreData_namespaceObject.store).getLastEntitySaveError('postType', previousRecord.type, previousRecord.id); 4440 } 4441 4442 // Run the hook with legacy unstable name for backward compatibility 4443 if (!error) { 4444 try { 4445 await (0,external_wp_hooks_namespaceObject.applyFilters)('editor.__unstableSavePost', Promise.resolve(), options); 4446 } catch (err) { 4447 error = err; 4448 } 4449 } 4450 if (!error) { 4451 try { 4452 await (0,external_wp_hooks_namespaceObject.doActionAsync)('editor.savePost', { 4453 id: previousRecord.id 4454 }, options); 4455 } catch (err) { 4456 error = err; 4457 } 4458 } 4459 dispatch({ 4460 type: 'REQUEST_POST_UPDATE_FINISH', 4461 options 4462 }); 4463 if (error) { 4464 const args = getNotificationArgumentsForSaveFail({ 4465 post: previousRecord, 4466 edits, 4467 error 4468 }); 4469 if (args.length) { 4470 registry.dispatch(external_wp_notices_namespaceObject.store).createErrorNotice(...args); 4471 } 4472 } else { 4473 const updatedRecord = select.getCurrentPost(); 4474 const args = getNotificationArgumentsForSaveSuccess({ 4475 previousPost: previousRecord, 4476 post: updatedRecord, 4477 postType: await registry.resolveSelect(external_wp_coreData_namespaceObject.store).getPostType(updatedRecord.type), 4478 options 4479 }); 4480 if (args.length) { 4481 registry.dispatch(external_wp_notices_namespaceObject.store).createSuccessNotice(...args); 4482 } 4483 // Make sure that any edits after saving create an undo level and are 4484 // considered for change detection. 4485 if (!options.isAutosave) { 4486 registry.dispatch(external_wp_blockEditor_namespaceObject.store).__unstableMarkLastChangeAsPersistent(); 4487 } 4488 } 4489 }; 4490 4491 /** 4492 * Action for refreshing the current post. 4493 * 4494 * @deprecated Since WordPress 6.0. 4495 */ 4496 function refreshPost() { 4497 external_wp_deprecated_default()("wp.data.dispatch( 'core/editor' ).refreshPost", { 4498 since: '6.0', 4499 version: '6.3', 4500 alternative: 'Use the core entities store instead' 4501 }); 4502 return { 4503 type: 'DO_NOTHING' 4504 }; 4505 } 4506 4507 /** 4508 * Action for trashing the current post in the editor. 4509 */ 4510 const trashPost = () => async ({ 4511 select, 4512 dispatch, 4513 registry 4514 }) => { 4515 const postTypeSlug = select.getCurrentPostType(); 4516 const postType = await registry.resolveSelect(external_wp_coreData_namespaceObject.store).getPostType(postTypeSlug); 4517 registry.dispatch(external_wp_notices_namespaceObject.store).removeNotice(TRASH_POST_NOTICE_ID); 4518 const { 4519 rest_base: restBase, 4520 rest_namespace: restNamespace = 'wp/v2' 4521 } = postType; 4522 dispatch({ 4523 type: 'REQUEST_POST_DELETE_START' 4524 }); 4525 try { 4526 const post = select.getCurrentPost(); 4527 await external_wp_apiFetch_default()({ 4528 path: `/$restNamespace}/$restBase}/$post.id}`, 4529 method: 'DELETE' 4530 }); 4531 await dispatch.savePost(); 4532 } catch (error) { 4533 registry.dispatch(external_wp_notices_namespaceObject.store).createErrorNotice(...getNotificationArgumentsForTrashFail({ 4534 error 4535 })); 4536 } 4537 dispatch({ 4538 type: 'REQUEST_POST_DELETE_FINISH' 4539 }); 4540 }; 4541 4542 /** 4543 * Action that autosaves the current post. This 4544 * includes server-side autosaving (default) and client-side (a.k.a. local) 4545 * autosaving (e.g. on the Web, the post might be committed to Session 4546 * Storage). 4547 * 4548 * @param {Object?} options Extra flags to identify the autosave. 4549 */ 4550 const autosave = ({ 4551 local = false, 4552 ...options 4553 } = {}) => async ({ 4554 select, 4555 dispatch 4556 }) => { 4557 const post = select.getCurrentPost(); 4558 4559 // Currently template autosaving is not supported. 4560 if (post.type === 'wp_template') { 4561 return; 4562 } 4563 if (local) { 4564 const isPostNew = select.isEditedPostNew(); 4565 const title = select.getEditedPostAttribute('title'); 4566 const content = select.getEditedPostAttribute('content'); 4567 const excerpt = select.getEditedPostAttribute('excerpt'); 4568 localAutosaveSet(post.id, isPostNew, title, content, excerpt); 4569 } else { 4570 await dispatch.savePost({ 4571 isAutosave: true, 4572 ...options 4573 }); 4574 } 4575 }; 4576 const __unstableSaveForPreview = ({ 4577 forceIsAutosaveable 4578 } = {}) => async ({ 4579 select, 4580 dispatch 4581 }) => { 4582 if ((forceIsAutosaveable || select.isEditedPostAutosaveable()) && !select.isPostLocked()) { 4583 const isDraft = ['draft', 'auto-draft'].includes(select.getEditedPostAttribute('status')); 4584 if (isDraft) { 4585 await dispatch.savePost({ 4586 isPreview: true 4587 }); 4588 } else { 4589 await dispatch.autosave({ 4590 isPreview: true 4591 }); 4592 } 4593 } 4594 return select.getEditedPostPreviewLink(); 4595 }; 4596 4597 /** 4598 * Action that restores last popped state in undo history. 4599 */ 4600 const redo = () => ({ 4601 registry 4602 }) => { 4603 registry.dispatch(external_wp_coreData_namespaceObject.store).redo(); 4604 }; 4605 4606 /** 4607 * Action that pops a record from undo history and undoes the edit. 4608 */ 4609 const undo = () => ({ 4610 registry 4611 }) => { 4612 registry.dispatch(external_wp_coreData_namespaceObject.store).undo(); 4613 }; 4614 4615 /** 4616 * Action that creates an undo history record. 4617 * 4618 * @deprecated Since WordPress 6.0 4619 */ 4620 function createUndoLevel() { 4621 external_wp_deprecated_default()("wp.data.dispatch( 'core/editor' ).createUndoLevel", { 4622 since: '6.0', 4623 version: '6.3', 4624 alternative: 'Use the core entities store instead' 4625 }); 4626 return { 4627 type: 'DO_NOTHING' 4628 }; 4629 } 4630 4631 /** 4632 * Action that locks the editor. 4633 * 4634 * @param {Object} lock Details about the post lock status, user, and nonce. 4635 * @return {Object} Action object. 4636 */ 4637 function updatePostLock(lock) { 4638 return { 4639 type: 'UPDATE_POST_LOCK', 4640 lock 4641 }; 4642 } 4643 4644 /** 4645 * Enable the publish sidebar. 4646 */ 4647 const enablePublishSidebar = () => ({ 4648 registry 4649 }) => { 4650 registry.dispatch(external_wp_preferences_namespaceObject.store).set('core', 'isPublishSidebarEnabled', true); 4651 }; 4652 4653 /** 4654 * Disables the publish sidebar. 4655 */ 4656 const disablePublishSidebar = () => ({ 4657 registry 4658 }) => { 4659 registry.dispatch(external_wp_preferences_namespaceObject.store).set('core', 'isPublishSidebarEnabled', false); 4660 }; 4661 4662 /** 4663 * Action that locks post saving. 4664 * 4665 * @param {string} lockName The lock name. 4666 * 4667 * @example 4668 * ``` 4669 * const { subscribe } = wp.data; 4670 * 4671 * const initialPostStatus = wp.data.select( 'core/editor' ).getEditedPostAttribute( 'status' ); 4672 * 4673 * // Only allow publishing posts that are set to a future date. 4674 * if ( 'publish' !== initialPostStatus ) { 4675 * 4676 * // Track locking. 4677 * let locked = false; 4678 * 4679 * // Watch for the publish event. 4680 * let unssubscribe = subscribe( () => { 4681 * const currentPostStatus = wp.data.select( 'core/editor' ).getEditedPostAttribute( 'status' ); 4682 * if ( 'publish' !== currentPostStatus ) { 4683 * 4684 * // Compare the post date to the current date, lock the post if the date isn't in the future. 4685 * const postDate = new Date( wp.data.select( 'core/editor' ).getEditedPostAttribute( 'date' ) ); 4686 * const currentDate = new Date(); 4687 * if ( postDate.getTime() <= currentDate.getTime() ) { 4688 * if ( ! locked ) { 4689 * locked = true; 4690 * wp.data.dispatch( 'core/editor' ).lockPostSaving( 'futurelock' ); 4691 * } 4692 * } else { 4693 * if ( locked ) { 4694 * locked = false; 4695 * wp.data.dispatch( 'core/editor' ).unlockPostSaving( 'futurelock' ); 4696 * } 4697 * } 4698 * } 4699 * } ); 4700 * } 4701 * ``` 4702 * 4703 * @return {Object} Action object 4704 */ 4705 function lockPostSaving(lockName) { 4706 return { 4707 type: 'LOCK_POST_SAVING', 4708 lockName 4709 }; 4710 } 4711 4712 /** 4713 * Action that unlocks post saving. 4714 * 4715 * @param {string} lockName The lock name. 4716 * 4717 * @example 4718 * ``` 4719 * // Unlock post saving with the lock key `mylock`: 4720 * wp.data.dispatch( 'core/editor' ).unlockPostSaving( 'mylock' ); 4721 * ``` 4722 * 4723 * @return {Object} Action object 4724 */ 4725 function unlockPostSaving(lockName) { 4726 return { 4727 type: 'UNLOCK_POST_SAVING', 4728 lockName 4729 }; 4730 } 4731 4732 /** 4733 * Action that locks post autosaving. 4734 * 4735 * @param {string} lockName The lock name. 4736 * 4737 * @example 4738 * ``` 4739 * // Lock post autosaving with the lock key `mylock`: 4740 * wp.data.dispatch( 'core/editor' ).lockPostAutosaving( 'mylock' ); 4741 * ``` 4742 * 4743 * @return {Object} Action object 4744 */ 4745 function lockPostAutosaving(lockName) { 4746 return { 4747 type: 'LOCK_POST_AUTOSAVING', 4748 lockName 4749 }; 4750 } 4751 4752 /** 4753 * Action that unlocks post autosaving. 4754 * 4755 * @param {string} lockName The lock name. 4756 * 4757 * @example 4758 * ``` 4759 * // Unlock post saving with the lock key `mylock`: 4760 * wp.data.dispatch( 'core/editor' ).unlockPostAutosaving( 'mylock' ); 4761 * ``` 4762 * 4763 * @return {Object} Action object 4764 */ 4765 function unlockPostAutosaving(lockName) { 4766 return { 4767 type: 'UNLOCK_POST_AUTOSAVING', 4768 lockName 4769 }; 4770 } 4771 4772 /** 4773 * Returns an action object used to signal that the blocks have been updated. 4774 * 4775 * @param {Array} blocks Block Array. 4776 * @param {?Object} options Optional options. 4777 */ 4778 const resetEditorBlocks = (blocks, options = {}) => ({ 4779 select, 4780 dispatch, 4781 registry 4782 }) => { 4783 const { 4784 __unstableShouldCreateUndoLevel, 4785 selection 4786 } = options; 4787 const edits = { 4788 blocks, 4789 selection 4790 }; 4791 if (__unstableShouldCreateUndoLevel !== false) { 4792 const { 4793 id, 4794 type 4795 } = select.getCurrentPost(); 4796 const noChange = registry.select(external_wp_coreData_namespaceObject.store).getEditedEntityRecord('postType', type, id).blocks === edits.blocks; 4797 if (noChange) { 4798 registry.dispatch(external_wp_coreData_namespaceObject.store).__unstableCreateUndoLevel('postType', type, id); 4799 return; 4800 } 4801 4802 // We create a new function here on every persistent edit 4803 // to make sure the edit makes the post dirty and creates 4804 // a new undo level. 4805 edits.content = ({ 4806 blocks: blocksForSerialization = [] 4807 }) => (0,external_wp_blocks_namespaceObject.__unstableSerializeAndClean)(blocksForSerialization); 4808 } 4809 dispatch.editPost(edits); 4810 }; 4811 4812 /* 4813 * Returns an action object used in signalling that the post editor settings have been updated. 4814 * 4815 * @param {Object} settings Updated settings 4816 * 4817 * @return {Object} Action object 4818 */ 4819 function updateEditorSettings(settings) { 4820 return { 4821 type: 'UPDATE_EDITOR_SETTINGS', 4822 settings 4823 }; 4824 } 4825 4826 /** 4827 * Returns an action used to set the rendering mode of the post editor. We support multiple rendering modes: 4828 * 4829 * - `post-only`: This mode extracts the post blocks from the template and renders only those. The idea is to allow the user to edit the post/page in isolation without the wrapping template. 4830 * - `template-locked`: This mode renders both the template and the post blocks but the template blocks are locked and can't be edited. The post blocks are editable. 4831 * 4832 * @param {string} mode Mode (one of 'post-only' or 'template-locked'). 4833 */ 4834 const setRenderingMode = mode => ({ 4835 dispatch, 4836 registry, 4837 select 4838 }) => { 4839 if (select.__unstableIsEditorReady()) { 4840 // We clear the block selection but we also need to clear the selection from the core store. 4841 registry.dispatch(external_wp_blockEditor_namespaceObject.store).clearSelectedBlock(); 4842 dispatch.editPost({ 4843 selection: undefined 4844 }, { 4845 undoIgnore: true 4846 }); 4847 } 4848 dispatch({ 4849 type: 'SET_RENDERING_MODE', 4850 mode 4851 }); 4852 }; 4853 4854 /** 4855 * Action that changes the width of the editing canvas. 4856 * 4857 * @param {string} deviceType 4858 * 4859 * @return {Object} Action object. 4860 */ 4861 function setDeviceType(deviceType) { 4862 return { 4863 type: 'SET_DEVICE_TYPE', 4864 deviceType 4865 }; 4866 } 4867 4868 /** 4869 * Returns an action object used to enable or disable a panel in the editor. 4870 * 4871 * @param {string} panelName A string that identifies the panel to enable or disable. 4872 * 4873 * @return {Object} Action object. 4874 */ 4875 const toggleEditorPanelEnabled = panelName => ({ 4876 registry 4877 }) => { 4878 var _registry$select$get; 4879 const inactivePanels = (_registry$select$get = registry.select(external_wp_preferences_namespaceObject.store).get('core', 'inactivePanels')) !== null && _registry$select$get !== void 0 ? _registry$select$get : []; 4880 const isPanelInactive = !!inactivePanels?.includes(panelName); 4881 4882 // If the panel is inactive, remove it to enable it, else add it to 4883 // make it inactive. 4884 let updatedInactivePanels; 4885 if (isPanelInactive) { 4886 updatedInactivePanels = inactivePanels.filter(invactivePanelName => invactivePanelName !== panelName); 4887 } else { 4888 updatedInactivePanels = [...inactivePanels, panelName]; 4889 } 4890 registry.dispatch(external_wp_preferences_namespaceObject.store).set('core', 'inactivePanels', updatedInactivePanels); 4891 }; 4892 4893 /** 4894 * Opens a closed panel and closes an open panel. 4895 * 4896 * @param {string} panelName A string that identifies the panel to open or close. 4897 */ 4898 const toggleEditorPanelOpened = panelName => ({ 4899 registry 4900 }) => { 4901 var _registry$select$get2; 4902 const openPanels = (_registry$select$get2 = registry.select(external_wp_preferences_namespaceObject.store).get('core', 'openPanels')) !== null && _registry$select$get2 !== void 0 ? _registry$select$get2 : []; 4903 const isPanelOpen = !!openPanels?.includes(panelName); 4904 4905 // If the panel is open, remove it to close it, else add it to 4906 // make it open. 4907 let updatedOpenPanels; 4908 if (isPanelOpen) { 4909 updatedOpenPanels = openPanels.filter(openPanelName => openPanelName !== panelName); 4910 } else { 4911 updatedOpenPanels = [...openPanels, panelName]; 4912 } 4913 registry.dispatch(external_wp_preferences_namespaceObject.store).set('core', 'openPanels', updatedOpenPanels); 4914 }; 4915 4916 /** 4917 * Returns an action object used to remove a panel from the editor. 4918 * 4919 * @param {string} panelName A string that identifies the panel to remove. 4920 * 4921 * @return {Object} Action object. 4922 */ 4923 function removeEditorPanel(panelName) { 4924 return { 4925 type: 'REMOVE_PANEL', 4926 panelName 4927 }; 4928 } 4929 4930 /** 4931 * Returns an action object used to open/close the inserter. 4932 * 4933 * @param {boolean|Object} value Whether the inserter should be 4934 * opened (true) or closed (false). 4935 * To specify an insertion point, 4936 * use an object. 4937 * @param {string} value.rootClientId The root client ID to insert at. 4938 * @param {number} value.insertionIndex The index to insert at. 4939 * 4940 * @return {Object} Action object. 4941 */ 4942 function setIsInserterOpened(value) { 4943 return { 4944 type: 'SET_IS_INSERTER_OPENED', 4945 value 4946 }; 4947 } 4948 4949 /** 4950 * Returns an action object used to open/close the list view. 4951 * 4952 * @param {boolean} isOpen A boolean representing whether the list view should be opened or closed. 4953 * @return {Object} Action object. 4954 */ 4955 function setIsListViewOpened(isOpen) { 4956 return { 4957 type: 'SET_IS_LIST_VIEW_OPENED', 4958 isOpen 4959 }; 4960 } 4961 4962 /** 4963 * Action that toggles Distraction free mode. 4964 * Distraction free mode expects there are no sidebars, as due to the 4965 * z-index values set, you can't close sidebars. 4966 */ 4967 const toggleDistractionFree = () => ({ 4968 dispatch, 4969 registry 4970 }) => { 4971 const isDistractionFree = registry.select(external_wp_preferences_namespaceObject.store).get('core', 'distractionFree'); 4972 if (isDistractionFree) { 4973 registry.dispatch(external_wp_preferences_namespaceObject.store).set('core', 'fixedToolbar', false); 4974 } 4975 if (!isDistractionFree) { 4976 registry.batch(() => { 4977 registry.dispatch(external_wp_preferences_namespaceObject.store).set('core', 'fixedToolbar', true); 4978 dispatch.setIsInserterOpened(false); 4979 dispatch.setIsListViewOpened(false); 4980 }); 4981 } 4982 registry.batch(() => { 4983 registry.dispatch(external_wp_preferences_namespaceObject.store).set('core', 'distractionFree', !isDistractionFree); 4984 registry.dispatch(external_wp_notices_namespaceObject.store).createInfoNotice(isDistractionFree ? (0,external_wp_i18n_namespaceObject.__)('Distraction free off.') : (0,external_wp_i18n_namespaceObject.__)('Distraction free on.'), { 4985 id: 'core/editor/distraction-free-mode/notice', 4986 type: 'snackbar', 4987 actions: [{ 4988 label: (0,external_wp_i18n_namespaceObject.__)('Undo'), 4989 onClick: () => { 4990 registry.batch(() => { 4991 registry.dispatch(external_wp_preferences_namespaceObject.store).set('core', 'fixedToolbar', isDistractionFree ? true : false); 4992 registry.dispatch(external_wp_preferences_namespaceObject.store).toggle('core', 'distractionFree'); 4993 }); 4994 } 4995 }] 4996 }); 4997 }); 4998 }; 4999 5000 /** 5001 * Triggers an action used to switch editor mode. 5002 * 5003 * @param {string} mode The editor mode. 5004 */ 5005 const switchEditorMode = mode => ({ 5006 dispatch, 5007 registry 5008 }) => { 5009 registry.dispatch(external_wp_preferences_namespaceObject.store).set('core', 'editorMode', mode); 5010 5011 // Unselect blocks when we switch to a non visual mode. 5012 if (mode !== 'visual') { 5013 registry.dispatch(external_wp_blockEditor_namespaceObject.store).clearSelectedBlock(); 5014 } 5015 if (mode === 'visual') { 5016 (0,external_wp_a11y_namespaceObject.speak)((0,external_wp_i18n_namespaceObject.__)('Visual editor selected'), 'assertive'); 5017 } else if (mode === 'text') { 5018 const isDistractionFree = registry.select(external_wp_preferences_namespaceObject.store).get('core', 'distractionFree'); 5019 if (isDistractionFree) { 5020 dispatch.toggleDistractionFree(); 5021 } 5022 (0,external_wp_a11y_namespaceObject.speak)((0,external_wp_i18n_namespaceObject.__)('Code editor selected'), 'assertive'); 5023 } 5024 }; 5025 5026 /** 5027 * Returns an action object used in signalling that the user opened the publish 5028 * sidebar. 5029 * 5030 * @return {Object} Action object 5031 */ 5032 function openPublishSidebar() { 5033 return { 5034 type: 'OPEN_PUBLISH_SIDEBAR' 5035 }; 5036 } 5037 5038 /** 5039 * Returns an action object used in signalling that the user closed the 5040 * publish sidebar. 5041 * 5042 * @return {Object} Action object. 5043 */ 5044 function closePublishSidebar() { 5045 return { 5046 type: 'CLOSE_PUBLISH_SIDEBAR' 5047 }; 5048 } 5049 5050 /** 5051 * Returns an action object used in signalling that the user toggles the publish sidebar. 5052 * 5053 * @return {Object} Action object 5054 */ 5055 function togglePublishSidebar() { 5056 return { 5057 type: 'TOGGLE_PUBLISH_SIDEBAR' 5058 }; 5059 } 5060 5061 /** 5062 * Backward compatibility 5063 */ 5064 5065 const getBlockEditorAction = name => (...args) => ({ 5066 registry 5067 }) => { 5068 external_wp_deprecated_default()("`wp.data.dispatch( 'core/editor' )." + name + '`', { 5069 since: '5.3', 5070 alternative: "`wp.data.dispatch( 'core/block-editor' )." + name + '`', 5071 version: '6.2' 5072 }); 5073 registry.dispatch(external_wp_blockEditor_namespaceObject.store)[name](...args); 5074 }; 5075 5076 /** 5077 * @see resetBlocks in core/block-editor store. 5078 */ 5079 const resetBlocks = getBlockEditorAction('resetBlocks'); 5080 5081 /** 5082 * @see receiveBlocks in core/block-editor store. 5083 */ 5084 const receiveBlocks = getBlockEditorAction('receiveBlocks'); 5085 5086 /** 5087 * @see updateBlock in core/block-editor store. 5088 */ 5089 const updateBlock = getBlockEditorAction('updateBlock'); 5090 5091 /** 5092 * @see updateBlockAttributes in core/block-editor store. 5093 */ 5094 const updateBlockAttributes = getBlockEditorAction('updateBlockAttributes'); 5095 5096 /** 5097 * @see selectBlock in core/block-editor store. 5098 */ 5099 const selectBlock = getBlockEditorAction('selectBlock'); 5100 5101 /** 5102 * @see startMultiSelect in core/block-editor store. 5103 */ 5104 const startMultiSelect = getBlockEditorAction('startMultiSelect'); 5105 5106 /** 5107 * @see stopMultiSelect in core/block-editor store. 5108 */ 5109 const stopMultiSelect = getBlockEditorAction('stopMultiSelect'); 5110 5111 /** 5112 * @see multiSelect in core/block-editor store. 5113 */ 5114 const multiSelect = getBlockEditorAction('multiSelect'); 5115 5116 /** 5117 * @see clearSelectedBlock in core/block-editor store. 5118 */ 5119 const clearSelectedBlock = getBlockEditorAction('clearSelectedBlock'); 5120 5121 /** 5122 * @see toggleSelection in core/block-editor store. 5123 */ 5124 const toggleSelection = getBlockEditorAction('toggleSelection'); 5125 5126 /** 5127 * @see replaceBlocks in core/block-editor store. 5128 */ 5129 const replaceBlocks = getBlockEditorAction('replaceBlocks'); 5130 5131 /** 5132 * @see replaceBlock in core/block-editor store. 5133 */ 5134 const replaceBlock = getBlockEditorAction('replaceBlock'); 5135 5136 /** 5137 * @see moveBlocksDown in core/block-editor store. 5138 */ 5139 const moveBlocksDown = getBlockEditorAction('moveBlocksDown'); 5140 5141 /** 5142 * @see moveBlocksUp in core/block-editor store. 5143 */ 5144 const moveBlocksUp = getBlockEditorAction('moveBlocksUp'); 5145 5146 /** 5147 * @see moveBlockToPosition in core/block-editor store. 5148 */ 5149 const moveBlockToPosition = getBlockEditorAction('moveBlockToPosition'); 5150 5151 /** 5152 * @see insertBlock in core/block-editor store. 5153 */ 5154 const insertBlock = getBlockEditorAction('insertBlock'); 5155 5156 /** 5157 * @see insertBlocks in core/block-editor store. 5158 */ 5159 const insertBlocks = getBlockEditorAction('insertBlocks'); 5160 5161 /** 5162 * @see showInsertionPoint in core/block-editor store. 5163 */ 5164 const showInsertionPoint = getBlockEditorAction('showInsertionPoint'); 5165 5166 /** 5167 * @see hideInsertionPoint in core/block-editor store. 5168 */ 5169 const hideInsertionPoint = getBlockEditorAction('hideInsertionPoint'); 5170 5171 /** 5172 * @see setTemplateValidity in core/block-editor store. 5173 */ 5174 const setTemplateValidity = getBlockEditorAction('setTemplateValidity'); 5175 5176 /** 5177 * @see synchronizeTemplate in core/block-editor store. 5178 */ 5179 const synchronizeTemplate = getBlockEditorAction('synchronizeTemplate'); 5180 5181 /** 5182 * @see mergeBlocks in core/block-editor store. 5183 */ 5184 const mergeBlocks = getBlockEditorAction('mergeBlocks'); 5185 5186 /** 5187 * @see removeBlocks in core/block-editor store. 5188 */ 5189 const removeBlocks = getBlockEditorAction('removeBlocks'); 5190 5191 /** 5192 * @see removeBlock in core/block-editor store. 5193 */ 5194 const removeBlock = getBlockEditorAction('removeBlock'); 5195 5196 /** 5197 * @see toggleBlockMode in core/block-editor store. 5198 */ 5199 const toggleBlockMode = getBlockEditorAction('toggleBlockMode'); 5200 5201 /** 5202 * @see startTyping in core/block-editor store. 5203 */ 5204 const startTyping = getBlockEditorAction('startTyping'); 5205 5206 /** 5207 * @see stopTyping in core/block-editor store. 5208 */ 5209 const stopTyping = getBlockEditorAction('stopTyping'); 5210 5211 /** 5212 * @see enterFormattedText in core/block-editor store. 5213 */ 5214 const enterFormattedText = getBlockEditorAction('enterFormattedText'); 5215 5216 /** 5217 * @see exitFormattedText in core/block-editor store. 5218 */ 5219 const exitFormattedText = getBlockEditorAction('exitFormattedText'); 5220 5221 /** 5222 * @see insertDefaultBlock in core/block-editor store. 5223 */ 5224 const insertDefaultBlock = getBlockEditorAction('insertDefaultBlock'); 5225 5226 /** 5227 * @see updateBlockListSettings in core/block-editor store. 5228 */ 5229 const updateBlockListSettings = getBlockEditorAction('updateBlockListSettings'); 5230 5231 ;// CONCATENATED MODULE: external ["wp","htmlEntities"] 5232 const external_wp_htmlEntities_namespaceObject = window["wp"]["htmlEntities"]; 5233 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/store/utils/is-template-revertable.js 5234 /** 5235 * Internal dependencies 5236 */ 5237 5238 5239 // Copy of the function from packages/edit-site/src/utils/is-template-revertable.js 5240 5241 /** 5242 * Check if a template or template part is revertable to its original theme-provided file. 5243 * 5244 * @param {Object} templateOrTemplatePart The entity to check. 5245 * @return {boolean} Whether the entity is revertable. 5246 */ 5247 function isTemplateRevertable(templateOrTemplatePart) { 5248 if (!templateOrTemplatePart) { 5249 return false; 5250 } 5251 return templateOrTemplatePart.source === TEMPLATE_ORIGINS.custom && (Boolean(templateOrTemplatePart?.plugin) || templateOrTemplatePart?.has_theme_file); 5252 } 5253 5254 ;// CONCATENATED MODULE: external ["wp","components"] 5255 const external_wp_components_namespaceObject = window["wp"]["components"]; 5256 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/check.js 5257 /** 5258 * WordPress dependencies 5259 */ 5260 5261 5262 const check = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 5263 xmlns: "http://www.w3.org/2000/svg", 5264 viewBox: "0 0 24 24", 5265 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 5266 d: "M16.7 7.1l-6.3 8.5-3.3-2.5-.9 1.2 4.5 3.4L17.9 8z" 5267 }) 5268 }); 5269 /* harmony default export */ const library_check = (check); 5270 5271 ;// CONCATENATED MODULE: ./node_modules/tslib/tslib.es6.mjs 5272 /****************************************************************************** 5273 Copyright (c) Microsoft Corporation. 5274 5275 Permission to use, copy, modify, and/or distribute this software for any 5276 purpose with or without fee is hereby granted. 5277 5278 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 5279 REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 5280 AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 5281 INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 5282 LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 5283 OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 5284 PERFORMANCE OF THIS SOFTWARE. 5285 ***************************************************************************** */ 5286 /* global Reflect, Promise, SuppressedError, Symbol, Iterator */ 5287 5288 var extendStatics = function(d, b) { 5289 extendStatics = Object.setPrototypeOf || 5290 ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || 5291 function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; 5292 return extendStatics(d, b); 5293 }; 5294 5295 function __extends(d, b) { 5296 if (typeof b !== "function" && b !== null) 5297 throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); 5298 extendStatics(d, b); 5299 function __() { this.constructor = d; } 5300 d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); 5301 } 5302 5303 var __assign = function() { 5304 __assign = Object.assign || function __assign(t) { 5305 for (var s, i = 1, n = arguments.length; i < n; i++) { 5306 s = arguments[i]; 5307 for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; 5308 } 5309 return t; 5310 } 5311 return __assign.apply(this, arguments); 5312 } 5313 5314 function __rest(s, e) { 5315 var t = {}; 5316 for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) 5317 t[p] = s[p]; 5318 if (s != null && typeof Object.getOwnPropertySymbols === "function") 5319 for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { 5320 if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) 5321 t[p[i]] = s[p[i]]; 5322 } 5323 return t; 5324 } 5325 5326 function __decorate(decorators, target, key, desc) { 5327 var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; 5328 if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 5329 else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; 5330 return c > 3 && r && Object.defineProperty(target, key, r), r; 5331 } 5332 5333 function __param(paramIndex, decorator) { 5334 return function (target, key) { decorator(target, key, paramIndex); } 5335 } 5336 5337 function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) { 5338 function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; } 5339 var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value"; 5340 var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null; 5341 var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {}); 5342 var _, done = false; 5343 for (var i = decorators.length - 1; i >= 0; i--) { 5344 var context = {}; 5345 for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p]; 5346 for (var p in contextIn.access) context.access[p] = contextIn.access[p]; 5347 context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); }; 5348 var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context); 5349 if (kind === "accessor") { 5350 if (result === void 0) continue; 5351 if (result === null || typeof result !== "object") throw new TypeError("Object expected"); 5352 if (_ = accept(result.get)) descriptor.get = _; 5353 if (_ = accept(result.set)) descriptor.set = _; 5354 if (_ = accept(result.init)) initializers.unshift(_); 5355 } 5356 else if (_ = accept(result)) { 5357 if (kind === "field") initializers.unshift(_); 5358 else descriptor[key] = _; 5359 } 5360 } 5361 if (target) Object.defineProperty(target, contextIn.name, descriptor); 5362 done = true; 5363 }; 5364 5365 function __runInitializers(thisArg, initializers, value) { 5366 var useValue = arguments.length > 2; 5367 for (var i = 0; i < initializers.length; i++) { 5368 value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg); 5369 } 5370 return useValue ? value : void 0; 5371 }; 5372 5373 function __propKey(x) { 5374 return typeof x === "symbol" ? x : "".concat(x); 5375 }; 5376 5377 function __setFunctionName(f, name, prefix) { 5378 if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : ""; 5379 return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name }); 5380 }; 5381 5382 function __metadata(metadataKey, metadataValue) { 5383 if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); 5384 } 5385 5386 function __awaiter(thisArg, _arguments, P, generator) { 5387 function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 5388 return new (P || (P = Promise))(function (resolve, reject) { 5389 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 5390 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 5391 function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 5392 step((generator = generator.apply(thisArg, _arguments || [])).next()); 5393 }); 5394 } 5395 5396 function __generator(thisArg, body) { 5397 var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); 5398 return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; 5399 function verb(n) { return function (v) { return step([n, v]); }; } 5400 function step(op) { 5401 if (f) throw new TypeError("Generator is already executing."); 5402 while (g && (g = 0, op[0] && (_ = 0)), _) try { 5403 if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; 5404 if (y = 0, t) op = [op[0] & 2, t.value]; 5405 switch (op[0]) { 5406 case 0: case 1: t = op; break; 5407 case 4: _.label++; return { value: op[1], done: false }; 5408 case 5: _.label++; y = op[1]; op = [0]; continue; 5409 case 7: op = _.ops.pop(); _.trys.pop(); continue; 5410 default: 5411 if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } 5412 if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } 5413 if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } 5414 if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } 5415 if (t[2]) _.ops.pop(); 5416 _.trys.pop(); continue; 5417 } 5418 op = body.call(thisArg, _); 5419 } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } 5420 if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; 5421 } 5422 } 5423 5424 var __createBinding = Object.create ? (function(o, m, k, k2) { 5425 if (k2 === undefined) k2 = k; 5426 var desc = Object.getOwnPropertyDescriptor(m, k); 5427 if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { 5428 desc = { enumerable: true, get: function() { return m[k]; } }; 5429 } 5430 Object.defineProperty(o, k2, desc); 5431 }) : (function(o, m, k, k2) { 5432 if (k2 === undefined) k2 = k; 5433 o[k2] = m[k]; 5434 }); 5435 5436 function __exportStar(m, o) { 5437 for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p); 5438 } 5439 5440 function __values(o) { 5441 var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; 5442 if (m) return m.call(o); 5443 if (o && typeof o.length === "number") return { 5444 next: function () { 5445 if (o && i >= o.length) o = void 0; 5446 return { value: o && o[i++], done: !o }; 5447 } 5448 }; 5449 throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); 5450 } 5451 5452 function __read(o, n) { 5453 var m = typeof Symbol === "function" && o[Symbol.iterator]; 5454 if (!m) return o; 5455 var i = m.call(o), r, ar = [], e; 5456 try { 5457 while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); 5458 } 5459 catch (error) { e = { error: error }; } 5460 finally { 5461 try { 5462 if (r && !r.done && (m = i["return"])) m.call(i); 5463 } 5464 finally { if (e) throw e.error; } 5465 } 5466 return ar; 5467 } 5468 5469 /** @deprecated */ 5470 function __spread() { 5471 for (var ar = [], i = 0; i < arguments.length; i++) 5472 ar = ar.concat(__read(arguments[i])); 5473 return ar; 5474 } 5475 5476 /** @deprecated */ 5477 function __spreadArrays() { 5478 for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; 5479 for (var r = Array(s), k = 0, i = 0; i < il; i++) 5480 for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) 5481 r[k] = a[j]; 5482 return r; 5483 } 5484 5485 function __spreadArray(to, from, pack) { 5486 if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { 5487 if (ar || !(i in from)) { 5488 if (!ar) ar = Array.prototype.slice.call(from, 0, i); 5489 ar[i] = from[i]; 5490 } 5491 } 5492 return to.concat(ar || Array.prototype.slice.call(from)); 5493 } 5494 5495 function __await(v) { 5496 return this instanceof __await ? (this.v = v, this) : new __await(v); 5497 } 5498 5499 function __asyncGenerator(thisArg, _arguments, generator) { 5500 if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); 5501 var g = generator.apply(thisArg, _arguments || []), i, q = []; 5502 return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i; 5503 function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; } 5504 function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } } 5505 function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } 5506 function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } 5507 function fulfill(value) { resume("next", value); } 5508 function reject(value) { resume("throw", value); } 5509 function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } 5510 } 5511 5512 function __asyncDelegator(o) { 5513 var i, p; 5514 return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; 5515 function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; } 5516 } 5517 5518 function __asyncValues(o) { 5519 if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); 5520 var m = o[Symbol.asyncIterator], i; 5521 return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); 5522 function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } 5523 function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } 5524 } 5525 5526 function __makeTemplateObject(cooked, raw) { 5527 if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } 5528 return cooked; 5529 }; 5530 5531 var __setModuleDefault = Object.create ? (function(o, v) { 5532 Object.defineProperty(o, "default", { enumerable: true, value: v }); 5533 }) : function(o, v) { 5534 o["default"] = v; 5535 }; 5536 5537 function __importStar(mod) { 5538 if (mod && mod.__esModule) return mod; 5539 var result = {}; 5540 if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); 5541 __setModuleDefault(result, mod); 5542 return result; 5543 } 5544 5545 function __importDefault(mod) { 5546 return (mod && mod.__esModule) ? mod : { default: mod }; 5547 } 5548 5549 function __classPrivateFieldGet(receiver, state, kind, f) { 5550 if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); 5551 if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); 5552 return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); 5553 } 5554 5555 function __classPrivateFieldSet(receiver, state, value, kind, f) { 5556 if (kind === "m") throw new TypeError("Private method is not writable"); 5557 if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); 5558 if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); 5559 return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; 5560 } 5561 5562 function __classPrivateFieldIn(state, receiver) { 5563 if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use 'in' operator on non-object"); 5564 return typeof state === "function" ? receiver === state : state.has(receiver); 5565 } 5566 5567 function __addDisposableResource(env, value, async) { 5568 if (value !== null && value !== void 0) { 5569 if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected."); 5570 var dispose, inner; 5571 if (async) { 5572 if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined."); 5573 dispose = value[Symbol.asyncDispose]; 5574 } 5575 if (dispose === void 0) { 5576 if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined."); 5577 dispose = value[Symbol.dispose]; 5578 if (async) inner = dispose; 5579 } 5580 if (typeof dispose !== "function") throw new TypeError("Object not disposable."); 5581 if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } }; 5582 env.stack.push({ value: value, dispose: dispose, async: async }); 5583 } 5584 else if (async) { 5585 env.stack.push({ async: true }); 5586 } 5587 return value; 5588 } 5589 5590 var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { 5591 var e = new Error(message); 5592 return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; 5593 }; 5594 5595 function __disposeResources(env) { 5596 function fail(e) { 5597 env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e; 5598 env.hasError = true; 5599 } 5600 var r, s = 0; 5601 function next() { 5602 while (r = env.stack.pop()) { 5603 try { 5604 if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next); 5605 if (r.dispose) { 5606 var result = r.dispose.call(r.value); 5607 if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); }); 5608 } 5609 else s |= 1; 5610 } 5611 catch (e) { 5612 fail(e); 5613 } 5614 } 5615 if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve(); 5616 if (env.hasError) throw env.error; 5617 } 5618 return next(); 5619 } 5620 5621 /* harmony default export */ const tslib_es6 = ({ 5622 __extends, 5623 __assign, 5624 __rest, 5625 __decorate, 5626 __param, 5627 __metadata, 5628 __awaiter, 5629 __generator, 5630 __createBinding, 5631 __exportStar, 5632 __values, 5633 __read, 5634 __spread, 5635 __spreadArrays, 5636 __spreadArray, 5637 __await, 5638 __asyncGenerator, 5639 __asyncDelegator, 5640 __asyncValues, 5641 __makeTemplateObject, 5642 __importStar, 5643 __importDefault, 5644 __classPrivateFieldGet, 5645 __classPrivateFieldSet, 5646 __classPrivateFieldIn, 5647 __addDisposableResource, 5648 __disposeResources, 5649 }); 5650 5651 ;// CONCATENATED MODULE: ./node_modules/lower-case/dist.es2015/index.js 5652 /** 5653 * Source: ftp://ftp.unicode.org/Public/UCD/latest/ucd/SpecialCasing.txt 5654 */ 5655 var SUPPORTED_LOCALE = { 5656 tr: { 5657 regexp: /\u0130|\u0049|\u0049\u0307/g, 5658 map: { 5659 İ: "\u0069", 5660 I: "\u0131", 5661 İ: "\u0069", 5662 }, 5663 }, 5664 az: { 5665 regexp: /\u0130/g, 5666 map: { 5667 İ: "\u0069", 5668 I: "\u0131", 5669 İ: "\u0069", 5670 }, 5671 }, 5672 lt: { 5673 regexp: /\u0049|\u004A|\u012E|\u00CC|\u00CD|\u0128/g, 5674 map: { 5675 I: "\u0069\u0307", 5676 J: "\u006A\u0307", 5677 Į: "\u012F\u0307", 5678 Ì: "\u0069\u0307\u0300", 5679 Í: "\u0069\u0307\u0301", 5680 Ĩ: "\u0069\u0307\u0303", 5681 }, 5682 }, 5683 }; 5684 /** 5685 * Localized lower case. 5686 */ 5687 function localeLowerCase(str, locale) { 5688 var lang = SUPPORTED_LOCALE[locale.toLowerCase()]; 5689 if (lang) 5690 return lowerCase(str.replace(lang.regexp, function (m) { return lang.map[m]; })); 5691 return lowerCase(str); 5692 } 5693 /** 5694 * Lower case as a function. 5695 */ 5696 function lowerCase(str) { 5697 return str.toLowerCase(); 5698 } 5699 5700 ;// CONCATENATED MODULE: ./node_modules/no-case/dist.es2015/index.js 5701 5702 // Support camel case ("camelCase" -> "camel Case" and "CAMELCase" -> "CAMEL Case"). 5703 var DEFAULT_SPLIT_REGEXP = [/([a-z0-9])([A-Z])/g, /([A-Z])([A-Z][a-z])/g]; 5704 // Remove all non-word characters. 5705 var DEFAULT_STRIP_REGEXP = /[^A-Z0-9]+/gi; 5706 /** 5707 * Normalize the string into something other libraries can manipulate easier. 5708 */ 5709 function noCase(input, options) { 5710 if (options === void 0) { options = {}; } 5711 var _a = options.splitRegexp, splitRegexp = _a === void 0 ? DEFAULT_SPLIT_REGEXP : _a, _b = options.stripRegexp, stripRegexp = _b === void 0 ? DEFAULT_STRIP_REGEXP : _b, _c = options.transform, transform = _c === void 0 ? lowerCase : _c, _d = options.delimiter, delimiter = _d === void 0 ? " " : _d; 5712 var result = replace(replace(input, splitRegexp, "$1\0$2"), stripRegexp, "\0"); 5713 var start = 0; 5714 var end = result.length; 5715 // Trim the delimiter from around the output string. 5716 while (result.charAt(start) === "\0") 5717 start++; 5718 while (result.charAt(end - 1) === "\0") 5719 end--; 5720 // Transform each token independently. 5721 return result.slice(start, end).split("\0").map(transform).join(delimiter); 5722 } 5723 /** 5724 * Replace `re` in the input string with the replacement value. 5725 */ 5726 function replace(input, re, value) { 5727 if (re instanceof RegExp) 5728 return input.replace(re, value); 5729 return re.reduce(function (input, re) { return input.replace(re, value); }, input); 5730 } 5731 5732 ;// CONCATENATED MODULE: ./node_modules/dot-case/dist.es2015/index.js 5733 5734 5735 function dotCase(input, options) { 5736 if (options === void 0) { options = {}; } 5737 return noCase(input, __assign({ delimiter: "." }, options)); 5738 } 5739 5740 ;// CONCATENATED MODULE: ./node_modules/param-case/dist.es2015/index.js 5741 5742 5743 function paramCase(input, options) { 5744 if (options === void 0) { options = {}; } 5745 return dotCase(input, __assign({ delimiter: "-" }, options)); 5746 } 5747 5748 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/create-template-part-modal/utils.js 5749 /** 5750 * External dependencies 5751 */ 5752 5753 5754 /** 5755 * WordPress dependencies 5756 */ 5757 5758 5759 5760 /** 5761 * Internal dependencies 5762 */ 5763 5764 const useExistingTemplateParts = () => { 5765 return (0,external_wp_data_namespaceObject.useSelect)(select => select(external_wp_coreData_namespaceObject.store).getEntityRecords('postType', TEMPLATE_PART_POST_TYPE, { 5766 per_page: -1 5767 }), []); 5768 }; 5769 5770 /** 5771 * Return a unique template part title based on 5772 * the given title and existing template parts. 5773 * 5774 * @param {string} title The original template part title. 5775 * @param {Object} templateParts The array of template part entities. 5776 * @return {string} A unique template part title. 5777 */ 5778 const getUniqueTemplatePartTitle = (title, templateParts) => { 5779 const lowercaseTitle = title.toLowerCase(); 5780 const existingTitles = templateParts.map(templatePart => templatePart.title.rendered.toLowerCase()); 5781 if (!existingTitles.includes(lowercaseTitle)) { 5782 return title; 5783 } 5784 let suffix = 2; 5785 while (existingTitles.includes(`$lowercaseTitle} $suffix}`)) { 5786 suffix++; 5787 } 5788 return `$title} $suffix}`; 5789 }; 5790 5791 /** 5792 * Get a valid slug for a template part. 5793 * Currently template parts only allow latin chars. 5794 * The fallback slug will receive suffix by default. 5795 * 5796 * @param {string} title The template part title. 5797 * @return {string} A valid template part slug. 5798 */ 5799 const getCleanTemplatePartSlug = title => { 5800 return paramCase(title).replace(/[^\w-]+/g, '') || 'wp-custom-part'; 5801 }; 5802 5803 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/create-template-part-modal/index.js 5804 /** 5805 * WordPress dependencies 5806 */ 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 /** 5818 * Internal dependencies 5819 */ 5820 5821 5822 5823 5824 5825 function CreateTemplatePartModal({ 5826 modalTitle, 5827 ...restProps 5828 }) { 5829 const defaultModalTitle = (0,external_wp_data_namespaceObject.useSelect)(select => select(external_wp_coreData_namespaceObject.store).getPostType(TEMPLATE_PART_POST_TYPE)?.labels?.add_new_item, []); 5830 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Modal, { 5831 title: modalTitle || defaultModalTitle, 5832 onRequestClose: restProps.closeModal, 5833 overlayClassName: "editor-create-template-part-modal", 5834 focusOnMount: "firstContentElement", 5835 size: "medium", 5836 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(CreateTemplatePartModalContents, { 5837 ...restProps 5838 }) 5839 }); 5840 } 5841 function CreateTemplatePartModalContents({ 5842 defaultArea = TEMPLATE_PART_AREA_DEFAULT_CATEGORY, 5843 blocks = [], 5844 confirmLabel = (0,external_wp_i18n_namespaceObject.__)('Add'), 5845 closeModal, 5846 onCreate, 5847 onError, 5848 defaultTitle = '' 5849 }) { 5850 const { 5851 createErrorNotice 5852 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); 5853 const { 5854 saveEntityRecord 5855 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); 5856 const existingTemplateParts = useExistingTemplateParts(); 5857 const [title, setTitle] = (0,external_wp_element_namespaceObject.useState)(defaultTitle); 5858 const [area, setArea] = (0,external_wp_element_namespaceObject.useState)(defaultArea); 5859 const [isSubmitting, setIsSubmitting] = (0,external_wp_element_namespaceObject.useState)(false); 5860 const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(CreateTemplatePartModal); 5861 const templatePartAreas = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).__experimentalGetDefaultTemplatePartAreas(), []); 5862 async function createTemplatePart() { 5863 if (!title || isSubmitting) { 5864 return; 5865 } 5866 try { 5867 setIsSubmitting(true); 5868 const uniqueTitle = getUniqueTemplatePartTitle(title, existingTemplateParts); 5869 const cleanSlug = getCleanTemplatePartSlug(uniqueTitle); 5870 const templatePart = await saveEntityRecord('postType', TEMPLATE_PART_POST_TYPE, { 5871 slug: cleanSlug, 5872 title: uniqueTitle, 5873 content: (0,external_wp_blocks_namespaceObject.serialize)(blocks), 5874 area 5875 }, { 5876 throwOnError: true 5877 }); 5878 await onCreate(templatePart); 5879 5880 // TODO: Add a success notice? 5881 } catch (error) { 5882 const errorMessage = error.message && error.code !== 'unknown_error' ? error.message : (0,external_wp_i18n_namespaceObject.__)('An error occurred while creating the template part.'); 5883 createErrorNotice(errorMessage, { 5884 type: 'snackbar' 5885 }); 5886 onError?.(); 5887 } finally { 5888 setIsSubmitting(false); 5889 } 5890 } 5891 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("form", { 5892 onSubmit: async event => { 5893 event.preventDefault(); 5894 await createTemplatePart(); 5895 }, 5896 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { 5897 spacing: "4", 5898 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.TextControl, { 5899 __next40pxDefaultSize: true, 5900 __nextHasNoMarginBottom: true, 5901 label: (0,external_wp_i18n_namespaceObject.__)('Name'), 5902 value: title, 5903 onChange: setTitle, 5904 required: true 5905 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.BaseControl, { 5906 __nextHasNoMarginBottom: true, 5907 label: (0,external_wp_i18n_namespaceObject.__)('Area'), 5908 id: `editor-create-template-part-modal__area-selection-$instanceId}`, 5909 className: "editor-create-template-part-modal__area-base-control", 5910 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalRadioGroup, { 5911 label: (0,external_wp_i18n_namespaceObject.__)('Area'), 5912 className: "editor-create-template-part-modal__area-radio-group", 5913 id: `editor-create-template-part-modal__area-selection-$instanceId}`, 5914 onChange: setArea, 5915 checked: area, 5916 children: templatePartAreas.map(({ 5917 icon, 5918 label, 5919 area: value, 5920 description 5921 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalRadio, { 5922 value: value, 5923 className: "editor-create-template-part-modal__area-radio", 5924 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.Flex, { 5925 align: "start", 5926 justify: "start", 5927 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.FlexItem, { 5928 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Icon, { 5929 icon: icon 5930 }) 5931 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.FlexBlock, { 5932 className: "editor-create-template-part-modal__option-label", 5933 children: [label, /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 5934 children: description 5935 })] 5936 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.FlexItem, { 5937 className: "editor-create-template-part-modal__checkbox", 5938 children: area === value && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Icon, { 5939 icon: library_check 5940 }) 5941 })] 5942 }) 5943 }, label)) 5944 }) 5945 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, { 5946 justify: "right", 5947 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 5948 __next40pxDefaultSize: true, 5949 variant: "tertiary", 5950 onClick: () => { 5951 closeModal(); 5952 }, 5953 children: (0,external_wp_i18n_namespaceObject.__)('Cancel') 5954 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 5955 __next40pxDefaultSize: true, 5956 variant: "primary", 5957 type: "submit", 5958 "aria-disabled": !title || isSubmitting, 5959 isBusy: isSubmitting, 5960 children: confirmLabel 5961 })] 5962 })] 5963 }) 5964 }); 5965 } 5966 5967 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/dataviews/actions/utils.js 5968 /** 5969 * WordPress dependencies 5970 */ 5971 5972 5973 /** 5974 * Internal dependencies 5975 */ 5976 5977 function isTemplate(post) { 5978 return post.type === TEMPLATE_POST_TYPE; 5979 } 5980 function isTemplatePart(post) { 5981 return post.type === TEMPLATE_PART_POST_TYPE; 5982 } 5983 function isTemplateOrTemplatePart(p) { 5984 return p.type === TEMPLATE_POST_TYPE || p.type === TEMPLATE_PART_POST_TYPE; 5985 } 5986 function getItemTitle(item) { 5987 if (typeof item.title === 'string') { 5988 return (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(item.title); 5989 } 5990 if ('rendered' in item.title) { 5991 return (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(item.title.rendered); 5992 } 5993 if ('raw' in item.title) { 5994 return (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(item.title.raw); 5995 } 5996 return ''; 5997 } 5998 5999 /** 6000 * Check if a template is removable. 6001 * 6002 * @param template The template entity to check. 6003 * @return Whether the template is removable. 6004 */ 6005 function isTemplateRemovable(template) { 6006 if (!template) { 6007 return false; 6008 } 6009 // In patterns list page we map the templates parts to a different object 6010 // than the one returned from the endpoint. This is why we need to check for 6011 // two props whether is custom or has a theme file. 6012 return [template.source, template.source].includes(TEMPLATE_ORIGINS.custom) && !Boolean(template.type === 'wp_template' && template?.plugin) && !template.has_theme_file; 6013 } 6014 6015 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/dataviews/actions/duplicate-template-part.js 6016 /** 6017 * WordPress dependencies 6018 */ 6019 6020 6021 6022 6023 // @ts-ignore 6024 6025 /** 6026 * Internal dependencies 6027 */ 6028 6029 6030 6031 6032 const duplicateTemplatePart = { 6033 id: 'duplicate-template-part', 6034 label: (0,external_wp_i18n_namespaceObject._x)('Duplicate', 'action label'), 6035 isEligible: item => item.type === TEMPLATE_PART_POST_TYPE, 6036 modalHeader: (0,external_wp_i18n_namespaceObject._x)('Duplicate template part', 'action label'), 6037 RenderModal: ({ 6038 items, 6039 closeModal 6040 }) => { 6041 const [item] = items; 6042 const blocks = (0,external_wp_element_namespaceObject.useMemo)(() => { 6043 var _item$blocks; 6044 return (_item$blocks = item.blocks) !== null && _item$blocks !== void 0 ? _item$blocks : (0,external_wp_blocks_namespaceObject.parse)(typeof item.content === 'string' ? item.content : item.content.raw, { 6045 __unstableSkipMigrationLogs: true 6046 }); 6047 }, [item.content, item.blocks]); 6048 const { 6049 createSuccessNotice 6050 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); 6051 function onTemplatePartSuccess() { 6052 createSuccessNotice((0,external_wp_i18n_namespaceObject.sprintf)( 6053 // translators: %s: The new template part's title e.g. 'Call to action (copy)'. 6054 (0,external_wp_i18n_namespaceObject._x)('"%s" duplicated.', 'template part'), getItemTitle(item)), { 6055 type: 'snackbar', 6056 id: 'edit-site-patterns-success' 6057 }); 6058 closeModal?.(); 6059 } 6060 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(CreateTemplatePartModalContents, { 6061 blocks: blocks, 6062 defaultArea: item.area, 6063 defaultTitle: (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: Existing template part title */ 6064 (0,external_wp_i18n_namespaceObject._x)('%s (Copy)', 'template part'), getItemTitle(item)), 6065 onCreate: onTemplatePartSuccess, 6066 onError: closeModal, 6067 confirmLabel: (0,external_wp_i18n_namespaceObject._x)('Duplicate', 'action label'), 6068 closeModal: closeModal 6069 }); 6070 } 6071 }; 6072 /* harmony default export */ const duplicate_template_part = (duplicateTemplatePart); 6073 6074 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/backup.js 6075 /** 6076 * WordPress dependencies 6077 */ 6078 6079 6080 const backup = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 6081 xmlns: "http://www.w3.org/2000/svg", 6082 viewBox: "0 0 24 24", 6083 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 6084 d: "M5.5 12h1.75l-2.5 3-2.5-3H4a8 8 0 113.134 6.35l.907-1.194A6.5 6.5 0 105.5 12zm9.53 1.97l-2.28-2.28V8.5a.75.75 0 00-1.5 0V12a.747.747 0 00.218.529l1.282-.84-1.28.842 2.5 2.5a.75.75 0 101.06-1.061z" 6085 }) 6086 }); 6087 /* harmony default export */ const library_backup = (backup); 6088 6089 ;// CONCATENATED MODULE: external ["wp","privateApis"] 6090 const external_wp_privateApis_namespaceObject = window["wp"]["privateApis"]; 6091 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/lock-unlock.js 6092 /** 6093 * WordPress dependencies 6094 */ 6095 6096 const { 6097 lock, 6098 unlock 6099 } = (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/editor'); 6100 6101 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/dataviews/actions/reset-post.js 6102 /** 6103 * WordPress dependencies 6104 */ 6105 6106 6107 6108 6109 6110 6111 6112 /** 6113 * Internal dependencies 6114 */ 6115 6116 6117 6118 6119 6120 6121 const reset_post_resetPost = { 6122 id: 'reset-post', 6123 label: (0,external_wp_i18n_namespaceObject.__)('Reset'), 6124 isEligible: item => { 6125 return isTemplateOrTemplatePart(item) && item?.source === TEMPLATE_ORIGINS.custom && (Boolean(item.type === 'wp_template' && item?.plugin) || item?.has_theme_file); 6126 }, 6127 icon: library_backup, 6128 supportsBulk: true, 6129 hideModalHeader: true, 6130 RenderModal: ({ 6131 items, 6132 closeModal, 6133 onActionPerformed 6134 }) => { 6135 const [isBusy, setIsBusy] = (0,external_wp_element_namespaceObject.useState)(false); 6136 const { 6137 revertTemplate 6138 } = unlock((0,external_wp_data_namespaceObject.useDispatch)(store_store)); 6139 const { 6140 saveEditedEntityRecord 6141 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); 6142 const { 6143 createSuccessNotice, 6144 createErrorNotice 6145 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); 6146 const onConfirm = async () => { 6147 try { 6148 for (const template of items) { 6149 await revertTemplate(template, { 6150 allowUndo: false 6151 }); 6152 await saveEditedEntityRecord('postType', template.type, template.id); 6153 } 6154 createSuccessNotice(items.length > 1 ? (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: The number of items. */ 6155 (0,external_wp_i18n_namespaceObject.__)('%s items reset.'), items.length) : (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: The template/part's name. */ 6156 (0,external_wp_i18n_namespaceObject.__)('"%s" reset.'), getItemTitle(items[0])), { 6157 type: 'snackbar', 6158 id: 'revert-template-action' 6159 }); 6160 } catch (error) { 6161 let fallbackErrorMessage; 6162 if (items[0].type === TEMPLATE_POST_TYPE) { 6163 fallbackErrorMessage = items.length === 1 ? (0,external_wp_i18n_namespaceObject.__)('An error occurred while reverting the template.') : (0,external_wp_i18n_namespaceObject.__)('An error occurred while reverting the templates.'); 6164 } else { 6165 fallbackErrorMessage = items.length === 1 ? (0,external_wp_i18n_namespaceObject.__)('An error occurred while reverting the template part.') : (0,external_wp_i18n_namespaceObject.__)('An error occurred while reverting the template parts.'); 6166 } 6167 const typedError = error; 6168 const errorMessage = typedError.message && typedError.code !== 'unknown_error' ? typedError.message : fallbackErrorMessage; 6169 createErrorNotice(errorMessage, { 6170 type: 'snackbar' 6171 }); 6172 } 6173 }; 6174 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { 6175 spacing: "5", 6176 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { 6177 children: (0,external_wp_i18n_namespaceObject.__)('Reset to default and clear all customizations?') 6178 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, { 6179 justify: "right", 6180 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 6181 __next40pxDefaultSize: true, 6182 variant: "tertiary", 6183 onClick: closeModal, 6184 disabled: isBusy, 6185 accessibleWhenDisabled: true, 6186 children: (0,external_wp_i18n_namespaceObject.__)('Cancel') 6187 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 6188 __next40pxDefaultSize: true, 6189 variant: "primary", 6190 onClick: async () => { 6191 setIsBusy(true); 6192 await onConfirm(); 6193 onActionPerformed?.(items); 6194 setIsBusy(false); 6195 closeModal?.(); 6196 }, 6197 isBusy: isBusy, 6198 disabled: isBusy, 6199 accessibleWhenDisabled: true, 6200 children: (0,external_wp_i18n_namespaceObject.__)('Reset') 6201 })] 6202 })] 6203 }); 6204 } 6205 }; 6206 /* harmony default export */ const reset_post = (reset_post_resetPost); 6207 6208 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/trash.js 6209 /** 6210 * WordPress dependencies 6211 */ 6212 6213 6214 const trash = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 6215 xmlns: "http://www.w3.org/2000/svg", 6216 viewBox: "0 0 24 24", 6217 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 6218 fillRule: "evenodd", 6219 clipRule: "evenodd", 6220 d: "M12 5.5A2.25 2.25 0 0 0 9.878 7h4.244A2.251 2.251 0 0 0 12 5.5ZM12 4a3.751 3.751 0 0 0-3.675 3H5v1.5h1.27l.818 8.997a2.75 2.75 0 0 0 2.739 2.501h4.347a2.75 2.75 0 0 0 2.738-2.5L17.73 8.5H19V7h-3.325A3.751 3.751 0 0 0 12 4Zm4.224 4.5H7.776l.806 8.861a1.25 1.25 0 0 0 1.245 1.137h4.347a1.25 1.25 0 0 0 1.245-1.137l.805-8.861Z" 6221 }) 6222 }); 6223 /* harmony default export */ const library_trash = (trash); 6224 6225 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/dataviews/actions/trash-post.js 6226 /** 6227 * WordPress dependencies 6228 */ 6229 6230 6231 6232 6233 6234 6235 6236 /** 6237 * Internal dependencies 6238 */ 6239 6240 6241 6242 const trash_post_trashPost = { 6243 id: 'move-to-trash', 6244 label: (0,external_wp_i18n_namespaceObject.__)('Move to trash'), 6245 isPrimary: true, 6246 icon: library_trash, 6247 isEligible(item) { 6248 if (isTemplateOrTemplatePart(item) || item.type === 'wp_block') { 6249 return false; 6250 } 6251 return !!item.status && !['auto-draft', 'trash'].includes(item.status) && item.permissions?.delete; 6252 }, 6253 supportsBulk: true, 6254 hideModalHeader: true, 6255 RenderModal: ({ 6256 items, 6257 closeModal, 6258 onActionPerformed 6259 }) => { 6260 const [isBusy, setIsBusy] = (0,external_wp_element_namespaceObject.useState)(false); 6261 const { 6262 createSuccessNotice, 6263 createErrorNotice 6264 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); 6265 const { 6266 deleteEntityRecord 6267 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); 6268 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { 6269 spacing: "5", 6270 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { 6271 children: items.length === 1 ? (0,external_wp_i18n_namespaceObject.sprintf)( 6272 // translators: %s: The item's title. 6273 (0,external_wp_i18n_namespaceObject.__)('Are you sure you want to move "%s" to the trash?'), getItemTitle(items[0])) : (0,external_wp_i18n_namespaceObject.sprintf)( 6274 // translators: %d: The number of items (2 or more). 6275 (0,external_wp_i18n_namespaceObject._n)('Are you sure you want to move %d item to the trash ?', 'Are you sure you want to move %d items to the trash ?', items.length), items.length) 6276 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, { 6277 justify: "right", 6278 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 6279 __next40pxDefaultSize: true, 6280 variant: "tertiary", 6281 onClick: closeModal, 6282 disabled: isBusy, 6283 accessibleWhenDisabled: true, 6284 children: (0,external_wp_i18n_namespaceObject.__)('Cancel') 6285 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 6286 __next40pxDefaultSize: true, 6287 variant: "primary", 6288 onClick: async () => { 6289 setIsBusy(true); 6290 const promiseResult = await Promise.allSettled(items.map(item => deleteEntityRecord('postType', item.type, item.id.toString(), {}, { 6291 throwOnError: true 6292 }))); 6293 // If all the promises were fulfilled with success. 6294 if (promiseResult.every(({ 6295 status 6296 }) => status === 'fulfilled')) { 6297 let successMessage; 6298 if (promiseResult.length === 1) { 6299 successMessage = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: The item's title. */ 6300 (0,external_wp_i18n_namespaceObject.__)('"%s" moved to the trash.'), getItemTitle(items[0])); 6301 } else { 6302 successMessage = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: The number of items. */ 6303 (0,external_wp_i18n_namespaceObject._n)('%s item moved to the trash.', '%s items moved to the trash.', items.length), items.length); 6304 } 6305 createSuccessNotice(successMessage, { 6306 type: 'snackbar', 6307 id: 'move-to-trash-action' 6308 }); 6309 } else { 6310 // If there was at least one failure. 6311 let errorMessage; 6312 // If we were trying to delete a single item. 6313 if (promiseResult.length === 1) { 6314 const typedError = promiseResult[0]; 6315 if (typedError.reason?.message) { 6316 errorMessage = typedError.reason.message; 6317 } else { 6318 errorMessage = (0,external_wp_i18n_namespaceObject.__)('An error occurred while moving the item to the trash.'); 6319 } 6320 // If we were trying to delete multiple items. 6321 } else { 6322 const errorMessages = new Set(); 6323 const failedPromises = promiseResult.filter(({ 6324 status 6325 }) => status === 'rejected'); 6326 for (const failedPromise of failedPromises) { 6327 const typedError = failedPromise; 6328 if (typedError.reason?.message) { 6329 errorMessages.add(typedError.reason.message); 6330 } 6331 } 6332 if (errorMessages.size === 0) { 6333 errorMessage = (0,external_wp_i18n_namespaceObject.__)('An error occurred while moving the items to the trash.'); 6334 } else if (errorMessages.size === 1) { 6335 errorMessage = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: an error message */ 6336 (0,external_wp_i18n_namespaceObject.__)('An error occurred while moving the item to the trash: %s'), [...errorMessages][0]); 6337 } else { 6338 errorMessage = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: a list of comma separated error messages */ 6339 (0,external_wp_i18n_namespaceObject.__)('Some errors occurred while moving the items to the trash: %s'), [...errorMessages].join(',')); 6340 } 6341 } 6342 createErrorNotice(errorMessage, { 6343 type: 'snackbar' 6344 }); 6345 } 6346 if (onActionPerformed) { 6347 onActionPerformed(items); 6348 } 6349 setIsBusy(false); 6350 closeModal?.(); 6351 }, 6352 isBusy: isBusy, 6353 disabled: isBusy, 6354 accessibleWhenDisabled: true, 6355 children: (0,external_wp_i18n_namespaceObject._x)('Trash', 'verb') 6356 })] 6357 })] 6358 }); 6359 } 6360 }; 6361 /* harmony default export */ const trash_post = (trash_post_trashPost); 6362 6363 ;// CONCATENATED MODULE: external ["wp","patterns"] 6364 const external_wp_patterns_namespaceObject = window["wp"]["patterns"]; 6365 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/dataviews/actions/rename-post.js 6366 /** 6367 * WordPress dependencies 6368 */ 6369 6370 6371 6372 6373 // @ts-ignore 6374 6375 6376 6377 6378 /** 6379 * Internal dependencies 6380 */ 6381 6382 6383 6384 6385 6386 // Patterns. 6387 const { 6388 PATTERN_TYPES 6389 } = unlock(external_wp_patterns_namespaceObject.privateApis); 6390 const renamePost = { 6391 id: 'rename-post', 6392 label: (0,external_wp_i18n_namespaceObject.__)('Rename'), 6393 isEligible(post) { 6394 if (post.status === 'trash') { 6395 return false; 6396 } 6397 // Templates, template parts and patterns have special checks for renaming. 6398 if (![TEMPLATE_POST_TYPE, TEMPLATE_PART_POST_TYPE, ...Object.values(PATTERN_TYPES)].includes(post.type)) { 6399 return post.permissions?.update; 6400 } 6401 6402 // In the case of templates, we can only rename custom templates. 6403 if (isTemplate(post)) { 6404 return isTemplateRemovable(post) && post.is_custom && post.permissions?.update; 6405 } 6406 if (isTemplatePart(post)) { 6407 return post.source === TEMPLATE_ORIGINS.custom && !post?.has_theme_file && post.permissions?.update; 6408 } 6409 return post.type === PATTERN_TYPES.user && post.permissions?.update; 6410 }, 6411 RenderModal: ({ 6412 items, 6413 closeModal, 6414 onActionPerformed 6415 }) => { 6416 const [item] = items; 6417 const [title, setTitle] = (0,external_wp_element_namespaceObject.useState)(() => getItemTitle(item)); 6418 const { 6419 editEntityRecord, 6420 saveEditedEntityRecord 6421 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); 6422 const { 6423 createSuccessNotice, 6424 createErrorNotice 6425 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); 6426 async function onRename(event) { 6427 event.preventDefault(); 6428 try { 6429 await editEntityRecord('postType', item.type, item.id, { 6430 title 6431 }); 6432 // Update state before saving rerenders the list. 6433 setTitle(''); 6434 closeModal?.(); 6435 // Persist edited entity. 6436 await saveEditedEntityRecord('postType', item.type, item.id, { 6437 throwOnError: true 6438 }); 6439 createSuccessNotice((0,external_wp_i18n_namespaceObject.__)('Name updated'), { 6440 type: 'snackbar' 6441 }); 6442 onActionPerformed?.(items); 6443 } catch (error) { 6444 const typedError = error; 6445 const errorMessage = typedError.message && typedError.code !== 'unknown_error' ? typedError.message : (0,external_wp_i18n_namespaceObject.__)('An error occurred while updating the name'); 6446 createErrorNotice(errorMessage, { 6447 type: 'snackbar' 6448 }); 6449 } 6450 } 6451 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("form", { 6452 onSubmit: onRename, 6453 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { 6454 spacing: "5", 6455 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.TextControl, { 6456 __nextHasNoMarginBottom: true, 6457 __next40pxDefaultSize: true, 6458 label: (0,external_wp_i18n_namespaceObject.__)('Name'), 6459 value: title, 6460 onChange: setTitle, 6461 required: true 6462 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, { 6463 justify: "right", 6464 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 6465 __next40pxDefaultSize: true, 6466 variant: "tertiary", 6467 onClick: () => { 6468 closeModal?.(); 6469 }, 6470 children: (0,external_wp_i18n_namespaceObject.__)('Cancel') 6471 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 6472 __next40pxDefaultSize: true, 6473 variant: "primary", 6474 type: "submit", 6475 children: (0,external_wp_i18n_namespaceObject.__)('Save') 6476 })] 6477 })] 6478 }) 6479 }); 6480 } 6481 }; 6482 /* harmony default export */ const rename_post = (renamePost); 6483 6484 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/dataviews/actions/restore-post.js 6485 /** 6486 * WordPress dependencies 6487 */ 6488 6489 6490 6491 6492 /** 6493 * Internal dependencies 6494 */ 6495 6496 const restorePost = { 6497 id: 'restore', 6498 label: (0,external_wp_i18n_namespaceObject.__)('Restore'), 6499 isPrimary: true, 6500 icon: library_backup, 6501 supportsBulk: true, 6502 isEligible(item) { 6503 return !isTemplateOrTemplatePart(item) && item.type !== 'wp_block' && item.status === 'trash' && item.permissions?.update; 6504 }, 6505 async callback(posts, { 6506 registry, 6507 onActionPerformed 6508 }) { 6509 const { 6510 createSuccessNotice, 6511 createErrorNotice 6512 } = registry.dispatch(external_wp_notices_namespaceObject.store); 6513 const { 6514 editEntityRecord, 6515 saveEditedEntityRecord 6516 } = registry.dispatch(external_wp_coreData_namespaceObject.store); 6517 await Promise.allSettled(posts.map(post => { 6518 return editEntityRecord('postType', post.type, post.id, { 6519 status: 'draft' 6520 }); 6521 })); 6522 const promiseResult = await Promise.allSettled(posts.map(post => { 6523 return saveEditedEntityRecord('postType', post.type, post.id, { 6524 throwOnError: true 6525 }); 6526 })); 6527 if (promiseResult.every(({ 6528 status 6529 }) => status === 'fulfilled')) { 6530 let successMessage; 6531 if (posts.length === 1) { 6532 successMessage = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: The number of posts. */ 6533 (0,external_wp_i18n_namespaceObject.__)('"%s" has been restored.'), getItemTitle(posts[0])); 6534 } else if (posts[0].type === 'page') { 6535 successMessage = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: The number of posts. */ 6536 (0,external_wp_i18n_namespaceObject.__)('%d pages have been restored.'), posts.length); 6537 } else { 6538 successMessage = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: The number of posts. */ 6539 (0,external_wp_i18n_namespaceObject.__)('%d posts have been restored.'), posts.length); 6540 } 6541 createSuccessNotice(successMessage, { 6542 type: 'snackbar', 6543 id: 'restore-post-action' 6544 }); 6545 if (onActionPerformed) { 6546 onActionPerformed(posts); 6547 } 6548 } else { 6549 // If there was at lease one failure. 6550 let errorMessage; 6551 // If we were trying to move a single post to the trash. 6552 if (promiseResult.length === 1) { 6553 const typedError = promiseResult[0]; 6554 if (typedError.reason?.message) { 6555 errorMessage = typedError.reason.message; 6556 } else { 6557 errorMessage = (0,external_wp_i18n_namespaceObject.__)('An error occurred while restoring the post.'); 6558 } 6559 // If we were trying to move multiple posts to the trash 6560 } else { 6561 const errorMessages = new Set(); 6562 const failedPromises = promiseResult.filter(({ 6563 status 6564 }) => status === 'rejected'); 6565 for (const failedPromise of failedPromises) { 6566 const typedError = failedPromise; 6567 if (typedError.reason?.message) { 6568 errorMessages.add(typedError.reason.message); 6569 } 6570 } 6571 if (errorMessages.size === 0) { 6572 errorMessage = (0,external_wp_i18n_namespaceObject.__)('An error occurred while restoring the posts.'); 6573 } else if (errorMessages.size === 1) { 6574 errorMessage = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: an error message */ 6575 (0,external_wp_i18n_namespaceObject.__)('An error occurred while restoring the posts: %s'), [...errorMessages][0]); 6576 } else { 6577 errorMessage = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: a list of comma separated error messages */ 6578 (0,external_wp_i18n_namespaceObject.__)('Some errors occurred while restoring the posts: %s'), [...errorMessages].join(',')); 6579 } 6580 } 6581 createErrorNotice(errorMessage, { 6582 type: 'snackbar' 6583 }); 6584 } 6585 } 6586 }; 6587 /* harmony default export */ const restore_post = (restorePost); 6588 6589 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/external.js 6590 /** 6591 * WordPress dependencies 6592 */ 6593 6594 6595 const external = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 6596 xmlns: "http://www.w3.org/2000/svg", 6597 viewBox: "0 0 24 24", 6598 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 6599 d: "M19.5 4.5h-7V6h4.44l-5.97 5.97 1.06 1.06L18 7.06v4.44h1.5v-7Zm-13 1a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-3H17v3a.5.5 0 0 1-.5.5h-10a.5.5 0 0 1-.5-.5v-10a.5.5 0 0 1 .5-.5h3V5.5h-3Z" 6600 }) 6601 }); 6602 /* harmony default export */ const library_external = (external); 6603 6604 ;// CONCATENATED MODULE: ./node_modules/@wordpress/fields/build-module/actions/base-post/view-post.js 6605 /** 6606 * WordPress dependencies 6607 */ 6608 6609 6610 6611 /** 6612 * Internal dependencies 6613 */ 6614 6615 const viewPost = { 6616 id: 'view-post', 6617 label: (0,external_wp_i18n_namespaceObject._x)('View', 'verb'), 6618 isPrimary: true, 6619 icon: library_external, 6620 isEligible(post) { 6621 return post.status !== 'trash'; 6622 }, 6623 callback(posts, { 6624 onActionPerformed 6625 }) { 6626 const post = posts[0]; 6627 window.open(post?.link, '_blank'); 6628 if (onActionPerformed) { 6629 onActionPerformed(posts); 6630 } 6631 } 6632 }; 6633 /* harmony default export */ const view_post = (viewPost); 6634 6635 ;// CONCATENATED MODULE: ./node_modules/@wordpress/fields/build-module/actions/common/view-post-revisions.js 6636 /** 6637 * WordPress dependencies 6638 */ 6639 6640 6641 6642 /** 6643 * Internal dependencies 6644 */ 6645 6646 const viewPostRevisions = { 6647 id: 'view-post-revisions', 6648 context: 'list', 6649 label(items) { 6650 var _items$0$_links$versi; 6651 const revisionsCount = (_items$0$_links$versi = items[0]._links?.['version-history']?.[0]?.count) !== null && _items$0$_links$versi !== void 0 ? _items$0$_links$versi : 0; 6652 return (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: number of revisions. */ 6653 (0,external_wp_i18n_namespaceObject.__)('View revisions (%s)'), revisionsCount); 6654 }, 6655 isEligible(post) { 6656 var _post$_links$predeces, _post$_links$version; 6657 if (post.status === 'trash') { 6658 return false; 6659 } 6660 const lastRevisionId = (_post$_links$predeces = post?._links?.['predecessor-version']?.[0]?.id) !== null && _post$_links$predeces !== void 0 ? _post$_links$predeces : null; 6661 const revisionsCount = (_post$_links$version = post?._links?.['version-history']?.[0]?.count) !== null && _post$_links$version !== void 0 ? _post$_links$version : 0; 6662 return !!lastRevisionId && revisionsCount > 1; 6663 }, 6664 callback(posts, { 6665 onActionPerformed 6666 }) { 6667 const post = posts[0]; 6668 const href = (0,external_wp_url_namespaceObject.addQueryArgs)('revision.php', { 6669 revision: post?._links?.['predecessor-version']?.[0]?.id 6670 }); 6671 document.location.href = href; 6672 if (onActionPerformed) { 6673 onActionPerformed(posts); 6674 } 6675 } 6676 }; 6677 /* harmony default export */ const view_post_revisions = (viewPostRevisions); 6678 6679 ;// CONCATENATED MODULE: ./node_modules/@wordpress/fields/build-module/lock-unlock.js 6680 /** 6681 * WordPress dependencies 6682 */ 6683 6684 const { 6685 lock: lock_unlock_lock, 6686 unlock: lock_unlock_unlock 6687 } = (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/fields'); 6688 6689 ;// CONCATENATED MODULE: ./node_modules/@wordpress/fields/build-module/actions/pattern/duplicate-pattern.js 6690 /** 6691 * WordPress dependencies 6692 */ 6693 6694 // @ts-ignore 6695 6696 /** 6697 * Internal dependencies 6698 */ 6699 6700 6701 // Patterns. 6702 const { 6703 CreatePatternModalContents, 6704 useDuplicatePatternProps 6705 } = lock_unlock_unlock(external_wp_patterns_namespaceObject.privateApis); 6706 const duplicatePattern = { 6707 id: 'duplicate-pattern', 6708 label: (0,external_wp_i18n_namespaceObject._x)('Duplicate', 'action label'), 6709 isEligible: item => item.type !== 'wp_template_part', 6710 modalHeader: (0,external_wp_i18n_namespaceObject._x)('Duplicate pattern', 'action label'), 6711 RenderModal: ({ 6712 items, 6713 closeModal 6714 }) => { 6715 const [item] = items; 6716 const duplicatedProps = useDuplicatePatternProps({ 6717 pattern: item, 6718 onSuccess: () => closeModal?.() 6719 }); 6720 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(CreatePatternModalContents, { 6721 onClose: closeModal, 6722 confirmLabel: (0,external_wp_i18n_namespaceObject._x)('Duplicate', 'action label'), 6723 ...duplicatedProps 6724 }); 6725 } 6726 }; 6727 /* harmony default export */ const duplicate_pattern = (duplicatePattern); 6728 6729 ;// CONCATENATED MODULE: ./node_modules/@wordpress/dataviews/build-module/field-types/integer.js 6730 /** 6731 * Internal dependencies 6732 */ 6733 6734 function sort(a, b, direction) { 6735 return direction === 'asc' ? a - b : b - a; 6736 } 6737 function isValid(value, context) { 6738 // TODO: this implicitely means the value is required. 6739 if (value === '') { 6740 return false; 6741 } 6742 if (!Number.isInteger(Number(value))) { 6743 return false; 6744 } 6745 if (context?.elements) { 6746 const validValues = context?.elements.map(f => f.value); 6747 if (!validValues.includes(Number(value))) { 6748 return false; 6749 } 6750 } 6751 return true; 6752 } 6753 /* harmony default export */ const integer = ({ 6754 sort, 6755 isValid, 6756 Edit: 'integer' 6757 }); 6758 6759 ;// CONCATENATED MODULE: ./node_modules/@wordpress/dataviews/build-module/field-types/text.js 6760 /** 6761 * Internal dependencies 6762 */ 6763 6764 function text_sort(valueA, valueB, direction) { 6765 return direction === 'asc' ? valueA.localeCompare(valueB) : valueB.localeCompare(valueA); 6766 } 6767 function text_isValid(value, context) { 6768 if (context?.elements) { 6769 const validValues = context?.elements?.map(f => f.value); 6770 if (!validValues.includes(value)) { 6771 return false; 6772 } 6773 } 6774 return true; 6775 } 6776 /* harmony default export */ const field_types_text = ({ 6777 sort: text_sort, 6778 isValid: text_isValid, 6779 Edit: 'text' 6780 }); 6781 6782 ;// CONCATENATED MODULE: ./node_modules/@wordpress/dataviews/build-module/field-types/datetime.js 6783 /** 6784 * Internal dependencies 6785 */ 6786 6787 function datetime_sort(a, b, direction) { 6788 const timeA = new Date(a).getTime(); 6789 const timeB = new Date(b).getTime(); 6790 return direction === 'asc' ? timeA - timeB : timeB - timeA; 6791 } 6792 function datetime_isValid(value, context) { 6793 if (context?.elements) { 6794 const validValues = context?.elements.map(f => f.value); 6795 if (!validValues.includes(value)) { 6796 return false; 6797 } 6798 } 6799 return true; 6800 } 6801 /* harmony default export */ const datetime = ({ 6802 sort: datetime_sort, 6803 isValid: datetime_isValid, 6804 Edit: 'datetime' 6805 }); 6806 6807 ;// CONCATENATED MODULE: ./node_modules/@wordpress/dataviews/build-module/field-types/index.js 6808 /** 6809 * Internal dependencies 6810 */ 6811 6812 6813 6814 6815 6816 /** 6817 * 6818 * @param {FieldType} type The field type definition to get. 6819 * 6820 * @return A field type definition. 6821 */ 6822 function getFieldTypeDefinition(type) { 6823 if ('integer' === type) { 6824 return integer; 6825 } 6826 if ('text' === type) { 6827 return field_types_text; 6828 } 6829 if ('datetime' === type) { 6830 return datetime; 6831 } 6832 return { 6833 sort: (a, b, direction) => { 6834 if (typeof a === 'number' && typeof b === 'number') { 6835 return direction === 'asc' ? a - b : b - a; 6836 } 6837 return direction === 'asc' ? a.localeCompare(b) : b.localeCompare(a); 6838 }, 6839 isValid: (value, context) => { 6840 if (context?.elements) { 6841 const validValues = context?.elements?.map(f => f.value); 6842 if (!validValues.includes(value)) { 6843 return false; 6844 } 6845 } 6846 return true; 6847 }, 6848 Edit: () => null 6849 }; 6850 } 6851 6852 ;// CONCATENATED MODULE: ./node_modules/@wordpress/dataviews/build-module/dataform-controls/datetime.js 6853 /** 6854 * WordPress dependencies 6855 */ 6856 6857 6858 6859 /** 6860 * Internal dependencies 6861 */ 6862 6863 6864 function DateTime({ 6865 data, 6866 field, 6867 onChange, 6868 hideLabelFromVision 6869 }) { 6870 const { 6871 id, 6872 label 6873 } = field; 6874 const value = field.getValue({ 6875 item: data 6876 }); 6877 const onChangeControl = (0,external_wp_element_namespaceObject.useCallback)(newValue => onChange({ 6878 [id]: newValue 6879 }), [id, onChange]); 6880 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("fieldset", { 6881 className: "dataviews-controls__datetime", 6882 children: [!hideLabelFromVision && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.BaseControl.VisualLabel, { 6883 as: "legend", 6884 children: label 6885 }), hideLabelFromVision && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.VisuallyHidden, { 6886 as: "legend", 6887 children: label 6888 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.TimePicker, { 6889 currentTime: value, 6890 onChange: onChangeControl, 6891 hideLabelFromVision: true 6892 })] 6893 }); 6894 } 6895 6896 ;// CONCATENATED MODULE: ./node_modules/@wordpress/dataviews/build-module/dataform-controls/integer.js 6897 /** 6898 * WordPress dependencies 6899 */ 6900 6901 6902 6903 /** 6904 * Internal dependencies 6905 */ 6906 6907 function Integer({ 6908 data, 6909 field, 6910 onChange, 6911 hideLabelFromVision 6912 }) { 6913 var _field$getValue; 6914 const { 6915 id, 6916 label, 6917 description 6918 } = field; 6919 const value = (_field$getValue = field.getValue({ 6920 item: data 6921 })) !== null && _field$getValue !== void 0 ? _field$getValue : ''; 6922 const onChangeControl = (0,external_wp_element_namespaceObject.useCallback)(newValue => onChange({ 6923 [id]: Number(newValue) 6924 }), [id, onChange]); 6925 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalNumberControl, { 6926 label: label, 6927 help: description, 6928 value: value, 6929 onChange: onChangeControl, 6930 __next40pxDefaultSize: true, 6931 hideLabelFromVision: hideLabelFromVision 6932 }); 6933 } 6934 6935 ;// CONCATENATED MODULE: ./node_modules/@wordpress/dataviews/build-module/dataform-controls/radio.js 6936 /** 6937 * WordPress dependencies 6938 */ 6939 6940 6941 6942 /** 6943 * Internal dependencies 6944 */ 6945 6946 function Radio({ 6947 data, 6948 field, 6949 onChange, 6950 hideLabelFromVision 6951 }) { 6952 const { 6953 id, 6954 label 6955 } = field; 6956 const value = field.getValue({ 6957 item: data 6958 }); 6959 const onChangeControl = (0,external_wp_element_namespaceObject.useCallback)(newValue => onChange({ 6960 [id]: newValue 6961 }), [id, onChange]); 6962 if (field.elements) { 6963 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.RadioControl, { 6964 label: label, 6965 onChange: onChangeControl, 6966 options: field.elements, 6967 selected: value, 6968 hideLabelFromVision: hideLabelFromVision 6969 }); 6970 } 6971 return null; 6972 } 6973 6974 ;// CONCATENATED MODULE: ./node_modules/@wordpress/dataviews/build-module/dataform-controls/select.js 6975 /** 6976 * WordPress dependencies 6977 */ 6978 6979 6980 6981 6982 /** 6983 * Internal dependencies 6984 */ 6985 6986 function Select({ 6987 data, 6988 field, 6989 onChange, 6990 hideLabelFromVision 6991 }) { 6992 var _field$getValue, _field$elements; 6993 const { 6994 id, 6995 label 6996 } = field; 6997 const value = (_field$getValue = field.getValue({ 6998 item: data 6999 })) !== null && _field$getValue !== void 0 ? _field$getValue : ''; 7000 const onChangeControl = (0,external_wp_element_namespaceObject.useCallback)(newValue => onChange({ 7001 [id]: newValue 7002 }), [id, onChange]); 7003 const elements = [ 7004 /* 7005 * Value can be undefined when: 7006 * 7007 * - the field is not required 7008 * - in bulk editing 7009 * 7010 */ 7011 { 7012 label: (0,external_wp_i18n_namespaceObject.__)('Select item'), 7013 value: '' 7014 }, ...((_field$elements = field?.elements) !== null && _field$elements !== void 0 ? _field$elements : [])]; 7015 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.SelectControl, { 7016 label: label, 7017 value: value, 7018 options: elements, 7019 onChange: onChangeControl, 7020 __next40pxDefaultSize: true, 7021 __nextHasNoMarginBottom: true, 7022 hideLabelFromVision: hideLabelFromVision 7023 }); 7024 } 7025 7026 ;// CONCATENATED MODULE: ./node_modules/@wordpress/dataviews/build-module/dataform-controls/text.js 7027 /** 7028 * WordPress dependencies 7029 */ 7030 7031 7032 7033 /** 7034 * Internal dependencies 7035 */ 7036 7037 function Text({ 7038 data, 7039 field, 7040 onChange, 7041 hideLabelFromVision 7042 }) { 7043 const { 7044 id, 7045 label, 7046 placeholder 7047 } = field; 7048 const value = field.getValue({ 7049 item: data 7050 }); 7051 const onChangeControl = (0,external_wp_element_namespaceObject.useCallback)(newValue => onChange({ 7052 [id]: newValue 7053 }), [id, onChange]); 7054 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.TextControl, { 7055 label: label, 7056 placeholder: placeholder, 7057 value: value !== null && value !== void 0 ? value : '', 7058 onChange: onChangeControl, 7059 __next40pxDefaultSize: true, 7060 __nextHasNoMarginBottom: true, 7061 hideLabelFromVision: hideLabelFromVision 7062 }); 7063 } 7064 7065 ;// CONCATENATED MODULE: ./node_modules/@wordpress/dataviews/build-module/dataform-controls/index.js 7066 /** 7067 * External dependencies 7068 */ 7069 7070 /** 7071 * Internal dependencies 7072 */ 7073 7074 7075 7076 7077 7078 7079 const FORM_CONTROLS = { 7080 datetime: DateTime, 7081 integer: Integer, 7082 radio: Radio, 7083 select: Select, 7084 text: Text 7085 }; 7086 function getControl(field, fieldTypeDefinition) { 7087 if (typeof field.Edit === 'function') { 7088 return field.Edit; 7089 } 7090 if (typeof field.Edit === 'string') { 7091 return getControlByType(field.Edit); 7092 } 7093 if (field.elements) { 7094 return getControlByType('select'); 7095 } 7096 if (typeof fieldTypeDefinition.Edit === 'string') { 7097 return getControlByType(fieldTypeDefinition.Edit); 7098 } 7099 return fieldTypeDefinition.Edit; 7100 } 7101 function getControlByType(type) { 7102 if (Object.keys(FORM_CONTROLS).includes(type)) { 7103 return FORM_CONTROLS[type]; 7104 } 7105 throw 'Control ' + type + ' not found'; 7106 } 7107 7108 ;// CONCATENATED MODULE: ./node_modules/@wordpress/dataviews/build-module/normalize-fields.js 7109 /** 7110 * Internal dependencies 7111 */ 7112 7113 7114 7115 /** 7116 * Apply default values and normalize the fields config. 7117 * 7118 * @param fields Fields config. 7119 * @return Normalized fields config. 7120 */ 7121 function normalizeFields(fields) { 7122 return fields.map(field => { 7123 var _field$sort, _field$isValid, _field$enableHiding, _field$enableSorting; 7124 const fieldTypeDefinition = getFieldTypeDefinition(field.type); 7125 const getValue = field.getValue || (({ 7126 item 7127 }) => item[field.id]); 7128 const sort = (_field$sort = field.sort) !== null && _field$sort !== void 0 ? _field$sort : function sort(a, b, direction) { 7129 return fieldTypeDefinition.sort(getValue({ 7130 item: a 7131 }), getValue({ 7132 item: b 7133 }), direction); 7134 }; 7135 const isValid = (_field$isValid = field.isValid) !== null && _field$isValid !== void 0 ? _field$isValid : function isValid(item, context) { 7136 return fieldTypeDefinition.isValid(getValue({ 7137 item 7138 }), context); 7139 }; 7140 const Edit = getControl(field, fieldTypeDefinition); 7141 const renderFromElements = ({ 7142 item 7143 }) => { 7144 const value = getValue({ 7145 item 7146 }); 7147 return field?.elements?.find(element => element.value === value)?.label || getValue({ 7148 item 7149 }); 7150 }; 7151 const render = field.render || (field.elements ? renderFromElements : getValue); 7152 return { 7153 ...field, 7154 label: field.label || field.id, 7155 header: field.header || field.label || field.id, 7156 getValue, 7157 render, 7158 sort, 7159 isValid, 7160 Edit, 7161 enableHiding: (_field$enableHiding = field.enableHiding) !== null && _field$enableHiding !== void 0 ? _field$enableHiding : true, 7162 enableSorting: (_field$enableSorting = field.enableSorting) !== null && _field$enableSorting !== void 0 ? _field$enableSorting : true 7163 }; 7164 }); 7165 } 7166 7167 ;// CONCATENATED MODULE: ./node_modules/@wordpress/dataviews/build-module/validation.js 7168 /** 7169 * Internal dependencies 7170 */ 7171 7172 function isItemValid(item, fields, form) { 7173 const _fields = normalizeFields(fields.filter(({ 7174 id 7175 }) => !!form.fields?.includes(id))); 7176 return _fields.every(field => { 7177 return field.isValid(item, { 7178 elements: field.elements 7179 }); 7180 }); 7181 } 7182 7183 ;// CONCATENATED MODULE: ./node_modules/@wordpress/dataviews/build-module/dataforms-layouts/regular/index.js 7184 /** 7185 * WordPress dependencies 7186 */ 7187 7188 7189 7190 /** 7191 * Internal dependencies 7192 */ 7193 7194 7195 function FormRegular({ 7196 data, 7197 fields, 7198 form, 7199 onChange 7200 }) { 7201 const visibleFields = (0,external_wp_element_namespaceObject.useMemo)(() => { 7202 var _form$fields; 7203 return normalizeFields(((_form$fields = form.fields) !== null && _form$fields !== void 0 ? _form$fields : []).map(fieldId => fields.find(({ 7204 id 7205 }) => id === fieldId)).filter(field => !!field)); 7206 }, [fields, form.fields]); 7207 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalVStack, { 7208 spacing: 4, 7209 children: visibleFields.map(field => { 7210 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(field.Edit, { 7211 data: data, 7212 field: field, 7213 onChange: onChange 7214 }, field.id); 7215 }) 7216 }); 7217 } 7218 7219 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/close-small.js 7220 /** 7221 * WordPress dependencies 7222 */ 7223 7224 7225 const closeSmall = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 7226 xmlns: "http://www.w3.org/2000/svg", 7227 viewBox: "0 0 24 24", 7228 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 7229 d: "M12 13.06l3.712 3.713 1.061-1.06L13.061 12l3.712-3.712-1.06-1.06L12 10.938 8.288 7.227l-1.061 1.06L10.939 12l-3.712 3.712 1.06 1.061L12 13.061z" 7230 }) 7231 }); 7232 /* harmony default export */ const close_small = (closeSmall); 7233 7234 ;// CONCATENATED MODULE: ./node_modules/@wordpress/dataviews/build-module/dataforms-layouts/panel/index.js 7235 /** 7236 * WordPress dependencies 7237 */ 7238 7239 7240 7241 7242 7243 /** 7244 * Internal dependencies 7245 */ 7246 7247 7248 7249 7250 function DropdownHeader({ 7251 title, 7252 onClose 7253 }) { 7254 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalVStack, { 7255 className: "dataforms-layouts-panel__dropdown-header", 7256 spacing: 4, 7257 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, { 7258 alignment: "center", 7259 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalHeading, { 7260 level: 2, 7261 size: 13, 7262 children: title 7263 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalSpacer, {}), onClose && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 7264 label: (0,external_wp_i18n_namespaceObject.__)('Close'), 7265 icon: close_small, 7266 onClick: onClose, 7267 size: "small" 7268 })] 7269 }) 7270 }); 7271 } 7272 function FormField({ 7273 data, 7274 field, 7275 onChange 7276 }) { 7277 // Use internal state instead of a ref to make sure that the component 7278 // re-renders when the popover's anchor updates. 7279 const [popoverAnchor, setPopoverAnchor] = (0,external_wp_element_namespaceObject.useState)(null); 7280 // Memoize popoverProps to avoid returning a new object every time. 7281 const popoverProps = (0,external_wp_element_namespaceObject.useMemo)(() => ({ 7282 // Anchor the popover to the middle of the entire row so that it doesn't 7283 // move around when the label changes. 7284 anchor: popoverAnchor, 7285 placement: 'left-start', 7286 offset: 36, 7287 shift: true 7288 }), [popoverAnchor]); 7289 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, { 7290 ref: setPopoverAnchor, 7291 className: "dataforms-layouts-panel__field", 7292 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 7293 className: "dataforms-layouts-panel__field-label", 7294 children: field.label 7295 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 7296 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Dropdown, { 7297 contentClassName: "dataforms-layouts-panel__field-dropdown", 7298 popoverProps: popoverProps, 7299 focusOnMount: true, 7300 toggleProps: { 7301 size: 'compact', 7302 variant: 'tertiary', 7303 tooltipPosition: 'middle left' 7304 }, 7305 renderToggle: ({ 7306 isOpen, 7307 onToggle 7308 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 7309 className: "dataforms-layouts-panel__field-control", 7310 size: "compact", 7311 variant: "tertiary", 7312 "aria-expanded": isOpen, 7313 "aria-label": (0,external_wp_i18n_namespaceObject.sprintf)( 7314 // translators: %s: Field name. 7315 (0,external_wp_i18n_namespaceObject._x)('Edit %s', 'field'), field.label), 7316 onClick: onToggle, 7317 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(field.render, { 7318 item: data 7319 }) 7320 }), 7321 renderContent: ({ 7322 onClose 7323 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 7324 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(DropdownHeader, { 7325 title: field.label, 7326 onClose: onClose 7327 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(field.Edit, { 7328 data: data, 7329 field: field, 7330 onChange: onChange, 7331 hideLabelFromVision: true 7332 }, field.id)] 7333 }) 7334 }) 7335 })] 7336 }); 7337 } 7338 function FormPanel({ 7339 data, 7340 fields, 7341 form, 7342 onChange 7343 }) { 7344 const visibleFields = (0,external_wp_element_namespaceObject.useMemo)(() => { 7345 var _form$fields; 7346 return normalizeFields(((_form$fields = form.fields) !== null && _form$fields !== void 0 ? _form$fields : []).map(fieldId => fields.find(({ 7347 id 7348 }) => id === fieldId)).filter(field => !!field)); 7349 }, [fields, form.fields]); 7350 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalVStack, { 7351 spacing: 2, 7352 children: visibleFields.map(field => { 7353 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(FormField, { 7354 data: data, 7355 field: field, 7356 onChange: onChange 7357 }, field.id); 7358 }) 7359 }); 7360 } 7361 7362 ;// CONCATENATED MODULE: ./node_modules/@wordpress/dataviews/build-module/dataforms-layouts/index.js 7363 /** 7364 * Internal dependencies 7365 */ 7366 7367 7368 const FORM_LAYOUTS = [{ 7369 type: 'regular', 7370 component: FormRegular 7371 }, { 7372 type: 'panel', 7373 component: FormPanel 7374 }]; 7375 function getFormLayout(type) { 7376 return FORM_LAYOUTS.find(layout => layout.type === type); 7377 } 7378 7379 ;// CONCATENATED MODULE: ./node_modules/@wordpress/dataviews/build-module/components/dataform/index.js 7380 /** 7381 * Internal dependencies 7382 */ 7383 7384 7385 7386 function DataForm({ 7387 form, 7388 ...props 7389 }) { 7390 var _form$type; 7391 const layout = getFormLayout((_form$type = form.type) !== null && _form$type !== void 0 ? _form$type : 'regular'); 7392 if (!layout) { 7393 return null; 7394 } 7395 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(layout.component, { 7396 form: form, 7397 ...props 7398 }); 7399 } 7400 7401 ;// CONCATENATED MODULE: ./node_modules/@wordpress/fields/build-module/fields/order/index.js 7402 /** 7403 * WordPress dependencies 7404 */ 7405 7406 7407 /** 7408 * Internal dependencies 7409 */ 7410 7411 const orderField = { 7412 type: 'integer', 7413 id: 'menu_order', 7414 label: (0,external_wp_i18n_namespaceObject.__)('Order'), 7415 description: (0,external_wp_i18n_namespaceObject.__)('Determines the order of pages.') 7416 }; 7417 /* harmony default export */ const order = (orderField); 7418 7419 ;// CONCATENATED MODULE: ./node_modules/@wordpress/fields/build-module/actions/base-post/reorder-page.js 7420 /** 7421 * WordPress dependencies 7422 */ 7423 7424 7425 7426 7427 7428 7429 7430 7431 /** 7432 * Internal dependencies 7433 */ 7434 7435 7436 7437 7438 const fields = [order]; 7439 const formOrderAction = { 7440 fields: ['menu_order'] 7441 }; 7442 function ReorderModal({ 7443 items, 7444 closeModal, 7445 onActionPerformed 7446 }) { 7447 const [item, setItem] = (0,external_wp_element_namespaceObject.useState)(items[0]); 7448 const orderInput = item.menu_order; 7449 const { 7450 editEntityRecord, 7451 saveEditedEntityRecord 7452 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); 7453 const { 7454 createSuccessNotice, 7455 createErrorNotice 7456 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); 7457 async function onOrder(event) { 7458 event.preventDefault(); 7459 if (!isItemValid(item, fields, formOrderAction)) { 7460 return; 7461 } 7462 try { 7463 await editEntityRecord('postType', item.type, item.id, { 7464 menu_order: orderInput 7465 }); 7466 closeModal?.(); 7467 // Persist edited entity. 7468 await saveEditedEntityRecord('postType', item.type, item.id, { 7469 throwOnError: true 7470 }); 7471 createSuccessNotice((0,external_wp_i18n_namespaceObject.__)('Order updated.'), { 7472 type: 'snackbar' 7473 }); 7474 onActionPerformed?.(items); 7475 } catch (error) { 7476 const typedError = error; 7477 const errorMessage = typedError.message && typedError.code !== 'unknown_error' ? typedError.message : (0,external_wp_i18n_namespaceObject.__)('An error occurred while updating the order'); 7478 createErrorNotice(errorMessage, { 7479 type: 'snackbar' 7480 }); 7481 } 7482 } 7483 const isSaveDisabled = !isItemValid(item, fields, formOrderAction); 7484 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("form", { 7485 onSubmit: onOrder, 7486 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { 7487 spacing: "5", 7488 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 7489 children: (0,external_wp_i18n_namespaceObject.__)('Determines the order of pages. Pages with the same order value are sorted alphabetically. Negative order values are supported.') 7490 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(DataForm, { 7491 data: item, 7492 fields: fields, 7493 form: formOrderAction, 7494 onChange: changes => setItem({ 7495 ...item, 7496 ...changes 7497 }) 7498 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, { 7499 justify: "right", 7500 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 7501 __next40pxDefaultSize: true, 7502 variant: "tertiary", 7503 onClick: () => { 7504 closeModal?.(); 7505 }, 7506 children: (0,external_wp_i18n_namespaceObject.__)('Cancel') 7507 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 7508 __next40pxDefaultSize: true, 7509 variant: "primary", 7510 type: "submit", 7511 accessibleWhenDisabled: true, 7512 disabled: isSaveDisabled, 7513 children: (0,external_wp_i18n_namespaceObject.__)('Save') 7514 })] 7515 })] 7516 }) 7517 }); 7518 } 7519 const reorderPage = { 7520 id: 'order-pages', 7521 label: (0,external_wp_i18n_namespaceObject.__)('Order'), 7522 isEligible({ 7523 status 7524 }) { 7525 return status !== 'trash'; 7526 }, 7527 RenderModal: ReorderModal 7528 }; 7529 /* harmony default export */ const reorder_page = (reorderPage); 7530 7531 ;// CONCATENATED MODULE: ./node_modules/client-zip/index.js 7532 "stream"in Blob.prototype||Object.defineProperty(Blob.prototype,"stream",{value(){return new Response(this).body}}),"setBigUint64"in DataView.prototype||Object.defineProperty(DataView.prototype,"setBigUint64",{value(e,n,t){const i=Number(0xffffffffn&n),r=Number(n>>32n);this.setUint32(e+(t?0:4),i,t),this.setUint32(e+(t?4:0),r,t)}});var e=e=>new DataView(new ArrayBuffer(e)),n=e=>new Uint8Array(e.buffer||e),t=e=>(new TextEncoder).encode(String(e)),i=e=>Math.min(4294967295,Number(e)),r=e=>Math.min(65535,Number(e));function f(e,i){if(void 0===i||i instanceof Date||(i=new Date(i)),e instanceof File)return{isFile:1,t:i||new Date(e.lastModified),i:e.stream()};if(e instanceof Response)return{isFile:1,t:i||new Date(e.headers.get("Last-Modified")||Date.now()),i:e.body};if(void 0===i)i=new Date;else if(isNaN(i))throw new Error("Invalid modification date.");if(void 0===e)return{isFile:0,t:i};if("string"==typeof e)return{isFile:1,t:i,i:t(e)};if(e instanceof Blob)return{isFile:1,t:i,i:e.stream()};if(e instanceof Uint8Array||e instanceof ReadableStream)return{isFile:1,t:i,i:e};if(e instanceof ArrayBuffer||ArrayBuffer.isView(e))return{isFile:1,t:i,i:n(e)};if(Symbol.asyncIterator in e)return{isFile:1,t:i,i:o(e[Symbol.asyncIterator]())};throw new TypeError("Unsupported input format.")}function o(e,n=e){return new ReadableStream({async pull(n){let t=0;for(;n.desiredSize>t;){const i=await e.next();if(!i.value){n.close();break}{const e=a(i.value);n.enqueue(e),t+=e.byteLength}}},cancel(e){n.throw?.(e)}})}function a(e){return"string"==typeof e?t(e):e instanceof Uint8Array?e:n(e)}function s(e,i,r){let[f,o]=function(e){return e?e instanceof Uint8Array?[e,1]:ArrayBuffer.isView(e)||e instanceof ArrayBuffer?[n(e),1]:[t(e),0]:[void 0,0]}(i);if(e instanceof File)return{o:d(f||t(e.name)),u:BigInt(e.size),l:o};if(e instanceof Response){const n=e.headers.get("content-disposition"),i=n&&n.match(/;\s*filename\*?\s*=\s*(?:UTF-\d+''|)["']?([^;"'\r\n]*)["']?(?:;|$)/i),a=i&&i[1]||e.url&&new URL(e.url).pathname.split("/").findLast(Boolean),s=a&&decodeURIComponent(a),u=r||+e.headers.get("content-length");return{o:d(f||t(s)),u:BigInt(u),l:o}}return f=d(f,void 0!==e||void 0!==r),"string"==typeof e?{o:f,u:BigInt(t(e).length),l:o}:e instanceof Blob?{o:f,u:BigInt(e.size),l:o}:e instanceof ArrayBuffer||ArrayBuffer.isView(e)?{o:f,u:BigInt(e.byteLength),l:o}:{o:f,u:u(e,r),l:o}}function u(e,n){return n>-1?BigInt(n):e?void 0:0n}function d(e,n=1){if(!e||e.every((c=>47===c)))throw new Error("The file must have a name.");if(n)for(;47===e[e.length-1];)e=e.subarray(0,-1);else 47!==e[e.length-1]&&(e=new Uint8Array([...e,47]));return e}var l=new Uint32Array(256);for(let e=0;e<256;++e){let n=e;for(let e=0;e<8;++e)n=n>>>1^(1&n&&3988292384);l[e]=n}function y(e,n=0){n^=-1;for(var t=0,i=e.length;t<i;t++)n=n>>>8^l[255&n^e[t]];return(-1^n)>>>0}function w(e,n,t=0){const i=e.getSeconds()>>1|e.getMinutes()<<5|e.getHours()<<11,r=e.getDate()|e.getMonth()+1<<5|e.getFullYear()-1980<<9;n.setUint16(t,i,1),n.setUint16(t+2,r,1)}function B({o:e,l:n},t){return 8*(!n||(t??function(e){try{b.decode(e)}catch{return 0}return 1}(e)))}var b=new TextDecoder("utf8",{fatal:1});function p(t,i=0){const r=e(30);return r.setUint32(0,1347093252),r.setUint32(4,754976768|i),w(t.t,r,10),r.setUint16(26,t.o.length,1),n(r)}async function*g(e){let{i:n}=e;if("then"in n&&(n=await n),n instanceof Uint8Array)yield n,e.m=y(n,0),e.u=BigInt(n.length);else{e.u=0n;const t=n.getReader();for(;;){const{value:n,done:i}=await t.read();if(i)break;e.m=y(n,e.m),e.u+=BigInt(n.length),yield n}}}function I(t,r){const f=e(16+(r?8:0));return f.setUint32(0,1347094280),f.setUint32(4,t.isFile?t.m:0,1),r?(f.setBigUint64(8,t.u,1),f.setBigUint64(16,t.u,1)):(f.setUint32(8,i(t.u),1),f.setUint32(12,i(t.u),1)),n(f)}function v(t,r,f=0,o=0){const a=e(46);return a.setUint32(0,1347092738),a.setUint32(4,755182848),a.setUint16(8,2048|f),w(t.t,a,12),a.setUint32(16,t.isFile?t.m:0,1),a.setUint32(20,i(t.u),1),a.setUint32(24,i(t.u),1),a.setUint16(28,t.o.length,1),a.setUint16(30,o,1),a.setUint16(40,t.isFile?33204:16893,1),a.setUint32(42,i(r),1),n(a)}function h(t,i,r){const f=e(r);return f.setUint16(0,1,1),f.setUint16(2,r-4,1),16&r&&(f.setBigUint64(4,t.u,1),f.setBigUint64(12,t.u,1)),f.setBigUint64(r-8,i,1),n(f)}function D(e){return e instanceof File||e instanceof Response?[[e],[e]]:[[e.input,e.name,e.size],[e.input,e.lastModified]]}var S=e=>function(e){let n=BigInt(22),t=0n,i=0;for(const r of e){if(!r.o)throw new Error("Every file must have a non-empty name.");if(void 0===r.u)throw new Error(`Missing size for file "${(new TextDecoder).decode(r.o)}".`);const e=r.u>=0xffffffffn,f=t>=0xffffffffn;t+=BigInt(46+r.o.length+(e&&8))+r.u,n+=BigInt(r.o.length+46+(12*f|28*e)),i||(i=e)}return(i||t>=0xffffffffn)&&(n+=BigInt(76)),n+t}(function*(e){for(const n of e)yield s(...D(n)[0])}(e));function A(e,n={}){const t={"Content-Type":"application/zip","Content-Disposition":"attachment"};return("bigint"==typeof n.length||Number.isInteger(n.length))&&n.length>0&&(t["Content-Length"]=String(n.length)),n.metadata&&(t["Content-Length"]=String(S(n.metadata))),new Response(N(e,n),{headers:t})}function N(t,a={}){const u=function(e){const n=e[Symbol.iterator in e?Symbol.iterator:Symbol.asyncIterator]();return{async next(){const e=await n.next();if(e.done)return e;const[t,i]=D(e.value);return{done:0,value:Object.assign(f(...i),s(...t))}},throw:n.throw?.bind(n),[Symbol.asyncIterator](){return this}}}(t);return o(async function*(t,f){const o=[];let a=0n,s=0n,u=0;for await(const e of t){const n=B(e,f.buffersAreUTF8);yield p(e,n),yield new Uint8Array(e.o),e.isFile&&(yield*g(e));const t=e.u>=0xffffffffn,i=12*(a>=0xffffffffn)|28*t;yield I(e,t),o.push(v(e,a,n,i)),o.push(e.o),i&&o.push(h(e,a,i)),t&&(a+=8n),s++,a+=BigInt(46+e.o.length)+e.u,u||(u=t)}let d=0n;for(const e of o)yield e,d+=BigInt(e.length);if(u||a>=0xffffffffn){const t=e(76);t.setUint32(0,1347094022),t.setBigUint64(4,BigInt(44),1),t.setUint32(12,755182848),t.setBigUint64(24,s,1),t.setBigUint64(32,s,1),t.setBigUint64(40,d,1),t.setBigUint64(48,a,1),t.setUint32(56,1347094023),t.setBigUint64(64,a+d,1),t.setUint32(72,1,1),yield n(t)}const l=e(22);l.setUint32(0,1347093766),l.setUint16(8,r(s),1),l.setUint16(10,r(s),1),l.setUint32(12,i(d),1),l.setUint32(16,i(a),1),yield n(l)}(u,a),u)} 7533 ;// CONCATENATED MODULE: external ["wp","blob"] 7534 const external_wp_blob_namespaceObject = window["wp"]["blob"]; 7535 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/download.js 7536 /** 7537 * WordPress dependencies 7538 */ 7539 7540 7541 const download = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 7542 xmlns: "http://www.w3.org/2000/svg", 7543 viewBox: "0 0 24 24", 7544 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 7545 d: "M18 11.3l-1-1.1-4 4V3h-1.5v11.3L7 10.2l-1 1.1 6.2 5.8 5.8-5.8zm.5 3.7v3.5h-13V15H4v5h16v-5h-1.5z" 7546 }) 7547 }); 7548 /* harmony default export */ const library_download = (download); 7549 7550 ;// CONCATENATED MODULE: ./node_modules/@wordpress/fields/build-module/actions/utils.js 7551 /** 7552 * WordPress dependencies 7553 */ 7554 7555 7556 /** 7557 * Internal dependencies 7558 */ 7559 7560 const utils_TEMPLATE_POST_TYPE = 'wp_template'; 7561 const utils_TEMPLATE_PART_POST_TYPE = 'wp_template_part'; 7562 const utils_TEMPLATE_ORIGINS = { 7563 custom: 'custom', 7564 theme: 'theme', 7565 plugin: 'plugin' 7566 }; 7567 function utils_isTemplate(post) { 7568 return post.type === utils_TEMPLATE_POST_TYPE; 7569 } 7570 function utils_isTemplatePart(post) { 7571 return post.type === utils_TEMPLATE_PART_POST_TYPE; 7572 } 7573 function utils_isTemplateOrTemplatePart(p) { 7574 return p.type === utils_TEMPLATE_POST_TYPE || p.type === utils_TEMPLATE_PART_POST_TYPE; 7575 } 7576 function utils_getItemTitle(item) { 7577 if (typeof item.title === 'string') { 7578 return (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(item.title); 7579 } 7580 if ('rendered' in item.title) { 7581 return (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(item.title.rendered); 7582 } 7583 if ('raw' in item.title) { 7584 return (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(item.title.raw); 7585 } 7586 return ''; 7587 } 7588 7589 /** 7590 * Check if a template is removable. 7591 * 7592 * @param template The template entity to check. 7593 * @return Whether the template is removable. 7594 */ 7595 function utils_isTemplateRemovable(template) { 7596 if (!template) { 7597 return false; 7598 } 7599 // In patterns list page we map the templates parts to a different object 7600 // than the one returned from the endpoint. This is why we need to check for 7601 // two props whether is custom or has a theme file. 7602 return [template.source, template.source].includes(utils_TEMPLATE_ORIGINS.custom) && !Boolean(template.type === 'wp_template' && template?.plugin) && !template.has_theme_file; 7603 } 7604 7605 ;// CONCATENATED MODULE: ./node_modules/@wordpress/fields/build-module/actions/pattern/export-pattern.js 7606 /** 7607 * External dependencies 7608 */ 7609 7610 7611 7612 /** 7613 * WordPress dependencies 7614 */ 7615 7616 7617 7618 7619 /** 7620 * Internal dependencies 7621 */ 7622 7623 7624 function getJsonFromItem(item) { 7625 return JSON.stringify({ 7626 __file: item.type, 7627 title: utils_getItemTitle(item), 7628 content: typeof item.content === 'string' ? item.content : item.content?.raw, 7629 syncStatus: item.wp_pattern_sync_status 7630 }, null, 2); 7631 } 7632 const exportPattern = { 7633 id: 'export-pattern', 7634 label: (0,external_wp_i18n_namespaceObject.__)('Export as JSON'), 7635 icon: library_download, 7636 supportsBulk: true, 7637 isEligible: item => item.type === 'wp_block', 7638 callback: async items => { 7639 if (items.length === 1) { 7640 return (0,external_wp_blob_namespaceObject.downloadBlob)(`$paramCase(utils_getItemTitle(items[0]) || items[0].slug)}.json`, getJsonFromItem(items[0]), 'application/json'); 7641 } 7642 const nameCount = {}; 7643 const filesToZip = items.map(item => { 7644 const name = paramCase(utils_getItemTitle(item) || item.slug); 7645 nameCount[name] = (nameCount[name] || 0) + 1; 7646 return { 7647 name: `$name + (nameCount[name] > 1 ? '-' + (nameCount[name] - 1) : '')}.json`, 7648 lastModified: new Date(), 7649 input: getJsonFromItem(item) 7650 }; 7651 }); 7652 return (0,external_wp_blob_namespaceObject.downloadBlob)((0,external_wp_i18n_namespaceObject.__)('patterns-export') + '.zip', await A(filesToZip).blob(), 'application/zip'); 7653 } 7654 }; 7655 /* harmony default export */ const export_pattern = (exportPattern); 7656 7657 ;// CONCATENATED MODULE: ./node_modules/@wordpress/fields/build-module/actions/common/permanently-delete-post.js 7658 /** 7659 * WordPress dependencies 7660 */ 7661 7662 7663 7664 7665 7666 /** 7667 * Internal dependencies 7668 */ 7669 7670 const permanentlyDeletePost = { 7671 id: 'permanently-delete', 7672 label: (0,external_wp_i18n_namespaceObject.__)('Permanently delete'), 7673 supportsBulk: true, 7674 icon: library_trash, 7675 isEligible(item) { 7676 if (utils_isTemplateOrTemplatePart(item) || item.type === 'wp_block') { 7677 return false; 7678 } 7679 const { 7680 status, 7681 permissions 7682 } = item; 7683 return status === 'trash' && permissions?.delete; 7684 }, 7685 async callback(posts, { 7686 registry, 7687 onActionPerformed 7688 }) { 7689 const { 7690 createSuccessNotice, 7691 createErrorNotice 7692 } = registry.dispatch(external_wp_notices_namespaceObject.store); 7693 const { 7694 deleteEntityRecord 7695 } = registry.dispatch(external_wp_coreData_namespaceObject.store); 7696 const promiseResult = await Promise.allSettled(posts.map(post => { 7697 return deleteEntityRecord('postType', post.type, post.id, { 7698 force: true 7699 }, { 7700 throwOnError: true 7701 }); 7702 })); 7703 // If all the promises were fulfilled with success. 7704 if (promiseResult.every(({ 7705 status 7706 }) => status === 'fulfilled')) { 7707 let successMessage; 7708 if (promiseResult.length === 1) { 7709 successMessage = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: The posts's title. */ 7710 (0,external_wp_i18n_namespaceObject.__)('"%s" permanently deleted.'), utils_getItemTitle(posts[0])); 7711 } else { 7712 successMessage = (0,external_wp_i18n_namespaceObject.__)('The items were permanently deleted.'); 7713 } 7714 createSuccessNotice(successMessage, { 7715 type: 'snackbar', 7716 id: 'permanently-delete-post-action' 7717 }); 7718 onActionPerformed?.(posts); 7719 } else { 7720 // If there was at lease one failure. 7721 let errorMessage; 7722 // If we were trying to permanently delete a single post. 7723 if (promiseResult.length === 1) { 7724 const typedError = promiseResult[0]; 7725 if (typedError.reason?.message) { 7726 errorMessage = typedError.reason.message; 7727 } else { 7728 errorMessage = (0,external_wp_i18n_namespaceObject.__)('An error occurred while permanently deleting the item.'); 7729 } 7730 // If we were trying to permanently delete multiple posts 7731 } else { 7732 const errorMessages = new Set(); 7733 const failedPromises = promiseResult.filter(({ 7734 status 7735 }) => status === 'rejected'); 7736 for (const failedPromise of failedPromises) { 7737 const typedError = failedPromise; 7738 if (typedError.reason?.message) { 7739 errorMessages.add(typedError.reason.message); 7740 } 7741 } 7742 if (errorMessages.size === 0) { 7743 errorMessage = (0,external_wp_i18n_namespaceObject.__)('An error occurred while permanently deleting the items.'); 7744 } else if (errorMessages.size === 1) { 7745 errorMessage = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: an error message */ 7746 (0,external_wp_i18n_namespaceObject.__)('An error occurred while permanently deleting the items: %s'), [...errorMessages][0]); 7747 } else { 7748 errorMessage = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: a list of comma separated error messages */ 7749 (0,external_wp_i18n_namespaceObject.__)('Some errors occurred while permanently deleting the items: %s'), [...errorMessages].join(',')); 7750 } 7751 } 7752 createErrorNotice(errorMessage, { 7753 type: 'snackbar' 7754 }); 7755 } 7756 } 7757 }; 7758 /* harmony default export */ const permanently_delete_post = (permanentlyDeletePost); 7759 7760 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/dataviews/actions/delete-post.js 7761 /** 7762 * WordPress dependencies 7763 */ 7764 7765 7766 7767 7768 7769 // @ts-ignore 7770 7771 /** 7772 * Internal dependencies 7773 */ 7774 7775 // @ts-ignore 7776 7777 7778 7779 7780 const { 7781 PATTERN_TYPES: delete_post_PATTERN_TYPES 7782 } = unlock(external_wp_patterns_namespaceObject.privateApis); 7783 7784 // This action is used for templates, patterns and template parts. 7785 // Every other post type uses the similar `trashPostAction` which 7786 // moves the post to trash. 7787 const deletePostAction = { 7788 id: 'delete-post', 7789 label: (0,external_wp_i18n_namespaceObject.__)('Delete'), 7790 isPrimary: true, 7791 icon: library_trash, 7792 isEligible(post) { 7793 if (isTemplateOrTemplatePart(post)) { 7794 return isTemplateRemovable(post); 7795 } 7796 // We can only remove user patterns. 7797 return post.type === delete_post_PATTERN_TYPES.user; 7798 }, 7799 supportsBulk: true, 7800 hideModalHeader: true, 7801 RenderModal: ({ 7802 items, 7803 closeModal, 7804 onActionPerformed 7805 }) => { 7806 const [isBusy, setIsBusy] = (0,external_wp_element_namespaceObject.useState)(false); 7807 const { 7808 removeTemplates 7809 } = unlock((0,external_wp_data_namespaceObject.useDispatch)(store_store)); 7810 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { 7811 spacing: "5", 7812 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { 7813 children: items.length > 1 ? (0,external_wp_i18n_namespaceObject.sprintf)( 7814 // translators: %d: number of items to delete. 7815 (0,external_wp_i18n_namespaceObject._n)('Delete %d item?', 'Delete %d items?', items.length), items.length) : (0,external_wp_i18n_namespaceObject.sprintf)( 7816 // translators: %s: The template or template part's title 7817 (0,external_wp_i18n_namespaceObject._x)('Delete "%s"?', 'template part'), getItemTitle(items[0])) 7818 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, { 7819 justify: "right", 7820 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 7821 variant: "tertiary", 7822 onClick: closeModal, 7823 disabled: isBusy, 7824 accessibleWhenDisabled: true, 7825 __next40pxDefaultSize: true, 7826 children: (0,external_wp_i18n_namespaceObject.__)('Cancel') 7827 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 7828 variant: "primary", 7829 onClick: async () => { 7830 setIsBusy(true); 7831 await removeTemplates(items, { 7832 allowUndo: false 7833 }); 7834 onActionPerformed?.(items); 7835 setIsBusy(false); 7836 closeModal?.(); 7837 }, 7838 isBusy: isBusy, 7839 disabled: isBusy, 7840 accessibleWhenDisabled: true, 7841 __next40pxDefaultSize: true, 7842 children: (0,external_wp_i18n_namespaceObject.__)('Delete') 7843 })] 7844 })] 7845 }); 7846 } 7847 }; 7848 /* harmony default export */ const delete_post = (deletePostAction); 7849 7850 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/dataviews/store/private-actions.js 7851 /** 7852 * WordPress dependencies 7853 */ 7854 7855 7856 7857 /** 7858 * Internal dependencies 7859 */ 7860 7861 7862 7863 7864 7865 7866 7867 7868 7869 function registerEntityAction(kind, name, config) { 7870 return { 7871 type: 'REGISTER_ENTITY_ACTION', 7872 kind, 7873 name, 7874 config 7875 }; 7876 } 7877 function unregisterEntityAction(kind, name, actionId) { 7878 return { 7879 type: 'UNREGISTER_ENTITY_ACTION', 7880 kind, 7881 name, 7882 actionId 7883 }; 7884 } 7885 function setIsReady(kind, name) { 7886 return { 7887 type: 'SET_IS_READY', 7888 kind, 7889 name 7890 }; 7891 } 7892 const registerPostTypeActions = postType => async ({ 7893 registry 7894 }) => { 7895 const isReady = unlock(registry.select(store_store)).isEntityReady('postType', postType); 7896 if (isReady) { 7897 return; 7898 } 7899 unlock(registry.dispatch(store_store)).setIsReady('postType', postType); 7900 const postTypeConfig = await registry.resolveSelect(external_wp_coreData_namespaceObject.store).getPostType(postType); 7901 const canCreate = await registry.resolveSelect(external_wp_coreData_namespaceObject.store).canUser('create', { 7902 kind: 'postType', 7903 name: postType 7904 }); 7905 const currentTheme = await registry.resolveSelect(external_wp_coreData_namespaceObject.store).getCurrentTheme(); 7906 const actions = [postTypeConfig.viewable ? view_post : undefined, !!postTypeConfig?.supports?.revisions ? view_post_revisions : undefined, 7907 // @ts-ignore 7908 false ? 0 : undefined, postTypeConfig.slug === 'wp_template_part' && canCreate && currentTheme?.is_block_theme ? duplicate_template_part : undefined, canCreate && postTypeConfig.slug === 'wp_block' ? duplicate_pattern : undefined, postTypeConfig.supports?.title ? rename_post : undefined, postTypeConfig?.supports?.['page-attributes'] ? reorder_page : undefined, postTypeConfig.slug === 'wp_block' ? export_pattern : undefined, reset_post, restore_post, delete_post, trash_post, permanently_delete_post]; 7909 registry.batch(() => { 7910 actions.forEach(action => { 7911 if (!action) { 7912 return; 7913 } 7914 unlock(registry.dispatch(store_store)).registerEntityAction('postType', postType, action); 7915 }); 7916 }); 7917 (0,external_wp_hooks_namespaceObject.doAction)('core.registerPostTypeActions', postType); 7918 }; 7919 7920 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/store/private-actions.js 7921 /** 7922 * WordPress dependencies 7923 */ 7924 7925 7926 7927 7928 7929 7930 7931 7932 7933 7934 /** 7935 * Internal dependencies 7936 */ 7937 7938 7939 7940 /** 7941 * Returns an action object used to set which template is currently being used/edited. 7942 * 7943 * @param {string} id Template Id. 7944 * 7945 * @return {Object} Action object. 7946 */ 7947 function setCurrentTemplateId(id) { 7948 return { 7949 type: 'SET_CURRENT_TEMPLATE_ID', 7950 id 7951 }; 7952 } 7953 7954 /** 7955 * Create a block based template. 7956 * 7957 * @param {Object?} template Template to create and assign. 7958 */ 7959 const createTemplate = template => async ({ 7960 select, 7961 dispatch, 7962 registry 7963 }) => { 7964 const savedTemplate = await registry.dispatch(external_wp_coreData_namespaceObject.store).saveEntityRecord('postType', 'wp_template', template); 7965 registry.dispatch(external_wp_coreData_namespaceObject.store).editEntityRecord('postType', select.getCurrentPostType(), select.getCurrentPostId(), { 7966 template: savedTemplate.slug 7967 }); 7968 registry.dispatch(external_wp_notices_namespaceObject.store).createSuccessNotice((0,external_wp_i18n_namespaceObject.__)("Custom template created. You're in template mode now."), { 7969 type: 'snackbar', 7970 actions: [{ 7971 label: (0,external_wp_i18n_namespaceObject.__)('Go back'), 7972 onClick: () => dispatch.setRenderingMode(select.getEditorSettings().defaultRenderingMode) 7973 }] 7974 }); 7975 return savedTemplate; 7976 }; 7977 7978 /** 7979 * Update the provided block types to be visible. 7980 * 7981 * @param {string[]} blockNames Names of block types to show. 7982 */ 7983 const showBlockTypes = blockNames => ({ 7984 registry 7985 }) => { 7986 var _registry$select$get; 7987 const existingBlockNames = (_registry$select$get = registry.select(external_wp_preferences_namespaceObject.store).get('core', 'hiddenBlockTypes')) !== null && _registry$select$get !== void 0 ? _registry$select$get : []; 7988 const newBlockNames = existingBlockNames.filter(type => !(Array.isArray(blockNames) ? blockNames : [blockNames]).includes(type)); 7989 registry.dispatch(external_wp_preferences_namespaceObject.store).set('core', 'hiddenBlockTypes', newBlockNames); 7990 }; 7991 7992 /** 7993 * Update the provided block types to be hidden. 7994 * 7995 * @param {string[]} blockNames Names of block types to hide. 7996 */ 7997 const hideBlockTypes = blockNames => ({ 7998 registry 7999 }) => { 8000 var _registry$select$get2; 8001 const existingBlockNames = (_registry$select$get2 = registry.select(external_wp_preferences_namespaceObject.store).get('core', 'hiddenBlockTypes')) !== null && _registry$select$get2 !== void 0 ? _registry$select$get2 : []; 8002 const mergedBlockNames = new Set([...existingBlockNames, ...(Array.isArray(blockNames) ? blockNames : [blockNames])]); 8003 registry.dispatch(external_wp_preferences_namespaceObject.store).set('core', 'hiddenBlockTypes', [...mergedBlockNames]); 8004 }; 8005 8006 /** 8007 * Save entity records marked as dirty. 8008 * 8009 * @param {Object} options Options for the action. 8010 * @param {Function} [options.onSave] Callback when saving happens. 8011 * @param {object[]} [options.dirtyEntityRecords] Array of dirty entities. 8012 * @param {object[]} [options.entitiesToSkip] Array of entities to skip saving. 8013 * @param {Function} [options.close] Callback when the actions is called. It should be consolidated with `onSave`. 8014 */ 8015 const saveDirtyEntities = ({ 8016 onSave, 8017 dirtyEntityRecords = [], 8018 entitiesToSkip = [], 8019 close 8020 } = {}) => ({ 8021 registry 8022 }) => { 8023 const PUBLISH_ON_SAVE_ENTITIES = [{ 8024 kind: 'postType', 8025 name: 'wp_navigation' 8026 }]; 8027 const saveNoticeId = 'site-editor-save-success'; 8028 const homeUrl = registry.select(external_wp_coreData_namespaceObject.store).getEntityRecord('root', '__unstableBase')?.home; 8029 registry.dispatch(external_wp_notices_namespaceObject.store).removeNotice(saveNoticeId); 8030 const entitiesToSave = dirtyEntityRecords.filter(({ 8031 kind, 8032 name, 8033 key, 8034 property 8035 }) => { 8036 return !entitiesToSkip.some(elt => elt.kind === kind && elt.name === name && elt.key === key && elt.property === property); 8037 }); 8038 close?.(entitiesToSave); 8039 const siteItemsToSave = []; 8040 const pendingSavedRecords = []; 8041 entitiesToSave.forEach(({ 8042 kind, 8043 name, 8044 key, 8045 property 8046 }) => { 8047 if ('root' === kind && 'site' === name) { 8048 siteItemsToSave.push(property); 8049 } else { 8050 if (PUBLISH_ON_SAVE_ENTITIES.some(typeToPublish => typeToPublish.kind === kind && typeToPublish.name === name)) { 8051 registry.dispatch(external_wp_coreData_namespaceObject.store).editEntityRecord(kind, name, key, { 8052 status: 'publish' 8053 }); 8054 } 8055 pendingSavedRecords.push(registry.dispatch(external_wp_coreData_namespaceObject.store).saveEditedEntityRecord(kind, name, key)); 8056 } 8057 }); 8058 if (siteItemsToSave.length) { 8059 pendingSavedRecords.push(registry.dispatch(external_wp_coreData_namespaceObject.store).__experimentalSaveSpecifiedEntityEdits('root', 'site', undefined, siteItemsToSave)); 8060 } 8061 registry.dispatch(external_wp_blockEditor_namespaceObject.store).__unstableMarkLastChangeAsPersistent(); 8062 Promise.all(pendingSavedRecords).then(values => { 8063 return onSave ? onSave(values) : values; 8064 }).then(values => { 8065 if (values.some(value => typeof value === 'undefined')) { 8066 registry.dispatch(external_wp_notices_namespaceObject.store).createErrorNotice((0,external_wp_i18n_namespaceObject.__)('Saving failed.')); 8067 } else { 8068 registry.dispatch(external_wp_notices_namespaceObject.store).createSuccessNotice((0,external_wp_i18n_namespaceObject.__)('Site updated.'), { 8069 type: 'snackbar', 8070 id: saveNoticeId, 8071 actions: [{ 8072 label: (0,external_wp_i18n_namespaceObject.__)('View site'), 8073 url: homeUrl 8074 }] 8075 }); 8076 } 8077 }).catch(error => registry.dispatch(external_wp_notices_namespaceObject.store).createErrorNotice(`${(0,external_wp_i18n_namespaceObject.__)('Saving failed.')} $error}`)); 8078 }; 8079 8080 /** 8081 * Reverts a template to its original theme-provided file. 8082 * 8083 * @param {Object} template The template to revert. 8084 * @param {Object} [options] 8085 * @param {boolean} [options.allowUndo] Whether to allow the user to undo 8086 * reverting the template. Default true. 8087 */ 8088 const revertTemplate = (template, { 8089 allowUndo = true 8090 } = {}) => async ({ 8091 registry 8092 }) => { 8093 const noticeId = 'edit-site-template-reverted'; 8094 registry.dispatch(external_wp_notices_namespaceObject.store).removeNotice(noticeId); 8095 if (!isTemplateRevertable(template)) { 8096 registry.dispatch(external_wp_notices_namespaceObject.store).createErrorNotice((0,external_wp_i18n_namespaceObject.__)('This template is not revertable.'), { 8097 type: 'snackbar' 8098 }); 8099 return; 8100 } 8101 try { 8102 const templateEntityConfig = registry.select(external_wp_coreData_namespaceObject.store).getEntityConfig('postType', template.type); 8103 if (!templateEntityConfig) { 8104 registry.dispatch(external_wp_notices_namespaceObject.store).createErrorNotice((0,external_wp_i18n_namespaceObject.__)('The editor has encountered an unexpected error. Please reload.'), { 8105 type: 'snackbar' 8106 }); 8107 return; 8108 } 8109 const fileTemplatePath = (0,external_wp_url_namespaceObject.addQueryArgs)(`$templateEntityConfig.baseURL}/$template.id}`, { 8110 context: 'edit', 8111 source: template.origin 8112 }); 8113 const fileTemplate = await external_wp_apiFetch_default()({ 8114 path: fileTemplatePath 8115 }); 8116 if (!fileTemplate) { 8117 registry.dispatch(external_wp_notices_namespaceObject.store).createErrorNotice((0,external_wp_i18n_namespaceObject.__)('The editor has encountered an unexpected error. Please reload.'), { 8118 type: 'snackbar' 8119 }); 8120 return; 8121 } 8122 const serializeBlocks = ({ 8123 blocks: blocksForSerialization = [] 8124 }) => (0,external_wp_blocks_namespaceObject.__unstableSerializeAndClean)(blocksForSerialization); 8125 const edited = registry.select(external_wp_coreData_namespaceObject.store).getEditedEntityRecord('postType', template.type, template.id); 8126 8127 // We are fixing up the undo level here to make sure we can undo 8128 // the revert in the header toolbar correctly. 8129 registry.dispatch(external_wp_coreData_namespaceObject.store).editEntityRecord('postType', template.type, template.id, { 8130 content: serializeBlocks, 8131 // Required to make the `undo` behave correctly. 8132 blocks: edited.blocks, 8133 // Required to revert the blocks in the editor. 8134 source: 'custom' // required to avoid turning the editor into a dirty state 8135 }, { 8136 undoIgnore: true // Required to merge this edit with the last undo level. 8137 }); 8138 const blocks = (0,external_wp_blocks_namespaceObject.parse)(fileTemplate?.content?.raw); 8139 registry.dispatch(external_wp_coreData_namespaceObject.store).editEntityRecord('postType', template.type, fileTemplate.id, { 8140 content: serializeBlocks, 8141 blocks, 8142 source: 'theme' 8143 }); 8144 if (allowUndo) { 8145 const undoRevert = () => { 8146 registry.dispatch(external_wp_coreData_namespaceObject.store).editEntityRecord('postType', template.type, edited.id, { 8147 content: serializeBlocks, 8148 blocks: edited.blocks, 8149 source: 'custom' 8150 }); 8151 }; 8152 registry.dispatch(external_wp_notices_namespaceObject.store).createSuccessNotice((0,external_wp_i18n_namespaceObject.__)('Template reset.'), { 8153 type: 'snackbar', 8154 id: noticeId, 8155 actions: [{ 8156 label: (0,external_wp_i18n_namespaceObject.__)('Undo'), 8157 onClick: undoRevert 8158 }] 8159 }); 8160 } 8161 } catch (error) { 8162 const errorMessage = error.message && error.code !== 'unknown_error' ? error.message : (0,external_wp_i18n_namespaceObject.__)('Template revert failed. Please reload.'); 8163 registry.dispatch(external_wp_notices_namespaceObject.store).createErrorNotice(errorMessage, { 8164 type: 'snackbar' 8165 }); 8166 } 8167 }; 8168 8169 /** 8170 * Action that removes an array of templates, template parts or patterns. 8171 * 8172 * @param {Array} items An array of template,template part or pattern objects to remove. 8173 */ 8174 const removeTemplates = items => async ({ 8175 registry 8176 }) => { 8177 const isResetting = items.every(item => item?.has_theme_file); 8178 const promiseResult = await Promise.allSettled(items.map(item => { 8179 return registry.dispatch(external_wp_coreData_namespaceObject.store).deleteEntityRecord('postType', item.type, item.id, { 8180 force: true 8181 }, { 8182 throwOnError: true 8183 }); 8184 })); 8185 8186 // If all the promises were fulfilled with sucess. 8187 if (promiseResult.every(({ 8188 status 8189 }) => status === 'fulfilled')) { 8190 let successMessage; 8191 if (items.length === 1) { 8192 // Depending on how the entity was retrieved its title might be 8193 // an object or simple string. 8194 let title; 8195 if (typeof items[0].title === 'string') { 8196 title = items[0].title; 8197 } else if (typeof items[0].title?.rendered === 'string') { 8198 title = items[0].title?.rendered; 8199 } else if (typeof items[0].title?.raw === 'string') { 8200 title = items[0].title?.raw; 8201 } 8202 successMessage = isResetting ? (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: The template/part's name. */ 8203 (0,external_wp_i18n_namespaceObject.__)('"%s" reset.'), (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(title)) : (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: The template/part's name. */ 8204 (0,external_wp_i18n_namespaceObject._x)('"%s" deleted.', 'template part'), (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(title)); 8205 } else { 8206 successMessage = isResetting ? (0,external_wp_i18n_namespaceObject.__)('Items reset.') : (0,external_wp_i18n_namespaceObject.__)('Items deleted.'); 8207 } 8208 registry.dispatch(external_wp_notices_namespaceObject.store).createSuccessNotice(successMessage, { 8209 type: 'snackbar', 8210 id: 'editor-template-deleted-success' 8211 }); 8212 } else { 8213 // If there was at lease one failure. 8214 let errorMessage; 8215 // If we were trying to delete a single template. 8216 if (promiseResult.length === 1) { 8217 if (promiseResult[0].reason?.message) { 8218 errorMessage = promiseResult[0].reason.message; 8219 } else { 8220 errorMessage = isResetting ? (0,external_wp_i18n_namespaceObject.__)('An error occurred while reverting the item.') : (0,external_wp_i18n_namespaceObject.__)('An error occurred while deleting the item.'); 8221 } 8222 // If we were trying to delete a multiple templates 8223 } else { 8224 const errorMessages = new Set(); 8225 const failedPromises = promiseResult.filter(({ 8226 status 8227 }) => status === 'rejected'); 8228 for (const failedPromise of failedPromises) { 8229 if (failedPromise.reason?.message) { 8230 errorMessages.add(failedPromise.reason.message); 8231 } 8232 } 8233 if (errorMessages.size === 0) { 8234 errorMessage = (0,external_wp_i18n_namespaceObject.__)('An error occurred while deleting the items.'); 8235 } else if (errorMessages.size === 1) { 8236 errorMessage = isResetting ? (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: an error message */ 8237 (0,external_wp_i18n_namespaceObject.__)('An error occurred while reverting the items: %s'), [...errorMessages][0]) : (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: an error message */ 8238 (0,external_wp_i18n_namespaceObject.__)('An error occurred while deleting the items: %s'), [...errorMessages][0]); 8239 } else { 8240 errorMessage = isResetting ? (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: a list of comma separated error messages */ 8241 (0,external_wp_i18n_namespaceObject.__)('Some errors occurred while reverting the items: %s'), [...errorMessages].join(',')) : (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: a list of comma separated error messages */ 8242 (0,external_wp_i18n_namespaceObject.__)('Some errors occurred while deleting the items: %s'), [...errorMessages].join(',')); 8243 } 8244 } 8245 registry.dispatch(external_wp_notices_namespaceObject.store).createErrorNotice(errorMessage, { 8246 type: 'snackbar' 8247 }); 8248 } 8249 }; 8250 8251 // EXTERNAL MODULE: ./node_modules/fast-deep-equal/index.js 8252 var fast_deep_equal = __webpack_require__(5215); 8253 var fast_deep_equal_default = /*#__PURE__*/__webpack_require__.n(fast_deep_equal); 8254 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/symbol.js 8255 /** 8256 * WordPress dependencies 8257 */ 8258 8259 8260 const symbol = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 8261 xmlns: "http://www.w3.org/2000/svg", 8262 viewBox: "0 0 24 24", 8263 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 8264 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" 8265 }) 8266 }); 8267 /* harmony default export */ const library_symbol = (symbol); 8268 8269 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/navigation.js 8270 /** 8271 * WordPress dependencies 8272 */ 8273 8274 8275 const navigation = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 8276 viewBox: "0 0 24 24", 8277 xmlns: "http://www.w3.org/2000/svg", 8278 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 8279 d: "M12 4c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm0 14.5c-3.6 0-6.5-2.9-6.5-6.5S8.4 5.5 12 5.5s6.5 2.9 6.5 6.5-2.9 6.5-6.5 6.5zM9 16l4.5-3L15 8.4l-4.5 3L9 16z" 8280 }) 8281 }); 8282 /* harmony default export */ const library_navigation = (navigation); 8283 8284 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/page.js 8285 /** 8286 * WordPress dependencies 8287 */ 8288 8289 8290 8291 const page = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_primitives_namespaceObject.SVG, { 8292 xmlns: "http://www.w3.org/2000/svg", 8293 viewBox: "0 0 24 24", 8294 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 8295 d: "M15.5 7.5h-7V9h7V7.5Zm-7 3.5h7v1.5h-7V11Zm7 3.5h-7V16h7v-1.5Z" 8296 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 8297 d: "M17 4H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2ZM7 5.5h10a.5.5 0 0 1 .5.5v12a.5.5 0 0 1-.5.5H7a.5.5 0 0 1-.5-.5V6a.5.5 0 0 1 .5-.5Z" 8298 })] 8299 }); 8300 /* harmony default export */ const library_page = (page); 8301 8302 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/verse.js 8303 /** 8304 * WordPress dependencies 8305 */ 8306 8307 8308 const verse = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 8309 viewBox: "0 0 24 24", 8310 xmlns: "http://www.w3.org/2000/svg", 8311 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 8312 d: "M17.8 2l-.9.3c-.1 0-3.6 1-5.2 2.1C10 5.5 9.3 6.5 8.9 7.1c-.6.9-1.7 4.7-1.7 6.3l-.9 2.3c-.2.4 0 .8.4 1 .1 0 .2.1.3.1.3 0 .6-.2.7-.5l.6-1.5c.3 0 .7-.1 1.2-.2.7-.1 1.4-.3 2.2-.5.8-.2 1.6-.5 2.4-.8.7-.3 1.4-.7 1.9-1.2s.8-1.2 1-1.9c.2-.7.3-1.6.4-2.4.1-.8.1-1.7.2-2.5 0-.8.1-1.5.2-2.1V2zm-1.9 5.6c-.1.8-.2 1.5-.3 2.1-.2.6-.4 1-.6 1.3-.3.3-.8.6-1.4.9-.7.3-1.4.5-2.2.8-.6.2-1.3.3-1.8.4L15 7.5c.3-.3.6-.7 1-1.1 0 .4 0 .8-.1 1.2zM6 20h8v-1.5H6V20z" 8313 }) 8314 }); 8315 /* harmony default export */ const library_verse = (verse); 8316 8317 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/dataviews/store/private-selectors.js 8318 /** 8319 * Internal dependencies 8320 */ 8321 8322 const EMPTY_ARRAY = []; 8323 function getEntityActions(state, kind, name) { 8324 var _state$actions$kind$n; 8325 return (_state$actions$kind$n = state.actions[kind]?.[name]) !== null && _state$actions$kind$n !== void 0 ? _state$actions$kind$n : EMPTY_ARRAY; 8326 } 8327 function isEntityReady(state, kind, name) { 8328 return state.isReady[kind]?.[name]; 8329 } 8330 8331 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/store/private-selectors.js 8332 /** 8333 * External dependencies 8334 */ 8335 8336 8337 /** 8338 * WordPress dependencies 8339 */ 8340 8341 8342 8343 8344 8345 /** 8346 * Internal dependencies 8347 */ 8348 8349 8350 const EMPTY_INSERTION_POINT = { 8351 rootClientId: undefined, 8352 insertionIndex: undefined, 8353 filterValue: undefined 8354 }; 8355 8356 /** 8357 * Get the insertion point for the inserter. 8358 * 8359 * @param {Object} state Global application state. 8360 * 8361 * @return {Object} The root client ID, index to insert at and starting filter value. 8362 */ 8363 const getInsertionPoint = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (0,external_wp_data_namespaceObject.createSelector)(state => { 8364 if (typeof state.blockInserterPanel === 'object') { 8365 return state.blockInserterPanel; 8366 } 8367 if (getRenderingMode(state) === 'template-locked') { 8368 const [postContentClientId] = select(external_wp_blockEditor_namespaceObject.store).getBlocksByName('core/post-content'); 8369 if (postContentClientId) { 8370 return { 8371 rootClientId: postContentClientId, 8372 insertionIndex: undefined, 8373 filterValue: undefined 8374 }; 8375 } 8376 } 8377 return EMPTY_INSERTION_POINT; 8378 }, state => { 8379 const [postContentClientId] = select(external_wp_blockEditor_namespaceObject.store).getBlocksByName('core/post-content'); 8380 return [state.blockInserterPanel, getRenderingMode(state), postContentClientId]; 8381 })); 8382 function getListViewToggleRef(state) { 8383 return state.listViewToggleRef; 8384 } 8385 function getInserterSidebarToggleRef(state) { 8386 return state.inserterSidebarToggleRef; 8387 } 8388 const CARD_ICONS = { 8389 wp_block: library_symbol, 8390 wp_navigation: library_navigation, 8391 page: library_page, 8392 post: library_verse 8393 }; 8394 const getPostIcon = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (state, postType, options) => { 8395 { 8396 if (postType === 'wp_template_part' || postType === 'wp_template') { 8397 return __experimentalGetDefaultTemplatePartAreas(state).find(item => options.area === item.area)?.icon || library_layout; 8398 } 8399 if (CARD_ICONS[postType]) { 8400 return CARD_ICONS[postType]; 8401 } 8402 const postTypeEntity = select(external_wp_coreData_namespaceObject.store).getPostType(postType); 8403 // `icon` is the `menu_icon` property of a post type. We 8404 // only handle `dashicons` for now, even if the `menu_icon` 8405 // also supports urls and svg as values. 8406 if (typeof postTypeEntity?.icon === 'string' && postTypeEntity.icon.startsWith('dashicons-')) { 8407 return postTypeEntity.icon.slice(10); 8408 } 8409 return library_page; 8410 } 8411 }); 8412 8413 /** 8414 * Returns true if there are unsaved changes to the 8415 * post's meta fields, and false otherwise. 8416 * 8417 * @param {Object} state Global application state. 8418 * @param {string} postType The post type of the post. 8419 * @param {number} postId The ID of the post. 8420 * 8421 * @return {boolean} Whether there are edits or not in the meta fields of the relevant post. 8422 */ 8423 const hasPostMetaChanges = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (state, postType, postId) => { 8424 const { 8425 type: currentPostType, 8426 id: currentPostId 8427 } = getCurrentPost(state); 8428 // If no postType or postId is passed, use the current post. 8429 const edits = select(external_wp_coreData_namespaceObject.store).getEntityRecordNonTransientEdits('postType', postType || currentPostType, postId || currentPostId); 8430 if (!edits?.meta) { 8431 return false; 8432 } 8433 8434 // Compare if anything apart from `footnotes` has changed. 8435 const originalPostMeta = select(external_wp_coreData_namespaceObject.store).getEntityRecord('postType', postType || currentPostType, postId || currentPostId)?.meta; 8436 return !fast_deep_equal_default()({ 8437 ...originalPostMeta, 8438 footnotes: undefined 8439 }, { 8440 ...edits.meta, 8441 footnotes: undefined 8442 }); 8443 }); 8444 function private_selectors_getEntityActions(state, ...args) { 8445 return getEntityActions(state.dataviews, ...args); 8446 } 8447 function private_selectors_isEntityReady(state, ...args) { 8448 return isEntityReady(state.dataviews, ...args); 8449 } 8450 8451 /** 8452 * Similar to getBlocksByName in @wordpress/block-editor, but only returns the top-most 8453 * blocks that aren't descendants of the query block. 8454 * 8455 * @param {Object} state Global application state. 8456 * @param {Array|string} blockNames Block names of the blocks to retrieve. 8457 * 8458 * @return {Array} Block client IDs. 8459 */ 8460 const getPostBlocksByName = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (0,external_wp_data_namespaceObject.createSelector)((state, blockNames) => { 8461 blockNames = Array.isArray(blockNames) ? blockNames : [blockNames]; 8462 const { 8463 getBlocksByName, 8464 getBlockParents, 8465 getBlockName 8466 } = select(external_wp_blockEditor_namespaceObject.store); 8467 return getBlocksByName(blockNames).filter(clientId => getBlockParents(clientId).every(parentClientId => { 8468 const parentBlockName = getBlockName(parentClientId); 8469 return ( 8470 // Ignore descendents of the query block. 8471 parentBlockName !== 'core/query' && 8472 // Enable only the top-most block. 8473 !blockNames.includes(parentBlockName) 8474 ); 8475 })); 8476 }, () => [select(external_wp_blockEditor_namespaceObject.store).getBlocks()])); 8477 8478 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/store/index.js 8479 /** 8480 * WordPress dependencies 8481 */ 8482 8483 8484 /** 8485 * Internal dependencies 8486 */ 8487 8488 8489 8490 8491 8492 8493 8494 8495 /** 8496 * Post editor data store configuration. 8497 * 8498 * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/data/README.md#registerStore 8499 * 8500 * @type {Object} 8501 */ 8502 const storeConfig = { 8503 reducer: store_reducer, 8504 selectors: selectors_namespaceObject, 8505 actions: actions_namespaceObject 8506 }; 8507 8508 /** 8509 * Store definition for the editor namespace. 8510 * 8511 * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/data/README.md#createReduxStore 8512 * 8513 * @type {Object} 8514 */ 8515 const store_store = (0,external_wp_data_namespaceObject.createReduxStore)(STORE_NAME, { 8516 ...storeConfig 8517 }); 8518 (0,external_wp_data_namespaceObject.register)(store_store); 8519 unlock(store_store).registerPrivateActions(store_private_actions_namespaceObject); 8520 unlock(store_store).registerPrivateSelectors(store_private_selectors_namespaceObject); 8521 8522 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/hooks/custom-sources-backwards-compatibility.js 8523 /** 8524 * WordPress dependencies 8525 */ 8526 8527 8528 8529 8530 8531 8532 /** 8533 * Internal dependencies 8534 */ 8535 8536 8537 /** @typedef {import('@wordpress/compose').WPHigherOrderComponent} WPHigherOrderComponent */ 8538 /** @typedef {import('@wordpress/blocks').WPBlockSettings} WPBlockSettings */ 8539 8540 /** 8541 * Object whose keys are the names of block attributes, where each value 8542 * represents the meta key to which the block attribute is intended to save. 8543 * 8544 * @see https://developer.wordpress.org/reference/functions/register_meta/ 8545 * 8546 * @typedef {Object<string,string>} WPMetaAttributeMapping 8547 */ 8548 8549 /** 8550 * Given a mapping of attribute names (meta source attributes) to their 8551 * associated meta key, returns a higher order component that overrides its 8552 * `attributes` and `setAttributes` props to sync any changes with the edited 8553 * post's meta keys. 8554 * 8555 * @param {WPMetaAttributeMapping} metaAttributes Meta attribute mapping. 8556 * 8557 * @return {WPHigherOrderComponent} Higher-order component. 8558 */ 8559 8560 const createWithMetaAttributeSource = metaAttributes => (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(BlockEdit => ({ 8561 attributes, 8562 setAttributes, 8563 ...props 8564 }) => { 8565 const postType = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getCurrentPostType(), []); 8566 const [meta, setMeta] = (0,external_wp_coreData_namespaceObject.useEntityProp)('postType', postType, 'meta'); 8567 const mergedAttributes = (0,external_wp_element_namespaceObject.useMemo)(() => ({ 8568 ...attributes, 8569 ...Object.fromEntries(Object.entries(metaAttributes).map(([attributeKey, metaKey]) => [attributeKey, meta[metaKey]])) 8570 }), [attributes, meta]); 8571 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(BlockEdit, { 8572 attributes: mergedAttributes, 8573 setAttributes: nextAttributes => { 8574 const nextMeta = Object.fromEntries(Object.entries(nextAttributes !== null && nextAttributes !== void 0 ? nextAttributes : {}).filter( 8575 // Filter to intersection of keys between the updated 8576 // attributes and those with an associated meta key. 8577 ([key]) => key in metaAttributes).map(([attributeKey, value]) => [ 8578 // Rename the keys to the expected meta key name. 8579 metaAttributes[attributeKey], value])); 8580 if (Object.entries(nextMeta).length) { 8581 setMeta(nextMeta); 8582 } 8583 setAttributes(nextAttributes); 8584 }, 8585 ...props 8586 }); 8587 }, 'withMetaAttributeSource'); 8588 8589 /** 8590 * Filters a registered block's settings to enhance a block's `edit` component 8591 * to upgrade meta-sourced attributes to use the post's meta entity property. 8592 * 8593 * @param {WPBlockSettings} settings Registered block settings. 8594 * 8595 * @return {WPBlockSettings} Filtered block settings. 8596 */ 8597 function shimAttributeSource(settings) { 8598 var _settings$attributes; 8599 /** @type {WPMetaAttributeMapping} */ 8600 const metaAttributes = Object.fromEntries(Object.entries((_settings$attributes = settings.attributes) !== null && _settings$attributes !== void 0 ? _settings$attributes : {}).filter(([, { 8601 source 8602 }]) => source === 'meta').map(([attributeKey, { 8603 meta 8604 }]) => [attributeKey, meta])); 8605 if (Object.entries(metaAttributes).length) { 8606 settings.edit = createWithMetaAttributeSource(metaAttributes)(settings.edit); 8607 } 8608 return settings; 8609 } 8610 (0,external_wp_hooks_namespaceObject.addFilter)('blocks.registerBlockType', 'core/editor/custom-sources-backwards-compatibility/shim-attribute-source', shimAttributeSource); 8611 8612 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/autocompleters/user.js 8613 /** 8614 * WordPress dependencies 8615 */ 8616 8617 8618 8619 8620 /** @typedef {import('@wordpress/components').WPCompleter} WPCompleter */ 8621 8622 8623 8624 function getUserLabel(user) { 8625 const avatar = user.avatar_urls && user.avatar_urls[24] ? /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("img", { 8626 className: "editor-autocompleters__user-avatar", 8627 alt: "", 8628 src: user.avatar_urls[24] 8629 }) : /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 8630 className: "editor-autocompleters__no-avatar" 8631 }); 8632 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 8633 children: [avatar, /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 8634 className: "editor-autocompleters__user-name", 8635 children: user.name 8636 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 8637 className: "editor-autocompleters__user-slug", 8638 children: user.slug 8639 })] 8640 }); 8641 } 8642 8643 /** 8644 * A user mentions completer. 8645 * 8646 * @type {WPCompleter} 8647 */ 8648 /* harmony default export */ const user = ({ 8649 name: 'users', 8650 className: 'editor-autocompleters__user', 8651 triggerPrefix: '@', 8652 useItems(filterValue) { 8653 const users = (0,external_wp_data_namespaceObject.useSelect)(select => { 8654 const { 8655 getUsers 8656 } = select(external_wp_coreData_namespaceObject.store); 8657 return getUsers({ 8658 context: 'view', 8659 search: encodeURIComponent(filterValue) 8660 }); 8661 }, [filterValue]); 8662 const options = (0,external_wp_element_namespaceObject.useMemo)(() => users ? users.map(user => ({ 8663 key: `user-$user.slug}`, 8664 value: user, 8665 label: getUserLabel(user) 8666 })) : [], [users]); 8667 return [options]; 8668 }, 8669 getOptionCompletion(user) { 8670 return `@$user.slug}`; 8671 } 8672 }); 8673 8674 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/hooks/default-autocompleters.js 8675 /** 8676 * WordPress dependencies 8677 */ 8678 8679 8680 /** 8681 * Internal dependencies 8682 */ 8683 8684 function setDefaultCompleters(completers = []) { 8685 // Provide copies so filters may directly modify them. 8686 completers.push({ 8687 ...user 8688 }); 8689 return completers; 8690 } 8691 (0,external_wp_hooks_namespaceObject.addFilter)('editor.Autocomplete.completers', 'editor/autocompleters/set-default-completers', setDefaultCompleters); 8692 8693 ;// CONCATENATED MODULE: external ["wp","mediaUtils"] 8694 const external_wp_mediaUtils_namespaceObject = window["wp"]["mediaUtils"]; 8695 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/hooks/media-upload.js 8696 /** 8697 * WordPress dependencies 8698 */ 8699 8700 8701 (0,external_wp_hooks_namespaceObject.addFilter)('editor.MediaUpload', 'core/editor/components/media-upload', () => external_wp_mediaUtils_namespaceObject.MediaUpload); 8702 8703 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/hooks/pattern-overrides.js 8704 /** 8705 * WordPress dependencies 8706 */ 8707 8708 8709 8710 8711 8712 8713 8714 /** 8715 * Internal dependencies 8716 */ 8717 8718 8719 8720 /** @typedef {import('@wordpress/blocks').WPBlockSettings} WPBlockSettings */ 8721 8722 8723 8724 const { 8725 PatternOverridesControls, 8726 ResetOverridesControl, 8727 PatternOverridesBlockControls, 8728 PATTERN_TYPES: pattern_overrides_PATTERN_TYPES, 8729 PARTIAL_SYNCING_SUPPORTED_BLOCKS, 8730 PATTERN_SYNC_TYPES 8731 } = unlock(external_wp_patterns_namespaceObject.privateApis); 8732 8733 /** 8734 * Override the default edit UI to include a new block inspector control for 8735 * assigning a partial syncing controls to supported blocks in the pattern editor. 8736 * Currently, only the `core/paragraph` block is supported. 8737 * 8738 * @param {Component} BlockEdit Original component. 8739 * 8740 * @return {Component} Wrapped component. 8741 */ 8742 const withPatternOverrideControls = (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(BlockEdit => props => { 8743 const isSupportedBlock = !!PARTIAL_SYNCING_SUPPORTED_BLOCKS[props.name]; 8744 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 8745 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(BlockEdit, { 8746 ...props 8747 }, "edit"), props.isSelected && isSupportedBlock && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ControlsWithStoreSubscription, { 8748 ...props 8749 }), isSupportedBlock && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PatternOverridesBlockControls, {})] 8750 }); 8751 }, 'withPatternOverrideControls'); 8752 8753 // Split into a separate component to avoid a store subscription 8754 // on every block. 8755 function ControlsWithStoreSubscription(props) { 8756 const blockEditingMode = (0,external_wp_blockEditor_namespaceObject.useBlockEditingMode)(); 8757 const { 8758 hasPatternOverridesSource, 8759 isEditingSyncedPattern 8760 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 8761 const { 8762 getCurrentPostType, 8763 getEditedPostAttribute 8764 } = select(store_store); 8765 return { 8766 // For editing link to the site editor if the theme and user permissions support it. 8767 hasPatternOverridesSource: !!(0,external_wp_blocks_namespaceObject.getBlockBindingsSource)('core/pattern-overrides'), 8768 isEditingSyncedPattern: getCurrentPostType() === pattern_overrides_PATTERN_TYPES.user && getEditedPostAttribute('meta')?.wp_pattern_sync_status !== PATTERN_SYNC_TYPES.unsynced && getEditedPostAttribute('wp_pattern_sync_status') !== PATTERN_SYNC_TYPES.unsynced 8769 }; 8770 }, []); 8771 const bindings = props.attributes.metadata?.bindings; 8772 const hasPatternBindings = !!bindings && Object.values(bindings).some(binding => binding.source === 'core/pattern-overrides'); 8773 const shouldShowPatternOverridesControls = isEditingSyncedPattern && blockEditingMode === 'default'; 8774 const shouldShowResetOverridesControl = !isEditingSyncedPattern && !!props.attributes.metadata?.name && blockEditingMode !== 'disabled' && hasPatternBindings; 8775 if (!hasPatternOverridesSource) { 8776 return null; 8777 } 8778 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 8779 children: [shouldShowPatternOverridesControls && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PatternOverridesControls, { 8780 ...props 8781 }), shouldShowResetOverridesControl && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ResetOverridesControl, { 8782 ...props 8783 })] 8784 }); 8785 } 8786 (0,external_wp_hooks_namespaceObject.addFilter)('editor.BlockEdit', 'core/editor/with-pattern-override-controls', withPatternOverrideControls); 8787 8788 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/hooks/index.js 8789 /** 8790 * Internal dependencies 8791 */ 8792 8793 8794 8795 8796 8797 ;// CONCATENATED MODULE: external ["wp","keyboardShortcuts"] 8798 const external_wp_keyboardShortcuts_namespaceObject = window["wp"]["keyboardShortcuts"]; 8799 ;// CONCATENATED MODULE: ./node_modules/clsx/dist/clsx.mjs 8800 function clsx_r(e){var t,f,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=clsx_r(e[t]))&&(n&&(n+=" "),n+=f)}else for(f in e)e[f]&&(n&&(n+=" "),n+=f);return n}function clsx(){for(var e,t,f=0,n="",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=clsx_r(e))&&(n&&(n+=" "),n+=t);return n}/* harmony default export */ const dist_clsx = (clsx); 8801 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/star-filled.js 8802 /** 8803 * WordPress dependencies 8804 */ 8805 8806 8807 const starFilled = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 8808 xmlns: "http://www.w3.org/2000/svg", 8809 viewBox: "0 0 24 24", 8810 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 8811 d: "M11.776 4.454a.25.25 0 01.448 0l2.069 4.192a.25.25 0 00.188.137l4.626.672a.25.25 0 01.139.426l-3.348 3.263a.25.25 0 00-.072.222l.79 4.607a.25.25 0 01-.362.263l-4.138-2.175a.25.25 0 00-.232 0l-4.138 2.175a.25.25 0 01-.363-.263l.79-4.607a.25.25 0 00-.071-.222L4.754 9.881a.25.25 0 01.139-.426l4.626-.672a.25.25 0 00.188-.137l2.069-4.192z" 8812 }) 8813 }); 8814 /* harmony default export */ const star_filled = (starFilled); 8815 8816 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/star-empty.js 8817 /** 8818 * WordPress dependencies 8819 */ 8820 8821 8822 const starEmpty = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 8823 xmlns: "http://www.w3.org/2000/svg", 8824 viewBox: "0 0 24 24", 8825 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 8826 fillRule: "evenodd", 8827 d: "M9.706 8.646a.25.25 0 01-.188.137l-4.626.672a.25.25 0 00-.139.427l3.348 3.262a.25.25 0 01.072.222l-.79 4.607a.25.25 0 00.362.264l4.138-2.176a.25.25 0 01.233 0l4.137 2.175a.25.25 0 00.363-.263l-.79-4.607a.25.25 0 01.072-.222l3.347-3.262a.25.25 0 00-.139-.427l-4.626-.672a.25.25 0 01-.188-.137l-2.069-4.192a.25.25 0 00-.448 0L9.706 8.646zM12 7.39l-.948 1.921a1.75 1.75 0 01-1.317.957l-2.12.308 1.534 1.495c.412.402.6.982.503 1.55l-.362 2.11 1.896-.997a1.75 1.75 0 011.629 0l1.895.997-.362-2.11a1.75 1.75 0 01.504-1.55l1.533-1.495-2.12-.308a1.75 1.75 0 01-1.317-.957L12 7.39z", 8828 clipRule: "evenodd" 8829 }) 8830 }); 8831 /* harmony default export */ const star_empty = (starEmpty); 8832 8833 ;// CONCATENATED MODULE: external ["wp","viewport"] 8834 const external_wp_viewport_namespaceObject = window["wp"]["viewport"]; 8835 ;// CONCATENATED MODULE: ./node_modules/@wordpress/interface/build-module/store/deprecated.js 8836 /** 8837 * WordPress dependencies 8838 */ 8839 8840 function normalizeComplementaryAreaScope(scope) { 8841 if (['core/edit-post', 'core/edit-site'].includes(scope)) { 8842 external_wp_deprecated_default()(`$scope} interface scope`, { 8843 alternative: 'core interface scope', 8844 hint: 'core/edit-post and core/edit-site are merging.', 8845 version: '6.6' 8846 }); 8847 return 'core'; 8848 } 8849 return scope; 8850 } 8851 function normalizeComplementaryAreaName(scope, name) { 8852 if (scope === 'core' && name === 'edit-site/template') { 8853 external_wp_deprecated_default()(`edit-site/template sidebar`, { 8854 alternative: 'edit-post/document', 8855 version: '6.6' 8856 }); 8857 return 'edit-post/document'; 8858 } 8859 if (scope === 'core' && name === 'edit-site/block-inspector') { 8860 external_wp_deprecated_default()(`edit-site/block-inspector sidebar`, { 8861 alternative: 'edit-post/block', 8862 version: '6.6' 8863 }); 8864 return 'edit-post/block'; 8865 } 8866 return name; 8867 } 8868 8869 ;// CONCATENATED MODULE: ./node_modules/@wordpress/interface/build-module/store/actions.js 8870 /** 8871 * WordPress dependencies 8872 */ 8873 8874 8875 8876 /** 8877 * Internal dependencies 8878 */ 8879 8880 8881 /** 8882 * Set a default complementary area. 8883 * 8884 * @param {string} scope Complementary area scope. 8885 * @param {string} area Area identifier. 8886 * 8887 * @return {Object} Action object. 8888 */ 8889 const setDefaultComplementaryArea = (scope, area) => { 8890 scope = normalizeComplementaryAreaScope(scope); 8891 area = normalizeComplementaryAreaName(scope, area); 8892 return { 8893 type: 'SET_DEFAULT_COMPLEMENTARY_AREA', 8894 scope, 8895 area 8896 }; 8897 }; 8898 8899 /** 8900 * Enable the complementary area. 8901 * 8902 * @param {string} scope Complementary area scope. 8903 * @param {string} area Area identifier. 8904 */ 8905 const enableComplementaryArea = (scope, area) => ({ 8906 registry, 8907 dispatch 8908 }) => { 8909 // Return early if there's no area. 8910 if (!area) { 8911 return; 8912 } 8913 scope = normalizeComplementaryAreaScope(scope); 8914 area = normalizeComplementaryAreaName(scope, area); 8915 const isComplementaryAreaVisible = registry.select(external_wp_preferences_namespaceObject.store).get(scope, 'isComplementaryAreaVisible'); 8916 if (!isComplementaryAreaVisible) { 8917 registry.dispatch(external_wp_preferences_namespaceObject.store).set(scope, 'isComplementaryAreaVisible', true); 8918 } 8919 dispatch({ 8920 type: 'ENABLE_COMPLEMENTARY_AREA', 8921 scope, 8922 area 8923 }); 8924 }; 8925 8926 /** 8927 * Disable the complementary area. 8928 * 8929 * @param {string} scope Complementary area scope. 8930 */ 8931 const disableComplementaryArea = scope => ({ 8932 registry 8933 }) => { 8934 scope = normalizeComplementaryAreaScope(scope); 8935 const isComplementaryAreaVisible = registry.select(external_wp_preferences_namespaceObject.store).get(scope, 'isComplementaryAreaVisible'); 8936 if (isComplementaryAreaVisible) { 8937 registry.dispatch(external_wp_preferences_namespaceObject.store).set(scope, 'isComplementaryAreaVisible', false); 8938 } 8939 }; 8940 8941 /** 8942 * Pins an item. 8943 * 8944 * @param {string} scope Item scope. 8945 * @param {string} item Item identifier. 8946 * 8947 * @return {Object} Action object. 8948 */ 8949 const pinItem = (scope, item) => ({ 8950 registry 8951 }) => { 8952 // Return early if there's no item. 8953 if (!item) { 8954 return; 8955 } 8956 scope = normalizeComplementaryAreaScope(scope); 8957 item = normalizeComplementaryAreaName(scope, item); 8958 const pinnedItems = registry.select(external_wp_preferences_namespaceObject.store).get(scope, 'pinnedItems'); 8959 8960 // The item is already pinned, there's nothing to do. 8961 if (pinnedItems?.[item] === true) { 8962 return; 8963 } 8964 registry.dispatch(external_wp_preferences_namespaceObject.store).set(scope, 'pinnedItems', { 8965 ...pinnedItems, 8966 [item]: true 8967 }); 8968 }; 8969 8970 /** 8971 * Unpins an item. 8972 * 8973 * @param {string} scope Item scope. 8974 * @param {string} item Item identifier. 8975 */ 8976 const unpinItem = (scope, item) => ({ 8977 registry 8978 }) => { 8979 // Return early if there's no item. 8980 if (!item) { 8981 return; 8982 } 8983 scope = normalizeComplementaryAreaScope(scope); 8984 item = normalizeComplementaryAreaName(scope, item); 8985 const pinnedItems = registry.select(external_wp_preferences_namespaceObject.store).get(scope, 'pinnedItems'); 8986 registry.dispatch(external_wp_preferences_namespaceObject.store).set(scope, 'pinnedItems', { 8987 ...pinnedItems, 8988 [item]: false 8989 }); 8990 }; 8991 8992 /** 8993 * Returns an action object used in signalling that a feature should be toggled. 8994 * 8995 * @param {string} scope The feature scope (e.g. core/edit-post). 8996 * @param {string} featureName The feature name. 8997 */ 8998 function toggleFeature(scope, featureName) { 8999 return function ({ 9000 registry 9001 }) { 9002 external_wp_deprecated_default()(`dispatch( 'core/interface' ).toggleFeature`, { 9003 since: '6.0', 9004 alternative: `dispatch( 'core/preferences' ).toggle` 9005 }); 9006 registry.dispatch(external_wp_preferences_namespaceObject.store).toggle(scope, featureName); 9007 }; 9008 } 9009 9010 /** 9011 * Returns an action object used in signalling that a feature should be set to 9012 * a true or false value 9013 * 9014 * @param {string} scope The feature scope (e.g. core/edit-post). 9015 * @param {string} featureName The feature name. 9016 * @param {boolean} value The value to set. 9017 * 9018 * @return {Object} Action object. 9019 */ 9020 function setFeatureValue(scope, featureName, value) { 9021 return function ({ 9022 registry 9023 }) { 9024 external_wp_deprecated_default()(`dispatch( 'core/interface' ).setFeatureValue`, { 9025 since: '6.0', 9026 alternative: `dispatch( 'core/preferences' ).set` 9027 }); 9028 registry.dispatch(external_wp_preferences_namespaceObject.store).set(scope, featureName, !!value); 9029 }; 9030 } 9031 9032 /** 9033 * Returns an action object used in signalling that defaults should be set for features. 9034 * 9035 * @param {string} scope The feature scope (e.g. core/edit-post). 9036 * @param {Object<string, boolean>} defaults A key/value map of feature names to values. 9037 * 9038 * @return {Object} Action object. 9039 */ 9040 function setFeatureDefaults(scope, defaults) { 9041 return function ({ 9042 registry 9043 }) { 9044 external_wp_deprecated_default()(`dispatch( 'core/interface' ).setFeatureDefaults`, { 9045 since: '6.0', 9046 alternative: `dispatch( 'core/preferences' ).setDefaults` 9047 }); 9048 registry.dispatch(external_wp_preferences_namespaceObject.store).setDefaults(scope, defaults); 9049 }; 9050 } 9051 9052 /** 9053 * Returns an action object used in signalling that the user opened a modal. 9054 * 9055 * @param {string} name A string that uniquely identifies the modal. 9056 * 9057 * @return {Object} Action object. 9058 */ 9059 function openModal(name) { 9060 return { 9061 type: 'OPEN_MODAL', 9062 name 9063 }; 9064 } 9065 9066 /** 9067 * Returns an action object signalling that the user closed a modal. 9068 * 9069 * @return {Object} Action object. 9070 */ 9071 function closeModal() { 9072 return { 9073 type: 'CLOSE_MODAL' 9074 }; 9075 } 9076 9077 ;// CONCATENATED MODULE: ./node_modules/@wordpress/interface/build-module/store/selectors.js 9078 /** 9079 * WordPress dependencies 9080 */ 9081 9082 9083 9084 9085 /** 9086 * Internal dependencies 9087 */ 9088 9089 9090 /** 9091 * Returns the complementary area that is active in a given scope. 9092 * 9093 * @param {Object} state Global application state. 9094 * @param {string} scope Item scope. 9095 * 9096 * @return {string | null | undefined} The complementary area that is active in the given scope. 9097 */ 9098 const getActiveComplementaryArea = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (state, scope) => { 9099 scope = normalizeComplementaryAreaScope(scope); 9100 const isComplementaryAreaVisible = select(external_wp_preferences_namespaceObject.store).get(scope, 'isComplementaryAreaVisible'); 9101 9102 // Return `undefined` to indicate that the user has never toggled 9103 // visibility, this is the vanilla default. Other code relies on this 9104 // nuance in the return value. 9105 if (isComplementaryAreaVisible === undefined) { 9106 return undefined; 9107 } 9108 9109 // Return `null` to indicate the user hid the complementary area. 9110 if (isComplementaryAreaVisible === false) { 9111 return null; 9112 } 9113 return state?.complementaryAreas?.[scope]; 9114 }); 9115 const isComplementaryAreaLoading = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (state, scope) => { 9116 scope = normalizeComplementaryAreaScope(scope); 9117 const isVisible = select(external_wp_preferences_namespaceObject.store).get(scope, 'isComplementaryAreaVisible'); 9118 const identifier = state?.complementaryAreas?.[scope]; 9119 return isVisible && identifier === undefined; 9120 }); 9121 9122 /** 9123 * Returns a boolean indicating if an item is pinned or not. 9124 * 9125 * @param {Object} state Global application state. 9126 * @param {string} scope Scope. 9127 * @param {string} item Item to check. 9128 * 9129 * @return {boolean} True if the item is pinned and false otherwise. 9130 */ 9131 const isItemPinned = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (state, scope, item) => { 9132 var _pinnedItems$item; 9133 scope = normalizeComplementaryAreaScope(scope); 9134 item = normalizeComplementaryAreaName(scope, item); 9135 const pinnedItems = select(external_wp_preferences_namespaceObject.store).get(scope, 'pinnedItems'); 9136 return (_pinnedItems$item = pinnedItems?.[item]) !== null && _pinnedItems$item !== void 0 ? _pinnedItems$item : true; 9137 }); 9138 9139 /** 9140 * Returns a boolean indicating whether a feature is active for a particular 9141 * scope. 9142 * 9143 * @param {Object} state The store state. 9144 * @param {string} scope The scope of the feature (e.g. core/edit-post). 9145 * @param {string} featureName The name of the feature. 9146 * 9147 * @return {boolean} Is the feature enabled? 9148 */ 9149 const isFeatureActive = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (state, scope, featureName) => { 9150 external_wp_deprecated_default()(`select( 'core/interface' ).isFeatureActive( scope, featureName )`, { 9151 since: '6.0', 9152 alternative: `select( 'core/preferences' ).get( scope, featureName )` 9153 }); 9154 return !!select(external_wp_preferences_namespaceObject.store).get(scope, featureName); 9155 }); 9156 9157 /** 9158 * Returns true if a modal is active, or false otherwise. 9159 * 9160 * @param {Object} state Global application state. 9161 * @param {string} modalName A string that uniquely identifies the modal. 9162 * 9163 * @return {boolean} Whether the modal is active. 9164 */ 9165 function isModalActive(state, modalName) { 9166 return state.activeModal === modalName; 9167 } 9168 9169 ;// CONCATENATED MODULE: ./node_modules/@wordpress/interface/build-module/store/reducer.js 9170 /** 9171 * WordPress dependencies 9172 */ 9173 9174 function complementaryAreas(state = {}, action) { 9175 switch (action.type) { 9176 case 'SET_DEFAULT_COMPLEMENTARY_AREA': 9177 { 9178 const { 9179 scope, 9180 area 9181 } = action; 9182 9183 // If there's already an area, don't overwrite it. 9184 if (state[scope]) { 9185 return state; 9186 } 9187 return { 9188 ...state, 9189 [scope]: area 9190 }; 9191 } 9192 case 'ENABLE_COMPLEMENTARY_AREA': 9193 { 9194 const { 9195 scope, 9196 area 9197 } = action; 9198 return { 9199 ...state, 9200 [scope]: area 9201 }; 9202 } 9203 } 9204 return state; 9205 } 9206 9207 /** 9208 * Reducer for storing the name of the open modal, or null if no modal is open. 9209 * 9210 * @param {Object} state Previous state. 9211 * @param {Object} action Action object containing the `name` of the modal 9212 * 9213 * @return {Object} Updated state 9214 */ 9215 function activeModal(state = null, action) { 9216 switch (action.type) { 9217 case 'OPEN_MODAL': 9218 return action.name; 9219 case 'CLOSE_MODAL': 9220 return null; 9221 } 9222 return state; 9223 } 9224 /* harmony default export */ const build_module_store_reducer = ((0,external_wp_data_namespaceObject.combineReducers)({ 9225 complementaryAreas, 9226 activeModal 9227 })); 9228 9229 ;// CONCATENATED MODULE: ./node_modules/@wordpress/interface/build-module/store/constants.js 9230 /** 9231 * The identifier for the data store. 9232 * 9233 * @type {string} 9234 */ 9235 const constants_STORE_NAME = 'core/interface'; 9236 9237 ;// CONCATENATED MODULE: ./node_modules/@wordpress/interface/build-module/store/index.js 9238 /** 9239 * WordPress dependencies 9240 */ 9241 9242 9243 /** 9244 * Internal dependencies 9245 */ 9246 9247 9248 9249 9250 9251 /** 9252 * Store definition for the interface namespace. 9253 * 9254 * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/data/README.md#createReduxStore 9255 * 9256 * @type {Object} 9257 */ 9258 const store = (0,external_wp_data_namespaceObject.createReduxStore)(constants_STORE_NAME, { 9259 reducer: build_module_store_reducer, 9260 actions: store_actions_namespaceObject, 9261 selectors: store_selectors_namespaceObject 9262 }); 9263 9264 // Once we build a more generic persistence plugin that works across types of stores 9265 // we'd be able to replace this with a register call. 9266 (0,external_wp_data_namespaceObject.register)(store); 9267 9268 ;// CONCATENATED MODULE: external ["wp","plugins"] 9269 const external_wp_plugins_namespaceObject = window["wp"]["plugins"]; 9270 ;// CONCATENATED MODULE: ./node_modules/@wordpress/interface/build-module/components/complementary-area-context/index.js 9271 /** 9272 * WordPress dependencies 9273 */ 9274 9275 /* harmony default export */ const complementary_area_context = ((0,external_wp_plugins_namespaceObject.withPluginContext)((context, ownProps) => { 9276 return { 9277 icon: ownProps.icon || context.icon, 9278 identifier: ownProps.identifier || `$context.name}/$ownProps.name}` 9279 }; 9280 })); 9281 9282 ;// CONCATENATED MODULE: ./node_modules/@wordpress/interface/build-module/components/complementary-area-toggle/index.js 9283 /** 9284 * WordPress dependencies 9285 */ 9286 9287 9288 9289 /** 9290 * Internal dependencies 9291 */ 9292 9293 9294 9295 /** 9296 * Whether the role supports checked state. 9297 * 9298 * @param {import('react').AriaRole} role Role. 9299 * @return {boolean} Whether the role supports checked state. 9300 * @see https://www.w3.org/TR/wai-aria-1.1/#aria-checked 9301 */ 9302 9303 function roleSupportsCheckedState(role) { 9304 return ['checkbox', 'option', 'radio', 'switch', 'menuitemcheckbox', 'menuitemradio', 'treeitem'].includes(role); 9305 } 9306 function ComplementaryAreaToggle({ 9307 as = external_wp_components_namespaceObject.Button, 9308 scope, 9309 identifier, 9310 icon, 9311 selectedIcon, 9312 name, 9313 shortcut, 9314 ...props 9315 }) { 9316 const ComponentToUse = as; 9317 const isSelected = (0,external_wp_data_namespaceObject.useSelect)(select => select(store).getActiveComplementaryArea(scope) === identifier, [identifier, scope]); 9318 const { 9319 enableComplementaryArea, 9320 disableComplementaryArea 9321 } = (0,external_wp_data_namespaceObject.useDispatch)(store); 9322 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ComponentToUse, { 9323 icon: selectedIcon && isSelected ? selectedIcon : icon, 9324 "aria-controls": identifier.replace('/', ':') 9325 // Make sure aria-checked matches spec https://www.w3.org/TR/wai-aria-1.1/#aria-checked 9326 , 9327 "aria-checked": roleSupportsCheckedState(props.role) ? isSelected : undefined, 9328 onClick: () => { 9329 if (isSelected) { 9330 disableComplementaryArea(scope); 9331 } else { 9332 enableComplementaryArea(scope, identifier); 9333 } 9334 }, 9335 shortcut: shortcut, 9336 ...props 9337 }); 9338 } 9339 /* harmony default export */ const complementary_area_toggle = (complementary_area_context(ComplementaryAreaToggle)); 9340 9341 ;// CONCATENATED MODULE: ./node_modules/@wordpress/interface/build-module/components/complementary-area-header/index.js 9342 /** 9343 * External dependencies 9344 */ 9345 9346 9347 /** 9348 * WordPress dependencies 9349 */ 9350 9351 9352 /** 9353 * Internal dependencies 9354 */ 9355 9356 9357 9358 9359 const ComplementaryAreaHeader = ({ 9360 smallScreenTitle, 9361 children, 9362 className, 9363 toggleButtonProps 9364 }) => { 9365 const toggleButton = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(complementary_area_toggle, { 9366 icon: close_small, 9367 ...toggleButtonProps 9368 }); 9369 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 9370 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 9371 className: "components-panel__header interface-complementary-area-header__small", 9372 children: [smallScreenTitle && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("h2", { 9373 className: "interface-complementary-area-header__small-title", 9374 children: smallScreenTitle 9375 }), toggleButton] 9376 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 9377 className: dist_clsx('components-panel__header', 'interface-complementary-area-header', className), 9378 tabIndex: -1, 9379 children: [children, toggleButton] 9380 })] 9381 }); 9382 }; 9383 /* harmony default export */ const complementary_area_header = (ComplementaryAreaHeader); 9384 9385 ;// CONCATENATED MODULE: ./node_modules/@wordpress/interface/build-module/components/action-item/index.js 9386 /** 9387 * WordPress dependencies 9388 */ 9389 9390 9391 9392 const noop = () => {}; 9393 function ActionItemSlot({ 9394 name, 9395 as: Component = external_wp_components_namespaceObject.ButtonGroup, 9396 fillProps = {}, 9397 bubblesVirtually, 9398 ...props 9399 }) { 9400 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Slot, { 9401 name: name, 9402 bubblesVirtually: bubblesVirtually, 9403 fillProps: fillProps, 9404 children: fills => { 9405 if (!external_wp_element_namespaceObject.Children.toArray(fills).length) { 9406 return null; 9407 } 9408 9409 // Special handling exists for backward compatibility. 9410 // It ensures that menu items created by plugin authors aren't 9411 // duplicated with automatically injected menu items coming 9412 // from pinnable plugin sidebars. 9413 // @see https://github.com/WordPress/gutenberg/issues/14457 9414 const initializedByPlugins = []; 9415 external_wp_element_namespaceObject.Children.forEach(fills, ({ 9416 props: { 9417 __unstableExplicitMenuItem, 9418 __unstableTarget 9419 } 9420 }) => { 9421 if (__unstableTarget && __unstableExplicitMenuItem) { 9422 initializedByPlugins.push(__unstableTarget); 9423 } 9424 }); 9425 const children = external_wp_element_namespaceObject.Children.map(fills, child => { 9426 if (!child.props.__unstableExplicitMenuItem && initializedByPlugins.includes(child.props.__unstableTarget)) { 9427 return null; 9428 } 9429 return child; 9430 }); 9431 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(Component, { 9432 ...props, 9433 children: children 9434 }); 9435 } 9436 }); 9437 } 9438 function ActionItem({ 9439 name, 9440 as: Component = external_wp_components_namespaceObject.Button, 9441 onClick, 9442 ...props 9443 }) { 9444 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Fill, { 9445 name: name, 9446 children: ({ 9447 onClick: fpOnClick 9448 }) => { 9449 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(Component, { 9450 onClick: onClick || fpOnClick ? (...args) => { 9451 (onClick || noop)(...args); 9452 (fpOnClick || noop)(...args); 9453 } : undefined, 9454 ...props 9455 }); 9456 } 9457 }); 9458 } 9459 ActionItem.Slot = ActionItemSlot; 9460 /* harmony default export */ const action_item = (ActionItem); 9461 9462 ;// CONCATENATED MODULE: ./node_modules/@wordpress/interface/build-module/components/complementary-area-more-menu-item/index.js 9463 /** 9464 * WordPress dependencies 9465 */ 9466 9467 9468 9469 /** 9470 * Internal dependencies 9471 */ 9472 9473 9474 9475 const PluginsMenuItem = ({ 9476 // Menu item is marked with unstable prop for backward compatibility. 9477 // They are removed so they don't leak to DOM elements. 9478 // @see https://github.com/WordPress/gutenberg/issues/14457 9479 __unstableExplicitMenuItem, 9480 __unstableTarget, 9481 ...restProps 9482 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItem, { 9483 ...restProps 9484 }); 9485 function ComplementaryAreaMoreMenuItem({ 9486 scope, 9487 target, 9488 __unstableExplicitMenuItem, 9489 ...props 9490 }) { 9491 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(complementary_area_toggle, { 9492 as: toggleProps => { 9493 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(action_item, { 9494 __unstableExplicitMenuItem: __unstableExplicitMenuItem, 9495 __unstableTarget: `$scope}/$target}`, 9496 as: PluginsMenuItem, 9497 name: `$scope}/plugin-more-menu`, 9498 ...toggleProps 9499 }); 9500 }, 9501 role: "menuitemcheckbox", 9502 selectedIcon: library_check, 9503 name: target, 9504 scope: scope, 9505 ...props 9506 }); 9507 } 9508 9509 ;// CONCATENATED MODULE: ./node_modules/@wordpress/interface/build-module/components/pinned-items/index.js 9510 /** 9511 * External dependencies 9512 */ 9513 9514 9515 /** 9516 * WordPress dependencies 9517 */ 9518 9519 9520 function PinnedItems({ 9521 scope, 9522 ...props 9523 }) { 9524 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Fill, { 9525 name: `PinnedItems/$scope}`, 9526 ...props 9527 }); 9528 } 9529 function PinnedItemsSlot({ 9530 scope, 9531 className, 9532 ...props 9533 }) { 9534 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Slot, { 9535 name: `PinnedItems/$scope}`, 9536 ...props, 9537 children: fills => fills?.length > 0 && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 9538 className: dist_clsx(className, 'interface-pinned-items'), 9539 children: fills 9540 }) 9541 }); 9542 } 9543 PinnedItems.Slot = PinnedItemsSlot; 9544 /* harmony default export */ const pinned_items = (PinnedItems); 9545 9546 ;// CONCATENATED MODULE: ./node_modules/@wordpress/interface/build-module/components/complementary-area/index.js 9547 /** 9548 * External dependencies 9549 */ 9550 9551 9552 /** 9553 * WordPress dependencies 9554 */ 9555 9556 9557 9558 9559 9560 9561 9562 9563 9564 /** 9565 * Internal dependencies 9566 */ 9567 9568 9569 9570 9571 9572 9573 9574 9575 9576 const ANIMATION_DURATION = 0.3; 9577 function ComplementaryAreaSlot({ 9578 scope, 9579 ...props 9580 }) { 9581 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Slot, { 9582 name: `ComplementaryArea/$scope}`, 9583 ...props 9584 }); 9585 } 9586 const SIDEBAR_WIDTH = 280; 9587 const variants = { 9588 open: { 9589 width: SIDEBAR_WIDTH 9590 }, 9591 closed: { 9592 width: 0 9593 }, 9594 mobileOpen: { 9595 width: '100vw' 9596 } 9597 }; 9598 function ComplementaryAreaFill({ 9599 activeArea, 9600 isActive, 9601 scope, 9602 children, 9603 className, 9604 id 9605 }) { 9606 const disableMotion = (0,external_wp_compose_namespaceObject.useReducedMotion)(); 9607 const isMobileViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium', '<'); 9608 // This is used to delay the exit animation to the next tick. 9609 // The reason this is done is to allow us to apply the right transition properties 9610 // When we switch from an open sidebar to another open sidebar. 9611 // we don't want to animate in this case. 9612 const previousActiveArea = (0,external_wp_compose_namespaceObject.usePrevious)(activeArea); 9613 const previousIsActive = (0,external_wp_compose_namespaceObject.usePrevious)(isActive); 9614 const [, setState] = (0,external_wp_element_namespaceObject.useState)({}); 9615 (0,external_wp_element_namespaceObject.useEffect)(() => { 9616 setState({}); 9617 }, [isActive]); 9618 const transition = { 9619 type: 'tween', 9620 duration: disableMotion || isMobileViewport || !!previousActiveArea && !!activeArea && activeArea !== previousActiveArea ? 0 : ANIMATION_DURATION, 9621 ease: [0.6, 0, 0.4, 1] 9622 }; 9623 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Fill, { 9624 name: `ComplementaryArea/$scope}`, 9625 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__unstableAnimatePresence, { 9626 initial: false, 9627 children: (previousIsActive || isActive) && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__unstableMotion.div, { 9628 variants: variants, 9629 initial: "closed", 9630 animate: isMobileViewport ? 'mobileOpen' : 'open', 9631 exit: "closed", 9632 transition: transition, 9633 className: "interface-complementary-area__fill", 9634 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 9635 id: id, 9636 className: className, 9637 style: { 9638 width: isMobileViewport ? '100vw' : SIDEBAR_WIDTH 9639 }, 9640 children: children 9641 }) 9642 }) 9643 }) 9644 }); 9645 } 9646 function useAdjustComplementaryListener(scope, identifier, activeArea, isActive, isSmall) { 9647 const previousIsSmallRef = (0,external_wp_element_namespaceObject.useRef)(false); 9648 const shouldOpenWhenNotSmallRef = (0,external_wp_element_namespaceObject.useRef)(false); 9649 const { 9650 enableComplementaryArea, 9651 disableComplementaryArea 9652 } = (0,external_wp_data_namespaceObject.useDispatch)(store); 9653 (0,external_wp_element_namespaceObject.useEffect)(() => { 9654 // If the complementary area is active and the editor is switching from 9655 // a big to a small window size. 9656 if (isActive && isSmall && !previousIsSmallRef.current) { 9657 disableComplementaryArea(scope); 9658 // Flag the complementary area to be reopened when the window size 9659 // goes from small to big. 9660 shouldOpenWhenNotSmallRef.current = true; 9661 } else if ( 9662 // If there is a flag indicating the complementary area should be 9663 // enabled when we go from small to big window size and we are going 9664 // from a small to big window size. 9665 shouldOpenWhenNotSmallRef.current && !isSmall && previousIsSmallRef.current) { 9666 // Remove the flag indicating the complementary area should be 9667 // enabled. 9668 shouldOpenWhenNotSmallRef.current = false; 9669 enableComplementaryArea(scope, identifier); 9670 } else if ( 9671 // If the flag is indicating the current complementary should be 9672 // reopened but another complementary area becomes active, remove 9673 // the flag. 9674 shouldOpenWhenNotSmallRef.current && activeArea && activeArea !== identifier) { 9675 shouldOpenWhenNotSmallRef.current = false; 9676 } 9677 if (isSmall !== previousIsSmallRef.current) { 9678 previousIsSmallRef.current = isSmall; 9679 } 9680 }, [isActive, isSmall, scope, identifier, activeArea, disableComplementaryArea, enableComplementaryArea]); 9681 } 9682 function ComplementaryArea({ 9683 children, 9684 className, 9685 closeLabel = (0,external_wp_i18n_namespaceObject.__)('Close plugin'), 9686 identifier, 9687 header, 9688 headerClassName, 9689 icon, 9690 isPinnable = true, 9691 panelClassName, 9692 scope, 9693 name, 9694 smallScreenTitle, 9695 title, 9696 toggleShortcut, 9697 isActiveByDefault 9698 }) { 9699 // This state is used to delay the rendering of the Fill 9700 // until the initial effect runs. 9701 // This prevents the animation from running on mount if 9702 // the complementary area is active by default. 9703 const [isReady, setIsReady] = (0,external_wp_element_namespaceObject.useState)(false); 9704 const { 9705 isLoading, 9706 isActive, 9707 isPinned, 9708 activeArea, 9709 isSmall, 9710 isLarge, 9711 showIconLabels 9712 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 9713 const { 9714 getActiveComplementaryArea, 9715 isComplementaryAreaLoading, 9716 isItemPinned 9717 } = select(store); 9718 const { 9719 get 9720 } = select(external_wp_preferences_namespaceObject.store); 9721 const _activeArea = getActiveComplementaryArea(scope); 9722 return { 9723 isLoading: isComplementaryAreaLoading(scope), 9724 isActive: _activeArea === identifier, 9725 isPinned: isItemPinned(scope, identifier), 9726 activeArea: _activeArea, 9727 isSmall: select(external_wp_viewport_namespaceObject.store).isViewportMatch('< medium'), 9728 isLarge: select(external_wp_viewport_namespaceObject.store).isViewportMatch('large'), 9729 showIconLabels: get('core', 'showIconLabels') 9730 }; 9731 }, [identifier, scope]); 9732 useAdjustComplementaryListener(scope, identifier, activeArea, isActive, isSmall); 9733 const { 9734 enableComplementaryArea, 9735 disableComplementaryArea, 9736 pinItem, 9737 unpinItem 9738 } = (0,external_wp_data_namespaceObject.useDispatch)(store); 9739 (0,external_wp_element_namespaceObject.useEffect)(() => { 9740 // Set initial visibility: For large screens, enable if it's active by 9741 // default. For small screens, always initially disable. 9742 if (isActiveByDefault && activeArea === undefined && !isSmall) { 9743 enableComplementaryArea(scope, identifier); 9744 } else if (activeArea === undefined && isSmall) { 9745 disableComplementaryArea(scope, identifier); 9746 } 9747 setIsReady(true); 9748 }, [activeArea, isActiveByDefault, scope, identifier, isSmall, enableComplementaryArea, disableComplementaryArea]); 9749 if (!isReady) { 9750 return; 9751 } 9752 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 9753 children: [isPinnable && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(pinned_items, { 9754 scope: scope, 9755 children: isPinned && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(complementary_area_toggle, { 9756 scope: scope, 9757 identifier: identifier, 9758 isPressed: isActive && (!showIconLabels || isLarge), 9759 "aria-expanded": isActive, 9760 "aria-disabled": isLoading, 9761 label: title, 9762 icon: showIconLabels ? library_check : icon, 9763 showTooltip: !showIconLabels, 9764 variant: showIconLabels ? 'tertiary' : undefined, 9765 size: "compact", 9766 shortcut: toggleShortcut 9767 }) 9768 }), name && isPinnable && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ComplementaryAreaMoreMenuItem, { 9769 target: name, 9770 scope: scope, 9771 icon: icon, 9772 children: title 9773 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(ComplementaryAreaFill, { 9774 activeArea: activeArea, 9775 isActive: isActive, 9776 className: dist_clsx('interface-complementary-area', className), 9777 scope: scope, 9778 id: identifier.replace('/', ':'), 9779 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(complementary_area_header, { 9780 className: headerClassName, 9781 closeLabel: closeLabel, 9782 onClose: () => disableComplementaryArea(scope), 9783 smallScreenTitle: smallScreenTitle, 9784 toggleButtonProps: { 9785 label: closeLabel, 9786 size: 'small', 9787 shortcut: toggleShortcut, 9788 scope, 9789 identifier 9790 }, 9791 children: header || /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 9792 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("h2", { 9793 className: "interface-complementary-area-header__title", 9794 children: title 9795 }), isPinnable && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 9796 className: "interface-complementary-area__pin-unpin-item", 9797 icon: isPinned ? star_filled : star_empty, 9798 label: isPinned ? (0,external_wp_i18n_namespaceObject.__)('Unpin from toolbar') : (0,external_wp_i18n_namespaceObject.__)('Pin to toolbar'), 9799 onClick: () => (isPinned ? unpinItem : pinItem)(scope, identifier), 9800 isPressed: isPinned, 9801 "aria-expanded": isPinned, 9802 size: "compact" 9803 })] 9804 }) 9805 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Panel, { 9806 className: panelClassName, 9807 children: children 9808 })] 9809 })] 9810 }); 9811 } 9812 const ComplementaryAreaWrapped = complementary_area_context(ComplementaryArea); 9813 ComplementaryAreaWrapped.Slot = ComplementaryAreaSlot; 9814 /* harmony default export */ const complementary_area = (ComplementaryAreaWrapped); 9815 9816 ;// CONCATENATED MODULE: ./node_modules/@wordpress/interface/build-module/components/fullscreen-mode/index.js 9817 /** 9818 * WordPress dependencies 9819 */ 9820 9821 const FullscreenMode = ({ 9822 isActive 9823 }) => { 9824 (0,external_wp_element_namespaceObject.useEffect)(() => { 9825 let isSticky = false; 9826 // `is-fullscreen-mode` is set in PHP as a body class by Gutenberg, and this causes 9827 // `sticky-menu` to be applied by WordPress and prevents the admin menu being scrolled 9828 // even if `is-fullscreen-mode` is then removed. Let's remove `sticky-menu` here as 9829 // a consequence of the FullscreenMode setup. 9830 if (document.body.classList.contains('sticky-menu')) { 9831 isSticky = true; 9832 document.body.classList.remove('sticky-menu'); 9833 } 9834 return () => { 9835 if (isSticky) { 9836 document.body.classList.add('sticky-menu'); 9837 } 9838 }; 9839 }, []); 9840 (0,external_wp_element_namespaceObject.useEffect)(() => { 9841 if (isActive) { 9842 document.body.classList.add('is-fullscreen-mode'); 9843 } else { 9844 document.body.classList.remove('is-fullscreen-mode'); 9845 } 9846 return () => { 9847 if (isActive) { 9848 document.body.classList.remove('is-fullscreen-mode'); 9849 } 9850 }; 9851 }, [isActive]); 9852 return null; 9853 }; 9854 /* harmony default export */ const fullscreen_mode = (FullscreenMode); 9855 9856 ;// CONCATENATED MODULE: ./node_modules/@wordpress/interface/build-module/components/navigable-region/index.js 9857 /** 9858 * WordPress dependencies 9859 */ 9860 9861 9862 /** 9863 * External dependencies 9864 */ 9865 9866 9867 const NavigableRegion = (0,external_wp_element_namespaceObject.forwardRef)(({ 9868 children, 9869 className, 9870 ariaLabel, 9871 as: Tag = 'div', 9872 ...props 9873 }, ref) => { 9874 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(Tag, { 9875 ref: ref, 9876 className: dist_clsx('interface-navigable-region', className), 9877 "aria-label": ariaLabel, 9878 role: "region", 9879 tabIndex: "-1", 9880 ...props, 9881 children: children 9882 }); 9883 }); 9884 NavigableRegion.displayName = 'NavigableRegion'; 9885 /* harmony default export */ const navigable_region = (NavigableRegion); 9886 9887 ;// CONCATENATED MODULE: ./node_modules/@wordpress/interface/build-module/components/interface-skeleton/index.js 9888 /** 9889 * External dependencies 9890 */ 9891 9892 9893 /** 9894 * WordPress dependencies 9895 */ 9896 9897 9898 9899 9900 9901 /** 9902 * Internal dependencies 9903 */ 9904 9905 9906 9907 const interface_skeleton_ANIMATION_DURATION = 0.25; 9908 const commonTransition = { 9909 type: 'tween', 9910 duration: interface_skeleton_ANIMATION_DURATION, 9911 ease: [0.6, 0, 0.4, 1] 9912 }; 9913 function useHTMLClass(className) { 9914 (0,external_wp_element_namespaceObject.useEffect)(() => { 9915 const element = document && document.querySelector(`html:not(.$className})`); 9916 if (!element) { 9917 return; 9918 } 9919 element.classList.toggle(className); 9920 return () => { 9921 element.classList.toggle(className); 9922 }; 9923 }, [className]); 9924 } 9925 const headerVariants = { 9926 hidden: { 9927 opacity: 1, 9928 marginTop: -60 9929 }, 9930 visible: { 9931 opacity: 1, 9932 marginTop: 0 9933 }, 9934 distractionFreeHover: { 9935 opacity: 1, 9936 marginTop: 0, 9937 transition: { 9938 ...commonTransition, 9939 delay: 0.2, 9940 delayChildren: 0.2 9941 } 9942 }, 9943 distractionFreeHidden: { 9944 opacity: 0, 9945 marginTop: -60 9946 }, 9947 distractionFreeDisabled: { 9948 opacity: 0, 9949 marginTop: 0, 9950 transition: { 9951 ...commonTransition, 9952 delay: 0.8, 9953 delayChildren: 0.8 9954 } 9955 } 9956 }; 9957 function InterfaceSkeleton({ 9958 isDistractionFree, 9959 footer, 9960 header, 9961 editorNotices, 9962 sidebar, 9963 secondarySidebar, 9964 content, 9965 actions, 9966 labels, 9967 className 9968 }, ref) { 9969 const [secondarySidebarResizeListener, secondarySidebarSize] = (0,external_wp_compose_namespaceObject.useResizeObserver)(); 9970 const isMobileViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium', '<'); 9971 const disableMotion = (0,external_wp_compose_namespaceObject.useReducedMotion)(); 9972 const defaultTransition = { 9973 type: 'tween', 9974 duration: disableMotion ? 0 : interface_skeleton_ANIMATION_DURATION, 9975 ease: [0.6, 0, 0.4, 1] 9976 }; 9977 useHTMLClass('interface-interface-skeleton__html-container'); 9978 const defaultLabels = { 9979 /* translators: accessibility text for the top bar landmark region. */ 9980 header: (0,external_wp_i18n_namespaceObject._x)('Header', 'header landmark area'), 9981 /* translators: accessibility text for the content landmark region. */ 9982 body: (0,external_wp_i18n_namespaceObject.__)('Content'), 9983 /* translators: accessibility text for the secondary sidebar landmark region. */ 9984 secondarySidebar: (0,external_wp_i18n_namespaceObject.__)('Block Library'), 9985 /* translators: accessibility text for the settings landmark region. */ 9986 sidebar: (0,external_wp_i18n_namespaceObject._x)('Settings', 'settings landmark area'), 9987 /* translators: accessibility text for the publish landmark region. */ 9988 actions: (0,external_wp_i18n_namespaceObject.__)('Publish'), 9989 /* translators: accessibility text for the footer landmark region. */ 9990 footer: (0,external_wp_i18n_namespaceObject.__)('Footer') 9991 }; 9992 const mergedLabels = { 9993 ...defaultLabels, 9994 ...labels 9995 }; 9996 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 9997 ref: ref, 9998 className: dist_clsx(className, 'interface-interface-skeleton', !!footer && 'has-footer'), 9999 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 10000 className: "interface-interface-skeleton__editor", 10001 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__unstableAnimatePresence, { 10002 initial: false, 10003 children: !!header && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(navigable_region, { 10004 as: external_wp_components_namespaceObject.__unstableMotion.div, 10005 className: "interface-interface-skeleton__header", 10006 "aria-label": mergedLabels.header, 10007 initial: isDistractionFree && !isMobileViewport ? 'distractionFreeHidden' : 'hidden', 10008 whileHover: isDistractionFree && !isMobileViewport ? 'distractionFreeHover' : 'visible', 10009 animate: isDistractionFree && !isMobileViewport ? 'distractionFreeDisabled' : 'visible', 10010 exit: isDistractionFree && !isMobileViewport ? 'distractionFreeHidden' : 'hidden', 10011 variants: headerVariants, 10012 transition: defaultTransition, 10013 children: header 10014 }) 10015 }), isDistractionFree && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 10016 className: "interface-interface-skeleton__header", 10017 children: editorNotices 10018 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 10019 className: "interface-interface-skeleton__body", 10020 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__unstableAnimatePresence, { 10021 initial: false, 10022 children: !!secondarySidebar && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(navigable_region, { 10023 className: "interface-interface-skeleton__secondary-sidebar", 10024 ariaLabel: mergedLabels.secondarySidebar, 10025 as: external_wp_components_namespaceObject.__unstableMotion.div, 10026 initial: "closed", 10027 animate: "open", 10028 exit: "closed", 10029 variants: { 10030 open: { 10031 width: secondarySidebarSize.width 10032 }, 10033 closed: { 10034 width: 0 10035 } 10036 }, 10037 transition: defaultTransition, 10038 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__unstableMotion.div, { 10039 style: { 10040 position: 'absolute', 10041 width: isMobileViewport ? '100vw' : 'fit-content', 10042 height: '100%', 10043 left: 0 10044 }, 10045 variants: { 10046 open: { 10047 x: 0 10048 }, 10049 closed: { 10050 x: '-100%' 10051 } 10052 }, 10053 transition: defaultTransition, 10054 children: [secondarySidebarResizeListener, secondarySidebar] 10055 }) 10056 }) 10057 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(navigable_region, { 10058 className: "interface-interface-skeleton__content", 10059 ariaLabel: mergedLabels.body, 10060 children: content 10061 }), !!sidebar && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(navigable_region, { 10062 className: "interface-interface-skeleton__sidebar", 10063 ariaLabel: mergedLabels.sidebar, 10064 children: sidebar 10065 }), !!actions && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(navigable_region, { 10066 className: "interface-interface-skeleton__actions", 10067 ariaLabel: mergedLabels.actions, 10068 children: actions 10069 })] 10070 })] 10071 }), !!footer && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(navigable_region, { 10072 className: "interface-interface-skeleton__footer", 10073 ariaLabel: mergedLabels.footer, 10074 children: footer 10075 })] 10076 }); 10077 } 10078 /* harmony default export */ const interface_skeleton = ((0,external_wp_element_namespaceObject.forwardRef)(InterfaceSkeleton)); 10079 10080 ;// CONCATENATED MODULE: ./node_modules/@wordpress/interface/build-module/components/index.js 10081 10082 10083 10084 10085 10086 10087 10088 10089 ;// CONCATENATED MODULE: ./node_modules/@wordpress/interface/build-module/index.js 10090 10091 10092 10093 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/global-keyboard-shortcuts/index.js 10094 /** 10095 * WordPress dependencies 10096 */ 10097 10098 10099 10100 10101 10102 /** 10103 * Internal dependencies 10104 */ 10105 10106 10107 /** 10108 * Handles the keyboard shortcuts for the editor. 10109 * 10110 * It provides functionality for various keyboard shortcuts such as toggling editor mode, 10111 * toggling distraction-free mode, undo/redo, saving the post, toggling list view, 10112 * and toggling the sidebar. 10113 */ 10114 function EditorKeyboardShortcuts() { 10115 const isModeToggleDisabled = (0,external_wp_data_namespaceObject.useSelect)(select => { 10116 const { 10117 richEditingEnabled, 10118 codeEditingEnabled 10119 } = select(store_store).getEditorSettings(); 10120 return !richEditingEnabled || !codeEditingEnabled; 10121 }, []); 10122 const { 10123 getBlockSelectionStart 10124 } = (0,external_wp_data_namespaceObject.useSelect)(external_wp_blockEditor_namespaceObject.store); 10125 const { 10126 getActiveComplementaryArea 10127 } = (0,external_wp_data_namespaceObject.useSelect)(store); 10128 const { 10129 enableComplementaryArea, 10130 disableComplementaryArea 10131 } = (0,external_wp_data_namespaceObject.useDispatch)(store); 10132 const { 10133 redo, 10134 undo, 10135 savePost, 10136 setIsListViewOpened, 10137 switchEditorMode, 10138 toggleDistractionFree 10139 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 10140 const { 10141 isEditedPostDirty, 10142 isPostSavingLocked, 10143 isListViewOpened, 10144 getEditorMode 10145 } = (0,external_wp_data_namespaceObject.useSelect)(store_store); 10146 (0,external_wp_keyboardShortcuts_namespaceObject.useShortcut)('core/editor/toggle-mode', () => { 10147 switchEditorMode(getEditorMode() === 'visual' ? 'text' : 'visual'); 10148 }, { 10149 isDisabled: isModeToggleDisabled 10150 }); 10151 (0,external_wp_keyboardShortcuts_namespaceObject.useShortcut)('core/editor/toggle-distraction-free', () => { 10152 toggleDistractionFree(); 10153 }); 10154 (0,external_wp_keyboardShortcuts_namespaceObject.useShortcut)('core/editor/undo', event => { 10155 undo(); 10156 event.preventDefault(); 10157 }); 10158 (0,external_wp_keyboardShortcuts_namespaceObject.useShortcut)('core/editor/redo', event => { 10159 redo(); 10160 event.preventDefault(); 10161 }); 10162 (0,external_wp_keyboardShortcuts_namespaceObject.useShortcut)('core/editor/save', event => { 10163 event.preventDefault(); 10164 10165 /** 10166 * Do not save the post if post saving is locked. 10167 */ 10168 if (isPostSavingLocked()) { 10169 return; 10170 } 10171 10172 // TODO: This should be handled in the `savePost` effect in 10173 // considering `isSaveable`. See note on `isEditedPostSaveable` 10174 // selector about dirtiness and meta-boxes. 10175 // 10176 // See: `isEditedPostSaveable` 10177 if (!isEditedPostDirty()) { 10178 return; 10179 } 10180 savePost(); 10181 }); 10182 10183 // Only opens the list view. Other functionality for this shortcut happens in the rendered sidebar. 10184 (0,external_wp_keyboardShortcuts_namespaceObject.useShortcut)('core/editor/toggle-list-view', event => { 10185 if (!isListViewOpened()) { 10186 event.preventDefault(); 10187 setIsListViewOpened(true); 10188 } 10189 }); 10190 (0,external_wp_keyboardShortcuts_namespaceObject.useShortcut)('core/editor/toggle-sidebar', event => { 10191 // This shortcut has no known clashes, but use preventDefault to prevent any 10192 // obscure shortcuts from triggering. 10193 event.preventDefault(); 10194 const isEditorSidebarOpened = ['edit-post/document', 'edit-post/block'].includes(getActiveComplementaryArea('core')); 10195 if (isEditorSidebarOpened) { 10196 disableComplementaryArea('core'); 10197 } else { 10198 const sidebarToOpen = getBlockSelectionStart() ? 'edit-post/block' : 'edit-post/document'; 10199 enableComplementaryArea('core', sidebarToOpen); 10200 } 10201 }); 10202 return null; 10203 } 10204 10205 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/autocompleters/index.js 10206 10207 10208 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/autosave-monitor/index.js 10209 /** 10210 * WordPress dependencies 10211 */ 10212 10213 10214 10215 10216 10217 /** 10218 * Internal dependencies 10219 */ 10220 10221 class AutosaveMonitor extends external_wp_element_namespaceObject.Component { 10222 constructor(props) { 10223 super(props); 10224 this.needsAutosave = !!(props.isDirty && props.isAutosaveable); 10225 } 10226 componentDidMount() { 10227 if (!this.props.disableIntervalChecks) { 10228 this.setAutosaveTimer(); 10229 } 10230 } 10231 componentDidUpdate(prevProps) { 10232 if (this.props.disableIntervalChecks) { 10233 if (this.props.editsReference !== prevProps.editsReference) { 10234 this.props.autosave(); 10235 } 10236 return; 10237 } 10238 if (this.props.interval !== prevProps.interval) { 10239 clearTimeout(this.timerId); 10240 this.setAutosaveTimer(); 10241 } 10242 if (!this.props.isDirty) { 10243 this.needsAutosave = false; 10244 return; 10245 } 10246 if (this.props.isAutosaving && !prevProps.isAutosaving) { 10247 this.needsAutosave = false; 10248 return; 10249 } 10250 if (this.props.editsReference !== prevProps.editsReference) { 10251 this.needsAutosave = true; 10252 } 10253 } 10254 componentWillUnmount() { 10255 clearTimeout(this.timerId); 10256 } 10257 setAutosaveTimer(timeout = this.props.interval * 1000) { 10258 this.timerId = setTimeout(() => { 10259 this.autosaveTimerHandler(); 10260 }, timeout); 10261 } 10262 autosaveTimerHandler() { 10263 if (!this.props.isAutosaveable) { 10264 this.setAutosaveTimer(1000); 10265 return; 10266 } 10267 if (this.needsAutosave) { 10268 this.needsAutosave = false; 10269 this.props.autosave(); 10270 } 10271 this.setAutosaveTimer(); 10272 } 10273 render() { 10274 return null; 10275 } 10276 } 10277 10278 /** 10279 * Monitors the changes made to the edited post and triggers autosave if necessary. 10280 * 10281 * The logic is straightforward: a check is performed every `props.interval` seconds. If any changes are detected, `props.autosave()` is called. 10282 * The time between the change and the autosave varies but is no larger than `props.interval` seconds. Refer to the code below for more details, such as 10283 * the specific way of detecting changes. 10284 * 10285 * There are two caveats: 10286 * * If `props.isAutosaveable` happens to be false at a time of checking for changes, the check is retried every second. 10287 * * The timer may be disabled by setting `props.disableIntervalChecks` to `true`. In that mode, any change will immediately trigger `props.autosave()`. 10288 * 10289 * @param {Object} props - The properties passed to the component. 10290 * @param {Function} props.autosave - The function to call when changes need to be saved. 10291 * @param {number} props.interval - The maximum time in seconds between an unsaved change and an autosave. 10292 * @param {boolean} props.isAutosaveable - If false, the check for changes is retried every second. 10293 * @param {boolean} props.disableIntervalChecks - If true, disables the timer and any change will immediately trigger `props.autosave()`. 10294 * @param {boolean} props.isDirty - Indicates if there are unsaved changes. 10295 * 10296 * @example 10297 * ```jsx 10298 * <AutosaveMonitor interval={30000} /> 10299 * ``` 10300 */ 10301 /* harmony default export */ const autosave_monitor = ((0,external_wp_compose_namespaceObject.compose)([(0,external_wp_data_namespaceObject.withSelect)((select, ownProps) => { 10302 const { 10303 getReferenceByDistinctEdits 10304 } = select(external_wp_coreData_namespaceObject.store); 10305 const { 10306 isEditedPostDirty, 10307 isEditedPostAutosaveable, 10308 isAutosavingPost, 10309 getEditorSettings 10310 } = select(store_store); 10311 const { 10312 interval = getEditorSettings().autosaveInterval 10313 } = ownProps; 10314 return { 10315 editsReference: getReferenceByDistinctEdits(), 10316 isDirty: isEditedPostDirty(), 10317 isAutosaveable: isEditedPostAutosaveable(), 10318 isAutosaving: isAutosavingPost(), 10319 interval 10320 }; 10321 }), (0,external_wp_data_namespaceObject.withDispatch)((dispatch, ownProps) => ({ 10322 autosave() { 10323 const { 10324 autosave = dispatch(store_store).autosave 10325 } = ownProps; 10326 autosave(); 10327 } 10328 }))])(AutosaveMonitor)); 10329 10330 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/chevron-right-small.js 10331 /** 10332 * WordPress dependencies 10333 */ 10334 10335 10336 const chevronRightSmall = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 10337 xmlns: "http://www.w3.org/2000/svg", 10338 viewBox: "0 0 24 24", 10339 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 10340 d: "M10.8622 8.04053L14.2805 12.0286L10.8622 16.0167L9.72327 15.0405L12.3049 12.0286L9.72327 9.01672L10.8622 8.04053Z" 10341 }) 10342 }); 10343 /* harmony default export */ const chevron_right_small = (chevronRightSmall); 10344 10345 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/chevron-left-small.js 10346 /** 10347 * WordPress dependencies 10348 */ 10349 10350 10351 const chevronLeftSmall = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 10352 xmlns: "http://www.w3.org/2000/svg", 10353 viewBox: "0 0 24 24", 10354 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 10355 d: "m13.1 16-3.4-4 3.4-4 1.1 1-2.6 3 2.6 3-1.1 1z" 10356 }) 10357 }); 10358 /* harmony default export */ const chevron_left_small = (chevronLeftSmall); 10359 10360 ;// CONCATENATED MODULE: external ["wp","keycodes"] 10361 const external_wp_keycodes_namespaceObject = window["wp"]["keycodes"]; 10362 ;// CONCATENATED MODULE: external ["wp","commands"] 10363 const external_wp_commands_namespaceObject = window["wp"]["commands"]; 10364 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/document-bar/index.js 10365 /** 10366 * External dependencies 10367 */ 10368 10369 10370 /** 10371 * WordPress dependencies 10372 */ 10373 10374 10375 10376 10377 10378 10379 10380 10381 10382 10383 10384 10385 /** 10386 * Internal dependencies 10387 */ 10388 10389 10390 10391 /** @typedef {import("@wordpress/components").IconType} IconType */ 10392 10393 10394 const MotionButton = (0,external_wp_components_namespaceObject.__unstableMotion)(external_wp_components_namespaceObject.Button); 10395 10396 /** 10397 * This component renders a navigation bar at the top of the editor. It displays the title of the current document, 10398 * a back button (if applicable), and a command center button. It also handles different states of the document, 10399 * such as "not found" or "unsynced". 10400 * 10401 * @example 10402 * ```jsx 10403 * <DocumentBar /> 10404 * ``` 10405 * @param {Object} props The component props. 10406 * @param {string} props.title A title for the document, defaulting to the document or 10407 * template title currently being edited. 10408 * @param {IconType} props.icon An icon for the document, no default. 10409 * (A default icon indicating the document post type is no longer used.) 10410 * 10411 * @return {JSX.Element} The rendered DocumentBar component. 10412 */ 10413 function DocumentBar(props) { 10414 const { 10415 postType, 10416 postTypeLabel, 10417 documentTitle, 10418 isNotFound, 10419 isUnsyncedPattern, 10420 templateTitle, 10421 onNavigateToPreviousEntityRecord 10422 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 10423 const { 10424 getCurrentPostType, 10425 getCurrentPostId, 10426 getEditorSettings, 10427 __experimentalGetTemplateInfo: getTemplateInfo 10428 } = select(store_store); 10429 const { 10430 getEditedEntityRecord, 10431 getPostType, 10432 isResolving: isResolvingSelector 10433 } = select(external_wp_coreData_namespaceObject.store); 10434 const _postType = getCurrentPostType(); 10435 const _postId = getCurrentPostId(); 10436 const _document = getEditedEntityRecord('postType', _postType, _postId); 10437 const _templateInfo = getTemplateInfo(_document); 10438 const _postTypeLabel = getPostType(_postType)?.labels?.singular_name; 10439 return { 10440 postType: _postType, 10441 postTypeLabel: _postTypeLabel, 10442 documentTitle: _document.title, 10443 isNotFound: !_document && !isResolvingSelector('getEditedEntityRecord', 'postType', _postType, _postId), 10444 isUnsyncedPattern: _document?.wp_pattern_sync_status === 'unsynced', 10445 templateTitle: _templateInfo.title, 10446 onNavigateToPreviousEntityRecord: getEditorSettings().onNavigateToPreviousEntityRecord 10447 }; 10448 }, []); 10449 const { 10450 open: openCommandCenter 10451 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_commands_namespaceObject.store); 10452 const isReducedMotion = (0,external_wp_compose_namespaceObject.useReducedMotion)(); 10453 const isTemplate = TEMPLATE_POST_TYPES.includes(postType); 10454 const isGlobalEntity = GLOBAL_POST_TYPES.includes(postType); 10455 const hasBackButton = !!onNavigateToPreviousEntityRecord; 10456 const entityTitle = isTemplate ? templateTitle : documentTitle; 10457 const title = props.title || entityTitle; 10458 const icon = props.icon; 10459 const mountedRef = (0,external_wp_element_namespaceObject.useRef)(false); 10460 (0,external_wp_element_namespaceObject.useEffect)(() => { 10461 mountedRef.current = true; 10462 }, []); 10463 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 10464 className: dist_clsx('editor-document-bar', { 10465 'has-back-button': hasBackButton, 10466 'is-global': isGlobalEntity && !isUnsyncedPattern 10467 }), 10468 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__unstableAnimatePresence, { 10469 children: hasBackButton && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(MotionButton, { 10470 className: "editor-document-bar__back", 10471 icon: (0,external_wp_i18n_namespaceObject.isRTL)() ? chevron_right_small : chevron_left_small, 10472 onClick: event => { 10473 event.stopPropagation(); 10474 onNavigateToPreviousEntityRecord(); 10475 }, 10476 size: "compact", 10477 initial: mountedRef.current ? { 10478 opacity: 0, 10479 transform: 'translateX(15%)' 10480 } : false // Don't show entry animation when DocumentBar mounts. 10481 , 10482 animate: { 10483 opacity: 1, 10484 transform: 'translateX(0%)' 10485 }, 10486 exit: { 10487 opacity: 0, 10488 transform: 'translateX(15%)' 10489 }, 10490 transition: isReducedMotion ? { 10491 duration: 0 10492 } : undefined, 10493 children: (0,external_wp_i18n_namespaceObject.__)('Back') 10494 }) 10495 }), isNotFound ? /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { 10496 children: (0,external_wp_i18n_namespaceObject.__)('Document not found') 10497 }) : /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.Button, { 10498 className: "editor-document-bar__command", 10499 onClick: () => openCommandCenter(), 10500 size: "compact", 10501 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__unstableMotion.div, { 10502 className: "editor-document-bar__title" 10503 // Force entry animation when the back button is added or removed. 10504 , 10505 10506 initial: mountedRef.current ? { 10507 opacity: 0, 10508 transform: hasBackButton ? 'translateX(15%)' : 'translateX(-15%)' 10509 } : false // Don't show entry animation when DocumentBar mounts. 10510 , 10511 animate: { 10512 opacity: 1, 10513 transform: 'translateX(0%)' 10514 }, 10515 transition: isReducedMotion ? { 10516 duration: 0 10517 } : undefined, 10518 children: [icon && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.BlockIcon, { 10519 icon: icon 10520 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalText, { 10521 size: "body", 10522 as: "h1", 10523 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 10524 className: "editor-document-bar__post-title", 10525 children: title ? (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(title) : (0,external_wp_i18n_namespaceObject.__)('No title') 10526 }), postTypeLabel && !props.title && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 10527 className: "editor-document-bar__post-type-label", 10528 children: '· ' + (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(postTypeLabel) 10529 })] 10530 })] 10531 }, hasBackButton), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 10532 className: "editor-document-bar__shortcut", 10533 children: external_wp_keycodes_namespaceObject.displayShortcut.primary('k') 10534 })] 10535 })] 10536 }); 10537 } 10538 10539 ;// CONCATENATED MODULE: external ["wp","richText"] 10540 const external_wp_richText_namespaceObject = window["wp"]["richText"]; 10541 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/document-outline/item.js 10542 /** 10543 * External dependencies 10544 */ 10545 10546 10547 10548 const TableOfContentsItem = ({ 10549 children, 10550 isValid, 10551 level, 10552 href, 10553 onSelect 10554 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("li", { 10555 className: dist_clsx('document-outline__item', `is-$level.toLowerCase()}`, { 10556 'is-invalid': !isValid 10557 }), 10558 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("a", { 10559 href: href, 10560 className: "document-outline__button", 10561 onClick: onSelect, 10562 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 10563 className: "document-outline__emdash", 10564 "aria-hidden": "true" 10565 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("strong", { 10566 className: "document-outline__level", 10567 children: level 10568 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 10569 className: "document-outline__item-content", 10570 children: children 10571 })] 10572 }) 10573 }); 10574 /* harmony default export */ const document_outline_item = (TableOfContentsItem); 10575 10576 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/document-outline/index.js 10577 /** 10578 * WordPress dependencies 10579 */ 10580 10581 10582 10583 10584 10585 10586 10587 /** 10588 * Internal dependencies 10589 */ 10590 10591 10592 10593 /** 10594 * Module constants 10595 */ 10596 10597 10598 const emptyHeadingContent = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("em", { 10599 children: (0,external_wp_i18n_namespaceObject.__)('(Empty heading)') 10600 }); 10601 const incorrectLevelContent = [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("br", {}, "incorrect-break"), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("em", { 10602 children: (0,external_wp_i18n_namespaceObject.__)('(Incorrect heading level)') 10603 }, "incorrect-message")]; 10604 const singleH1Headings = [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("br", {}, "incorrect-break-h1"), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("em", { 10605 children: (0,external_wp_i18n_namespaceObject.__)('(Your theme may already use a H1 for the post title)') 10606 }, "incorrect-message-h1")]; 10607 const multipleH1Headings = [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("br", {}, "incorrect-break-multiple-h1"), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("em", { 10608 children: (0,external_wp_i18n_namespaceObject.__)('(Multiple H1 headings are not recommended)') 10609 }, "incorrect-message-multiple-h1")]; 10610 function EmptyOutlineIllustration() { 10611 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.SVG, { 10612 width: "138", 10613 height: "148", 10614 viewBox: "0 0 138 148", 10615 fill: "none", 10616 xmlns: "http://www.w3.org/2000/svg", 10617 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Rect, { 10618 width: "138", 10619 height: "148", 10620 rx: "4", 10621 fill: "#F0F6FC" 10622 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Line, { 10623 x1: "44", 10624 y1: "28", 10625 x2: "24", 10626 y2: "28", 10627 stroke: "#DDDDDD" 10628 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Rect, { 10629 x: "48", 10630 y: "16", 10631 width: "27", 10632 height: "23", 10633 rx: "4", 10634 fill: "#DDDDDD" 10635 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Path, { 10636 d: "M54.7585 32V23.2727H56.6037V26.8736H60.3494V23.2727H62.1903V32H60.3494V28.3949H56.6037V32H54.7585ZM67.4574 23.2727V32H65.6122V25.0241H65.5611L63.5625 26.277V24.6406L65.723 23.2727H67.4574Z", 10637 fill: "black" 10638 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Line, { 10639 x1: "55", 10640 y1: "59", 10641 x2: "24", 10642 y2: "59", 10643 stroke: "#DDDDDD" 10644 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Rect, { 10645 x: "59", 10646 y: "47", 10647 width: "29", 10648 height: "23", 10649 rx: "4", 10650 fill: "#DDDDDD" 10651 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Path, { 10652 d: "M65.7585 63V54.2727H67.6037V57.8736H71.3494V54.2727H73.1903V63H71.3494V59.3949H67.6037V63H65.7585ZM74.6605 63V61.6705L77.767 58.794C78.0313 58.5384 78.2528 58.3082 78.4318 58.1037C78.6136 57.8991 78.7514 57.6989 78.8452 57.5028C78.9389 57.304 78.9858 57.0895 78.9858 56.8594C78.9858 56.6037 78.9276 56.3835 78.8111 56.1989C78.6946 56.0114 78.5355 55.8679 78.3338 55.7685C78.1321 55.6662 77.9034 55.6151 77.6477 55.6151C77.3807 55.6151 77.1477 55.669 76.9489 55.777C76.75 55.8849 76.5966 56.0398 76.4886 56.2415C76.3807 56.4432 76.3267 56.6832 76.3267 56.9616H74.5753C74.5753 56.3906 74.7045 55.8949 74.9631 55.4744C75.2216 55.054 75.5838 54.7287 76.0497 54.4986C76.5156 54.2685 77.0526 54.1534 77.6605 54.1534C78.2855 54.1534 78.8295 54.2642 79.2926 54.4858C79.7585 54.7045 80.1207 55.0085 80.3793 55.3977C80.6378 55.7869 80.767 56.233 80.767 56.7358C80.767 57.0653 80.7017 57.3906 80.571 57.7116C80.4432 58.0327 80.2145 58.3892 79.8849 58.7812C79.5554 59.1705 79.0909 59.6378 78.4915 60.1832L77.2173 61.4318V61.4915H80.8821V63H74.6605Z", 10653 fill: "black" 10654 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Line, { 10655 x1: "80", 10656 y1: "90", 10657 x2: "24", 10658 y2: "90", 10659 stroke: "#DDDDDD" 10660 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Rect, { 10661 x: "84", 10662 y: "78", 10663 width: "30", 10664 height: "23", 10665 rx: "4", 10666 fill: "#F0B849" 10667 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Path, { 10668 d: "M90.7585 94V85.2727H92.6037V88.8736H96.3494V85.2727H98.1903V94H96.3494V90.3949H92.6037V94H90.7585ZM99.5284 92.4659V91.0128L103.172 85.2727H104.425V87.2841H103.683L101.386 90.919V90.9872H106.564V92.4659H99.5284ZM103.717 94V92.0227L103.751 91.3793V85.2727H105.482V94H103.717Z", 10669 fill: "black" 10670 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Line, { 10671 x1: "66", 10672 y1: "121", 10673 x2: "24", 10674 y2: "121", 10675 stroke: "#DDDDDD" 10676 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Rect, { 10677 x: "70", 10678 y: "109", 10679 width: "29", 10680 height: "23", 10681 rx: "4", 10682 fill: "#DDDDDD" 10683 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Path, { 10684 d: "M76.7585 125V116.273H78.6037V119.874H82.3494V116.273H84.1903V125H82.3494V121.395H78.6037V125H76.7585ZM88.8864 125.119C88.25 125.119 87.6832 125.01 87.1861 124.791C86.6918 124.57 86.3011 124.266 86.0142 123.879C85.7301 123.49 85.5838 123.041 85.5753 122.533H87.4332C87.4446 122.746 87.5142 122.933 87.642 123.095C87.7727 123.254 87.946 123.378 88.1619 123.466C88.3778 123.554 88.6207 123.598 88.8906 123.598C89.1719 123.598 89.4205 123.548 89.6364 123.449C89.8523 123.349 90.0213 123.212 90.1435 123.036C90.2656 122.859 90.3267 122.656 90.3267 122.426C90.3267 122.193 90.2614 121.987 90.1307 121.808C90.0028 121.626 89.8182 121.484 89.5767 121.382C89.3381 121.28 89.054 121.229 88.7244 121.229H87.9105V119.874H88.7244C89.0028 119.874 89.2486 119.825 89.4616 119.729C89.6776 119.632 89.8452 119.499 89.9645 119.328C90.0838 119.155 90.1435 118.953 90.1435 118.723C90.1435 118.504 90.0909 118.312 89.9858 118.148C89.8835 117.98 89.7386 117.849 89.5511 117.756C89.3665 117.662 89.1506 117.615 88.9034 117.615C88.6534 117.615 88.4247 117.661 88.2173 117.751C88.0099 117.839 87.8438 117.966 87.7188 118.131C87.5938 118.295 87.527 118.489 87.5185 118.71H85.75C85.7585 118.207 85.902 117.764 86.1804 117.381C86.4588 116.997 86.8338 116.697 87.3054 116.482C87.7798 116.263 88.3153 116.153 88.9119 116.153C89.5142 116.153 90.0412 116.263 90.4929 116.482C90.9446 116.7 91.2955 116.996 91.5455 117.368C91.7983 117.737 91.9233 118.152 91.9205 118.612C91.9233 119.101 91.7713 119.509 91.4645 119.835C91.1605 120.162 90.7642 120.369 90.2756 120.457V120.526C90.9176 120.608 91.4063 120.831 91.7415 121.195C92.0795 121.555 92.2472 122.007 92.2443 122.55C92.2472 123.047 92.1037 123.489 91.8139 123.875C91.527 124.261 91.1307 124.565 90.625 124.787C90.1193 125.009 89.5398 125.119 88.8864 125.119Z", 10685 fill: "black" 10686 })] 10687 }); 10688 } 10689 10690 /** 10691 * Returns an array of heading blocks enhanced with the following properties: 10692 * level - An integer with the heading level. 10693 * isEmpty - Flag indicating if the heading has no content. 10694 * 10695 * @param {?Array} blocks An array of blocks. 10696 * 10697 * @return {Array} An array of heading blocks enhanced with the properties described above. 10698 */ 10699 const computeOutlineHeadings = (blocks = []) => { 10700 return blocks.flatMap((block = {}) => { 10701 if (block.name === 'core/heading') { 10702 return { 10703 ...block, 10704 level: block.attributes.level, 10705 isEmpty: isEmptyHeading(block) 10706 }; 10707 } 10708 return computeOutlineHeadings(block.innerBlocks); 10709 }); 10710 }; 10711 const isEmptyHeading = heading => !heading.attributes.content || heading.attributes.content.trim().length === 0; 10712 10713 /** 10714 * Renders a document outline component. 10715 * 10716 * @param {Object} props Props. 10717 * @param {Function} props.onSelect Function to be called when an outline item is selected. 10718 * @param {boolean} props.isTitleSupported Indicates whether the title is supported. 10719 * @param {boolean} props.hasOutlineItemsDisabled Indicates whether the outline items are disabled. 10720 * 10721 * @return {Component} The component to be rendered. 10722 */ 10723 function DocumentOutline({ 10724 onSelect, 10725 isTitleSupported, 10726 hasOutlineItemsDisabled 10727 }) { 10728 const { 10729 selectBlock 10730 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_blockEditor_namespaceObject.store); 10731 const { 10732 blocks, 10733 title 10734 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 10735 var _postType$supports$ti; 10736 const { 10737 getBlocks 10738 } = select(external_wp_blockEditor_namespaceObject.store); 10739 const { 10740 getEditedPostAttribute 10741 } = select(store_store); 10742 const { 10743 getPostType 10744 } = select(external_wp_coreData_namespaceObject.store); 10745 const postType = getPostType(getEditedPostAttribute('type')); 10746 return { 10747 title: getEditedPostAttribute('title'), 10748 blocks: getBlocks(), 10749 isTitleSupported: (_postType$supports$ti = postType?.supports?.title) !== null && _postType$supports$ti !== void 0 ? _postType$supports$ti : false 10750 }; 10751 }); 10752 const headings = computeOutlineHeadings(blocks); 10753 if (headings.length < 1) { 10754 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 10755 className: "editor-document-outline has-no-headings", 10756 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(EmptyOutlineIllustration, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { 10757 children: (0,external_wp_i18n_namespaceObject.__)('Navigate the structure of your document and address issues like empty or incorrect heading levels.') 10758 })] 10759 }); 10760 } 10761 let prevHeadingLevel = 1; 10762 10763 // Not great but it's the simplest way to locate the title right now. 10764 const titleNode = document.querySelector('.editor-post-title__input'); 10765 const hasTitle = isTitleSupported && title && titleNode; 10766 const countByLevel = headings.reduce((acc, heading) => ({ 10767 ...acc, 10768 [heading.level]: (acc[heading.level] || 0) + 1 10769 }), {}); 10770 const hasMultipleH1 = countByLevel[1] > 1; 10771 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 10772 className: "document-outline", 10773 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("ul", { 10774 children: [hasTitle && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(document_outline_item, { 10775 level: (0,external_wp_i18n_namespaceObject.__)('Title'), 10776 isValid: true, 10777 onSelect: onSelect, 10778 href: `#$titleNode.id}`, 10779 isDisabled: hasOutlineItemsDisabled, 10780 children: title 10781 }), headings.map((item, index) => { 10782 // Headings remain the same, go up by one, or down by any amount. 10783 // Otherwise there are missing levels. 10784 const isIncorrectLevel = item.level > prevHeadingLevel + 1; 10785 const isValid = !item.isEmpty && !isIncorrectLevel && !!item.level && (item.level !== 1 || !hasMultipleH1 && !hasTitle); 10786 prevHeadingLevel = item.level; 10787 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(document_outline_item, { 10788 level: `H$item.level}`, 10789 isValid: isValid, 10790 isDisabled: hasOutlineItemsDisabled, 10791 href: `#block-$item.clientId}`, 10792 onSelect: () => { 10793 selectBlock(item.clientId); 10794 onSelect?.(); 10795 }, 10796 children: [item.isEmpty ? emptyHeadingContent : (0,external_wp_richText_namespaceObject.getTextContent)((0,external_wp_richText_namespaceObject.create)({ 10797 html: item.attributes.content 10798 })), isIncorrectLevel && incorrectLevelContent, item.level === 1 && hasMultipleH1 && multipleH1Headings, hasTitle && item.level === 1 && !hasMultipleH1 && singleH1Headings] 10799 }, index); 10800 })] 10801 }) 10802 }); 10803 } 10804 10805 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/document-outline/check.js 10806 /** 10807 * WordPress dependencies 10808 */ 10809 10810 10811 10812 /** 10813 * Component check if there are any headings (core/heading blocks) present in the document. 10814 * 10815 * @param {Object} props Props. 10816 * @param {Element} props.children Children to be rendered. 10817 * 10818 * @return {Component|null} The component to be rendered or null if there are headings. 10819 */ 10820 function DocumentOutlineCheck({ 10821 children 10822 }) { 10823 const hasHeadings = (0,external_wp_data_namespaceObject.useSelect)(select => { 10824 const { 10825 getGlobalBlockCount 10826 } = select(external_wp_blockEditor_namespaceObject.store); 10827 return getGlobalBlockCount('core/heading') > 0; 10828 }); 10829 if (hasHeadings) { 10830 return null; 10831 } 10832 return children; 10833 } 10834 10835 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/global-keyboard-shortcuts/register-shortcuts.js 10836 /** 10837 * WordPress dependencies 10838 */ 10839 10840 10841 10842 10843 10844 10845 10846 /** 10847 * Component for registering editor keyboard shortcuts. 10848 * 10849 * @return {Element} The component to be rendered. 10850 */ 10851 10852 function EditorKeyboardShortcutsRegister() { 10853 // Registering the shortcuts. 10854 const { 10855 registerShortcut 10856 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_keyboardShortcuts_namespaceObject.store); 10857 (0,external_wp_element_namespaceObject.useEffect)(() => { 10858 registerShortcut({ 10859 name: 'core/editor/toggle-mode', 10860 category: 'global', 10861 description: (0,external_wp_i18n_namespaceObject.__)('Switch between visual editor and code editor.'), 10862 keyCombination: { 10863 modifier: 'secondary', 10864 character: 'm' 10865 } 10866 }); 10867 registerShortcut({ 10868 name: 'core/editor/save', 10869 category: 'global', 10870 description: (0,external_wp_i18n_namespaceObject.__)('Save your changes.'), 10871 keyCombination: { 10872 modifier: 'primary', 10873 character: 's' 10874 } 10875 }); 10876 registerShortcut({ 10877 name: 'core/editor/undo', 10878 category: 'global', 10879 description: (0,external_wp_i18n_namespaceObject.__)('Undo your last changes.'), 10880 keyCombination: { 10881 modifier: 'primary', 10882 character: 'z' 10883 } 10884 }); 10885 registerShortcut({ 10886 name: 'core/editor/redo', 10887 category: 'global', 10888 description: (0,external_wp_i18n_namespaceObject.__)('Redo your last undo.'), 10889 keyCombination: { 10890 modifier: 'primaryShift', 10891 character: 'z' 10892 }, 10893 // Disable on Apple OS because it conflicts with the browser's 10894 // history shortcut. It's a fine alias for both Windows and Linux. 10895 // Since there's no conflict for Ctrl+Shift+Z on both Windows and 10896 // Linux, we keep it as the default for consistency. 10897 aliases: (0,external_wp_keycodes_namespaceObject.isAppleOS)() ? [] : [{ 10898 modifier: 'primary', 10899 character: 'y' 10900 }] 10901 }); 10902 registerShortcut({ 10903 name: 'core/editor/toggle-list-view', 10904 category: 'global', 10905 description: (0,external_wp_i18n_namespaceObject.__)('Open the List View.'), 10906 keyCombination: { 10907 modifier: 'access', 10908 character: 'o' 10909 } 10910 }); 10911 registerShortcut({ 10912 name: 'core/editor/toggle-distraction-free', 10913 category: 'global', 10914 description: (0,external_wp_i18n_namespaceObject.__)('Toggle distraction free mode.'), 10915 keyCombination: { 10916 modifier: 'primaryShift', 10917 character: '\\' 10918 } 10919 }); 10920 registerShortcut({ 10921 name: 'core/editor/toggle-sidebar', 10922 category: 'global', 10923 description: (0,external_wp_i18n_namespaceObject.__)('Show or hide the Settings sidebar.'), 10924 keyCombination: { 10925 modifier: 'primaryShift', 10926 character: ',' 10927 } 10928 }); 10929 registerShortcut({ 10930 name: 'core/editor/keyboard-shortcuts', 10931 category: 'main', 10932 description: (0,external_wp_i18n_namespaceObject.__)('Display these keyboard shortcuts.'), 10933 keyCombination: { 10934 modifier: 'access', 10935 character: 'h' 10936 } 10937 }); 10938 registerShortcut({ 10939 name: 'core/editor/next-region', 10940 category: 'global', 10941 description: (0,external_wp_i18n_namespaceObject.__)('Navigate to the next part of the editor.'), 10942 keyCombination: { 10943 modifier: 'ctrl', 10944 character: '`' 10945 }, 10946 aliases: [{ 10947 modifier: 'access', 10948 character: 'n' 10949 }] 10950 }); 10951 registerShortcut({ 10952 name: 'core/editor/previous-region', 10953 category: 'global', 10954 description: (0,external_wp_i18n_namespaceObject.__)('Navigate to the previous part of the editor.'), 10955 keyCombination: { 10956 modifier: 'ctrlShift', 10957 character: '`' 10958 }, 10959 aliases: [{ 10960 modifier: 'access', 10961 character: 'p' 10962 }, { 10963 modifier: 'ctrlShift', 10964 character: '~' 10965 }] 10966 }); 10967 }, [registerShortcut]); 10968 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.BlockEditorKeyboardShortcuts.Register, {}); 10969 } 10970 /* harmony default export */ const register_shortcuts = (EditorKeyboardShortcutsRegister); 10971 10972 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/redo.js 10973 /** 10974 * WordPress dependencies 10975 */ 10976 10977 10978 const redo_redo = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 10979 xmlns: "http://www.w3.org/2000/svg", 10980 viewBox: "0 0 24 24", 10981 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 10982 d: "M15.6 6.5l-1.1 1 2.9 3.3H8c-.9 0-1.7.3-2.3.9-1.4 1.5-1.4 4.2-1.4 5.6v.2h1.5v-.3c0-1.1 0-3.5 1-4.5.3-.3.7-.5 1.3-.5h9.2L14.5 15l1.1 1.1 4.6-4.6-4.6-5z" 10983 }) 10984 }); 10985 /* harmony default export */ const library_redo = (redo_redo); 10986 10987 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/undo.js 10988 /** 10989 * WordPress dependencies 10990 */ 10991 10992 10993 const undo_undo = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 10994 xmlns: "http://www.w3.org/2000/svg", 10995 viewBox: "0 0 24 24", 10996 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 10997 d: "M18.3 11.7c-.6-.6-1.4-.9-2.3-.9H6.7l2.9-3.3-1.1-1-4.5 5L8.5 16l1-1-2.7-2.7H16c.5 0 .9.2 1.3.5 1 1 1 3.4 1 4.5v.3h1.5v-.2c0-1.5 0-4.3-1.5-5.7z" 10998 }) 10999 }); 11000 /* harmony default export */ const library_undo = (undo_undo); 11001 11002 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/editor-history/redo.js 11003 /** 11004 * WordPress dependencies 11005 */ 11006 11007 11008 11009 11010 11011 11012 11013 /** 11014 * Internal dependencies 11015 */ 11016 11017 11018 function EditorHistoryRedo(props, ref) { 11019 const shortcut = (0,external_wp_keycodes_namespaceObject.isAppleOS)() ? external_wp_keycodes_namespaceObject.displayShortcut.primaryShift('z') : external_wp_keycodes_namespaceObject.displayShortcut.primary('y'); 11020 const hasRedo = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).hasEditorRedo(), []); 11021 const { 11022 redo 11023 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 11024 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 11025 __next40pxDefaultSize: true, 11026 ...props, 11027 ref: ref, 11028 icon: !(0,external_wp_i18n_namespaceObject.isRTL)() ? library_redo : library_undo 11029 /* translators: button label text should, if possible, be under 16 characters. */, 11030 label: (0,external_wp_i18n_namespaceObject.__)('Redo'), 11031 shortcut: shortcut 11032 // If there are no redo levels we don't want to actually disable this 11033 // button, because it will remove focus for keyboard users. 11034 // See: https://github.com/WordPress/gutenberg/issues/3486 11035 , 11036 "aria-disabled": !hasRedo, 11037 onClick: hasRedo ? redo : undefined, 11038 className: "editor-history__redo" 11039 }); 11040 } 11041 11042 /** @typedef {import('react').Ref<HTMLElement>} Ref */ 11043 11044 /** 11045 * Renders the redo button for the editor history. 11046 * 11047 * @param {Object} props - Props. 11048 * @param {Ref} ref - Forwarded ref. 11049 * 11050 * @return {Component} The component to be rendered. 11051 */ 11052 /* harmony default export */ const editor_history_redo = ((0,external_wp_element_namespaceObject.forwardRef)(EditorHistoryRedo)); 11053 11054 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/editor-history/undo.js 11055 /** 11056 * WordPress dependencies 11057 */ 11058 11059 11060 11061 11062 11063 11064 11065 /** 11066 * Internal dependencies 11067 */ 11068 11069 11070 function EditorHistoryUndo(props, ref) { 11071 const hasUndo = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).hasEditorUndo(), []); 11072 const { 11073 undo 11074 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 11075 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 11076 __next40pxDefaultSize: true, 11077 ...props, 11078 ref: ref, 11079 icon: !(0,external_wp_i18n_namespaceObject.isRTL)() ? library_undo : library_redo 11080 /* translators: button label text should, if possible, be under 16 characters. */, 11081 label: (0,external_wp_i18n_namespaceObject.__)('Undo'), 11082 shortcut: external_wp_keycodes_namespaceObject.displayShortcut.primary('z') 11083 // If there are no undo levels we don't want to actually disable this 11084 // button, because it will remove focus for keyboard users. 11085 // See: https://github.com/WordPress/gutenberg/issues/3486 11086 , 11087 "aria-disabled": !hasUndo, 11088 onClick: hasUndo ? undo : undefined, 11089 className: "editor-history__undo" 11090 }); 11091 } 11092 11093 /** @typedef {import('react').Ref<HTMLElement>} Ref */ 11094 11095 /** 11096 * Renders the undo button for the editor history. 11097 * 11098 * @param {Object} props - Props. 11099 * @param {Ref} ref - Forwarded ref. 11100 * 11101 * @return {Component} The component to be rendered. 11102 */ 11103 /* harmony default export */ const editor_history_undo = ((0,external_wp_element_namespaceObject.forwardRef)(EditorHistoryUndo)); 11104 11105 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/template-validation-notice/index.js 11106 /** 11107 * WordPress dependencies 11108 */ 11109 11110 11111 11112 11113 11114 11115 11116 11117 function TemplateValidationNotice() { 11118 const [showConfirmDialog, setShowConfirmDialog] = (0,external_wp_element_namespaceObject.useState)(false); 11119 const isValid = (0,external_wp_data_namespaceObject.useSelect)(select => { 11120 return select(external_wp_blockEditor_namespaceObject.store).isValidTemplate(); 11121 }, []); 11122 const { 11123 setTemplateValidity, 11124 synchronizeTemplate 11125 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_blockEditor_namespaceObject.store); 11126 if (isValid) { 11127 return null; 11128 } 11129 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 11130 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Notice, { 11131 className: "editor-template-validation-notice", 11132 isDismissible: false, 11133 status: "warning", 11134 actions: [{ 11135 label: (0,external_wp_i18n_namespaceObject.__)('Keep it as is'), 11136 onClick: () => setTemplateValidity(true) 11137 }, { 11138 label: (0,external_wp_i18n_namespaceObject.__)('Reset the template'), 11139 onClick: () => setShowConfirmDialog(true) 11140 }], 11141 children: (0,external_wp_i18n_namespaceObject.__)('The content of your post doesn’t match the template assigned to your post type.') 11142 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalConfirmDialog, { 11143 isOpen: showConfirmDialog, 11144 confirmButtonText: (0,external_wp_i18n_namespaceObject.__)('Reset'), 11145 onConfirm: () => { 11146 setShowConfirmDialog(false); 11147 synchronizeTemplate(); 11148 }, 11149 onCancel: () => setShowConfirmDialog(false), 11150 size: "medium", 11151 children: (0,external_wp_i18n_namespaceObject.__)('Resetting the template may result in loss of content, do you want to continue?') 11152 })] 11153 }); 11154 } 11155 11156 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/editor-notices/index.js 11157 /** 11158 * WordPress dependencies 11159 */ 11160 11161 11162 11163 11164 /** 11165 * Internal dependencies 11166 */ 11167 11168 11169 /** 11170 * This component renders the notices displayed in the editor. It displays pinned notices first, followed by dismissible 11171 * 11172 * @example 11173 * ```jsx 11174 * <EditorNotices /> 11175 * ``` 11176 * 11177 * @return {JSX.Element} The rendered EditorNotices component. 11178 */ 11179 11180 11181 11182 function EditorNotices() { 11183 const { 11184 notices 11185 } = (0,external_wp_data_namespaceObject.useSelect)(select => ({ 11186 notices: select(external_wp_notices_namespaceObject.store).getNotices() 11187 }), []); 11188 const { 11189 removeNotice 11190 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); 11191 const dismissibleNotices = notices.filter(({ 11192 isDismissible, 11193 type 11194 }) => isDismissible && type === 'default'); 11195 const nonDismissibleNotices = notices.filter(({ 11196 isDismissible, 11197 type 11198 }) => !isDismissible && type === 'default'); 11199 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 11200 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.NoticeList, { 11201 notices: nonDismissibleNotices, 11202 className: "components-editor-notices__pinned" 11203 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.NoticeList, { 11204 notices: dismissibleNotices, 11205 className: "components-editor-notices__dismissible", 11206 onRemove: removeNotice, 11207 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TemplateValidationNotice, {}) 11208 })] 11209 }); 11210 } 11211 /* harmony default export */ const editor_notices = (EditorNotices); 11212 11213 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/editor-snackbars/index.js 11214 /** 11215 * WordPress dependencies 11216 */ 11217 11218 11219 11220 11221 // Last three notices. Slices from the tail end of the list. 11222 11223 const MAX_VISIBLE_NOTICES = -3; 11224 11225 /** 11226 * Renders the editor snackbars component. 11227 * 11228 * @return {JSX.Element} The rendered component. 11229 */ 11230 function EditorSnackbars() { 11231 const notices = (0,external_wp_data_namespaceObject.useSelect)(select => select(external_wp_notices_namespaceObject.store).getNotices(), []); 11232 const { 11233 removeNotice 11234 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); 11235 const snackbarNotices = notices.filter(({ 11236 type 11237 }) => type === 'snackbar').slice(MAX_VISIBLE_NOTICES); 11238 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.SnackbarList, { 11239 notices: snackbarNotices, 11240 className: "components-editor-notices__snackbar", 11241 onRemove: removeNotice 11242 }); 11243 } 11244 11245 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/entities-saved-states/entity-record-item.js 11246 /** 11247 * WordPress dependencies 11248 */ 11249 11250 11251 11252 11253 11254 11255 /** 11256 * Internal dependencies 11257 */ 11258 11259 11260 11261 11262 11263 function EntityRecordItem({ 11264 record, 11265 checked, 11266 onChange 11267 }) { 11268 const { 11269 name, 11270 kind, 11271 title, 11272 key 11273 } = record; 11274 11275 // Handle templates that might use default descriptive titles. 11276 const { 11277 entityRecordTitle, 11278 hasPostMetaChanges 11279 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 11280 if ('postType' !== kind || 'wp_template' !== name) { 11281 return { 11282 entityRecordTitle: title, 11283 hasPostMetaChanges: unlock(select(store_store)).hasPostMetaChanges(name, key) 11284 }; 11285 } 11286 const template = select(external_wp_coreData_namespaceObject.store).getEditedEntityRecord(kind, name, key); 11287 return { 11288 entityRecordTitle: select(store_store).__experimentalGetTemplateInfo(template).title, 11289 hasPostMetaChanges: unlock(select(store_store)).hasPostMetaChanges(name, key) 11290 }; 11291 }, [name, kind, title, key]); 11292 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 11293 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelRow, { 11294 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.CheckboxControl, { 11295 __nextHasNoMarginBottom: true, 11296 label: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(entityRecordTitle) || (0,external_wp_i18n_namespaceObject.__)('Untitled'), 11297 checked: checked, 11298 onChange: onChange 11299 }) 11300 }), hasPostMetaChanges && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("ul", { 11301 className: "entities-saved-states__changes", 11302 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("li", { 11303 children: (0,external_wp_i18n_namespaceObject.__)('Post Meta.') 11304 }) 11305 })] 11306 }); 11307 } 11308 11309 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/entities-saved-states/entity-type-list.js 11310 /** 11311 * WordPress dependencies 11312 */ 11313 11314 11315 11316 11317 11318 11319 11320 /** 11321 * Internal dependencies 11322 */ 11323 11324 11325 11326 11327 const { 11328 getGlobalStylesChanges, 11329 GlobalStylesContext 11330 } = unlock(external_wp_blockEditor_namespaceObject.privateApis); 11331 function getEntityDescription(entity, count) { 11332 switch (entity) { 11333 case 'site': 11334 return 1 === count ? (0,external_wp_i18n_namespaceObject.__)('This change will affect your whole site.') : (0,external_wp_i18n_namespaceObject.__)('These changes will affect your whole site.'); 11335 case 'wp_template': 11336 return (0,external_wp_i18n_namespaceObject.__)('This change will affect pages and posts that use this template.'); 11337 case 'page': 11338 case 'post': 11339 return (0,external_wp_i18n_namespaceObject.__)('The following has been modified.'); 11340 } 11341 } 11342 function GlobalStylesDescription({ 11343 record 11344 }) { 11345 const { 11346 user: currentEditorGlobalStyles 11347 } = (0,external_wp_element_namespaceObject.useContext)(GlobalStylesContext); 11348 const savedRecord = (0,external_wp_data_namespaceObject.useSelect)(select => select(external_wp_coreData_namespaceObject.store).getEntityRecord(record.kind, record.name, record.key), [record.kind, record.name, record.key]); 11349 const globalStylesChanges = getGlobalStylesChanges(currentEditorGlobalStyles, savedRecord, { 11350 maxResults: 10 11351 }); 11352 return globalStylesChanges.length ? /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("ul", { 11353 className: "entities-saved-states__changes", 11354 children: globalStylesChanges.map(change => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("li", { 11355 children: change 11356 }, change)) 11357 }) : null; 11358 } 11359 function EntityDescription({ 11360 record, 11361 count 11362 }) { 11363 if ('globalStyles' === record?.name) { 11364 return null; 11365 } 11366 const description = getEntityDescription(record?.name, count); 11367 return description ? /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelRow, { 11368 children: description 11369 }) : null; 11370 } 11371 function EntityTypeList({ 11372 list, 11373 unselectedEntities, 11374 setUnselectedEntities 11375 }) { 11376 const count = list.length; 11377 const firstRecord = list[0]; 11378 const entityConfig = (0,external_wp_data_namespaceObject.useSelect)(select => select(external_wp_coreData_namespaceObject.store).getEntityConfig(firstRecord.kind, firstRecord.name), [firstRecord.kind, firstRecord.name]); 11379 let entityLabel = entityConfig.label; 11380 if (firstRecord?.name === 'wp_template_part') { 11381 entityLabel = 1 === count ? (0,external_wp_i18n_namespaceObject.__)('Template Part') : (0,external_wp_i18n_namespaceObject.__)('Template Parts'); 11382 } 11383 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.PanelBody, { 11384 title: entityLabel, 11385 initialOpen: true, 11386 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(EntityDescription, { 11387 record: firstRecord, 11388 count: count 11389 }), list.map(record => { 11390 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(EntityRecordItem, { 11391 record: record, 11392 checked: !unselectedEntities.some(elt => elt.kind === record.kind && elt.name === record.name && elt.key === record.key && elt.property === record.property), 11393 onChange: value => setUnselectedEntities(record, value) 11394 }, record.key || record.property); 11395 }), 'globalStyles' === firstRecord?.name && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(GlobalStylesDescription, { 11396 record: firstRecord 11397 })] 11398 }); 11399 } 11400 11401 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/entities-saved-states/hooks/use-is-dirty.js 11402 /** 11403 * WordPress dependencies 11404 */ 11405 11406 11407 11408 11409 /** 11410 * Custom hook that determines if any entities are dirty (edited) and provides a way to manage selected/unselected entities. 11411 * 11412 * @return {Object} An object containing the following properties: 11413 * - dirtyEntityRecords: An array of dirty entity records. 11414 * - isDirty: A boolean indicating if there are any dirty entity records. 11415 * - setUnselectedEntities: A function to set the unselected entities. 11416 * - unselectedEntities: An array of unselected entities. 11417 */ 11418 const useIsDirty = () => { 11419 const { 11420 editedEntities, 11421 siteEdits, 11422 siteEntityConfig 11423 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 11424 const { 11425 __experimentalGetDirtyEntityRecords, 11426 getEntityRecordEdits, 11427 getEntityConfig 11428 } = select(external_wp_coreData_namespaceObject.store); 11429 return { 11430 editedEntities: __experimentalGetDirtyEntityRecords(), 11431 siteEdits: getEntityRecordEdits('root', 'site'), 11432 siteEntityConfig: getEntityConfig('root', 'site') 11433 }; 11434 }, []); 11435 const dirtyEntityRecords = (0,external_wp_element_namespaceObject.useMemo)(() => { 11436 var _siteEntityConfig$met; 11437 // Remove site object and decouple into its edited pieces. 11438 const editedEntitiesWithoutSite = editedEntities.filter(record => !(record.kind === 'root' && record.name === 'site')); 11439 const siteEntityLabels = (_siteEntityConfig$met = siteEntityConfig?.meta?.labels) !== null && _siteEntityConfig$met !== void 0 ? _siteEntityConfig$met : {}; 11440 const editedSiteEntities = []; 11441 for (const property in siteEdits) { 11442 editedSiteEntities.push({ 11443 kind: 'root', 11444 name: 'site', 11445 title: siteEntityLabels[property] || property, 11446 property 11447 }); 11448 } 11449 return [...editedEntitiesWithoutSite, ...editedSiteEntities]; 11450 }, [editedEntities, siteEdits, siteEntityConfig]); 11451 11452 // Unchecked entities to be ignored by save function. 11453 const [unselectedEntities, _setUnselectedEntities] = (0,external_wp_element_namespaceObject.useState)([]); 11454 const setUnselectedEntities = ({ 11455 kind, 11456 name, 11457 key, 11458 property 11459 }, checked) => { 11460 if (checked) { 11461 _setUnselectedEntities(unselectedEntities.filter(elt => elt.kind !== kind || elt.name !== name || elt.key !== key || elt.property !== property)); 11462 } else { 11463 _setUnselectedEntities([...unselectedEntities, { 11464 kind, 11465 name, 11466 key, 11467 property 11468 }]); 11469 } 11470 }; 11471 const isDirty = dirtyEntityRecords.length - unselectedEntities.length > 0; 11472 return { 11473 dirtyEntityRecords, 11474 isDirty, 11475 setUnselectedEntities, 11476 unselectedEntities 11477 }; 11478 }; 11479 11480 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/entities-saved-states/index.js 11481 /** 11482 * WordPress dependencies 11483 */ 11484 11485 11486 11487 11488 11489 11490 /** 11491 * Internal dependencies 11492 */ 11493 11494 11495 11496 11497 11498 11499 function identity(values) { 11500 return values; 11501 } 11502 11503 /** 11504 * Renders the component for managing saved states of entities. 11505 * 11506 * @param {Object} props The component props. 11507 * @param {Function} props.close The function to close the dialog. 11508 * @param {Function} props.renderDialog The function to render the dialog. 11509 * 11510 * @return {JSX.Element} The rendered component. 11511 */ 11512 function EntitiesSavedStates({ 11513 close, 11514 renderDialog = undefined 11515 }) { 11516 const isDirtyProps = useIsDirty(); 11517 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(EntitiesSavedStatesExtensible, { 11518 close: close, 11519 renderDialog: renderDialog, 11520 ...isDirtyProps 11521 }); 11522 } 11523 11524 /** 11525 * Renders a panel for saving entities with dirty records. 11526 * 11527 * @param {Object} props The component props. 11528 * @param {string} props.additionalPrompt Additional prompt to display. 11529 * @param {Function} props.close Function to close the panel. 11530 * @param {Function} props.onSave Function to call when saving entities. 11531 * @param {boolean} props.saveEnabled Flag indicating if save is enabled. 11532 * @param {string} props.saveLabel Label for the save button. 11533 * @param {Function} props.renderDialog Function to render a custom dialog. 11534 * @param {Array} props.dirtyEntityRecords Array of dirty entity records. 11535 * @param {boolean} props.isDirty Flag indicating if there are dirty entities. 11536 * @param {Function} props.setUnselectedEntities Function to set unselected entities. 11537 * @param {Array} props.unselectedEntities Array of unselected entities. 11538 * 11539 * @return {JSX.Element} The rendered component. 11540 */ 11541 function EntitiesSavedStatesExtensible({ 11542 additionalPrompt = undefined, 11543 close, 11544 onSave = identity, 11545 saveEnabled: saveEnabledProp = undefined, 11546 saveLabel = (0,external_wp_i18n_namespaceObject.__)('Save'), 11547 renderDialog = undefined, 11548 dirtyEntityRecords, 11549 isDirty, 11550 setUnselectedEntities, 11551 unselectedEntities 11552 }) { 11553 const saveButtonRef = (0,external_wp_element_namespaceObject.useRef)(); 11554 const { 11555 saveDirtyEntities 11556 } = unlock((0,external_wp_data_namespaceObject.useDispatch)(store_store)); 11557 // To group entities by type. 11558 const partitionedSavables = dirtyEntityRecords.reduce((acc, record) => { 11559 const { 11560 name 11561 } = record; 11562 if (!acc[name]) { 11563 acc[name] = []; 11564 } 11565 acc[name].push(record); 11566 return acc; 11567 }, {}); 11568 11569 // Sort entity groups. 11570 const { 11571 site: siteSavables, 11572 wp_template: templateSavables, 11573 wp_template_part: templatePartSavables, 11574 ...contentSavables 11575 } = partitionedSavables; 11576 const sortedPartitionedSavables = [siteSavables, templateSavables, templatePartSavables, ...Object.values(contentSavables)].filter(Array.isArray); 11577 const saveEnabled = saveEnabledProp !== null && saveEnabledProp !== void 0 ? saveEnabledProp : isDirty; 11578 // Explicitly define this with no argument passed. Using `close` on 11579 // its own will use the event object in place of the expected saved entities. 11580 const dismissPanel = (0,external_wp_element_namespaceObject.useCallback)(() => close(), [close]); 11581 const [saveDialogRef, saveDialogProps] = (0,external_wp_compose_namespaceObject.__experimentalUseDialog)({ 11582 onClose: () => dismissPanel() 11583 }); 11584 const dialogLabel = (0,external_wp_compose_namespaceObject.useInstanceId)(EntitiesSavedStatesExtensible, 'label'); 11585 const dialogDescription = (0,external_wp_compose_namespaceObject.useInstanceId)(EntitiesSavedStatesExtensible, 'description'); 11586 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 11587 ref: saveDialogRef, 11588 ...saveDialogProps, 11589 className: "entities-saved-states__panel", 11590 role: renderDialog ? 'dialog' : undefined, 11591 "aria-labelledby": renderDialog ? dialogLabel : undefined, 11592 "aria-describedby": renderDialog ? dialogDescription : undefined, 11593 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.Flex, { 11594 className: "entities-saved-states__panel-header", 11595 gap: 2, 11596 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.FlexItem, { 11597 isBlock: true, 11598 as: external_wp_components_namespaceObject.Button, 11599 variant: "secondary", 11600 size: "compact", 11601 onClick: dismissPanel, 11602 children: (0,external_wp_i18n_namespaceObject.__)('Cancel') 11603 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.FlexItem, { 11604 isBlock: true, 11605 as: external_wp_components_namespaceObject.Button, 11606 ref: saveButtonRef, 11607 variant: "primary", 11608 size: "compact", 11609 disabled: !saveEnabled, 11610 accessibleWhenDisabled: true, 11611 onClick: () => saveDirtyEntities({ 11612 onSave, 11613 dirtyEntityRecords, 11614 entitiesToSkip: unselectedEntities, 11615 close 11616 }), 11617 className: "editor-entities-saved-states__save-button", 11618 children: saveLabel 11619 })] 11620 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 11621 className: "entities-saved-states__text-prompt", 11622 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 11623 className: "entities-saved-states__text-prompt--header-wrapper", 11624 id: renderDialog ? dialogLabel : undefined, 11625 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("strong", { 11626 className: "entities-saved-states__text-prompt--header", 11627 children: (0,external_wp_i18n_namespaceObject.__)('Are you ready to save?') 11628 }), additionalPrompt] 11629 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { 11630 id: renderDialog ? dialogDescription : undefined, 11631 children: isDirty ? (0,external_wp_element_namespaceObject.createInterpolateElement)((0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %d: number of site changes waiting to be saved. */ 11632 (0,external_wp_i18n_namespaceObject._n)('There is <strong>%d site change</strong> waiting to be saved.', 'There are <strong>%d site changes</strong> waiting to be saved.', sortedPartitionedSavables.length), sortedPartitionedSavables.length), { 11633 strong: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("strong", {}) 11634 }) : (0,external_wp_i18n_namespaceObject.__)('Select the items you want to save.') 11635 })] 11636 }), sortedPartitionedSavables.map(list => { 11637 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(EntityTypeList, { 11638 list: list, 11639 unselectedEntities: unselectedEntities, 11640 setUnselectedEntities: setUnselectedEntities 11641 }, list[0].name); 11642 })] 11643 }); 11644 } 11645 11646 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/error-boundary/index.js 11647 /** 11648 * WordPress dependencies 11649 */ 11650 11651 11652 11653 11654 11655 11656 11657 11658 /** 11659 * Internal dependencies 11660 */ 11661 11662 11663 function getContent() { 11664 try { 11665 // While `select` in a component is generally discouraged, it is 11666 // used here because it (a) reduces the chance of data loss in the 11667 // case of additional errors by performing a direct retrieval and 11668 // (b) avoids the performance cost associated with unnecessary 11669 // content serialization throughout the lifetime of a non-erroring 11670 // application. 11671 return (0,external_wp_data_namespaceObject.select)(store_store).getEditedPostContent(); 11672 } catch (error) {} 11673 } 11674 function CopyButton({ 11675 text, 11676 children 11677 }) { 11678 const ref = (0,external_wp_compose_namespaceObject.useCopyToClipboard)(text); 11679 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 11680 __next40pxDefaultSize: true, 11681 variant: "secondary", 11682 ref: ref, 11683 children: children 11684 }); 11685 } 11686 class ErrorBoundary extends external_wp_element_namespaceObject.Component { 11687 constructor() { 11688 super(...arguments); 11689 this.state = { 11690 error: null 11691 }; 11692 } 11693 componentDidCatch(error) { 11694 (0,external_wp_hooks_namespaceObject.doAction)('editor.ErrorBoundary.errorLogged', error); 11695 } 11696 static getDerivedStateFromError(error) { 11697 return { 11698 error 11699 }; 11700 } 11701 render() { 11702 const { 11703 error 11704 } = this.state; 11705 if (!error) { 11706 return this.props.children; 11707 } 11708 const actions = [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(CopyButton, { 11709 text: getContent, 11710 children: (0,external_wp_i18n_namespaceObject.__)('Copy Post Text') 11711 }, "copy-post"), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(CopyButton, { 11712 text: error.stack, 11713 children: (0,external_wp_i18n_namespaceObject.__)('Copy Error') 11714 }, "copy-error")]; 11715 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.Warning, { 11716 className: "editor-error-boundary", 11717 actions: actions, 11718 children: (0,external_wp_i18n_namespaceObject.__)('The editor has encountered an unexpected error.') 11719 }); 11720 } 11721 } 11722 11723 /** 11724 * ErrorBoundary is used to catch JavaScript errors anywhere in a child component tree, log those errors, and display a fallback UI. 11725 * 11726 * It uses the lifecycle methods getDerivedStateFromError and componentDidCatch to catch errors in a child component tree. 11727 * 11728 * getDerivedStateFromError is used to render a fallback UI after an error has been thrown, and componentDidCatch is used to log error information. 11729 * 11730 * @class ErrorBoundary 11731 * @augments Component 11732 */ 11733 /* harmony default export */ const error_boundary = (ErrorBoundary); 11734 11735 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/local-autosave-monitor/index.js 11736 /** 11737 * WordPress dependencies 11738 */ 11739 11740 11741 11742 11743 11744 11745 11746 /** 11747 * Internal dependencies 11748 */ 11749 11750 11751 11752 11753 const requestIdleCallback = window.requestIdleCallback ? window.requestIdleCallback : window.requestAnimationFrame; 11754 let hasStorageSupport; 11755 11756 /** 11757 * Function which returns true if the current environment supports browser 11758 * sessionStorage, or false otherwise. The result of this function is cached and 11759 * reused in subsequent invocations. 11760 */ 11761 const hasSessionStorageSupport = () => { 11762 if (hasStorageSupport !== undefined) { 11763 return hasStorageSupport; 11764 } 11765 try { 11766 // Private Browsing in Safari 10 and earlier will throw an error when 11767 // attempting to set into sessionStorage. The test here is intentional in 11768 // causing a thrown error as condition bailing from local autosave. 11769 window.sessionStorage.setItem('__wpEditorTestSessionStorage', ''); 11770 window.sessionStorage.removeItem('__wpEditorTestSessionStorage'); 11771 hasStorageSupport = true; 11772 } catch { 11773 hasStorageSupport = false; 11774 } 11775 return hasStorageSupport; 11776 }; 11777 11778 /** 11779 * Custom hook which manages the creation of a notice prompting the user to 11780 * restore a local autosave, if one exists. 11781 */ 11782 function useAutosaveNotice() { 11783 const { 11784 postId, 11785 isEditedPostNew, 11786 hasRemoteAutosave 11787 } = (0,external_wp_data_namespaceObject.useSelect)(select => ({ 11788 postId: select(store_store).getCurrentPostId(), 11789 isEditedPostNew: select(store_store).isEditedPostNew(), 11790 hasRemoteAutosave: !!select(store_store).getEditorSettings().autosave 11791 }), []); 11792 const { 11793 getEditedPostAttribute 11794 } = (0,external_wp_data_namespaceObject.useSelect)(store_store); 11795 const { 11796 createWarningNotice, 11797 removeNotice 11798 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); 11799 const { 11800 editPost, 11801 resetEditorBlocks 11802 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 11803 (0,external_wp_element_namespaceObject.useEffect)(() => { 11804 let localAutosave = localAutosaveGet(postId, isEditedPostNew); 11805 if (!localAutosave) { 11806 return; 11807 } 11808 try { 11809 localAutosave = JSON.parse(localAutosave); 11810 } catch { 11811 // Not usable if it can't be parsed. 11812 return; 11813 } 11814 const { 11815 post_title: title, 11816 content, 11817 excerpt 11818 } = localAutosave; 11819 const edits = { 11820 title, 11821 content, 11822 excerpt 11823 }; 11824 { 11825 // Only display a notice if there is a difference between what has been 11826 // saved and that which is stored in sessionStorage. 11827 const hasDifference = Object.keys(edits).some(key => { 11828 return edits[key] !== getEditedPostAttribute(key); 11829 }); 11830 if (!hasDifference) { 11831 // If there is no difference, it can be safely ejected from storage. 11832 localAutosaveClear(postId, isEditedPostNew); 11833 return; 11834 } 11835 } 11836 if (hasRemoteAutosave) { 11837 return; 11838 } 11839 const id = 'wpEditorAutosaveRestore'; 11840 createWarningNotice((0,external_wp_i18n_namespaceObject.__)('The backup of this post in your browser is different from the version below.'), { 11841 id, 11842 actions: [{ 11843 label: (0,external_wp_i18n_namespaceObject.__)('Restore the backup'), 11844 onClick() { 11845 const { 11846 content: editsContent, 11847 ...editsWithoutContent 11848 } = edits; 11849 editPost(editsWithoutContent); 11850 resetEditorBlocks((0,external_wp_blocks_namespaceObject.parse)(edits.content)); 11851 removeNotice(id); 11852 } 11853 }] 11854 }); 11855 }, [isEditedPostNew, postId]); 11856 } 11857 11858 /** 11859 * Custom hook which ejects a local autosave after a successful save occurs. 11860 */ 11861 function useAutosavePurge() { 11862 const { 11863 postId, 11864 isEditedPostNew, 11865 isDirty, 11866 isAutosaving, 11867 didError 11868 } = (0,external_wp_data_namespaceObject.useSelect)(select => ({ 11869 postId: select(store_store).getCurrentPostId(), 11870 isEditedPostNew: select(store_store).isEditedPostNew(), 11871 isDirty: select(store_store).isEditedPostDirty(), 11872 isAutosaving: select(store_store).isAutosavingPost(), 11873 didError: select(store_store).didPostSaveRequestFail() 11874 }), []); 11875 const lastIsDirtyRef = (0,external_wp_element_namespaceObject.useRef)(isDirty); 11876 const lastIsAutosavingRef = (0,external_wp_element_namespaceObject.useRef)(isAutosaving); 11877 (0,external_wp_element_namespaceObject.useEffect)(() => { 11878 if (!didError && (lastIsAutosavingRef.current && !isAutosaving || lastIsDirtyRef.current && !isDirty)) { 11879 localAutosaveClear(postId, isEditedPostNew); 11880 } 11881 lastIsDirtyRef.current = isDirty; 11882 lastIsAutosavingRef.current = isAutosaving; 11883 }, [isDirty, isAutosaving, didError]); 11884 11885 // Once the isEditedPostNew changes from true to false, let's clear the auto-draft autosave. 11886 const wasEditedPostNew = (0,external_wp_compose_namespaceObject.usePrevious)(isEditedPostNew); 11887 const prevPostId = (0,external_wp_compose_namespaceObject.usePrevious)(postId); 11888 (0,external_wp_element_namespaceObject.useEffect)(() => { 11889 if (prevPostId === postId && wasEditedPostNew && !isEditedPostNew) { 11890 localAutosaveClear(postId, true); 11891 } 11892 }, [isEditedPostNew, postId]); 11893 } 11894 function LocalAutosaveMonitor() { 11895 const { 11896 autosave 11897 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 11898 const deferredAutosave = (0,external_wp_element_namespaceObject.useCallback)(() => { 11899 requestIdleCallback(() => autosave({ 11900 local: true 11901 })); 11902 }, []); 11903 useAutosaveNotice(); 11904 useAutosavePurge(); 11905 const localAutosaveInterval = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getEditorSettings().localAutosaveInterval, []); 11906 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(autosave_monitor, { 11907 interval: localAutosaveInterval, 11908 autosave: deferredAutosave 11909 }); 11910 } 11911 11912 /** 11913 * Monitors local autosaves of a post in the editor. 11914 * It uses several hooks and functions to manage autosave behavior: 11915 * - `useAutosaveNotice` hook: Manages the creation of a notice prompting the user to restore a local autosave, if one exists. 11916 * - `useAutosavePurge` hook: Ejects a local autosave after a successful save occurs. 11917 * - `hasSessionStorageSupport` function: Checks if the current environment supports browser sessionStorage. 11918 * - `LocalAutosaveMonitor` component: Uses the `AutosaveMonitor` component to perform autosaves at a specified interval. 11919 * 11920 * The module also checks for sessionStorage support and conditionally exports the `LocalAutosaveMonitor` component based on that. 11921 * 11922 * @module LocalAutosaveMonitor 11923 */ 11924 /* harmony default export */ const local_autosave_monitor = ((0,external_wp_compose_namespaceObject.ifCondition)(hasSessionStorageSupport)(LocalAutosaveMonitor)); 11925 11926 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/page-attributes/check.js 11927 /** 11928 * WordPress dependencies 11929 */ 11930 11931 11932 11933 /** 11934 * Internal dependencies 11935 */ 11936 11937 11938 /** 11939 * Wrapper component that renders its children only if the post type supports page attributes. 11940 * 11941 * @param {Object} props - The component props. 11942 * @param {Element} props.children - The child components to render. 11943 * 11944 * @return {Component|null} The rendered child components or null if page attributes are not supported. 11945 */ 11946 function PageAttributesCheck({ 11947 children 11948 }) { 11949 const supportsPageAttributes = (0,external_wp_data_namespaceObject.useSelect)(select => { 11950 const { 11951 getEditedPostAttribute 11952 } = select(store_store); 11953 const { 11954 getPostType 11955 } = select(external_wp_coreData_namespaceObject.store); 11956 const postType = getPostType(getEditedPostAttribute('type')); 11957 return !!postType?.supports?.['page-attributes']; 11958 }, []); 11959 11960 // Only render fields if post type supports page attributes or available templates exist. 11961 if (!supportsPageAttributes) { 11962 return null; 11963 } 11964 return children; 11965 } 11966 /* harmony default export */ const page_attributes_check = (PageAttributesCheck); 11967 11968 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-type-support-check/index.js 11969 /** 11970 * WordPress dependencies 11971 */ 11972 11973 11974 11975 /** 11976 * Internal dependencies 11977 */ 11978 11979 11980 /** 11981 * A component which renders its own children only if the current editor post 11982 * type supports one of the given `supportKeys` prop. 11983 * 11984 * @param {Object} props Props. 11985 * @param {Element} props.children Children to be rendered if post 11986 * type supports. 11987 * @param {(string|string[])} props.supportKeys String or string array of keys 11988 * to test. 11989 * 11990 * @return {Component} The component to be rendered. 11991 */ 11992 function PostTypeSupportCheck({ 11993 children, 11994 supportKeys 11995 }) { 11996 const postType = (0,external_wp_data_namespaceObject.useSelect)(select => { 11997 const { 11998 getEditedPostAttribute 11999 } = select(store_store); 12000 const { 12001 getPostType 12002 } = select(external_wp_coreData_namespaceObject.store); 12003 return getPostType(getEditedPostAttribute('type')); 12004 }, []); 12005 let isSupported = !!postType; 12006 if (postType) { 12007 isSupported = (Array.isArray(supportKeys) ? supportKeys : [supportKeys]).some(key => !!postType.supports[key]); 12008 } 12009 if (!isSupported) { 12010 return null; 12011 } 12012 return children; 12013 } 12014 /* harmony default export */ const post_type_support_check = (PostTypeSupportCheck); 12015 12016 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/page-attributes/order.js 12017 /** 12018 * WordPress dependencies 12019 */ 12020 12021 12022 12023 12024 12025 /** 12026 * Internal dependencies 12027 */ 12028 12029 12030 12031 function PageAttributesOrder() { 12032 const order = (0,external_wp_data_namespaceObject.useSelect)(select => { 12033 var _select$getEditedPost; 12034 return (_select$getEditedPost = select(store_store).getEditedPostAttribute('menu_order')) !== null && _select$getEditedPost !== void 0 ? _select$getEditedPost : 0; 12035 }, []); 12036 const { 12037 editPost 12038 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 12039 const [orderInput, setOrderInput] = (0,external_wp_element_namespaceObject.useState)(null); 12040 const setUpdatedOrder = value => { 12041 setOrderInput(value); 12042 const newOrder = Number(value); 12043 if (Number.isInteger(newOrder) && value.trim?.() !== '') { 12044 editPost({ 12045 menu_order: newOrder 12046 }); 12047 } 12048 }; 12049 const value = orderInput !== null && orderInput !== void 0 ? orderInput : order; 12050 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Flex, { 12051 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.FlexBlock, { 12052 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalNumberControl, { 12053 __next40pxDefaultSize: true, 12054 label: (0,external_wp_i18n_namespaceObject.__)('Order'), 12055 help: (0,external_wp_i18n_namespaceObject.__)('Set the page order.'), 12056 value: value, 12057 onChange: setUpdatedOrder, 12058 hideLabelFromVision: true, 12059 onBlur: () => { 12060 setOrderInput(null); 12061 } 12062 }) 12063 }) 12064 }); 12065 } 12066 12067 /** 12068 * Renders the Page Attributes Order component. A number input in an editor interface 12069 * for setting the order of a given page. 12070 * The component is now not used in core but was kept for backward compatibility. 12071 * 12072 * @return {Component} The component to be rendered. 12073 */ 12074 function PageAttributesOrderWithChecks() { 12075 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_type_support_check, { 12076 supportKeys: "page-attributes", 12077 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PageAttributesOrder, {}) 12078 }); 12079 } 12080 12081 // EXTERNAL MODULE: ./node_modules/remove-accents/index.js 12082 var remove_accents = __webpack_require__(9681); 12083 var remove_accents_default = /*#__PURE__*/__webpack_require__.n(remove_accents); 12084 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-panel-row/index.js 12085 /** 12086 * External dependencies 12087 */ 12088 12089 12090 /** 12091 * WordPress dependencies 12092 */ 12093 12094 12095 12096 12097 const PostPanelRow = (0,external_wp_element_namespaceObject.forwardRef)(({ 12098 className, 12099 label, 12100 children 12101 }, ref) => { 12102 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, { 12103 className: dist_clsx('editor-post-panel__row', className), 12104 ref: ref, 12105 children: [label && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 12106 className: "editor-post-panel__row-label", 12107 children: label 12108 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 12109 className: "editor-post-panel__row-control", 12110 children: children 12111 })] 12112 }); 12113 }); 12114 /* harmony default export */ const post_panel_row = (PostPanelRow); 12115 12116 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/utils/terms.js 12117 /** 12118 * WordPress dependencies 12119 */ 12120 12121 12122 /** 12123 * Returns terms in a tree form. 12124 * 12125 * @param {Array} flatTerms Array of terms in flat format. 12126 * 12127 * @return {Array} Array of terms in tree format. 12128 */ 12129 function buildTermsTree(flatTerms) { 12130 const flatTermsWithParentAndChildren = flatTerms.map(term => { 12131 return { 12132 children: [], 12133 parent: null, 12134 ...term 12135 }; 12136 }); 12137 12138 // All terms should have a `parent` because we're about to index them by it. 12139 if (flatTermsWithParentAndChildren.some(({ 12140 parent 12141 }) => parent === null)) { 12142 return flatTermsWithParentAndChildren; 12143 } 12144 const termsByParent = flatTermsWithParentAndChildren.reduce((acc, term) => { 12145 const { 12146 parent 12147 } = term; 12148 if (!acc[parent]) { 12149 acc[parent] = []; 12150 } 12151 acc[parent].push(term); 12152 return acc; 12153 }, {}); 12154 const fillWithChildren = terms => { 12155 return terms.map(term => { 12156 const children = termsByParent[term.id]; 12157 return { 12158 ...term, 12159 children: children && children.length ? fillWithChildren(children) : [] 12160 }; 12161 }); 12162 }; 12163 return fillWithChildren(termsByParent['0'] || []); 12164 } 12165 const unescapeString = arg => { 12166 return (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(arg); 12167 }; 12168 12169 /** 12170 * Returns a term object with name unescaped. 12171 * 12172 * @param {Object} term The term object to unescape. 12173 * 12174 * @return {Object} Term object with name property unescaped. 12175 */ 12176 const unescapeTerm = term => { 12177 return { 12178 ...term, 12179 name: unescapeString(term.name) 12180 }; 12181 }; 12182 12183 /** 12184 * Returns an array of term objects with names unescaped. 12185 * The unescape of each term is performed using the unescapeTerm function. 12186 * 12187 * @param {Object[]} terms Array of term objects to unescape. 12188 * 12189 * @return {Object[]} Array of term objects unescaped. 12190 */ 12191 const unescapeTerms = terms => { 12192 return (terms !== null && terms !== void 0 ? terms : []).map(unescapeTerm); 12193 }; 12194 12195 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/page-attributes/parent.js 12196 /** 12197 * External dependencies 12198 */ 12199 12200 12201 /** 12202 * WordPress dependencies 12203 */ 12204 12205 12206 12207 12208 12209 12210 12211 12212 12213 12214 /** 12215 * Internal dependencies 12216 */ 12217 12218 12219 12220 12221 12222 function getTitle(post) { 12223 return post?.title?.rendered ? (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(post.title.rendered) : `#$post.id} (${(0,external_wp_i18n_namespaceObject.__)('no title')})`; 12224 } 12225 const getItemPriority = (name, searchValue) => { 12226 const normalizedName = remove_accents_default()(name || '').toLowerCase(); 12227 const normalizedSearch = remove_accents_default()(searchValue || '').toLowerCase(); 12228 if (normalizedName === normalizedSearch) { 12229 return 0; 12230 } 12231 if (normalizedName.startsWith(normalizedSearch)) { 12232 return normalizedName.length; 12233 } 12234 return Infinity; 12235 }; 12236 12237 /** 12238 * Renders the Page Attributes Parent component. A dropdown menu in an editor interface 12239 * for selecting the parent page of a given page. 12240 * 12241 * @return {Component|null} The component to be rendered. Return null if post type is not hierarchical. 12242 */ 12243 function PageAttributesParent() { 12244 const { 12245 editPost 12246 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 12247 const [fieldValue, setFieldValue] = (0,external_wp_element_namespaceObject.useState)(false); 12248 const { 12249 isHierarchical, 12250 parentPostId, 12251 parentPostTitle, 12252 pageItems 12253 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 12254 var _pType$hierarchical; 12255 const { 12256 getPostType, 12257 getEntityRecords, 12258 getEntityRecord 12259 } = select(external_wp_coreData_namespaceObject.store); 12260 const { 12261 getCurrentPostId, 12262 getEditedPostAttribute 12263 } = select(store_store); 12264 const postTypeSlug = getEditedPostAttribute('type'); 12265 const pageId = getEditedPostAttribute('parent'); 12266 const pType = getPostType(postTypeSlug); 12267 const postId = getCurrentPostId(); 12268 const postIsHierarchical = (_pType$hierarchical = pType?.hierarchical) !== null && _pType$hierarchical !== void 0 ? _pType$hierarchical : false; 12269 const query = { 12270 per_page: 100, 12271 exclude: postId, 12272 parent_exclude: postId, 12273 orderby: 'menu_order', 12274 order: 'asc', 12275 _fields: 'id,title,parent' 12276 }; 12277 12278 // Perform a search when the field is changed. 12279 if (!!fieldValue) { 12280 query.search = fieldValue; 12281 } 12282 const parentPost = pageId ? getEntityRecord('postType', postTypeSlug, pageId) : null; 12283 return { 12284 isHierarchical: postIsHierarchical, 12285 parentPostId: pageId, 12286 parentPostTitle: parentPost ? getTitle(parentPost) : '', 12287 pageItems: postIsHierarchical ? getEntityRecords('postType', postTypeSlug, query) : null 12288 }; 12289 }, [fieldValue]); 12290 const parentOptions = (0,external_wp_element_namespaceObject.useMemo)(() => { 12291 const getOptionsFromTree = (tree, level = 0) => { 12292 const mappedNodes = tree.map(treeNode => [{ 12293 value: treeNode.id, 12294 label: '— '.repeat(level) + (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(treeNode.name), 12295 rawName: treeNode.name 12296 }, ...getOptionsFromTree(treeNode.children || [], level + 1)]); 12297 const sortedNodes = mappedNodes.sort(([a], [b]) => { 12298 const priorityA = getItemPriority(a.rawName, fieldValue); 12299 const priorityB = getItemPriority(b.rawName, fieldValue); 12300 return priorityA >= priorityB ? 1 : -1; 12301 }); 12302 return sortedNodes.flat(); 12303 }; 12304 if (!pageItems) { 12305 return []; 12306 } 12307 let tree = pageItems.map(item => ({ 12308 id: item.id, 12309 parent: item.parent, 12310 name: getTitle(item) 12311 })); 12312 12313 // Only build a hierarchical tree when not searching. 12314 if (!fieldValue) { 12315 tree = buildTermsTree(tree); 12316 } 12317 const opts = getOptionsFromTree(tree); 12318 12319 // Ensure the current parent is in the options list. 12320 const optsHasParent = opts.find(item => item.value === parentPostId); 12321 if (parentPostTitle && !optsHasParent) { 12322 opts.unshift({ 12323 value: parentPostId, 12324 label: parentPostTitle 12325 }); 12326 } 12327 return opts; 12328 }, [pageItems, fieldValue, parentPostTitle, parentPostId]); 12329 if (!isHierarchical) { 12330 return null; 12331 } 12332 /** 12333 * Handle user input. 12334 * 12335 * @param {string} inputValue The current value of the input field. 12336 */ 12337 const handleKeydown = inputValue => { 12338 setFieldValue(inputValue); 12339 }; 12340 12341 /** 12342 * Handle author selection. 12343 * 12344 * @param {Object} selectedPostId The selected Author. 12345 */ 12346 const handleChange = selectedPostId => { 12347 editPost({ 12348 parent: selectedPostId 12349 }); 12350 }; 12351 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ComboboxControl, { 12352 __nextHasNoMarginBottom: true, 12353 __next40pxDefaultSize: true, 12354 className: "editor-page-attributes__parent", 12355 label: (0,external_wp_i18n_namespaceObject.__)('Parent'), 12356 help: (0,external_wp_i18n_namespaceObject.__)('Choose a parent page.'), 12357 value: parentPostId, 12358 options: parentOptions, 12359 onFilterValueChange: (0,external_wp_compose_namespaceObject.debounce)(handleKeydown, 300), 12360 onChange: handleChange, 12361 hideLabelFromVision: true 12362 }); 12363 } 12364 function PostParentToggle({ 12365 isOpen, 12366 onClick 12367 }) { 12368 const parentPost = (0,external_wp_data_namespaceObject.useSelect)(select => { 12369 const { 12370 getEditedPostAttribute 12371 } = select(store_store); 12372 const parentPostId = getEditedPostAttribute('parent'); 12373 if (!parentPostId) { 12374 return null; 12375 } 12376 const { 12377 getEntityRecord 12378 } = select(external_wp_coreData_namespaceObject.store); 12379 const postTypeSlug = getEditedPostAttribute('type'); 12380 return getEntityRecord('postType', postTypeSlug, parentPostId); 12381 }, []); 12382 const parentTitle = (0,external_wp_element_namespaceObject.useMemo)(() => !parentPost ? (0,external_wp_i18n_namespaceObject.__)('None') : getTitle(parentPost), [parentPost]); 12383 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 12384 size: "compact", 12385 className: "editor-post-parent__panel-toggle", 12386 variant: "tertiary", 12387 "aria-expanded": isOpen, 12388 "aria-label": 12389 // translators: %s: Current post parent. 12390 (0,external_wp_i18n_namespaceObject.sprintf)((0,external_wp_i18n_namespaceObject.__)('Change parent: %s'), parentTitle), 12391 onClick: onClick, 12392 children: parentTitle 12393 }); 12394 } 12395 function ParentRow() { 12396 const homeUrl = (0,external_wp_data_namespaceObject.useSelect)(select => { 12397 // Site index. 12398 return select(external_wp_coreData_namespaceObject.store).getEntityRecord('root', '__unstableBase')?.home; 12399 }, []); 12400 // Use internal state instead of a ref to make sure that the component 12401 // re-renders when the popover's anchor updates. 12402 const [popoverAnchor, setPopoverAnchor] = (0,external_wp_element_namespaceObject.useState)(null); 12403 // Memoize popoverProps to avoid returning a new object every time. 12404 const popoverProps = (0,external_wp_element_namespaceObject.useMemo)(() => ({ 12405 // Anchor the popover to the middle of the entire row so that it doesn't 12406 // move around when the label changes. 12407 anchor: popoverAnchor, 12408 placement: 'left-start', 12409 offset: 36, 12410 shift: true 12411 }), [popoverAnchor]); 12412 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { 12413 label: (0,external_wp_i18n_namespaceObject.__)('Parent'), 12414 ref: setPopoverAnchor, 12415 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Dropdown, { 12416 popoverProps: popoverProps, 12417 className: "editor-post-parent__panel-dropdown", 12418 contentClassName: "editor-post-parent__panel-dialog", 12419 focusOnMount: true, 12420 renderToggle: ({ 12421 isOpen, 12422 onToggle 12423 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostParentToggle, { 12424 isOpen: isOpen, 12425 onClick: onToggle 12426 }), 12427 renderContent: ({ 12428 onClose 12429 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 12430 className: "editor-post-parent", 12431 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalInspectorPopoverHeader, { 12432 title: (0,external_wp_i18n_namespaceObject.__)('Parent'), 12433 onClose: onClose 12434 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 12435 children: [(0,external_wp_element_namespaceObject.createInterpolateElement)((0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: The home URL of the WordPress installation without the scheme. */ 12436 (0,external_wp_i18n_namespaceObject.__)('Child pages inherit characteristics from their parent, such as URL structure. For instance, if "Pricing" is a child of "Services", its URL would be %s<wbr />/services<wbr />/pricing.'), (0,external_wp_url_namespaceObject.filterURLForDisplay)(homeUrl).replace(/([/.])/g, '<wbr />$1')), { 12437 wbr: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("wbr", {}) 12438 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { 12439 children: (0,external_wp_element_namespaceObject.createInterpolateElement)((0,external_wp_i18n_namespaceObject.__)('They also show up as sub-items in the default navigation menu. <a>Learn more.</a>'), { 12440 a: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ExternalLink, { 12441 href: (0,external_wp_i18n_namespaceObject.__)('https://wordpress.org/documentation/article/page-post-settings-sidebar/#page-attributes') 12442 }) 12443 }) 12444 })] 12445 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PageAttributesParent, {})] 12446 }) 12447 }) 12448 }); 12449 } 12450 /* harmony default export */ const page_attributes_parent = (PageAttributesParent); 12451 12452 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/page-attributes/panel.js 12453 /** 12454 * WordPress dependencies 12455 */ 12456 12457 12458 /** 12459 * Internal dependencies 12460 */ 12461 12462 12463 12464 12465 const PANEL_NAME = 'page-attributes'; 12466 function AttributesPanel() { 12467 const { 12468 isEnabled, 12469 postType 12470 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 12471 const { 12472 getEditedPostAttribute, 12473 isEditorPanelEnabled 12474 } = select(store_store); 12475 const { 12476 getPostType 12477 } = select(external_wp_coreData_namespaceObject.store); 12478 return { 12479 isEnabled: isEditorPanelEnabled(PANEL_NAME), 12480 postType: getPostType(getEditedPostAttribute('type')) 12481 }; 12482 }, []); 12483 if (!isEnabled || !postType) { 12484 return null; 12485 } 12486 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ParentRow, {}); 12487 } 12488 12489 /** 12490 * Renders the Page Attributes Panel component. 12491 * 12492 * @return {Component} The component to be rendered. 12493 */ 12494 function PageAttributesPanel() { 12495 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(page_attributes_check, { 12496 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(AttributesPanel, {}) 12497 }); 12498 } 12499 12500 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/add-template.js 12501 /** 12502 * WordPress dependencies 12503 */ 12504 12505 12506 const addTemplate = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 12507 viewBox: "0 0 24 24", 12508 xmlns: "http://www.w3.org/2000/svg", 12509 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 12510 fillRule: "evenodd", 12511 clipRule: "evenodd", 12512 d: "M18.5 5.5V8H20V5.5H22.5V4H20V1.5H18.5V4H16V5.5H18.5ZM13.9624 4H6C4.89543 4 4 4.89543 4 6V18C4 19.1046 4.89543 20 6 20H18C19.1046 20 20 19.1046 20 18V10.0391H18.5V18C18.5 18.2761 18.2761 18.5 18 18.5H10L10 10.4917L16.4589 10.5139L16.4641 9.01389L5.5 8.97618V6C5.5 5.72386 5.72386 5.5 6 5.5H13.9624V4ZM5.5 10.4762V18C5.5 18.2761 5.72386 18.5 6 18.5H8.5L8.5 10.4865L5.5 10.4762Z" 12513 }) 12514 }); 12515 /* harmony default export */ const add_template = (addTemplate); 12516 12517 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-template/create-new-template-modal.js 12518 /** 12519 * WordPress dependencies 12520 */ 12521 12522 12523 12524 12525 12526 12527 12528 /** 12529 * Internal dependencies 12530 */ 12531 12532 12533 12534 12535 const DEFAULT_TITLE = (0,external_wp_i18n_namespaceObject.__)('Custom Template'); 12536 function CreateNewTemplateModal({ 12537 onClose 12538 }) { 12539 const { 12540 defaultBlockTemplate, 12541 onNavigateToEntityRecord 12542 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 12543 const { 12544 getEditorSettings, 12545 getCurrentTemplateId 12546 } = select(store_store); 12547 return { 12548 defaultBlockTemplate: getEditorSettings().defaultBlockTemplate, 12549 onNavigateToEntityRecord: getEditorSettings().onNavigateToEntityRecord, 12550 getTemplateId: getCurrentTemplateId 12551 }; 12552 }); 12553 const { 12554 createTemplate 12555 } = unlock((0,external_wp_data_namespaceObject.useDispatch)(store_store)); 12556 const [title, setTitle] = (0,external_wp_element_namespaceObject.useState)(''); 12557 const [isBusy, setIsBusy] = (0,external_wp_element_namespaceObject.useState)(false); 12558 const cancel = () => { 12559 setTitle(''); 12560 onClose(); 12561 }; 12562 const submit = async event => { 12563 event.preventDefault(); 12564 if (isBusy) { 12565 return; 12566 } 12567 setIsBusy(true); 12568 const newTemplateContent = defaultBlockTemplate !== null && defaultBlockTemplate !== void 0 ? defaultBlockTemplate : (0,external_wp_blocks_namespaceObject.serialize)([(0,external_wp_blocks_namespaceObject.createBlock)('core/group', { 12569 tagName: 'header', 12570 layout: { 12571 inherit: true 12572 } 12573 }, [(0,external_wp_blocks_namespaceObject.createBlock)('core/site-title'), (0,external_wp_blocks_namespaceObject.createBlock)('core/site-tagline')]), (0,external_wp_blocks_namespaceObject.createBlock)('core/separator'), (0,external_wp_blocks_namespaceObject.createBlock)('core/group', { 12574 tagName: 'main' 12575 }, [(0,external_wp_blocks_namespaceObject.createBlock)('core/group', { 12576 layout: { 12577 inherit: true 12578 } 12579 }, [(0,external_wp_blocks_namespaceObject.createBlock)('core/post-title')]), (0,external_wp_blocks_namespaceObject.createBlock)('core/post-content', { 12580 layout: { 12581 inherit: true 12582 } 12583 })])]); 12584 const newTemplate = await createTemplate({ 12585 slug: (0,external_wp_url_namespaceObject.cleanForSlug)(title || DEFAULT_TITLE), 12586 content: newTemplateContent, 12587 title: title || DEFAULT_TITLE 12588 }); 12589 setIsBusy(false); 12590 onNavigateToEntityRecord({ 12591 postId: newTemplate.id, 12592 postType: 'wp_template' 12593 }); 12594 cancel(); 12595 }; 12596 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Modal, { 12597 title: (0,external_wp_i18n_namespaceObject.__)('Create custom template'), 12598 onRequestClose: cancel, 12599 focusOnMount: "firstContentElement", 12600 size: "small", 12601 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("form", { 12602 className: "editor-post-template__create-form", 12603 onSubmit: submit, 12604 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { 12605 spacing: "3", 12606 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.TextControl, { 12607 __next40pxDefaultSize: true, 12608 __nextHasNoMarginBottom: true, 12609 label: (0,external_wp_i18n_namespaceObject.__)('Name'), 12610 value: title, 12611 onChange: setTitle, 12612 placeholder: DEFAULT_TITLE, 12613 disabled: isBusy, 12614 help: (0,external_wp_i18n_namespaceObject.__)('Describe the template, e.g. "Post with sidebar". A custom template can be manually applied to any post or page.') 12615 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, { 12616 justify: "right", 12617 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 12618 __next40pxDefaultSize: true, 12619 variant: "tertiary", 12620 onClick: cancel, 12621 children: (0,external_wp_i18n_namespaceObject.__)('Cancel') 12622 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 12623 __next40pxDefaultSize: true, 12624 variant: "primary", 12625 type: "submit", 12626 isBusy: isBusy, 12627 "aria-disabled": isBusy, 12628 children: (0,external_wp_i18n_namespaceObject.__)('Create') 12629 })] 12630 })] 12631 }) 12632 }) 12633 }); 12634 } 12635 12636 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-template/hooks.js 12637 /** 12638 * WordPress dependencies 12639 */ 12640 12641 12642 12643 12644 /** 12645 * Internal dependencies 12646 */ 12647 12648 function useEditedPostContext() { 12649 return (0,external_wp_data_namespaceObject.useSelect)(select => { 12650 const { 12651 getCurrentPostId, 12652 getCurrentPostType 12653 } = select(store_store); 12654 return { 12655 postId: getCurrentPostId(), 12656 postType: getCurrentPostType() 12657 }; 12658 }, []); 12659 } 12660 function useAllowSwitchingTemplates() { 12661 const { 12662 postType, 12663 postId 12664 } = useEditedPostContext(); 12665 return (0,external_wp_data_namespaceObject.useSelect)(select => { 12666 const { 12667 canUser, 12668 getEntityRecord, 12669 getEntityRecords 12670 } = select(external_wp_coreData_namespaceObject.store); 12671 const siteSettings = canUser('read', { 12672 kind: 'root', 12673 name: 'site' 12674 }) ? getEntityRecord('root', 'site') : undefined; 12675 const templates = getEntityRecords('postType', 'wp_template', { 12676 per_page: -1 12677 }); 12678 const isPostsPage = +postId === siteSettings?.page_for_posts; 12679 // If current page is set front page or posts page, we also need 12680 // to check if the current theme has a template for it. If not 12681 const isFrontPage = postType === 'page' && +postId === siteSettings?.page_on_front && templates?.some(({ 12682 slug 12683 }) => slug === 'front-page'); 12684 return !isPostsPage && !isFrontPage; 12685 }, [postId, postType]); 12686 } 12687 function useTemplates(postType) { 12688 return (0,external_wp_data_namespaceObject.useSelect)(select => select(external_wp_coreData_namespaceObject.store).getEntityRecords('postType', 'wp_template', { 12689 per_page: -1, 12690 post_type: postType 12691 }), [postType]); 12692 } 12693 function useAvailableTemplates(postType) { 12694 const currentTemplateSlug = useCurrentTemplateSlug(); 12695 const allowSwitchingTemplate = useAllowSwitchingTemplates(); 12696 const templates = useTemplates(postType); 12697 return (0,external_wp_element_namespaceObject.useMemo)(() => allowSwitchingTemplate && templates?.filter(template => template.is_custom && template.slug !== currentTemplateSlug && !!template.content.raw // Skip empty templates. 12698 ), [templates, currentTemplateSlug, allowSwitchingTemplate]); 12699 } 12700 function useCurrentTemplateSlug() { 12701 const { 12702 postType, 12703 postId 12704 } = useEditedPostContext(); 12705 const templates = useTemplates(postType); 12706 const entityTemplate = (0,external_wp_data_namespaceObject.useSelect)(select => { 12707 const post = select(external_wp_coreData_namespaceObject.store).getEditedEntityRecord('postType', postType, postId); 12708 return post?.template; 12709 }, [postType, postId]); 12710 if (!entityTemplate) { 12711 return; 12712 } 12713 // If a page has a `template` set and is not included in the list 12714 // of the theme's templates, do not return it, in order to resolve 12715 // to the current theme's default template. 12716 return templates?.find(template => template.slug === entityTemplate)?.slug; 12717 } 12718 12719 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-template/classic-theme.js 12720 /** 12721 * WordPress dependencies 12722 */ 12723 12724 12725 12726 12727 12728 12729 12730 12731 12732 /** 12733 * Internal dependencies 12734 */ 12735 12736 12737 12738 12739 12740 const POPOVER_PROPS = { 12741 className: 'editor-post-template__dropdown', 12742 placement: 'bottom-start' 12743 }; 12744 function PostTemplateToggle({ 12745 isOpen, 12746 onClick 12747 }) { 12748 const templateTitle = (0,external_wp_data_namespaceObject.useSelect)(select => { 12749 const templateSlug = select(store_store).getEditedPostAttribute('template'); 12750 const { 12751 supportsTemplateMode, 12752 availableTemplates 12753 } = select(store_store).getEditorSettings(); 12754 if (!supportsTemplateMode && availableTemplates[templateSlug]) { 12755 return availableTemplates[templateSlug]; 12756 } 12757 const template = select(external_wp_coreData_namespaceObject.store).canUser('create', { 12758 kind: 'postType', 12759 name: 'wp_template' 12760 }) && select(store_store).getCurrentTemplateId(); 12761 return template?.title || template?.slug || availableTemplates?.[templateSlug]; 12762 }, []); 12763 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 12764 __next40pxDefaultSize: true, 12765 variant: "tertiary", 12766 "aria-expanded": isOpen, 12767 "aria-label": (0,external_wp_i18n_namespaceObject.__)('Template options'), 12768 onClick: onClick, 12769 children: templateTitle !== null && templateTitle !== void 0 ? templateTitle : (0,external_wp_i18n_namespaceObject.__)('Default template') 12770 }); 12771 } 12772 12773 /** 12774 * Renders the dropdown content for selecting a post template. 12775 * 12776 * @param {Object} props The component props. 12777 * @param {Function} props.onClose The function to close the dropdown. 12778 * 12779 * @return {JSX.Element} The rendered dropdown content. 12780 */ 12781 function PostTemplateDropdownContent({ 12782 onClose 12783 }) { 12784 var _options$find, _selectedOption$value; 12785 const allowSwitchingTemplate = useAllowSwitchingTemplates(); 12786 const { 12787 availableTemplates, 12788 fetchedTemplates, 12789 selectedTemplateSlug, 12790 canCreate, 12791 canEdit, 12792 currentTemplateId, 12793 onNavigateToEntityRecord, 12794 getEditorSettings 12795 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 12796 const { 12797 canUser, 12798 getEntityRecords 12799 } = select(external_wp_coreData_namespaceObject.store); 12800 const editorSettings = select(store_store).getEditorSettings(); 12801 const canCreateTemplates = canUser('create', { 12802 kind: 'postType', 12803 name: 'wp_template' 12804 }); 12805 const _currentTemplateId = select(store_store).getCurrentTemplateId(); 12806 return { 12807 availableTemplates: editorSettings.availableTemplates, 12808 fetchedTemplates: canCreateTemplates ? getEntityRecords('postType', 'wp_template', { 12809 post_type: select(store_store).getCurrentPostType(), 12810 per_page: -1 12811 }) : undefined, 12812 selectedTemplateSlug: select(store_store).getEditedPostAttribute('template'), 12813 canCreate: allowSwitchingTemplate && canCreateTemplates && editorSettings.supportsTemplateMode, 12814 canEdit: allowSwitchingTemplate && canCreateTemplates && editorSettings.supportsTemplateMode && !!_currentTemplateId, 12815 currentTemplateId: _currentTemplateId, 12816 onNavigateToEntityRecord: editorSettings.onNavigateToEntityRecord, 12817 getEditorSettings: select(store_store).getEditorSettings 12818 }; 12819 }, [allowSwitchingTemplate]); 12820 const options = (0,external_wp_element_namespaceObject.useMemo)(() => Object.entries({ 12821 ...availableTemplates, 12822 ...Object.fromEntries((fetchedTemplates !== null && fetchedTemplates !== void 0 ? fetchedTemplates : []).map(({ 12823 slug, 12824 title 12825 }) => [slug, title.rendered])) 12826 }).map(([slug, title]) => ({ 12827 value: slug, 12828 label: title 12829 })), [availableTemplates, fetchedTemplates]); 12830 const selectedOption = (_options$find = options.find(option => option.value === selectedTemplateSlug)) !== null && _options$find !== void 0 ? _options$find : options.find(option => !option.value); // The default option has '' value. 12831 12832 const { 12833 editPost 12834 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 12835 const { 12836 createSuccessNotice 12837 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); 12838 const [isCreateModalOpen, setIsCreateModalOpen] = (0,external_wp_element_namespaceObject.useState)(false); 12839 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 12840 className: "editor-post-template__classic-theme-dropdown", 12841 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalInspectorPopoverHeader, { 12842 title: (0,external_wp_i18n_namespaceObject.__)('Template'), 12843 help: (0,external_wp_i18n_namespaceObject.__)('Templates define the way content is displayed when viewing your site.'), 12844 actions: canCreate ? [{ 12845 icon: add_template, 12846 label: (0,external_wp_i18n_namespaceObject.__)('Add template'), 12847 onClick: () => setIsCreateModalOpen(true) 12848 }] : [], 12849 onClose: onClose 12850 }), !allowSwitchingTemplate ? /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Notice, { 12851 status: "warning", 12852 isDismissible: false, 12853 children: (0,external_wp_i18n_namespaceObject.__)('The posts page template cannot be changed.') 12854 }) : /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.SelectControl, { 12855 __next40pxDefaultSize: true, 12856 __nextHasNoMarginBottom: true, 12857 hideLabelFromVision: true, 12858 label: (0,external_wp_i18n_namespaceObject.__)('Template'), 12859 value: (_selectedOption$value = selectedOption?.value) !== null && _selectedOption$value !== void 0 ? _selectedOption$value : '', 12860 options: options, 12861 onChange: slug => editPost({ 12862 template: slug || '' 12863 }) 12864 }), canEdit && onNavigateToEntityRecord && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { 12865 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button 12866 // TODO: Switch to `true` (40px size) if possible 12867 , { 12868 __next40pxDefaultSize: false, 12869 variant: "link", 12870 onClick: () => { 12871 onNavigateToEntityRecord({ 12872 postId: currentTemplateId, 12873 postType: 'wp_template' 12874 }); 12875 onClose(); 12876 createSuccessNotice((0,external_wp_i18n_namespaceObject.__)('Editing template. Changes made here affect all posts and pages that use the template.'), { 12877 type: 'snackbar', 12878 actions: [{ 12879 label: (0,external_wp_i18n_namespaceObject.__)('Go back'), 12880 onClick: () => getEditorSettings().onNavigateToPreviousEntityRecord() 12881 }] 12882 }); 12883 }, 12884 children: (0,external_wp_i18n_namespaceObject.__)('Edit template') 12885 }) 12886 }), isCreateModalOpen && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(CreateNewTemplateModal, { 12887 onClose: () => setIsCreateModalOpen(false) 12888 })] 12889 }); 12890 } 12891 function ClassicThemeControl() { 12892 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Dropdown, { 12893 popoverProps: POPOVER_PROPS, 12894 focusOnMount: true, 12895 renderToggle: ({ 12896 isOpen, 12897 onToggle 12898 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostTemplateToggle, { 12899 isOpen: isOpen, 12900 onClick: onToggle 12901 }), 12902 renderContent: ({ 12903 onClose 12904 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostTemplateDropdownContent, { 12905 onClose: onClose 12906 }) 12907 }); 12908 } 12909 12910 /** 12911 * Provides a dropdown menu for selecting and managing post templates. 12912 * 12913 * The dropdown menu includes a button for toggling the menu, a list of available templates, and options for creating and editing templates. 12914 * 12915 * @return {JSX.Element} The rendered ClassicThemeControl component. 12916 */ 12917 /* harmony default export */ const classic_theme = (ClassicThemeControl); 12918 12919 ;// CONCATENATED MODULE: external ["wp","warning"] 12920 const external_wp_warning_namespaceObject = window["wp"]["warning"]; 12921 var external_wp_warning_default = /*#__PURE__*/__webpack_require__.n(external_wp_warning_namespaceObject); 12922 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/preferences-modal/enable-panel.js 12923 /** 12924 * WordPress dependencies 12925 */ 12926 12927 12928 12929 12930 /** 12931 * Internal dependencies 12932 */ 12933 12934 12935 const { 12936 PreferenceBaseOption 12937 } = unlock(external_wp_preferences_namespaceObject.privateApis); 12938 /* harmony default export */ const enable_panel = ((0,external_wp_compose_namespaceObject.compose)((0,external_wp_data_namespaceObject.withSelect)((select, { 12939 panelName 12940 }) => { 12941 const { 12942 isEditorPanelEnabled, 12943 isEditorPanelRemoved 12944 } = select(store_store); 12945 return { 12946 isRemoved: isEditorPanelRemoved(panelName), 12947 isChecked: isEditorPanelEnabled(panelName) 12948 }; 12949 }), (0,external_wp_compose_namespaceObject.ifCondition)(({ 12950 isRemoved 12951 }) => !isRemoved), (0,external_wp_data_namespaceObject.withDispatch)((dispatch, { 12952 panelName 12953 }) => ({ 12954 onChange: () => dispatch(store_store).toggleEditorPanelEnabled(panelName) 12955 })))(PreferenceBaseOption)); 12956 12957 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/preferences-modal/enable-plugin-document-setting-panel.js 12958 /** 12959 * WordPress dependencies 12960 */ 12961 12962 12963 /** 12964 * Internal dependencies 12965 */ 12966 12967 12968 const { 12969 Fill, 12970 Slot 12971 } = (0,external_wp_components_namespaceObject.createSlotFill)('EnablePluginDocumentSettingPanelOption'); 12972 const EnablePluginDocumentSettingPanelOption = ({ 12973 label, 12974 panelName 12975 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(Fill, { 12976 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(enable_panel, { 12977 label: label, 12978 panelName: panelName 12979 }) 12980 }); 12981 EnablePluginDocumentSettingPanelOption.Slot = Slot; 12982 /* harmony default export */ const enable_plugin_document_setting_panel = (EnablePluginDocumentSettingPanelOption); 12983 12984 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/plugin-document-setting-panel/index.js 12985 /** 12986 * WordPress dependencies 12987 */ 12988 12989 12990 12991 12992 12993 /** 12994 * Internal dependencies 12995 */ 12996 12997 12998 12999 13000 13001 const { 13002 Fill: plugin_document_setting_panel_Fill, 13003 Slot: plugin_document_setting_panel_Slot 13004 } = (0,external_wp_components_namespaceObject.createSlotFill)('PluginDocumentSettingPanel'); 13005 13006 /** 13007 * Renders items below the Status & Availability panel in the Document Sidebar. 13008 * 13009 * @param {Object} props Component properties. 13010 * @param {string} props.name Required. A machine-friendly name for the panel. 13011 * @param {string} [props.className] An optional class name added to the row. 13012 * @param {string} [props.title] The title of the panel 13013 * @param {WPBlockTypeIconRender} [props.icon=inherits from the plugin] The [Dashicon](https://developer.wordpress.org/resource/dashicons/) icon slug string, or an SVG WP element, to be rendered when the sidebar is pinned to toolbar. 13014 * @param {Element} props.children Children to be rendered 13015 * 13016 * @example 13017 * ```js 13018 * // Using ES5 syntax 13019 * var el = React.createElement; 13020 * var __ = wp.i18n.__; 13021 * var registerPlugin = wp.plugins.registerPlugin; 13022 * var PluginDocumentSettingPanel = wp.editor.PluginDocumentSettingPanel; 13023 * 13024 * function MyDocumentSettingPlugin() { 13025 * return el( 13026 * PluginDocumentSettingPanel, 13027 * { 13028 * className: 'my-document-setting-plugin', 13029 * title: 'My Panel', 13030 * name: 'my-panel', 13031 * }, 13032 * __( 'My Document Setting Panel' ) 13033 * ); 13034 * } 13035 * 13036 * registerPlugin( 'my-document-setting-plugin', { 13037 * render: MyDocumentSettingPlugin 13038 * } ); 13039 * ``` 13040 * 13041 * @example 13042 * ```jsx 13043 * // Using ESNext syntax 13044 * import { registerPlugin } from '@wordpress/plugins'; 13045 * import { PluginDocumentSettingPanel } from '@wordpress/editor'; 13046 * 13047 * const MyDocumentSettingTest = () => ( 13048 * <PluginDocumentSettingPanel className="my-document-setting-plugin" title="My Panel" name="my-panel"> 13049 * <p>My Document Setting Panel</p> 13050 * </PluginDocumentSettingPanel> 13051 * ); 13052 * 13053 * registerPlugin( 'document-setting-test', { render: MyDocumentSettingTest } ); 13054 * ``` 13055 * 13056 * @return {Component} The component to be rendered. 13057 */ 13058 const PluginDocumentSettingPanel = ({ 13059 name, 13060 className, 13061 title, 13062 icon, 13063 children 13064 }) => { 13065 const { 13066 name: pluginName 13067 } = (0,external_wp_plugins_namespaceObject.usePluginContext)(); 13068 const panelName = `$pluginName}/$name}`; 13069 const { 13070 opened, 13071 isEnabled 13072 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 13073 const { 13074 isEditorPanelOpened, 13075 isEditorPanelEnabled 13076 } = select(store_store); 13077 return { 13078 opened: isEditorPanelOpened(panelName), 13079 isEnabled: isEditorPanelEnabled(panelName) 13080 }; 13081 }, [panelName]); 13082 const { 13083 toggleEditorPanelOpened 13084 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 13085 if (undefined === name) { 13086 true ? external_wp_warning_default()('PluginDocumentSettingPanel requires a name property.') : 0; 13087 } 13088 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 13089 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(enable_plugin_document_setting_panel, { 13090 label: title, 13091 panelName: panelName 13092 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(plugin_document_setting_panel_Fill, { 13093 children: isEnabled && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelBody, { 13094 className: className, 13095 title: title, 13096 icon: icon, 13097 opened: opened, 13098 onToggle: () => toggleEditorPanelOpened(panelName), 13099 children: children 13100 }) 13101 })] 13102 }); 13103 }; 13104 PluginDocumentSettingPanel.Slot = plugin_document_setting_panel_Slot; 13105 /* harmony default export */ const plugin_document_setting_panel = (PluginDocumentSettingPanel); 13106 13107 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-settings-menu/plugin-block-settings-menu-item.js 13108 /** 13109 * WordPress dependencies 13110 */ 13111 13112 13113 13114 13115 const isEverySelectedBlockAllowed = (selected, allowed) => selected.filter(id => !allowed.includes(id)).length === 0; 13116 13117 /** 13118 * Plugins may want to add an item to the menu either for every block 13119 * or only for the specific ones provided in the `allowedBlocks` component property. 13120 * 13121 * If there are multiple blocks selected the item will be rendered if every block 13122 * is of one allowed type (not necessarily the same). 13123 * 13124 * @param {string[]} selectedBlocks Array containing the names of the blocks selected 13125 * @param {string[]} allowedBlocks Array containing the names of the blocks allowed 13126 * @return {boolean} Whether the item will be rendered or not. 13127 */ 13128 const shouldRenderItem = (selectedBlocks, allowedBlocks) => !Array.isArray(allowedBlocks) || isEverySelectedBlockAllowed(selectedBlocks, allowedBlocks); 13129 13130 /** 13131 * Renders a new item in the block settings menu. 13132 * 13133 * @param {Object} props Component props. 13134 * @param {Array} [props.allowedBlocks] An array containing a list of block names for which the item should be shown. If not present, it'll be rendered for any block. If multiple blocks are selected, it'll be shown if and only if all of them are in the allowed list. 13135 * @param {WPBlockTypeIconRender} [props.icon] The [Dashicon](https://developer.wordpress.org/resource/dashicons/) icon slug string, or an SVG WP element. 13136 * @param {string} props.label The menu item text. 13137 * @param {Function} props.onClick Callback function to be executed when the user click the menu item. 13138 * @param {boolean} [props.small] Whether to render the label or not. 13139 * @param {string} [props.role] The ARIA role for the menu item. 13140 * 13141 * @example 13142 * ```js 13143 * // Using ES5 syntax 13144 * var __ = wp.i18n.__; 13145 * var PluginBlockSettingsMenuItem = wp.editor.PluginBlockSettingsMenuItem; 13146 * 13147 * function doOnClick(){ 13148 * // To be called when the user clicks the menu item. 13149 * } 13150 * 13151 * function MyPluginBlockSettingsMenuItem() { 13152 * return React.createElement( 13153 * PluginBlockSettingsMenuItem, 13154 * { 13155 * allowedBlocks: [ 'core/paragraph' ], 13156 * icon: 'dashicon-name', 13157 * label: __( 'Menu item text' ), 13158 * onClick: doOnClick, 13159 * } 13160 * ); 13161 * } 13162 * ``` 13163 * 13164 * @example 13165 * ```jsx 13166 * // Using ESNext syntax 13167 * import { __ } from '@wordpress/i18n'; 13168 * import { PluginBlockSettingsMenuItem } from '@wordpress/editor'; 13169 * 13170 * const doOnClick = ( ) => { 13171 * // To be called when the user clicks the menu item. 13172 * }; 13173 * 13174 * const MyPluginBlockSettingsMenuItem = () => ( 13175 * <PluginBlockSettingsMenuItem 13176 * allowedBlocks={ [ 'core/paragraph' ] } 13177 * icon='dashicon-name' 13178 * label={ __( 'Menu item text' ) } 13179 * onClick={ doOnClick } /> 13180 * ); 13181 * ``` 13182 * 13183 * @return {Component} The component to be rendered. 13184 */ 13185 const PluginBlockSettingsMenuItem = ({ 13186 allowedBlocks, 13187 icon, 13188 label, 13189 onClick, 13190 small, 13191 role 13192 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.BlockSettingsMenuControls, { 13193 children: ({ 13194 selectedBlocks, 13195 onClose 13196 }) => { 13197 if (!shouldRenderItem(selectedBlocks, allowedBlocks)) { 13198 return null; 13199 } 13200 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItem, { 13201 onClick: (0,external_wp_compose_namespaceObject.compose)(onClick, onClose), 13202 icon: icon, 13203 label: small ? label : undefined, 13204 role: role, 13205 children: !small && label 13206 }); 13207 } 13208 }); 13209 /* harmony default export */ const plugin_block_settings_menu_item = (PluginBlockSettingsMenuItem); 13210 13211 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/plugin-more-menu-item/index.js 13212 /** 13213 * WordPress dependencies 13214 */ 13215 13216 13217 13218 13219 13220 /** 13221 * Renders a menu item in `Plugins` group in `More Menu` drop down, and can be used to as a button or link depending on the props provided. 13222 * The text within the component appears as the menu item label. 13223 * 13224 * @param {Object} props Component properties. 13225 * @param {string} [props.href] When `href` is provided then the menu item is represented as an anchor rather than button. It corresponds to the `href` attribute of the anchor. 13226 * @param {WPBlockTypeIconRender} [props.icon=inherits from the plugin] The [Dashicon](https://developer.wordpress.org/resource/dashicons/) icon slug string, or an SVG WP element, to be rendered to the left of the menu item label. 13227 * @param {Function} [props.onClick=noop] The callback function to be executed when the user clicks the menu item. 13228 * @param {...*} [props.other] Any additional props are passed through to the underlying [Button](/packages/components/src/button/README.md) component. 13229 * 13230 * @example 13231 * ```js 13232 * // Using ES5 syntax 13233 * var __ = wp.i18n.__; 13234 * var PluginMoreMenuItem = wp.editor.PluginMoreMenuItem; 13235 * var moreIcon = wp.element.createElement( 'svg' ); //... svg element. 13236 * 13237 * function onButtonClick() { 13238 * alert( 'Button clicked.' ); 13239 * } 13240 * 13241 * function MyButtonMoreMenuItem() { 13242 * return wp.element.createElement( 13243 * PluginMoreMenuItem, 13244 * { 13245 * icon: moreIcon, 13246 * onClick: onButtonClick, 13247 * }, 13248 * __( 'My button title' ) 13249 * ); 13250 * } 13251 * ``` 13252 * 13253 * @example 13254 * ```jsx 13255 * // Using ESNext syntax 13256 * import { __ } from '@wordpress/i18n'; 13257 * import { PluginMoreMenuItem } from '@wordpress/editor'; 13258 * import { more } from '@wordpress/icons'; 13259 * 13260 * function onButtonClick() { 13261 * alert( 'Button clicked.' ); 13262 * } 13263 * 13264 * const MyButtonMoreMenuItem = () => ( 13265 * <PluginMoreMenuItem 13266 * icon={ more } 13267 * onClick={ onButtonClick } 13268 * > 13269 * { __( 'My button title' ) } 13270 * </PluginMoreMenuItem> 13271 * ); 13272 * ``` 13273 * 13274 * @return {Component} The component to be rendered. 13275 */ 13276 /* harmony default export */ const plugin_more_menu_item = ((0,external_wp_compose_namespaceObject.compose)((0,external_wp_plugins_namespaceObject.withPluginContext)((context, ownProps) => { 13277 var _ownProps$as; 13278 return { 13279 as: (_ownProps$as = ownProps.as) !== null && _ownProps$as !== void 0 ? _ownProps$as : external_wp_components_namespaceObject.MenuItem, 13280 icon: ownProps.icon || context.icon, 13281 name: 'core/plugin-more-menu' 13282 }; 13283 }))(action_item)); 13284 13285 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/plugin-post-publish-panel/index.js 13286 /** 13287 * WordPress dependencies 13288 */ 13289 13290 13291 13292 const { 13293 Fill: plugin_post_publish_panel_Fill, 13294 Slot: plugin_post_publish_panel_Slot 13295 } = (0,external_wp_components_namespaceObject.createSlotFill)('PluginPostPublishPanel'); 13296 13297 /** 13298 * Renders provided content to the post-publish panel in the publish flow 13299 * (side panel that opens after a user publishes the post). 13300 * 13301 * @param {Object} props Component properties. 13302 * @param {string} [props.className] An optional class name added to the panel. 13303 * @param {string} [props.title] Title displayed at the top of the panel. 13304 * @param {boolean} [props.initialOpen=false] Whether to have the panel initially opened. When no title is provided it is always opened. 13305 * @param {WPBlockTypeIconRender} [props.icon=inherits from the plugin] The [Dashicon](https://developer.wordpress.org/resource/dashicons/) icon slug string, or an SVG WP element, to be rendered when the sidebar is pinned to toolbar. 13306 * @param {Element} props.children Children to be rendered 13307 * 13308 * @example 13309 * ```jsx 13310 * // Using ESNext syntax 13311 * import { __ } from '@wordpress/i18n'; 13312 * import { PluginPostPublishPanel } from '@wordpress/editor'; 13313 * 13314 * const MyPluginPostPublishPanel = () => ( 13315 * <PluginPostPublishPanel 13316 * className="my-plugin-post-publish-panel" 13317 * title={ __( 'My panel title' ) } 13318 * initialOpen={ true } 13319 * > 13320 * { __( 'My panel content' ) } 13321 * </PluginPostPublishPanel> 13322 * ); 13323 * ``` 13324 * 13325 * @return {Component} The component to be rendered. 13326 */ 13327 const PluginPostPublishPanel = ({ 13328 children, 13329 className, 13330 title, 13331 initialOpen = false, 13332 icon 13333 }) => { 13334 const { 13335 icon: pluginIcon 13336 } = (0,external_wp_plugins_namespaceObject.usePluginContext)(); 13337 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(plugin_post_publish_panel_Fill, { 13338 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelBody, { 13339 className: className, 13340 initialOpen: initialOpen || !title, 13341 title: title, 13342 icon: icon !== null && icon !== void 0 ? icon : pluginIcon, 13343 children: children 13344 }) 13345 }); 13346 }; 13347 PluginPostPublishPanel.Slot = plugin_post_publish_panel_Slot; 13348 /* harmony default export */ const plugin_post_publish_panel = (PluginPostPublishPanel); 13349 13350 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/plugin-post-status-info/index.js 13351 /** 13352 * Defines as extensibility slot for the Summary panel. 13353 */ 13354 13355 /** 13356 * WordPress dependencies 13357 */ 13358 13359 13360 const { 13361 Fill: plugin_post_status_info_Fill, 13362 Slot: plugin_post_status_info_Slot 13363 } = (0,external_wp_components_namespaceObject.createSlotFill)('PluginPostStatusInfo'); 13364 13365 /** 13366 * Renders a row in the Summary panel of the Document sidebar. 13367 * It should be noted that this is named and implemented around the function it serves 13368 * and not its location, which may change in future iterations. 13369 * 13370 * @param {Object} props Component properties. 13371 * @param {string} [props.className] An optional class name added to the row. 13372 * @param {Element} props.children Children to be rendered. 13373 * 13374 * @example 13375 * ```js 13376 * // Using ES5 syntax 13377 * var __ = wp.i18n.__; 13378 * var PluginPostStatusInfo = wp.editor.PluginPostStatusInfo; 13379 * 13380 * function MyPluginPostStatusInfo() { 13381 * return React.createElement( 13382 * PluginPostStatusInfo, 13383 * { 13384 * className: 'my-plugin-post-status-info', 13385 * }, 13386 * __( 'My post status info' ) 13387 * ) 13388 * } 13389 * ``` 13390 * 13391 * @example 13392 * ```jsx 13393 * // Using ESNext syntax 13394 * import { __ } from '@wordpress/i18n'; 13395 * import { PluginPostStatusInfo } from '@wordpress/editor'; 13396 * 13397 * const MyPluginPostStatusInfo = () => ( 13398 * <PluginPostStatusInfo 13399 * className="my-plugin-post-status-info" 13400 * > 13401 * { __( 'My post status info' ) } 13402 * </PluginPostStatusInfo> 13403 * ); 13404 * ``` 13405 * 13406 * @return {Component} The component to be rendered. 13407 */ 13408 const PluginPostStatusInfo = ({ 13409 children, 13410 className 13411 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(plugin_post_status_info_Fill, { 13412 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelRow, { 13413 className: className, 13414 children: children 13415 }) 13416 }); 13417 PluginPostStatusInfo.Slot = plugin_post_status_info_Slot; 13418 /* harmony default export */ const plugin_post_status_info = (PluginPostStatusInfo); 13419 13420 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/plugin-pre-publish-panel/index.js 13421 /** 13422 * WordPress dependencies 13423 */ 13424 13425 13426 13427 const { 13428 Fill: plugin_pre_publish_panel_Fill, 13429 Slot: plugin_pre_publish_panel_Slot 13430 } = (0,external_wp_components_namespaceObject.createSlotFill)('PluginPrePublishPanel'); 13431 13432 /** 13433 * Renders provided content to the pre-publish side panel in the publish flow 13434 * (side panel that opens when a user first pushes "Publish" from the main editor). 13435 * 13436 * @param {Object} props Component props. 13437 * @param {string} [props.className] An optional class name added to the panel. 13438 * @param {string} [props.title] Title displayed at the top of the panel. 13439 * @param {boolean} [props.initialOpen=false] Whether to have the panel initially opened. 13440 * When no title is provided it is always opened. 13441 * @param {WPBlockTypeIconRender} [props.icon=inherits from the plugin] The [Dashicon](https://developer.wordpress.org/resource/dashicons/) 13442 * icon slug string, or an SVG WP element, to be rendered when 13443 * the sidebar is pinned to toolbar. 13444 * @param {Element} props.children Children to be rendered 13445 * 13446 * @example 13447 * ```jsx 13448 * // Using ESNext syntax 13449 * import { __ } from '@wordpress/i18n'; 13450 * import { PluginPrePublishPanel } from '@wordpress/editor'; 13451 * 13452 * const MyPluginPrePublishPanel = () => ( 13453 * <PluginPrePublishPanel 13454 * className="my-plugin-pre-publish-panel" 13455 * title={ __( 'My panel title' ) } 13456 * initialOpen={ true } 13457 * > 13458 * { __( 'My panel content' ) } 13459 * </PluginPrePublishPanel> 13460 * ); 13461 * ``` 13462 * 13463 * @return {Component} The component to be rendered. 13464 */ 13465 const PluginPrePublishPanel = ({ 13466 children, 13467 className, 13468 title, 13469 initialOpen = false, 13470 icon 13471 }) => { 13472 const { 13473 icon: pluginIcon 13474 } = (0,external_wp_plugins_namespaceObject.usePluginContext)(); 13475 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(plugin_pre_publish_panel_Fill, { 13476 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelBody, { 13477 className: className, 13478 initialOpen: initialOpen || !title, 13479 title: title, 13480 icon: icon !== null && icon !== void 0 ? icon : pluginIcon, 13481 children: children 13482 }) 13483 }); 13484 }; 13485 PluginPrePublishPanel.Slot = plugin_pre_publish_panel_Slot; 13486 /* harmony default export */ const plugin_pre_publish_panel = (PluginPrePublishPanel); 13487 13488 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/plugin-preview-menu-item/index.js 13489 /** 13490 * WordPress dependencies 13491 */ 13492 13493 13494 13495 13496 13497 /** 13498 * Renders a menu item in the Preview dropdown, which can be used as a button or link depending on the props provided. 13499 * The text within the component appears as the menu item label. 13500 * 13501 * @param {Object} props Component properties. 13502 * @param {string} [props.href] When `href` is provided, the menu item is rendered as an anchor instead of a button. It corresponds to the `href` attribute of the anchor. 13503 * @param {WPBlockTypeIconRender} [props.icon=inherits from the plugin] The icon to be rendered to the left of the menu item label. Can be a Dashicon slug or an SVG WP element. 13504 * @param {Function} [props.onClick] The callback function to be executed when the user clicks the menu item. 13505 * @param {...*} [props.other] Any additional props are passed through to the underlying MenuItem component. 13506 * 13507 * @example 13508 * ```jsx 13509 * import { __ } from '@wordpress/i18n'; 13510 * import { PluginPreviewMenuItem } from '@wordpress/editor'; 13511 * import { external } from '@wordpress/icons'; 13512 * 13513 * function onPreviewClick() { 13514 * // Handle preview action 13515 * } 13516 * 13517 * const ExternalPreviewMenuItem = () => ( 13518 * <PreviewDropdownMenuItem 13519 * icon={ external } 13520 * onClick={ onPreviewClick } 13521 * > 13522 * { __( 'Preview in new tab' ) } 13523 * </PreviewDropdownMenuItem> 13524 * ); 13525 * registerPlugin( 'external-preview-menu-item', { 13526 * render: ExternalPreviewMenuItem, 13527 * } ); 13528 * ``` 13529 * 13530 * @return {Component} The rendered menu item component. 13531 */ 13532 /* harmony default export */ const plugin_preview_menu_item = ((0,external_wp_compose_namespaceObject.compose)((0,external_wp_plugins_namespaceObject.withPluginContext)((context, ownProps) => { 13533 var _ownProps$as; 13534 return { 13535 as: (_ownProps$as = ownProps.as) !== null && _ownProps$as !== void 0 ? _ownProps$as : external_wp_components_namespaceObject.MenuItem, 13536 icon: ownProps.icon || context.icon, 13537 name: 'core/plugin-preview-menu' 13538 }; 13539 }))(action_item)); 13540 13541 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/plugin-sidebar/index.js 13542 /** 13543 * WordPress dependencies 13544 */ 13545 13546 13547 13548 13549 /** 13550 * Internal dependencies 13551 */ 13552 13553 13554 /** 13555 * Renders a sidebar when activated. The contents within the `PluginSidebar` will appear as content within the sidebar. 13556 * It also automatically renders a corresponding `PluginSidebarMenuItem` component when `isPinnable` flag is set to `true`. 13557 * If you wish to display the sidebar, you can with use the `PluginSidebarMoreMenuItem` component or the `wp.data.dispatch` API: 13558 * 13559 * ```js 13560 * wp.data.dispatch( 'core/edit-post' ).openGeneralSidebar( 'plugin-name/sidebar-name' ); 13561 * ``` 13562 * 13563 * @see PluginSidebarMoreMenuItem 13564 * 13565 * @param {Object} props Element props. 13566 * @param {string} props.name A string identifying the sidebar. Must be unique for every sidebar registered within the scope of your plugin. 13567 * @param {string} [props.className] An optional class name added to the sidebar body. 13568 * @param {string} props.title Title displayed at the top of the sidebar. 13569 * @param {boolean} [props.isPinnable=true] Whether to allow to pin sidebar to the toolbar. When set to `true` it also automatically renders a corresponding menu item. 13570 * @param {WPBlockTypeIconRender} [props.icon=inherits from the plugin] The [Dashicon](https://developer.wordpress.org/resource/dashicons/) icon slug string, or an SVG WP element, to be rendered when the sidebar is pinned to toolbar. 13571 * 13572 * @example 13573 * ```js 13574 * // Using ES5 syntax 13575 * var __ = wp.i18n.__; 13576 * var el = React.createElement; 13577 * var PanelBody = wp.components.PanelBody; 13578 * var PluginSidebar = wp.editor.PluginSidebar; 13579 * var moreIcon = React.createElement( 'svg' ); //... svg element. 13580 * 13581 * function MyPluginSidebar() { 13582 * return el( 13583 * PluginSidebar, 13584 * { 13585 * name: 'my-sidebar', 13586 * title: 'My sidebar title', 13587 * icon: moreIcon, 13588 * }, 13589 * el( 13590 * PanelBody, 13591 * {}, 13592 * __( 'My sidebar content' ) 13593 * ) 13594 * ); 13595 * } 13596 * ``` 13597 * 13598 * @example 13599 * ```jsx 13600 * // Using ESNext syntax 13601 * import { __ } from '@wordpress/i18n'; 13602 * import { PanelBody } from '@wordpress/components'; 13603 * import { PluginSidebar } from '@wordpress/editor'; 13604 * import { more } from '@wordpress/icons'; 13605 * 13606 * const MyPluginSidebar = () => ( 13607 * <PluginSidebar 13608 * name="my-sidebar" 13609 * title="My sidebar title" 13610 * icon={ more } 13611 * > 13612 * <PanelBody> 13613 * { __( 'My sidebar content' ) } 13614 * </PanelBody> 13615 * </PluginSidebar> 13616 * ); 13617 * ``` 13618 */ 13619 13620 function PluginSidebar({ 13621 className, 13622 ...props 13623 }) { 13624 const { 13625 postTitle 13626 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 13627 return { 13628 postTitle: select(store_store).getEditedPostAttribute('title') 13629 }; 13630 }, []); 13631 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(complementary_area, { 13632 panelClassName: className, 13633 className: "editor-sidebar", 13634 smallScreenTitle: postTitle || (0,external_wp_i18n_namespaceObject.__)('(no title)'), 13635 scope: "core", 13636 ...props 13637 }); 13638 } 13639 13640 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/plugin-sidebar-more-menu-item/index.js 13641 /** 13642 * WordPress dependencies 13643 */ 13644 13645 13646 /** 13647 * Renders a menu item in `Plugins` group in `More Menu` drop down, 13648 * and can be used to activate the corresponding `PluginSidebar` component. 13649 * The text within the component appears as the menu item label. 13650 * 13651 * @param {Object} props Component props. 13652 * @param {string} props.target A string identifying the target sidebar you wish to be activated by this menu item. Must be the same as the `name` prop you have given to that sidebar. 13653 * @param {WPBlockTypeIconRender} [props.icon=inherits from the plugin] The [Dashicon](https://developer.wordpress.org/resource/dashicons/) icon slug string, or an SVG WP element, to be rendered to the left of the menu item label. 13654 * 13655 * @example 13656 * ```js 13657 * // Using ES5 syntax 13658 * var __ = wp.i18n.__; 13659 * var PluginSidebarMoreMenuItem = wp.editor.PluginSidebarMoreMenuItem; 13660 * var moreIcon = React.createElement( 'svg' ); //... svg element. 13661 * 13662 * function MySidebarMoreMenuItem() { 13663 * return React.createElement( 13664 * PluginSidebarMoreMenuItem, 13665 * { 13666 * target: 'my-sidebar', 13667 * icon: moreIcon, 13668 * }, 13669 * __( 'My sidebar title' ) 13670 * ) 13671 * } 13672 * ``` 13673 * 13674 * @example 13675 * ```jsx 13676 * // Using ESNext syntax 13677 * import { __ } from '@wordpress/i18n'; 13678 * import { PluginSidebarMoreMenuItem } from '@wordpress/editor'; 13679 * import { more } from '@wordpress/icons'; 13680 * 13681 * const MySidebarMoreMenuItem = () => ( 13682 * <PluginSidebarMoreMenuItem 13683 * target="my-sidebar" 13684 * icon={ more } 13685 * > 13686 * { __( 'My sidebar title' ) } 13687 * </PluginSidebarMoreMenuItem> 13688 * ); 13689 * ``` 13690 * 13691 * @return {Component} The component to be rendered. 13692 */ 13693 13694 function PluginSidebarMoreMenuItem(props) { 13695 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ComplementaryAreaMoreMenuItem 13696 // Menu item is marked with unstable prop for backward compatibility. 13697 // @see https://github.com/WordPress/gutenberg/issues/14457 13698 , { 13699 __unstableExplicitMenuItem: true, 13700 scope: "core", 13701 ...props 13702 }); 13703 } 13704 13705 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-template/swap-template-button.js 13706 /** 13707 * WordPress dependencies 13708 */ 13709 13710 13711 13712 13713 13714 13715 13716 13717 13718 13719 /** 13720 * Internal dependencies 13721 */ 13722 13723 13724 13725 13726 function SwapTemplateButton({ 13727 onClick 13728 }) { 13729 const [showModal, setShowModal] = (0,external_wp_element_namespaceObject.useState)(false); 13730 const { 13731 postType, 13732 postId 13733 } = useEditedPostContext(); 13734 const availableTemplates = useAvailableTemplates(postType); 13735 const { 13736 editEntityRecord 13737 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); 13738 if (!availableTemplates?.length) { 13739 return null; 13740 } 13741 const onTemplateSelect = async template => { 13742 editEntityRecord('postType', postType, postId, { 13743 template: template.name 13744 }, { 13745 undoIgnore: true 13746 }); 13747 setShowModal(false); // Close the template suggestions modal first. 13748 onClick(); 13749 }; 13750 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 13751 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItem, { 13752 onClick: () => setShowModal(true), 13753 children: (0,external_wp_i18n_namespaceObject.__)('Swap template') 13754 }), showModal && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Modal, { 13755 title: (0,external_wp_i18n_namespaceObject.__)('Choose a template'), 13756 onRequestClose: () => setShowModal(false), 13757 overlayClassName: "editor-post-template__swap-template-modal", 13758 isFullScreen: true, 13759 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 13760 className: "editor-post-template__swap-template-modal-content", 13761 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TemplatesList, { 13762 postType: postType, 13763 onSelect: onTemplateSelect 13764 }) 13765 }) 13766 })] 13767 }); 13768 } 13769 function TemplatesList({ 13770 postType, 13771 onSelect 13772 }) { 13773 const availableTemplates = useAvailableTemplates(postType); 13774 const templatesAsPatterns = (0,external_wp_element_namespaceObject.useMemo)(() => availableTemplates.map(template => ({ 13775 name: template.slug, 13776 blocks: (0,external_wp_blocks_namespaceObject.parse)(template.content.raw), 13777 title: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(template.title.rendered), 13778 id: template.id 13779 })), [availableTemplates]); 13780 const shownTemplates = (0,external_wp_compose_namespaceObject.useAsyncList)(templatesAsPatterns); 13781 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalBlockPatternsList, { 13782 label: (0,external_wp_i18n_namespaceObject.__)('Templates'), 13783 blockPatterns: templatesAsPatterns, 13784 shownPatterns: shownTemplates, 13785 onClickPattern: onSelect 13786 }); 13787 } 13788 13789 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-template/reset-default-template.js 13790 /** 13791 * WordPress dependencies 13792 */ 13793 13794 13795 13796 13797 13798 /** 13799 * Internal dependencies 13800 */ 13801 13802 13803 function ResetDefaultTemplate({ 13804 onClick 13805 }) { 13806 const currentTemplateSlug = useCurrentTemplateSlug(); 13807 const allowSwitchingTemplate = useAllowSwitchingTemplates(); 13808 const { 13809 postType, 13810 postId 13811 } = useEditedPostContext(); 13812 const { 13813 editEntityRecord 13814 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); 13815 // The default template in a post is indicated by an empty string. 13816 if (!currentTemplateSlug || !allowSwitchingTemplate) { 13817 return null; 13818 } 13819 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItem, { 13820 onClick: () => { 13821 editEntityRecord('postType', postType, postId, { 13822 template: '' 13823 }, { 13824 undoIgnore: true 13825 }); 13826 onClick(); 13827 }, 13828 children: (0,external_wp_i18n_namespaceObject.__)('Use default template') 13829 }); 13830 } 13831 13832 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-template/create-new-template.js 13833 /** 13834 * WordPress dependencies 13835 */ 13836 13837 13838 13839 13840 13841 13842 /** 13843 * Internal dependencies 13844 */ 13845 13846 13847 13848 13849 13850 function CreateNewTemplate({ 13851 onClick 13852 }) { 13853 const { 13854 canCreateTemplates 13855 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 13856 const { 13857 canUser 13858 } = select(external_wp_coreData_namespaceObject.store); 13859 return { 13860 canCreateTemplates: canUser('create', { 13861 kind: 'postType', 13862 name: 'wp_template' 13863 }) 13864 }; 13865 }, []); 13866 const [isCreateModalOpen, setIsCreateModalOpen] = (0,external_wp_element_namespaceObject.useState)(false); 13867 const allowSwitchingTemplate = useAllowSwitchingTemplates(); 13868 13869 // The default template in a post is indicated by an empty string. 13870 if (!canCreateTemplates || !allowSwitchingTemplate) { 13871 return null; 13872 } 13873 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 13874 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItem, { 13875 onClick: () => { 13876 setIsCreateModalOpen(true); 13877 }, 13878 children: (0,external_wp_i18n_namespaceObject.__)('Create new template') 13879 }), isCreateModalOpen && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(CreateNewTemplateModal, { 13880 onClose: () => { 13881 setIsCreateModalOpen(false); 13882 onClick(); 13883 } 13884 })] 13885 }); 13886 } 13887 13888 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-template/block-theme.js 13889 /** 13890 * WordPress dependencies 13891 */ 13892 13893 13894 13895 13896 13897 13898 13899 13900 13901 /** 13902 * Internal dependencies 13903 */ 13904 13905 13906 13907 13908 13909 13910 13911 13912 const block_theme_POPOVER_PROPS = { 13913 className: 'editor-post-template__dropdown', 13914 placement: 'bottom-start' 13915 }; 13916 function BlockThemeControl({ 13917 id 13918 }) { 13919 const { 13920 isTemplateHidden, 13921 onNavigateToEntityRecord, 13922 getEditorSettings, 13923 hasGoBack 13924 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 13925 const { 13926 getRenderingMode, 13927 getEditorSettings: _getEditorSettings 13928 } = unlock(select(store_store)); 13929 const editorSettings = _getEditorSettings(); 13930 return { 13931 isTemplateHidden: getRenderingMode() === 'post-only', 13932 onNavigateToEntityRecord: editorSettings.onNavigateToEntityRecord, 13933 getEditorSettings: _getEditorSettings, 13934 hasGoBack: editorSettings.hasOwnProperty('onNavigateToPreviousEntityRecord') 13935 }; 13936 }, []); 13937 const { 13938 get: getPreference 13939 } = (0,external_wp_data_namespaceObject.useSelect)(external_wp_preferences_namespaceObject.store); 13940 const { 13941 editedRecord: template, 13942 hasResolved 13943 } = (0,external_wp_coreData_namespaceObject.useEntityRecord)('postType', 'wp_template', id); 13944 const { 13945 createSuccessNotice 13946 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); 13947 const { 13948 setRenderingMode 13949 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 13950 const canCreateTemplate = (0,external_wp_data_namespaceObject.useSelect)(select => !!select(external_wp_coreData_namespaceObject.store).canUser('create', { 13951 kind: 'postType', 13952 name: 'wp_template' 13953 }), []); 13954 if (!hasResolved) { 13955 return null; 13956 } 13957 13958 // The site editor does not have a `onNavigateToPreviousEntityRecord` setting as it uses its own routing 13959 // and assigns its own backlink to focusMode pages. 13960 const notificationAction = hasGoBack ? [{ 13961 label: (0,external_wp_i18n_namespaceObject.__)('Go back'), 13962 onClick: () => getEditorSettings().onNavigateToPreviousEntityRecord() 13963 }] : undefined; 13964 const mayShowTemplateEditNotice = () => { 13965 if (!getPreference('core/edit-site', 'welcomeGuideTemplate')) { 13966 createSuccessNotice((0,external_wp_i18n_namespaceObject.__)('Editing template. Changes made here affect all posts and pages that use the template.'), { 13967 type: 'snackbar', 13968 actions: notificationAction 13969 }); 13970 } 13971 }; 13972 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.DropdownMenu, { 13973 popoverProps: block_theme_POPOVER_PROPS, 13974 focusOnMount: true, 13975 toggleProps: { 13976 size: 'compact', 13977 variant: 'tertiary', 13978 tooltipPosition: 'middle left' 13979 }, 13980 label: (0,external_wp_i18n_namespaceObject.__)('Template options'), 13981 text: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(template.title), 13982 icon: null, 13983 children: ({ 13984 onClose 13985 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 13986 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.MenuGroup, { 13987 children: [canCreateTemplate && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItem, { 13988 onClick: () => { 13989 onNavigateToEntityRecord({ 13990 postId: template.id, 13991 postType: 'wp_template' 13992 }); 13993 onClose(); 13994 mayShowTemplateEditNotice(); 13995 }, 13996 children: (0,external_wp_i18n_namespaceObject.__)('Edit template') 13997 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(SwapTemplateButton, { 13998 onClick: onClose 13999 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ResetDefaultTemplate, { 14000 onClick: onClose 14001 }), canCreateTemplate && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(CreateNewTemplate, { 14002 onClick: onClose 14003 })] 14004 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuGroup, { 14005 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItem, { 14006 icon: !isTemplateHidden ? library_check : undefined, 14007 isSelected: !isTemplateHidden, 14008 role: "menuitemcheckbox", 14009 onClick: () => { 14010 setRenderingMode(isTemplateHidden ? 'template-locked' : 'post-only'); 14011 }, 14012 children: (0,external_wp_i18n_namespaceObject.__)('Show template') 14013 }) 14014 })] 14015 }) 14016 }); 14017 } 14018 14019 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-template/panel.js 14020 /** 14021 * WordPress dependencies 14022 */ 14023 14024 14025 14026 14027 /** 14028 * Internal dependencies 14029 */ 14030 14031 14032 14033 14034 14035 /** 14036 * Displays the template controls based on the current editor settings and user permissions. 14037 * 14038 * @return {JSX.Element|null} The rendered PostTemplatePanel component. 14039 */ 14040 14041 function PostTemplatePanel() { 14042 const { 14043 templateId, 14044 isBlockTheme 14045 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 14046 const { 14047 getCurrentTemplateId, 14048 getEditorSettings 14049 } = select(store_store); 14050 return { 14051 templateId: getCurrentTemplateId(), 14052 isBlockTheme: getEditorSettings().__unstableIsBlockBasedTheme 14053 }; 14054 }, []); 14055 const isVisible = (0,external_wp_data_namespaceObject.useSelect)(select => { 14056 var _select$canUser; 14057 const postTypeSlug = select(store_store).getCurrentPostType(); 14058 const postType = select(external_wp_coreData_namespaceObject.store).getPostType(postTypeSlug); 14059 if (!postType?.viewable) { 14060 return false; 14061 } 14062 const settings = select(store_store).getEditorSettings(); 14063 const hasTemplates = !!settings.availableTemplates && Object.keys(settings.availableTemplates).length > 0; 14064 if (hasTemplates) { 14065 return true; 14066 } 14067 if (!settings.supportsTemplateMode) { 14068 return false; 14069 } 14070 const canCreateTemplates = (_select$canUser = select(external_wp_coreData_namespaceObject.store).canUser('create', { 14071 kind: 'postType', 14072 name: 'wp_template' 14073 })) !== null && _select$canUser !== void 0 ? _select$canUser : false; 14074 return canCreateTemplates; 14075 }, []); 14076 const canViewTemplates = (0,external_wp_data_namespaceObject.useSelect)(select => { 14077 var _select$canUser2; 14078 return (_select$canUser2 = select(external_wp_coreData_namespaceObject.store).canUser('read', { 14079 kind: 'postType', 14080 name: 'wp_template' 14081 })) !== null && _select$canUser2 !== void 0 ? _select$canUser2 : false; 14082 }, []); 14083 if ((!isBlockTheme || !canViewTemplates) && isVisible) { 14084 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { 14085 label: (0,external_wp_i18n_namespaceObject.__)('Template'), 14086 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(classic_theme, {}) 14087 }); 14088 } 14089 if (isBlockTheme && !!templateId) { 14090 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { 14091 label: (0,external_wp_i18n_namespaceObject.__)('Template'), 14092 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(BlockThemeControl, { 14093 id: templateId 14094 }) 14095 }); 14096 } 14097 return null; 14098 } 14099 14100 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-author/constants.js 14101 const BASE_QUERY = { 14102 _fields: 'id,name', 14103 context: 'view' // Allows non-admins to perform requests. 14104 }; 14105 const AUTHORS_QUERY = { 14106 who: 'authors', 14107 per_page: 50, 14108 ...BASE_QUERY 14109 }; 14110 14111 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-author/hook.js 14112 /** 14113 * WordPress dependencies 14114 */ 14115 14116 14117 14118 14119 14120 14121 /** 14122 * Internal dependencies 14123 */ 14124 14125 14126 function useAuthorsQuery(search) { 14127 const { 14128 authorId, 14129 authors, 14130 postAuthor 14131 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 14132 const { 14133 getUser, 14134 getUsers 14135 } = select(external_wp_coreData_namespaceObject.store); 14136 const { 14137 getEditedPostAttribute 14138 } = select(store_store); 14139 const _authorId = getEditedPostAttribute('author'); 14140 const query = { 14141 ...AUTHORS_QUERY 14142 }; 14143 if (search) { 14144 query.search = search; 14145 } 14146 return { 14147 authorId: _authorId, 14148 authors: getUsers(query), 14149 postAuthor: getUser(_authorId, BASE_QUERY) 14150 }; 14151 }, [search]); 14152 const authorOptions = (0,external_wp_element_namespaceObject.useMemo)(() => { 14153 const fetchedAuthors = (authors !== null && authors !== void 0 ? authors : []).map(author => { 14154 return { 14155 value: author.id, 14156 label: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(author.name) 14157 }; 14158 }); 14159 14160 // Ensure the current author is included in the dropdown list. 14161 const foundAuthor = fetchedAuthors.findIndex(({ 14162 value 14163 }) => postAuthor?.id === value); 14164 let currentAuthor = []; 14165 if (foundAuthor < 0 && postAuthor) { 14166 currentAuthor = [{ 14167 value: postAuthor.id, 14168 label: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(postAuthor.name) 14169 }]; 14170 } else if (foundAuthor < 0 && !postAuthor) { 14171 currentAuthor = [{ 14172 value: 0, 14173 label: (0,external_wp_i18n_namespaceObject.__)('(No author)') 14174 }]; 14175 } 14176 return [...currentAuthor, ...fetchedAuthors]; 14177 }, [authors, postAuthor]); 14178 return { 14179 authorId, 14180 authorOptions, 14181 postAuthor 14182 }; 14183 } 14184 14185 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-author/combobox.js 14186 /** 14187 * WordPress dependencies 14188 */ 14189 14190 14191 14192 14193 14194 14195 /** 14196 * Internal dependencies 14197 */ 14198 14199 14200 14201 function PostAuthorCombobox() { 14202 const [fieldValue, setFieldValue] = (0,external_wp_element_namespaceObject.useState)(); 14203 const { 14204 editPost 14205 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 14206 const { 14207 authorId, 14208 authorOptions 14209 } = useAuthorsQuery(fieldValue); 14210 14211 /** 14212 * Handle author selection. 14213 * 14214 * @param {number} postAuthorId The selected Author. 14215 */ 14216 const handleSelect = postAuthorId => { 14217 if (!postAuthorId) { 14218 return; 14219 } 14220 editPost({ 14221 author: postAuthorId 14222 }); 14223 }; 14224 14225 /** 14226 * Handle user input. 14227 * 14228 * @param {string} inputValue The current value of the input field. 14229 */ 14230 const handleKeydown = inputValue => { 14231 setFieldValue(inputValue); 14232 }; 14233 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ComboboxControl, { 14234 __nextHasNoMarginBottom: true, 14235 __next40pxDefaultSize: true, 14236 label: (0,external_wp_i18n_namespaceObject.__)('Author'), 14237 options: authorOptions, 14238 value: authorId, 14239 onFilterValueChange: (0,external_wp_compose_namespaceObject.debounce)(handleKeydown, 300), 14240 onChange: handleSelect, 14241 allowReset: false, 14242 hideLabelFromVision: true 14243 }); 14244 } 14245 14246 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-author/select.js 14247 /** 14248 * WordPress dependencies 14249 */ 14250 14251 14252 14253 14254 /** 14255 * Internal dependencies 14256 */ 14257 14258 14259 14260 function PostAuthorSelect() { 14261 const { 14262 editPost 14263 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 14264 const { 14265 authorId, 14266 authorOptions 14267 } = useAuthorsQuery(); 14268 const setAuthorId = value => { 14269 const author = Number(value); 14270 editPost({ 14271 author 14272 }); 14273 }; 14274 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.SelectControl, { 14275 __next40pxDefaultSize: true, 14276 __nextHasNoMarginBottom: true, 14277 className: "post-author-selector", 14278 label: (0,external_wp_i18n_namespaceObject.__)('Author'), 14279 options: authorOptions, 14280 onChange: setAuthorId, 14281 value: authorId, 14282 hideLabelFromVision: true 14283 }); 14284 } 14285 14286 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-author/index.js 14287 /** 14288 * WordPress dependencies 14289 */ 14290 14291 14292 14293 /** 14294 * Internal dependencies 14295 */ 14296 14297 14298 14299 14300 const minimumUsersForCombobox = 25; 14301 14302 /** 14303 * Renders the component for selecting the post author. 14304 * 14305 * @return {Component} The component to be rendered. 14306 */ 14307 function PostAuthor() { 14308 const showCombobox = (0,external_wp_data_namespaceObject.useSelect)(select => { 14309 const authors = select(external_wp_coreData_namespaceObject.store).getUsers(AUTHORS_QUERY); 14310 return authors?.length >= minimumUsersForCombobox; 14311 }, []); 14312 if (showCombobox) { 14313 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostAuthorCombobox, {}); 14314 } 14315 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostAuthorSelect, {}); 14316 } 14317 /* harmony default export */ const post_author = (PostAuthor); 14318 14319 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-author/check.js 14320 /** 14321 * WordPress dependencies 14322 */ 14323 14324 14325 14326 /** 14327 * Internal dependencies 14328 */ 14329 14330 14331 14332 14333 /** 14334 * Wrapper component that renders its children only if the post type supports the author. 14335 * 14336 * @param {Object} props The component props. 14337 * @param {Element} props.children Children to be rendered. 14338 * 14339 * @return {Component|null} The component to be rendered. Return `null` if the post type doesn't 14340 * supports the author or if there are no authors available. 14341 */ 14342 14343 function PostAuthorCheck({ 14344 children 14345 }) { 14346 const { 14347 hasAssignAuthorAction, 14348 hasAuthors 14349 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 14350 var _post$_links$wpActio; 14351 const post = select(store_store).getCurrentPost(); 14352 const authors = select(external_wp_coreData_namespaceObject.store).getUsers(AUTHORS_QUERY); 14353 return { 14354 hasAssignAuthorAction: (_post$_links$wpActio = post._links?.['wp:action-assign-author']) !== null && _post$_links$wpActio !== void 0 ? _post$_links$wpActio : false, 14355 hasAuthors: authors?.length >= 1 14356 }; 14357 }, []); 14358 if (!hasAssignAuthorAction || !hasAuthors) { 14359 return null; 14360 } 14361 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_type_support_check, { 14362 supportKeys: "author", 14363 children: children 14364 }); 14365 } 14366 14367 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-author/panel.js 14368 /** 14369 * WordPress dependencies 14370 */ 14371 14372 14373 14374 14375 14376 14377 /** 14378 * Internal dependencies 14379 */ 14380 14381 14382 14383 14384 14385 14386 function PostAuthorToggle({ 14387 isOpen, 14388 onClick 14389 }) { 14390 const { 14391 postAuthor 14392 } = useAuthorsQuery(); 14393 const authorName = (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(postAuthor?.name) || (0,external_wp_i18n_namespaceObject.__)('(No author)'); 14394 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 14395 size: "compact", 14396 className: "editor-post-author__panel-toggle", 14397 variant: "tertiary", 14398 "aria-expanded": isOpen, 14399 "aria-label": 14400 // translators: %s: Author name. 14401 (0,external_wp_i18n_namespaceObject.sprintf)((0,external_wp_i18n_namespaceObject.__)('Change author: %s'), authorName), 14402 onClick: onClick, 14403 children: authorName 14404 }); 14405 } 14406 14407 /** 14408 * Renders the Post Author Panel component. 14409 * 14410 * @return {Component} The component to be rendered. 14411 */ 14412 function panel_PostAuthor() { 14413 // Use internal state instead of a ref to make sure that the component 14414 // re-renders when the popover's anchor updates. 14415 const [popoverAnchor, setPopoverAnchor] = (0,external_wp_element_namespaceObject.useState)(null); 14416 // Memoize popoverProps to avoid returning a new object every time. 14417 const popoverProps = (0,external_wp_element_namespaceObject.useMemo)(() => ({ 14418 // Anchor the popover to the middle of the entire row so that it doesn't 14419 // move around when the label changes. 14420 anchor: popoverAnchor, 14421 placement: 'left-start', 14422 offset: 36, 14423 shift: true 14424 }), [popoverAnchor]); 14425 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostAuthorCheck, { 14426 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { 14427 label: (0,external_wp_i18n_namespaceObject.__)('Author'), 14428 ref: setPopoverAnchor, 14429 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Dropdown, { 14430 popoverProps: popoverProps, 14431 contentClassName: "editor-post-author__panel-dialog", 14432 focusOnMount: true, 14433 renderToggle: ({ 14434 isOpen, 14435 onToggle 14436 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostAuthorToggle, { 14437 isOpen: isOpen, 14438 onClick: onToggle 14439 }), 14440 renderContent: ({ 14441 onClose 14442 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 14443 className: "editor-post-author", 14444 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalInspectorPopoverHeader, { 14445 title: (0,external_wp_i18n_namespaceObject.__)('Author'), 14446 onClose: onClose 14447 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_author, { 14448 onClose: onClose 14449 })] 14450 }) 14451 }) 14452 }) 14453 }); 14454 } 14455 /* harmony default export */ const panel = (panel_PostAuthor); 14456 14457 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-comments/index.js 14458 /** 14459 * WordPress dependencies 14460 */ 14461 14462 14463 14464 14465 /** 14466 * Internal dependencies 14467 */ 14468 14469 14470 const COMMENT_OPTIONS = [{ 14471 label: (0,external_wp_i18n_namespaceObject._x)('Open', 'Adjective: e.g. "Comments are open"'), 14472 value: 'open', 14473 description: (0,external_wp_i18n_namespaceObject.__)('Visitors can add new comments and replies.') 14474 }, { 14475 label: (0,external_wp_i18n_namespaceObject.__)('Closed'), 14476 value: 'closed', 14477 description: [(0,external_wp_i18n_namespaceObject.__)('Visitors cannot add new comments or replies.'), (0,external_wp_i18n_namespaceObject.__)('Existing comments remain visible.')].join(' ') 14478 }]; 14479 function PostComments() { 14480 const commentStatus = (0,external_wp_data_namespaceObject.useSelect)(select => { 14481 var _select$getEditedPost; 14482 return (_select$getEditedPost = select(store_store).getEditedPostAttribute('comment_status')) !== null && _select$getEditedPost !== void 0 ? _select$getEditedPost : 'open'; 14483 }, []); 14484 const { 14485 editPost 14486 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 14487 const handleStatus = newCommentStatus => editPost({ 14488 comment_status: newCommentStatus 14489 }); 14490 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("form", { 14491 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalVStack, { 14492 spacing: 4, 14493 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.RadioControl, { 14494 className: "editor-change-status__options", 14495 hideLabelFromVision: true, 14496 label: (0,external_wp_i18n_namespaceObject.__)('Comment status'), 14497 options: COMMENT_OPTIONS, 14498 onChange: handleStatus, 14499 selected: commentStatus 14500 }) 14501 }) 14502 }); 14503 } 14504 14505 /** 14506 * A form for managing comment status. 14507 * 14508 * @return {JSX.Element} The rendered PostComments component. 14509 */ 14510 /* harmony default export */ const post_comments = (PostComments); 14511 14512 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-pingbacks/index.js 14513 /** 14514 * WordPress dependencies 14515 */ 14516 14517 14518 14519 14520 /** 14521 * Internal dependencies 14522 */ 14523 14524 14525 function PostPingbacks() { 14526 const pingStatus = (0,external_wp_data_namespaceObject.useSelect)(select => { 14527 var _select$getEditedPost; 14528 return (_select$getEditedPost = select(store_store).getEditedPostAttribute('ping_status')) !== null && _select$getEditedPost !== void 0 ? _select$getEditedPost : 'open'; 14529 }, []); 14530 const { 14531 editPost 14532 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 14533 const onTogglePingback = () => editPost({ 14534 ping_status: pingStatus === 'open' ? 'closed' : 'open' 14535 }); 14536 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.CheckboxControl, { 14537 __nextHasNoMarginBottom: true, 14538 label: (0,external_wp_i18n_namespaceObject.__)('Enable pingbacks & trackbacks'), 14539 checked: pingStatus === 'open', 14540 onChange: onTogglePingback, 14541 help: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ExternalLink, { 14542 href: (0,external_wp_i18n_namespaceObject.__)('https://wordpress.org/documentation/article/trackbacks-and-pingbacks/'), 14543 children: (0,external_wp_i18n_namespaceObject.__)('Learn more about pingbacks & trackbacks') 14544 }) 14545 }); 14546 } 14547 14548 /** 14549 * Renders a control for enabling or disabling pingbacks and trackbacks 14550 * in a WordPress post. 14551 * 14552 * @module PostPingbacks 14553 */ 14554 /* harmony default export */ const post_pingbacks = (PostPingbacks); 14555 14556 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-discussion/panel.js 14557 /** 14558 * WordPress dependencies 14559 */ 14560 14561 14562 14563 14564 14565 14566 14567 /** 14568 * Internal dependencies 14569 */ 14570 14571 14572 14573 14574 14575 14576 14577 const panel_PANEL_NAME = 'discussion-panel'; 14578 function ModalContents({ 14579 onClose 14580 }) { 14581 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 14582 className: "editor-post-discussion", 14583 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalInspectorPopoverHeader, { 14584 title: (0,external_wp_i18n_namespaceObject.__)('Discussion'), 14585 onClose: onClose 14586 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { 14587 spacing: 4, 14588 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_type_support_check, { 14589 supportKeys: "comments", 14590 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_comments, {}) 14591 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_type_support_check, { 14592 supportKeys: "trackbacks", 14593 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_pingbacks, {}) 14594 })] 14595 })] 14596 }); 14597 } 14598 function PostDiscussionToggle({ 14599 isOpen, 14600 onClick 14601 }) { 14602 const { 14603 commentStatus, 14604 pingStatus, 14605 commentsSupported, 14606 trackbacksSupported 14607 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 14608 var _getEditedPostAttribu, _getEditedPostAttribu2; 14609 const { 14610 getEditedPostAttribute 14611 } = select(store_store); 14612 const { 14613 getPostType 14614 } = select(external_wp_coreData_namespaceObject.store); 14615 const postType = getPostType(getEditedPostAttribute('type')); 14616 return { 14617 commentStatus: (_getEditedPostAttribu = getEditedPostAttribute('comment_status')) !== null && _getEditedPostAttribu !== void 0 ? _getEditedPostAttribu : 'open', 14618 pingStatus: (_getEditedPostAttribu2 = getEditedPostAttribute('ping_status')) !== null && _getEditedPostAttribu2 !== void 0 ? _getEditedPostAttribu2 : 'open', 14619 commentsSupported: !!postType.supports.comments, 14620 trackbacksSupported: !!postType.supports.trackbacks 14621 }; 14622 }, []); 14623 let label; 14624 if (commentStatus === 'open') { 14625 if (pingStatus === 'open') { 14626 label = (0,external_wp_i18n_namespaceObject._x)('Open', 'Adjective: e.g. "Comments are open"'); 14627 } else { 14628 label = trackbacksSupported ? (0,external_wp_i18n_namespaceObject.__)('Comments only') : (0,external_wp_i18n_namespaceObject._x)('Open', 'Adjective: e.g. "Comments are open"'); 14629 } 14630 } else if (pingStatus === 'open') { 14631 label = commentsSupported ? (0,external_wp_i18n_namespaceObject.__)('Pings only') : (0,external_wp_i18n_namespaceObject.__)('Pings enabled'); 14632 } else { 14633 label = (0,external_wp_i18n_namespaceObject.__)('Closed'); 14634 } 14635 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 14636 size: "compact", 14637 className: "editor-post-discussion__panel-toggle", 14638 variant: "tertiary", 14639 "aria-label": (0,external_wp_i18n_namespaceObject.__)('Change discussion options'), 14640 "aria-expanded": isOpen, 14641 onClick: onClick, 14642 children: label 14643 }); 14644 } 14645 14646 /** 14647 * This component allows to update comment and pingback 14648 * settings for the current post. Internally there are 14649 * checks whether the current post has support for the 14650 * above and if the `discussion-panel` panel is enabled. 14651 * 14652 * @return {JSX.Element|null} The rendered PostDiscussionPanel component. 14653 */ 14654 function PostDiscussionPanel() { 14655 const { 14656 isEnabled 14657 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 14658 const { 14659 isEditorPanelEnabled 14660 } = select(store_store); 14661 return { 14662 isEnabled: isEditorPanelEnabled(panel_PANEL_NAME) 14663 }; 14664 }, []); 14665 14666 // Use internal state instead of a ref to make sure that the component 14667 // re-renders when the popover's anchor updates. 14668 const [popoverAnchor, setPopoverAnchor] = (0,external_wp_element_namespaceObject.useState)(null); 14669 // Memoize popoverProps to avoid returning a new object every time. 14670 const popoverProps = (0,external_wp_element_namespaceObject.useMemo)(() => ({ 14671 // Anchor the popover to the middle of the entire row so that it doesn't 14672 // move around when the label changes. 14673 anchor: popoverAnchor, 14674 placement: 'left-start', 14675 offset: 36, 14676 shift: true 14677 }), [popoverAnchor]); 14678 if (!isEnabled) { 14679 return null; 14680 } 14681 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_type_support_check, { 14682 supportKeys: ['comments', 'trackbacks'], 14683 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { 14684 label: (0,external_wp_i18n_namespaceObject.__)('Discussion'), 14685 ref: setPopoverAnchor, 14686 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Dropdown, { 14687 popoverProps: popoverProps, 14688 className: "editor-post-discussion__panel-dropdown", 14689 contentClassName: "editor-post-discussion__panel-dialog", 14690 focusOnMount: true, 14691 renderToggle: ({ 14692 isOpen, 14693 onToggle 14694 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostDiscussionToggle, { 14695 isOpen: isOpen, 14696 onClick: onToggle 14697 }), 14698 renderContent: ({ 14699 onClose 14700 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ModalContents, { 14701 onClose: onClose 14702 }) 14703 }) 14704 }) 14705 }); 14706 } 14707 14708 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-excerpt/index.js 14709 /** 14710 * WordPress dependencies 14711 */ 14712 14713 14714 14715 14716 14717 14718 /** 14719 * Internal dependencies 14720 */ 14721 14722 14723 /** 14724 * Renders an editable textarea for the post excerpt. 14725 * Templates, template parts and patterns use the `excerpt` field as a description semantically. 14726 * Additionally templates and template parts override the `excerpt` field as `description` in 14727 * REST API. So this component handles proper labeling and updating the edited entity. 14728 * 14729 * @param {Object} props - Component props. 14730 * @param {boolean} [props.hideLabelFromVision=false] - Whether to visually hide the textarea's label. 14731 * @param {boolean} [props.updateOnBlur=false] - Whether to update the post on change or use local state and update on blur. 14732 */ 14733 14734 function PostExcerpt({ 14735 hideLabelFromVision = false, 14736 updateOnBlur = false 14737 }) { 14738 const { 14739 excerpt, 14740 shouldUseDescriptionLabel, 14741 usedAttribute 14742 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 14743 const { 14744 getCurrentPostType, 14745 getEditedPostAttribute 14746 } = select(store_store); 14747 const postType = getCurrentPostType(); 14748 // This special case is unfortunate, but the REST API of wp_template and wp_template_part 14749 // support the excerpt field throught the "description" field rather than "excerpt". 14750 const _usedAttribute = ['wp_template', 'wp_template_part'].includes(postType) ? 'description' : 'excerpt'; 14751 return { 14752 excerpt: getEditedPostAttribute(_usedAttribute), 14753 // There are special cases where we want to label the excerpt as a description. 14754 shouldUseDescriptionLabel: ['wp_template', 'wp_template_part', 'wp_block'].includes(postType), 14755 usedAttribute: _usedAttribute 14756 }; 14757 }, []); 14758 const { 14759 editPost 14760 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 14761 const [localExcerpt, setLocalExcerpt] = (0,external_wp_element_namespaceObject.useState)((0,external_wp_htmlEntities_namespaceObject.decodeEntities)(excerpt)); 14762 const updatePost = value => { 14763 editPost({ 14764 [usedAttribute]: value 14765 }); 14766 }; 14767 const label = shouldUseDescriptionLabel ? (0,external_wp_i18n_namespaceObject.__)('Write a description (optional)') : (0,external_wp_i18n_namespaceObject.__)('Write an excerpt (optional)'); 14768 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 14769 className: "editor-post-excerpt", 14770 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.TextareaControl, { 14771 __nextHasNoMarginBottom: true, 14772 label: label, 14773 hideLabelFromVision: hideLabelFromVision, 14774 className: "editor-post-excerpt__textarea", 14775 onChange: updateOnBlur ? setLocalExcerpt : updatePost, 14776 onBlur: updateOnBlur ? () => updatePost(localExcerpt) : undefined, 14777 value: updateOnBlur ? localExcerpt : excerpt, 14778 help: !shouldUseDescriptionLabel ? /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ExternalLink, { 14779 href: (0,external_wp_i18n_namespaceObject.__)('https://wordpress.org/documentation/article/page-post-settings-sidebar/#excerpt'), 14780 children: (0,external_wp_i18n_namespaceObject.__)('Learn more about manual excerpts') 14781 }) : (0,external_wp_i18n_namespaceObject.__)('Write a description') 14782 }) 14783 }); 14784 } 14785 14786 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-excerpt/check.js 14787 /** 14788 * Internal dependencies 14789 */ 14790 14791 14792 /** 14793 * Component for checking if the post type supports the excerpt field. 14794 * 14795 * @param {Object} props Props. 14796 * @param {Element} props.children Children to be rendered. 14797 * 14798 * @return {Component} The component to be rendered. 14799 */ 14800 14801 function PostExcerptCheck({ 14802 children 14803 }) { 14804 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_type_support_check, { 14805 supportKeys: "excerpt", 14806 children: children 14807 }); 14808 } 14809 /* harmony default export */ const post_excerpt_check = (PostExcerptCheck); 14810 14811 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-excerpt/plugin.js 14812 /** 14813 * Defines as extensibility slot for the Excerpt panel. 14814 */ 14815 14816 /** 14817 * WordPress dependencies 14818 */ 14819 14820 14821 const { 14822 Fill: plugin_Fill, 14823 Slot: plugin_Slot 14824 } = (0,external_wp_components_namespaceObject.createSlotFill)('PluginPostExcerpt'); 14825 14826 /** 14827 * Renders a post excerpt panel in the post sidebar. 14828 * 14829 * @param {Object} props Component properties. 14830 * @param {string} [props.className] An optional class name added to the row. 14831 * @param {Element} props.children Children to be rendered. 14832 * 14833 * @example 14834 * ```js 14835 * // Using ES5 syntax 14836 * var __ = wp.i18n.__; 14837 * var PluginPostExcerpt = wp.editPost.__experimentalPluginPostExcerpt; 14838 * 14839 * function MyPluginPostExcerpt() { 14840 * return React.createElement( 14841 * PluginPostExcerpt, 14842 * { 14843 * className: 'my-plugin-post-excerpt', 14844 * }, 14845 * __( 'Post excerpt custom content' ) 14846 * ) 14847 * } 14848 * ``` 14849 * 14850 * @example 14851 * ```jsx 14852 * // Using ESNext syntax 14853 * import { __ } from '@wordpress/i18n'; 14854 * import { __experimentalPluginPostExcerpt as PluginPostExcerpt } from '@wordpress/edit-post'; 14855 * 14856 * const MyPluginPostExcerpt = () => ( 14857 * <PluginPostExcerpt className="my-plugin-post-excerpt"> 14858 * { __( 'Post excerpt custom content' ) } 14859 * </PluginPostExcerpt> 14860 * ); 14861 * ``` 14862 * 14863 * @return {Component} The component to be rendered. 14864 */ 14865 const PluginPostExcerpt = ({ 14866 children, 14867 className 14868 }) => { 14869 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(plugin_Fill, { 14870 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelRow, { 14871 className: className, 14872 children: children 14873 }) 14874 }); 14875 }; 14876 PluginPostExcerpt.Slot = plugin_Slot; 14877 /* harmony default export */ const post_excerpt_plugin = (PluginPostExcerpt); 14878 14879 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-excerpt/panel.js 14880 /** 14881 * WordPress dependencies 14882 */ 14883 14884 14885 14886 14887 14888 14889 14890 14891 /** 14892 * Internal dependencies 14893 */ 14894 14895 14896 14897 14898 14899 14900 /** 14901 * Module Constants 14902 */ 14903 14904 14905 14906 const post_excerpt_panel_PANEL_NAME = 'post-excerpt'; 14907 function ExcerptPanel() { 14908 const { 14909 isOpened, 14910 isEnabled, 14911 postType 14912 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 14913 const { 14914 isEditorPanelOpened, 14915 isEditorPanelEnabled, 14916 getCurrentPostType 14917 } = select(store_store); 14918 return { 14919 isOpened: isEditorPanelOpened(post_excerpt_panel_PANEL_NAME), 14920 isEnabled: isEditorPanelEnabled(post_excerpt_panel_PANEL_NAME), 14921 postType: getCurrentPostType() 14922 }; 14923 }, []); 14924 const { 14925 toggleEditorPanelOpened 14926 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 14927 const toggleExcerptPanel = () => toggleEditorPanelOpened(post_excerpt_panel_PANEL_NAME); 14928 if (!isEnabled) { 14929 return null; 14930 } 14931 14932 // There are special cases where we want to label the excerpt as a description. 14933 const shouldUseDescriptionLabel = ['wp_template', 'wp_template_part', 'wp_block'].includes(postType); 14934 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelBody, { 14935 title: shouldUseDescriptionLabel ? (0,external_wp_i18n_namespaceObject.__)('Description') : (0,external_wp_i18n_namespaceObject.__)('Excerpt'), 14936 opened: isOpened, 14937 onToggle: toggleExcerptPanel, 14938 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_excerpt_plugin.Slot, { 14939 children: fills => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 14940 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostExcerpt, {}), fills] 14941 }) 14942 }) 14943 }); 14944 } 14945 14946 /** 14947 * Is rendered if the post type supports excerpts and allows editing the excerpt. 14948 * 14949 * @return {JSX.Element} The rendered PostExcerptPanel component. 14950 */ 14951 function PostExcerptPanel() { 14952 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_excerpt_check, { 14953 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ExcerptPanel, {}) 14954 }); 14955 } 14956 function PrivatePostExcerptPanel() { 14957 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_excerpt_check, { 14958 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PrivateExcerpt, {}) 14959 }); 14960 } 14961 function PrivateExcerpt() { 14962 const { 14963 shouldRender, 14964 excerpt, 14965 shouldBeUsedAsDescription, 14966 allowEditing 14967 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 14968 const { 14969 getCurrentPostType, 14970 getCurrentPostId, 14971 getEditedPostAttribute, 14972 isEditorPanelEnabled 14973 } = select(store_store); 14974 const postType = getCurrentPostType(); 14975 const isTemplateOrTemplatePart = ['wp_template', 'wp_template_part'].includes(postType); 14976 const isPattern = postType === 'wp_block'; 14977 // These post types use the `excerpt` field as a description semantically, so we need to 14978 // handle proper labeling and some flows where we should always render them as text. 14979 const _shouldBeUsedAsDescription = isTemplateOrTemplatePart || isPattern; 14980 const _usedAttribute = isTemplateOrTemplatePart ? 'description' : 'excerpt'; 14981 // We need to fetch the entity in this case to check if we'll allow editing. 14982 const template = isTemplateOrTemplatePart && select(external_wp_coreData_namespaceObject.store).getEntityRecord('postType', postType, getCurrentPostId()); 14983 // For post types that use excerpt as description, we do not abide 14984 // by the `isEnabled` panel flag in order to render them as text. 14985 const _shouldRender = isEditorPanelEnabled(post_excerpt_panel_PANEL_NAME) || _shouldBeUsedAsDescription; 14986 return { 14987 excerpt: getEditedPostAttribute(_usedAttribute), 14988 shouldRender: _shouldRender, 14989 shouldBeUsedAsDescription: _shouldBeUsedAsDescription, 14990 // If we should render, allow editing for all post types that are not used as description. 14991 // For the rest allow editing only for user generated entities. 14992 allowEditing: _shouldRender && (!_shouldBeUsedAsDescription || isPattern || template && template.source === TEMPLATE_ORIGINS.custom && !template.has_theme_file && template.is_custom) 14993 }; 14994 }, []); 14995 const [popoverAnchor, setPopoverAnchor] = (0,external_wp_element_namespaceObject.useState)(null); 14996 const label = shouldBeUsedAsDescription ? (0,external_wp_i18n_namespaceObject.__)('Description') : (0,external_wp_i18n_namespaceObject.__)('Excerpt'); 14997 // Memoize popoverProps to avoid returning a new object every time. 14998 const popoverProps = (0,external_wp_element_namespaceObject.useMemo)(() => ({ 14999 // Anchor the popover to the middle of the entire row so that it doesn't 15000 // move around when the label changes. 15001 anchor: popoverAnchor, 15002 'aria-label': label, 15003 headerTitle: label, 15004 placement: 'left-start', 15005 offset: 36, 15006 shift: true 15007 }), [popoverAnchor, label]); 15008 if (!shouldRender) { 15009 return false; 15010 } 15011 const excerptText = !!excerpt && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { 15012 align: "left", 15013 numberOfLines: 4, 15014 truncate: allowEditing, 15015 children: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(excerpt) 15016 }); 15017 if (!allowEditing) { 15018 return excerptText; 15019 } 15020 const excerptPlaceholder = shouldBeUsedAsDescription ? (0,external_wp_i18n_namespaceObject.__)('Add a description…') : (0,external_wp_i18n_namespaceObject.__)('Add an excerpt…'); 15021 const triggerEditLabel = shouldBeUsedAsDescription ? (0,external_wp_i18n_namespaceObject.__)('Edit description') : (0,external_wp_i18n_namespaceObject.__)('Edit excerpt'); 15022 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { 15023 children: [excerptText, /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Dropdown, { 15024 className: "editor-post-excerpt__dropdown", 15025 contentClassName: "editor-post-excerpt__dropdown__content", 15026 popoverProps: popoverProps, 15027 focusOnMount: true, 15028 ref: setPopoverAnchor, 15029 renderToggle: ({ 15030 onToggle 15031 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 15032 __next40pxDefaultSize: true, 15033 onClick: onToggle, 15034 variant: "link", 15035 children: excerptText ? triggerEditLabel : excerptPlaceholder 15036 }), 15037 renderContent: ({ 15038 onClose 15039 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 15040 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalInspectorPopoverHeader, { 15041 title: label, 15042 onClose: onClose 15043 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalVStack, { 15044 spacing: 4, 15045 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_excerpt_plugin.Slot, { 15046 children: fills => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 15047 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostExcerpt, { 15048 hideLabelFromVision: true, 15049 updateOnBlur: true 15050 }), fills] 15051 }) 15052 }) 15053 })] 15054 }) 15055 })] 15056 }); 15057 } 15058 15059 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/theme-support-check/index.js 15060 /** 15061 * WordPress dependencies 15062 */ 15063 15064 15065 15066 /** 15067 * Internal dependencies 15068 */ 15069 15070 15071 /** 15072 * Checks if the current theme supports specific features and renders the children if supported. 15073 * 15074 * @param {Object} props The component props. 15075 * @param {Element} props.children The children to render if the theme supports the specified features. 15076 * @param {string|string[]} props.supportKeys The key(s) of the theme support(s) to check. 15077 * 15078 * @return {JSX.Element|null} The rendered children if the theme supports the specified features, otherwise null. 15079 */ 15080 function ThemeSupportCheck({ 15081 children, 15082 supportKeys 15083 }) { 15084 const { 15085 postType, 15086 themeSupports 15087 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 15088 return { 15089 postType: select(store_store).getEditedPostAttribute('type'), 15090 themeSupports: select(external_wp_coreData_namespaceObject.store).getThemeSupports() 15091 }; 15092 }, []); 15093 const isSupported = (Array.isArray(supportKeys) ? supportKeys : [supportKeys]).some(key => { 15094 var _themeSupports$key; 15095 const supported = (_themeSupports$key = themeSupports?.[key]) !== null && _themeSupports$key !== void 0 ? _themeSupports$key : false; 15096 // 'post-thumbnails' can be boolean or an array of post types. 15097 // In the latter case, we need to verify `postType` exists 15098 // within `supported`. If `postType` isn't passed, then the check 15099 // should fail. 15100 if ('post-thumbnails' === key && Array.isArray(supported)) { 15101 return supported.includes(postType); 15102 } 15103 return supported; 15104 }); 15105 if (!isSupported) { 15106 return null; 15107 } 15108 return children; 15109 } 15110 15111 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-featured-image/check.js 15112 /** 15113 * Internal dependencies 15114 */ 15115 15116 15117 15118 /** 15119 * Wrapper component that renders its children only if the post type supports a featured image 15120 * and the theme supports post thumbnails. 15121 * 15122 * @param {Object} props Props. 15123 * @param {Element} props.children Children to be rendered. 15124 * 15125 * @return {Component} The component to be rendered. 15126 */ 15127 15128 function PostFeaturedImageCheck({ 15129 children 15130 }) { 15131 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ThemeSupportCheck, { 15132 supportKeys: "post-thumbnails", 15133 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_type_support_check, { 15134 supportKeys: "thumbnail", 15135 children: children 15136 }) 15137 }); 15138 } 15139 /* harmony default export */ const post_featured_image_check = (PostFeaturedImageCheck); 15140 15141 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-featured-image/index.js 15142 /** 15143 * WordPress dependencies 15144 */ 15145 15146 15147 15148 15149 15150 15151 15152 15153 15154 15155 /** 15156 * Internal dependencies 15157 */ 15158 15159 15160 15161 15162 const ALLOWED_MEDIA_TYPES = ['image']; 15163 15164 // Used when labels from post type were not yet loaded or when they are not present. 15165 const DEFAULT_FEATURE_IMAGE_LABEL = (0,external_wp_i18n_namespaceObject.__)('Featured image'); 15166 const DEFAULT_SET_FEATURE_IMAGE_LABEL = (0,external_wp_i18n_namespaceObject.__)('Add a featured image'); 15167 const instructions = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { 15168 children: (0,external_wp_i18n_namespaceObject.__)('To edit the featured image, you need permission to upload media.') 15169 }); 15170 function getMediaDetails(media, postId) { 15171 var _media$media_details$, _media$media_details$2; 15172 if (!media) { 15173 return {}; 15174 } 15175 const defaultSize = (0,external_wp_hooks_namespaceObject.applyFilters)('editor.PostFeaturedImage.imageSize', 'large', media.id, postId); 15176 if (defaultSize in ((_media$media_details$ = media?.media_details?.sizes) !== null && _media$media_details$ !== void 0 ? _media$media_details$ : {})) { 15177 return { 15178 mediaWidth: media.media_details.sizes[defaultSize].width, 15179 mediaHeight: media.media_details.sizes[defaultSize].height, 15180 mediaSourceUrl: media.media_details.sizes[defaultSize].source_url 15181 }; 15182 } 15183 15184 // Use fallbackSize when defaultSize is not available. 15185 const fallbackSize = (0,external_wp_hooks_namespaceObject.applyFilters)('editor.PostFeaturedImage.imageSize', 'thumbnail', media.id, postId); 15186 if (fallbackSize in ((_media$media_details$2 = media?.media_details?.sizes) !== null && _media$media_details$2 !== void 0 ? _media$media_details$2 : {})) { 15187 return { 15188 mediaWidth: media.media_details.sizes[fallbackSize].width, 15189 mediaHeight: media.media_details.sizes[fallbackSize].height, 15190 mediaSourceUrl: media.media_details.sizes[fallbackSize].source_url 15191 }; 15192 } 15193 15194 // Use full image size when fallbackSize and defaultSize are not available. 15195 return { 15196 mediaWidth: media.media_details.width, 15197 mediaHeight: media.media_details.height, 15198 mediaSourceUrl: media.source_url 15199 }; 15200 } 15201 function PostFeaturedImage({ 15202 currentPostId, 15203 featuredImageId, 15204 onUpdateImage, 15205 onRemoveImage, 15206 media, 15207 postType, 15208 noticeUI, 15209 noticeOperations 15210 }) { 15211 const toggleRef = (0,external_wp_element_namespaceObject.useRef)(); 15212 const [isLoading, setIsLoading] = (0,external_wp_element_namespaceObject.useState)(false); 15213 const { 15214 getSettings 15215 } = (0,external_wp_data_namespaceObject.useSelect)(external_wp_blockEditor_namespaceObject.store); 15216 const { 15217 mediaSourceUrl 15218 } = getMediaDetails(media, currentPostId); 15219 function onDropFiles(filesList) { 15220 getSettings().mediaUpload({ 15221 allowedTypes: ALLOWED_MEDIA_TYPES, 15222 filesList, 15223 onFileChange([image]) { 15224 if ((0,external_wp_blob_namespaceObject.isBlobURL)(image?.url)) { 15225 setIsLoading(true); 15226 return; 15227 } 15228 if (image) { 15229 onUpdateImage(image); 15230 } 15231 setIsLoading(false); 15232 }, 15233 onError(message) { 15234 noticeOperations.removeAllNotices(); 15235 noticeOperations.createErrorNotice(message); 15236 } 15237 }); 15238 } 15239 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(post_featured_image_check, { 15240 children: [noticeUI, /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 15241 className: "editor-post-featured-image", 15242 children: [media && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 15243 id: `editor-post-featured-image-$featuredImageId}-describedby`, 15244 className: "hidden", 15245 children: [media.alt_text && (0,external_wp_i18n_namespaceObject.sprintf)( 15246 // Translators: %s: The selected image alt text. 15247 (0,external_wp_i18n_namespaceObject.__)('Current image: %s'), media.alt_text), !media.alt_text && (0,external_wp_i18n_namespaceObject.sprintf)( 15248 // Translators: %s: The selected image filename. 15249 (0,external_wp_i18n_namespaceObject.__)('The current image has no alternative text. The file name is: %s'), media.media_details.sizes?.full?.file || media.slug)] 15250 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.MediaUploadCheck, { 15251 fallback: instructions, 15252 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.MediaUpload, { 15253 title: postType?.labels?.featured_image || DEFAULT_FEATURE_IMAGE_LABEL, 15254 onSelect: onUpdateImage, 15255 unstableFeaturedImageFlow: true, 15256 allowedTypes: ALLOWED_MEDIA_TYPES, 15257 modalClass: "editor-post-featured-image__media-modal", 15258 render: ({ 15259 open 15260 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 15261 className: "editor-post-featured-image__container", 15262 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.Button, { 15263 __next40pxDefaultSize: true, 15264 ref: toggleRef, 15265 className: !featuredImageId ? 'editor-post-featured-image__toggle' : 'editor-post-featured-image__preview', 15266 onClick: open, 15267 "aria-label": !featuredImageId ? null : (0,external_wp_i18n_namespaceObject.__)('Edit or replace the featured image'), 15268 "aria-describedby": !featuredImageId ? null : `editor-post-featured-image-$featuredImageId}-describedby`, 15269 "aria-haspopup": "dialog", 15270 disabled: isLoading, 15271 accessibleWhenDisabled: true, 15272 children: [!!featuredImageId && media && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("img", { 15273 className: "editor-post-featured-image__preview-image", 15274 src: mediaSourceUrl, 15275 alt: "" 15276 }), isLoading && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Spinner, {}), !featuredImageId && !isLoading && (postType?.labels?.set_featured_image || DEFAULT_SET_FEATURE_IMAGE_LABEL)] 15277 }), !!featuredImageId && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, { 15278 className: "editor-post-featured-image__actions", 15279 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 15280 __next40pxDefaultSize: true, 15281 className: "editor-post-featured-image__action", 15282 onClick: open, 15283 "aria-haspopup": "dialog", 15284 children: (0,external_wp_i18n_namespaceObject.__)('Replace') 15285 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 15286 __next40pxDefaultSize: true, 15287 className: "editor-post-featured-image__action", 15288 onClick: () => { 15289 onRemoveImage(); 15290 toggleRef.current.focus(); 15291 }, 15292 children: (0,external_wp_i18n_namespaceObject.__)('Remove') 15293 })] 15294 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.DropZone, { 15295 onFilesDrop: onDropFiles 15296 })] 15297 }), 15298 value: featuredImageId 15299 }) 15300 })] 15301 })] 15302 }); 15303 } 15304 const applyWithSelect = (0,external_wp_data_namespaceObject.withSelect)(select => { 15305 const { 15306 getMedia, 15307 getPostType 15308 } = select(external_wp_coreData_namespaceObject.store); 15309 const { 15310 getCurrentPostId, 15311 getEditedPostAttribute 15312 } = select(store_store); 15313 const featuredImageId = getEditedPostAttribute('featured_media'); 15314 return { 15315 media: featuredImageId ? getMedia(featuredImageId, { 15316 context: 'view' 15317 }) : null, 15318 currentPostId: getCurrentPostId(), 15319 postType: getPostType(getEditedPostAttribute('type')), 15320 featuredImageId 15321 }; 15322 }); 15323 const applyWithDispatch = (0,external_wp_data_namespaceObject.withDispatch)((dispatch, { 15324 noticeOperations 15325 }, { 15326 select 15327 }) => { 15328 const { 15329 editPost 15330 } = dispatch(store_store); 15331 return { 15332 onUpdateImage(image) { 15333 editPost({ 15334 featured_media: image.id 15335 }); 15336 }, 15337 onDropImage(filesList) { 15338 select(external_wp_blockEditor_namespaceObject.store).getSettings().mediaUpload({ 15339 allowedTypes: ['image'], 15340 filesList, 15341 onFileChange([image]) { 15342 editPost({ 15343 featured_media: image.id 15344 }); 15345 }, 15346 onError(message) { 15347 noticeOperations.removeAllNotices(); 15348 noticeOperations.createErrorNotice(message); 15349 } 15350 }); 15351 }, 15352 onRemoveImage() { 15353 editPost({ 15354 featured_media: 0 15355 }); 15356 } 15357 }; 15358 }); 15359 15360 /** 15361 * Renders the component for managing the featured image of a post. 15362 * 15363 * @param {Object} props Props. 15364 * @param {number} props.currentPostId ID of the current post. 15365 * @param {number} props.featuredImageId ID of the featured image. 15366 * @param {Function} props.onUpdateImage Function to call when the image is updated. 15367 * @param {Function} props.onRemoveImage Function to call when the image is removed. 15368 * @param {Object} props.media The media object representing the featured image. 15369 * @param {string} props.postType Post type. 15370 * @param {Element} props.noticeUI UI for displaying notices. 15371 * @param {Object} props.noticeOperations Operations for managing notices. 15372 * 15373 * @return {Element} Component to be rendered . 15374 */ 15375 /* harmony default export */ const post_featured_image = ((0,external_wp_compose_namespaceObject.compose)(external_wp_components_namespaceObject.withNotices, applyWithSelect, applyWithDispatch, (0,external_wp_components_namespaceObject.withFilters)('editor.PostFeaturedImage'))(PostFeaturedImage)); 15376 15377 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-featured-image/panel.js 15378 /** 15379 * WordPress dependencies 15380 */ 15381 15382 15383 15384 15385 15386 /** 15387 * Internal dependencies 15388 */ 15389 15390 15391 15392 15393 const post_featured_image_panel_PANEL_NAME = 'featured-image'; 15394 15395 /** 15396 * Renders the panel for the post featured image. 15397 * 15398 * @param {Object} props Props. 15399 * @param {boolean} props.withPanelBody Whether to include the panel body. Default true. 15400 * 15401 * @return {Component|null} The component to be rendered. 15402 * Return Null if the editor panel is disabled for featured image. 15403 */ 15404 function PostFeaturedImagePanel({ 15405 withPanelBody = true 15406 }) { 15407 var _postType$labels$feat; 15408 const { 15409 postType, 15410 isEnabled, 15411 isOpened 15412 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 15413 const { 15414 getEditedPostAttribute, 15415 isEditorPanelEnabled, 15416 isEditorPanelOpened 15417 } = select(store_store); 15418 const { 15419 getPostType 15420 } = select(external_wp_coreData_namespaceObject.store); 15421 return { 15422 postType: getPostType(getEditedPostAttribute('type')), 15423 isEnabled: isEditorPanelEnabled(post_featured_image_panel_PANEL_NAME), 15424 isOpened: isEditorPanelOpened(post_featured_image_panel_PANEL_NAME) 15425 }; 15426 }, []); 15427 const { 15428 toggleEditorPanelOpened 15429 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 15430 if (!isEnabled) { 15431 return null; 15432 } 15433 if (!withPanelBody) { 15434 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_featured_image_check, { 15435 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_featured_image, {}) 15436 }); 15437 } 15438 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_featured_image_check, { 15439 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelBody, { 15440 title: (_postType$labels$feat = postType?.labels?.featured_image) !== null && _postType$labels$feat !== void 0 ? _postType$labels$feat : (0,external_wp_i18n_namespaceObject.__)('Featured image'), 15441 opened: isOpened, 15442 onToggle: () => toggleEditorPanelOpened(post_featured_image_panel_PANEL_NAME), 15443 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_featured_image, {}) 15444 }) 15445 }); 15446 } 15447 15448 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-format/check.js 15449 /** 15450 * WordPress dependencies 15451 */ 15452 15453 15454 /** 15455 * Internal dependencies 15456 */ 15457 15458 15459 15460 function PostFormatCheck({ 15461 children 15462 }) { 15463 const disablePostFormats = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getEditorSettings().disablePostFormats, []); 15464 if (disablePostFormats) { 15465 return null; 15466 } 15467 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_type_support_check, { 15468 supportKeys: "post-formats", 15469 children: children 15470 }); 15471 } 15472 15473 /** 15474 * Component check if there are any post formats. 15475 * 15476 * @param {Object} props The component props. 15477 * @param {Element} props.children The child elements to render. 15478 * 15479 * @return {Component|null} The rendered component or null if post formats are disabled. 15480 */ 15481 /* harmony default export */ const post_format_check = (PostFormatCheck); 15482 15483 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-format/index.js 15484 /** 15485 * WordPress dependencies 15486 */ 15487 15488 15489 15490 15491 15492 15493 /** 15494 * Internal dependencies 15495 */ 15496 15497 15498 15499 // All WP post formats, sorted alphabetically by translated name. 15500 15501 15502 const POST_FORMATS = [{ 15503 id: 'aside', 15504 caption: (0,external_wp_i18n_namespaceObject.__)('Aside') 15505 }, { 15506 id: 'audio', 15507 caption: (0,external_wp_i18n_namespaceObject.__)('Audio') 15508 }, { 15509 id: 'chat', 15510 caption: (0,external_wp_i18n_namespaceObject.__)('Chat') 15511 }, { 15512 id: 'gallery', 15513 caption: (0,external_wp_i18n_namespaceObject.__)('Gallery') 15514 }, { 15515 id: 'image', 15516 caption: (0,external_wp_i18n_namespaceObject.__)('Image') 15517 }, { 15518 id: 'link', 15519 caption: (0,external_wp_i18n_namespaceObject.__)('Link') 15520 }, { 15521 id: 'quote', 15522 caption: (0,external_wp_i18n_namespaceObject.__)('Quote') 15523 }, { 15524 id: 'standard', 15525 caption: (0,external_wp_i18n_namespaceObject.__)('Standard') 15526 }, { 15527 id: 'status', 15528 caption: (0,external_wp_i18n_namespaceObject.__)('Status') 15529 }, { 15530 id: 'video', 15531 caption: (0,external_wp_i18n_namespaceObject.__)('Video') 15532 }].sort((a, b) => { 15533 const normalizedA = a.caption.toUpperCase(); 15534 const normalizedB = b.caption.toUpperCase(); 15535 if (normalizedA < normalizedB) { 15536 return -1; 15537 } 15538 if (normalizedA > normalizedB) { 15539 return 1; 15540 } 15541 return 0; 15542 }); 15543 15544 /** 15545 * `PostFormat` a component that allows changing the post format while also providing a suggestion for the current post. 15546 * 15547 * @example 15548 * ```jsx 15549 * <PostFormat /> 15550 * ``` 15551 * 15552 * @return {JSX.Element} The rendered PostFormat component. 15553 */ 15554 function PostFormat() { 15555 const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(PostFormat); 15556 const postFormatSelectorId = `post-format-selector-$instanceId}`; 15557 const { 15558 postFormat, 15559 suggestedFormat, 15560 supportedFormats 15561 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 15562 const { 15563 getEditedPostAttribute, 15564 getSuggestedPostFormat 15565 } = select(store_store); 15566 const _postFormat = getEditedPostAttribute('format'); 15567 const themeSupports = select(external_wp_coreData_namespaceObject.store).getThemeSupports(); 15568 return { 15569 postFormat: _postFormat !== null && _postFormat !== void 0 ? _postFormat : 'standard', 15570 suggestedFormat: getSuggestedPostFormat(), 15571 supportedFormats: themeSupports.formats 15572 }; 15573 }, []); 15574 const formats = POST_FORMATS.filter(format => { 15575 // Ensure current format is always in the set. 15576 // The current format may not be a format supported by the theme. 15577 return supportedFormats?.includes(format.id) || postFormat === format.id; 15578 }); 15579 const suggestion = formats.find(format => format.id === suggestedFormat); 15580 const { 15581 editPost 15582 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 15583 const onUpdatePostFormat = format => editPost({ 15584 format 15585 }); 15586 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_format_check, { 15587 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 15588 className: "editor-post-format", 15589 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.RadioControl, { 15590 className: "editor-post-format__options", 15591 label: (0,external_wp_i18n_namespaceObject.__)('Post Format'), 15592 selected: postFormat, 15593 onChange: format => onUpdatePostFormat(format), 15594 id: postFormatSelectorId, 15595 options: formats.map(format => ({ 15596 label: format.caption, 15597 value: format.id 15598 })), 15599 hideLabelFromVision: true 15600 }), suggestion && suggestion.id !== postFormat && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { 15601 className: "editor-post-format__suggestion", 15602 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 15603 __next40pxDefaultSize: true, 15604 variant: "link", 15605 onClick: () => onUpdatePostFormat(suggestion.id), 15606 children: (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: post format */ 15607 (0,external_wp_i18n_namespaceObject.__)('Apply suggested format: %s'), suggestion.caption) 15608 }) 15609 })] 15610 }) 15611 }); 15612 } 15613 15614 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-last-revision/check.js 15615 /** 15616 * WordPress dependencies 15617 */ 15618 15619 15620 /** 15621 * Internal dependencies 15622 */ 15623 15624 15625 15626 /** 15627 * Wrapper component that renders its children if the post has more than one revision. 15628 * 15629 * @param {Object} props Props. 15630 * @param {Element} props.children Children to be rendered. 15631 * 15632 * @return {Component|null} Rendered child components if post has more than one revision, otherwise null. 15633 */ 15634 15635 function PostLastRevisionCheck({ 15636 children 15637 }) { 15638 const { 15639 lastRevisionId, 15640 revisionsCount 15641 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 15642 const { 15643 getCurrentPostLastRevisionId, 15644 getCurrentPostRevisionsCount 15645 } = select(store_store); 15646 return { 15647 lastRevisionId: getCurrentPostLastRevisionId(), 15648 revisionsCount: getCurrentPostRevisionsCount() 15649 }; 15650 }, []); 15651 if (!lastRevisionId || revisionsCount < 2) { 15652 return null; 15653 } 15654 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_type_support_check, { 15655 supportKeys: "revisions", 15656 children: children 15657 }); 15658 } 15659 /* harmony default export */ const post_last_revision_check = (PostLastRevisionCheck); 15660 15661 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-last-revision/index.js 15662 /** 15663 * WordPress dependencies 15664 */ 15665 15666 15667 15668 15669 15670 15671 /** 15672 * Internal dependencies 15673 */ 15674 15675 15676 15677 15678 function usePostLastRevisionInfo() { 15679 return (0,external_wp_data_namespaceObject.useSelect)(select => { 15680 const { 15681 getCurrentPostLastRevisionId, 15682 getCurrentPostRevisionsCount 15683 } = select(store_store); 15684 return { 15685 lastRevisionId: getCurrentPostLastRevisionId(), 15686 revisionsCount: getCurrentPostRevisionsCount() 15687 }; 15688 }, []); 15689 } 15690 15691 /** 15692 * Renders the component for displaying the last revision of a post. 15693 * 15694 * @return {Component} The component to be rendered. 15695 */ 15696 function PostLastRevision() { 15697 const { 15698 lastRevisionId, 15699 revisionsCount 15700 } = usePostLastRevisionInfo(); 15701 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_last_revision_check, { 15702 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 15703 __next40pxDefaultSize: true, 15704 href: (0,external_wp_url_namespaceObject.addQueryArgs)('revision.php', { 15705 revision: lastRevisionId 15706 }), 15707 className: "editor-post-last-revision__title", 15708 icon: library_backup, 15709 iconPosition: "right", 15710 text: (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: number of revisions. */ 15711 (0,external_wp_i18n_namespaceObject.__)('Revisions (%s)'), revisionsCount) 15712 }) 15713 }); 15714 } 15715 function PrivatePostLastRevision() { 15716 const { 15717 lastRevisionId, 15718 revisionsCount 15719 } = usePostLastRevisionInfo(); 15720 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_last_revision_check, { 15721 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { 15722 label: (0,external_wp_i18n_namespaceObject.__)('Revisions'), 15723 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 15724 href: (0,external_wp_url_namespaceObject.addQueryArgs)('revision.php', { 15725 revision: lastRevisionId 15726 }), 15727 className: "editor-private-post-last-revision__button", 15728 text: revisionsCount, 15729 variant: "tertiary", 15730 size: "compact" 15731 }) 15732 }) 15733 }); 15734 } 15735 /* harmony default export */ const post_last_revision = (PostLastRevision); 15736 15737 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-last-revision/panel.js 15738 /** 15739 * WordPress dependencies 15740 */ 15741 15742 15743 /** 15744 * Internal dependencies 15745 */ 15746 15747 15748 15749 /** 15750 * Renders the panel for displaying the last revision of a post. 15751 * 15752 * @return {Component} The component to be rendered. 15753 */ 15754 15755 function PostLastRevisionPanel() { 15756 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_last_revision_check, { 15757 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelBody, { 15758 className: "editor-post-last-revision__panel", 15759 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_last_revision, {}) 15760 }) 15761 }); 15762 } 15763 /* harmony default export */ const post_last_revision_panel = (PostLastRevisionPanel); 15764 15765 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-locked-modal/index.js 15766 /** 15767 * WordPress dependencies 15768 */ 15769 15770 15771 15772 15773 15774 15775 15776 15777 15778 /** 15779 * Internal dependencies 15780 */ 15781 15782 15783 /** 15784 * A modal component that is displayed when a post is locked for editing by another user. 15785 * The modal provides information about the lock status and options to take over or exit the editor. 15786 * 15787 * @return {JSX.Element|null} The rendered PostLockedModal component. 15788 */ 15789 15790 15791 15792 function PostLockedModal() { 15793 const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(PostLockedModal); 15794 const hookName = 'core/editor/post-locked-modal-' + instanceId; 15795 const { 15796 autosave, 15797 updatePostLock 15798 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 15799 const { 15800 isLocked, 15801 isTakeover, 15802 user, 15803 postId, 15804 postLockUtils, 15805 activePostLock, 15806 postType, 15807 previewLink 15808 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 15809 const { 15810 isPostLocked, 15811 isPostLockTakeover, 15812 getPostLockUser, 15813 getCurrentPostId, 15814 getActivePostLock, 15815 getEditedPostAttribute, 15816 getEditedPostPreviewLink, 15817 getEditorSettings 15818 } = select(store_store); 15819 const { 15820 getPostType 15821 } = select(external_wp_coreData_namespaceObject.store); 15822 return { 15823 isLocked: isPostLocked(), 15824 isTakeover: isPostLockTakeover(), 15825 user: getPostLockUser(), 15826 postId: getCurrentPostId(), 15827 postLockUtils: getEditorSettings().postLockUtils, 15828 activePostLock: getActivePostLock(), 15829 postType: getPostType(getEditedPostAttribute('type')), 15830 previewLink: getEditedPostPreviewLink() 15831 }; 15832 }, []); 15833 (0,external_wp_element_namespaceObject.useEffect)(() => { 15834 /** 15835 * Keep the lock refreshed. 15836 * 15837 * When the user does not send a heartbeat in a heartbeat-tick 15838 * the user is no longer editing and another user can start editing. 15839 * 15840 * @param {Object} data Data to send in the heartbeat request. 15841 */ 15842 function sendPostLock(data) { 15843 if (isLocked) { 15844 return; 15845 } 15846 data['wp-refresh-post-lock'] = { 15847 lock: activePostLock, 15848 post_id: postId 15849 }; 15850 } 15851 15852 /** 15853 * Refresh post locks: update the lock string or show the dialog if somebody has taken over editing. 15854 * 15855 * @param {Object} data Data received in the heartbeat request 15856 */ 15857 function receivePostLock(data) { 15858 if (!data['wp-refresh-post-lock']) { 15859 return; 15860 } 15861 const received = data['wp-refresh-post-lock']; 15862 if (received.lock_error) { 15863 // Auto save and display the takeover modal. 15864 autosave(); 15865 updatePostLock({ 15866 isLocked: true, 15867 isTakeover: true, 15868 user: { 15869 name: received.lock_error.name, 15870 avatar: received.lock_error.avatar_src_2x 15871 } 15872 }); 15873 } else if (received.new_lock) { 15874 updatePostLock({ 15875 isLocked: false, 15876 activePostLock: received.new_lock 15877 }); 15878 } 15879 } 15880 15881 /** 15882 * Unlock the post before the window is exited. 15883 */ 15884 function releasePostLock() { 15885 if (isLocked || !activePostLock) { 15886 return; 15887 } 15888 const data = new window.FormData(); 15889 data.append('action', 'wp-remove-post-lock'); 15890 data.append('_wpnonce', postLockUtils.unlockNonce); 15891 data.append('post_ID', postId); 15892 data.append('active_post_lock', activePostLock); 15893 if (window.navigator.sendBeacon) { 15894 window.navigator.sendBeacon(postLockUtils.ajaxUrl, data); 15895 } else { 15896 const xhr = new window.XMLHttpRequest(); 15897 xhr.open('POST', postLockUtils.ajaxUrl, false); 15898 xhr.send(data); 15899 } 15900 } 15901 15902 // Details on these events on the Heartbeat API docs 15903 // https://developer.wordpress.org/plugins/javascript/heartbeat-api/ 15904 (0,external_wp_hooks_namespaceObject.addAction)('heartbeat.send', hookName, sendPostLock); 15905 (0,external_wp_hooks_namespaceObject.addAction)('heartbeat.tick', hookName, receivePostLock); 15906 window.addEventListener('beforeunload', releasePostLock); 15907 return () => { 15908 (0,external_wp_hooks_namespaceObject.removeAction)('heartbeat.send', hookName); 15909 (0,external_wp_hooks_namespaceObject.removeAction)('heartbeat.tick', hookName); 15910 window.removeEventListener('beforeunload', releasePostLock); 15911 }; 15912 }, []); 15913 if (!isLocked) { 15914 return null; 15915 } 15916 const userDisplayName = user.name; 15917 const userAvatar = user.avatar; 15918 const unlockUrl = (0,external_wp_url_namespaceObject.addQueryArgs)('post.php', { 15919 'get-post-lock': '1', 15920 lockKey: true, 15921 post: postId, 15922 action: 'edit', 15923 _wpnonce: postLockUtils.nonce 15924 }); 15925 const allPostsUrl = (0,external_wp_url_namespaceObject.addQueryArgs)('edit.php', { 15926 post_type: postType?.slug 15927 }); 15928 const allPostsLabel = (0,external_wp_i18n_namespaceObject.__)('Exit editor'); 15929 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Modal, { 15930 title: isTakeover ? (0,external_wp_i18n_namespaceObject.__)('Someone else has taken over this post') : (0,external_wp_i18n_namespaceObject.__)('This post is already being edited'), 15931 focusOnMount: true, 15932 shouldCloseOnClickOutside: false, 15933 shouldCloseOnEsc: false, 15934 isDismissible: false 15935 // Do not remove this class, as this class is used by third party plugins. 15936 , 15937 className: "editor-post-locked-modal", 15938 size: "medium", 15939 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, { 15940 alignment: "top", 15941 spacing: 6, 15942 children: [!!userAvatar && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("img", { 15943 src: userAvatar, 15944 alt: (0,external_wp_i18n_namespaceObject.__)('Avatar'), 15945 className: "editor-post-locked-modal__avatar", 15946 width: 64, 15947 height: 64 15948 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 15949 children: [!!isTakeover && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { 15950 children: (0,external_wp_element_namespaceObject.createInterpolateElement)(userDisplayName ? (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: user's display name */ 15951 (0,external_wp_i18n_namespaceObject.__)('<strong>%s</strong> now has editing control of this post (<PreviewLink />). Don’t worry, your changes up to this moment have been saved.'), userDisplayName) : (0,external_wp_i18n_namespaceObject.__)('Another user now has editing control of this post (<PreviewLink />). Don’t worry, your changes up to this moment have been saved.'), { 15952 strong: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("strong", {}), 15953 PreviewLink: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ExternalLink, { 15954 href: previewLink, 15955 children: (0,external_wp_i18n_namespaceObject.__)('preview') 15956 }) 15957 }) 15958 }), !isTakeover && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 15959 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { 15960 children: (0,external_wp_element_namespaceObject.createInterpolateElement)(userDisplayName ? (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: user's display name */ 15961 (0,external_wp_i18n_namespaceObject.__)('<strong>%s</strong> is currently working on this post (<PreviewLink />), which means you cannot make changes, unless you take over.'), userDisplayName) : (0,external_wp_i18n_namespaceObject.__)('Another user is currently working on this post (<PreviewLink />), which means you cannot make changes, unless you take over.'), { 15962 strong: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("strong", {}), 15963 PreviewLink: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ExternalLink, { 15964 href: previewLink, 15965 children: (0,external_wp_i18n_namespaceObject.__)('preview') 15966 }) 15967 }) 15968 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { 15969 children: (0,external_wp_i18n_namespaceObject.__)('If you take over, the other user will lose editing control to the post, but their changes will be saved.') 15970 })] 15971 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, { 15972 className: "editor-post-locked-modal__buttons", 15973 justify: "flex-end", 15974 children: [!isTakeover && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 15975 __next40pxDefaultSize: true, 15976 variant: "tertiary", 15977 href: unlockUrl, 15978 children: (0,external_wp_i18n_namespaceObject.__)('Take over') 15979 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 15980 __next40pxDefaultSize: true, 15981 variant: "primary", 15982 href: allPostsUrl, 15983 children: allPostsLabel 15984 })] 15985 })] 15986 })] 15987 }) 15988 }); 15989 } 15990 15991 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-pending-status/check.js 15992 /** 15993 * WordPress dependencies 15994 */ 15995 15996 15997 /** 15998 * Internal dependencies 15999 */ 16000 16001 16002 /** 16003 * This component checks the publishing status of the current post. 16004 * If the post is already published or the user doesn't have the 16005 * capability to publish, it returns null. 16006 * 16007 * @param {Object} props Component properties. 16008 * @param {Element} props.children Children to be rendered. 16009 * 16010 * @return {JSX.Element|null} The rendered child elements or null if the post is already published or the user doesn't have the capability to publish. 16011 */ 16012 function PostPendingStatusCheck({ 16013 children 16014 }) { 16015 const { 16016 hasPublishAction, 16017 isPublished 16018 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 16019 var _getCurrentPost$_link; 16020 const { 16021 isCurrentPostPublished, 16022 getCurrentPost 16023 } = select(store_store); 16024 return { 16025 hasPublishAction: (_getCurrentPost$_link = getCurrentPost()._links?.['wp:action-publish']) !== null && _getCurrentPost$_link !== void 0 ? _getCurrentPost$_link : false, 16026 isPublished: isCurrentPostPublished() 16027 }; 16028 }, []); 16029 if (isPublished || !hasPublishAction) { 16030 return null; 16031 } 16032 return children; 16033 } 16034 /* harmony default export */ const post_pending_status_check = (PostPendingStatusCheck); 16035 16036 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-pending-status/index.js 16037 /** 16038 * WordPress dependencies 16039 */ 16040 16041 16042 16043 16044 /** 16045 * Internal dependencies 16046 */ 16047 16048 16049 16050 /** 16051 * A component for displaying and toggling the pending status of a post. 16052 * 16053 * @return {JSX.Element} The rendered component. 16054 */ 16055 16056 function PostPendingStatus() { 16057 const status = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getEditedPostAttribute('status'), []); 16058 const { 16059 editPost 16060 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 16061 const togglePendingStatus = () => { 16062 const updatedStatus = status === 'pending' ? 'draft' : 'pending'; 16063 editPost({ 16064 status: updatedStatus 16065 }); 16066 }; 16067 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_pending_status_check, { 16068 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.CheckboxControl, { 16069 __nextHasNoMarginBottom: true, 16070 label: (0,external_wp_i18n_namespaceObject.__)('Pending review'), 16071 checked: status === 'pending', 16072 onChange: togglePendingStatus 16073 }) 16074 }); 16075 } 16076 /* harmony default export */ const post_pending_status = (PostPendingStatus); 16077 16078 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-preview-button/index.js 16079 /** 16080 * WordPress dependencies 16081 */ 16082 16083 16084 16085 16086 16087 16088 16089 /** 16090 * Internal dependencies 16091 */ 16092 16093 16094 16095 16096 function writeInterstitialMessage(targetDocument) { 16097 let markup = (0,external_wp_element_namespaceObject.renderToString)( /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 16098 className: "editor-post-preview-button__interstitial-message", 16099 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.SVG, { 16100 xmlns: "http://www.w3.org/2000/svg", 16101 viewBox: "0 0 96 96", 16102 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Path, { 16103 className: "outer", 16104 d: "M48 12c19.9 0 36 16.1 36 36S67.9 84 48 84 12 67.9 12 48s16.1-36 36-36", 16105 fill: "none" 16106 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Path, { 16107 className: "inner", 16108 d: "M69.5 46.4c0-3.9-1.4-6.7-2.6-8.8-1.6-2.6-3.1-4.9-3.1-7.5 0-2.9 2.2-5.7 5.4-5.7h.4C63.9 19.2 56.4 16 48 16c-11.2 0-21 5.7-26.7 14.4h2.1c3.3 0 8.5-.4 8.5-.4 1.7-.1 1.9 2.4.2 2.6 0 0-1.7.2-3.7.3L40 67.5l7-20.9L42 33c-1.7-.1-3.3-.3-3.3-.3-1.7-.1-1.5-2.7.2-2.6 0 0 5.3.4 8.4.4 3.3 0 8.5-.4 8.5-.4 1.7-.1 1.9 2.4.2 2.6 0 0-1.7.2-3.7.3l11.5 34.3 3.3-10.4c1.6-4.5 2.4-7.8 2.4-10.5zM16.1 48c0 12.6 7.3 23.5 18 28.7L18.8 35c-1.7 4-2.7 8.4-2.7 13zm32.5 2.8L39 78.6c2.9.8 5.9 1.3 9 1.3 3.7 0 7.3-.6 10.6-1.8-.1-.1-.2-.3-.2-.4l-9.8-26.9zM76.2 36c0 3.2-.6 6.9-2.4 11.4L64 75.6c9.5-5.5 15.9-15.8 15.9-27.6 0-5.5-1.4-10.8-3.9-15.3.1 1 .2 2.1.2 3.3z", 16109 fill: "none" 16110 })] 16111 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { 16112 children: (0,external_wp_i18n_namespaceObject.__)('Generating preview…') 16113 })] 16114 })); 16115 markup += ` 16116 <style> 16117 body { 16118 margin: 0; 16119 } 16120 .editor-post-preview-button__interstitial-message { 16121 display: flex; 16122 flex-direction: column; 16123 align-items: center; 16124 justify-content: center; 16125 height: 100vh; 16126 width: 100vw; 16127 } 16128 @-webkit-keyframes paint { 16129 0% { 16130 stroke-dashoffset: 0; 16131 } 16132 } 16133 @-moz-keyframes paint { 16134 0% { 16135 stroke-dashoffset: 0; 16136 } 16137 } 16138 @-o-keyframes paint { 16139 0% { 16140 stroke-dashoffset: 0; 16141 } 16142 } 16143 @keyframes paint { 16144 0% { 16145 stroke-dashoffset: 0; 16146 } 16147 } 16148 .editor-post-preview-button__interstitial-message svg { 16149 width: 192px; 16150 height: 192px; 16151 stroke: #555d66; 16152 stroke-width: 0.75; 16153 } 16154 .editor-post-preview-button__interstitial-message svg .outer, 16155 .editor-post-preview-button__interstitial-message svg .inner { 16156 stroke-dasharray: 280; 16157 stroke-dashoffset: 280; 16158 -webkit-animation: paint 1.5s ease infinite alternate; 16159 -moz-animation: paint 1.5s ease infinite alternate; 16160 -o-animation: paint 1.5s ease infinite alternate; 16161 animation: paint 1.5s ease infinite alternate; 16162 } 16163 p { 16164 text-align: center; 16165 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; 16166 } 16167 </style> 16168 `; 16169 16170 /** 16171 * Filters the interstitial message shown when generating previews. 16172 * 16173 * @param {string} markup The preview interstitial markup. 16174 */ 16175 markup = (0,external_wp_hooks_namespaceObject.applyFilters)('editor.PostPreview.interstitialMarkup', markup); 16176 targetDocument.write(markup); 16177 targetDocument.title = (0,external_wp_i18n_namespaceObject.__)('Generating preview…'); 16178 targetDocument.close(); 16179 } 16180 16181 /** 16182 * Renders a button that opens a new window or tab for the preview, 16183 * writes the interstitial message to this window, and then navigates 16184 * to the actual preview link. The button is not rendered if the post 16185 * is not viewable and disabled if the post is not saveable. 16186 * 16187 * @param {Object} props The component props. 16188 * @param {string} props.className The class name for the button. 16189 * @param {string} props.textContent The text content for the button. 16190 * @param {boolean} props.forceIsAutosaveable Whether to force autosave. 16191 * @param {string} props.role The role attribute for the button. 16192 * @param {Function} props.onPreview The callback function for preview event. 16193 * 16194 * @return {JSX.Element|null} The rendered button component. 16195 */ 16196 function PostPreviewButton({ 16197 className, 16198 textContent, 16199 forceIsAutosaveable, 16200 role, 16201 onPreview 16202 }) { 16203 const { 16204 postId, 16205 currentPostLink, 16206 previewLink, 16207 isSaveable, 16208 isViewable 16209 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 16210 var _postType$viewable; 16211 const editor = select(store_store); 16212 const core = select(external_wp_coreData_namespaceObject.store); 16213 const postType = core.getPostType(editor.getCurrentPostType('type')); 16214 return { 16215 postId: editor.getCurrentPostId(), 16216 currentPostLink: editor.getCurrentPostAttribute('link'), 16217 previewLink: editor.getEditedPostPreviewLink(), 16218 isSaveable: editor.isEditedPostSaveable(), 16219 isViewable: (_postType$viewable = postType?.viewable) !== null && _postType$viewable !== void 0 ? _postType$viewable : false 16220 }; 16221 }, []); 16222 const { 16223 __unstableSaveForPreview 16224 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 16225 if (!isViewable) { 16226 return null; 16227 } 16228 const targetId = `wp-preview-$postId}`; 16229 const openPreviewWindow = async event => { 16230 // Our Preview button has its 'href' and 'target' set correctly for a11y 16231 // purposes. Unfortunately, though, we can't rely on the default 'click' 16232 // handler since sometimes it incorrectly opens a new tab instead of reusing 16233 // the existing one. 16234 // https://github.com/WordPress/gutenberg/pull/8330 16235 event.preventDefault(); 16236 16237 // Open up a Preview tab if needed. This is where we'll show the preview. 16238 const previewWindow = window.open('', targetId); 16239 16240 // Focus the Preview tab. This might not do anything, depending on the browser's 16241 // and user's preferences. 16242 // https://html.spec.whatwg.org/multipage/interaction.html#dom-window-focus 16243 previewWindow.focus(); 16244 writeInterstitialMessage(previewWindow.document); 16245 const link = await __unstableSaveForPreview({ 16246 forceIsAutosaveable 16247 }); 16248 previewWindow.location = link; 16249 onPreview?.(); 16250 }; 16251 16252 // Link to the `?preview=true` URL if we have it, since this lets us see 16253 // changes that were autosaved since the post was last published. Otherwise, 16254 // just link to the post's URL. 16255 const href = previewLink || currentPostLink; 16256 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 16257 variant: !className ? 'tertiary' : undefined, 16258 className: className || 'editor-post-preview', 16259 href: href, 16260 target: targetId, 16261 accessibleWhenDisabled: true, 16262 disabled: !isSaveable, 16263 onClick: openPreviewWindow, 16264 role: role, 16265 size: "compact", 16266 children: textContent || /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 16267 children: [(0,external_wp_i18n_namespaceObject._x)('Preview', 'imperative verb'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.VisuallyHidden, { 16268 as: "span", 16269 children: /* translators: accessibility text */ 16270 (0,external_wp_i18n_namespaceObject.__)('(opens in a new tab)') 16271 })] 16272 }) 16273 }); 16274 } 16275 16276 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-button/label.js 16277 /** 16278 * WordPress dependencies 16279 */ 16280 16281 16282 16283 16284 /** 16285 * Internal dependencies 16286 */ 16287 16288 16289 /** 16290 * Renders the label for the publish button. 16291 * 16292 * @return {string} The label for the publish button. 16293 */ 16294 function PublishButtonLabel() { 16295 const isSmallerThanMediumViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium', '<'); 16296 const { 16297 isPublished, 16298 isBeingScheduled, 16299 isSaving, 16300 isPublishing, 16301 hasPublishAction, 16302 isAutosaving, 16303 hasNonPostEntityChanges, 16304 postStatusHasChanged, 16305 postStatus 16306 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 16307 var _getCurrentPost$_link; 16308 const { 16309 isCurrentPostPublished, 16310 isEditedPostBeingScheduled, 16311 isSavingPost, 16312 isPublishingPost, 16313 getCurrentPost, 16314 getCurrentPostType, 16315 isAutosavingPost, 16316 getPostEdits, 16317 getEditedPostAttribute 16318 } = select(store_store); 16319 return { 16320 isPublished: isCurrentPostPublished(), 16321 isBeingScheduled: isEditedPostBeingScheduled(), 16322 isSaving: isSavingPost(), 16323 isPublishing: isPublishingPost(), 16324 hasPublishAction: (_getCurrentPost$_link = getCurrentPost()._links?.['wp:action-publish']) !== null && _getCurrentPost$_link !== void 0 ? _getCurrentPost$_link : false, 16325 postType: getCurrentPostType(), 16326 isAutosaving: isAutosavingPost(), 16327 hasNonPostEntityChanges: select(store_store).hasNonPostEntityChanges(), 16328 postStatusHasChanged: !!getPostEdits()?.status, 16329 postStatus: getEditedPostAttribute('status') 16330 }; 16331 }, []); 16332 if (isPublishing) { 16333 /* translators: button label text should, if possible, be under 16 characters. */ 16334 return (0,external_wp_i18n_namespaceObject.__)('Publishing…'); 16335 } else if ((isPublished || isBeingScheduled) && isSaving && !isAutosaving) { 16336 /* translators: button label text should, if possible, be under 16 characters. */ 16337 return (0,external_wp_i18n_namespaceObject.__)('Saving…'); 16338 } 16339 if (!hasPublishAction) { 16340 // TODO: this is because "Submit for review" string is too long in some languages. 16341 // @see https://github.com/WordPress/gutenberg/issues/10475 16342 return isSmallerThanMediumViewport ? (0,external_wp_i18n_namespaceObject.__)('Publish') : (0,external_wp_i18n_namespaceObject.__)('Submit for Review'); 16343 } 16344 if (hasNonPostEntityChanges || isPublished || postStatusHasChanged && !['future', 'publish'].includes(postStatus) || !postStatusHasChanged && postStatus === 'future') { 16345 return (0,external_wp_i18n_namespaceObject.__)('Save'); 16346 } 16347 if (isBeingScheduled) { 16348 return (0,external_wp_i18n_namespaceObject.__)('Schedule'); 16349 } 16350 return (0,external_wp_i18n_namespaceObject.__)('Publish'); 16351 } 16352 16353 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-button/index.js 16354 /** 16355 * WordPress dependencies 16356 */ 16357 16358 16359 16360 16361 16362 /** 16363 * Internal dependencies 16364 */ 16365 16366 16367 16368 16369 const post_publish_button_noop = () => {}; 16370 class PostPublishButton extends external_wp_element_namespaceObject.Component { 16371 constructor(props) { 16372 super(props); 16373 this.createOnClick = this.createOnClick.bind(this); 16374 this.closeEntitiesSavedStates = this.closeEntitiesSavedStates.bind(this); 16375 this.state = { 16376 entitiesSavedStatesCallback: false 16377 }; 16378 } 16379 createOnClick(callback) { 16380 return (...args) => { 16381 const { 16382 hasNonPostEntityChanges, 16383 setEntitiesSavedStatesCallback 16384 } = this.props; 16385 // If a post with non-post entities is published, but the user 16386 // elects to not save changes to the non-post entities, those 16387 // entities will still be dirty when the Publish button is clicked. 16388 // We also need to check that the `setEntitiesSavedStatesCallback` 16389 // prop was passed. See https://github.com/WordPress/gutenberg/pull/37383 16390 if (hasNonPostEntityChanges && setEntitiesSavedStatesCallback) { 16391 // The modal for multiple entity saving will open, 16392 // hold the callback for saving/publishing the post 16393 // so that we can call it if the post entity is checked. 16394 this.setState({ 16395 entitiesSavedStatesCallback: () => callback(...args) 16396 }); 16397 16398 // Open the save panel by setting its callback. 16399 // To set a function on the useState hook, we must set it 16400 // with another function (() => myFunction). Passing the 16401 // function on its own will cause an error when called. 16402 setEntitiesSavedStatesCallback(() => this.closeEntitiesSavedStates); 16403 return post_publish_button_noop; 16404 } 16405 return callback(...args); 16406 }; 16407 } 16408 closeEntitiesSavedStates(savedEntities) { 16409 const { 16410 postType, 16411 postId 16412 } = this.props; 16413 const { 16414 entitiesSavedStatesCallback 16415 } = this.state; 16416 this.setState({ 16417 entitiesSavedStatesCallback: false 16418 }, () => { 16419 if (savedEntities && savedEntities.some(elt => elt.kind === 'postType' && elt.name === postType && elt.key === postId)) { 16420 // The post entity was checked, call the held callback from `createOnClick`. 16421 entitiesSavedStatesCallback(); 16422 } 16423 }); 16424 } 16425 render() { 16426 const { 16427 forceIsDirty, 16428 hasPublishAction, 16429 isBeingScheduled, 16430 isOpen, 16431 isPostSavingLocked, 16432 isPublishable, 16433 isPublished, 16434 isSaveable, 16435 isSaving, 16436 isAutoSaving, 16437 isToggle, 16438 savePostStatus, 16439 onSubmit = post_publish_button_noop, 16440 onToggle, 16441 visibility, 16442 hasNonPostEntityChanges, 16443 isSavingNonPostEntityChanges, 16444 postStatus, 16445 postStatusHasChanged 16446 } = this.props; 16447 const isButtonDisabled = (isSaving || !isSaveable || isPostSavingLocked || !isPublishable && !forceIsDirty) && (!hasNonPostEntityChanges || isSavingNonPostEntityChanges); 16448 const isToggleDisabled = (isPublished || isSaving || !isSaveable || !isPublishable && !forceIsDirty) && (!hasNonPostEntityChanges || isSavingNonPostEntityChanges); 16449 16450 // If the new status has not changed explicitely, we derive it from 16451 // other factors, like having a publish action, etc.. We need to preserve 16452 // this because it affects when to show the pre and post publish panels. 16453 // If it has changed though explicitely, we need to respect that. 16454 let publishStatus = 'publish'; 16455 if (postStatusHasChanged) { 16456 publishStatus = postStatus; 16457 } else if (!hasPublishAction) { 16458 publishStatus = 'pending'; 16459 } else if (visibility === 'private') { 16460 publishStatus = 'private'; 16461 } else if (isBeingScheduled) { 16462 publishStatus = 'future'; 16463 } 16464 const onClickButton = () => { 16465 if (isButtonDisabled) { 16466 return; 16467 } 16468 onSubmit(); 16469 savePostStatus(publishStatus); 16470 }; 16471 16472 // Callback to open the publish panel. 16473 const onClickToggle = () => { 16474 if (isToggleDisabled) { 16475 return; 16476 } 16477 onToggle(); 16478 }; 16479 const buttonProps = { 16480 'aria-disabled': isButtonDisabled, 16481 className: 'editor-post-publish-button', 16482 isBusy: !isAutoSaving && isSaving, 16483 variant: 'primary', 16484 onClick: this.createOnClick(onClickButton) 16485 }; 16486 const toggleProps = { 16487 'aria-disabled': isToggleDisabled, 16488 'aria-expanded': isOpen, 16489 className: 'editor-post-publish-panel__toggle', 16490 isBusy: isSaving && isPublished, 16491 variant: 'primary', 16492 size: 'compact', 16493 onClick: this.createOnClick(onClickToggle) 16494 }; 16495 const componentProps = isToggle ? toggleProps : buttonProps; 16496 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_ReactJSXRuntime_namespaceObject.Fragment, { 16497 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 16498 ...componentProps, 16499 className: `$componentProps.className} editor-post-publish-button__button`, 16500 size: "compact", 16501 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PublishButtonLabel, {}) 16502 }) 16503 }); 16504 } 16505 } 16506 16507 /** 16508 * Renders the publish button. 16509 */ 16510 /* harmony default export */ const post_publish_button = ((0,external_wp_compose_namespaceObject.compose)([(0,external_wp_data_namespaceObject.withSelect)(select => { 16511 var _getCurrentPost$_link; 16512 const { 16513 isSavingPost, 16514 isAutosavingPost, 16515 isEditedPostBeingScheduled, 16516 getEditedPostVisibility, 16517 isCurrentPostPublished, 16518 isEditedPostSaveable, 16519 isEditedPostPublishable, 16520 isPostSavingLocked, 16521 getCurrentPost, 16522 getCurrentPostType, 16523 getCurrentPostId, 16524 hasNonPostEntityChanges, 16525 isSavingNonPostEntityChanges, 16526 getEditedPostAttribute, 16527 getPostEdits 16528 } = select(store_store); 16529 return { 16530 isSaving: isSavingPost(), 16531 isAutoSaving: isAutosavingPost(), 16532 isBeingScheduled: isEditedPostBeingScheduled(), 16533 visibility: getEditedPostVisibility(), 16534 isSaveable: isEditedPostSaveable(), 16535 isPostSavingLocked: isPostSavingLocked(), 16536 isPublishable: isEditedPostPublishable(), 16537 isPublished: isCurrentPostPublished(), 16538 hasPublishAction: (_getCurrentPost$_link = getCurrentPost()._links?.['wp:action-publish']) !== null && _getCurrentPost$_link !== void 0 ? _getCurrentPost$_link : false, 16539 postType: getCurrentPostType(), 16540 postId: getCurrentPostId(), 16541 postStatus: getEditedPostAttribute('status'), 16542 postStatusHasChanged: getPostEdits()?.status, 16543 hasNonPostEntityChanges: hasNonPostEntityChanges(), 16544 isSavingNonPostEntityChanges: isSavingNonPostEntityChanges() 16545 }; 16546 }), (0,external_wp_data_namespaceObject.withDispatch)(dispatch => { 16547 const { 16548 editPost, 16549 savePost 16550 } = dispatch(store_store); 16551 return { 16552 savePostStatus: status => { 16553 editPost({ 16554 status 16555 }, { 16556 undoIgnore: true 16557 }); 16558 savePost(); 16559 } 16560 }; 16561 })])(PostPublishButton)); 16562 16563 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/wordpress.js 16564 /** 16565 * WordPress dependencies 16566 */ 16567 16568 16569 const wordpress = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 16570 xmlns: "http://www.w3.org/2000/svg", 16571 viewBox: "-2 -2 24 24", 16572 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 16573 d: "M20 10c0-5.51-4.49-10-10-10C4.48 0 0 4.49 0 10c0 5.52 4.48 10 10 10 5.51 0 10-4.48 10-10zM7.78 15.37L4.37 6.22c.55-.02 1.17-.08 1.17-.08.5-.06.44-1.13-.06-1.11 0 0-1.45.11-2.37.11-.18 0-.37 0-.58-.01C4.12 2.69 6.87 1.11 10 1.11c2.33 0 4.45.87 6.05 2.34-.68-.11-1.65.39-1.65 1.58 0 .74.45 1.36.9 2.1.35.61.55 1.36.55 2.46 0 1.49-1.4 5-1.4 5l-3.03-8.37c.54-.02.82-.17.82-.17.5-.05.44-1.25-.06-1.22 0 0-1.44.12-2.38.12-.87 0-2.33-.12-2.33-.12-.5-.03-.56 1.2-.06 1.22l.92.08 1.26 3.41zM17.41 10c.24-.64.74-1.87.43-4.25.7 1.29 1.05 2.71 1.05 4.25 0 3.29-1.73 6.24-4.4 7.78.97-2.59 1.94-5.2 2.92-7.78zM6.1 18.09C3.12 16.65 1.11 13.53 1.11 10c0-1.3.23-2.48.72-3.59C3.25 10.3 4.67 14.2 6.1 18.09zm4.03-6.63l2.58 6.98c-.86.29-1.76.45-2.71.45-.79 0-1.57-.11-2.29-.33.81-2.38 1.62-4.74 2.42-7.1z" 16574 }) 16575 }); 16576 /* harmony default export */ const library_wordpress = (wordpress); 16577 16578 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-visibility/utils.js 16579 /** 16580 * WordPress dependencies 16581 */ 16582 16583 const visibilityOptions = { 16584 public: { 16585 label: (0,external_wp_i18n_namespaceObject.__)('Public'), 16586 info: (0,external_wp_i18n_namespaceObject.__)('Visible to everyone.') 16587 }, 16588 private: { 16589 label: (0,external_wp_i18n_namespaceObject.__)('Private'), 16590 info: (0,external_wp_i18n_namespaceObject.__)('Only visible to site admins and editors.') 16591 }, 16592 password: { 16593 label: (0,external_wp_i18n_namespaceObject.__)('Password protected'), 16594 info: (0,external_wp_i18n_namespaceObject.__)('Only those with the password can view this post.') 16595 } 16596 }; 16597 16598 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-visibility/index.js 16599 /** 16600 * WordPress dependencies 16601 */ 16602 16603 16604 16605 16606 16607 16608 16609 /** 16610 * Internal dependencies 16611 */ 16612 16613 16614 16615 /** 16616 * Allows users to set the visibility of a post. 16617 * 16618 * @param {Object} props The component props. 16619 * @param {Function} props.onClose Function to call when the popover is closed. 16620 * @return {JSX.Element} The rendered component. 16621 */ 16622 16623 16624 function PostVisibility({ 16625 onClose 16626 }) { 16627 const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(PostVisibility); 16628 const { 16629 status, 16630 visibility, 16631 password 16632 } = (0,external_wp_data_namespaceObject.useSelect)(select => ({ 16633 status: select(store_store).getEditedPostAttribute('status'), 16634 visibility: select(store_store).getEditedPostVisibility(), 16635 password: select(store_store).getEditedPostAttribute('password') 16636 })); 16637 const { 16638 editPost, 16639 savePost 16640 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 16641 const [hasPassword, setHasPassword] = (0,external_wp_element_namespaceObject.useState)(!!password); 16642 const [showPrivateConfirmDialog, setShowPrivateConfirmDialog] = (0,external_wp_element_namespaceObject.useState)(false); 16643 const setPublic = () => { 16644 editPost({ 16645 status: visibility === 'private' ? 'draft' : status, 16646 password: '' 16647 }); 16648 setHasPassword(false); 16649 }; 16650 const setPrivate = () => { 16651 setShowPrivateConfirmDialog(true); 16652 }; 16653 const confirmPrivate = () => { 16654 editPost({ 16655 status: 'private', 16656 password: '' 16657 }); 16658 setHasPassword(false); 16659 setShowPrivateConfirmDialog(false); 16660 savePost(); 16661 }; 16662 const handleDialogCancel = () => { 16663 setShowPrivateConfirmDialog(false); 16664 }; 16665 const setPasswordProtected = () => { 16666 editPost({ 16667 status: visibility === 'private' ? 'draft' : status, 16668 password: password || '' 16669 }); 16670 setHasPassword(true); 16671 }; 16672 const updatePassword = event => { 16673 editPost({ 16674 password: event.target.value 16675 }); 16676 }; 16677 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 16678 className: "editor-post-visibility", 16679 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalInspectorPopoverHeader, { 16680 title: (0,external_wp_i18n_namespaceObject.__)('Visibility'), 16681 help: (0,external_wp_i18n_namespaceObject.__)('Control how this post is viewed.'), 16682 onClose: onClose 16683 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("fieldset", { 16684 className: "editor-post-visibility__fieldset", 16685 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.VisuallyHidden, { 16686 as: "legend", 16687 children: (0,external_wp_i18n_namespaceObject.__)('Visibility') 16688 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostVisibilityChoice, { 16689 instanceId: instanceId, 16690 value: "public", 16691 label: visibilityOptions.public.label, 16692 info: visibilityOptions.public.info, 16693 checked: visibility === 'public' && !hasPassword, 16694 onChange: setPublic 16695 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostVisibilityChoice, { 16696 instanceId: instanceId, 16697 value: "private", 16698 label: visibilityOptions.private.label, 16699 info: visibilityOptions.private.info, 16700 checked: visibility === 'private', 16701 onChange: setPrivate 16702 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostVisibilityChoice, { 16703 instanceId: instanceId, 16704 value: "password", 16705 label: visibilityOptions.password.label, 16706 info: visibilityOptions.password.info, 16707 checked: hasPassword, 16708 onChange: setPasswordProtected 16709 }), hasPassword && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 16710 className: "editor-post-visibility__password", 16711 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.VisuallyHidden, { 16712 as: "label", 16713 htmlFor: `editor-post-visibility__password-input-$instanceId}`, 16714 children: (0,external_wp_i18n_namespaceObject.__)('Create password') 16715 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("input", { 16716 className: "editor-post-visibility__password-input", 16717 id: `editor-post-visibility__password-input-$instanceId}`, 16718 type: "text", 16719 onChange: updatePassword, 16720 value: password, 16721 placeholder: (0,external_wp_i18n_namespaceObject.__)('Use a secure password') 16722 })] 16723 })] 16724 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalConfirmDialog, { 16725 isOpen: showPrivateConfirmDialog, 16726 onConfirm: confirmPrivate, 16727 onCancel: handleDialogCancel, 16728 confirmButtonText: (0,external_wp_i18n_namespaceObject.__)('Publish'), 16729 size: "medium", 16730 children: (0,external_wp_i18n_namespaceObject.__)('Would you like to privately publish this post now?') 16731 })] 16732 }); 16733 } 16734 function PostVisibilityChoice({ 16735 instanceId, 16736 value, 16737 label, 16738 info, 16739 ...props 16740 }) { 16741 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 16742 className: "editor-post-visibility__choice", 16743 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("input", { 16744 type: "radio", 16745 name: `editor-post-visibility__setting-$instanceId}`, 16746 value: value, 16747 id: `editor-post-$value}-$instanceId}`, 16748 "aria-describedby": `editor-post-$value}-$instanceId}-description`, 16749 className: "editor-post-visibility__radio", 16750 ...props 16751 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("label", { 16752 htmlFor: `editor-post-$value}-$instanceId}`, 16753 className: "editor-post-visibility__label", 16754 children: label 16755 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { 16756 id: `editor-post-$value}-$instanceId}-description`, 16757 className: "editor-post-visibility__info", 16758 children: info 16759 })] 16760 }); 16761 } 16762 16763 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-visibility/label.js 16764 /** 16765 * WordPress dependencies 16766 */ 16767 16768 16769 /** 16770 * Internal dependencies 16771 */ 16772 16773 16774 16775 /** 16776 * Returns the label for the current post visibility setting. 16777 * 16778 * @return {string} Post visibility label. 16779 */ 16780 function PostVisibilityLabel() { 16781 return usePostVisibilityLabel(); 16782 } 16783 16784 /** 16785 * Get the label for the current post visibility setting. 16786 * 16787 * @return {string} Post visibility label. 16788 */ 16789 function usePostVisibilityLabel() { 16790 const visibility = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getEditedPostVisibility()); 16791 return visibilityOptions[visibility]?.label; 16792 } 16793 16794 ;// CONCATENATED MODULE: ./node_modules/date-fns/toDate.mjs 16795 /** 16796 * @name toDate 16797 * @category Common Helpers 16798 * @summary Convert the given argument to an instance of Date. 16799 * 16800 * @description 16801 * Convert the given argument to an instance of Date. 16802 * 16803 * If the argument is an instance of Date, the function returns its clone. 16804 * 16805 * If the argument is a number, it is treated as a timestamp. 16806 * 16807 * If the argument is none of the above, the function returns Invalid Date. 16808 * 16809 * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`. 16810 * 16811 * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc). 16812 * 16813 * @param argument - The value to convert 16814 * 16815 * @returns The parsed date in the local time zone 16816 * 16817 * @example 16818 * // Clone the date: 16819 * const result = toDate(new Date(2014, 1, 11, 11, 30, 30)) 16820 * //=> Tue Feb 11 2014 11:30:30 16821 * 16822 * @example 16823 * // Convert the timestamp to date: 16824 * const result = toDate(1392098430000) 16825 * //=> Tue Feb 11 2014 11:30:30 16826 */ 16827 function toDate(argument) { 16828 const argStr = Object.prototype.toString.call(argument); 16829 16830 // Clone the date 16831 if ( 16832 argument instanceof Date || 16833 (typeof argument === "object" && argStr === "[object Date]") 16834 ) { 16835 // Prevent the date to lose the milliseconds when passed to new Date() in IE10 16836 return new argument.constructor(+argument); 16837 } else if ( 16838 typeof argument === "number" || 16839 argStr === "[object Number]" || 16840 typeof argument === "string" || 16841 argStr === "[object String]" 16842 ) { 16843 // TODO: Can we get rid of as? 16844 return new Date(argument); 16845 } else { 16846 // TODO: Can we get rid of as? 16847 return new Date(NaN); 16848 } 16849 } 16850 16851 // Fallback for modularized imports: 16852 /* harmony default export */ const date_fns_toDate = ((/* unused pure expression or super */ null && (toDate))); 16853 16854 ;// CONCATENATED MODULE: ./node_modules/date-fns/startOfMonth.mjs 16855 16856 16857 /** 16858 * @name startOfMonth 16859 * @category Month Helpers 16860 * @summary Return the start of a month for the given date. 16861 * 16862 * @description 16863 * Return the start of a month for the given date. 16864 * The result will be in the local timezone. 16865 * 16866 * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc). 16867 * 16868 * @param date - The original date 16869 * 16870 * @returns The start of a month 16871 * 16872 * @example 16873 * // The start of a month for 2 September 2014 11:55:00: 16874 * const result = startOfMonth(new Date(2014, 8, 2, 11, 55, 0)) 16875 * //=> Mon Sep 01 2014 00:00:00 16876 */ 16877 function startOfMonth(date) { 16878 const _date = toDate(date); 16879 _date.setDate(1); 16880 _date.setHours(0, 0, 0, 0); 16881 return _date; 16882 } 16883 16884 // Fallback for modularized imports: 16885 /* harmony default export */ const date_fns_startOfMonth = ((/* unused pure expression or super */ null && (startOfMonth))); 16886 16887 ;// CONCATENATED MODULE: ./node_modules/date-fns/endOfMonth.mjs 16888 16889 16890 /** 16891 * @name endOfMonth 16892 * @category Month Helpers 16893 * @summary Return the end of a month for the given date. 16894 * 16895 * @description 16896 * Return the end of a month for the given date. 16897 * The result will be in the local timezone. 16898 * 16899 * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc). 16900 * 16901 * @param date - The original date 16902 * 16903 * @returns The end of a month 16904 * 16905 * @example 16906 * // The end of a month for 2 September 2014 11:55:00: 16907 * const result = endOfMonth(new Date(2014, 8, 2, 11, 55, 0)) 16908 * //=> Tue Sep 30 2014 23:59:59.999 16909 */ 16910 function endOfMonth(date) { 16911 const _date = toDate(date); 16912 const month = _date.getMonth(); 16913 _date.setFullYear(_date.getFullYear(), month + 1, 0); 16914 _date.setHours(23, 59, 59, 999); 16915 return _date; 16916 } 16917 16918 // Fallback for modularized imports: 16919 /* harmony default export */ const date_fns_endOfMonth = ((/* unused pure expression or super */ null && (endOfMonth))); 16920 16921 ;// CONCATENATED MODULE: ./node_modules/date-fns/constants.mjs 16922 /** 16923 * @module constants 16924 * @summary Useful constants 16925 * @description 16926 * Collection of useful date constants. 16927 * 16928 * The constants could be imported from `date-fns/constants`: 16929 * 16930 * ```ts 16931 * import { maxTime, minTime } from "./constants/date-fns/constants"; 16932 * 16933 * function isAllowedTime(time) { 16934 * return time <= maxTime && time >= minTime; 16935 * } 16936 * ``` 16937 */ 16938 16939 /** 16940 * @constant 16941 * @name daysInWeek 16942 * @summary Days in 1 week. 16943 */ 16944 const daysInWeek = 7; 16945 16946 /** 16947 * @constant 16948 * @name daysInYear 16949 * @summary Days in 1 year. 16950 * 16951 * @description 16952 * How many days in a year. 16953 * 16954 * One years equals 365.2425 days according to the formula: 16955 * 16956 * > Leap year occures every 4 years, except for years that are divisable by 100 and not divisable by 400. 16957 * > 1 mean year = (365+1/4-1/100+1/400) days = 365.2425 days 16958 */ 16959 const daysInYear = 365.2425; 16960 16961 /** 16962 * @constant 16963 * @name maxTime 16964 * @summary Maximum allowed time. 16965 * 16966 * @example 16967 * import { maxTime } from "./constants/date-fns/constants"; 16968 * 16969 * const isValid = 8640000000000001 <= maxTime; 16970 * //=> false 16971 * 16972 * new Date(8640000000000001); 16973 * //=> Invalid Date 16974 */ 16975 const maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1000; 16976 16977 /** 16978 * @constant 16979 * @name minTime 16980 * @summary Minimum allowed time. 16981 * 16982 * @example 16983 * import { minTime } from "./constants/date-fns/constants"; 16984 * 16985 * const isValid = -8640000000000001 >= minTime; 16986 * //=> false 16987 * 16988 * new Date(-8640000000000001) 16989 * //=> Invalid Date 16990 */ 16991 const minTime = -maxTime; 16992 16993 /** 16994 * @constant 16995 * @name millisecondsInWeek 16996 * @summary Milliseconds in 1 week. 16997 */ 16998 const millisecondsInWeek = 604800000; 16999 17000 /** 17001 * @constant 17002 * @name millisecondsInDay 17003 * @summary Milliseconds in 1 day. 17004 */ 17005 const millisecondsInDay = 86400000; 17006 17007 /** 17008 * @constant 17009 * @name millisecondsInMinute 17010 * @summary Milliseconds in 1 minute 17011 */ 17012 const millisecondsInMinute = 60000; 17013 17014 /** 17015 * @constant 17016 * @name millisecondsInHour 17017 * @summary Milliseconds in 1 hour 17018 */ 17019 const millisecondsInHour = 3600000; 17020 17021 /** 17022 * @constant 17023 * @name millisecondsInSecond 17024 * @summary Milliseconds in 1 second 17025 */ 17026 const millisecondsInSecond = 1000; 17027 17028 /** 17029 * @constant 17030 * @name minutesInYear 17031 * @summary Minutes in 1 year. 17032 */ 17033 const minutesInYear = 525600; 17034 17035 /** 17036 * @constant 17037 * @name minutesInMonth 17038 * @summary Minutes in 1 month. 17039 */ 17040 const minutesInMonth = 43200; 17041 17042 /** 17043 * @constant 17044 * @name minutesInDay 17045 * @summary Minutes in 1 day. 17046 */ 17047 const minutesInDay = 1440; 17048 17049 /** 17050 * @constant 17051 * @name minutesInHour 17052 * @summary Minutes in 1 hour. 17053 */ 17054 const minutesInHour = 60; 17055 17056 /** 17057 * @constant 17058 * @name monthsInQuarter 17059 * @summary Months in 1 quarter. 17060 */ 17061 const monthsInQuarter = 3; 17062 17063 /** 17064 * @constant 17065 * @name monthsInYear 17066 * @summary Months in 1 year. 17067 */ 17068 const monthsInYear = 12; 17069 17070 /** 17071 * @constant 17072 * @name quartersInYear 17073 * @summary Quarters in 1 year 17074 */ 17075 const quartersInYear = 4; 17076 17077 /** 17078 * @constant 17079 * @name secondsInHour 17080 * @summary Seconds in 1 hour. 17081 */ 17082 const secondsInHour = 3600; 17083 17084 /** 17085 * @constant 17086 * @name secondsInMinute 17087 * @summary Seconds in 1 minute. 17088 */ 17089 const secondsInMinute = 60; 17090 17091 /** 17092 * @constant 17093 * @name secondsInDay 17094 * @summary Seconds in 1 day. 17095 */ 17096 const secondsInDay = secondsInHour * 24; 17097 17098 /** 17099 * @constant 17100 * @name secondsInWeek 17101 * @summary Seconds in 1 week. 17102 */ 17103 const secondsInWeek = secondsInDay * 7; 17104 17105 /** 17106 * @constant 17107 * @name secondsInYear 17108 * @summary Seconds in 1 year. 17109 */ 17110 const secondsInYear = secondsInDay * daysInYear; 17111 17112 /** 17113 * @constant 17114 * @name secondsInMonth 17115 * @summary Seconds in 1 month 17116 */ 17117 const secondsInMonth = secondsInYear / 12; 17118 17119 /** 17120 * @constant 17121 * @name secondsInQuarter 17122 * @summary Seconds in 1 quarter. 17123 */ 17124 const secondsInQuarter = secondsInMonth * 3; 17125 17126 ;// CONCATENATED MODULE: ./node_modules/date-fns/parseISO.mjs 17127 17128 17129 /** 17130 * The {@link parseISO} function options. 17131 */ 17132 17133 /** 17134 * @name parseISO 17135 * @category Common Helpers 17136 * @summary Parse ISO string 17137 * 17138 * @description 17139 * Parse the given string in ISO 8601 format and return an instance of Date. 17140 * 17141 * Function accepts complete ISO 8601 formats as well as partial implementations. 17142 * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601 17143 * 17144 * If the argument isn't a string, the function cannot parse the string or 17145 * the values are invalid, it returns Invalid Date. 17146 * 17147 * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc). 17148 * 17149 * @param argument - The value to convert 17150 * @param options - An object with options 17151 * 17152 * @returns The parsed date in the local time zone 17153 * 17154 * @example 17155 * // Convert string '2014-02-11T11:30:30' to date: 17156 * const result = parseISO('2014-02-11T11:30:30') 17157 * //=> Tue Feb 11 2014 11:30:30 17158 * 17159 * @example 17160 * // Convert string '+02014101' to date, 17161 * // if the additional number of digits in the extended year format is 1: 17162 * const result = parseISO('+02014101', { additionalDigits: 1 }) 17163 * //=> Fri Apr 11 2014 00:00:00 17164 */ 17165 function parseISO(argument, options) { 17166 const additionalDigits = options?.additionalDigits ?? 2; 17167 const dateStrings = splitDateString(argument); 17168 17169 let date; 17170 if (dateStrings.date) { 17171 const parseYearResult = parseYear(dateStrings.date, additionalDigits); 17172 date = parseDate(parseYearResult.restDateString, parseYearResult.year); 17173 } 17174 17175 if (!date || isNaN(date.getTime())) { 17176 return new Date(NaN); 17177 } 17178 17179 const timestamp = date.getTime(); 17180 let time = 0; 17181 let offset; 17182 17183 if (dateStrings.time) { 17184 time = parseTime(dateStrings.time); 17185 if (isNaN(time)) { 17186 return new Date(NaN); 17187 } 17188 } 17189 17190 if (dateStrings.timezone) { 17191 offset = parseTimezone(dateStrings.timezone); 17192 if (isNaN(offset)) { 17193 return new Date(NaN); 17194 } 17195 } else { 17196 const dirtyDate = new Date(timestamp + time); 17197 // JS parsed string assuming it's in UTC timezone 17198 // but we need it to be parsed in our timezone 17199 // so we use utc values to build date in our timezone. 17200 // Year values from 0 to 99 map to the years 1900 to 1999 17201 // so set year explicitly with setFullYear. 17202 const result = new Date(0); 17203 result.setFullYear( 17204 dirtyDate.getUTCFullYear(), 17205 dirtyDate.getUTCMonth(), 17206 dirtyDate.getUTCDate(), 17207 ); 17208 result.setHours( 17209 dirtyDate.getUTCHours(), 17210 dirtyDate.getUTCMinutes(), 17211 dirtyDate.getUTCSeconds(), 17212 dirtyDate.getUTCMilliseconds(), 17213 ); 17214 return result; 17215 } 17216 17217 return new Date(timestamp + time + offset); 17218 } 17219 17220 const patterns = { 17221 dateTimeDelimiter: /[T ]/, 17222 timeZoneDelimiter: /[Z ]/i, 17223 timezone: /([Z+-].*)$/, 17224 }; 17225 17226 const dateRegex = 17227 /^-?(?:(\d{3})|(\d{2})(?:-?(\d{2}))?|W(\d{2})(?:-?(\d{1}))?|)$/; 17228 const timeRegex = 17229 /^(\d{2}(?:[.,]\d*)?)(?::?(\d{2}(?:[.,]\d*)?))?(?::?(\d{2}(?:[.,]\d*)?))?$/; 17230 const timezoneRegex = /^([+-])(\d{2})(?::?(\d{2}))?$/; 17231 17232 function splitDateString(dateString) { 17233 const dateStrings = {}; 17234 const array = dateString.split(patterns.dateTimeDelimiter); 17235 let timeString; 17236 17237 // The regex match should only return at maximum two array elements. 17238 // [date], [time], or [date, time]. 17239 if (array.length > 2) { 17240 return dateStrings; 17241 } 17242 17243 if (/:/.test(array[0])) { 17244 timeString = array[0]; 17245 } else { 17246 dateStrings.date = array[0]; 17247 timeString = array[1]; 17248 if (patterns.timeZoneDelimiter.test(dateStrings.date)) { 17249 dateStrings.date = dateString.split(patterns.timeZoneDelimiter)[0]; 17250 timeString = dateString.substr( 17251 dateStrings.date.length, 17252 dateString.length, 17253 ); 17254 } 17255 } 17256 17257 if (timeString) { 17258 const token = patterns.timezone.exec(timeString); 17259 if (token) { 17260 dateStrings.time = timeString.replace(token[1], ""); 17261 dateStrings.timezone = token[1]; 17262 } else { 17263 dateStrings.time = timeString; 17264 } 17265 } 17266 17267 return dateStrings; 17268 } 17269 17270 function parseYear(dateString, additionalDigits) { 17271 const regex = new RegExp( 17272 "^(?:(\\d{4}|[+-]\\d{" + 17273 (4 + additionalDigits) + 17274 "})|(\\d{2}|[+-]\\d{" + 17275 (2 + additionalDigits) + 17276 "})$)", 17277 ); 17278 17279 const captures = dateString.match(regex); 17280 // Invalid ISO-formatted year 17281 if (!captures) return { year: NaN, restDateString: "" }; 17282 17283 const year = captures[1] ? parseInt(captures[1]) : null; 17284 const century = captures[2] ? parseInt(captures[2]) : null; 17285 17286 // either year or century is null, not both 17287 return { 17288 year: century === null ? year : century * 100, 17289 restDateString: dateString.slice((captures[1] || captures[2]).length), 17290 }; 17291 } 17292 17293 function parseDate(dateString, year) { 17294 // Invalid ISO-formatted year 17295 if (year === null) return new Date(NaN); 17296 17297 const captures = dateString.match(dateRegex); 17298 // Invalid ISO-formatted string 17299 if (!captures) return new Date(NaN); 17300 17301 const isWeekDate = !!captures[4]; 17302 const dayOfYear = parseDateUnit(captures[1]); 17303 const month = parseDateUnit(captures[2]) - 1; 17304 const day = parseDateUnit(captures[3]); 17305 const week = parseDateUnit(captures[4]); 17306 const dayOfWeek = parseDateUnit(captures[5]) - 1; 17307 17308 if (isWeekDate) { 17309 if (!validateWeekDate(year, week, dayOfWeek)) { 17310 return new Date(NaN); 17311 } 17312 return dayOfISOWeekYear(year, week, dayOfWeek); 17313 } else { 17314 const date = new Date(0); 17315 if ( 17316 !validateDate(year, month, day) || 17317 !validateDayOfYearDate(year, dayOfYear) 17318 ) { 17319 return new Date(NaN); 17320 } 17321 date.setUTCFullYear(year, month, Math.max(dayOfYear, day)); 17322 return date; 17323 } 17324 } 17325 17326 function parseDateUnit(value) { 17327 return value ? parseInt(value) : 1; 17328 } 17329 17330 function parseTime(timeString) { 17331 const captures = timeString.match(timeRegex); 17332 if (!captures) return NaN; // Invalid ISO-formatted time 17333 17334 const hours = parseTimeUnit(captures[1]); 17335 const minutes = parseTimeUnit(captures[2]); 17336 const seconds = parseTimeUnit(captures[3]); 17337 17338 if (!validateTime(hours, minutes, seconds)) { 17339 return NaN; 17340 } 17341 17342 return ( 17343 hours * millisecondsInHour + minutes * millisecondsInMinute + seconds * 1000 17344 ); 17345 } 17346 17347 function parseTimeUnit(value) { 17348 return (value && parseFloat(value.replace(",", "."))) || 0; 17349 } 17350 17351 function parseTimezone(timezoneString) { 17352 if (timezoneString === "Z") return 0; 17353 17354 const captures = timezoneString.match(timezoneRegex); 17355 if (!captures) return 0; 17356 17357 const sign = captures[1] === "+" ? -1 : 1; 17358 const hours = parseInt(captures[2]); 17359 const minutes = (captures[3] && parseInt(captures[3])) || 0; 17360 17361 if (!validateTimezone(hours, minutes)) { 17362 return NaN; 17363 } 17364 17365 return sign * (hours * millisecondsInHour + minutes * millisecondsInMinute); 17366 } 17367 17368 function dayOfISOWeekYear(isoWeekYear, week, day) { 17369 const date = new Date(0); 17370 date.setUTCFullYear(isoWeekYear, 0, 4); 17371 const fourthOfJanuaryDay = date.getUTCDay() || 7; 17372 const diff = (week - 1) * 7 + day + 1 - fourthOfJanuaryDay; 17373 date.setUTCDate(date.getUTCDate() + diff); 17374 return date; 17375 } 17376 17377 // Validation functions 17378 17379 // February is null to handle the leap year (using ||) 17380 const daysInMonths = [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; 17381 17382 function isLeapYearIndex(year) { 17383 return year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0); 17384 } 17385 17386 function validateDate(year, month, date) { 17387 return ( 17388 month >= 0 && 17389 month <= 11 && 17390 date >= 1 && 17391 date <= (daysInMonths[month] || (isLeapYearIndex(year) ? 29 : 28)) 17392 ); 17393 } 17394 17395 function validateDayOfYearDate(year, dayOfYear) { 17396 return dayOfYear >= 1 && dayOfYear <= (isLeapYearIndex(year) ? 366 : 365); 17397 } 17398 17399 function validateWeekDate(_year, week, day) { 17400 return week >= 1 && week <= 53 && day >= 0 && day <= 6; 17401 } 17402 17403 function validateTime(hours, minutes, seconds) { 17404 if (hours === 24) { 17405 return minutes === 0 && seconds === 0; 17406 } 17407 17408 return ( 17409 seconds >= 0 && 17410 seconds < 60 && 17411 minutes >= 0 && 17412 minutes < 60 && 17413 hours >= 0 && 17414 hours < 25 17415 ); 17416 } 17417 17418 function validateTimezone(_hours, minutes) { 17419 return minutes >= 0 && minutes <= 59; 17420 } 17421 17422 // Fallback for modularized imports: 17423 /* harmony default export */ const date_fns_parseISO = ((/* unused pure expression or super */ null && (parseISO))); 17424 17425 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-schedule/index.js 17426 /** 17427 * External dependencies 17428 */ 17429 17430 17431 /** 17432 * WordPress dependencies 17433 */ 17434 17435 17436 17437 17438 17439 17440 17441 /** 17442 * Internal dependencies 17443 */ 17444 17445 17446 17447 const { 17448 PrivatePublishDateTimePicker 17449 } = unlock(external_wp_blockEditor_namespaceObject.privateApis); 17450 17451 /** 17452 * Renders the PostSchedule component. It allows the user to schedule a post. 17453 * 17454 * @param {Object} props Props. 17455 * @param {Function} props.onClose Function to close the component. 17456 * 17457 * @return {Component} The component to be rendered. 17458 */ 17459 function PostSchedule(props) { 17460 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PrivatePostSchedule, { 17461 ...props, 17462 showPopoverHeaderActions: true, 17463 isCompact: false 17464 }); 17465 } 17466 function PrivatePostSchedule({ 17467 onClose, 17468 showPopoverHeaderActions, 17469 isCompact 17470 }) { 17471 const { 17472 postDate, 17473 postType 17474 } = (0,external_wp_data_namespaceObject.useSelect)(select => ({ 17475 postDate: select(store_store).getEditedPostAttribute('date'), 17476 postType: select(store_store).getCurrentPostType() 17477 }), []); 17478 const { 17479 editPost 17480 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 17481 const onUpdateDate = date => editPost({ 17482 date 17483 }); 17484 const [previewedMonth, setPreviewedMonth] = (0,external_wp_element_namespaceObject.useState)(startOfMonth(new Date(postDate))); 17485 17486 // Pick up published and schduled site posts. 17487 const eventsByPostType = (0,external_wp_data_namespaceObject.useSelect)(select => select(external_wp_coreData_namespaceObject.store).getEntityRecords('postType', postType, { 17488 status: 'publish,future', 17489 after: startOfMonth(previewedMonth).toISOString(), 17490 before: endOfMonth(previewedMonth).toISOString(), 17491 exclude: [select(store_store).getCurrentPostId()], 17492 per_page: 100, 17493 _fields: 'id,date' 17494 }), [previewedMonth, postType]); 17495 const events = (0,external_wp_element_namespaceObject.useMemo)(() => (eventsByPostType || []).map(({ 17496 date: eventDate 17497 }) => ({ 17498 date: new Date(eventDate) 17499 })), [eventsByPostType]); 17500 const settings = (0,external_wp_date_namespaceObject.getSettings)(); 17501 17502 // To know if the current timezone is a 12 hour time with look for "a" in the time format 17503 // We also make sure this a is not escaped by a "/" 17504 const is12HourTime = /a(?!\\)/i.test(settings.formats.time.toLowerCase() // Test only the lower case a. 17505 .replace(/\\\\/g, '') // Replace "//" with empty strings. 17506 .split('').reverse().join('') // Reverse the string and test for "a" not followed by a slash. 17507 ); 17508 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PrivatePublishDateTimePicker, { 17509 currentDate: postDate, 17510 onChange: onUpdateDate, 17511 is12Hour: is12HourTime, 17512 dateOrder: /* translators: Order of day, month, and year. Available formats are 'dmy', 'mdy', and 'ymd'. */ 17513 (0,external_wp_i18n_namespaceObject._x)('dmy', 'date order'), 17514 events: events, 17515 onMonthPreviewed: date => setPreviewedMonth(parseISO(date)), 17516 onClose: onClose, 17517 isCompact: isCompact, 17518 showPopoverHeaderActions: showPopoverHeaderActions 17519 }); 17520 } 17521 17522 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-schedule/label.js 17523 /** 17524 * WordPress dependencies 17525 */ 17526 17527 17528 17529 17530 /** 17531 * Internal dependencies 17532 */ 17533 17534 17535 /** 17536 * Renders the PostScheduleLabel component. 17537 * 17538 * @param {Object} props Props. 17539 * 17540 * @return {Component} The component to be rendered. 17541 */ 17542 function PostScheduleLabel(props) { 17543 return usePostScheduleLabel(props); 17544 } 17545 17546 /** 17547 * Custom hook to get the label for post schedule. 17548 * 17549 * @param {Object} options Options for the hook. 17550 * @param {boolean} options.full Whether to get the full label or not. Default is false. 17551 * 17552 * @return {string} The label for post schedule. 17553 */ 17554 function usePostScheduleLabel({ 17555 full = false 17556 } = {}) { 17557 const { 17558 date, 17559 isFloating 17560 } = (0,external_wp_data_namespaceObject.useSelect)(select => ({ 17561 date: select(store_store).getEditedPostAttribute('date'), 17562 isFloating: select(store_store).isEditedPostDateFloating() 17563 }), []); 17564 return full ? getFullPostScheduleLabel(date) : getPostScheduleLabel(date, { 17565 isFloating 17566 }); 17567 } 17568 function getFullPostScheduleLabel(dateAttribute) { 17569 const date = (0,external_wp_date_namespaceObject.getDate)(dateAttribute); 17570 const timezoneAbbreviation = getTimezoneAbbreviation(); 17571 const formattedDate = (0,external_wp_date_namespaceObject.dateI18n)( 17572 // translators: Use a non-breaking space between 'g:i' and 'a' if appropriate. 17573 (0,external_wp_i18n_namespaceObject._x)('F j, Y g:i\xa0a', 'post schedule full date format'), date); 17574 return (0,external_wp_i18n_namespaceObject.isRTL)() ? `$timezoneAbbreviation} $formattedDate}` : `$formattedDate} $timezoneAbbreviation}`; 17575 } 17576 function getPostScheduleLabel(dateAttribute, { 17577 isFloating = false, 17578 now = new Date() 17579 } = {}) { 17580 if (!dateAttribute || isFloating) { 17581 return (0,external_wp_i18n_namespaceObject.__)('Immediately'); 17582 } 17583 17584 // If the user timezone does not equal the site timezone then using words 17585 // like 'tomorrow' is confusing, so show the full date. 17586 if (!isTimezoneSameAsSiteTimezone(now)) { 17587 return getFullPostScheduleLabel(dateAttribute); 17588 } 17589 const date = (0,external_wp_date_namespaceObject.getDate)(dateAttribute); 17590 if (isSameDay(date, now)) { 17591 return (0,external_wp_i18n_namespaceObject.sprintf)( 17592 // translators: %s: Time of day the post is scheduled for. 17593 (0,external_wp_i18n_namespaceObject.__)('Today at %s'), 17594 // translators: If using a space between 'g:i' and 'a', use a non-breaking space. 17595 (0,external_wp_date_namespaceObject.dateI18n)((0,external_wp_i18n_namespaceObject._x)('g:i\xa0a', 'post schedule time format'), date)); 17596 } 17597 const tomorrow = new Date(now); 17598 tomorrow.setDate(tomorrow.getDate() + 1); 17599 if (isSameDay(date, tomorrow)) { 17600 return (0,external_wp_i18n_namespaceObject.sprintf)( 17601 // translators: %s: Time of day the post is scheduled for. 17602 (0,external_wp_i18n_namespaceObject.__)('Tomorrow at %s'), 17603 // translators: If using a space between 'g:i' and 'a', use a non-breaking space. 17604 (0,external_wp_date_namespaceObject.dateI18n)((0,external_wp_i18n_namespaceObject._x)('g:i\xa0a', 'post schedule time format'), date)); 17605 } 17606 if (date.getFullYear() === now.getFullYear()) { 17607 return (0,external_wp_date_namespaceObject.dateI18n)( 17608 // translators: If using a space between 'g:i' and 'a', use a non-breaking space. 17609 (0,external_wp_i18n_namespaceObject._x)('F j g:i\xa0a', 'post schedule date format without year'), date); 17610 } 17611 return (0,external_wp_date_namespaceObject.dateI18n)( 17612 // translators: Use a non-breaking space between 'g:i' and 'a' if appropriate. 17613 (0,external_wp_i18n_namespaceObject._x)('F j, Y g:i\xa0a', 'post schedule full date format'), date); 17614 } 17615 function getTimezoneAbbreviation() { 17616 const { 17617 timezone 17618 } = (0,external_wp_date_namespaceObject.getSettings)(); 17619 if (timezone.abbr && isNaN(Number(timezone.abbr))) { 17620 return timezone.abbr; 17621 } 17622 const symbol = timezone.offset < 0 ? '' : '+'; 17623 return `UTC$symbol}$timezone.offsetFormatted}`; 17624 } 17625 function isTimezoneSameAsSiteTimezone(date) { 17626 const { 17627 timezone 17628 } = (0,external_wp_date_namespaceObject.getSettings)(); 17629 const siteOffset = Number(timezone.offset); 17630 const dateOffset = -1 * (date.getTimezoneOffset() / 60); 17631 return siteOffset === dateOffset; 17632 } 17633 function isSameDay(left, right) { 17634 return left.getDate() === right.getDate() && left.getMonth() === right.getMonth() && left.getFullYear() === right.getFullYear(); 17635 } 17636 17637 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-taxonomies/most-used-terms.js 17638 /** 17639 * WordPress dependencies 17640 */ 17641 17642 17643 17644 17645 /** 17646 * Internal dependencies 17647 */ 17648 17649 17650 17651 const MIN_MOST_USED_TERMS = 3; 17652 const DEFAULT_QUERY = { 17653 per_page: 10, 17654 orderby: 'count', 17655 order: 'desc', 17656 hide_empty: true, 17657 _fields: 'id,name,count', 17658 context: 'view' 17659 }; 17660 function MostUsedTerms({ 17661 onSelect, 17662 taxonomy 17663 }) { 17664 const { 17665 _terms, 17666 showTerms 17667 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 17668 const mostUsedTerms = select(external_wp_coreData_namespaceObject.store).getEntityRecords('taxonomy', taxonomy.slug, DEFAULT_QUERY); 17669 return { 17670 _terms: mostUsedTerms, 17671 showTerms: mostUsedTerms?.length >= MIN_MOST_USED_TERMS 17672 }; 17673 }, [taxonomy.slug]); 17674 if (!showTerms) { 17675 return null; 17676 } 17677 const terms = unescapeTerms(_terms); 17678 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 17679 className: "editor-post-taxonomies__flat-term-most-used", 17680 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.BaseControl.VisualLabel, { 17681 as: "h3", 17682 className: "editor-post-taxonomies__flat-term-most-used-label", 17683 children: taxonomy.labels.most_used 17684 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("ul", { 17685 role: "list", 17686 className: "editor-post-taxonomies__flat-term-most-used-list", 17687 children: terms.map(term => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("li", { 17688 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 17689 __next40pxDefaultSize: true, 17690 variant: "link", 17691 onClick: () => onSelect(term), 17692 children: term.name 17693 }) 17694 }, term.id)) 17695 })] 17696 }); 17697 } 17698 17699 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-taxonomies/flat-term-selector.js 17700 /** 17701 * WordPress dependencies 17702 */ 17703 17704 17705 17706 17707 17708 17709 17710 17711 17712 17713 /** 17714 * Internal dependencies 17715 */ 17716 17717 17718 17719 17720 /** 17721 * Shared reference to an empty array for cases where it is important to avoid 17722 * returning a new array reference on every invocation. 17723 * 17724 * @type {Array<any>} 17725 */ 17726 17727 17728 const flat_term_selector_EMPTY_ARRAY = []; 17729 17730 /** 17731 * How the max suggestions limit was chosen: 17732 * - Matches the `per_page` range set by the REST API. 17733 * - Can't use "unbound" query. The `FormTokenField` needs a fixed number. 17734 * - Matches default for `FormTokenField`. 17735 */ 17736 const MAX_TERMS_SUGGESTIONS = 100; 17737 const flat_term_selector_DEFAULT_QUERY = { 17738 per_page: MAX_TERMS_SUGGESTIONS, 17739 _fields: 'id,name', 17740 context: 'view' 17741 }; 17742 const isSameTermName = (termA, termB) => unescapeString(termA).toLowerCase() === unescapeString(termB).toLowerCase(); 17743 const termNamesToIds = (names, terms) => { 17744 return names.map(termName => terms.find(term => isSameTermName(term.name, termName))?.id).filter(id => id !== undefined); 17745 }; 17746 const Wrapper = ({ 17747 children, 17748 __nextHasNoMarginBottom 17749 }) => __nextHasNoMarginBottom ? /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalVStack, { 17750 spacing: 4, 17751 children: children 17752 }) : /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_element_namespaceObject.Fragment, { 17753 children: children 17754 }); 17755 17756 /** 17757 * Renders a flat term selector component. 17758 * 17759 * @param {Object} props The component props. 17760 * @param {string} props.slug The slug of the taxonomy. 17761 * @param {boolean} props.__nextHasNoMarginBottom Start opting into the new margin-free styles that will become the default in a future version, currently scheduled to be WordPress 7.0. (The prop can be safely removed once this happens.) 17762 * 17763 * @return {JSX.Element} The rendered flat term selector component. 17764 */ 17765 function FlatTermSelector({ 17766 slug, 17767 __nextHasNoMarginBottom 17768 }) { 17769 var _taxonomy$labels$add_, _taxonomy$labels$sing2; 17770 const [values, setValues] = (0,external_wp_element_namespaceObject.useState)([]); 17771 const [search, setSearch] = (0,external_wp_element_namespaceObject.useState)(''); 17772 const debouncedSearch = (0,external_wp_compose_namespaceObject.useDebounce)(setSearch, 500); 17773 if (!__nextHasNoMarginBottom) { 17774 external_wp_deprecated_default()('Bottom margin styles for wp.editor.PostTaxonomiesFlatTermSelector', { 17775 since: '6.7', 17776 version: '7.0', 17777 hint: 'Set the `__nextHasNoMarginBottom` prop to true to start opting into the new styles, which will become the default in a future version.' 17778 }); 17779 } 17780 const { 17781 terms, 17782 termIds, 17783 taxonomy, 17784 hasAssignAction, 17785 hasCreateAction, 17786 hasResolvedTerms 17787 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 17788 var _post$_links, _post$_links2; 17789 const { 17790 getCurrentPost, 17791 getEditedPostAttribute 17792 } = select(store_store); 17793 const { 17794 getEntityRecords, 17795 getTaxonomy, 17796 hasFinishedResolution 17797 } = select(external_wp_coreData_namespaceObject.store); 17798 const post = getCurrentPost(); 17799 const _taxonomy = getTaxonomy(slug); 17800 const _termIds = _taxonomy ? getEditedPostAttribute(_taxonomy.rest_base) : flat_term_selector_EMPTY_ARRAY; 17801 const query = { 17802 ...flat_term_selector_DEFAULT_QUERY, 17803 include: _termIds?.join(','), 17804 per_page: -1 17805 }; 17806 return { 17807 hasCreateAction: _taxonomy ? (_post$_links = post._links?.['wp:action-create-' + _taxonomy.rest_base]) !== null && _post$_links !== void 0 ? _post$_links : false : false, 17808 hasAssignAction: _taxonomy ? (_post$_links2 = post._links?.['wp:action-assign-' + _taxonomy.rest_base]) !== null && _post$_links2 !== void 0 ? _post$_links2 : false : false, 17809 taxonomy: _taxonomy, 17810 termIds: _termIds, 17811 terms: _termIds?.length ? getEntityRecords('taxonomy', slug, query) : flat_term_selector_EMPTY_ARRAY, 17812 hasResolvedTerms: hasFinishedResolution('getEntityRecords', ['taxonomy', slug, query]) 17813 }; 17814 }, [slug]); 17815 const { 17816 searchResults 17817 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 17818 const { 17819 getEntityRecords 17820 } = select(external_wp_coreData_namespaceObject.store); 17821 return { 17822 searchResults: !!search ? getEntityRecords('taxonomy', slug, { 17823 ...flat_term_selector_DEFAULT_QUERY, 17824 search 17825 }) : flat_term_selector_EMPTY_ARRAY 17826 }; 17827 }, [search, slug]); 17828 17829 // Update terms state only after the selectors are resolved. 17830 // We're using this to avoid terms temporarily disappearing on slow networks 17831 // while core data makes REST API requests. 17832 (0,external_wp_element_namespaceObject.useEffect)(() => { 17833 if (hasResolvedTerms) { 17834 const newValues = (terms !== null && terms !== void 0 ? terms : []).map(term => unescapeString(term.name)); 17835 setValues(newValues); 17836 } 17837 }, [terms, hasResolvedTerms]); 17838 const suggestions = (0,external_wp_element_namespaceObject.useMemo)(() => { 17839 return (searchResults !== null && searchResults !== void 0 ? searchResults : []).map(term => unescapeString(term.name)); 17840 }, [searchResults]); 17841 const { 17842 editPost 17843 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 17844 const { 17845 saveEntityRecord 17846 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); 17847 const { 17848 createErrorNotice 17849 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); 17850 if (!hasAssignAction) { 17851 return null; 17852 } 17853 async function findOrCreateTerm(term) { 17854 try { 17855 const newTerm = await saveEntityRecord('taxonomy', slug, term, { 17856 throwOnError: true 17857 }); 17858 return unescapeTerm(newTerm); 17859 } catch (error) { 17860 if (error.code !== 'term_exists') { 17861 throw error; 17862 } 17863 return { 17864 id: error.data.term_id, 17865 name: term.name 17866 }; 17867 } 17868 } 17869 function onUpdateTerms(newTermIds) { 17870 editPost({ 17871 [taxonomy.rest_base]: newTermIds 17872 }); 17873 } 17874 function onChange(termNames) { 17875 const availableTerms = [...(terms !== null && terms !== void 0 ? terms : []), ...(searchResults !== null && searchResults !== void 0 ? searchResults : [])]; 17876 const uniqueTerms = termNames.reduce((acc, name) => { 17877 if (!acc.some(n => n.toLowerCase() === name.toLowerCase())) { 17878 acc.push(name); 17879 } 17880 return acc; 17881 }, []); 17882 const newTermNames = uniqueTerms.filter(termName => !availableTerms.find(term => isSameTermName(term.name, termName))); 17883 17884 // Optimistically update term values. 17885 // The selector will always re-fetch terms later. 17886 setValues(uniqueTerms); 17887 if (newTermNames.length === 0) { 17888 onUpdateTerms(termNamesToIds(uniqueTerms, availableTerms)); 17889 return; 17890 } 17891 if (!hasCreateAction) { 17892 return; 17893 } 17894 Promise.all(newTermNames.map(termName => findOrCreateTerm({ 17895 name: termName 17896 }))).then(newTerms => { 17897 const newAvailableTerms = availableTerms.concat(newTerms); 17898 onUpdateTerms(termNamesToIds(uniqueTerms, newAvailableTerms)); 17899 }).catch(error => { 17900 createErrorNotice(error.message, { 17901 type: 'snackbar' 17902 }); 17903 // In case of a failure, try assigning available terms. 17904 // This will invalidate the optimistic update. 17905 onUpdateTerms(termNamesToIds(uniqueTerms, availableTerms)); 17906 }); 17907 } 17908 function appendTerm(newTerm) { 17909 var _taxonomy$labels$sing; 17910 if (termIds.includes(newTerm.id)) { 17911 return; 17912 } 17913 const newTermIds = [...termIds, newTerm.id]; 17914 const defaultName = slug === 'post_tag' ? (0,external_wp_i18n_namespaceObject.__)('Tag') : (0,external_wp_i18n_namespaceObject.__)('Term'); 17915 const termAddedMessage = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: term name. */ 17916 (0,external_wp_i18n_namespaceObject._x)('%s added', 'term'), (_taxonomy$labels$sing = taxonomy?.labels?.singular_name) !== null && _taxonomy$labels$sing !== void 0 ? _taxonomy$labels$sing : defaultName); 17917 (0,external_wp_a11y_namespaceObject.speak)(termAddedMessage, 'assertive'); 17918 onUpdateTerms(newTermIds); 17919 } 17920 const newTermLabel = (_taxonomy$labels$add_ = taxonomy?.labels?.add_new_item) !== null && _taxonomy$labels$add_ !== void 0 ? _taxonomy$labels$add_ : slug === 'post_tag' ? (0,external_wp_i18n_namespaceObject.__)('Add new tag') : (0,external_wp_i18n_namespaceObject.__)('Add new Term'); 17921 const singularName = (_taxonomy$labels$sing2 = taxonomy?.labels?.singular_name) !== null && _taxonomy$labels$sing2 !== void 0 ? _taxonomy$labels$sing2 : slug === 'post_tag' ? (0,external_wp_i18n_namespaceObject.__)('Tag') : (0,external_wp_i18n_namespaceObject.__)('Term'); 17922 const termAddedLabel = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: term name. */ 17923 (0,external_wp_i18n_namespaceObject._x)('%s added', 'term'), singularName); 17924 const termRemovedLabel = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: term name. */ 17925 (0,external_wp_i18n_namespaceObject._x)('%s removed', 'term'), singularName); 17926 const removeTermLabel = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: term name. */ 17927 (0,external_wp_i18n_namespaceObject._x)('Remove %s', 'term'), singularName); 17928 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(Wrapper, { 17929 __nextHasNoMarginBottom: __nextHasNoMarginBottom, 17930 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.FormTokenField, { 17931 __next40pxDefaultSize: true, 17932 value: values, 17933 suggestions: suggestions, 17934 onChange: onChange, 17935 onInputChange: debouncedSearch, 17936 maxSuggestions: MAX_TERMS_SUGGESTIONS, 17937 label: newTermLabel, 17938 messages: { 17939 added: termAddedLabel, 17940 removed: termRemovedLabel, 17941 remove: removeTermLabel 17942 }, 17943 __nextHasNoMarginBottom: __nextHasNoMarginBottom 17944 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(MostUsedTerms, { 17945 taxonomy: taxonomy, 17946 onSelect: appendTerm 17947 })] 17948 }); 17949 } 17950 /* harmony default export */ const flat_term_selector = ((0,external_wp_components_namespaceObject.withFilters)('editor.PostTaxonomyType')(FlatTermSelector)); 17951 17952 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-panel/maybe-tags-panel.js 17953 /** 17954 * WordPress dependencies 17955 */ 17956 17957 17958 17959 17960 17961 17962 /** 17963 * Internal dependencies 17964 */ 17965 17966 17967 17968 17969 const TagsPanel = () => { 17970 const panelBodyTitle = [(0,external_wp_i18n_namespaceObject.__)('Suggestion:'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 17971 className: "editor-post-publish-panel__link", 17972 children: (0,external_wp_i18n_namespaceObject.__)('Add tags') 17973 }, "label")]; 17974 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.PanelBody, { 17975 initialOpen: false, 17976 title: panelBodyTitle, 17977 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { 17978 children: (0,external_wp_i18n_namespaceObject.__)('Tags help users and search engines navigate your site and find your content. Add a few keywords to describe your post.') 17979 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(flat_term_selector, { 17980 slug: "post_tag", 17981 __nextHasNoMarginBottom: true 17982 })] 17983 }); 17984 }; 17985 const MaybeTagsPanel = () => { 17986 const { 17987 hasTags, 17988 isPostTypeSupported 17989 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 17990 const postType = select(store_store).getCurrentPostType(); 17991 const tagsTaxonomy = select(external_wp_coreData_namespaceObject.store).getTaxonomy('post_tag'); 17992 const _isPostTypeSupported = tagsTaxonomy?.types?.includes(postType); 17993 const areTagsFetched = tagsTaxonomy !== undefined; 17994 const tags = tagsTaxonomy && select(store_store).getEditedPostAttribute(tagsTaxonomy.rest_base); 17995 return { 17996 hasTags: !!tags?.length, 17997 isPostTypeSupported: areTagsFetched && _isPostTypeSupported 17998 }; 17999 }, []); 18000 const [hadTagsWhenOpeningThePanel] = (0,external_wp_element_namespaceObject.useState)(hasTags); 18001 if (!isPostTypeSupported) { 18002 return null; 18003 } 18004 18005 /* 18006 * We only want to show the tag panel if the post didn't have 18007 * any tags when the user hit the Publish button. 18008 * 18009 * We can't use the prop.hasTags because it'll change to true 18010 * if the user adds a new tag within the pre-publish panel. 18011 * This would force a re-render and a new prop.hasTags check, 18012 * hiding this panel and keeping the user from adding 18013 * more than one tag. 18014 */ 18015 if (!hadTagsWhenOpeningThePanel) { 18016 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TagsPanel, {}); 18017 } 18018 return null; 18019 }; 18020 /* harmony default export */ const maybe_tags_panel = (MaybeTagsPanel); 18021 18022 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-panel/maybe-post-format-panel.js 18023 /** 18024 * WordPress dependencies 18025 */ 18026 18027 18028 18029 18030 18031 /** 18032 * Internal dependencies 18033 */ 18034 18035 18036 18037 18038 const getSuggestion = (supportedFormats, suggestedPostFormat) => { 18039 const formats = POST_FORMATS.filter(format => supportedFormats?.includes(format.id)); 18040 return formats.find(format => format.id === suggestedPostFormat); 18041 }; 18042 const PostFormatSuggestion = ({ 18043 suggestedPostFormat, 18044 suggestionText, 18045 onUpdatePostFormat 18046 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 18047 __next40pxDefaultSize: true, 18048 variant: "link", 18049 onClick: () => onUpdatePostFormat(suggestedPostFormat), 18050 children: suggestionText 18051 }); 18052 function PostFormatPanel() { 18053 const { 18054 currentPostFormat, 18055 suggestion 18056 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 18057 var _select$getThemeSuppo; 18058 const { 18059 getEditedPostAttribute, 18060 getSuggestedPostFormat 18061 } = select(store_store); 18062 const supportedFormats = (_select$getThemeSuppo = select(external_wp_coreData_namespaceObject.store).getThemeSupports().formats) !== null && _select$getThemeSuppo !== void 0 ? _select$getThemeSuppo : []; 18063 return { 18064 currentPostFormat: getEditedPostAttribute('format'), 18065 suggestion: getSuggestion(supportedFormats, getSuggestedPostFormat()) 18066 }; 18067 }, []); 18068 const { 18069 editPost 18070 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 18071 const onUpdatePostFormat = format => editPost({ 18072 format 18073 }); 18074 const panelBodyTitle = [(0,external_wp_i18n_namespaceObject.__)('Suggestion:'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 18075 className: "editor-post-publish-panel__link", 18076 children: (0,external_wp_i18n_namespaceObject.__)('Use a post format') 18077 }, "label")]; 18078 if (!suggestion || suggestion.id === currentPostFormat) { 18079 return null; 18080 } 18081 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.PanelBody, { 18082 initialOpen: false, 18083 title: panelBodyTitle, 18084 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { 18085 children: (0,external_wp_i18n_namespaceObject.__)('Your theme uses post formats to highlight different kinds of content, like images or videos. Apply a post format to see this special styling.') 18086 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { 18087 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostFormatSuggestion, { 18088 onUpdatePostFormat: onUpdatePostFormat, 18089 suggestedPostFormat: suggestion.id, 18090 suggestionText: (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: post format */ 18091 (0,external_wp_i18n_namespaceObject.__)('Apply the "%1$s" format.'), suggestion.caption) 18092 }) 18093 })] 18094 }); 18095 } 18096 18097 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-taxonomies/hierarchical-term-selector.js 18098 /** 18099 * WordPress dependencies 18100 */ 18101 18102 18103 18104 18105 18106 18107 18108 18109 18110 18111 /** 18112 * Internal dependencies 18113 */ 18114 18115 18116 18117 /** 18118 * Module Constants 18119 */ 18120 18121 18122 const hierarchical_term_selector_DEFAULT_QUERY = { 18123 per_page: -1, 18124 orderby: 'name', 18125 order: 'asc', 18126 _fields: 'id,name,parent', 18127 context: 'view' 18128 }; 18129 const MIN_TERMS_COUNT_FOR_FILTER = 8; 18130 const hierarchical_term_selector_EMPTY_ARRAY = []; 18131 18132 /** 18133 * Sort Terms by Selected. 18134 * 18135 * @param {Object[]} termsTree Array of terms in tree format. 18136 * @param {number[]} terms Selected terms. 18137 * 18138 * @return {Object[]} Sorted array of terms. 18139 */ 18140 function sortBySelected(termsTree, terms) { 18141 const treeHasSelection = termTree => { 18142 if (terms.indexOf(termTree.id) !== -1) { 18143 return true; 18144 } 18145 if (undefined === termTree.children) { 18146 return false; 18147 } 18148 return termTree.children.map(treeHasSelection).filter(child => child).length > 0; 18149 }; 18150 const termOrChildIsSelected = (termA, termB) => { 18151 const termASelected = treeHasSelection(termA); 18152 const termBSelected = treeHasSelection(termB); 18153 if (termASelected === termBSelected) { 18154 return 0; 18155 } 18156 if (termASelected && !termBSelected) { 18157 return -1; 18158 } 18159 if (!termASelected && termBSelected) { 18160 return 1; 18161 } 18162 return 0; 18163 }; 18164 const newTermTree = [...termsTree]; 18165 newTermTree.sort(termOrChildIsSelected); 18166 return newTermTree; 18167 } 18168 18169 /** 18170 * Find term by parent id or name. 18171 * 18172 * @param {Object[]} terms Array of Terms. 18173 * @param {number|string} parent id. 18174 * @param {string} name Term name. 18175 * @return {Object} Term object. 18176 */ 18177 function findTerm(terms, parent, name) { 18178 return terms.find(term => { 18179 return (!term.parent && !parent || parseInt(term.parent) === parseInt(parent)) && term.name.toLowerCase() === name.toLowerCase(); 18180 }); 18181 } 18182 18183 /** 18184 * Get filter matcher function. 18185 * 18186 * @param {string} filterValue Filter value. 18187 * @return {(function(Object): (Object|boolean))} Matcher function. 18188 */ 18189 function getFilterMatcher(filterValue) { 18190 const matchTermsForFilter = originalTerm => { 18191 if ('' === filterValue) { 18192 return originalTerm; 18193 } 18194 18195 // Shallow clone, because we'll be filtering the term's children and 18196 // don't want to modify the original term. 18197 const term = { 18198 ...originalTerm 18199 }; 18200 18201 // Map and filter the children, recursive so we deal with grandchildren 18202 // and any deeper levels. 18203 if (term.children.length > 0) { 18204 term.children = term.children.map(matchTermsForFilter).filter(child => child); 18205 } 18206 18207 // If the term's name contains the filterValue, or it has children 18208 // (i.e. some child matched at some point in the tree) then return it. 18209 if (-1 !== term.name.toLowerCase().indexOf(filterValue.toLowerCase()) || term.children.length > 0) { 18210 return term; 18211 } 18212 18213 // Otherwise, return false. After mapping, the list of terms will need 18214 // to have false values filtered out. 18215 return false; 18216 }; 18217 return matchTermsForFilter; 18218 } 18219 18220 /** 18221 * Hierarchical term selector. 18222 * 18223 * @param {Object} props Component props. 18224 * @param {string} props.slug Taxonomy slug. 18225 * @return {Element} Hierarchical term selector component. 18226 */ 18227 function HierarchicalTermSelector({ 18228 slug 18229 }) { 18230 var _taxonomy$labels$sear, _taxonomy$name; 18231 const [adding, setAdding] = (0,external_wp_element_namespaceObject.useState)(false); 18232 const [formName, setFormName] = (0,external_wp_element_namespaceObject.useState)(''); 18233 /** 18234 * @type {[number|'', Function]} 18235 */ 18236 const [formParent, setFormParent] = (0,external_wp_element_namespaceObject.useState)(''); 18237 const [showForm, setShowForm] = (0,external_wp_element_namespaceObject.useState)(false); 18238 const [filterValue, setFilterValue] = (0,external_wp_element_namespaceObject.useState)(''); 18239 const [filteredTermsTree, setFilteredTermsTree] = (0,external_wp_element_namespaceObject.useState)([]); 18240 const debouncedSpeak = (0,external_wp_compose_namespaceObject.useDebounce)(external_wp_a11y_namespaceObject.speak, 500); 18241 const { 18242 hasCreateAction, 18243 hasAssignAction, 18244 terms, 18245 loading, 18246 availableTerms, 18247 taxonomy 18248 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 18249 var _post$_links, _post$_links2; 18250 const { 18251 getCurrentPost, 18252 getEditedPostAttribute 18253 } = select(store_store); 18254 const { 18255 getTaxonomy, 18256 getEntityRecords, 18257 isResolving 18258 } = select(external_wp_coreData_namespaceObject.store); 18259 const _taxonomy = getTaxonomy(slug); 18260 const post = getCurrentPost(); 18261 return { 18262 hasCreateAction: _taxonomy ? (_post$_links = post._links?.['wp:action-create-' + _taxonomy.rest_base]) !== null && _post$_links !== void 0 ? _post$_links : false : false, 18263 hasAssignAction: _taxonomy ? (_post$_links2 = post._links?.['wp:action-assign-' + _taxonomy.rest_base]) !== null && _post$_links2 !== void 0 ? _post$_links2 : false : false, 18264 terms: _taxonomy ? getEditedPostAttribute(_taxonomy.rest_base) : hierarchical_term_selector_EMPTY_ARRAY, 18265 loading: isResolving('getEntityRecords', ['taxonomy', slug, hierarchical_term_selector_DEFAULT_QUERY]), 18266 availableTerms: getEntityRecords('taxonomy', slug, hierarchical_term_selector_DEFAULT_QUERY) || hierarchical_term_selector_EMPTY_ARRAY, 18267 taxonomy: _taxonomy 18268 }; 18269 }, [slug]); 18270 const { 18271 editPost 18272 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 18273 const { 18274 saveEntityRecord 18275 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); 18276 const availableTermsTree = (0,external_wp_element_namespaceObject.useMemo)(() => sortBySelected(buildTermsTree(availableTerms), terms), 18277 // Remove `terms` from the dependency list to avoid reordering every time 18278 // checking or unchecking a term. 18279 [availableTerms]); 18280 const { 18281 createErrorNotice 18282 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); 18283 if (!hasAssignAction) { 18284 return null; 18285 } 18286 18287 /** 18288 * Append new term. 18289 * 18290 * @param {Object} term Term object. 18291 * @return {Promise} A promise that resolves to save term object. 18292 */ 18293 const addTerm = term => { 18294 return saveEntityRecord('taxonomy', slug, term, { 18295 throwOnError: true 18296 }); 18297 }; 18298 18299 /** 18300 * Update terms for post. 18301 * 18302 * @param {number[]} termIds Term ids. 18303 */ 18304 const onUpdateTerms = termIds => { 18305 editPost({ 18306 [taxonomy.rest_base]: termIds 18307 }); 18308 }; 18309 18310 /** 18311 * Handler for checking term. 18312 * 18313 * @param {number} termId 18314 */ 18315 const onChange = termId => { 18316 const hasTerm = terms.includes(termId); 18317 const newTerms = hasTerm ? terms.filter(id => id !== termId) : [...terms, termId]; 18318 onUpdateTerms(newTerms); 18319 }; 18320 const onChangeFormName = value => { 18321 setFormName(value); 18322 }; 18323 18324 /** 18325 * Handler for changing form parent. 18326 * 18327 * @param {number|''} parentId Parent post id. 18328 */ 18329 const onChangeFormParent = parentId => { 18330 setFormParent(parentId); 18331 }; 18332 const onToggleForm = () => { 18333 setShowForm(!showForm); 18334 }; 18335 const onAddTerm = async event => { 18336 var _taxonomy$labels$sing; 18337 event.preventDefault(); 18338 if (formName === '' || adding) { 18339 return; 18340 } 18341 18342 // Check if the term we are adding already exists. 18343 const existingTerm = findTerm(availableTerms, formParent, formName); 18344 if (existingTerm) { 18345 // If the term we are adding exists but is not selected select it. 18346 if (!terms.some(term => term === existingTerm.id)) { 18347 onUpdateTerms([...terms, existingTerm.id]); 18348 } 18349 setFormName(''); 18350 setFormParent(''); 18351 return; 18352 } 18353 setAdding(true); 18354 let newTerm; 18355 try { 18356 newTerm = await addTerm({ 18357 name: formName, 18358 parent: formParent ? formParent : undefined 18359 }); 18360 } catch (error) { 18361 createErrorNotice(error.message, { 18362 type: 'snackbar' 18363 }); 18364 return; 18365 } 18366 const defaultName = slug === 'category' ? (0,external_wp_i18n_namespaceObject.__)('Category') : (0,external_wp_i18n_namespaceObject.__)('Term'); 18367 const termAddedMessage = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: term name. */ 18368 (0,external_wp_i18n_namespaceObject._x)('%s added', 'term'), (_taxonomy$labels$sing = taxonomy?.labels?.singular_name) !== null && _taxonomy$labels$sing !== void 0 ? _taxonomy$labels$sing : defaultName); 18369 (0,external_wp_a11y_namespaceObject.speak)(termAddedMessage, 'assertive'); 18370 setAdding(false); 18371 setFormName(''); 18372 setFormParent(''); 18373 onUpdateTerms([...terms, newTerm.id]); 18374 }; 18375 const setFilter = value => { 18376 const newFilteredTermsTree = availableTermsTree.map(getFilterMatcher(value)).filter(term => term); 18377 const getResultCount = termsTree => { 18378 let count = 0; 18379 for (let i = 0; i < termsTree.length; i++) { 18380 count++; 18381 if (undefined !== termsTree[i].children) { 18382 count += getResultCount(termsTree[i].children); 18383 } 18384 } 18385 return count; 18386 }; 18387 setFilterValue(value); 18388 setFilteredTermsTree(newFilteredTermsTree); 18389 const resultCount = getResultCount(newFilteredTermsTree); 18390 const resultsFoundMessage = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %d: number of results. */ 18391 (0,external_wp_i18n_namespaceObject._n)('%d result found.', '%d results found.', resultCount), resultCount); 18392 debouncedSpeak(resultsFoundMessage, 'assertive'); 18393 }; 18394 const renderTerms = renderedTerms => { 18395 return renderedTerms.map(term => { 18396 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 18397 className: "editor-post-taxonomies__hierarchical-terms-choice", 18398 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.CheckboxControl, { 18399 __nextHasNoMarginBottom: true, 18400 checked: terms.indexOf(term.id) !== -1, 18401 onChange: () => { 18402 const termId = parseInt(term.id, 10); 18403 onChange(termId); 18404 }, 18405 label: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(term.name) 18406 }), !!term.children.length && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 18407 className: "editor-post-taxonomies__hierarchical-terms-subchoices", 18408 children: renderTerms(term.children) 18409 })] 18410 }, term.id); 18411 }); 18412 }; 18413 const labelWithFallback = (labelProperty, fallbackIsCategory, fallbackIsNotCategory) => { 18414 var _taxonomy$labels$labe; 18415 return (_taxonomy$labels$labe = taxonomy?.labels?.[labelProperty]) !== null && _taxonomy$labels$labe !== void 0 ? _taxonomy$labels$labe : slug === 'category' ? fallbackIsCategory : fallbackIsNotCategory; 18416 }; 18417 const newTermButtonLabel = labelWithFallback('add_new_item', (0,external_wp_i18n_namespaceObject.__)('Add new category'), (0,external_wp_i18n_namespaceObject.__)('Add new term')); 18418 const newTermLabel = labelWithFallback('new_item_name', (0,external_wp_i18n_namespaceObject.__)('Add new category'), (0,external_wp_i18n_namespaceObject.__)('Add new term')); 18419 const parentSelectLabel = labelWithFallback('parent_item', (0,external_wp_i18n_namespaceObject.__)('Parent Category'), (0,external_wp_i18n_namespaceObject.__)('Parent Term')); 18420 const noParentOption = `— $parentSelectLabel} —`; 18421 const newTermSubmitLabel = newTermButtonLabel; 18422 const filterLabel = (_taxonomy$labels$sear = taxonomy?.labels?.search_items) !== null && _taxonomy$labels$sear !== void 0 ? _taxonomy$labels$sear : (0,external_wp_i18n_namespaceObject.__)('Search Terms'); 18423 const groupLabel = (_taxonomy$name = taxonomy?.name) !== null && _taxonomy$name !== void 0 ? _taxonomy$name : (0,external_wp_i18n_namespaceObject.__)('Terms'); 18424 const showFilter = availableTerms.length >= MIN_TERMS_COUNT_FOR_FILTER; 18425 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.Flex, { 18426 direction: "column", 18427 gap: "4", 18428 children: [showFilter && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.SearchControl, { 18429 __next40pxDefaultSize: true, 18430 __nextHasNoMarginBottom: true, 18431 label: filterLabel, 18432 value: filterValue, 18433 onChange: setFilter 18434 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 18435 className: "editor-post-taxonomies__hierarchical-terms-list", 18436 tabIndex: "0", 18437 role: "group", 18438 "aria-label": groupLabel, 18439 children: renderTerms('' !== filterValue ? filteredTermsTree : availableTermsTree) 18440 }), !loading && hasCreateAction && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.FlexItem, { 18441 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 18442 __next40pxDefaultSize: true, 18443 onClick: onToggleForm, 18444 className: "editor-post-taxonomies__hierarchical-terms-add", 18445 "aria-expanded": showForm, 18446 variant: "link", 18447 children: newTermButtonLabel 18448 }) 18449 }), showForm && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("form", { 18450 onSubmit: onAddTerm, 18451 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.Flex, { 18452 direction: "column", 18453 gap: "4", 18454 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.TextControl, { 18455 __next40pxDefaultSize: true, 18456 __nextHasNoMarginBottom: true, 18457 className: "editor-post-taxonomies__hierarchical-terms-input", 18458 label: newTermLabel, 18459 value: formName, 18460 onChange: onChangeFormName, 18461 required: true 18462 }), !!availableTerms.length && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.TreeSelect, { 18463 __next40pxDefaultSize: true, 18464 __nextHasNoMarginBottom: true, 18465 label: parentSelectLabel, 18466 noOptionLabel: noParentOption, 18467 onChange: onChangeFormParent, 18468 selectedId: formParent, 18469 tree: availableTermsTree 18470 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.FlexItem, { 18471 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 18472 __next40pxDefaultSize: true, 18473 variant: "secondary", 18474 type: "submit", 18475 className: "editor-post-taxonomies__hierarchical-terms-submit", 18476 children: newTermSubmitLabel 18477 }) 18478 })] 18479 }) 18480 })] 18481 }); 18482 } 18483 /* harmony default export */ const hierarchical_term_selector = ((0,external_wp_components_namespaceObject.withFilters)('editor.PostTaxonomyType')(HierarchicalTermSelector)); 18484 18485 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-panel/maybe-category-panel.js 18486 /** 18487 * WordPress dependencies 18488 */ 18489 18490 18491 18492 18493 18494 18495 /** 18496 * Internal dependencies 18497 */ 18498 18499 18500 18501 18502 function MaybeCategoryPanel() { 18503 const hasNoCategory = (0,external_wp_data_namespaceObject.useSelect)(select => { 18504 const postType = select(store_store).getCurrentPostType(); 18505 const { 18506 canUser, 18507 getEntityRecord, 18508 getTaxonomy 18509 } = select(external_wp_coreData_namespaceObject.store); 18510 const categoriesTaxonomy = getTaxonomy('category'); 18511 const defaultCategoryId = canUser('read', { 18512 kind: 'root', 18513 name: 'site' 18514 }) ? getEntityRecord('root', 'site')?.default_category : undefined; 18515 const defaultCategory = defaultCategoryId ? getEntityRecord('taxonomy', 'category', defaultCategoryId) : undefined; 18516 const postTypeSupportsCategories = categoriesTaxonomy && categoriesTaxonomy.types.some(type => type === postType); 18517 const categories = categoriesTaxonomy && select(store_store).getEditedPostAttribute(categoriesTaxonomy.rest_base); 18518 18519 // This boolean should return true if everything is loaded 18520 // ( categoriesTaxonomy, defaultCategory ) 18521 // and the post has not been assigned a category different than "uncategorized". 18522 return !!categoriesTaxonomy && !!defaultCategory && postTypeSupportsCategories && (categories?.length === 0 || categories?.length === 1 && defaultCategory?.id === categories[0]); 18523 }, []); 18524 const [shouldShowPanel, setShouldShowPanel] = (0,external_wp_element_namespaceObject.useState)(false); 18525 (0,external_wp_element_namespaceObject.useEffect)(() => { 18526 // We use state to avoid hiding the panel if the user edits the categories 18527 // and adds one within the panel itself (while visible). 18528 if (hasNoCategory) { 18529 setShouldShowPanel(true); 18530 } 18531 }, [hasNoCategory]); 18532 if (!shouldShowPanel) { 18533 return null; 18534 } 18535 const panelBodyTitle = [(0,external_wp_i18n_namespaceObject.__)('Suggestion:'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 18536 className: "editor-post-publish-panel__link", 18537 children: (0,external_wp_i18n_namespaceObject.__)('Assign a category') 18538 }, "label")]; 18539 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.PanelBody, { 18540 initialOpen: false, 18541 title: panelBodyTitle, 18542 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { 18543 children: (0,external_wp_i18n_namespaceObject.__)('Categories provide a helpful way to group related posts together and to quickly tell readers what a post is about.') 18544 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(hierarchical_term_selector, { 18545 slug: "category" 18546 })] 18547 }); 18548 } 18549 /* harmony default export */ const maybe_category_panel = (MaybeCategoryPanel); 18550 18551 ;// CONCATENATED MODULE: ./node_modules/uuid/dist/esm-browser/native.js 18552 const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto); 18553 /* harmony default export */ const esm_browser_native = ({ 18554 randomUUID 18555 }); 18556 ;// CONCATENATED MODULE: ./node_modules/uuid/dist/esm-browser/rng.js 18557 // Unique ID creation requires a high quality random # generator. In the browser we therefore 18558 // require the crypto API and do not support built-in fallback to lower quality random number 18559 // generators (like Math.random()). 18560 let getRandomValues; 18561 const rnds8 = new Uint8Array(16); 18562 function rng() { 18563 // lazy load so that environments that need to polyfill have a chance to do so 18564 if (!getRandomValues) { 18565 // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. 18566 getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto); 18567 18568 if (!getRandomValues) { 18569 throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported'); 18570 } 18571 } 18572 18573 return getRandomValues(rnds8); 18574 } 18575 ;// CONCATENATED MODULE: ./node_modules/uuid/dist/esm-browser/stringify.js 18576 18577 /** 18578 * Convert array of 16 byte values to UUID string format of the form: 18579 * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 18580 */ 18581 18582 const byteToHex = []; 18583 18584 for (let i = 0; i < 256; ++i) { 18585 byteToHex.push((i + 0x100).toString(16).slice(1)); 18586 } 18587 18588 function unsafeStringify(arr, offset = 0) { 18589 // Note: Be careful editing this code! It's been tuned for performance 18590 // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434 18591 return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]; 18592 } 18593 18594 function stringify(arr, offset = 0) { 18595 const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one 18596 // of the following: 18597 // - One or more input array values don't map to a hex octet (leading to 18598 // "undefined" in the uuid) 18599 // - Invalid input values for the RFC `version` or `variant` fields 18600 18601 if (!validate(uuid)) { 18602 throw TypeError('Stringified UUID is invalid'); 18603 } 18604 18605 return uuid; 18606 } 18607 18608 /* harmony default export */ const esm_browser_stringify = ((/* unused pure expression or super */ null && (stringify))); 18609 ;// CONCATENATED MODULE: ./node_modules/uuid/dist/esm-browser/v4.js 18610 18611 18612 18613 18614 function v4(options, buf, offset) { 18615 if (esm_browser_native.randomUUID && !buf && !options) { 18616 return esm_browser_native.randomUUID(); 18617 } 18618 18619 options = options || {}; 18620 const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` 18621 18622 rnds[6] = rnds[6] & 0x0f | 0x40; 18623 rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided 18624 18625 if (buf) { 18626 offset = offset || 0; 18627 18628 for (let i = 0; i < 16; ++i) { 18629 buf[offset + i] = rnds[i]; 18630 } 18631 18632 return buf; 18633 } 18634 18635 return unsafeStringify(rnds); 18636 } 18637 18638 /* harmony default export */ const esm_browser_v4 = (v4); 18639 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-panel/media-util.js 18640 /** 18641 * External dependencies 18642 */ 18643 18644 18645 /** 18646 * WordPress dependencies 18647 */ 18648 18649 18650 /** 18651 * Generate a list of unique basenames given a list of URLs. 18652 * 18653 * We want all basenames to be unique, since sometimes the extension 18654 * doesn't reflect the mime type, and may end up getting changed by 18655 * the server, on upload. 18656 * 18657 * @param {string[]} urls The list of URLs 18658 * @return {Record< string, string >} A URL => basename record. 18659 */ 18660 function generateUniqueBasenames(urls) { 18661 const basenames = new Set(); 18662 return Object.fromEntries(urls.map(url => { 18663 // We prefer to match the remote filename, if possible. 18664 const filename = (0,external_wp_url_namespaceObject.getFilename)(url); 18665 let basename = ''; 18666 if (filename) { 18667 const parts = filename.split('.'); 18668 if (parts.length > 1) { 18669 // Assume the last part is the extension. 18670 parts.pop(); 18671 } 18672 basename = parts.join('.'); 18673 } 18674 if (!basename) { 18675 // It looks like we don't have a basename, so let's use a UUID. 18676 basename = esm_browser_v4(); 18677 } 18678 if (basenames.has(basename)) { 18679 // Append a UUID to deduplicate the basename. 18680 // The server will try to deduplicate on its own if we don't do this, 18681 // but it may run into a race condition 18682 // (see https://github.com/WordPress/gutenberg/issues/64899). 18683 // Deduplicating the filenames before uploading is safer. 18684 basename = `$basename}-$esm_browser_v4()}`; 18685 } 18686 basenames.add(basename); 18687 return [url, basename]; 18688 })); 18689 } 18690 18691 /** 18692 * Fetch a list of URLs, turning those into promises for files with 18693 * unique filenames. 18694 * 18695 * @param {string[]} urls The list of URLs 18696 * @return {Record< string, Promise< File > >} A URL => File promise record. 18697 */ 18698 function fetchMedia(urls) { 18699 return Object.fromEntries(Object.entries(generateUniqueBasenames(urls)).map(([url, basename]) => { 18700 const filePromise = window.fetch(url.includes('?') ? url : url + '?').then(response => response.blob()).then(blob => { 18701 // The server will reject the upload if it doesn't have an extension, 18702 // even though it'll rewrite the file name to match the mime type. 18703 // Here we provide it with a safe extension to get it past that check. 18704 return new File([blob], `$basename}.png`, { 18705 type: blob.type 18706 }); 18707 }); 18708 return [url, filePromise]; 18709 })); 18710 } 18711 18712 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-panel/maybe-upload-media.js 18713 /** 18714 * WordPress dependencies 18715 */ 18716 18717 18718 18719 18720 18721 18722 18723 /** 18724 * Internal dependencies 18725 */ 18726 18727 18728 18729 function flattenBlocks(blocks) { 18730 const result = []; 18731 blocks.forEach(block => { 18732 result.push(block); 18733 result.push(...flattenBlocks(block.innerBlocks)); 18734 }); 18735 return result; 18736 } 18737 18738 /** 18739 * Determine whether a block has external media. 18740 * 18741 * Different blocks use different attribute names (and potentially 18742 * different logic as well) in determining whether the media is 18743 * present, and whether it's external. 18744 * 18745 * @param {{name: string, attributes: Object}} block The block. 18746 * @return {boolean?} Whether the block has external media 18747 */ 18748 function hasExternalMedia(block) { 18749 if (block.name === 'core/image' || block.name === 'core/cover') { 18750 return block.attributes.url && !block.attributes.id; 18751 } 18752 if (block.name === 'core/media-text') { 18753 return block.attributes.mediaUrl && !block.attributes.mediaId; 18754 } 18755 return undefined; 18756 } 18757 18758 /** 18759 * Retrieve media info from a block. 18760 * 18761 * Different blocks use different attribute names, so we need this 18762 * function to normalize things into a consistent naming scheme. 18763 * 18764 * @param {{name: string, attributes: Object}} block The block. 18765 * @return {{url: ?string, alt: ?string, id: ?number}} The media info for the block. 18766 */ 18767 function getMediaInfo(block) { 18768 if (block.name === 'core/image' || block.name === 'core/cover') { 18769 const { 18770 url, 18771 alt, 18772 id 18773 } = block.attributes; 18774 return { 18775 url, 18776 alt, 18777 id 18778 }; 18779 } 18780 if (block.name === 'core/media-text') { 18781 const { 18782 mediaUrl: url, 18783 mediaAlt: alt, 18784 mediaId: id 18785 } = block.attributes; 18786 return { 18787 url, 18788 alt, 18789 id 18790 }; 18791 } 18792 return {}; 18793 } 18794 18795 // Image component to represent a single image in the upload dialog. 18796 function Image({ 18797 clientId, 18798 alt, 18799 url 18800 }) { 18801 const { 18802 selectBlock 18803 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_blockEditor_namespaceObject.store); 18804 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__unstableMotion.img, { 18805 tabIndex: 0, 18806 role: "button", 18807 "aria-label": (0,external_wp_i18n_namespaceObject.__)('Select image block.'), 18808 onClick: () => { 18809 selectBlock(clientId); 18810 }, 18811 onKeyDown: event => { 18812 if (event.key === 'Enter' || event.key === ' ') { 18813 selectBlock(clientId); 18814 event.preventDefault(); 18815 } 18816 }, 18817 alt: alt, 18818 src: url, 18819 animate: { 18820 opacity: 1 18821 }, 18822 exit: { 18823 opacity: 0, 18824 scale: 0 18825 }, 18826 style: { 18827 width: '32px', 18828 height: '32px', 18829 objectFit: 'cover', 18830 borderRadius: '2px', 18831 cursor: 'pointer' 18832 }, 18833 whileHover: { 18834 scale: 1.08 18835 } 18836 }, clientId); 18837 } 18838 function MaybeUploadMediaPanel() { 18839 const [isUploading, setIsUploading] = (0,external_wp_element_namespaceObject.useState)(false); 18840 const [isAnimating, setIsAnimating] = (0,external_wp_element_namespaceObject.useState)(false); 18841 const [hadUploadError, setHadUploadError] = (0,external_wp_element_namespaceObject.useState)(false); 18842 const { 18843 editorBlocks, 18844 mediaUpload 18845 } = (0,external_wp_data_namespaceObject.useSelect)(select => ({ 18846 editorBlocks: select(external_wp_blockEditor_namespaceObject.store).getBlocks(), 18847 mediaUpload: select(external_wp_blockEditor_namespaceObject.store).getSettings().mediaUpload 18848 }), []); 18849 18850 // Get a list of blocks with external media. 18851 const blocksWithExternalMedia = flattenBlocks(editorBlocks).filter(block => hasExternalMedia(block)); 18852 const { 18853 updateBlockAttributes 18854 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_blockEditor_namespaceObject.store); 18855 if (!mediaUpload || !blocksWithExternalMedia.length) { 18856 return null; 18857 } 18858 const panelBodyTitle = [(0,external_wp_i18n_namespaceObject.__)('Suggestion:'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 18859 className: "editor-post-publish-panel__link", 18860 children: (0,external_wp_i18n_namespaceObject.__)('External media') 18861 }, "label")]; 18862 18863 /** 18864 * Update an individual block to point to newly-added library media. 18865 * 18866 * Different blocks use different attribute names, so we need this 18867 * function to ensure we modify the correct attributes for each type. 18868 * 18869 * @param {{name: string, attributes: Object}} block The block. 18870 * @param {{id: number, url: string}} media Media library file info. 18871 */ 18872 function updateBlockWithUploadedMedia(block, media) { 18873 if (block.name === 'core/image' || block.name === 'core/cover') { 18874 updateBlockAttributes(block.clientId, { 18875 id: media.id, 18876 url: media.url 18877 }); 18878 } 18879 if (block.name === 'core/media-text') { 18880 updateBlockAttributes(block.clientId, { 18881 mediaId: media.id, 18882 mediaUrl: media.url 18883 }); 18884 } 18885 } 18886 18887 // Handle fetching and uploading all external media in the post. 18888 function uploadImages() { 18889 setIsUploading(true); 18890 setHadUploadError(false); 18891 18892 // Multiple blocks can be using the same URL, so we 18893 // should ensure we only fetch and upload each of them once. 18894 const mediaUrls = new Set(blocksWithExternalMedia.map(block => { 18895 const { 18896 url 18897 } = getMediaInfo(block); 18898 return url; 18899 })); 18900 18901 // Create an upload promise for each URL, that we can wait for in all 18902 // blocks that make use of that media. 18903 const uploadPromises = Object.fromEntries(Object.entries(fetchMedia([...mediaUrls])).map(([url, filePromise]) => { 18904 const uploadPromise = filePromise.then(blob => new Promise((resolve, reject) => { 18905 mediaUpload({ 18906 filesList: [blob], 18907 onFileChange: ([media]) => { 18908 if ((0,external_wp_blob_namespaceObject.isBlobURL)(media.url)) { 18909 return; 18910 } 18911 resolve(media); 18912 }, 18913 onError() { 18914 reject(); 18915 } 18916 }); 18917 })); 18918 return [url, uploadPromise]; 18919 })); 18920 18921 // Wait for all blocks to be updated with library media. 18922 Promise.allSettled(blocksWithExternalMedia.map(block => { 18923 const { 18924 url 18925 } = getMediaInfo(block); 18926 return uploadPromises[url].then(media => updateBlockWithUploadedMedia(block, media)).then(() => setIsAnimating(true)).catch(() => setHadUploadError(true)); 18927 })).finally(() => { 18928 setIsUploading(false); 18929 }); 18930 } 18931 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.PanelBody, { 18932 initialOpen: true, 18933 title: panelBodyTitle, 18934 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { 18935 children: (0,external_wp_i18n_namespaceObject.__)('Upload external images to the Media Library. Images from different domains may load slowly, display incorrectly, or be removed unexpectedly.') 18936 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 18937 style: { 18938 display: 'inline-flex', 18939 flexWrap: 'wrap', 18940 gap: '8px' 18941 }, 18942 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__unstableAnimatePresence, { 18943 onExitComplete: () => setIsAnimating(false), 18944 children: blocksWithExternalMedia.map(block => { 18945 const { 18946 url, 18947 alt 18948 } = getMediaInfo(block); 18949 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(Image, { 18950 clientId: block.clientId, 18951 url: url, 18952 alt: alt 18953 }, block.clientId); 18954 }) 18955 }), isUploading || isAnimating ? /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Spinner, {}) : /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 18956 size: "compact", 18957 variant: "primary", 18958 onClick: uploadImages, 18959 children: (0,external_wp_i18n_namespaceObject.__)('Upload') 18960 })] 18961 }), hadUploadError && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { 18962 children: (0,external_wp_i18n_namespaceObject.__)('Upload failed, try again.') 18963 })] 18964 }); 18965 } 18966 18967 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-panel/prepublish.js 18968 /** 18969 * WordPress dependencies 18970 */ 18971 18972 18973 18974 18975 18976 18977 18978 18979 /** 18980 * Internal dependencies 18981 */ 18982 18983 18984 18985 18986 18987 18988 18989 18990 18991 18992 18993 18994 function PostPublishPanelPrepublish({ 18995 children 18996 }) { 18997 const { 18998 isBeingScheduled, 18999 isRequestingSiteIcon, 19000 hasPublishAction, 19001 siteIconUrl, 19002 siteTitle, 19003 siteHome 19004 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 19005 var _getCurrentPost$_link; 19006 const { 19007 getCurrentPost, 19008 isEditedPostBeingScheduled 19009 } = select(store_store); 19010 const { 19011 getEntityRecord, 19012 isResolving 19013 } = select(external_wp_coreData_namespaceObject.store); 19014 const siteData = getEntityRecord('root', '__unstableBase', undefined) || {}; 19015 return { 19016 hasPublishAction: (_getCurrentPost$_link = getCurrentPost()._links?.['wp:action-publish']) !== null && _getCurrentPost$_link !== void 0 ? _getCurrentPost$_link : false, 19017 isBeingScheduled: isEditedPostBeingScheduled(), 19018 isRequestingSiteIcon: isResolving('getEntityRecord', ['root', '__unstableBase', undefined]), 19019 siteIconUrl: siteData.site_icon_url, 19020 siteTitle: siteData.name, 19021 siteHome: siteData.home && (0,external_wp_url_namespaceObject.filterURLForDisplay)(siteData.home) 19022 }; 19023 }, []); 19024 let siteIcon = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Icon, { 19025 className: "components-site-icon", 19026 size: "36px", 19027 icon: library_wordpress 19028 }); 19029 if (siteIconUrl) { 19030 siteIcon = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("img", { 19031 alt: (0,external_wp_i18n_namespaceObject.__)('Site Icon'), 19032 className: "components-site-icon", 19033 src: siteIconUrl 19034 }); 19035 } 19036 if (isRequestingSiteIcon) { 19037 siteIcon = null; 19038 } 19039 let prePublishTitle, prePublishBodyText; 19040 if (!hasPublishAction) { 19041 prePublishTitle = (0,external_wp_i18n_namespaceObject.__)('Are you ready to submit for review?'); 19042 prePublishBodyText = (0,external_wp_i18n_namespaceObject.__)('When you’re ready, submit your work for review, and an Editor will be able to approve it for you.'); 19043 } else if (isBeingScheduled) { 19044 prePublishTitle = (0,external_wp_i18n_namespaceObject.__)('Are you ready to schedule?'); 19045 prePublishBodyText = (0,external_wp_i18n_namespaceObject.__)('Your work will be published at the specified date and time.'); 19046 } else { 19047 prePublishTitle = (0,external_wp_i18n_namespaceObject.__)('Are you ready to publish?'); 19048 prePublishBodyText = (0,external_wp_i18n_namespaceObject.__)('Double-check your settings before publishing.'); 19049 } 19050 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 19051 className: "editor-post-publish-panel__prepublish", 19052 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 19053 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("strong", { 19054 children: prePublishTitle 19055 }) 19056 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { 19057 children: prePublishBodyText 19058 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 19059 className: "components-site-card", 19060 children: [siteIcon, /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 19061 className: "components-site-info", 19062 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 19063 className: "components-site-name", 19064 children: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(siteTitle) || (0,external_wp_i18n_namespaceObject.__)('(Untitled)') 19065 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 19066 className: "components-site-home", 19067 children: siteHome 19068 })] 19069 })] 19070 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(MaybeUploadMediaPanel, {}), hasPublishAction && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 19071 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelBody, { 19072 initialOpen: false, 19073 title: [(0,external_wp_i18n_namespaceObject.__)('Visibility:'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 19074 className: "editor-post-publish-panel__link", 19075 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostVisibilityLabel, {}) 19076 }, "label")], 19077 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostVisibility, {}) 19078 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelBody, { 19079 initialOpen: false, 19080 title: [(0,external_wp_i18n_namespaceObject.__)('Publish:'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 19081 className: "editor-post-publish-panel__link", 19082 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostScheduleLabel, {}) 19083 }, "label")], 19084 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostSchedule, {}) 19085 })] 19086 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostFormatPanel, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(maybe_tags_panel, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(maybe_category_panel, {}), children] 19087 }); 19088 } 19089 /* harmony default export */ const prepublish = (PostPublishPanelPrepublish); 19090 19091 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-panel/postpublish.js 19092 /** 19093 * WordPress dependencies 19094 */ 19095 19096 19097 19098 19099 19100 19101 19102 19103 19104 /** 19105 * Internal dependencies 19106 */ 19107 19108 19109 19110 19111 19112 const POSTNAME = '%postname%'; 19113 const PAGENAME = '%pagename%'; 19114 19115 /** 19116 * Returns URL for a future post. 19117 * 19118 * @param {Object} post Post object. 19119 * 19120 * @return {string} PostPublish URL. 19121 */ 19122 19123 const getFuturePostUrl = post => { 19124 const { 19125 slug 19126 } = post; 19127 if (post.permalink_template.includes(POSTNAME)) { 19128 return post.permalink_template.replace(POSTNAME, slug); 19129 } 19130 if (post.permalink_template.includes(PAGENAME)) { 19131 return post.permalink_template.replace(PAGENAME, slug); 19132 } 19133 return post.permalink_template; 19134 }; 19135 function postpublish_CopyButton({ 19136 text, 19137 onCopy, 19138 children 19139 }) { 19140 const ref = (0,external_wp_compose_namespaceObject.useCopyToClipboard)(text, onCopy); 19141 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 19142 __next40pxDefaultSize: true, 19143 variant: "secondary", 19144 ref: ref, 19145 children: children 19146 }); 19147 } 19148 class PostPublishPanelPostpublish extends external_wp_element_namespaceObject.Component { 19149 constructor() { 19150 super(...arguments); 19151 this.state = { 19152 showCopyConfirmation: false 19153 }; 19154 this.onCopy = this.onCopy.bind(this); 19155 this.onSelectInput = this.onSelectInput.bind(this); 19156 this.postLink = (0,external_wp_element_namespaceObject.createRef)(); 19157 } 19158 componentDidMount() { 19159 if (this.props.focusOnMount) { 19160 this.postLink.current.focus(); 19161 } 19162 } 19163 componentWillUnmount() { 19164 clearTimeout(this.dismissCopyConfirmation); 19165 } 19166 onCopy() { 19167 this.setState({ 19168 showCopyConfirmation: true 19169 }); 19170 clearTimeout(this.dismissCopyConfirmation); 19171 this.dismissCopyConfirmation = setTimeout(() => { 19172 this.setState({ 19173 showCopyConfirmation: false 19174 }); 19175 }, 4000); 19176 } 19177 onSelectInput(event) { 19178 event.target.select(); 19179 } 19180 render() { 19181 const { 19182 children, 19183 isScheduled, 19184 post, 19185 postType 19186 } = this.props; 19187 const postLabel = postType?.labels?.singular_name; 19188 const viewPostLabel = postType?.labels?.view_item; 19189 const addNewPostLabel = postType?.labels?.add_new_item; 19190 const link = post.status === 'future' ? getFuturePostUrl(post) : post.link; 19191 const addLink = (0,external_wp_url_namespaceObject.addQueryArgs)('post-new.php', { 19192 post_type: post.type 19193 }); 19194 const postPublishNonLinkHeader = isScheduled ? /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 19195 children: [(0,external_wp_i18n_namespaceObject.__)('is now scheduled. It will go live on'), ' ', /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostScheduleLabel, {}), "."] 19196 }) : (0,external_wp_i18n_namespaceObject.__)('is now live.'); 19197 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 19198 className: "post-publish-panel__postpublish", 19199 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.PanelBody, { 19200 className: "post-publish-panel__postpublish-header", 19201 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("a", { 19202 ref: this.postLink, 19203 href: link, 19204 children: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(post.title) || (0,external_wp_i18n_namespaceObject.__)('(no title)') 19205 }), ' ', postPublishNonLinkHeader] 19206 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.PanelBody, { 19207 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { 19208 className: "post-publish-panel__postpublish-subheader", 19209 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("strong", { 19210 children: (0,external_wp_i18n_namespaceObject.__)('What’s next?') 19211 }) 19212 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 19213 className: "post-publish-panel__postpublish-post-address-container", 19214 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.TextControl, { 19215 __next40pxDefaultSize: true, 19216 __nextHasNoMarginBottom: true, 19217 className: "post-publish-panel__postpublish-post-address", 19218 readOnly: true, 19219 label: (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: post type singular name */ 19220 (0,external_wp_i18n_namespaceObject.__)('%s address'), postLabel), 19221 value: (0,external_wp_url_namespaceObject.safeDecodeURIComponent)(link), 19222 onFocus: this.onSelectInput 19223 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 19224 className: "post-publish-panel__postpublish-post-address__copy-button-wrap", 19225 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(postpublish_CopyButton, { 19226 text: link, 19227 onCopy: this.onCopy, 19228 children: this.state.showCopyConfirmation ? (0,external_wp_i18n_namespaceObject.__)('Copied!') : (0,external_wp_i18n_namespaceObject.__)('Copy') 19229 }) 19230 })] 19231 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 19232 className: "post-publish-panel__postpublish-buttons", 19233 children: [!isScheduled && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 19234 variant: "primary", 19235 href: link, 19236 __next40pxDefaultSize: true, 19237 children: viewPostLabel 19238 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 19239 variant: isScheduled ? 'primary' : 'secondary', 19240 __next40pxDefaultSize: true, 19241 href: addLink, 19242 children: addNewPostLabel 19243 })] 19244 })] 19245 }), children] 19246 }); 19247 } 19248 } 19249 /* harmony default export */ const postpublish = ((0,external_wp_data_namespaceObject.withSelect)(select => { 19250 const { 19251 getEditedPostAttribute, 19252 getCurrentPost, 19253 isCurrentPostScheduled 19254 } = select(store_store); 19255 const { 19256 getPostType 19257 } = select(external_wp_coreData_namespaceObject.store); 19258 return { 19259 post: getCurrentPost(), 19260 postType: getPostType(getEditedPostAttribute('type')), 19261 isScheduled: isCurrentPostScheduled() 19262 }; 19263 })(PostPublishPanelPostpublish)); 19264 19265 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-panel/index.js 19266 /** 19267 * WordPress dependencies 19268 */ 19269 19270 19271 19272 19273 19274 19275 19276 19277 /** 19278 * Internal dependencies 19279 */ 19280 19281 19282 19283 19284 19285 19286 19287 class PostPublishPanel extends external_wp_element_namespaceObject.Component { 19288 constructor() { 19289 super(...arguments); 19290 this.onSubmit = this.onSubmit.bind(this); 19291 this.cancelButtonNode = (0,external_wp_element_namespaceObject.createRef)(); 19292 } 19293 componentDidMount() { 19294 // This timeout is necessary to make sure the `useEffect` hook of 19295 // `useFocusReturn` gets the correct element (the button that opens the 19296 // PostPublishPanel) otherwise it will get this button. 19297 this.timeoutID = setTimeout(() => { 19298 this.cancelButtonNode.current.focus(); 19299 }, 0); 19300 } 19301 componentWillUnmount() { 19302 clearTimeout(this.timeoutID); 19303 } 19304 componentDidUpdate(prevProps) { 19305 // Automatically collapse the publish sidebar when a post 19306 // is published and the user makes an edit. 19307 if (prevProps.isPublished && !this.props.isSaving && this.props.isDirty) { 19308 this.props.onClose(); 19309 } 19310 } 19311 onSubmit() { 19312 const { 19313 onClose, 19314 hasPublishAction, 19315 isPostTypeViewable 19316 } = this.props; 19317 if (!hasPublishAction || !isPostTypeViewable) { 19318 onClose(); 19319 } 19320 } 19321 render() { 19322 const { 19323 forceIsDirty, 19324 isBeingScheduled, 19325 isPublished, 19326 isPublishSidebarEnabled, 19327 isScheduled, 19328 isSaving, 19329 isSavingNonPostEntityChanges, 19330 onClose, 19331 onTogglePublishSidebar, 19332 PostPublishExtension, 19333 PrePublishExtension, 19334 ...additionalProps 19335 } = this.props; 19336 const { 19337 hasPublishAction, 19338 isDirty, 19339 isPostTypeViewable, 19340 ...propsForPanel 19341 } = additionalProps; 19342 const isPublishedOrScheduled = isPublished || isScheduled && isBeingScheduled; 19343 const isPrePublish = !isPublishedOrScheduled && !isSaving; 19344 const isPostPublish = isPublishedOrScheduled && !isSaving; 19345 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 19346 className: "editor-post-publish-panel", 19347 ...propsForPanel, 19348 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 19349 className: "editor-post-publish-panel__header", 19350 children: isPostPublish ? /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 19351 size: "compact", 19352 onClick: onClose, 19353 icon: close_small, 19354 label: (0,external_wp_i18n_namespaceObject.__)('Close panel') 19355 }) : /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 19356 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 19357 className: "editor-post-publish-panel__header-cancel-button", 19358 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 19359 ref: this.cancelButtonNode, 19360 accessibleWhenDisabled: true, 19361 disabled: isSavingNonPostEntityChanges, 19362 onClick: onClose, 19363 variant: "secondary", 19364 size: "compact", 19365 children: (0,external_wp_i18n_namespaceObject.__)('Cancel') 19366 }) 19367 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 19368 className: "editor-post-publish-panel__header-publish-button", 19369 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_publish_button, { 19370 onSubmit: this.onSubmit, 19371 forceIsDirty: forceIsDirty 19372 }) 19373 })] 19374 }) 19375 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 19376 className: "editor-post-publish-panel__content", 19377 children: [isPrePublish && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(prepublish, { 19378 children: PrePublishExtension && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PrePublishExtension, {}) 19379 }), isPostPublish && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(postpublish, { 19380 focusOnMount: true, 19381 children: PostPublishExtension && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostPublishExtension, {}) 19382 }), isSaving && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Spinner, {})] 19383 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 19384 className: "editor-post-publish-panel__footer", 19385 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.CheckboxControl, { 19386 __nextHasNoMarginBottom: true, 19387 label: (0,external_wp_i18n_namespaceObject.__)('Always show pre-publish checks.'), 19388 checked: isPublishSidebarEnabled, 19389 onChange: onTogglePublishSidebar 19390 }) 19391 })] 19392 }); 19393 } 19394 } 19395 19396 /** 19397 * Renders a panel for publishing a post. 19398 */ 19399 /* harmony default export */ const post_publish_panel = ((0,external_wp_compose_namespaceObject.compose)([(0,external_wp_data_namespaceObject.withSelect)(select => { 19400 var _getCurrentPost$_link; 19401 const { 19402 getPostType 19403 } = select(external_wp_coreData_namespaceObject.store); 19404 const { 19405 getCurrentPost, 19406 getEditedPostAttribute, 19407 isCurrentPostPublished, 19408 isCurrentPostScheduled, 19409 isEditedPostBeingScheduled, 19410 isEditedPostDirty, 19411 isAutosavingPost, 19412 isSavingPost, 19413 isSavingNonPostEntityChanges 19414 } = select(store_store); 19415 const { 19416 isPublishSidebarEnabled 19417 } = select(store_store); 19418 const postType = getPostType(getEditedPostAttribute('type')); 19419 return { 19420 hasPublishAction: (_getCurrentPost$_link = getCurrentPost()._links?.['wp:action-publish']) !== null && _getCurrentPost$_link !== void 0 ? _getCurrentPost$_link : false, 19421 isPostTypeViewable: postType?.viewable, 19422 isBeingScheduled: isEditedPostBeingScheduled(), 19423 isDirty: isEditedPostDirty(), 19424 isPublished: isCurrentPostPublished(), 19425 isPublishSidebarEnabled: isPublishSidebarEnabled(), 19426 isSaving: isSavingPost() && !isAutosavingPost(), 19427 isSavingNonPostEntityChanges: isSavingNonPostEntityChanges(), 19428 isScheduled: isCurrentPostScheduled() 19429 }; 19430 }), (0,external_wp_data_namespaceObject.withDispatch)((dispatch, { 19431 isPublishSidebarEnabled 19432 }) => { 19433 const { 19434 disablePublishSidebar, 19435 enablePublishSidebar 19436 } = dispatch(store_store); 19437 return { 19438 onTogglePublishSidebar: () => { 19439 if (isPublishSidebarEnabled) { 19440 disablePublishSidebar(); 19441 } else { 19442 enablePublishSidebar(); 19443 } 19444 } 19445 }; 19446 }), external_wp_components_namespaceObject.withFocusReturn, external_wp_components_namespaceObject.withConstrainedTabbing])(PostPublishPanel)); 19447 19448 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/cloud-upload.js 19449 /** 19450 * WordPress dependencies 19451 */ 19452 19453 19454 const cloudUpload = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 19455 xmlns: "http://www.w3.org/2000/svg", 19456 viewBox: "0 0 24 24", 19457 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 19458 d: "M17.3 10.1c0-2.5-2.1-4.4-4.8-4.4-2.2 0-4.1 1.4-4.6 3.3h-.2C5.7 9 4 10.7 4 12.8c0 2.1 1.7 3.8 3.7 3.8h9c1.8 0 3.2-1.5 3.2-3.3.1-1.6-1.1-2.9-2.6-3.2zm-.5 5.1h-4v-2.4L14 14l1-1-3-3-3 3 1 1 1.2-1.2v2.4H7.7c-1.2 0-2.2-1.1-2.2-2.3s1-2.4 2.2-2.4H9l.3-1.1c.4-1.3 1.7-2.2 3.2-2.2 1.8 0 3.3 1.3 3.3 2.9v1.3l1.3.2c.8.1 1.4.9 1.4 1.8 0 1-.8 1.8-1.7 1.8z" 19459 }) 19460 }); 19461 /* harmony default export */ const cloud_upload = (cloudUpload); 19462 19463 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/icon/index.js 19464 /** 19465 * WordPress dependencies 19466 */ 19467 19468 19469 /** @typedef {{icon: JSX.Element, size?: number} & import('@wordpress/primitives').SVGProps} IconProps */ 19470 19471 /** 19472 * Return an SVG icon. 19473 * 19474 * @param {IconProps} props icon is the SVG component to render 19475 * size is a number specifiying the icon size in pixels 19476 * Other props will be passed to wrapped SVG component 19477 * @param {import('react').ForwardedRef<HTMLElement>} ref The forwarded ref to the SVG element. 19478 * 19479 * @return {JSX.Element} Icon component 19480 */ 19481 function Icon({ 19482 icon, 19483 size = 24, 19484 ...props 19485 }, ref) { 19486 return (0,external_wp_element_namespaceObject.cloneElement)(icon, { 19487 width: size, 19488 height: size, 19489 ...props, 19490 ref 19491 }); 19492 } 19493 /* harmony default export */ const icon = ((0,external_wp_element_namespaceObject.forwardRef)(Icon)); 19494 19495 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/cloud.js 19496 /** 19497 * WordPress dependencies 19498 */ 19499 19500 19501 const cloud = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 19502 xmlns: "http://www.w3.org/2000/svg", 19503 viewBox: "0 0 24 24", 19504 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 19505 d: "M17.3 10.1c0-2.5-2.1-4.4-4.8-4.4-2.2 0-4.1 1.4-4.6 3.3h-.2C5.7 9 4 10.7 4 12.8c0 2.1 1.7 3.8 3.7 3.8h9c1.8 0 3.2-1.5 3.2-3.3.1-1.6-1.1-2.9-2.6-3.2zm-.5 5.1h-9c-1.2 0-2.2-1.1-2.2-2.3s1-2.4 2.2-2.4h1.3l.3-1.1c.4-1.3 1.7-2.2 3.2-2.2 1.8 0 3.3 1.3 3.3 2.9v1.3l1.3.2c.8.1 1.4.9 1.4 1.8-.1 1-.9 1.8-1.8 1.8z" 19506 }) 19507 }); 19508 /* harmony default export */ const library_cloud = (cloud); 19509 19510 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/drafts.js 19511 /** 19512 * WordPress dependencies 19513 */ 19514 19515 19516 const drafts = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 19517 xmlns: "http://www.w3.org/2000/svg", 19518 viewBox: "0 0 24 24", 19519 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 19520 fillRule: "evenodd", 19521 clipRule: "evenodd", 19522 d: "M12 18.5a6.5 6.5 0 1 1 0-13 6.5 6.5 0 0 1 0 13ZM4 12a8 8 0 1 1 16 0 8 8 0 0 1-16 0Zm8 4a4 4 0 0 0 4-4H8a4 4 0 0 0 4 4Z" 19523 }) 19524 }); 19525 /* harmony default export */ const library_drafts = (drafts); 19526 19527 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/pending.js 19528 /** 19529 * WordPress dependencies 19530 */ 19531 19532 19533 const pending = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 19534 xmlns: "http://www.w3.org/2000/svg", 19535 viewBox: "0 0 24 24", 19536 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 19537 fillRule: "evenodd", 19538 clipRule: "evenodd", 19539 d: "M12 18.5a6.5 6.5 0 1 1 0-13 6.5 6.5 0 0 1 0 13ZM4 12a8 8 0 1 1 16 0 8 8 0 0 1-16 0Zm8 4a4 4 0 0 1-4-4h4V8a4 4 0 0 1 0 8Z" 19540 }) 19541 }); 19542 /* harmony default export */ const library_pending = (pending); 19543 19544 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/not-allowed.js 19545 /** 19546 * WordPress dependencies 19547 */ 19548 19549 19550 const notAllowed = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 19551 xmlns: "http://www.w3.org/2000/svg", 19552 viewBox: "0 0 24 24", 19553 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 19554 fillRule: "evenodd", 19555 clipRule: "evenodd", 19556 d: "M12 18.5A6.5 6.5 0 0 1 6.93 7.931l9.139 9.138A6.473 6.473 0 0 1 12 18.5Zm5.123-2.498a6.5 6.5 0 0 0-9.124-9.124l9.124 9.124ZM4 12a8 8 0 1 1 16 0 8 8 0 0 1-16 0Z" 19557 }) 19558 }); 19559 /* harmony default export */ const not_allowed = (notAllowed); 19560 19561 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/scheduled.js 19562 /** 19563 * WordPress dependencies 19564 */ 19565 19566 19567 const scheduled = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 19568 xmlns: "http://www.w3.org/2000/svg", 19569 viewBox: "0 0 24 24", 19570 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 19571 fillRule: "evenodd", 19572 clipRule: "evenodd", 19573 d: "M12 18.5a6.5 6.5 0 1 1 0-13 6.5 6.5 0 0 1 0 13ZM4 12a8 8 0 1 1 16 0 8 8 0 0 1-16 0Zm9 1V8h-1.5v3.5h-2V13H13Z" 19574 }) 19575 }); 19576 /* harmony default export */ const library_scheduled = (scheduled); 19577 19578 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/published.js 19579 /** 19580 * WordPress dependencies 19581 */ 19582 19583 19584 const published = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 19585 xmlns: "http://www.w3.org/2000/svg", 19586 viewBox: "0 0 24 24", 19587 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 19588 fillRule: "evenodd", 19589 clipRule: "evenodd", 19590 d: "M12 18.5a6.5 6.5 0 1 1 0-13 6.5 6.5 0 0 1 0 13ZM4 12a8 8 0 1 1 16 0 8 8 0 0 1-16 0Zm11.53-1.47-1.06-1.06L11 12.94l-1.47-1.47-1.06 1.06L11 15.06l4.53-4.53Z" 19591 }) 19592 }); 19593 /* harmony default export */ const library_published = (published); 19594 19595 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-sticky/check.js 19596 /** 19597 * WordPress dependencies 19598 */ 19599 19600 19601 /** 19602 * Internal dependencies 19603 */ 19604 19605 19606 /** 19607 * Wrapper component that renders its children only if post has a sticky action. 19608 * 19609 * @param {Object} props Props. 19610 * @param {Element} props.children Children to be rendered. 19611 * 19612 * @return {Component} The component to be rendered or null if post type is not 'post' or hasStickyAction is false. 19613 */ 19614 function PostStickyCheck({ 19615 children 19616 }) { 19617 const { 19618 hasStickyAction, 19619 postType 19620 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 19621 var _post$_links$wpActio; 19622 const post = select(store_store).getCurrentPost(); 19623 return { 19624 hasStickyAction: (_post$_links$wpActio = post._links?.['wp:action-sticky']) !== null && _post$_links$wpActio !== void 0 ? _post$_links$wpActio : false, 19625 postType: select(store_store).getCurrentPostType() 19626 }; 19627 }, []); 19628 if (postType !== 'post' || !hasStickyAction) { 19629 return null; 19630 } 19631 return children; 19632 } 19633 19634 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-sticky/index.js 19635 /** 19636 * WordPress dependencies 19637 */ 19638 19639 19640 19641 19642 /** 19643 * Internal dependencies 19644 */ 19645 19646 19647 19648 /** 19649 * Renders the PostSticky component. It provides a checkbox control for the sticky post feature. 19650 * 19651 * @return {Component} The component to be rendered. 19652 */ 19653 19654 function PostSticky() { 19655 const postSticky = (0,external_wp_data_namespaceObject.useSelect)(select => { 19656 var _select$getEditedPost; 19657 return (_select$getEditedPost = select(store_store).getEditedPostAttribute('sticky')) !== null && _select$getEditedPost !== void 0 ? _select$getEditedPost : false; 19658 }, []); 19659 const { 19660 editPost 19661 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 19662 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostStickyCheck, { 19663 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.CheckboxControl, { 19664 className: "editor-post-sticky__checkbox-control", 19665 label: (0,external_wp_i18n_namespaceObject.__)('Sticky'), 19666 help: (0,external_wp_i18n_namespaceObject.__)('Pin this post to the top of the blog'), 19667 checked: postSticky, 19668 onChange: () => editPost({ 19669 sticky: !postSticky 19670 }), 19671 __nextHasNoMarginBottom: true 19672 }) 19673 }); 19674 } 19675 19676 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-status/index.js 19677 /** 19678 * WordPress dependencies 19679 */ 19680 19681 19682 19683 19684 19685 19686 19687 19688 19689 /** 19690 * Internal dependencies 19691 */ 19692 19693 19694 19695 19696 19697 19698 19699 19700 const postStatusesInfo = { 19701 'auto-draft': { 19702 label: (0,external_wp_i18n_namespaceObject.__)('Draft'), 19703 icon: library_drafts 19704 }, 19705 draft: { 19706 label: (0,external_wp_i18n_namespaceObject.__)('Draft'), 19707 icon: library_drafts 19708 }, 19709 pending: { 19710 label: (0,external_wp_i18n_namespaceObject.__)('Pending'), 19711 icon: library_pending 19712 }, 19713 private: { 19714 label: (0,external_wp_i18n_namespaceObject.__)('Private'), 19715 icon: not_allowed 19716 }, 19717 future: { 19718 label: (0,external_wp_i18n_namespaceObject.__)('Scheduled'), 19719 icon: library_scheduled 19720 }, 19721 publish: { 19722 label: (0,external_wp_i18n_namespaceObject.__)('Published'), 19723 icon: library_published 19724 } 19725 }; 19726 const STATUS_OPTIONS = [{ 19727 label: (0,external_wp_i18n_namespaceObject.__)('Draft'), 19728 value: 'draft', 19729 description: (0,external_wp_i18n_namespaceObject.__)('Not ready to publish.') 19730 }, { 19731 label: (0,external_wp_i18n_namespaceObject.__)('Pending'), 19732 value: 'pending', 19733 description: (0,external_wp_i18n_namespaceObject.__)('Waiting for review before publishing.') 19734 }, { 19735 label: (0,external_wp_i18n_namespaceObject.__)('Private'), 19736 value: 'private', 19737 description: (0,external_wp_i18n_namespaceObject.__)('Only visible to site admins and editors.') 19738 }, { 19739 label: (0,external_wp_i18n_namespaceObject.__)('Scheduled'), 19740 value: 'future', 19741 description: (0,external_wp_i18n_namespaceObject.__)('Publish automatically on a chosen date.') 19742 }, { 19743 label: (0,external_wp_i18n_namespaceObject.__)('Published'), 19744 value: 'publish', 19745 description: (0,external_wp_i18n_namespaceObject.__)('Visible to everyone.') 19746 }]; 19747 const DESIGN_POST_TYPES = [TEMPLATE_POST_TYPE, TEMPLATE_PART_POST_TYPE, PATTERN_POST_TYPE, NAVIGATION_POST_TYPE]; 19748 function PostStatus() { 19749 const { 19750 status, 19751 date, 19752 password, 19753 postId, 19754 postType, 19755 canEdit 19756 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 19757 var _getCurrentPost$_link; 19758 const { 19759 getEditedPostAttribute, 19760 getCurrentPostId, 19761 getCurrentPostType, 19762 getCurrentPost 19763 } = select(store_store); 19764 return { 19765 status: getEditedPostAttribute('status'), 19766 date: getEditedPostAttribute('date'), 19767 password: getEditedPostAttribute('password'), 19768 postId: getCurrentPostId(), 19769 postType: getCurrentPostType(), 19770 canEdit: (_getCurrentPost$_link = getCurrentPost()._links?.['wp:action-publish']) !== null && _getCurrentPost$_link !== void 0 ? _getCurrentPost$_link : false 19771 }; 19772 }, []); 19773 const [showPassword, setShowPassword] = (0,external_wp_element_namespaceObject.useState)(!!password); 19774 const passwordInputId = (0,external_wp_compose_namespaceObject.useInstanceId)(PostStatus, 'editor-change-status__password-input'); 19775 const { 19776 editEntityRecord 19777 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); 19778 const [popoverAnchor, setPopoverAnchor] = (0,external_wp_element_namespaceObject.useState)(null); 19779 // Memoize popoverProps to avoid returning a new object every time. 19780 const popoverProps = (0,external_wp_element_namespaceObject.useMemo)(() => ({ 19781 // Anchor the popover to the middle of the entire row so that it doesn't 19782 // move around when the label changes. 19783 anchor: popoverAnchor, 19784 'aria-label': (0,external_wp_i18n_namespaceObject.__)('Status & visibility'), 19785 headerTitle: (0,external_wp_i18n_namespaceObject.__)('Status & visibility'), 19786 placement: 'left-start', 19787 offset: 36, 19788 shift: true 19789 }), [popoverAnchor]); 19790 if (DESIGN_POST_TYPES.includes(postType)) { 19791 return null; 19792 } 19793 const updatePost = ({ 19794 status: newStatus = status, 19795 password: newPassword = password, 19796 date: newDate = date 19797 }) => { 19798 editEntityRecord('postType', postType, postId, { 19799 status: newStatus, 19800 date: newDate, 19801 password: newPassword 19802 }); 19803 }; 19804 const handleTogglePassword = value => { 19805 setShowPassword(value); 19806 if (!value) { 19807 updatePost({ 19808 password: '' 19809 }); 19810 } 19811 }; 19812 const handleStatus = value => { 19813 let newDate = date; 19814 let newPassword = password; 19815 if (status === 'future' && new Date(date) > new Date()) { 19816 newDate = null; 19817 } 19818 if (value === 'private' && password) { 19819 newPassword = ''; 19820 } 19821 updatePost({ 19822 status: value, 19823 date: newDate, 19824 password: newPassword 19825 }); 19826 }; 19827 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { 19828 label: (0,external_wp_i18n_namespaceObject.__)('Status'), 19829 ref: setPopoverAnchor, 19830 children: canEdit ? /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Dropdown, { 19831 className: "editor-post-status", 19832 contentClassName: "editor-change-status__content", 19833 popoverProps: popoverProps, 19834 focusOnMount: true, 19835 renderToggle: ({ 19836 onToggle, 19837 isOpen 19838 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 19839 className: "editor-post-status__toggle", 19840 variant: "tertiary", 19841 size: "compact", 19842 onClick: onToggle, 19843 icon: postStatusesInfo[status]?.icon, 19844 "aria-label": (0,external_wp_i18n_namespaceObject.sprintf)( 19845 // translators: %s: Current post status. 19846 (0,external_wp_i18n_namespaceObject.__)('Change status: %s'), postStatusesInfo[status]?.label), 19847 "aria-expanded": isOpen, 19848 children: postStatusesInfo[status]?.label 19849 }), 19850 renderContent: ({ 19851 onClose 19852 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 19853 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalInspectorPopoverHeader, { 19854 title: (0,external_wp_i18n_namespaceObject.__)('Status & visibility'), 19855 onClose: onClose 19856 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("form", { 19857 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { 19858 spacing: 4, 19859 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.RadioControl, { 19860 className: "editor-change-status__options", 19861 hideLabelFromVision: true, 19862 label: (0,external_wp_i18n_namespaceObject.__)('Status'), 19863 options: STATUS_OPTIONS, 19864 onChange: handleStatus, 19865 selected: status === 'auto-draft' ? 'draft' : status 19866 }), status === 'future' && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 19867 className: "editor-change-status__publish-date-wrapper", 19868 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PrivatePostSchedule, { 19869 showPopoverHeaderActions: false, 19870 isCompact: true 19871 }) 19872 }), status !== 'private' && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { 19873 as: "fieldset", 19874 spacing: 4, 19875 className: "editor-change-status__password-fieldset", 19876 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.CheckboxControl, { 19877 __nextHasNoMarginBottom: true, 19878 label: (0,external_wp_i18n_namespaceObject.__)('Password protected'), 19879 help: (0,external_wp_i18n_namespaceObject.__)('Only visible to those who know the password'), 19880 checked: showPassword, 19881 onChange: handleTogglePassword 19882 }), showPassword && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 19883 className: "editor-change-status__password-input", 19884 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.TextControl, { 19885 label: (0,external_wp_i18n_namespaceObject.__)('Password'), 19886 onChange: value => updatePost({ 19887 password: value 19888 }), 19889 value: password, 19890 placeholder: (0,external_wp_i18n_namespaceObject.__)('Use a secure password'), 19891 type: "text", 19892 id: passwordInputId, 19893 __next40pxDefaultSize: true, 19894 __nextHasNoMarginBottom: true, 19895 maxLength: 255 19896 }) 19897 })] 19898 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostSticky, {})] 19899 }) 19900 })] 19901 }) 19902 }) : /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 19903 className: "editor-post-status is-read-only", 19904 children: postStatusesInfo[status]?.label 19905 }) 19906 }); 19907 } 19908 19909 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-saved-state/index.js 19910 /** 19911 * External dependencies 19912 */ 19913 19914 19915 /** 19916 * WordPress dependencies 19917 */ 19918 19919 19920 19921 19922 19923 19924 19925 19926 19927 /** 19928 * Internal dependencies 19929 */ 19930 19931 19932 19933 /** 19934 * Component showing whether the post is saved or not and providing save 19935 * buttons. 19936 * 19937 * @param {Object} props Component props. 19938 * @param {?boolean} props.forceIsDirty Whether to force the post to be marked 19939 * as dirty. 19940 * @return {import('react').ComponentType} The component. 19941 */ 19942 19943 19944 function PostSavedState({ 19945 forceIsDirty 19946 }) { 19947 const [forceSavedMessage, setForceSavedMessage] = (0,external_wp_element_namespaceObject.useState)(false); 19948 const isLargeViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('small'); 19949 const { 19950 isAutosaving, 19951 isDirty, 19952 isNew, 19953 isPublished, 19954 isSaveable, 19955 isSaving, 19956 isScheduled, 19957 hasPublishAction, 19958 showIconLabels, 19959 postStatus, 19960 postStatusHasChanged 19961 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 19962 var _getCurrentPost$_link; 19963 const { 19964 isEditedPostNew, 19965 isCurrentPostPublished, 19966 isCurrentPostScheduled, 19967 isEditedPostDirty, 19968 isSavingPost, 19969 isEditedPostSaveable, 19970 getCurrentPost, 19971 isAutosavingPost, 19972 getEditedPostAttribute, 19973 getPostEdits 19974 } = select(store_store); 19975 const { 19976 get 19977 } = select(external_wp_preferences_namespaceObject.store); 19978 return { 19979 isAutosaving: isAutosavingPost(), 19980 isDirty: forceIsDirty || isEditedPostDirty(), 19981 isNew: isEditedPostNew(), 19982 isPublished: isCurrentPostPublished(), 19983 isSaving: isSavingPost(), 19984 isSaveable: isEditedPostSaveable(), 19985 isScheduled: isCurrentPostScheduled(), 19986 hasPublishAction: (_getCurrentPost$_link = getCurrentPost()?._links?.['wp:action-publish']) !== null && _getCurrentPost$_link !== void 0 ? _getCurrentPost$_link : false, 19987 showIconLabels: get('core', 'showIconLabels'), 19988 postStatus: getEditedPostAttribute('status'), 19989 postStatusHasChanged: !!getPostEdits()?.status 19990 }; 19991 }, [forceIsDirty]); 19992 const isPending = postStatus === 'pending'; 19993 const { 19994 savePost 19995 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 19996 const wasSaving = (0,external_wp_compose_namespaceObject.usePrevious)(isSaving); 19997 (0,external_wp_element_namespaceObject.useEffect)(() => { 19998 let timeoutId; 19999 if (wasSaving && !isSaving) { 20000 setForceSavedMessage(true); 20001 timeoutId = setTimeout(() => { 20002 setForceSavedMessage(false); 20003 }, 1000); 20004 } 20005 return () => clearTimeout(timeoutId); 20006 }, [isSaving]); 20007 20008 // Once the post has been submitted for review this button 20009 // is not needed for the contributor role. 20010 if (!hasPublishAction && isPending) { 20011 return null; 20012 } 20013 20014 // We shouldn't render the button if the post has not one of the following statuses: pending, draft, auto-draft. 20015 // The reason for this is that this button handles the `save as pending` and `save draft` actions. 20016 // An exception for this is when the post has a custom status and there should be a way to save changes without 20017 // having to publish. This should be handled better in the future when custom statuses have better support. 20018 // @see https://github.com/WordPress/gutenberg/issues/3144. 20019 const isIneligibleStatus = !['pending', 'draft', 'auto-draft'].includes(postStatus) && STATUS_OPTIONS.map(({ 20020 value 20021 }) => value).includes(postStatus); 20022 if (isPublished || isScheduled || isIneligibleStatus || postStatusHasChanged && ['pending', 'draft'].includes(postStatus)) { 20023 return null; 20024 } 20025 20026 /* translators: button label text should, if possible, be under 16 characters. */ 20027 const label = isPending ? (0,external_wp_i18n_namespaceObject.__)('Save as pending') : (0,external_wp_i18n_namespaceObject.__)('Save draft'); 20028 20029 /* translators: button label text should, if possible, be under 16 characters. */ 20030 const shortLabel = (0,external_wp_i18n_namespaceObject.__)('Save'); 20031 const isSaved = forceSavedMessage || !isNew && !isDirty; 20032 const isSavedState = isSaving || isSaved; 20033 const isDisabled = isSaving || isSaved || !isSaveable; 20034 let text; 20035 if (isSaving) { 20036 text = isAutosaving ? (0,external_wp_i18n_namespaceObject.__)('Autosaving') : (0,external_wp_i18n_namespaceObject.__)('Saving'); 20037 } else if (isSaved) { 20038 text = (0,external_wp_i18n_namespaceObject.__)('Saved'); 20039 } else if (isLargeViewport) { 20040 text = label; 20041 } else if (showIconLabels) { 20042 text = shortLabel; 20043 } 20044 20045 // Use common Button instance for all saved states so that focus is not 20046 // lost. 20047 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.Button, { 20048 className: isSaveable || isSaving ? dist_clsx({ 20049 'editor-post-save-draft': !isSavedState, 20050 'editor-post-saved-state': isSavedState, 20051 'is-saving': isSaving, 20052 'is-autosaving': isAutosaving, 20053 'is-saved': isSaved, 20054 [(0,external_wp_components_namespaceObject.__unstableGetAnimateClassName)({ 20055 type: 'loading' 20056 })]: isSaving 20057 }) : undefined, 20058 onClick: isDisabled ? undefined : () => savePost() 20059 /* 20060 * We want the tooltip to show the keyboard shortcut only when the 20061 * button does something, i.e. when it's not disabled. 20062 */, 20063 shortcut: isDisabled ? undefined : external_wp_keycodes_namespaceObject.displayShortcut.primary('s'), 20064 variant: "tertiary", 20065 size: "compact", 20066 icon: isLargeViewport ? undefined : cloud_upload, 20067 label: text || label, 20068 "aria-disabled": isDisabled, 20069 children: [isSavedState && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(icon, { 20070 icon: isSaved ? library_check : library_cloud 20071 }), text] 20072 }); 20073 } 20074 20075 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-schedule/check.js 20076 /** 20077 * WordPress dependencies 20078 */ 20079 20080 20081 /** 20082 * Internal dependencies 20083 */ 20084 20085 20086 /** 20087 * Wrapper component that renders its children only if post has a publish action. 20088 * 20089 * @param {Object} props Props. 20090 * @param {Element} props.children Children to be rendered. 20091 * 20092 * @return {Component} - The component to be rendered or null if there is no publish action. 20093 */ 20094 function PostScheduleCheck({ 20095 children 20096 }) { 20097 const hasPublishAction = (0,external_wp_data_namespaceObject.useSelect)(select => { 20098 var _select$getCurrentPos; 20099 return (_select$getCurrentPos = select(store_store).getCurrentPost()._links?.['wp:action-publish']) !== null && _select$getCurrentPos !== void 0 ? _select$getCurrentPos : false; 20100 }, []); 20101 if (!hasPublishAction) { 20102 return null; 20103 } 20104 return children; 20105 } 20106 20107 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-schedule/panel.js 20108 /** 20109 * WordPress dependencies 20110 */ 20111 20112 20113 20114 20115 20116 /** 20117 * Internal dependencies 20118 */ 20119 20120 20121 20122 20123 20124 20125 20126 const panel_DESIGN_POST_TYPES = [TEMPLATE_POST_TYPE, TEMPLATE_PART_POST_TYPE, PATTERN_POST_TYPE, NAVIGATION_POST_TYPE]; 20127 20128 /** 20129 * Renders the Post Schedule Panel component. 20130 * 20131 * @return {Component} The component to be rendered. 20132 */ 20133 function PostSchedulePanel() { 20134 const [popoverAnchor, setPopoverAnchor] = (0,external_wp_element_namespaceObject.useState)(null); 20135 const postType = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getCurrentPostType(), []); 20136 // Memoize popoverProps to avoid returning a new object every time. 20137 const popoverProps = (0,external_wp_element_namespaceObject.useMemo)(() => ({ 20138 // Anchor the popover to the middle of the entire row so that it doesn't 20139 // move around when the label changes. 20140 anchor: popoverAnchor, 20141 'aria-label': (0,external_wp_i18n_namespaceObject.__)('Change publish date'), 20142 placement: 'left-start', 20143 offset: 36, 20144 shift: true 20145 }), [popoverAnchor]); 20146 const label = usePostScheduleLabel(); 20147 const fullLabel = usePostScheduleLabel({ 20148 full: true 20149 }); 20150 if (panel_DESIGN_POST_TYPES.includes(postType)) { 20151 return null; 20152 } 20153 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostScheduleCheck, { 20154 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { 20155 label: (0,external_wp_i18n_namespaceObject.__)('Publish'), 20156 ref: setPopoverAnchor, 20157 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Dropdown, { 20158 popoverProps: popoverProps, 20159 focusOnMount: true, 20160 className: "editor-post-schedule__panel-dropdown", 20161 contentClassName: "editor-post-schedule__dialog", 20162 renderToggle: ({ 20163 onToggle, 20164 isOpen 20165 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 20166 size: "compact", 20167 className: "editor-post-schedule__dialog-toggle", 20168 variant: "tertiary", 20169 tooltipPosition: "middle left", 20170 onClick: onToggle, 20171 "aria-label": (0,external_wp_i18n_namespaceObject.sprintf)( 20172 // translators: %s: Current post date. 20173 (0,external_wp_i18n_namespaceObject.__)('Change date: %s'), label), 20174 label: fullLabel, 20175 showTooltip: label !== fullLabel, 20176 "aria-expanded": isOpen, 20177 children: label 20178 }), 20179 renderContent: ({ 20180 onClose 20181 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostSchedule, { 20182 onClose: onClose 20183 }) 20184 }) 20185 }) 20186 }); 20187 } 20188 20189 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-slug/check.js 20190 /** 20191 * Internal dependencies 20192 */ 20193 20194 20195 /** 20196 * Wrapper component that renders its children only if the post type supports the slug. 20197 * 20198 * @param {Object} props Props. 20199 * @param {Element} props.children Children to be rendered. 20200 * 20201 * @return {Component} The component to be rendered. 20202 */ 20203 20204 function PostSlugCheck({ 20205 children 20206 }) { 20207 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_type_support_check, { 20208 supportKeys: "slug", 20209 children: children 20210 }); 20211 } 20212 20213 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-slug/index.js 20214 /** 20215 * WordPress dependencies 20216 */ 20217 20218 20219 20220 20221 20222 20223 /** 20224 * Internal dependencies 20225 */ 20226 20227 20228 20229 function PostSlugControl() { 20230 const postSlug = (0,external_wp_data_namespaceObject.useSelect)(select => { 20231 return (0,external_wp_url_namespaceObject.safeDecodeURIComponent)(select(store_store).getEditedPostSlug()); 20232 }, []); 20233 const { 20234 editPost 20235 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 20236 const [forceEmptyField, setForceEmptyField] = (0,external_wp_element_namespaceObject.useState)(false); 20237 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.TextControl, { 20238 __next40pxDefaultSize: true, 20239 __nextHasNoMarginBottom: true, 20240 label: (0,external_wp_i18n_namespaceObject.__)('Slug'), 20241 autoComplete: "off", 20242 spellCheck: "false", 20243 value: forceEmptyField ? '' : postSlug, 20244 onChange: newValue => { 20245 editPost({ 20246 slug: newValue 20247 }); 20248 // When we delete the field the permalink gets 20249 // reverted to the original value. 20250 // The forceEmptyField logic allows the user to have 20251 // the field temporarily empty while typing. 20252 if (!newValue) { 20253 if (!forceEmptyField) { 20254 setForceEmptyField(true); 20255 } 20256 return; 20257 } 20258 if (forceEmptyField) { 20259 setForceEmptyField(false); 20260 } 20261 }, 20262 onBlur: event => { 20263 editPost({ 20264 slug: (0,external_wp_url_namespaceObject.cleanForSlug)(event.target.value) 20265 }); 20266 if (forceEmptyField) { 20267 setForceEmptyField(false); 20268 } 20269 }, 20270 className: "editor-post-slug" 20271 }); 20272 } 20273 20274 /** 20275 * Renders the PostSlug component. It provide a control for editing the post slug. 20276 * 20277 * @return {Component} The component to be rendered. 20278 */ 20279 function PostSlug() { 20280 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostSlugCheck, { 20281 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostSlugControl, {}) 20282 }); 20283 } 20284 20285 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-switch-to-draft-button/index.js 20286 /** 20287 * WordPress dependencies 20288 */ 20289 20290 20291 20292 20293 20294 20295 /** 20296 * Internal dependencies 20297 */ 20298 20299 20300 /** 20301 * Renders a button component that allows the user to switch a post to draft status. 20302 * 20303 * @return {JSX.Element} The rendered component. 20304 */ 20305 20306 20307 20308 function PostSwitchToDraftButton() { 20309 external_wp_deprecated_default()('wp.editor.PostSwitchToDraftButton', { 20310 since: '6.7', 20311 version: '6.9' 20312 }); 20313 const [showConfirmDialog, setShowConfirmDialog] = (0,external_wp_element_namespaceObject.useState)(false); 20314 const { 20315 editPost, 20316 savePost 20317 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 20318 const { 20319 isSaving, 20320 isPublished, 20321 isScheduled 20322 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 20323 const { 20324 isSavingPost, 20325 isCurrentPostPublished, 20326 isCurrentPostScheduled 20327 } = select(store_store); 20328 return { 20329 isSaving: isSavingPost(), 20330 isPublished: isCurrentPostPublished(), 20331 isScheduled: isCurrentPostScheduled() 20332 }; 20333 }, []); 20334 const isDisabled = isSaving || !isPublished && !isScheduled; 20335 let alertMessage; 20336 let confirmButtonText; 20337 if (isPublished) { 20338 alertMessage = (0,external_wp_i18n_namespaceObject.__)('Are you sure you want to unpublish this post?'); 20339 confirmButtonText = (0,external_wp_i18n_namespaceObject.__)('Unpublish'); 20340 } else if (isScheduled) { 20341 alertMessage = (0,external_wp_i18n_namespaceObject.__)('Are you sure you want to unschedule this post?'); 20342 confirmButtonText = (0,external_wp_i18n_namespaceObject.__)('Unschedule'); 20343 } 20344 const handleConfirm = () => { 20345 setShowConfirmDialog(false); 20346 editPost({ 20347 status: 'draft' 20348 }); 20349 savePost(); 20350 }; 20351 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 20352 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 20353 __next40pxDefaultSize: true, 20354 className: "editor-post-switch-to-draft", 20355 onClick: () => { 20356 if (!isDisabled) { 20357 setShowConfirmDialog(true); 20358 } 20359 }, 20360 "aria-disabled": isDisabled, 20361 variant: "secondary", 20362 style: { 20363 flexGrow: '1', 20364 justifyContent: 'center' 20365 }, 20366 children: (0,external_wp_i18n_namespaceObject.__)('Switch to draft') 20367 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalConfirmDialog, { 20368 isOpen: showConfirmDialog, 20369 onConfirm: handleConfirm, 20370 onCancel: () => setShowConfirmDialog(false), 20371 confirmButtonText: confirmButtonText, 20372 children: alertMessage 20373 })] 20374 }); 20375 } 20376 20377 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-sync-status/index.js 20378 /** 20379 * WordPress dependencies 20380 */ 20381 20382 20383 20384 /** 20385 * Internal dependencies 20386 */ 20387 20388 20389 20390 /** 20391 * Renders the sync status of a post. 20392 * 20393 * @return {JSX.Element|null} The rendered sync status component. 20394 */ 20395 20396 function PostSyncStatus() { 20397 const { 20398 syncStatus, 20399 postType 20400 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 20401 const { 20402 getEditedPostAttribute 20403 } = select(store_store); 20404 const meta = getEditedPostAttribute('meta'); 20405 20406 // When the post is first created, the top level wp_pattern_sync_status is not set so get meta value instead. 20407 const currentSyncStatus = meta?.wp_pattern_sync_status === 'unsynced' ? 'unsynced' : getEditedPostAttribute('wp_pattern_sync_status'); 20408 return { 20409 syncStatus: currentSyncStatus, 20410 postType: getEditedPostAttribute('type') 20411 }; 20412 }); 20413 if (postType !== 'wp_block') { 20414 return null; 20415 } 20416 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { 20417 label: (0,external_wp_i18n_namespaceObject.__)('Sync status'), 20418 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 20419 className: "editor-post-sync-status__value", 20420 children: syncStatus === 'unsynced' ? (0,external_wp_i18n_namespaceObject._x)('Not synced', 'pattern (singular)') : (0,external_wp_i18n_namespaceObject._x)('Synced', 'pattern (singular)') 20421 }) 20422 }); 20423 } 20424 20425 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-taxonomies/index.js 20426 /** 20427 * WordPress dependencies 20428 */ 20429 20430 20431 20432 20433 /** 20434 * Internal dependencies 20435 */ 20436 20437 20438 20439 20440 const post_taxonomies_identity = x => x; 20441 function PostTaxonomies({ 20442 taxonomyWrapper = post_taxonomies_identity 20443 }) { 20444 const { 20445 postType, 20446 taxonomies 20447 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 20448 return { 20449 postType: select(store_store).getCurrentPostType(), 20450 taxonomies: select(external_wp_coreData_namespaceObject.store).getTaxonomies({ 20451 per_page: -1 20452 }) 20453 }; 20454 }, []); 20455 const visibleTaxonomies = (taxonomies !== null && taxonomies !== void 0 ? taxonomies : []).filter(taxonomy => 20456 // In some circumstances .visibility can end up as undefined so optional chaining operator required. 20457 // https://github.com/WordPress/gutenberg/issues/40326 20458 taxonomy.types.includes(postType) && taxonomy.visibility?.show_ui); 20459 return visibleTaxonomies.map(taxonomy => { 20460 const TaxonomyComponent = taxonomy.hierarchical ? hierarchical_term_selector : flat_term_selector; 20461 const taxonomyComponentProps = { 20462 slug: taxonomy.slug, 20463 ...(taxonomy.hierarchical ? {} : { 20464 __nextHasNoMarginBottom: true 20465 }) 20466 }; 20467 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_element_namespaceObject.Fragment, { 20468 children: taxonomyWrapper( /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TaxonomyComponent, { 20469 ...taxonomyComponentProps 20470 }), taxonomy) 20471 }, `taxonomy-$taxonomy.slug}`); 20472 }); 20473 } 20474 20475 /** 20476 * Renders the taxonomies associated with a post. 20477 * 20478 * @param {Object} props The component props. 20479 * @param {Function} props.taxonomyWrapper The wrapper function for each taxonomy component. 20480 * 20481 * @return {Array} An array of JSX elements representing the visible taxonomies. 20482 */ 20483 /* harmony default export */ const post_taxonomies = (PostTaxonomies); 20484 20485 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-taxonomies/check.js 20486 /** 20487 * WordPress dependencies 20488 */ 20489 20490 20491 20492 /** 20493 * Internal dependencies 20494 */ 20495 20496 20497 /** 20498 * Renders the children components only if the current post type has taxonomies. 20499 * 20500 * @param {Object} props The component props. 20501 * @param {Element} props.children The children components to render. 20502 * 20503 * @return {Component|null} The rendered children components or null if the current post type has no taxonomies. 20504 */ 20505 function PostTaxonomiesCheck({ 20506 children 20507 }) { 20508 const hasTaxonomies = (0,external_wp_data_namespaceObject.useSelect)(select => { 20509 const postType = select(store_store).getCurrentPostType(); 20510 const taxonomies = select(external_wp_coreData_namespaceObject.store).getTaxonomies({ 20511 per_page: -1 20512 }); 20513 return taxonomies?.some(taxonomy => taxonomy.types.includes(postType)); 20514 }, []); 20515 if (!hasTaxonomies) { 20516 return null; 20517 } 20518 return children; 20519 } 20520 20521 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-taxonomies/panel.js 20522 /** 20523 * WordPress dependencies 20524 */ 20525 20526 20527 20528 /** 20529 * Internal dependencies 20530 */ 20531 20532 20533 20534 20535 function TaxonomyPanel({ 20536 taxonomy, 20537 children 20538 }) { 20539 const slug = taxonomy?.slug; 20540 const panelName = slug ? `taxonomy-panel-$slug}` : ''; 20541 const { 20542 isEnabled, 20543 isOpened 20544 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 20545 const { 20546 isEditorPanelEnabled, 20547 isEditorPanelOpened 20548 } = select(store_store); 20549 return { 20550 isEnabled: slug ? isEditorPanelEnabled(panelName) : false, 20551 isOpened: slug ? isEditorPanelOpened(panelName) : false 20552 }; 20553 }, [panelName, slug]); 20554 const { 20555 toggleEditorPanelOpened 20556 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 20557 if (!isEnabled) { 20558 return null; 20559 } 20560 const taxonomyMenuName = taxonomy?.labels?.menu_name; 20561 if (!taxonomyMenuName) { 20562 return null; 20563 } 20564 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelBody, { 20565 title: taxonomyMenuName, 20566 opened: isOpened, 20567 onToggle: () => toggleEditorPanelOpened(panelName), 20568 children: children 20569 }); 20570 } 20571 function panel_PostTaxonomies() { 20572 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostTaxonomiesCheck, { 20573 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_taxonomies, { 20574 taxonomyWrapper: (content, taxonomy) => { 20575 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TaxonomyPanel, { 20576 taxonomy: taxonomy, 20577 children: content 20578 }); 20579 } 20580 }) 20581 }); 20582 } 20583 20584 /** 20585 * Renders a panel for a specific taxonomy. 20586 * 20587 * @param {Object} props The component props. 20588 * @param {Object} props.taxonomy The taxonomy object. 20589 * @param {Element} props.children The child components. 20590 * 20591 * @return {Component} The rendered taxonomy panel. 20592 */ 20593 /* harmony default export */ const post_taxonomies_panel = (panel_PostTaxonomies); 20594 20595 // EXTERNAL MODULE: ./node_modules/react-autosize-textarea/lib/index.js 20596 var lib = __webpack_require__(4132); 20597 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-text-editor/index.js 20598 /** 20599 * External dependencies 20600 */ 20601 20602 20603 /** 20604 * WordPress dependencies 20605 */ 20606 20607 20608 20609 20610 20611 20612 20613 20614 /** 20615 * Internal dependencies 20616 */ 20617 20618 20619 /** 20620 * Displays the Post Text Editor along with content in Visual and Text mode. 20621 * 20622 * @return {JSX.Element|null} The rendered PostTextEditor component. 20623 */ 20624 20625 20626 20627 function PostTextEditor() { 20628 const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(PostTextEditor); 20629 const { 20630 content, 20631 blocks, 20632 type, 20633 id 20634 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 20635 const { 20636 getEditedEntityRecord 20637 } = select(external_wp_coreData_namespaceObject.store); 20638 const { 20639 getCurrentPostType, 20640 getCurrentPostId 20641 } = select(store_store); 20642 const _type = getCurrentPostType(); 20643 const _id = getCurrentPostId(); 20644 const editedRecord = getEditedEntityRecord('postType', _type, _id); 20645 return { 20646 content: editedRecord?.content, 20647 blocks: editedRecord?.blocks, 20648 type: _type, 20649 id: _id 20650 }; 20651 }, []); 20652 const { 20653 editEntityRecord 20654 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); 20655 // Replicates the logic found in getEditedPostContent(). 20656 const value = (0,external_wp_element_namespaceObject.useMemo)(() => { 20657 if (content instanceof Function) { 20658 return content({ 20659 blocks 20660 }); 20661 } else if (blocks) { 20662 // If we have parsed blocks already, they should be our source of truth. 20663 // Parsing applies block deprecations and legacy block conversions that 20664 // unparsed content will not have. 20665 return (0,external_wp_blocks_namespaceObject.__unstableSerializeAndClean)(blocks); 20666 } 20667 return content; 20668 }, [content, blocks]); 20669 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 20670 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.VisuallyHidden, { 20671 as: "label", 20672 htmlFor: `post-content-$instanceId}`, 20673 children: (0,external_wp_i18n_namespaceObject.__)('Type text or HTML') 20674 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(lib/* default */.A, { 20675 autoComplete: "off", 20676 dir: "auto", 20677 value: value, 20678 onChange: event => { 20679 editEntityRecord('postType', type, id, { 20680 content: event.target.value, 20681 blocks: undefined, 20682 selection: undefined 20683 }); 20684 }, 20685 className: "editor-post-text-editor", 20686 id: `post-content-$instanceId}`, 20687 placeholder: (0,external_wp_i18n_namespaceObject.__)('Start writing with text or HTML') 20688 })] 20689 }); 20690 } 20691 20692 ;// CONCATENATED MODULE: external ["wp","dom"] 20693 const external_wp_dom_namespaceObject = window["wp"]["dom"]; 20694 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-title/constants.js 20695 const DEFAULT_CLASSNAMES = 'wp-block wp-block-post-title block-editor-block-list__block editor-post-title editor-post-title__input rich-text'; 20696 const REGEXP_NEWLINES = /[\r\n]+/g; 20697 20698 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-title/use-post-title-focus.js 20699 /** 20700 * WordPress dependencies 20701 */ 20702 20703 20704 20705 /** 20706 * Internal dependencies 20707 */ 20708 20709 20710 /** 20711 * Custom hook that manages the focus behavior of the post title input field. 20712 * 20713 * @param {Element} forwardedRef - The forwarded ref for the input field. 20714 * 20715 * @return {Object} - The ref object. 20716 */ 20717 function usePostTitleFocus(forwardedRef) { 20718 const ref = (0,external_wp_element_namespaceObject.useRef)(); 20719 const { 20720 isCleanNewPost 20721 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 20722 const { 20723 isCleanNewPost: _isCleanNewPost 20724 } = select(store_store); 20725 return { 20726 isCleanNewPost: _isCleanNewPost() 20727 }; 20728 }, []); 20729 (0,external_wp_element_namespaceObject.useImperativeHandle)(forwardedRef, () => ({ 20730 focus: () => { 20731 ref?.current?.focus(); 20732 } 20733 })); 20734 (0,external_wp_element_namespaceObject.useEffect)(() => { 20735 if (!ref.current) { 20736 return; 20737 } 20738 const { 20739 defaultView 20740 } = ref.current.ownerDocument; 20741 const { 20742 name, 20743 parent 20744 } = defaultView; 20745 const ownerDocument = name === 'editor-canvas' ? parent.document : defaultView.document; 20746 const { 20747 activeElement, 20748 body 20749 } = ownerDocument; 20750 20751 // Only autofocus the title when the post is entirely empty. This should 20752 // only happen for a new post, which means we focus the title on new 20753 // post so the author can start typing right away, without needing to 20754 // click anything. 20755 if (isCleanNewPost && (!activeElement || body === activeElement)) { 20756 ref.current.focus(); 20757 } 20758 }, [isCleanNewPost]); 20759 return { 20760 ref 20761 }; 20762 } 20763 20764 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-title/use-post-title.js 20765 /** 20766 * WordPress dependencies 20767 */ 20768 20769 /** 20770 * Internal dependencies 20771 */ 20772 20773 20774 /** 20775 * Custom hook for managing the post title in the editor. 20776 * 20777 * @return {Object} An object containing the current title and a function to update the title. 20778 */ 20779 function usePostTitle() { 20780 const { 20781 editPost 20782 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 20783 const { 20784 title 20785 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 20786 const { 20787 getEditedPostAttribute 20788 } = select(store_store); 20789 return { 20790 title: getEditedPostAttribute('title') 20791 }; 20792 }, []); 20793 function updateTitle(newTitle) { 20794 editPost({ 20795 title: newTitle 20796 }); 20797 } 20798 return { 20799 title, 20800 setTitle: updateTitle 20801 }; 20802 } 20803 20804 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-title/index.js 20805 /** 20806 * External dependencies 20807 */ 20808 20809 /** 20810 * WordPress dependencies 20811 */ 20812 20813 20814 20815 20816 20817 20818 20819 20820 20821 20822 20823 /** 20824 * Internal dependencies 20825 */ 20826 20827 20828 20829 20830 20831 function PostTitle(_, forwardedRef) { 20832 const { 20833 placeholder 20834 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 20835 const { 20836 getSettings 20837 } = select(external_wp_blockEditor_namespaceObject.store); 20838 const { 20839 titlePlaceholder 20840 } = getSettings(); 20841 return { 20842 placeholder: titlePlaceholder 20843 }; 20844 }, []); 20845 const [isSelected, setIsSelected] = (0,external_wp_element_namespaceObject.useState)(false); 20846 const { 20847 ref: focusRef 20848 } = usePostTitleFocus(forwardedRef); 20849 const { 20850 title, 20851 setTitle: onUpdate 20852 } = usePostTitle(); 20853 const [selection, setSelection] = (0,external_wp_element_namespaceObject.useState)({}); 20854 const { 20855 clearSelectedBlock, 20856 insertBlocks, 20857 insertDefaultBlock 20858 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_blockEditor_namespaceObject.store); 20859 const decodedPlaceholder = (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(placeholder) || (0,external_wp_i18n_namespaceObject.__)('Add title'); 20860 const { 20861 value, 20862 onChange, 20863 ref: richTextRef 20864 } = (0,external_wp_richText_namespaceObject.__unstableUseRichText)({ 20865 value: title, 20866 onChange(newValue) { 20867 onUpdate(newValue.replace(REGEXP_NEWLINES, ' ')); 20868 }, 20869 placeholder: decodedPlaceholder, 20870 selectionStart: selection.start, 20871 selectionEnd: selection.end, 20872 onSelectionChange(newStart, newEnd) { 20873 setSelection(sel => { 20874 const { 20875 start, 20876 end 20877 } = sel; 20878 if (start === newStart && end === newEnd) { 20879 return sel; 20880 } 20881 return { 20882 start: newStart, 20883 end: newEnd 20884 }; 20885 }); 20886 }, 20887 __unstableDisableFormats: false 20888 }); 20889 function onInsertBlockAfter(blocks) { 20890 insertBlocks(blocks, 0); 20891 } 20892 function onSelect() { 20893 setIsSelected(true); 20894 clearSelectedBlock(); 20895 } 20896 function onUnselect() { 20897 setIsSelected(false); 20898 setSelection({}); 20899 } 20900 function onEnterPress() { 20901 insertDefaultBlock(undefined, undefined, 0); 20902 } 20903 function onKeyDown(event) { 20904 if (event.keyCode === external_wp_keycodes_namespaceObject.ENTER) { 20905 event.preventDefault(); 20906 onEnterPress(); 20907 } 20908 } 20909 function onPaste(event) { 20910 const clipboardData = event.clipboardData; 20911 let plainText = ''; 20912 let html = ''; 20913 try { 20914 plainText = clipboardData.getData('text/plain'); 20915 html = clipboardData.getData('text/html'); 20916 } catch (error) { 20917 // Some browsers like UC Browser paste plain text by default and 20918 // don't support clipboardData at all, so allow default 20919 // behaviour. 20920 return; 20921 } 20922 20923 // Allows us to ask for this information when we get a report. 20924 window.console.log('Received HTML:\n\n', html); 20925 window.console.log('Received plain text:\n\n', plainText); 20926 const content = (0,external_wp_blocks_namespaceObject.pasteHandler)({ 20927 HTML: html, 20928 plainText 20929 }); 20930 event.preventDefault(); 20931 if (!content.length) { 20932 return; 20933 } 20934 if (typeof content !== 'string') { 20935 const [firstBlock] = content; 20936 if (!title && (firstBlock.name === 'core/heading' || firstBlock.name === 'core/paragraph')) { 20937 // Strip HTML to avoid unwanted HTML being added to the title. 20938 // In the majority of cases it is assumed that HTML in the title 20939 // is undesirable. 20940 const contentNoHTML = (0,external_wp_dom_namespaceObject.__unstableStripHTML)(firstBlock.attributes.content); 20941 onUpdate(contentNoHTML); 20942 onInsertBlockAfter(content.slice(1)); 20943 } else { 20944 onInsertBlockAfter(content); 20945 } 20946 } else { 20947 // Strip HTML to avoid unwanted HTML being added to the title. 20948 // In the majority of cases it is assumed that HTML in the title 20949 // is undesirable. 20950 const contentNoHTML = (0,external_wp_dom_namespaceObject.__unstableStripHTML)(content); 20951 onChange((0,external_wp_richText_namespaceObject.insert)(value, (0,external_wp_richText_namespaceObject.create)({ 20952 html: contentNoHTML 20953 }))); 20954 } 20955 } 20956 20957 // The wp-block className is important for editor styles. 20958 // This same block is used in both the visual and the code editor. 20959 const className = dist_clsx(DEFAULT_CLASSNAMES, { 20960 'is-selected': isSelected 20961 }); 20962 return ( 20963 /*#__PURE__*/ 20964 /* eslint-disable jsx-a11y/heading-has-content, jsx-a11y/no-noninteractive-element-to-interactive-role */ 20965 (0,external_ReactJSXRuntime_namespaceObject.jsx)(post_type_support_check, { 20966 supportKeys: "title", 20967 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("h1", { 20968 ref: (0,external_wp_compose_namespaceObject.useMergeRefs)([richTextRef, focusRef]), 20969 contentEditable: true, 20970 className: className, 20971 "aria-label": decodedPlaceholder, 20972 role: "textbox", 20973 "aria-multiline": "true", 20974 onFocus: onSelect, 20975 onBlur: onUnselect, 20976 onKeyDown: onKeyDown, 20977 onPaste: onPaste 20978 }) 20979 }) 20980 /* eslint-enable jsx-a11y/heading-has-content, jsx-a11y/no-noninteractive-element-to-interactive-role */ 20981 ); 20982 } 20983 20984 /** 20985 * Renders the `PostTitle` component. 20986 * 20987 * @param {Object} _ Unused parameter. 20988 * @param {Element} forwardedRef Forwarded ref for the component. 20989 * 20990 * @return {Component} The rendered PostTitle component. 20991 */ 20992 /* harmony default export */ const post_title = ((0,external_wp_element_namespaceObject.forwardRef)(PostTitle)); 20993 20994 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-title/post-title-raw.js 20995 /** 20996 * External dependencies 20997 */ 20998 20999 21000 /** 21001 * WordPress dependencies 21002 */ 21003 21004 21005 21006 21007 21008 21009 21010 /** 21011 * Internal dependencies 21012 */ 21013 21014 21015 21016 21017 /** 21018 * Renders a raw post title input field. 21019 * 21020 * @param {Object} _ Unused parameter. 21021 * @param {Element} forwardedRef Reference to the component's DOM node. 21022 * 21023 * @return {Component} The rendered component. 21024 */ 21025 21026 function PostTitleRaw(_, forwardedRef) { 21027 const { 21028 placeholder 21029 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 21030 const { 21031 getSettings 21032 } = select(external_wp_blockEditor_namespaceObject.store); 21033 const { 21034 titlePlaceholder 21035 } = getSettings(); 21036 return { 21037 placeholder: titlePlaceholder 21038 }; 21039 }, []); 21040 const [isSelected, setIsSelected] = (0,external_wp_element_namespaceObject.useState)(false); 21041 const { 21042 title, 21043 setTitle: onUpdate 21044 } = usePostTitle(); 21045 const { 21046 ref: focusRef 21047 } = usePostTitleFocus(forwardedRef); 21048 function onChange(value) { 21049 onUpdate(value.replace(REGEXP_NEWLINES, ' ')); 21050 } 21051 function onSelect() { 21052 setIsSelected(true); 21053 } 21054 function onUnselect() { 21055 setIsSelected(false); 21056 } 21057 21058 // The wp-block className is important for editor styles. 21059 // This same block is used in both the visual and the code editor. 21060 const className = dist_clsx(DEFAULT_CLASSNAMES, { 21061 'is-selected': isSelected, 21062 'is-raw-text': true 21063 }); 21064 const decodedPlaceholder = (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(placeholder) || (0,external_wp_i18n_namespaceObject.__)('Add title'); 21065 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.TextareaControl, { 21066 ref: focusRef, 21067 value: title, 21068 onChange: onChange, 21069 onFocus: onSelect, 21070 onBlur: onUnselect, 21071 label: placeholder, 21072 className: className, 21073 placeholder: decodedPlaceholder, 21074 hideLabelFromVision: true, 21075 autoComplete: "off", 21076 dir: "auto", 21077 rows: 1, 21078 __nextHasNoMarginBottom: true 21079 }); 21080 } 21081 /* harmony default export */ const post_title_raw = ((0,external_wp_element_namespaceObject.forwardRef)(PostTitleRaw)); 21082 21083 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-trash/check.js 21084 /** 21085 * WordPress dependencies 21086 */ 21087 21088 21089 21090 /** 21091 * Internal dependencies 21092 */ 21093 21094 21095 21096 /** 21097 * Wrapper component that renders its children only if the post can trashed. 21098 * 21099 * @param {Object} props - The component props. 21100 * @param {Element} props.children - The child components to render. 21101 * 21102 * @return {Component|null} The rendered child components or null if the post can not trashed. 21103 */ 21104 function PostTrashCheck({ 21105 children 21106 }) { 21107 const { 21108 canTrashPost 21109 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 21110 const { 21111 isEditedPostNew, 21112 getCurrentPostId, 21113 getCurrentPostType 21114 } = select(store_store); 21115 const { 21116 canUser 21117 } = select(external_wp_coreData_namespaceObject.store); 21118 const postType = getCurrentPostType(); 21119 const postId = getCurrentPostId(); 21120 const isNew = isEditedPostNew(); 21121 const canUserDelete = !!postId ? canUser('delete', { 21122 kind: 'postType', 21123 name: postType, 21124 id: postId 21125 }) : false; 21126 return { 21127 canTrashPost: (!isNew || postId) && canUserDelete && !GLOBAL_POST_TYPES.includes(postType) 21128 }; 21129 }, []); 21130 if (!canTrashPost) { 21131 return null; 21132 } 21133 return children; 21134 } 21135 21136 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-trash/index.js 21137 /** 21138 * WordPress dependencies 21139 */ 21140 21141 21142 21143 21144 21145 /** 21146 * Internal dependencies 21147 */ 21148 21149 21150 21151 /** 21152 * Displays the Post Trash Button and Confirm Dialog in the Editor. 21153 * 21154 * @param {?{onActionPerformed: Object}} An object containing the onActionPerformed function. 21155 * @return {JSX.Element|null} The rendered PostTrash component. 21156 */ 21157 21158 21159 function PostTrash({ 21160 onActionPerformed 21161 }) { 21162 const registry = (0,external_wp_data_namespaceObject.useRegistry)(); 21163 const { 21164 isNew, 21165 isDeleting, 21166 postId, 21167 title 21168 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 21169 const store = select(store_store); 21170 return { 21171 isNew: store.isEditedPostNew(), 21172 isDeleting: store.isDeletingPost(), 21173 postId: store.getCurrentPostId(), 21174 title: store.getCurrentPostAttribute('title') 21175 }; 21176 }, []); 21177 const { 21178 trashPost 21179 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 21180 const [showConfirmDialog, setShowConfirmDialog] = (0,external_wp_element_namespaceObject.useState)(false); 21181 if (isNew || !postId) { 21182 return null; 21183 } 21184 const handleConfirm = async () => { 21185 setShowConfirmDialog(false); 21186 await trashPost(); 21187 const item = await registry.resolveSelect(store_store).getCurrentPost(); 21188 // After the post is trashed, we want to trigger the onActionPerformed callback, so the user is redirect 21189 // to the post view depending on if the user is on post editor or site editor. 21190 onActionPerformed?.('move-to-trash', [item]); 21191 }; 21192 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(PostTrashCheck, { 21193 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 21194 __next40pxDefaultSize: true, 21195 className: "editor-post-trash", 21196 isDestructive: true, 21197 variant: "secondary", 21198 isBusy: isDeleting, 21199 "aria-disabled": isDeleting, 21200 onClick: isDeleting ? undefined : () => setShowConfirmDialog(true), 21201 children: (0,external_wp_i18n_namespaceObject.__)('Move to trash') 21202 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalConfirmDialog, { 21203 isOpen: showConfirmDialog, 21204 onConfirm: handleConfirm, 21205 onCancel: () => setShowConfirmDialog(false), 21206 confirmButtonText: (0,external_wp_i18n_namespaceObject.__)('Move to trash'), 21207 size: "small", 21208 children: (0,external_wp_i18n_namespaceObject.sprintf)( 21209 // translators: %s: The item's title. 21210 (0,external_wp_i18n_namespaceObject.__)('Are you sure you want to move "%s" to the trash?'), title) 21211 })] 21212 }); 21213 } 21214 21215 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/copy-small.js 21216 /** 21217 * WordPress dependencies 21218 */ 21219 21220 21221 const copySmall = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 21222 xmlns: "http://www.w3.org/2000/svg", 21223 viewBox: "0 0 24 24", 21224 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 21225 fillRule: "evenodd", 21226 clipRule: "evenodd", 21227 d: "M5.625 5.5h9.75c.069 0 .125.056.125.125v9.75a.125.125 0 0 1-.125.125h-9.75a.125.125 0 0 1-.125-.125v-9.75c0-.069.056-.125.125-.125ZM4 5.625C4 4.728 4.728 4 5.625 4h9.75C16.273 4 17 4.728 17 5.625v9.75c0 .898-.727 1.625-1.625 1.625h-9.75A1.625 1.625 0 0 1 4 15.375v-9.75Zm14.5 11.656v-9H20v9C20 18.8 18.77 20 17.251 20H6.25v-1.5h11.001c.69 0 1.249-.528 1.249-1.219Z" 21228 }) 21229 }); 21230 /* harmony default export */ const copy_small = (copySmall); 21231 21232 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-url/index.js 21233 /** 21234 * WordPress dependencies 21235 */ 21236 21237 21238 21239 21240 21241 21242 21243 21244 21245 21246 21247 /** 21248 * Internal dependencies 21249 */ 21250 21251 21252 /** 21253 * Renders the `PostURL` component. 21254 * 21255 * @example 21256 * ```jsx 21257 * <PostURL /> 21258 * ``` 21259 * 21260 * @param {Function} onClose Callback function to be executed when the popover is closed. 21261 * 21262 * @return {Component} The rendered PostURL component. 21263 */ 21264 21265 21266 function PostURL({ 21267 onClose 21268 }) { 21269 const { 21270 isEditable, 21271 postSlug, 21272 postLink, 21273 permalinkPrefix, 21274 permalinkSuffix, 21275 permalink 21276 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 21277 var _post$_links$wpActio; 21278 const post = select(store_store).getCurrentPost(); 21279 const postTypeSlug = select(store_store).getCurrentPostType(); 21280 const postType = select(external_wp_coreData_namespaceObject.store).getPostType(postTypeSlug); 21281 const permalinkParts = select(store_store).getPermalinkParts(); 21282 const hasPublishAction = (_post$_links$wpActio = post?._links?.['wp:action-publish']) !== null && _post$_links$wpActio !== void 0 ? _post$_links$wpActio : false; 21283 return { 21284 isEditable: select(store_store).isPermalinkEditable() && hasPublishAction, 21285 postSlug: (0,external_wp_url_namespaceObject.safeDecodeURIComponent)(select(store_store).getEditedPostSlug()), 21286 viewPostLabel: postType?.labels.view_item, 21287 postLink: post.link, 21288 permalinkPrefix: permalinkParts?.prefix, 21289 permalinkSuffix: permalinkParts?.suffix, 21290 permalink: (0,external_wp_url_namespaceObject.safeDecodeURIComponent)(select(store_store).getPermalink()) 21291 }; 21292 }, []); 21293 const { 21294 editPost 21295 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 21296 const { 21297 createNotice 21298 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); 21299 const [forceEmptyField, setForceEmptyField] = (0,external_wp_element_namespaceObject.useState)(false); 21300 const copyButtonRef = (0,external_wp_compose_namespaceObject.useCopyToClipboard)(permalink, () => { 21301 createNotice('info', (0,external_wp_i18n_namespaceObject.__)('Copied URL to clipboard.'), { 21302 isDismissible: true, 21303 type: 'snackbar' 21304 }); 21305 }); 21306 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 21307 className: "editor-post-url", 21308 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalInspectorPopoverHeader, { 21309 title: (0,external_wp_i18n_namespaceObject.__)('Link'), 21310 onClose: onClose 21311 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { 21312 spacing: 3, 21313 children: [isEditable && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 21314 children: (0,external_wp_element_namespaceObject.createInterpolateElement)((0,external_wp_i18n_namespaceObject.__)('Customize the last part of the URL. <a>Learn more.</a>'), { 21315 a: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ExternalLink, { 21316 href: (0,external_wp_i18n_namespaceObject.__)('https://wordpress.org/documentation/article/page-post-settings-sidebar/#permalink') 21317 }) 21318 }) 21319 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 21320 children: [isEditable && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalInputControl, { 21321 __next40pxDefaultSize: true, 21322 prefix: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalInputControlPrefixWrapper, { 21323 children: "/" 21324 }), 21325 suffix: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalInputControlSuffixWrapper, { 21326 variant: "control", 21327 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 21328 icon: copy_small, 21329 ref: copyButtonRef, 21330 size: "small", 21331 label: "Copy" 21332 }) 21333 }), 21334 label: (0,external_wp_i18n_namespaceObject.__)('Link'), 21335 hideLabelFromVision: true, 21336 value: forceEmptyField ? '' : postSlug, 21337 autoComplete: "off", 21338 spellCheck: "false", 21339 type: "text", 21340 className: "editor-post-url__input", 21341 onChange: newValue => { 21342 editPost({ 21343 slug: newValue 21344 }); 21345 // When we delete the field the permalink gets 21346 // reverted to the original value. 21347 // The forceEmptyField logic allows the user to have 21348 // the field temporarily empty while typing. 21349 if (!newValue) { 21350 if (!forceEmptyField) { 21351 setForceEmptyField(true); 21352 } 21353 return; 21354 } 21355 if (forceEmptyField) { 21356 setForceEmptyField(false); 21357 } 21358 }, 21359 onBlur: event => { 21360 editPost({ 21361 slug: (0,external_wp_url_namespaceObject.cleanForSlug)(event.target.value) 21362 }); 21363 if (forceEmptyField) { 21364 setForceEmptyField(false); 21365 } 21366 }, 21367 help: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.ExternalLink, { 21368 className: "editor-post-url__link", 21369 href: postLink, 21370 target: "_blank", 21371 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 21372 className: "editor-post-url__link-prefix", 21373 children: permalinkPrefix 21374 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 21375 className: "editor-post-url__link-slug", 21376 children: postSlug 21377 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 21378 className: "editor-post-url__link-suffix", 21379 children: permalinkSuffix 21380 })] 21381 }) 21382 }), !isEditable && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ExternalLink, { 21383 className: "editor-post-url__link", 21384 href: postLink, 21385 target: "_blank", 21386 children: postLink 21387 })] 21388 })] 21389 })] 21390 }); 21391 } 21392 21393 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-url/check.js 21394 /** 21395 * WordPress dependencies 21396 */ 21397 21398 21399 21400 /** 21401 * Internal dependencies 21402 */ 21403 21404 21405 /** 21406 * Check if the post URL is valid and visible. 21407 * 21408 * @param {Object} props The component props. 21409 * @param {Element} props.children The child components. 21410 * 21411 * @return {Component|null} The child components if the post URL is valid and visible, otherwise null. 21412 */ 21413 function PostURLCheck({ 21414 children 21415 }) { 21416 const isVisible = (0,external_wp_data_namespaceObject.useSelect)(select => { 21417 const postTypeSlug = select(store_store).getCurrentPostType(); 21418 const postType = select(external_wp_coreData_namespaceObject.store).getPostType(postTypeSlug); 21419 if (!postType?.viewable) { 21420 return false; 21421 } 21422 const post = select(store_store).getCurrentPost(); 21423 if (!post.link) { 21424 return false; 21425 } 21426 const permalinkParts = select(store_store).getPermalinkParts(); 21427 if (!permalinkParts) { 21428 return false; 21429 } 21430 return true; 21431 }, []); 21432 if (!isVisible) { 21433 return null; 21434 } 21435 return children; 21436 } 21437 21438 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-url/label.js 21439 /** 21440 * WordPress dependencies 21441 */ 21442 21443 21444 21445 /** 21446 * Internal dependencies 21447 */ 21448 21449 21450 /** 21451 * Represents a label component for a post URL. 21452 * 21453 * @return {Component} The PostURLLabel component. 21454 */ 21455 function PostURLLabel() { 21456 return usePostURLLabel(); 21457 } 21458 21459 /** 21460 * Custom hook to get the label for the post URL. 21461 * 21462 * @return {string} The filtered and decoded post URL label. 21463 */ 21464 function usePostURLLabel() { 21465 const postLink = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getPermalink(), []); 21466 return (0,external_wp_url_namespaceObject.filterURLForDisplay)((0,external_wp_url_namespaceObject.safeDecodeURIComponent)(postLink)); 21467 } 21468 21469 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-url/panel.js 21470 /** 21471 * WordPress dependencies 21472 */ 21473 21474 21475 21476 21477 21478 21479 21480 /** 21481 * Internal dependencies 21482 */ 21483 21484 21485 21486 21487 21488 /** 21489 * Renders the `PostURLPanel` component. 21490 * 21491 * @return {JSX.Element} The rendered PostURLPanel component. 21492 */ 21493 21494 function PostURLPanel() { 21495 // Use internal state instead of a ref to make sure that the component 21496 // re-renders when the popover's anchor updates. 21497 const [popoverAnchor, setPopoverAnchor] = (0,external_wp_element_namespaceObject.useState)(null); 21498 // Memoize popoverProps to avoid returning a new object every time. 21499 const popoverProps = (0,external_wp_element_namespaceObject.useMemo)(() => ({ 21500 // Anchor the popover to the middle of the entire row so that it doesn't 21501 // move around when the label changes. 21502 anchor: popoverAnchor, 21503 placement: 'left-start', 21504 offset: 36, 21505 shift: true 21506 }), [popoverAnchor]); 21507 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostURLCheck, { 21508 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { 21509 label: (0,external_wp_i18n_namespaceObject.__)('Link'), 21510 ref: setPopoverAnchor, 21511 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Dropdown, { 21512 popoverProps: popoverProps, 21513 className: "editor-post-url__panel-dropdown", 21514 contentClassName: "editor-post-url__panel-dialog", 21515 focusOnMount: true, 21516 renderToggle: ({ 21517 isOpen, 21518 onToggle 21519 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostURLToggle, { 21520 isOpen: isOpen, 21521 onClick: onToggle 21522 }), 21523 renderContent: ({ 21524 onClose 21525 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostURL, { 21526 onClose: onClose 21527 }) 21528 }) 21529 }) 21530 }); 21531 } 21532 function PostURLToggle({ 21533 isOpen, 21534 onClick 21535 }) { 21536 const { 21537 slug, 21538 isFrontPage, 21539 postLink 21540 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 21541 const { 21542 getCurrentPostId, 21543 getCurrentPost 21544 } = select(store_store); 21545 const { 21546 getEditedEntityRecord, 21547 canUser 21548 } = select(external_wp_coreData_namespaceObject.store); 21549 const siteSettings = canUser('read', { 21550 kind: 'root', 21551 name: 'site' 21552 }) ? getEditedEntityRecord('root', 'site') : undefined; 21553 const _id = getCurrentPostId(); 21554 return { 21555 slug: select(store_store).getEditedPostSlug(), 21556 isFrontPage: siteSettings?.page_on_front === _id, 21557 postLink: getCurrentPost()?.link 21558 }; 21559 }, []); 21560 const decodedSlug = (0,external_wp_url_namespaceObject.safeDecodeURIComponent)(slug); 21561 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 21562 size: "compact", 21563 className: "editor-post-url__panel-toggle", 21564 variant: "tertiary", 21565 "aria-expanded": isOpen, 21566 "aria-label": 21567 // translators: %s: Current post link. 21568 (0,external_wp_i18n_namespaceObject.sprintf)((0,external_wp_i18n_namespaceObject.__)('Change link: %s'), decodedSlug), 21569 onClick: onClick, 21570 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalTruncate, { 21571 numberOfLines: 1, 21572 children: isFrontPage ? postLink : `/$decodedSlug}` 21573 }) 21574 }); 21575 } 21576 21577 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-visibility/check.js 21578 /** 21579 * WordPress dependencies 21580 */ 21581 21582 21583 /** 21584 * Internal dependencies 21585 */ 21586 21587 21588 /** 21589 * Determines if the current post can be edited (published) 21590 * and passes this information to the provided render function. 21591 * 21592 * @param {Object} props The component props. 21593 * @param {Function} props.render Function to render the component. 21594 * Receives an object with a `canEdit` property. 21595 * @return {JSX.Element} The rendered component. 21596 */ 21597 function PostVisibilityCheck({ 21598 render 21599 }) { 21600 const canEdit = (0,external_wp_data_namespaceObject.useSelect)(select => { 21601 var _select$getCurrentPos; 21602 return (_select$getCurrentPos = select(store_store).getCurrentPost()._links?.['wp:action-publish']) !== null && _select$getCurrentPos !== void 0 ? _select$getCurrentPos : false; 21603 }); 21604 return render({ 21605 canEdit 21606 }); 21607 } 21608 21609 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/info.js 21610 /** 21611 * WordPress dependencies 21612 */ 21613 21614 21615 const info = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 21616 xmlns: "http://www.w3.org/2000/svg", 21617 viewBox: "0 0 24 24", 21618 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 21619 d: "M12 3.2c-4.8 0-8.8 3.9-8.8 8.8 0 4.8 3.9 8.8 8.8 8.8 4.8 0 8.8-3.9 8.8-8.8 0-4.8-4-8.8-8.8-8.8zm0 16c-4 0-7.2-3.3-7.2-7.2C4.8 8 8 4.8 12 4.8s7.2 3.3 7.2 7.2c0 4-3.2 7.2-7.2 7.2zM11 17h2v-6h-2v6zm0-8h2V7h-2v2z" 21620 }) 21621 }); 21622 /* harmony default export */ const library_info = (info); 21623 21624 ;// CONCATENATED MODULE: external ["wp","wordcount"] 21625 const external_wp_wordcount_namespaceObject = window["wp"]["wordcount"]; 21626 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/word-count/index.js 21627 /** 21628 * WordPress dependencies 21629 */ 21630 21631 21632 21633 21634 /** 21635 * Internal dependencies 21636 */ 21637 21638 21639 /** 21640 * Renders the word count of the post content. 21641 * 21642 * @return {JSX.Element|null} The rendered WordCount component. 21643 */ 21644 21645 function WordCount() { 21646 const content = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getEditedPostAttribute('content'), []); 21647 21648 /* 21649 * translators: If your word count is based on single characters (e.g. East Asian characters), 21650 * enter 'characters_excluding_spaces' or 'characters_including_spaces'. Otherwise, enter 'words'. 21651 * Do not translate into your own language. 21652 */ 21653 const wordCountType = (0,external_wp_i18n_namespaceObject._x)('words', 'Word count type. Do not translate!'); 21654 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 21655 className: "word-count", 21656 children: (0,external_wp_wordcount_namespaceObject.count)(content, wordCountType) 21657 }); 21658 } 21659 21660 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/time-to-read/index.js 21661 /** 21662 * WordPress dependencies 21663 */ 21664 21665 21666 21667 21668 21669 /** 21670 * Internal dependencies 21671 */ 21672 21673 21674 /** 21675 * Average reading rate - based on average taken from 21676 * https://irisreading.com/average-reading-speed-in-various-languages/ 21677 * (Characters/minute used for Chinese rather than words). 21678 * 21679 * @type {number} A rough estimate of the average reading rate across multiple languages. 21680 */ 21681 21682 const AVERAGE_READING_RATE = 189; 21683 21684 /** 21685 * Component for showing Time To Read in Content. 21686 * 21687 * @return {JSX.Element} The rendered TimeToRead component. 21688 */ 21689 function TimeToRead() { 21690 const content = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getEditedPostAttribute('content'), []); 21691 21692 /* 21693 * translators: If your word count is based on single characters (e.g. East Asian characters), 21694 * enter 'characters_excluding_spaces' or 'characters_including_spaces'. Otherwise, enter 'words'. 21695 * Do not translate into your own language. 21696 */ 21697 const wordCountType = (0,external_wp_i18n_namespaceObject._x)('words', 'Word count type. Do not translate!'); 21698 const minutesToRead = Math.round((0,external_wp_wordcount_namespaceObject.count)(content, wordCountType) / AVERAGE_READING_RATE); 21699 const minutesToReadString = minutesToRead === 0 ? (0,external_wp_element_namespaceObject.createInterpolateElement)((0,external_wp_i18n_namespaceObject.__)('<span>< 1</span> minute'), { 21700 span: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", {}) 21701 }) : (0,external_wp_element_namespaceObject.createInterpolateElement)((0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: the number of minutes to read the post. */ 21702 (0,external_wp_i18n_namespaceObject._n)('<span>%s</span> minute', '<span>%s</span> minutes', minutesToRead), minutesToRead), { 21703 span: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", {}) 21704 }); 21705 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 21706 className: "time-to-read", 21707 children: minutesToReadString 21708 }); 21709 } 21710 21711 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/character-count/index.js 21712 /** 21713 * WordPress dependencies 21714 */ 21715 21716 21717 21718 /** 21719 * Internal dependencies 21720 */ 21721 21722 21723 /** 21724 * Renders the character count of the post content. 21725 * 21726 * @return {number} The character count. 21727 */ 21728 function CharacterCount() { 21729 const content = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getEditedPostAttribute('content'), []); 21730 return (0,external_wp_wordcount_namespaceObject.count)(content, 'characters_including_spaces'); 21731 } 21732 21733 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/table-of-contents/panel.js 21734 /** 21735 * WordPress dependencies 21736 */ 21737 21738 21739 21740 21741 /** 21742 * Internal dependencies 21743 */ 21744 21745 21746 21747 21748 21749 21750 21751 function TableOfContentsPanel({ 21752 hasOutlineItemsDisabled, 21753 onRequestClose 21754 }) { 21755 const { 21756 headingCount, 21757 paragraphCount, 21758 numberOfBlocks 21759 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 21760 const { 21761 getGlobalBlockCount 21762 } = select(external_wp_blockEditor_namespaceObject.store); 21763 return { 21764 headingCount: getGlobalBlockCount('core/heading'), 21765 paragraphCount: getGlobalBlockCount('core/paragraph'), 21766 numberOfBlocks: getGlobalBlockCount() 21767 }; 21768 }, []); 21769 return ( 21770 /*#__PURE__*/ 21771 /* 21772 * Disable reason: The `list` ARIA role is redundant but 21773 * Safari+VoiceOver won't announce the list otherwise. 21774 */ 21775 /* eslint-disable jsx-a11y/no-redundant-roles */ 21776 (0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 21777 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 21778 className: "table-of-contents__wrapper", 21779 role: "note", 21780 "aria-label": (0,external_wp_i18n_namespaceObject.__)('Document Statistics'), 21781 tabIndex: "0", 21782 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("ul", { 21783 role: "list", 21784 className: "table-of-contents__counts", 21785 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("li", { 21786 className: "table-of-contents__count", 21787 children: [(0,external_wp_i18n_namespaceObject.__)('Words'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(WordCount, {})] 21788 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("li", { 21789 className: "table-of-contents__count", 21790 children: [(0,external_wp_i18n_namespaceObject.__)('Characters'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 21791 className: "table-of-contents__number", 21792 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(CharacterCount, {}) 21793 })] 21794 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("li", { 21795 className: "table-of-contents__count", 21796 children: [(0,external_wp_i18n_namespaceObject.__)('Time to read'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TimeToRead, {})] 21797 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("li", { 21798 className: "table-of-contents__count", 21799 children: [(0,external_wp_i18n_namespaceObject.__)('Headings'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 21800 className: "table-of-contents__number", 21801 children: headingCount 21802 })] 21803 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("li", { 21804 className: "table-of-contents__count", 21805 children: [(0,external_wp_i18n_namespaceObject.__)('Paragraphs'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 21806 className: "table-of-contents__number", 21807 children: paragraphCount 21808 })] 21809 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("li", { 21810 className: "table-of-contents__count", 21811 children: [(0,external_wp_i18n_namespaceObject.__)('Blocks'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 21812 className: "table-of-contents__number", 21813 children: numberOfBlocks 21814 })] 21815 })] 21816 }) 21817 }), headingCount > 0 && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 21818 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("hr", {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("h2", { 21819 className: "table-of-contents__title", 21820 children: (0,external_wp_i18n_namespaceObject.__)('Document Outline') 21821 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(DocumentOutline, { 21822 onSelect: onRequestClose, 21823 hasOutlineItemsDisabled: hasOutlineItemsDisabled 21824 })] 21825 })] 21826 }) 21827 /* eslint-enable jsx-a11y/no-redundant-roles */ 21828 ); 21829 } 21830 /* harmony default export */ const table_of_contents_panel = (TableOfContentsPanel); 21831 21832 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/table-of-contents/index.js 21833 /** 21834 * WordPress dependencies 21835 */ 21836 21837 21838 21839 21840 21841 21842 21843 /** 21844 * Internal dependencies 21845 */ 21846 21847 21848 function TableOfContents({ 21849 hasOutlineItemsDisabled, 21850 repositionDropdown, 21851 ...props 21852 }, ref) { 21853 const hasBlocks = (0,external_wp_data_namespaceObject.useSelect)(select => !!select(external_wp_blockEditor_namespaceObject.store).getBlockCount(), []); 21854 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Dropdown, { 21855 popoverProps: { 21856 placement: repositionDropdown ? 'right' : 'bottom' 21857 }, 21858 className: "table-of-contents", 21859 contentClassName: "table-of-contents__popover", 21860 renderToggle: ({ 21861 isOpen, 21862 onToggle 21863 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 21864 __next40pxDefaultSize: true, 21865 ...props, 21866 ref: ref, 21867 onClick: hasBlocks ? onToggle : undefined, 21868 icon: library_info, 21869 "aria-expanded": isOpen, 21870 "aria-haspopup": "true" 21871 /* translators: button label text should, if possible, be under 16 characters. */, 21872 label: (0,external_wp_i18n_namespaceObject.__)('Details'), 21873 tooltipPosition: "bottom", 21874 "aria-disabled": !hasBlocks 21875 }), 21876 renderContent: ({ 21877 onClose 21878 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(table_of_contents_panel, { 21879 onRequestClose: onClose, 21880 hasOutlineItemsDisabled: hasOutlineItemsDisabled 21881 }) 21882 }); 21883 } 21884 21885 /** 21886 * Renders a table of contents component. 21887 * 21888 * @param {Object} props The component props. 21889 * @param {boolean} props.hasOutlineItemsDisabled Whether outline items are disabled. 21890 * @param {boolean} props.repositionDropdown Whether to reposition the dropdown. 21891 * @param {Element.ref} ref The component's ref. 21892 * 21893 * @return {JSX.Element} The rendered table of contents component. 21894 */ 21895 /* harmony default export */ const table_of_contents = ((0,external_wp_element_namespaceObject.forwardRef)(TableOfContents)); 21896 21897 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/unsaved-changes-warning/index.js 21898 /** 21899 * WordPress dependencies 21900 */ 21901 21902 21903 21904 21905 21906 /** 21907 * Warns the user if there are unsaved changes before leaving the editor. 21908 * Compatible with Post Editor and Site Editor. 21909 * 21910 * @return {Component} The component. 21911 */ 21912 function UnsavedChangesWarning() { 21913 const { 21914 __experimentalGetDirtyEntityRecords 21915 } = (0,external_wp_data_namespaceObject.useSelect)(external_wp_coreData_namespaceObject.store); 21916 (0,external_wp_element_namespaceObject.useEffect)(() => { 21917 /** 21918 * Warns the user if there are unsaved changes before leaving the editor. 21919 * 21920 * @param {Event} event `beforeunload` event. 21921 * 21922 * @return {string | undefined} Warning prompt message, if unsaved changes exist. 21923 */ 21924 const warnIfUnsavedChanges = event => { 21925 // We need to call the selector directly in the listener to avoid race 21926 // conditions with `BrowserURL` where `componentDidUpdate` gets the 21927 // new value of `isEditedPostDirty` before this component does, 21928 // causing this component to incorrectly think a trashed post is still dirty. 21929 const dirtyEntityRecords = __experimentalGetDirtyEntityRecords(); 21930 if (dirtyEntityRecords.length > 0) { 21931 event.returnValue = (0,external_wp_i18n_namespaceObject.__)('You have unsaved changes. If you proceed, they will be lost.'); 21932 return event.returnValue; 21933 } 21934 }; 21935 window.addEventListener('beforeunload', warnIfUnsavedChanges); 21936 return () => { 21937 window.removeEventListener('beforeunload', warnIfUnsavedChanges); 21938 }; 21939 }, [__experimentalGetDirtyEntityRecords]); 21940 return null; 21941 } 21942 21943 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/provider/with-registry-provider.js 21944 /** 21945 * WordPress dependencies 21946 */ 21947 21948 21949 21950 21951 21952 /** 21953 * Internal dependencies 21954 */ 21955 21956 21957 function getSubRegistry(subRegistries, registry, useSubRegistry) { 21958 if (!useSubRegistry) { 21959 return registry; 21960 } 21961 let subRegistry = subRegistries.get(registry); 21962 if (!subRegistry) { 21963 subRegistry = (0,external_wp_data_namespaceObject.createRegistry)({ 21964 'core/block-editor': external_wp_blockEditor_namespaceObject.storeConfig 21965 }, registry); 21966 // Todo: The interface store should also be created per instance. 21967 subRegistry.registerStore('core/editor', storeConfig); 21968 subRegistries.set(registry, subRegistry); 21969 } 21970 return subRegistry; 21971 } 21972 const withRegistryProvider = (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(WrappedComponent => ({ 21973 useSubRegistry = true, 21974 ...props 21975 }) => { 21976 const registry = (0,external_wp_data_namespaceObject.useRegistry)(); 21977 const [subRegistries] = (0,external_wp_element_namespaceObject.useState)(() => new WeakMap()); 21978 const subRegistry = getSubRegistry(subRegistries, registry, useSubRegistry); 21979 if (subRegistry === registry) { 21980 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(WrappedComponent, { 21981 registry: registry, 21982 ...props 21983 }); 21984 } 21985 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_data_namespaceObject.RegistryProvider, { 21986 value: subRegistry, 21987 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(WrappedComponent, { 21988 registry: subRegistry, 21989 ...props 21990 }) 21991 }); 21992 }, 'withRegistryProvider'); 21993 /* harmony default export */ const with_registry_provider = (withRegistryProvider); 21994 21995 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/media-categories/index.js 21996 /* wp:polyfill */ 21997 /** 21998 * The `editor` settings here need to be in sync with the corresponding ones in `editor` package. 21999 * See `packages/editor/src/components/media-categories/index.js`. 22000 * 22001 * In the future we could consider creating an Openvese package that can be used in both `editor` and `site-editor`. 22002 * The rest of the settings would still need to be in sync though. 22003 */ 22004 22005 /** 22006 * WordPress dependencies 22007 */ 22008 22009 22010 22011 22012 /** 22013 * Internal dependencies 22014 */ 22015 22016 22017 /** @typedef {import('@wordpress/block-editor').InserterMediaRequest} InserterMediaRequest */ 22018 /** @typedef {import('@wordpress/block-editor').InserterMediaItem} InserterMediaItem */ 22019 /** @typedef {import('@wordpress/block-editor').InserterMediaCategory} InserterMediaCategory */ 22020 22021 const getExternalLink = (url, text) => `<a $getExternalLinkAttributes(url)}>$text}</a>`; 22022 const getExternalLinkAttributes = url => `href="$url}" target="_blank" rel="noreferrer noopener"`; 22023 const getOpenverseLicense = (license, licenseVersion) => { 22024 let licenseName = license.trim(); 22025 // PDM has no abbreviation 22026 if (license !== 'pdm') { 22027 licenseName = license.toUpperCase().replace('SAMPLING', 'Sampling'); 22028 } 22029 // If version is known, append version to the name. 22030 // The license has to have a version to be valid. Only 22031 // PDM (public domain mark) doesn't have a version. 22032 if (licenseVersion) { 22033 licenseName += ` $licenseVersion}`; 22034 } 22035 // For licenses other than public-domain marks, prepend 'CC' to the name. 22036 if (!['pdm', 'cc0'].includes(license)) { 22037 licenseName = `CC $licenseName}`; 22038 } 22039 return licenseName; 22040 }; 22041 const getOpenverseCaption = item => { 22042 const { 22043 title, 22044 foreign_landing_url: foreignLandingUrl, 22045 creator, 22046 creator_url: creatorUrl, 22047 license, 22048 license_version: licenseVersion, 22049 license_url: licenseUrl 22050 } = item; 22051 const fullLicense = getOpenverseLicense(license, licenseVersion); 22052 const _creator = (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(creator); 22053 let _caption; 22054 if (_creator) { 22055 _caption = title ? (0,external_wp_i18n_namespaceObject.sprintf)( 22056 // translators: %1s: Title of a media work from Openverse; %2s: Name of the work's creator; %3s: Work's licence e.g: "CC0 1.0". 22057 (0,external_wp_i18n_namespaceObject._x)('"%1$s" by %2$s/ %3$s', 'caption'), getExternalLink(foreignLandingUrl, (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(title)), creatorUrl ? getExternalLink(creatorUrl, _creator) : _creator, licenseUrl ? getExternalLink(`$licenseUrl}?ref=openverse`, fullLicense) : fullLicense) : (0,external_wp_i18n_namespaceObject.sprintf)( 22058 // translators: %1s: Link attributes for a given Openverse media work; %2s: Name of the work's creator; %3s: Works's licence e.g: "CC0 1.0". 22059 (0,external_wp_i18n_namespaceObject._x)('<a %1$s>Work</a> by %2$s/ %3$s', 'caption'), getExternalLinkAttributes(foreignLandingUrl), creatorUrl ? getExternalLink(creatorUrl, _creator) : _creator, licenseUrl ? getExternalLink(`$licenseUrl}?ref=openverse`, fullLicense) : fullLicense); 22060 } else { 22061 _caption = title ? (0,external_wp_i18n_namespaceObject.sprintf)( 22062 // translators: %1s: Title of a media work from Openverse; %2s: Work's licence e.g: "CC0 1.0". 22063 (0,external_wp_i18n_namespaceObject._x)('"%1$s"/ %2$s', 'caption'), getExternalLink(foreignLandingUrl, (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(title)), licenseUrl ? getExternalLink(`$licenseUrl}?ref=openverse`, fullLicense) : fullLicense) : (0,external_wp_i18n_namespaceObject.sprintf)( 22064 // translators: %1s: Link attributes for a given Openverse media work; %2s: Works's licence e.g: "CC0 1.0". 22065 (0,external_wp_i18n_namespaceObject._x)('<a %1$s>Work</a>/ %2$s', 'caption'), getExternalLinkAttributes(foreignLandingUrl), licenseUrl ? getExternalLink(`$licenseUrl}?ref=openverse`, fullLicense) : fullLicense); 22066 } 22067 return _caption.replace(/\s{2}/g, ' '); 22068 }; 22069 const coreMediaFetch = async (query = {}) => { 22070 const mediaItems = await (0,external_wp_data_namespaceObject.resolveSelect)(external_wp_coreData_namespaceObject.store).getMediaItems({ 22071 ...query, 22072 orderBy: !!query?.search ? 'relevance' : 'date' 22073 }); 22074 return mediaItems.map(mediaItem => ({ 22075 ...mediaItem, 22076 alt: mediaItem.alt_text, 22077 url: mediaItem.source_url, 22078 previewUrl: mediaItem.media_details?.sizes?.medium?.source_url, 22079 caption: mediaItem.caption?.raw 22080 })); 22081 }; 22082 22083 /** @type {InserterMediaCategory[]} */ 22084 const inserterMediaCategories = [{ 22085 name: 'images', 22086 labels: { 22087 name: (0,external_wp_i18n_namespaceObject.__)('Images'), 22088 search_items: (0,external_wp_i18n_namespaceObject.__)('Search images') 22089 }, 22090 mediaType: 'image', 22091 async fetch(query = {}) { 22092 return coreMediaFetch({ 22093 ...query, 22094 media_type: 'image' 22095 }); 22096 } 22097 }, { 22098 name: 'videos', 22099 labels: { 22100 name: (0,external_wp_i18n_namespaceObject.__)('Videos'), 22101 search_items: (0,external_wp_i18n_namespaceObject.__)('Search videos') 22102 }, 22103 mediaType: 'video', 22104 async fetch(query = {}) { 22105 return coreMediaFetch({ 22106 ...query, 22107 media_type: 'video' 22108 }); 22109 } 22110 }, { 22111 name: 'audio', 22112 labels: { 22113 name: (0,external_wp_i18n_namespaceObject.__)('Audio'), 22114 search_items: (0,external_wp_i18n_namespaceObject.__)('Search audio') 22115 }, 22116 mediaType: 'audio', 22117 async fetch(query = {}) { 22118 return coreMediaFetch({ 22119 ...query, 22120 media_type: 'audio' 22121 }); 22122 } 22123 }, { 22124 name: 'openverse', 22125 labels: { 22126 name: (0,external_wp_i18n_namespaceObject.__)('Openverse'), 22127 search_items: (0,external_wp_i18n_namespaceObject.__)('Search Openverse') 22128 }, 22129 mediaType: 'image', 22130 async fetch(query = {}) { 22131 const defaultArgs = { 22132 mature: false, 22133 excluded_source: 'flickr,inaturalist,wikimedia', 22134 license: 'pdm,cc0' 22135 }; 22136 const finalQuery = { 22137 ...query, 22138 ...defaultArgs 22139 }; 22140 const mapFromInserterMediaRequest = { 22141 per_page: 'page_size', 22142 search: 'q' 22143 }; 22144 const url = new URL('https://api.openverse.org/v1/images/'); 22145 Object.entries(finalQuery).forEach(([key, value]) => { 22146 const queryKey = mapFromInserterMediaRequest[key] || key; 22147 url.searchParams.set(queryKey, value); 22148 }); 22149 const response = await window.fetch(url, { 22150 headers: { 22151 'User-Agent': 'WordPress/inserter-media-fetch' 22152 } 22153 }); 22154 const jsonResponse = await response.json(); 22155 const results = jsonResponse.results; 22156 return results.map(result => ({ 22157 ...result, 22158 // This is a temp solution for better titles, until Openverse API 22159 // completes the cleaning up of some titles of their upstream data. 22160 title: result.title?.toLowerCase().startsWith('file:') ? result.title.slice(5) : result.title, 22161 sourceId: result.id, 22162 id: undefined, 22163 caption: getOpenverseCaption(result), 22164 previewUrl: result.thumbnail 22165 })); 22166 }, 22167 getReportUrl: ({ 22168 sourceId 22169 }) => `https://wordpress.org/openverse/image/$sourceId}/report/`, 22170 isExternalResource: true 22171 }]; 22172 /* harmony default export */ const media_categories = (inserterMediaCategories); 22173 22174 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/utils/media-upload/index.js 22175 /** 22176 * External dependencies 22177 */ 22178 22179 22180 /** 22181 * WordPress dependencies 22182 */ 22183 22184 22185 22186 /** 22187 * Internal dependencies 22188 */ 22189 22190 const media_upload_noop = () => {}; 22191 22192 /** 22193 * Upload a media file when the file upload button is activated. 22194 * Wrapper around mediaUpload() that injects the current post ID. 22195 * 22196 * @param {Object} $0 Parameters object passed to the function. 22197 * @param {?Object} $0.additionalData Additional data to include in the request. 22198 * @param {string} $0.allowedTypes Array with the types of media that can be uploaded, if unset all types are allowed. 22199 * @param {Array} $0.filesList List of files. 22200 * @param {?number} $0.maxUploadFileSize Maximum upload size in bytes allowed for the site. 22201 * @param {Function} $0.onError Function called when an error happens. 22202 * @param {Function} $0.onFileChange Function called each time a file or a temporary representation of the file is available. 22203 */ 22204 function mediaUpload({ 22205 additionalData = {}, 22206 allowedTypes, 22207 filesList, 22208 maxUploadFileSize, 22209 onError = media_upload_noop, 22210 onFileChange 22211 }) { 22212 const { 22213 getCurrentPost, 22214 getEditorSettings 22215 } = (0,external_wp_data_namespaceObject.select)(store_store); 22216 const { 22217 lockPostAutosaving, 22218 unlockPostAutosaving, 22219 lockPostSaving, 22220 unlockPostSaving 22221 } = (0,external_wp_data_namespaceObject.dispatch)(store_store); 22222 const wpAllowedMimeTypes = getEditorSettings().allowedMimeTypes; 22223 const lockKey = `image-upload-$esm_browser_v4()}`; 22224 let imageIsUploading = false; 22225 maxUploadFileSize = maxUploadFileSize || getEditorSettings().maxUploadFileSize; 22226 const currentPost = getCurrentPost(); 22227 // Templates and template parts' numerical ID is stored in `wp_id`. 22228 const currentPostId = typeof currentPost?.id === 'number' ? currentPost.id : currentPost?.wp_id; 22229 const setSaveLock = () => { 22230 lockPostSaving(lockKey); 22231 lockPostAutosaving(lockKey); 22232 imageIsUploading = true; 22233 }; 22234 const postData = currentPostId ? { 22235 post: currentPostId 22236 } : {}; 22237 const clearSaveLock = () => { 22238 unlockPostSaving(lockKey); 22239 unlockPostAutosaving(lockKey); 22240 imageIsUploading = false; 22241 }; 22242 (0,external_wp_mediaUtils_namespaceObject.uploadMedia)({ 22243 allowedTypes, 22244 filesList, 22245 onFileChange: file => { 22246 if (!imageIsUploading) { 22247 setSaveLock(); 22248 } else { 22249 clearSaveLock(); 22250 } 22251 onFileChange(file); 22252 }, 22253 additionalData: { 22254 ...postData, 22255 ...additionalData 22256 }, 22257 maxUploadFileSize, 22258 onError: ({ 22259 message 22260 }) => { 22261 clearSaveLock(); 22262 onError(message); 22263 }, 22264 wpAllowedMimeTypes 22265 }); 22266 } 22267 22268 // EXTERNAL MODULE: ./node_modules/deepmerge/dist/cjs.js 22269 var cjs = __webpack_require__(66); 22270 var cjs_default = /*#__PURE__*/__webpack_require__.n(cjs); 22271 ;// CONCATENATED MODULE: ./node_modules/is-plain-object/dist/is-plain-object.mjs 22272 /*! 22273 * is-plain-object <https://github.com/jonschlinkert/is-plain-object> 22274 * 22275 * Copyright (c) 2014-2017, Jon Schlinkert. 22276 * Released under the MIT License. 22277 */ 22278 22279 function isObject(o) { 22280 return Object.prototype.toString.call(o) === '[object Object]'; 22281 } 22282 22283 function isPlainObject(o) { 22284 var ctor,prot; 22285 22286 if (isObject(o) === false) return false; 22287 22288 // If has modified constructor 22289 ctor = o.constructor; 22290 if (ctor === undefined) return true; 22291 22292 // If has modified prototype 22293 prot = ctor.prototype; 22294 if (isObject(prot) === false) return false; 22295 22296 // If constructor does not have an Object-specific method 22297 if (prot.hasOwnProperty('isPrototypeOf') === false) { 22298 return false; 22299 } 22300 22301 // Most likely a plain Object 22302 return true; 22303 } 22304 22305 22306 22307 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/global-styles-provider/index.js 22308 /** 22309 * External dependencies 22310 */ 22311 22312 22313 22314 /** 22315 * WordPress dependencies 22316 */ 22317 22318 22319 22320 22321 22322 /** 22323 * Internal dependencies 22324 */ 22325 22326 22327 const { 22328 GlobalStylesContext: global_styles_provider_GlobalStylesContext, 22329 cleanEmptyObject 22330 } = unlock(external_wp_blockEditor_namespaceObject.privateApis); 22331 function mergeBaseAndUserConfigs(base, user) { 22332 return cjs_default()(base, user, { 22333 /* 22334 * We only pass as arrays the presets, 22335 * in which case we want the new array of values 22336 * to override the old array (no merging). 22337 */ 22338 isMergeableObject: isPlainObject, 22339 /* 22340 * Exceptions to the above rule. 22341 * Background images should be replaced, not merged, 22342 * as they themselves are specific object definitions for the style. 22343 */ 22344 customMerge: key => { 22345 if (key === 'backgroundImage') { 22346 return (baseConfig, userConfig) => userConfig; 22347 } 22348 return undefined; 22349 } 22350 }); 22351 } 22352 function useGlobalStylesUserConfig() { 22353 const { 22354 globalStylesId, 22355 isReady, 22356 settings, 22357 styles, 22358 _links 22359 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 22360 const { 22361 getEntityRecord, 22362 getEditedEntityRecord, 22363 hasFinishedResolution, 22364 canUser 22365 } = select(external_wp_coreData_namespaceObject.store); 22366 const _globalStylesId = select(external_wp_coreData_namespaceObject.store).__experimentalGetCurrentGlobalStylesId(); 22367 let record; 22368 22369 // We want the global styles ID request to finish before triggering 22370 // the OPTIONS request for user capabilities, otherwise it will 22371 // fetch `/wp/v2/global-styles` instead of 22372 // `/wp/v2/global-styles/{id}`! 22373 // Please adjust the preloaded requests if this changes! 22374 const userCanEditGlobalStyles = _globalStylesId ? canUser('update', { 22375 kind: 'root', 22376 name: 'globalStyles', 22377 id: _globalStylesId 22378 }) : null; 22379 if (_globalStylesId && 22380 // We want the OPTIONS request for user capabilities to finish 22381 // before getting the records, otherwise we'll fetch both! 22382 typeof userCanEditGlobalStyles === 'boolean') { 22383 // Please adjust the preloaded requests if this changes! 22384 if (userCanEditGlobalStyles) { 22385 record = getEditedEntityRecord('root', 'globalStyles', _globalStylesId); 22386 } else { 22387 record = getEntityRecord('root', 'globalStyles', _globalStylesId, { 22388 context: 'view' 22389 }); 22390 } 22391 } 22392 let hasResolved = false; 22393 if (hasFinishedResolution('__experimentalGetCurrentGlobalStylesId')) { 22394 if (_globalStylesId) { 22395 hasResolved = userCanEditGlobalStyles ? hasFinishedResolution('getEditedEntityRecord', ['root', 'globalStyles', _globalStylesId]) : hasFinishedResolution('getEntityRecord', ['root', 'globalStyles', _globalStylesId, { 22396 context: 'view' 22397 }]); 22398 } else { 22399 hasResolved = true; 22400 } 22401 } 22402 return { 22403 globalStylesId: _globalStylesId, 22404 isReady: hasResolved, 22405 settings: record?.settings, 22406 styles: record?.styles, 22407 _links: record?._links 22408 }; 22409 }, []); 22410 const { 22411 getEditedEntityRecord 22412 } = (0,external_wp_data_namespaceObject.useSelect)(external_wp_coreData_namespaceObject.store); 22413 const { 22414 editEntityRecord 22415 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); 22416 const config = (0,external_wp_element_namespaceObject.useMemo)(() => { 22417 return { 22418 settings: settings !== null && settings !== void 0 ? settings : {}, 22419 styles: styles !== null && styles !== void 0 ? styles : {}, 22420 _links: _links !== null && _links !== void 0 ? _links : {} 22421 }; 22422 }, [settings, styles, _links]); 22423 const setConfig = (0,external_wp_element_namespaceObject.useCallback)( 22424 /** 22425 * Set the global styles config. 22426 * @param {Function|Object} callbackOrObject If the callbackOrObject is a function, pass the current config to the callback so the consumer can merge values. 22427 * Otherwise, overwrite the current config with the incoming object. 22428 * @param {Object} options Options for editEntityRecord Core selector. 22429 */ 22430 (callbackOrObject, options = {}) => { 22431 var _record$styles, _record$settings, _record$_links; 22432 const record = getEditedEntityRecord('root', 'globalStyles', globalStylesId); 22433 const currentConfig = { 22434 styles: (_record$styles = record?.styles) !== null && _record$styles !== void 0 ? _record$styles : {}, 22435 settings: (_record$settings = record?.settings) !== null && _record$settings !== void 0 ? _record$settings : {}, 22436 _links: (_record$_links = record?._links) !== null && _record$_links !== void 0 ? _record$_links : {} 22437 }; 22438 const updatedConfig = typeof callbackOrObject === 'function' ? callbackOrObject(currentConfig) : callbackOrObject; 22439 editEntityRecord('root', 'globalStyles', globalStylesId, { 22440 styles: cleanEmptyObject(updatedConfig.styles) || {}, 22441 settings: cleanEmptyObject(updatedConfig.settings) || {}, 22442 _links: cleanEmptyObject(updatedConfig._links) || {} 22443 }, options); 22444 }, [globalStylesId, editEntityRecord, getEditedEntityRecord]); 22445 return [isReady, config, setConfig]; 22446 } 22447 function useGlobalStylesBaseConfig() { 22448 const baseConfig = (0,external_wp_data_namespaceObject.useSelect)(select => select(external_wp_coreData_namespaceObject.store).__experimentalGetCurrentThemeBaseGlobalStyles(), []); 22449 return [!!baseConfig, baseConfig]; 22450 } 22451 function useGlobalStylesContext() { 22452 const [isUserConfigReady, userConfig, setUserConfig] = useGlobalStylesUserConfig(); 22453 const [isBaseConfigReady, baseConfig] = useGlobalStylesBaseConfig(); 22454 const mergedConfig = (0,external_wp_element_namespaceObject.useMemo)(() => { 22455 if (!baseConfig || !userConfig) { 22456 return {}; 22457 } 22458 return mergeBaseAndUserConfigs(baseConfig, userConfig); 22459 }, [userConfig, baseConfig]); 22460 const context = (0,external_wp_element_namespaceObject.useMemo)(() => { 22461 return { 22462 isReady: isUserConfigReady && isBaseConfigReady, 22463 user: userConfig, 22464 base: baseConfig, 22465 merged: mergedConfig, 22466 setUserConfig 22467 }; 22468 }, [mergedConfig, userConfig, baseConfig, setUserConfig, isUserConfigReady, isBaseConfigReady]); 22469 return context; 22470 } 22471 function GlobalStylesProvider({ 22472 children 22473 }) { 22474 const context = useGlobalStylesContext(); 22475 if (!context.isReady) { 22476 return null; 22477 } 22478 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(global_styles_provider_GlobalStylesContext.Provider, { 22479 value: context, 22480 children: children 22481 }); 22482 } 22483 22484 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/provider/use-block-editor-settings.js 22485 /** 22486 * WordPress dependencies 22487 */ 22488 22489 22490 22491 22492 22493 22494 22495 22496 22497 /** 22498 * Internal dependencies 22499 */ 22500 22501 22502 22503 22504 22505 const use_block_editor_settings_EMPTY_OBJECT = {}; 22506 function __experimentalReusableBlocksSelect(select) { 22507 const { 22508 getEntityRecords, 22509 hasFinishedResolution 22510 } = select(external_wp_coreData_namespaceObject.store); 22511 const reusableBlocks = getEntityRecords('postType', 'wp_block', { 22512 per_page: -1 22513 }); 22514 return hasFinishedResolution('getEntityRecords', ['postType', 'wp_block', { 22515 per_page: -1 22516 }]) ? reusableBlocks : undefined; 22517 } 22518 const BLOCK_EDITOR_SETTINGS = ['__experimentalBlockDirectory', '__experimentalDiscussionSettings', '__experimentalFeatures', '__experimentalGlobalStylesBaseStyles', 'alignWide', 'blockInspectorTabs', 'allowedMimeTypes', 'bodyPlaceholder', 'canLockBlocks', 'canUpdateBlockBindings', 'capabilities', 'clearBlockSelection', 'codeEditingEnabled', 'colors', 'disableCustomColors', 'disableCustomFontSizes', 'disableCustomSpacingSizes', 'disableCustomGradients', 'disableLayoutStyles', 'enableCustomLineHeight', 'enableCustomSpacing', 'enableCustomUnits', 'enableOpenverseMediaCategory', 'fontSizes', 'gradients', 'generateAnchors', 'onNavigateToEntityRecord', 'imageDefaultSize', 'imageDimensions', 'imageEditing', 'imageSizes', 'isRTL', 'locale', 'maxWidth', 'postContentAttributes', 'postsPerPage', 'readOnly', 'styles', 'titlePlaceholder', 'supportsLayout', 'widgetTypesToHideFromLegacyWidgetBlock', '__unstableHasCustomAppender', '__unstableIsPreviewMode', '__unstableResolvedAssets', '__unstableIsBlockBasedTheme']; 22519 const { 22520 globalStylesDataKey, 22521 globalStylesLinksDataKey, 22522 selectBlockPatternsKey, 22523 reusableBlocksSelectKey, 22524 sectionRootClientIdKey 22525 } = unlock(external_wp_blockEditor_namespaceObject.privateApis); 22526 22527 /** 22528 * React hook used to compute the block editor settings to use for the post editor. 22529 * 22530 * @param {Object} settings EditorProvider settings prop. 22531 * @param {string} postType Editor root level post type. 22532 * @param {string} postId Editor root level post ID. 22533 * @param {string} renderingMode Editor rendering mode. 22534 * 22535 * @return {Object} Block Editor Settings. 22536 */ 22537 function useBlockEditorSettings(settings, postType, postId, renderingMode) { 22538 var _mergedGlobalStyles$s, _mergedGlobalStyles$_, _settings$__experimen, _settings$__experimen2; 22539 const isLargeViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium'); 22540 const { 22541 allowRightClickOverrides, 22542 blockTypes, 22543 focusMode, 22544 hasFixedToolbar, 22545 isDistractionFree, 22546 keepCaretInsideBlock, 22547 hasUploadPermissions, 22548 hiddenBlockTypes, 22549 canUseUnfilteredHTML, 22550 userCanCreatePages, 22551 pageOnFront, 22552 pageForPosts, 22553 userPatternCategories, 22554 restBlockPatternCategories, 22555 sectionRootClientId 22556 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 22557 var _canUser; 22558 const { 22559 canUser, 22560 getRawEntityRecord, 22561 getEntityRecord, 22562 getUserPatternCategories, 22563 getBlockPatternCategories 22564 } = select(external_wp_coreData_namespaceObject.store); 22565 const { 22566 get 22567 } = select(external_wp_preferences_namespaceObject.store); 22568 const { 22569 getBlockTypes 22570 } = select(external_wp_blocks_namespaceObject.store); 22571 const { 22572 getBlocksByName, 22573 getBlockAttributes 22574 } = select(external_wp_blockEditor_namespaceObject.store); 22575 const siteSettings = canUser('read', { 22576 kind: 'root', 22577 name: 'site' 22578 }) ? getEntityRecord('root', 'site') : undefined; 22579 function getSectionRootBlock() { 22580 var _getBlocksByName$find; 22581 if (renderingMode === 'template-locked') { 22582 var _getBlocksByName$; 22583 return (_getBlocksByName$ = getBlocksByName('core/post-content')?.[0]) !== null && _getBlocksByName$ !== void 0 ? _getBlocksByName$ : ''; 22584 } 22585 return (_getBlocksByName$find = getBlocksByName('core/group').find(clientId => getBlockAttributes(clientId)?.tagName === 'main')) !== null && _getBlocksByName$find !== void 0 ? _getBlocksByName$find : ''; 22586 } 22587 return { 22588 allowRightClickOverrides: get('core', 'allowRightClickOverrides'), 22589 blockTypes: getBlockTypes(), 22590 canUseUnfilteredHTML: getRawEntityRecord('postType', postType, postId)?._links?.hasOwnProperty('wp:action-unfiltered-html'), 22591 focusMode: get('core', 'focusMode'), 22592 hasFixedToolbar: get('core', 'fixedToolbar') || !isLargeViewport, 22593 hiddenBlockTypes: get('core', 'hiddenBlockTypes'), 22594 isDistractionFree: get('core', 'distractionFree'), 22595 keepCaretInsideBlock: get('core', 'keepCaretInsideBlock'), 22596 hasUploadPermissions: (_canUser = canUser('create', { 22597 kind: 'root', 22598 name: 'media' 22599 })) !== null && _canUser !== void 0 ? _canUser : true, 22600 userCanCreatePages: canUser('create', { 22601 kind: 'postType', 22602 name: 'page' 22603 }), 22604 pageOnFront: siteSettings?.page_on_front, 22605 pageForPosts: siteSettings?.page_for_posts, 22606 userPatternCategories: getUserPatternCategories(), 22607 restBlockPatternCategories: getBlockPatternCategories(), 22608 sectionRootClientId: getSectionRootBlock() 22609 }; 22610 }, [postType, postId, isLargeViewport, renderingMode]); 22611 const { 22612 merged: mergedGlobalStyles 22613 } = useGlobalStylesContext(); 22614 const globalStylesData = (_mergedGlobalStyles$s = mergedGlobalStyles.styles) !== null && _mergedGlobalStyles$s !== void 0 ? _mergedGlobalStyles$s : use_block_editor_settings_EMPTY_OBJECT; 22615 const globalStylesLinksData = (_mergedGlobalStyles$_ = mergedGlobalStyles._links) !== null && _mergedGlobalStyles$_ !== void 0 ? _mergedGlobalStyles$_ : use_block_editor_settings_EMPTY_OBJECT; 22616 const settingsBlockPatterns = (_settings$__experimen = settings.__experimentalAdditionalBlockPatterns) !== null && _settings$__experimen !== void 0 ? _settings$__experimen : 22617 // WP 6.0 22618 settings.__experimentalBlockPatterns; // WP 5.9 22619 const settingsBlockPatternCategories = (_settings$__experimen2 = settings.__experimentalAdditionalBlockPatternCategories) !== null && _settings$__experimen2 !== void 0 ? _settings$__experimen2 : 22620 // WP 6.0 22621 settings.__experimentalBlockPatternCategories; // WP 5.9 22622 22623 const blockPatterns = (0,external_wp_element_namespaceObject.useMemo)(() => [...(settingsBlockPatterns || [])].filter(({ 22624 postTypes 22625 }) => { 22626 return !postTypes || Array.isArray(postTypes) && postTypes.includes(postType); 22627 }), [settingsBlockPatterns, postType]); 22628 const blockPatternCategories = (0,external_wp_element_namespaceObject.useMemo)(() => [...(settingsBlockPatternCategories || []), ...(restBlockPatternCategories || [])].filter((x, index, arr) => index === arr.findIndex(y => x.name === y.name)), [settingsBlockPatternCategories, restBlockPatternCategories]); 22629 const { 22630 undo, 22631 setIsInserterOpened 22632 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 22633 const { 22634 saveEntityRecord 22635 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); 22636 22637 /** 22638 * Creates a Post entity. 22639 * This is utilised by the Link UI to allow for on-the-fly creation of Posts/Pages. 22640 * 22641 * @param {Object} options parameters for the post being created. These mirror those used on 3rd param of saveEntityRecord. 22642 * @return {Object} the post type object that was created. 22643 */ 22644 const createPageEntity = (0,external_wp_element_namespaceObject.useCallback)(options => { 22645 if (!userCanCreatePages) { 22646 return Promise.reject({ 22647 message: (0,external_wp_i18n_namespaceObject.__)('You do not have permission to create Pages.') 22648 }); 22649 } 22650 return saveEntityRecord('postType', 'page', options); 22651 }, [saveEntityRecord, userCanCreatePages]); 22652 const allowedBlockTypes = (0,external_wp_element_namespaceObject.useMemo)(() => { 22653 // Omit hidden block types if exists and non-empty. 22654 if (hiddenBlockTypes && hiddenBlockTypes.length > 0) { 22655 // Defer to passed setting for `allowedBlockTypes` if provided as 22656 // anything other than `true` (where `true` is equivalent to allow 22657 // all block types). 22658 const defaultAllowedBlockTypes = true === settings.allowedBlockTypes ? blockTypes.map(({ 22659 name 22660 }) => name) : settings.allowedBlockTypes || []; 22661 return defaultAllowedBlockTypes.filter(type => !hiddenBlockTypes.includes(type)); 22662 } 22663 return settings.allowedBlockTypes; 22664 }, [settings.allowedBlockTypes, hiddenBlockTypes, blockTypes]); 22665 const forceDisableFocusMode = settings.focusMode === false; 22666 return (0,external_wp_element_namespaceObject.useMemo)(() => { 22667 const blockEditorSettings = { 22668 ...Object.fromEntries(Object.entries(settings).filter(([key]) => BLOCK_EDITOR_SETTINGS.includes(key))), 22669 [globalStylesDataKey]: globalStylesData, 22670 [globalStylesLinksDataKey]: globalStylesLinksData, 22671 allowedBlockTypes, 22672 allowRightClickOverrides, 22673 focusMode: focusMode && !forceDisableFocusMode, 22674 hasFixedToolbar, 22675 isDistractionFree, 22676 keepCaretInsideBlock, 22677 mediaUpload: hasUploadPermissions ? mediaUpload : undefined, 22678 __experimentalBlockPatterns: blockPatterns, 22679 [selectBlockPatternsKey]: select => { 22680 const { 22681 hasFinishedResolution, 22682 getBlockPatternsForPostType 22683 } = unlock(select(external_wp_coreData_namespaceObject.store)); 22684 const patterns = getBlockPatternsForPostType(postType); 22685 return hasFinishedResolution('getBlockPatterns') ? patterns : undefined; 22686 }, 22687 [reusableBlocksSelectKey]: __experimentalReusableBlocksSelect, 22688 __experimentalBlockPatternCategories: blockPatternCategories, 22689 __experimentalUserPatternCategories: userPatternCategories, 22690 __experimentalFetchLinkSuggestions: (search, searchOptions) => (0,external_wp_coreData_namespaceObject.__experimentalFetchLinkSuggestions)(search, searchOptions, settings), 22691 inserterMediaCategories: media_categories, 22692 __experimentalFetchRichUrlData: external_wp_coreData_namespaceObject.__experimentalFetchUrlData, 22693 // Todo: This only checks the top level post, not the post within a template or any other entity that can be edited. 22694 // This might be better as a generic "canUser" selector. 22695 __experimentalCanUserUseUnfilteredHTML: canUseUnfilteredHTML, 22696 //Todo: this is only needed for native and should probably be removed. 22697 __experimentalUndo: undo, 22698 // Check whether we want all site editor frames to have outlines 22699 // including the navigation / pattern / parts editors. 22700 outlineMode: !isDistractionFree && postType === 'wp_template', 22701 // Check these two properties: they were not present in the site editor. 22702 __experimentalCreatePageEntity: createPageEntity, 22703 __experimentalUserCanCreatePages: userCanCreatePages, 22704 pageOnFront, 22705 pageForPosts, 22706 __experimentalPreferPatternsOnRoot: postType === 'wp_template', 22707 templateLock: postType === 'wp_navigation' ? 'insert' : settings.templateLock, 22708 template: postType === 'wp_navigation' ? [['core/navigation', {}, []]] : settings.template, 22709 __experimentalSetIsInserterOpened: setIsInserterOpened, 22710 [sectionRootClientIdKey]: sectionRootClientId 22711 }; 22712 return blockEditorSettings; 22713 }, [allowedBlockTypes, allowRightClickOverrides, focusMode, forceDisableFocusMode, hasFixedToolbar, isDistractionFree, keepCaretInsideBlock, settings, hasUploadPermissions, userPatternCategories, blockPatterns, blockPatternCategories, canUseUnfilteredHTML, undo, createPageEntity, userCanCreatePages, pageOnFront, pageForPosts, postType, setIsInserterOpened, sectionRootClientId, globalStylesData, globalStylesLinksData]); 22714 } 22715 /* harmony default export */ const use_block_editor_settings = (useBlockEditorSettings); 22716 22717 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/provider/disable-non-page-content-blocks.js 22718 /** 22719 * WordPress dependencies 22720 */ 22721 22722 22723 22724 22725 22726 /** 22727 * Internal dependencies 22728 */ 22729 22730 22731 const POST_CONTENT_BLOCK_TYPES = ['core/post-title', 'core/post-featured-image', 'core/post-content']; 22732 22733 /** 22734 * Component that when rendered, makes it so that the site editor allows only 22735 * page content to be edited. 22736 */ 22737 function DisableNonPageContentBlocks() { 22738 const contentOnlyBlockTypes = (0,external_wp_element_namespaceObject.useMemo)(() => [...(0,external_wp_hooks_namespaceObject.applyFilters)('editor.postContentBlockTypes', POST_CONTENT_BLOCK_TYPES), 'core/template-part'], []); 22739 22740 // Note that there are two separate subscriptions because the result for each 22741 // returns a new array. 22742 const contentOnlyIds = (0,external_wp_data_namespaceObject.useSelect)(select => { 22743 const { 22744 getPostBlocksByName 22745 } = unlock(select(store_store)); 22746 return getPostBlocksByName(contentOnlyBlockTypes); 22747 }, [contentOnlyBlockTypes]); 22748 const disabledIds = (0,external_wp_data_namespaceObject.useSelect)(select => { 22749 const { 22750 getBlocksByName, 22751 getBlockOrder 22752 } = select(external_wp_blockEditor_namespaceObject.store); 22753 return getBlocksByName('core/template-part').flatMap(clientId => getBlockOrder(clientId)); 22754 }, []); 22755 const registry = (0,external_wp_data_namespaceObject.useRegistry)(); 22756 (0,external_wp_element_namespaceObject.useEffect)(() => { 22757 const { 22758 setBlockEditingMode, 22759 unsetBlockEditingMode 22760 } = registry.dispatch(external_wp_blockEditor_namespaceObject.store); 22761 registry.batch(() => { 22762 setBlockEditingMode('', 'disabled'); 22763 for (const clientId of contentOnlyIds) { 22764 setBlockEditingMode(clientId, 'contentOnly'); 22765 } 22766 for (const clientId of disabledIds) { 22767 setBlockEditingMode(clientId, 'disabled'); 22768 } 22769 }); 22770 return () => { 22771 registry.batch(() => { 22772 unsetBlockEditingMode(''); 22773 for (const clientId of contentOnlyIds) { 22774 unsetBlockEditingMode(clientId); 22775 } 22776 for (const clientId of disabledIds) { 22777 unsetBlockEditingMode(clientId); 22778 } 22779 }); 22780 }; 22781 }, [contentOnlyIds, disabledIds, registry]); 22782 return null; 22783 } 22784 22785 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/provider/navigation-block-editing-mode.js 22786 /** 22787 * WordPress dependencies 22788 */ 22789 22790 22791 22792 22793 /** 22794 * For the Navigation block editor, we need to force the block editor to contentOnly for that block. 22795 * 22796 * Set block editing mode to contentOnly when entering Navigation focus mode. 22797 * this ensures that non-content controls on the block will be hidden and thus 22798 * the user can focus on editing the Navigation Menu content only. 22799 */ 22800 22801 function NavigationBlockEditingMode() { 22802 // In the navigation block editor, 22803 // the navigation block is the only root block. 22804 const blockClientId = (0,external_wp_data_namespaceObject.useSelect)(select => select(external_wp_blockEditor_namespaceObject.store).getBlockOrder()?.[0], []); 22805 const { 22806 setBlockEditingMode, 22807 unsetBlockEditingMode 22808 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_blockEditor_namespaceObject.store); 22809 (0,external_wp_element_namespaceObject.useEffect)(() => { 22810 if (!blockClientId) { 22811 return; 22812 } 22813 setBlockEditingMode(blockClientId, 'contentOnly'); 22814 return () => { 22815 unsetBlockEditingMode(blockClientId); 22816 }; 22817 }, [blockClientId, unsetBlockEditingMode, setBlockEditingMode]); 22818 } 22819 22820 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/provider/use-hide-blocks-from-inserter.js 22821 /** 22822 * WordPress dependencies 22823 */ 22824 22825 22826 22827 // These post types are "structural" block lists. 22828 // We should be allowed to use 22829 // the post content and template parts blocks within them. 22830 const POST_TYPES_ALLOWING_POST_CONTENT_TEMPLATE_PART = ['wp_block', 'wp_template', 'wp_template_part']; 22831 22832 /** 22833 * In some specific contexts, 22834 * the template part and post content blocks need to be hidden. 22835 * 22836 * @param {string} postType Post Type 22837 * @param {string} mode Rendering mode 22838 */ 22839 function useHideBlocksFromInserter(postType, mode) { 22840 (0,external_wp_element_namespaceObject.useEffect)(() => { 22841 /* 22842 * Prevent adding template part in the editor. 22843 */ 22844 (0,external_wp_hooks_namespaceObject.addFilter)('blockEditor.__unstableCanInsertBlockType', 'removeTemplatePartsFromInserter', (canInsert, blockType) => { 22845 if (!POST_TYPES_ALLOWING_POST_CONTENT_TEMPLATE_PART.includes(postType) && blockType.name === 'core/template-part' && mode === 'post-only') { 22846 return false; 22847 } 22848 return canInsert; 22849 }); 22850 22851 /* 22852 * Prevent adding post content block (except in query block) in the editor. 22853 */ 22854 (0,external_wp_hooks_namespaceObject.addFilter)('blockEditor.__unstableCanInsertBlockType', 'removePostContentFromInserter', (canInsert, blockType, rootClientId, { 22855 getBlockParentsByBlockName 22856 }) => { 22857 if (!POST_TYPES_ALLOWING_POST_CONTENT_TEMPLATE_PART.includes(postType) && blockType.name === 'core/post-content') { 22858 return getBlockParentsByBlockName(rootClientId, 'core/query').length > 0; 22859 } 22860 return canInsert; 22861 }); 22862 return () => { 22863 (0,external_wp_hooks_namespaceObject.removeFilter)('blockEditor.__unstableCanInsertBlockType', 'removeTemplatePartsFromInserter'); 22864 (0,external_wp_hooks_namespaceObject.removeFilter)('blockEditor.__unstableCanInsertBlockType', 'removePostContentFromInserter'); 22865 }; 22866 }, [postType, mode]); 22867 } 22868 22869 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/keyboard.js 22870 /** 22871 * WordPress dependencies 22872 */ 22873 22874 22875 22876 const keyboard = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_primitives_namespaceObject.SVG, { 22877 xmlns: "http://www.w3.org/2000/svg", 22878 viewBox: "0 0 24 24", 22879 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 22880 d: "m16 15.5h-8v-1.5h8zm-7.5-2.5h-2v-2h2zm3 0h-2v-2h2zm3 0h-2v-2h2zm3 0h-2v-2h2zm-9-3h-2v-2h2zm3 0h-2v-2h2zm3 0h-2v-2h2zm3 0h-2v-2h2z" 22881 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 22882 d: "m18.5 6.5h-13a.5.5 0 0 0 -.5.5v9.5a.5.5 0 0 0 .5.5h13a.5.5 0 0 0 .5-.5v-9.5a.5.5 0 0 0 -.5-.5zm-13-1.5h13a2 2 0 0 1 2 2v9.5a2 2 0 0 1 -2 2h-13a2 2 0 0 1 -2-2v-9.5a2 2 0 0 1 2-2z" 22883 })] 22884 }); 22885 /* harmony default export */ const library_keyboard = (keyboard); 22886 22887 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/list-view.js 22888 /** 22889 * WordPress dependencies 22890 */ 22891 22892 22893 const listView = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 22894 viewBox: "0 0 24 24", 22895 xmlns: "http://www.w3.org/2000/svg", 22896 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 22897 d: "M3 6h11v1.5H3V6Zm3.5 5.5h11V13h-11v-1.5ZM21 17H10v1.5h11V17Z" 22898 }) 22899 }); 22900 /* harmony default export */ const list_view = (listView); 22901 22902 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/code.js 22903 /** 22904 * WordPress dependencies 22905 */ 22906 22907 22908 const code = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 22909 viewBox: "0 0 24 24", 22910 xmlns: "http://www.w3.org/2000/svg", 22911 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 22912 d: "M20.8 10.7l-4.3-4.3-1.1 1.1 4.3 4.3c.1.1.1.3 0 .4l-4.3 4.3 1.1 1.1 4.3-4.3c.7-.8.7-1.9 0-2.6zM4.2 11.8l4.3-4.3-1-1-4.3 4.3c-.7.7-.7 1.8 0 2.5l4.3 4.3 1.1-1.1-4.3-4.3c-.2-.1-.2-.3-.1-.4z" 22913 }) 22914 }); 22915 /* harmony default export */ const library_code = (code); 22916 22917 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/drawer-left.js 22918 /** 22919 * WordPress dependencies 22920 */ 22921 22922 22923 const drawerLeft = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 22924 width: "24", 22925 height: "24", 22926 xmlns: "http://www.w3.org/2000/svg", 22927 viewBox: "0 0 24 24", 22928 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 22929 fillRule: "evenodd", 22930 clipRule: "evenodd", 22931 d: "M18 4H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zM8.5 18.5H6c-.3 0-.5-.2-.5-.5V6c0-.3.2-.5.5-.5h2.5v13zm10-.5c0 .3-.2.5-.5.5h-8v-13h8c.3 0 .5.2.5.5v12z" 22932 }) 22933 }); 22934 /* harmony default export */ const drawer_left = (drawerLeft); 22935 22936 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/drawer-right.js 22937 /** 22938 * WordPress dependencies 22939 */ 22940 22941 22942 const drawerRight = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 22943 width: "24", 22944 height: "24", 22945 xmlns: "http://www.w3.org/2000/svg", 22946 viewBox: "0 0 24 24", 22947 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 22948 fillRule: "evenodd", 22949 clipRule: "evenodd", 22950 d: "M18 4H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-4 14.5H6c-.3 0-.5-.2-.5-.5V6c0-.3.2-.5.5-.5h8v13zm4.5-.5c0 .3-.2.5-.5.5h-2.5v-13H18c.3 0 .5.2.5.5v12z" 22951 }) 22952 }); 22953 /* harmony default export */ const drawer_right = (drawerRight); 22954 22955 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/block-default.js 22956 /** 22957 * WordPress dependencies 22958 */ 22959 22960 22961 const blockDefault = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 22962 xmlns: "http://www.w3.org/2000/svg", 22963 viewBox: "0 0 24 24", 22964 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 22965 d: "M19 8h-1V6h-5v2h-2V6H6v2H5c-1.1 0-2 .9-2 2v8c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-8c0-1.1-.9-2-2-2zm.5 10c0 .3-.2.5-.5.5H5c-.3 0-.5-.2-.5-.5v-8c0-.3.2-.5.5-.5h14c.3 0 .5.2.5.5v8z" 22966 }) 22967 }); 22968 /* harmony default export */ const block_default = (blockDefault); 22969 22970 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/format-list-bullets.js 22971 /** 22972 * WordPress dependencies 22973 */ 22974 22975 22976 const formatListBullets = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 22977 xmlns: "http://www.w3.org/2000/svg", 22978 viewBox: "0 0 24 24", 22979 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 22980 d: "M11.1 15.8H20v-1.5h-8.9v1.5zm0-8.6v1.5H20V7.2h-8.9zM6 13c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-7c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z" 22981 }) 22982 }); 22983 /* harmony default export */ const format_list_bullets = (formatListBullets); 22984 22985 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/pencil.js 22986 /** 22987 * WordPress dependencies 22988 */ 22989 22990 22991 const pencil = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 22992 xmlns: "http://www.w3.org/2000/svg", 22993 viewBox: "0 0 24 24", 22994 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 22995 d: "m19 7-3-3-8.5 8.5-1 4 4-1L19 7Zm-7 11.5H5V20h7v-1.5Z" 22996 }) 22997 }); 22998 /* harmony default export */ const library_pencil = (pencil); 22999 23000 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/edit.js 23001 /** 23002 * Internal dependencies 23003 */ 23004 23005 23006 /* harmony default export */ const edit = (library_pencil); 23007 23008 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/pattern-rename-modal/index.js 23009 /** 23010 * WordPress dependencies 23011 */ 23012 23013 23014 23015 23016 23017 /** 23018 * Internal dependencies 23019 */ 23020 23021 23022 23023 23024 const { 23025 RenamePatternModal 23026 } = unlock(external_wp_patterns_namespaceObject.privateApis); 23027 const modalName = 'editor/pattern-rename'; 23028 function PatternRenameModal() { 23029 const { 23030 record, 23031 postType 23032 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 23033 const { 23034 getCurrentPostType, 23035 getCurrentPostId 23036 } = select(store_store); 23037 const { 23038 getEditedEntityRecord 23039 } = select(external_wp_coreData_namespaceObject.store); 23040 const _postType = getCurrentPostType(); 23041 return { 23042 record: getEditedEntityRecord('postType', _postType, getCurrentPostId()), 23043 postType: _postType 23044 }; 23045 }, []); 23046 const { 23047 closeModal 23048 } = (0,external_wp_data_namespaceObject.useDispatch)(store); 23049 const isActive = (0,external_wp_data_namespaceObject.useSelect)(select => select(store).isModalActive(modalName)); 23050 if (!isActive || postType !== PATTERN_POST_TYPE) { 23051 return null; 23052 } 23053 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(RenamePatternModal, { 23054 onClose: closeModal, 23055 pattern: record 23056 }); 23057 } 23058 23059 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/pattern-duplicate-modal/index.js 23060 /** 23061 * WordPress dependencies 23062 */ 23063 23064 23065 23066 23067 23068 /** 23069 * Internal dependencies 23070 */ 23071 23072 23073 23074 23075 const { 23076 DuplicatePatternModal 23077 } = unlock(external_wp_patterns_namespaceObject.privateApis); 23078 const pattern_duplicate_modal_modalName = 'editor/pattern-duplicate'; 23079 function PatternDuplicateModal() { 23080 const { 23081 record, 23082 postType 23083 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 23084 const { 23085 getCurrentPostType, 23086 getCurrentPostId 23087 } = select(store_store); 23088 const { 23089 getEditedEntityRecord 23090 } = select(external_wp_coreData_namespaceObject.store); 23091 const _postType = getCurrentPostType(); 23092 return { 23093 record: getEditedEntityRecord('postType', _postType, getCurrentPostId()), 23094 postType: _postType 23095 }; 23096 }, []); 23097 const { 23098 closeModal 23099 } = (0,external_wp_data_namespaceObject.useDispatch)(store); 23100 const isActive = (0,external_wp_data_namespaceObject.useSelect)(select => select(store).isModalActive(pattern_duplicate_modal_modalName)); 23101 if (!isActive || postType !== PATTERN_POST_TYPE) { 23102 return null; 23103 } 23104 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(DuplicatePatternModal, { 23105 onClose: closeModal, 23106 onSuccess: () => closeModal(), 23107 pattern: record 23108 }); 23109 } 23110 23111 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/commands/index.js 23112 /** 23113 * WordPress dependencies 23114 */ 23115 23116 23117 23118 23119 23120 23121 23122 23123 23124 23125 /** 23126 * Internal dependencies 23127 */ 23128 23129 23130 23131 23132 function useEditorCommandLoader() { 23133 const { 23134 editorMode, 23135 isListViewOpen, 23136 showBlockBreadcrumbs, 23137 isDistractionFree, 23138 isTopToolbar, 23139 isFocusMode, 23140 isPreviewMode, 23141 isViewable, 23142 isCodeEditingEnabled, 23143 isRichEditingEnabled, 23144 isPublishSidebarEnabled 23145 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 23146 var _get, _getPostType$viewable; 23147 const { 23148 get 23149 } = select(external_wp_preferences_namespaceObject.store); 23150 const { 23151 isListViewOpened, 23152 getCurrentPostType, 23153 getEditorSettings 23154 } = select(store_store); 23155 const { 23156 getSettings 23157 } = select(external_wp_blockEditor_namespaceObject.store); 23158 const { 23159 getPostType 23160 } = select(external_wp_coreData_namespaceObject.store); 23161 return { 23162 editorMode: (_get = get('core', 'editorMode')) !== null && _get !== void 0 ? _get : 'visual', 23163 isListViewOpen: isListViewOpened(), 23164 showBlockBreadcrumbs: get('core', 'showBlockBreadcrumbs'), 23165 isDistractionFree: get('core', 'distractionFree'), 23166 isFocusMode: get('core', 'focusMode'), 23167 isTopToolbar: get('core', 'fixedToolbar'), 23168 isPreviewMode: getSettings().__unstableIsPreviewMode, 23169 isViewable: (_getPostType$viewable = getPostType(getCurrentPostType())?.viewable) !== null && _getPostType$viewable !== void 0 ? _getPostType$viewable : false, 23170 isCodeEditingEnabled: getEditorSettings().codeEditingEnabled, 23171 isRichEditingEnabled: getEditorSettings().richEditingEnabled, 23172 isPublishSidebarEnabled: select(store_store).isPublishSidebarEnabled() 23173 }; 23174 }, []); 23175 const { 23176 getActiveComplementaryArea 23177 } = (0,external_wp_data_namespaceObject.useSelect)(store); 23178 const { 23179 toggle 23180 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_preferences_namespaceObject.store); 23181 const { 23182 createInfoNotice 23183 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); 23184 const { 23185 __unstableSaveForPreview, 23186 setIsListViewOpened, 23187 switchEditorMode, 23188 toggleDistractionFree 23189 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 23190 const { 23191 openModal, 23192 enableComplementaryArea, 23193 disableComplementaryArea 23194 } = (0,external_wp_data_namespaceObject.useDispatch)(store); 23195 const { 23196 getCurrentPostId 23197 } = (0,external_wp_data_namespaceObject.useSelect)(store_store); 23198 const allowSwitchEditorMode = isCodeEditingEnabled && isRichEditingEnabled; 23199 if (isPreviewMode) { 23200 return { 23201 commands: [], 23202 isLoading: false 23203 }; 23204 } 23205 const commands = []; 23206 commands.push({ 23207 name: 'core/open-shortcut-help', 23208 label: (0,external_wp_i18n_namespaceObject.__)('Keyboard shortcuts'), 23209 icon: library_keyboard, 23210 callback: ({ 23211 close 23212 }) => { 23213 close(); 23214 openModal('editor/keyboard-shortcut-help'); 23215 } 23216 }); 23217 commands.push({ 23218 name: 'core/toggle-distraction-free', 23219 label: isDistractionFree ? (0,external_wp_i18n_namespaceObject.__)('Exit Distraction Free') : (0,external_wp_i18n_namespaceObject.__)('Enter Distraction Free'), 23220 callback: ({ 23221 close 23222 }) => { 23223 toggleDistractionFree(); 23224 close(); 23225 } 23226 }); 23227 commands.push({ 23228 name: 'core/open-preferences', 23229 label: (0,external_wp_i18n_namespaceObject.__)('Editor preferences'), 23230 callback: ({ 23231 close 23232 }) => { 23233 close(); 23234 openModal('editor/preferences'); 23235 } 23236 }); 23237 commands.push({ 23238 name: 'core/toggle-spotlight-mode', 23239 label: (0,external_wp_i18n_namespaceObject.__)('Toggle spotlight'), 23240 callback: ({ 23241 close 23242 }) => { 23243 toggle('core', 'focusMode'); 23244 close(); 23245 createInfoNotice(isFocusMode ? (0,external_wp_i18n_namespaceObject.__)('Spotlight off.') : (0,external_wp_i18n_namespaceObject.__)('Spotlight on.'), { 23246 id: 'core/editor/toggle-spotlight-mode/notice', 23247 type: 'snackbar', 23248 actions: [{ 23249 label: (0,external_wp_i18n_namespaceObject.__)('Undo'), 23250 onClick: () => { 23251 toggle('core', 'focusMode'); 23252 } 23253 }] 23254 }); 23255 } 23256 }); 23257 commands.push({ 23258 name: 'core/toggle-list-view', 23259 label: isListViewOpen ? (0,external_wp_i18n_namespaceObject.__)('Close List View') : (0,external_wp_i18n_namespaceObject.__)('Open List View'), 23260 icon: list_view, 23261 callback: ({ 23262 close 23263 }) => { 23264 setIsListViewOpened(!isListViewOpen); 23265 close(); 23266 createInfoNotice(isListViewOpen ? (0,external_wp_i18n_namespaceObject.__)('List View off.') : (0,external_wp_i18n_namespaceObject.__)('List View on.'), { 23267 id: 'core/editor/toggle-list-view/notice', 23268 type: 'snackbar' 23269 }); 23270 } 23271 }); 23272 commands.push({ 23273 name: 'core/toggle-top-toolbar', 23274 label: (0,external_wp_i18n_namespaceObject.__)('Toggle top toolbar'), 23275 callback: ({ 23276 close 23277 }) => { 23278 toggle('core', 'fixedToolbar'); 23279 if (isDistractionFree) { 23280 toggleDistractionFree(); 23281 } 23282 close(); 23283 createInfoNotice(isTopToolbar ? (0,external_wp_i18n_namespaceObject.__)('Top toolbar off.') : (0,external_wp_i18n_namespaceObject.__)('Top toolbar on.'), { 23284 id: 'core/editor/toggle-top-toolbar/notice', 23285 type: 'snackbar', 23286 actions: [{ 23287 label: (0,external_wp_i18n_namespaceObject.__)('Undo'), 23288 onClick: () => { 23289 toggle('core', 'fixedToolbar'); 23290 } 23291 }] 23292 }); 23293 } 23294 }); 23295 if (allowSwitchEditorMode) { 23296 commands.push({ 23297 name: 'core/toggle-code-editor', 23298 label: editorMode === 'visual' ? (0,external_wp_i18n_namespaceObject.__)('Open code editor') : (0,external_wp_i18n_namespaceObject.__)('Exit code editor'), 23299 icon: library_code, 23300 callback: ({ 23301 close 23302 }) => { 23303 switchEditorMode(editorMode === 'visual' ? 'text' : 'visual'); 23304 close(); 23305 } 23306 }); 23307 } 23308 commands.push({ 23309 name: 'core/toggle-breadcrumbs', 23310 label: showBlockBreadcrumbs ? (0,external_wp_i18n_namespaceObject.__)('Hide block breadcrumbs') : (0,external_wp_i18n_namespaceObject.__)('Show block breadcrumbs'), 23311 callback: ({ 23312 close 23313 }) => { 23314 toggle('core', 'showBlockBreadcrumbs'); 23315 close(); 23316 createInfoNotice(showBlockBreadcrumbs ? (0,external_wp_i18n_namespaceObject.__)('Breadcrumbs hidden.') : (0,external_wp_i18n_namespaceObject.__)('Breadcrumbs visible.'), { 23317 id: 'core/editor/toggle-breadcrumbs/notice', 23318 type: 'snackbar' 23319 }); 23320 } 23321 }); 23322 commands.push({ 23323 name: 'core/open-settings-sidebar', 23324 label: (0,external_wp_i18n_namespaceObject.__)('Toggle settings sidebar'), 23325 icon: (0,external_wp_i18n_namespaceObject.isRTL)() ? drawer_left : drawer_right, 23326 callback: ({ 23327 close 23328 }) => { 23329 const activeSidebar = getActiveComplementaryArea('core'); 23330 close(); 23331 if (activeSidebar === 'edit-post/document') { 23332 disableComplementaryArea('core'); 23333 } else { 23334 enableComplementaryArea('core', 'edit-post/document'); 23335 } 23336 } 23337 }); 23338 commands.push({ 23339 name: 'core/open-block-inspector', 23340 label: (0,external_wp_i18n_namespaceObject.__)('Toggle block inspector'), 23341 icon: block_default, 23342 callback: ({ 23343 close 23344 }) => { 23345 const activeSidebar = getActiveComplementaryArea('core'); 23346 close(); 23347 if (activeSidebar === 'edit-post/block') { 23348 disableComplementaryArea('core'); 23349 } else { 23350 enableComplementaryArea('core', 'edit-post/block'); 23351 } 23352 } 23353 }); 23354 commands.push({ 23355 name: 'core/toggle-publish-sidebar', 23356 label: isPublishSidebarEnabled ? (0,external_wp_i18n_namespaceObject.__)('Disable pre-publish checks') : (0,external_wp_i18n_namespaceObject.__)('Enable pre-publish checks'), 23357 icon: format_list_bullets, 23358 callback: ({ 23359 close 23360 }) => { 23361 close(); 23362 toggle('core', 'isPublishSidebarEnabled'); 23363 createInfoNotice(isPublishSidebarEnabled ? (0,external_wp_i18n_namespaceObject.__)('Pre-publish checks disabled.') : (0,external_wp_i18n_namespaceObject.__)('Pre-publish checks enabled.'), { 23364 id: 'core/editor/publish-sidebar/notice', 23365 type: 'snackbar' 23366 }); 23367 } 23368 }); 23369 if (isViewable) { 23370 commands.push({ 23371 name: 'core/preview-link', 23372 label: (0,external_wp_i18n_namespaceObject.__)('Preview in a new tab'), 23373 icon: library_external, 23374 callback: async ({ 23375 close 23376 }) => { 23377 close(); 23378 const postId = getCurrentPostId(); 23379 const link = await __unstableSaveForPreview(); 23380 window.open(link, `wp-preview-$postId}`); 23381 } 23382 }); 23383 } 23384 return { 23385 commands, 23386 isLoading: false 23387 }; 23388 } 23389 function useEditedEntityContextualCommands() { 23390 const { 23391 postType 23392 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 23393 const { 23394 getCurrentPostType 23395 } = select(store_store); 23396 return { 23397 postType: getCurrentPostType() 23398 }; 23399 }, []); 23400 const { 23401 openModal 23402 } = (0,external_wp_data_namespaceObject.useDispatch)(store); 23403 const commands = []; 23404 if (postType === PATTERN_POST_TYPE) { 23405 commands.push({ 23406 name: 'core/rename-pattern', 23407 label: (0,external_wp_i18n_namespaceObject.__)('Rename pattern'), 23408 icon: edit, 23409 callback: ({ 23410 close 23411 }) => { 23412 openModal(modalName); 23413 close(); 23414 } 23415 }); 23416 commands.push({ 23417 name: 'core/duplicate-pattern', 23418 label: (0,external_wp_i18n_namespaceObject.__)('Duplicate pattern'), 23419 icon: library_symbol, 23420 callback: ({ 23421 close 23422 }) => { 23423 openModal(pattern_duplicate_modal_modalName); 23424 close(); 23425 } 23426 }); 23427 } 23428 return { 23429 isLoading: false, 23430 commands 23431 }; 23432 } 23433 function useCommands() { 23434 (0,external_wp_commands_namespaceObject.useCommandLoader)({ 23435 name: 'core/editor/edit-ui', 23436 hook: useEditorCommandLoader 23437 }); 23438 (0,external_wp_commands_namespaceObject.useCommandLoader)({ 23439 name: 'core/editor/contextual-commands', 23440 hook: useEditedEntityContextualCommands, 23441 context: 'entity-edit' 23442 }); 23443 } 23444 23445 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-removal-warnings/index.js 23446 /** 23447 * WordPress dependencies 23448 */ 23449 23450 23451 23452 23453 23454 23455 /** 23456 * Internal dependencies 23457 */ 23458 23459 23460 23461 const { 23462 BlockRemovalWarningModal 23463 } = unlock(external_wp_blockEditor_namespaceObject.privateApis); 23464 23465 // Prevent accidental removal of certain blocks, asking the user for confirmation first. 23466 const TEMPLATE_BLOCKS = ['core/post-content', 'core/post-template', 'core/query']; 23467 const BLOCK_REMOVAL_RULES = [{ 23468 // Template blocks. 23469 // The warning is only shown when a user manipulates templates or template parts. 23470 postTypes: ['wp_template', 'wp_template_part'], 23471 callback(removedBlocks) { 23472 const removedTemplateBlocks = removedBlocks.filter(({ 23473 name 23474 }) => TEMPLATE_BLOCKS.includes(name)); 23475 if (removedTemplateBlocks.length) { 23476 return (0,external_wp_i18n_namespaceObject._n)('Deleting this block will stop your post or page content from displaying on this template. It is not recommended.', 'Some of the deleted blocks will stop your post or page content from displaying on this template. It is not recommended.', removedBlocks.length); 23477 } 23478 } 23479 }, { 23480 // Pattern overrides. 23481 // The warning is only shown when the user edits a pattern. 23482 postTypes: ['wp_block'], 23483 callback(removedBlocks) { 23484 const removedBlocksWithOverrides = removedBlocks.filter(({ 23485 attributes 23486 }) => attributes?.metadata?.bindings && Object.values(attributes.metadata.bindings).some(binding => binding.source === 'core/pattern-overrides')); 23487 if (removedBlocksWithOverrides.length) { 23488 return (0,external_wp_i18n_namespaceObject._n)('The deleted block allows instance overrides. Removing it may result in content not displaying where this pattern is used. Are you sure you want to proceed?', 'Some of the deleted blocks allow instance overrides. Removing them may result in content not displaying where this pattern is used. Are you sure you want to proceed?', removedBlocks.length); 23489 } 23490 } 23491 }]; 23492 function BlockRemovalWarnings() { 23493 const currentPostType = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getCurrentPostType(), []); 23494 const removalRulesForPostType = (0,external_wp_element_namespaceObject.useMemo)(() => BLOCK_REMOVAL_RULES.filter(rule => rule.postTypes.includes(currentPostType)), [currentPostType]); 23495 23496 // `BlockRemovalWarnings` is rendered in the editor provider, a shared component 23497 // across react native and web. However, `BlockRemovalWarningModal` is web only. 23498 // Check it exists before trying to render it. 23499 if (!BlockRemovalWarningModal) { 23500 return null; 23501 } 23502 if (!removalRulesForPostType) { 23503 return null; 23504 } 23505 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(BlockRemovalWarningModal, { 23506 rules: removalRulesForPostType 23507 }); 23508 } 23509 23510 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/start-page-options/index.js 23511 /** 23512 * WordPress dependencies 23513 */ 23514 23515 23516 23517 23518 23519 23520 23521 23522 23523 23524 23525 /** 23526 * Internal dependencies 23527 */ 23528 23529 23530 23531 function useStartPatterns() { 23532 // A pattern is a start pattern if it includes 'core/post-content' in its blockTypes, 23533 // and it has no postTypes declared and the current post type is page or if 23534 // the current post type is part of the postTypes declared. 23535 const { 23536 blockPatternsWithPostContentBlockType, 23537 postType 23538 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 23539 const { 23540 getPatternsByBlockTypes, 23541 getBlocksByName 23542 } = select(external_wp_blockEditor_namespaceObject.store); 23543 const { 23544 getCurrentPostType, 23545 getRenderingMode 23546 } = select(store_store); 23547 const rootClientId = getRenderingMode() === 'post-only' ? '' : getBlocksByName('core/post-content')?.[0]; 23548 return { 23549 blockPatternsWithPostContentBlockType: getPatternsByBlockTypes('core/post-content', rootClientId), 23550 postType: getCurrentPostType() 23551 }; 23552 }, []); 23553 return (0,external_wp_element_namespaceObject.useMemo)(() => { 23554 if (!blockPatternsWithPostContentBlockType?.length) { 23555 return []; 23556 } 23557 23558 /* 23559 * Filter patterns without postTypes declared if the current postType is page 23560 * or patterns that declare the current postType in its post type array. 23561 */ 23562 return blockPatternsWithPostContentBlockType.filter(pattern => { 23563 return postType === 'page' && !pattern.postTypes || Array.isArray(pattern.postTypes) && pattern.postTypes.includes(postType); 23564 }); 23565 }, [postType, blockPatternsWithPostContentBlockType]); 23566 } 23567 function PatternSelection({ 23568 blockPatterns, 23569 onChoosePattern 23570 }) { 23571 const shownBlockPatterns = (0,external_wp_compose_namespaceObject.useAsyncList)(blockPatterns); 23572 const { 23573 editEntityRecord 23574 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); 23575 const { 23576 postType, 23577 postId 23578 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 23579 const { 23580 getCurrentPostType, 23581 getCurrentPostId 23582 } = select(store_store); 23583 return { 23584 postType: getCurrentPostType(), 23585 postId: getCurrentPostId() 23586 }; 23587 }, []); 23588 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalBlockPatternsList, { 23589 blockPatterns: blockPatterns, 23590 shownPatterns: shownBlockPatterns, 23591 onClickPattern: (_pattern, blocks) => { 23592 editEntityRecord('postType', postType, postId, { 23593 blocks, 23594 content: ({ 23595 blocks: blocksForSerialization = [] 23596 }) => (0,external_wp_blocks_namespaceObject.__unstableSerializeAndClean)(blocksForSerialization) 23597 }); 23598 onChoosePattern(); 23599 } 23600 }); 23601 } 23602 function StartPageOptionsModal({ 23603 onClose 23604 }) { 23605 const startPatterns = useStartPatterns(); 23606 const hasStartPattern = startPatterns.length > 0; 23607 if (!hasStartPattern) { 23608 return null; 23609 } 23610 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Modal, { 23611 title: (0,external_wp_i18n_namespaceObject.__)('Choose a pattern'), 23612 isFullScreen: true, 23613 onRequestClose: onClose, 23614 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 23615 className: "editor-start-page-options__modal-content", 23616 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PatternSelection, { 23617 blockPatterns: startPatterns, 23618 onChoosePattern: onClose 23619 }) 23620 }) 23621 }); 23622 } 23623 function StartPageOptions() { 23624 const [isClosed, setIsClosed] = (0,external_wp_element_namespaceObject.useState)(false); 23625 const shouldEnableModal = (0,external_wp_data_namespaceObject.useSelect)(select => { 23626 const { 23627 isEditedPostDirty, 23628 isEditedPostEmpty, 23629 getCurrentPostType 23630 } = select(store_store); 23631 const preferencesModalActive = select(store).isModalActive('editor/preferences'); 23632 const choosePatternModalEnabled = select(external_wp_preferences_namespaceObject.store).get('core', 'enableChoosePatternModal'); 23633 return choosePatternModalEnabled && !preferencesModalActive && !isEditedPostDirty() && isEditedPostEmpty() && TEMPLATE_POST_TYPE !== getCurrentPostType(); 23634 }, []); 23635 if (!shouldEnableModal || isClosed) { 23636 return null; 23637 } 23638 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(StartPageOptionsModal, { 23639 onClose: () => setIsClosed(true) 23640 }); 23641 } 23642 23643 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/keyboard-shortcut-help-modal/config.js 23644 /** 23645 * WordPress dependencies 23646 */ 23647 23648 const textFormattingShortcuts = [{ 23649 keyCombination: { 23650 modifier: 'primary', 23651 character: 'b' 23652 }, 23653 description: (0,external_wp_i18n_namespaceObject.__)('Make the selected text bold.') 23654 }, { 23655 keyCombination: { 23656 modifier: 'primary', 23657 character: 'i' 23658 }, 23659 description: (0,external_wp_i18n_namespaceObject.__)('Make the selected text italic.') 23660 }, { 23661 keyCombination: { 23662 modifier: 'primary', 23663 character: 'k' 23664 }, 23665 description: (0,external_wp_i18n_namespaceObject.__)('Convert the selected text into a link.') 23666 }, { 23667 keyCombination: { 23668 modifier: 'primaryShift', 23669 character: 'k' 23670 }, 23671 description: (0,external_wp_i18n_namespaceObject.__)('Remove a link.') 23672 }, { 23673 keyCombination: { 23674 character: '[[' 23675 }, 23676 description: (0,external_wp_i18n_namespaceObject.__)('Insert a link to a post or page.') 23677 }, { 23678 keyCombination: { 23679 modifier: 'primary', 23680 character: 'u' 23681 }, 23682 description: (0,external_wp_i18n_namespaceObject.__)('Underline the selected text.') 23683 }, { 23684 keyCombination: { 23685 modifier: 'access', 23686 character: 'd' 23687 }, 23688 description: (0,external_wp_i18n_namespaceObject.__)('Strikethrough the selected text.') 23689 }, { 23690 keyCombination: { 23691 modifier: 'access', 23692 character: 'x' 23693 }, 23694 description: (0,external_wp_i18n_namespaceObject.__)('Make the selected text inline code.') 23695 }, { 23696 keyCombination: { 23697 modifier: 'access', 23698 character: '0' 23699 }, 23700 aliases: [{ 23701 modifier: 'access', 23702 character: '7' 23703 }], 23704 description: (0,external_wp_i18n_namespaceObject.__)('Convert the current heading to a paragraph.') 23705 }, { 23706 keyCombination: { 23707 modifier: 'access', 23708 character: '1-6' 23709 }, 23710 description: (0,external_wp_i18n_namespaceObject.__)('Convert the current paragraph or heading to a heading of level 1 to 6.') 23711 }, { 23712 keyCombination: { 23713 modifier: 'primaryShift', 23714 character: 'SPACE' 23715 }, 23716 description: (0,external_wp_i18n_namespaceObject.__)('Add non breaking space.') 23717 }]; 23718 23719 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/keyboard-shortcut-help-modal/shortcut.js 23720 /** 23721 * WordPress dependencies 23722 */ 23723 23724 23725 23726 23727 23728 function KeyCombination({ 23729 keyCombination, 23730 forceAriaLabel 23731 }) { 23732 const shortcut = keyCombination.modifier ? external_wp_keycodes_namespaceObject.displayShortcutList[keyCombination.modifier](keyCombination.character) : keyCombination.character; 23733 const ariaLabel = keyCombination.modifier ? external_wp_keycodes_namespaceObject.shortcutAriaLabel[keyCombination.modifier](keyCombination.character) : keyCombination.character; 23734 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("kbd", { 23735 className: "editor-keyboard-shortcut-help-modal__shortcut-key-combination", 23736 "aria-label": forceAriaLabel || ariaLabel, 23737 children: (Array.isArray(shortcut) ? shortcut : [shortcut]).map((character, index) => { 23738 if (character === '+') { 23739 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_element_namespaceObject.Fragment, { 23740 children: character 23741 }, index); 23742 } 23743 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("kbd", { 23744 className: "editor-keyboard-shortcut-help-modal__shortcut-key", 23745 children: character 23746 }, index); 23747 }) 23748 }); 23749 } 23750 function Shortcut({ 23751 description, 23752 keyCombination, 23753 aliases = [], 23754 ariaLabel 23755 }) { 23756 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 23757 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 23758 className: "editor-keyboard-shortcut-help-modal__shortcut-description", 23759 children: description 23760 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 23761 className: "editor-keyboard-shortcut-help-modal__shortcut-term", 23762 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(KeyCombination, { 23763 keyCombination: keyCombination, 23764 forceAriaLabel: ariaLabel 23765 }), aliases.map((alias, index) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(KeyCombination, { 23766 keyCombination: alias, 23767 forceAriaLabel: ariaLabel 23768 }, index))] 23769 })] 23770 }); 23771 } 23772 /* harmony default export */ const keyboard_shortcut_help_modal_shortcut = (Shortcut); 23773 23774 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/keyboard-shortcut-help-modal/dynamic-shortcut.js 23775 /** 23776 * WordPress dependencies 23777 */ 23778 23779 23780 23781 /** 23782 * Internal dependencies 23783 */ 23784 23785 23786 function DynamicShortcut({ 23787 name 23788 }) { 23789 const { 23790 keyCombination, 23791 description, 23792 aliases 23793 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 23794 const { 23795 getShortcutKeyCombination, 23796 getShortcutDescription, 23797 getShortcutAliases 23798 } = select(external_wp_keyboardShortcuts_namespaceObject.store); 23799 return { 23800 keyCombination: getShortcutKeyCombination(name), 23801 aliases: getShortcutAliases(name), 23802 description: getShortcutDescription(name) 23803 }; 23804 }, [name]); 23805 if (!keyCombination) { 23806 return null; 23807 } 23808 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(keyboard_shortcut_help_modal_shortcut, { 23809 keyCombination: keyCombination, 23810 description: description, 23811 aliases: aliases 23812 }); 23813 } 23814 /* harmony default export */ const dynamic_shortcut = (DynamicShortcut); 23815 23816 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/keyboard-shortcut-help-modal/index.js 23817 /** 23818 * External dependencies 23819 */ 23820 23821 23822 /** 23823 * WordPress dependencies 23824 */ 23825 23826 23827 23828 23829 23830 23831 /** 23832 * Internal dependencies 23833 */ 23834 23835 23836 23837 23838 23839 const KEYBOARD_SHORTCUT_HELP_MODAL_NAME = 'editor/keyboard-shortcut-help'; 23840 const ShortcutList = ({ 23841 shortcuts 23842 }) => 23843 /*#__PURE__*/ 23844 /* 23845 * Disable reason: The `list` ARIA role is redundant but 23846 * Safari+VoiceOver won't announce the list otherwise. 23847 */ 23848 /* eslint-disable jsx-a11y/no-redundant-roles */ 23849 (0,external_ReactJSXRuntime_namespaceObject.jsx)("ul", { 23850 className: "editor-keyboard-shortcut-help-modal__shortcut-list", 23851 role: "list", 23852 children: shortcuts.map((shortcut, index) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("li", { 23853 className: "editor-keyboard-shortcut-help-modal__shortcut", 23854 children: typeof shortcut === 'string' ? /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(dynamic_shortcut, { 23855 name: shortcut 23856 }) : /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(keyboard_shortcut_help_modal_shortcut, { 23857 ...shortcut 23858 }) 23859 }, index)) 23860 }) 23861 /* eslint-enable jsx-a11y/no-redundant-roles */; 23862 const ShortcutSection = ({ 23863 title, 23864 shortcuts, 23865 className 23866 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("section", { 23867 className: dist_clsx('editor-keyboard-shortcut-help-modal__section', className), 23868 children: [!!title && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("h2", { 23869 className: "editor-keyboard-shortcut-help-modal__section-title", 23870 children: title 23871 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ShortcutList, { 23872 shortcuts: shortcuts 23873 })] 23874 }); 23875 const ShortcutCategorySection = ({ 23876 title, 23877 categoryName, 23878 additionalShortcuts = [] 23879 }) => { 23880 const categoryShortcuts = (0,external_wp_data_namespaceObject.useSelect)(select => { 23881 return select(external_wp_keyboardShortcuts_namespaceObject.store).getCategoryShortcuts(categoryName); 23882 }, [categoryName]); 23883 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ShortcutSection, { 23884 title: title, 23885 shortcuts: categoryShortcuts.concat(additionalShortcuts) 23886 }); 23887 }; 23888 function KeyboardShortcutHelpModal() { 23889 const isModalActive = (0,external_wp_data_namespaceObject.useSelect)(select => select(store).isModalActive(KEYBOARD_SHORTCUT_HELP_MODAL_NAME), []); 23890 const { 23891 openModal, 23892 closeModal 23893 } = (0,external_wp_data_namespaceObject.useDispatch)(store); 23894 const toggleModal = () => { 23895 if (isModalActive) { 23896 closeModal(); 23897 } else { 23898 openModal(KEYBOARD_SHORTCUT_HELP_MODAL_NAME); 23899 } 23900 }; 23901 (0,external_wp_keyboardShortcuts_namespaceObject.useShortcut)('core/editor/keyboard-shortcuts', toggleModal); 23902 if (!isModalActive) { 23903 return null; 23904 } 23905 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.Modal, { 23906 className: "editor-keyboard-shortcut-help-modal", 23907 title: (0,external_wp_i18n_namespaceObject.__)('Keyboard shortcuts'), 23908 closeButtonLabel: (0,external_wp_i18n_namespaceObject.__)('Close'), 23909 onRequestClose: toggleModal, 23910 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ShortcutSection, { 23911 className: "editor-keyboard-shortcut-help-modal__main-shortcuts", 23912 shortcuts: ['core/editor/keyboard-shortcuts'] 23913 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ShortcutCategorySection, { 23914 title: (0,external_wp_i18n_namespaceObject.__)('Global shortcuts'), 23915 categoryName: "global" 23916 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ShortcutCategorySection, { 23917 title: (0,external_wp_i18n_namespaceObject.__)('Selection shortcuts'), 23918 categoryName: "selection" 23919 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ShortcutCategorySection, { 23920 title: (0,external_wp_i18n_namespaceObject.__)('Block shortcuts'), 23921 categoryName: "block", 23922 additionalShortcuts: [{ 23923 keyCombination: { 23924 character: '/' 23925 }, 23926 description: (0,external_wp_i18n_namespaceObject.__)('Change the block type after adding a new paragraph.'), 23927 /* translators: The forward-slash character. e.g. '/'. */ 23928 ariaLabel: (0,external_wp_i18n_namespaceObject.__)('Forward-slash') 23929 }] 23930 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ShortcutSection, { 23931 title: (0,external_wp_i18n_namespaceObject.__)('Text formatting'), 23932 shortcuts: textFormattingShortcuts 23933 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ShortcutCategorySection, { 23934 title: (0,external_wp_i18n_namespaceObject.__)('List View shortcuts'), 23935 categoryName: "list-view" 23936 })] 23937 }); 23938 } 23939 /* harmony default export */ const keyboard_shortcut_help_modal = (KeyboardShortcutHelpModal); 23940 23941 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-settings-menu/content-only-settings-menu.js 23942 /** 23943 * WordPress dependencies 23944 */ 23945 23946 23947 23948 23949 23950 23951 /** 23952 * Internal dependencies 23953 */ 23954 23955 23956 23957 23958 23959 function ContentOnlySettingsMenuItems({ 23960 clientId, 23961 onClose 23962 }) { 23963 const { 23964 entity, 23965 onNavigateToEntityRecord, 23966 canEditTemplates 23967 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 23968 const { 23969 getBlockEditingMode, 23970 getBlockParentsByBlockName, 23971 getSettings, 23972 getBlockAttributes 23973 } = select(external_wp_blockEditor_namespaceObject.store); 23974 const contentOnly = getBlockEditingMode(clientId) === 'contentOnly'; 23975 if (!contentOnly) { 23976 return {}; 23977 } 23978 const patternParent = getBlockParentsByBlockName(clientId, 'core/block', true)[0]; 23979 let record; 23980 if (patternParent) { 23981 record = select(external_wp_coreData_namespaceObject.store).getEntityRecord('postType', 'wp_block', getBlockAttributes(patternParent).ref); 23982 } else { 23983 const { 23984 getCurrentTemplateId, 23985 getRenderingMode 23986 } = select(store_store); 23987 const templateId = getCurrentTemplateId(); 23988 const { 23989 getContentLockingParent 23990 } = unlock(select(external_wp_blockEditor_namespaceObject.store)); 23991 if (getRenderingMode() === 'template-locked' && !getContentLockingParent(clientId) && templateId) { 23992 record = select(external_wp_coreData_namespaceObject.store).getEntityRecord('postType', 'wp_template', templateId); 23993 } 23994 } 23995 const _canEditTemplates = select(external_wp_coreData_namespaceObject.store).canUser('create', { 23996 kind: 'postType', 23997 name: 'wp_template' 23998 }); 23999 return { 24000 canEditTemplates: _canEditTemplates, 24001 entity: record, 24002 onNavigateToEntityRecord: getSettings().onNavigateToEntityRecord 24003 }; 24004 }, [clientId]); 24005 if (!entity) { 24006 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TemplateLockContentOnlyMenuItems, { 24007 clientId: clientId, 24008 onClose: onClose 24009 }); 24010 } 24011 const isPattern = entity.type === 'wp_block'; 24012 let helpText = isPattern ? (0,external_wp_i18n_namespaceObject.__)('Edit the pattern to move, delete, or make further changes to this block.') : (0,external_wp_i18n_namespaceObject.__)('Edit the template to move, delete, or make further changes to this block.'); 24013 if (!canEditTemplates) { 24014 helpText = (0,external_wp_i18n_namespaceObject.__)('Only users with permissions to edit the template can move or delete this block'); 24015 } 24016 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 24017 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__unstableBlockSettingsMenuFirstItem, { 24018 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItem, { 24019 onClick: () => { 24020 onNavigateToEntityRecord({ 24021 postId: entity.id, 24022 postType: entity.type 24023 }); 24024 }, 24025 disabled: !canEditTemplates, 24026 children: isPattern ? (0,external_wp_i18n_namespaceObject.__)('Edit pattern') : (0,external_wp_i18n_namespaceObject.__)('Edit template') 24027 }) 24028 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { 24029 variant: "muted", 24030 as: "p", 24031 className: "editor-content-only-settings-menu__description", 24032 children: helpText 24033 })] 24034 }); 24035 } 24036 function TemplateLockContentOnlyMenuItems({ 24037 clientId, 24038 onClose 24039 }) { 24040 const { 24041 contentLockingParent 24042 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 24043 const { 24044 getContentLockingParent 24045 } = unlock(select(external_wp_blockEditor_namespaceObject.store)); 24046 return { 24047 contentLockingParent: getContentLockingParent(clientId) 24048 }; 24049 }, [clientId]); 24050 const blockDisplayInformation = (0,external_wp_blockEditor_namespaceObject.useBlockDisplayInformation)(contentLockingParent); 24051 const blockEditorActions = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_blockEditor_namespaceObject.store); 24052 if (!blockDisplayInformation?.title) { 24053 return null; 24054 } 24055 const { 24056 modifyContentLockBlock 24057 } = unlock(blockEditorActions); 24058 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 24059 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__unstableBlockSettingsMenuFirstItem, { 24060 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItem, { 24061 onClick: () => { 24062 modifyContentLockBlock(contentLockingParent); 24063 onClose(); 24064 }, 24065 children: (0,external_wp_i18n_namespaceObject._x)('Unlock', 'Unlock content locked blocks') 24066 }) 24067 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { 24068 variant: "muted", 24069 as: "p", 24070 className: "editor-content-only-settings-menu__description", 24071 children: (0,external_wp_i18n_namespaceObject.__)('Temporarily unlock the parent block to edit, delete or make further changes to this block.') 24072 })] 24073 }); 24074 } 24075 function ContentOnlySettingsMenu() { 24076 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.BlockSettingsMenuControls, { 24077 children: ({ 24078 selectedClientIds, 24079 onClose 24080 }) => selectedClientIds.length === 1 && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ContentOnlySettingsMenuItems, { 24081 clientId: selectedClientIds[0], 24082 onClose: onClose 24083 }) 24084 }); 24085 } 24086 24087 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/start-template-options/index.js 24088 /** 24089 * WordPress dependencies 24090 */ 24091 24092 24093 24094 24095 24096 24097 24098 24099 24100 /** 24101 * Internal dependencies 24102 */ 24103 24104 24105 24106 24107 function useFallbackTemplateContent(slug, isCustom = false) { 24108 return (0,external_wp_data_namespaceObject.useSelect)(select => { 24109 const { 24110 getEntityRecord, 24111 getDefaultTemplateId 24112 } = select(external_wp_coreData_namespaceObject.store); 24113 const templateId = getDefaultTemplateId({ 24114 slug, 24115 is_custom: isCustom, 24116 ignore_empty: true 24117 }); 24118 return templateId ? getEntityRecord('postType', TEMPLATE_POST_TYPE, templateId)?.content?.raw : undefined; 24119 }, [slug, isCustom]); 24120 } 24121 function start_template_options_useStartPatterns(fallbackContent) { 24122 const { 24123 slug, 24124 patterns 24125 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 24126 const { 24127 getCurrentPostType, 24128 getCurrentPostId 24129 } = select(store_store); 24130 const { 24131 getEntityRecord, 24132 getBlockPatterns 24133 } = select(external_wp_coreData_namespaceObject.store); 24134 const postId = getCurrentPostId(); 24135 const postType = getCurrentPostType(); 24136 const record = getEntityRecord('postType', postType, postId); 24137 return { 24138 slug: record.slug, 24139 patterns: getBlockPatterns() 24140 }; 24141 }, []); 24142 const currentThemeStylesheet = (0,external_wp_data_namespaceObject.useSelect)(select => select(external_wp_coreData_namespaceObject.store).getCurrentTheme().stylesheet); 24143 24144 // Duplicated from packages/block-library/src/pattern/edit.js. 24145 function injectThemeAttributeInBlockTemplateContent(block) { 24146 if (block.innerBlocks.find(innerBlock => innerBlock.name === 'core/template-part')) { 24147 block.innerBlocks = block.innerBlocks.map(innerBlock => { 24148 if (innerBlock.name === 'core/template-part' && innerBlock.attributes.theme === undefined) { 24149 innerBlock.attributes.theme = currentThemeStylesheet; 24150 } 24151 return innerBlock; 24152 }); 24153 } 24154 if (block.name === 'core/template-part' && block.attributes.theme === undefined) { 24155 block.attributes.theme = currentThemeStylesheet; 24156 } 24157 return block; 24158 } 24159 return (0,external_wp_element_namespaceObject.useMemo)(() => { 24160 // filter patterns that are supposed to be used in the current template being edited. 24161 return [{ 24162 name: 'fallback', 24163 blocks: (0,external_wp_blocks_namespaceObject.parse)(fallbackContent), 24164 title: (0,external_wp_i18n_namespaceObject.__)('Fallback content') 24165 }, ...patterns.filter(pattern => { 24166 return Array.isArray(pattern.templateTypes) && pattern.templateTypes.some(templateType => slug.startsWith(templateType)); 24167 }).map(pattern => { 24168 return { 24169 ...pattern, 24170 blocks: (0,external_wp_blocks_namespaceObject.parse)(pattern.content).map(block => injectThemeAttributeInBlockTemplateContent(block)) 24171 }; 24172 })]; 24173 }, [fallbackContent, slug, patterns]); 24174 } 24175 function start_template_options_PatternSelection({ 24176 fallbackContent, 24177 onChoosePattern, 24178 postType 24179 }) { 24180 const [,, onChange] = (0,external_wp_coreData_namespaceObject.useEntityBlockEditor)('postType', postType); 24181 const blockPatterns = start_template_options_useStartPatterns(fallbackContent); 24182 const shownBlockPatterns = (0,external_wp_compose_namespaceObject.useAsyncList)(blockPatterns); 24183 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalBlockPatternsList, { 24184 blockPatterns: blockPatterns, 24185 shownPatterns: shownBlockPatterns, 24186 onClickPattern: (pattern, blocks) => { 24187 onChange(blocks, { 24188 selection: undefined 24189 }); 24190 onChoosePattern(); 24191 } 24192 }); 24193 } 24194 function StartModal({ 24195 slug, 24196 isCustom, 24197 onClose, 24198 postType 24199 }) { 24200 const fallbackContent = useFallbackTemplateContent(slug, isCustom); 24201 if (!fallbackContent) { 24202 return null; 24203 } 24204 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.Modal, { 24205 className: "editor-start-template-options__modal", 24206 title: (0,external_wp_i18n_namespaceObject.__)('Choose a pattern'), 24207 closeLabel: (0,external_wp_i18n_namespaceObject.__)('Cancel'), 24208 focusOnMount: "firstElement", 24209 onRequestClose: onClose, 24210 isFullScreen: true, 24211 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 24212 className: "editor-start-template-options__modal-content", 24213 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(start_template_options_PatternSelection, { 24214 fallbackContent: fallbackContent, 24215 slug: slug, 24216 isCustom: isCustom, 24217 postType: postType, 24218 onChoosePattern: () => { 24219 onClose(); 24220 } 24221 }) 24222 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Flex, { 24223 className: "editor-start-template-options__modal__actions", 24224 justify: "flex-end", 24225 expanded: false, 24226 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.FlexItem, { 24227 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 24228 __next40pxDefaultSize: true, 24229 variant: "tertiary", 24230 onClick: onClose, 24231 children: (0,external_wp_i18n_namespaceObject.__)('Skip') 24232 }) 24233 }) 24234 })] 24235 }); 24236 } 24237 function StartTemplateOptions() { 24238 const [isClosed, setIsClosed] = (0,external_wp_element_namespaceObject.useState)(false); 24239 const { 24240 shouldOpenModal, 24241 slug, 24242 isCustom, 24243 postType, 24244 postId 24245 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 24246 const { 24247 getCurrentPostType, 24248 getCurrentPostId 24249 } = select(store_store); 24250 const _postType = getCurrentPostType(); 24251 const _postId = getCurrentPostId(); 24252 const { 24253 getEditedEntityRecord, 24254 hasEditsForEntityRecord 24255 } = select(external_wp_coreData_namespaceObject.store); 24256 const templateRecord = getEditedEntityRecord('postType', _postType, _postId); 24257 const hasEdits = hasEditsForEntityRecord('postType', _postType, _postId); 24258 return { 24259 shouldOpenModal: !hasEdits && '' === templateRecord.content && TEMPLATE_POST_TYPE === _postType, 24260 slug: templateRecord.slug, 24261 isCustom: templateRecord.is_custom, 24262 postType: _postType, 24263 postId: _postId 24264 }; 24265 }, []); 24266 (0,external_wp_element_namespaceObject.useEffect)(() => { 24267 // Should reset the modal state when navigating to a new page/post. 24268 setIsClosed(false); 24269 }, [postType, postId]); 24270 if (!shouldOpenModal || isClosed) { 24271 return null; 24272 } 24273 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(StartModal, { 24274 slug: slug, 24275 isCustom: isCustom, 24276 postType: postType, 24277 onClose: () => setIsClosed(true) 24278 }); 24279 } 24280 24281 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/template-part-menu-items/convert-to-regular.js 24282 /** 24283 * WordPress dependencies 24284 */ 24285 24286 24287 24288 24289 24290 function ConvertToRegularBlocks({ 24291 clientId, 24292 onClose 24293 }) { 24294 const { 24295 getBlocks 24296 } = (0,external_wp_data_namespaceObject.useSelect)(external_wp_blockEditor_namespaceObject.store); 24297 const { 24298 replaceBlocks 24299 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_blockEditor_namespaceObject.store); 24300 const canRemove = (0,external_wp_data_namespaceObject.useSelect)(select => select(external_wp_blockEditor_namespaceObject.store).canRemoveBlock(clientId), [clientId]); 24301 if (!canRemove) { 24302 return null; 24303 } 24304 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItem, { 24305 onClick: () => { 24306 replaceBlocks(clientId, getBlocks(clientId)); 24307 onClose(); 24308 }, 24309 children: (0,external_wp_i18n_namespaceObject.__)('Detach') 24310 }); 24311 } 24312 24313 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/template-part-menu-items/convert-to-template-part.js 24314 /** 24315 * WordPress dependencies 24316 */ 24317 24318 24319 24320 24321 24322 24323 24324 24325 24326 /** 24327 * Internal dependencies 24328 */ 24329 24330 24331 24332 24333 function ConvertToTemplatePart({ 24334 clientIds, 24335 blocks 24336 }) { 24337 const [isModalOpen, setIsModalOpen] = (0,external_wp_element_namespaceObject.useState)(false); 24338 const { 24339 replaceBlocks 24340 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_blockEditor_namespaceObject.store); 24341 const { 24342 createSuccessNotice 24343 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); 24344 const { 24345 canCreate 24346 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 24347 return { 24348 canCreate: select(external_wp_blockEditor_namespaceObject.store).canInsertBlockType('core/template-part') 24349 }; 24350 }, []); 24351 if (!canCreate) { 24352 return null; 24353 } 24354 const onConvert = async templatePart => { 24355 replaceBlocks(clientIds, (0,external_wp_blocks_namespaceObject.createBlock)('core/template-part', { 24356 slug: templatePart.slug, 24357 theme: templatePart.theme 24358 })); 24359 createSuccessNotice((0,external_wp_i18n_namespaceObject.__)('Template part created.'), { 24360 type: 'snackbar' 24361 }); 24362 24363 // The modal and this component will be unmounted because of `replaceBlocks` above, 24364 // so no need to call `closeModal` or `onClose`. 24365 }; 24366 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 24367 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItem, { 24368 icon: symbol_filled, 24369 onClick: () => { 24370 setIsModalOpen(true); 24371 }, 24372 "aria-expanded": isModalOpen, 24373 "aria-haspopup": "dialog", 24374 children: (0,external_wp_i18n_namespaceObject.__)('Create template part') 24375 }), isModalOpen && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(CreateTemplatePartModal, { 24376 closeModal: () => { 24377 setIsModalOpen(false); 24378 }, 24379 blocks: blocks, 24380 onCreate: onConvert 24381 })] 24382 }); 24383 } 24384 24385 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/template-part-menu-items/index.js 24386 /** 24387 * WordPress dependencies 24388 */ 24389 24390 24391 24392 /** 24393 * Internal dependencies 24394 */ 24395 24396 24397 24398 function TemplatePartMenuItems() { 24399 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.BlockSettingsMenuControls, { 24400 children: ({ 24401 selectedClientIds, 24402 onClose 24403 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TemplatePartConverterMenuItem, { 24404 clientIds: selectedClientIds, 24405 onClose: onClose 24406 }) 24407 }); 24408 } 24409 function TemplatePartConverterMenuItem({ 24410 clientIds, 24411 onClose 24412 }) { 24413 const { 24414 isContentOnly, 24415 blocks 24416 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 24417 const { 24418 getBlocksByClientId, 24419 getBlockEditingMode 24420 } = select(external_wp_blockEditor_namespaceObject.store); 24421 return { 24422 blocks: getBlocksByClientId(clientIds), 24423 isContentOnly: clientIds.length === 1 && getBlockEditingMode(clientIds[0]) === 'contentOnly' 24424 }; 24425 }, [clientIds]); 24426 24427 // Do not show the convert button if the block is in content-only mode. 24428 if (isContentOnly) { 24429 return null; 24430 } 24431 24432 // Allow converting a single template part to standard blocks. 24433 if (blocks.length === 1 && blocks[0]?.name === 'core/template-part') { 24434 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ConvertToRegularBlocks, { 24435 clientId: clientIds[0], 24436 onClose: onClose 24437 }); 24438 } 24439 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ConvertToTemplatePart, { 24440 clientIds: clientIds, 24441 blocks: blocks 24442 }); 24443 } 24444 24445 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/provider/index.js 24446 /** 24447 * WordPress dependencies 24448 */ 24449 24450 24451 24452 24453 24454 24455 24456 24457 24458 /** 24459 * Internal dependencies 24460 */ 24461 24462 24463 24464 24465 24466 24467 24468 24469 24470 24471 24472 24473 24474 24475 24476 24477 24478 24479 24480 24481 const { 24482 ExperimentalBlockEditorProvider 24483 } = unlock(external_wp_blockEditor_namespaceObject.privateApis); 24484 const { 24485 PatternsMenuItems 24486 } = unlock(external_wp_patterns_namespaceObject.privateApis); 24487 const provider_noop = () => {}; 24488 24489 /** 24490 * These are global entities that are only there to split blocks into logical units 24491 * They don't provide a "context" for the current post/page being rendered. 24492 * So we should not use their ids as post context. This is important to allow post blocks 24493 * (post content, post title) to be used within them without issues. 24494 */ 24495 const NON_CONTEXTUAL_POST_TYPES = ['wp_block', 'wp_navigation', 'wp_template_part']; 24496 24497 /** 24498 * Depending on the post, template and template mode, 24499 * returns the appropriate blocks and change handlers for the block editor provider. 24500 * 24501 * @param {Array} post Block list. 24502 * @param {boolean} template Whether the page content has focus (and the surrounding template is inert). If `true` return page content blocks. Default `false`. 24503 * @param {string} mode Rendering mode. 24504 * 24505 * @example 24506 * ```jsx 24507 * const [ blocks, onInput, onChange ] = useBlockEditorProps( post, template, mode ); 24508 * ``` 24509 * 24510 * @return {Array} Block editor props. 24511 */ 24512 function useBlockEditorProps(post, template, mode) { 24513 const rootLevelPost = mode === 'post-only' || !template ? 'post' : 'template'; 24514 const [postBlocks, onInput, onChange] = (0,external_wp_coreData_namespaceObject.useEntityBlockEditor)('postType', post.type, { 24515 id: post.id 24516 }); 24517 const [templateBlocks, onInputTemplate, onChangeTemplate] = (0,external_wp_coreData_namespaceObject.useEntityBlockEditor)('postType', template?.type, { 24518 id: template?.id 24519 }); 24520 const maybeNavigationBlocks = (0,external_wp_element_namespaceObject.useMemo)(() => { 24521 if (post.type === 'wp_navigation') { 24522 return [(0,external_wp_blocks_namespaceObject.createBlock)('core/navigation', { 24523 ref: post.id, 24524 // As the parent editor is locked with `templateLock`, the template locking 24525 // must be explicitly "unset" on the block itself to allow the user to modify 24526 // the block's content. 24527 templateLock: false 24528 })]; 24529 } 24530 }, [post.type, post.id]); 24531 24532 // It is important that we don't create a new instance of blocks on every change 24533 // We should only create a new instance if the blocks them selves change, not a dependency of them. 24534 const blocks = (0,external_wp_element_namespaceObject.useMemo)(() => { 24535 if (maybeNavigationBlocks) { 24536 return maybeNavigationBlocks; 24537 } 24538 if (rootLevelPost === 'template') { 24539 return templateBlocks; 24540 } 24541 return postBlocks; 24542 }, [maybeNavigationBlocks, rootLevelPost, templateBlocks, postBlocks]); 24543 24544 // Handle fallback to postBlocks outside of the above useMemo, to ensure 24545 // that constructed block templates that call `createBlock` are not generated 24546 // too frequently. This ensures that clientIds are stable. 24547 const disableRootLevelChanges = !!template && mode === 'template-locked' || post.type === 'wp_navigation'; 24548 if (disableRootLevelChanges) { 24549 return [blocks, provider_noop, provider_noop]; 24550 } 24551 return [blocks, rootLevelPost === 'post' ? onInput : onInputTemplate, rootLevelPost === 'post' ? onChange : onChangeTemplate]; 24552 } 24553 24554 /** 24555 * This component provides the editor context and manages the state of the block editor. 24556 * 24557 * @param {Object} props The component props. 24558 * @param {Object} props.post The post object. 24559 * @param {Object} props.settings The editor settings. 24560 * @param {boolean} props.recovery Indicates if the editor is in recovery mode. 24561 * @param {Array} props.initialEdits The initial edits for the editor. 24562 * @param {Object} props.children The child components. 24563 * @param {Object} [props.BlockEditorProviderComponent] The block editor provider component to use. Defaults to ExperimentalBlockEditorProvider. 24564 * @param {Object} [props.__unstableTemplate] The template object. 24565 * 24566 * @example 24567 * ```jsx 24568 * <ExperimentalEditorProvider 24569 * post={ post } 24570 * settings={ settings } 24571 * recovery={ recovery } 24572 * initialEdits={ initialEdits } 24573 * __unstableTemplate={ template } 24574 * > 24575 * { children } 24576 * </ExperimentalEditorProvider> 24577 * 24578 * @return {Object} The rendered ExperimentalEditorProvider component. 24579 */ 24580 const ExperimentalEditorProvider = with_registry_provider(({ 24581 post, 24582 settings, 24583 recovery, 24584 initialEdits, 24585 children, 24586 BlockEditorProviderComponent = ExperimentalBlockEditorProvider, 24587 __unstableTemplate: template 24588 }) => { 24589 const { 24590 editorSettings, 24591 selection, 24592 isReady, 24593 mode, 24594 postTypeEntities 24595 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 24596 const { 24597 getEditorSettings, 24598 getEditorSelection, 24599 getRenderingMode, 24600 __unstableIsEditorReady 24601 } = select(store_store); 24602 const { 24603 getEntitiesConfig 24604 } = select(external_wp_coreData_namespaceObject.store); 24605 return { 24606 editorSettings: getEditorSettings(), 24607 isReady: __unstableIsEditorReady(), 24608 mode: getRenderingMode(), 24609 selection: getEditorSelection(), 24610 postTypeEntities: post.type === 'wp_template' ? getEntitiesConfig('postType') : null 24611 }; 24612 }, [post.type]); 24613 const isZoomOut = (0,external_wp_data_namespaceObject.useSelect)(select => { 24614 const { 24615 __unstableGetEditorMode 24616 } = unlock(select(external_wp_blockEditor_namespaceObject.store)); 24617 return __unstableGetEditorMode() === 'zoom-out'; 24618 }); 24619 const shouldRenderTemplate = !!template && mode !== 'post-only'; 24620 const rootLevelPost = shouldRenderTemplate ? template : post; 24621 const defaultBlockContext = (0,external_wp_element_namespaceObject.useMemo)(() => { 24622 const postContext = {}; 24623 // If it is a template, try to inherit the post type from the name. 24624 if (post.type === 'wp_template') { 24625 if (post.slug === 'page') { 24626 postContext.postType = 'page'; 24627 } else if (post.slug === 'single') { 24628 postContext.postType = 'post'; 24629 } else if (post.slug.split('-')[0] === 'single') { 24630 // If the slug is single-{postType}, infer the post type from the name. 24631 const postTypeNames = postTypeEntities?.map(entity => entity.name) || []; 24632 const match = post.slug.match(`^single-($postTypeNames.join('|')})(?:-.+)?$`); 24633 if (match) { 24634 postContext.postType = match[1]; 24635 } 24636 } 24637 } else if (!NON_CONTEXTUAL_POST_TYPES.includes(rootLevelPost.type) || shouldRenderTemplate) { 24638 postContext.postId = post.id; 24639 postContext.postType = post.type; 24640 } 24641 return { 24642 ...postContext, 24643 templateSlug: rootLevelPost.type === 'wp_template' ? rootLevelPost.slug : undefined 24644 }; 24645 }, [shouldRenderTemplate, post.id, post.type, post.slug, rootLevelPost.type, rootLevelPost.slug, postTypeEntities]); 24646 const { 24647 id, 24648 type 24649 } = rootLevelPost; 24650 const blockEditorSettings = use_block_editor_settings(editorSettings, type, id, mode); 24651 const [blocks, onInput, onChange] = useBlockEditorProps(post, template, mode); 24652 const { 24653 updatePostLock, 24654 setupEditor, 24655 updateEditorSettings, 24656 setCurrentTemplateId, 24657 setEditedPost, 24658 setRenderingMode 24659 } = unlock((0,external_wp_data_namespaceObject.useDispatch)(store_store)); 24660 const { 24661 createWarningNotice 24662 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); 24663 24664 // Ideally this should be synced on each change and not just something you do once. 24665 (0,external_wp_element_namespaceObject.useLayoutEffect)(() => { 24666 // Assume that we don't need to initialize in the case of an error recovery. 24667 if (recovery) { 24668 return; 24669 } 24670 updatePostLock(settings.postLock); 24671 setupEditor(post, initialEdits, settings.template); 24672 if (settings.autosave) { 24673 createWarningNotice((0,external_wp_i18n_namespaceObject.__)('There is an autosave of this post that is more recent than the version below.'), { 24674 id: 'autosave-exists', 24675 actions: [{ 24676 label: (0,external_wp_i18n_namespaceObject.__)('View the autosave'), 24677 url: settings.autosave.editLink 24678 }] 24679 }); 24680 } 24681 }, []); 24682 24683 // Synchronizes the active post with the state 24684 (0,external_wp_element_namespaceObject.useEffect)(() => { 24685 setEditedPost(post.type, post.id); 24686 }, [post.type, post.id, setEditedPost]); 24687 24688 // Synchronize the editor settings as they change. 24689 (0,external_wp_element_namespaceObject.useEffect)(() => { 24690 updateEditorSettings(settings); 24691 }, [settings, updateEditorSettings]); 24692 24693 // Synchronizes the active template with the state. 24694 (0,external_wp_element_namespaceObject.useEffect)(() => { 24695 setCurrentTemplateId(template?.id); 24696 }, [template?.id, setCurrentTemplateId]); 24697 24698 // Sets the right rendering mode when loading the editor. 24699 (0,external_wp_element_namespaceObject.useEffect)(() => { 24700 var _settings$defaultRend; 24701 setRenderingMode((_settings$defaultRend = settings.defaultRenderingMode) !== null && _settings$defaultRend !== void 0 ? _settings$defaultRend : 'post-only'); 24702 }, [settings.defaultRenderingMode, setRenderingMode]); 24703 useHideBlocksFromInserter(post.type, mode); 24704 24705 // Register the editor commands. 24706 useCommands(); 24707 if (!isReady) { 24708 return null; 24709 } 24710 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_coreData_namespaceObject.EntityProvider, { 24711 kind: "root", 24712 type: "site", 24713 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_coreData_namespaceObject.EntityProvider, { 24714 kind: "postType", 24715 type: post.type, 24716 id: post.id, 24717 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.BlockContextProvider, { 24718 value: defaultBlockContext, 24719 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(BlockEditorProviderComponent, { 24720 value: blocks, 24721 onChange: onChange, 24722 onInput: onInput, 24723 selection: selection, 24724 settings: blockEditorSettings, 24725 useSubRegistry: false, 24726 children: [children, !settings.__unstableIsPreviewMode && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 24727 children: [!isZoomOut && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 24728 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PatternsMenuItems, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TemplatePartMenuItems, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ContentOnlySettingsMenu, {})] 24729 }), mode === 'template-locked' && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(DisableNonPageContentBlocks, {}), type === 'wp_navigation' && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(NavigationBlockEditingMode, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(EditorKeyboardShortcuts, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(keyboard_shortcut_help_modal, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(BlockRemovalWarnings, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(StartPageOptions, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(StartTemplateOptions, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PatternRenameModal, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PatternDuplicateModal, {})] 24730 })] 24731 }) 24732 }) 24733 }) 24734 }); 24735 }); 24736 24737 /** 24738 * This component establishes a new post editing context, and serves as the entry point for a new post editor (or post with template editor). 24739 * 24740 * It supports a large number of post types, including post, page, templates, 24741 * custom post types, patterns, template parts. 24742 * 24743 * All modification and changes are performed to the `@wordpress/core-data` store. 24744 * 24745 * @param {Object} props The component props. 24746 * @param {Object} [props.post] The post object to edit. This is required. 24747 * @param {Object} [props.__unstableTemplate] The template object wrapper the edited post. 24748 * This is optional and can only be used when the post type supports templates (like posts and pages). 24749 * @param {Object} [props.settings] The settings object to use for the editor. 24750 * This is optional and can be used to override the default settings. 24751 * @param {Element} [props.children] Children elements for which the BlockEditorProvider context should apply. 24752 * This is optional. 24753 * 24754 * @example 24755 * ```jsx 24756 * <EditorProvider 24757 * post={ post } 24758 * settings={ settings } 24759 * __unstableTemplate={ template } 24760 * > 24761 * { children } 24762 * </EditorProvider> 24763 * ``` 24764 * 24765 * @return {JSX.Element} The rendered EditorProvider component. 24766 */ 24767 function EditorProvider(props) { 24768 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ExperimentalEditorProvider, { 24769 ...props, 24770 BlockEditorProviderComponent: external_wp_blockEditor_namespaceObject.BlockEditorProvider, 24771 children: props.children 24772 }); 24773 } 24774 /* harmony default export */ const provider = (EditorProvider); 24775 24776 ;// CONCATENATED MODULE: external ["wp","serverSideRender"] 24777 const external_wp_serverSideRender_namespaceObject = window["wp"]["serverSideRender"]; 24778 var external_wp_serverSideRender_default = /*#__PURE__*/__webpack_require__.n(external_wp_serverSideRender_namespaceObject); 24779 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/deprecated.js 24780 // Block Creation Components. 24781 /** 24782 * WordPress dependencies 24783 */ 24784 24785 24786 24787 24788 24789 function deprecateComponent(name, Wrapped, staticsToHoist = []) { 24790 const Component = (0,external_wp_element_namespaceObject.forwardRef)((props, ref) => { 24791 external_wp_deprecated_default()('wp.editor.' + name, { 24792 since: '5.3', 24793 alternative: 'wp.blockEditor.' + name, 24794 version: '6.2' 24795 }); 24796 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(Wrapped, { 24797 ref: ref, 24798 ...props 24799 }); 24800 }); 24801 staticsToHoist.forEach(staticName => { 24802 Component[staticName] = deprecateComponent(name + '.' + staticName, Wrapped[staticName]); 24803 }); 24804 return Component; 24805 } 24806 function deprecateFunction(name, func) { 24807 return (...args) => { 24808 external_wp_deprecated_default()('wp.editor.' + name, { 24809 since: '5.3', 24810 alternative: 'wp.blockEditor.' + name, 24811 version: '6.2' 24812 }); 24813 return func(...args); 24814 }; 24815 } 24816 24817 /** 24818 * @deprecated since 5.3, use `wp.blockEditor.RichText` instead. 24819 */ 24820 const RichText = deprecateComponent('RichText', external_wp_blockEditor_namespaceObject.RichText, ['Content']); 24821 RichText.isEmpty = deprecateFunction('RichText.isEmpty', external_wp_blockEditor_namespaceObject.RichText.isEmpty); 24822 24823 24824 /** 24825 * @deprecated since 5.3, use `wp.blockEditor.Autocomplete` instead. 24826 */ 24827 const Autocomplete = deprecateComponent('Autocomplete', external_wp_blockEditor_namespaceObject.Autocomplete); 24828 /** 24829 * @deprecated since 5.3, use `wp.blockEditor.AlignmentToolbar` instead. 24830 */ 24831 const AlignmentToolbar = deprecateComponent('AlignmentToolbar', external_wp_blockEditor_namespaceObject.AlignmentToolbar); 24832 /** 24833 * @deprecated since 5.3, use `wp.blockEditor.BlockAlignmentToolbar` instead. 24834 */ 24835 const BlockAlignmentToolbar = deprecateComponent('BlockAlignmentToolbar', external_wp_blockEditor_namespaceObject.BlockAlignmentToolbar); 24836 /** 24837 * @deprecated since 5.3, use `wp.blockEditor.BlockControls` instead. 24838 */ 24839 const BlockControls = deprecateComponent('BlockControls', external_wp_blockEditor_namespaceObject.BlockControls, ['Slot']); 24840 /** 24841 * @deprecated since 5.3, use `wp.blockEditor.BlockEdit` instead. 24842 */ 24843 const BlockEdit = deprecateComponent('BlockEdit', external_wp_blockEditor_namespaceObject.BlockEdit); 24844 /** 24845 * @deprecated since 5.3, use `wp.blockEditor.BlockEditorKeyboardShortcuts` instead. 24846 */ 24847 const BlockEditorKeyboardShortcuts = deprecateComponent('BlockEditorKeyboardShortcuts', external_wp_blockEditor_namespaceObject.BlockEditorKeyboardShortcuts); 24848 /** 24849 * @deprecated since 5.3, use `wp.blockEditor.BlockFormatControls` instead. 24850 */ 24851 const BlockFormatControls = deprecateComponent('BlockFormatControls', external_wp_blockEditor_namespaceObject.BlockFormatControls, ['Slot']); 24852 /** 24853 * @deprecated since 5.3, use `wp.blockEditor.BlockIcon` instead. 24854 */ 24855 const BlockIcon = deprecateComponent('BlockIcon', external_wp_blockEditor_namespaceObject.BlockIcon); 24856 /** 24857 * @deprecated since 5.3, use `wp.blockEditor.BlockInspector` instead. 24858 */ 24859 const BlockInspector = deprecateComponent('BlockInspector', external_wp_blockEditor_namespaceObject.BlockInspector); 24860 /** 24861 * @deprecated since 5.3, use `wp.blockEditor.BlockList` instead. 24862 */ 24863 const BlockList = deprecateComponent('BlockList', external_wp_blockEditor_namespaceObject.BlockList); 24864 /** 24865 * @deprecated since 5.3, use `wp.blockEditor.BlockMover` instead. 24866 */ 24867 const BlockMover = deprecateComponent('BlockMover', external_wp_blockEditor_namespaceObject.BlockMover); 24868 /** 24869 * @deprecated since 5.3, use `wp.blockEditor.BlockNavigationDropdown` instead. 24870 */ 24871 const BlockNavigationDropdown = deprecateComponent('BlockNavigationDropdown', external_wp_blockEditor_namespaceObject.BlockNavigationDropdown); 24872 /** 24873 * @deprecated since 5.3, use `wp.blockEditor.BlockSelectionClearer` instead. 24874 */ 24875 const BlockSelectionClearer = deprecateComponent('BlockSelectionClearer', external_wp_blockEditor_namespaceObject.BlockSelectionClearer); 24876 /** 24877 * @deprecated since 5.3, use `wp.blockEditor.BlockSettingsMenu` instead. 24878 */ 24879 const BlockSettingsMenu = deprecateComponent('BlockSettingsMenu', external_wp_blockEditor_namespaceObject.BlockSettingsMenu); 24880 /** 24881 * @deprecated since 5.3, use `wp.blockEditor.BlockTitle` instead. 24882 */ 24883 const BlockTitle = deprecateComponent('BlockTitle', external_wp_blockEditor_namespaceObject.BlockTitle); 24884 /** 24885 * @deprecated since 5.3, use `wp.blockEditor.BlockToolbar` instead. 24886 */ 24887 const BlockToolbar = deprecateComponent('BlockToolbar', external_wp_blockEditor_namespaceObject.BlockToolbar); 24888 /** 24889 * @deprecated since 5.3, use `wp.blockEditor.ColorPalette` instead. 24890 */ 24891 const ColorPalette = deprecateComponent('ColorPalette', external_wp_blockEditor_namespaceObject.ColorPalette); 24892 /** 24893 * @deprecated since 5.3, use `wp.blockEditor.ContrastChecker` instead. 24894 */ 24895 const ContrastChecker = deprecateComponent('ContrastChecker', external_wp_blockEditor_namespaceObject.ContrastChecker); 24896 /** 24897 * @deprecated since 5.3, use `wp.blockEditor.CopyHandler` instead. 24898 */ 24899 const CopyHandler = deprecateComponent('CopyHandler', external_wp_blockEditor_namespaceObject.CopyHandler); 24900 /** 24901 * @deprecated since 5.3, use `wp.blockEditor.DefaultBlockAppender` instead. 24902 */ 24903 const DefaultBlockAppender = deprecateComponent('DefaultBlockAppender', external_wp_blockEditor_namespaceObject.DefaultBlockAppender); 24904 /** 24905 * @deprecated since 5.3, use `wp.blockEditor.FontSizePicker` instead. 24906 */ 24907 const FontSizePicker = deprecateComponent('FontSizePicker', external_wp_blockEditor_namespaceObject.FontSizePicker); 24908 /** 24909 * @deprecated since 5.3, use `wp.blockEditor.Inserter` instead. 24910 */ 24911 const Inserter = deprecateComponent('Inserter', external_wp_blockEditor_namespaceObject.Inserter); 24912 /** 24913 * @deprecated since 5.3, use `wp.blockEditor.InnerBlocks` instead. 24914 */ 24915 const InnerBlocks = deprecateComponent('InnerBlocks', external_wp_blockEditor_namespaceObject.InnerBlocks, ['ButtonBlockAppender', 'DefaultBlockAppender', 'Content']); 24916 /** 24917 * @deprecated since 5.3, use `wp.blockEditor.InspectorAdvancedControls` instead. 24918 */ 24919 const InspectorAdvancedControls = deprecateComponent('InspectorAdvancedControls', external_wp_blockEditor_namespaceObject.InspectorAdvancedControls, ['Slot']); 24920 /** 24921 * @deprecated since 5.3, use `wp.blockEditor.InspectorControls` instead. 24922 */ 24923 const InspectorControls = deprecateComponent('InspectorControls', external_wp_blockEditor_namespaceObject.InspectorControls, ['Slot']); 24924 /** 24925 * @deprecated since 5.3, use `wp.blockEditor.PanelColorSettings` instead. 24926 */ 24927 const PanelColorSettings = deprecateComponent('PanelColorSettings', external_wp_blockEditor_namespaceObject.PanelColorSettings); 24928 /** 24929 * @deprecated since 5.3, use `wp.blockEditor.PlainText` instead. 24930 */ 24931 const PlainText = deprecateComponent('PlainText', external_wp_blockEditor_namespaceObject.PlainText); 24932 /** 24933 * @deprecated since 5.3, use `wp.blockEditor.RichTextShortcut` instead. 24934 */ 24935 const RichTextShortcut = deprecateComponent('RichTextShortcut', external_wp_blockEditor_namespaceObject.RichTextShortcut); 24936 /** 24937 * @deprecated since 5.3, use `wp.blockEditor.RichTextToolbarButton` instead. 24938 */ 24939 const RichTextToolbarButton = deprecateComponent('RichTextToolbarButton', external_wp_blockEditor_namespaceObject.RichTextToolbarButton); 24940 /** 24941 * @deprecated since 5.3, use `wp.blockEditor.__unstableRichTextInputEvent` instead. 24942 */ 24943 const __unstableRichTextInputEvent = deprecateComponent('__unstableRichTextInputEvent', external_wp_blockEditor_namespaceObject.__unstableRichTextInputEvent); 24944 /** 24945 * @deprecated since 5.3, use `wp.blockEditor.MediaPlaceholder` instead. 24946 */ 24947 const MediaPlaceholder = deprecateComponent('MediaPlaceholder', external_wp_blockEditor_namespaceObject.MediaPlaceholder); 24948 /** 24949 * @deprecated since 5.3, use `wp.blockEditor.MediaUpload` instead. 24950 */ 24951 const MediaUpload = deprecateComponent('MediaUpload', external_wp_blockEditor_namespaceObject.MediaUpload); 24952 /** 24953 * @deprecated since 5.3, use `wp.blockEditor.MediaUploadCheck` instead. 24954 */ 24955 const MediaUploadCheck = deprecateComponent('MediaUploadCheck', external_wp_blockEditor_namespaceObject.MediaUploadCheck); 24956 /** 24957 * @deprecated since 5.3, use `wp.blockEditor.MultiSelectScrollIntoView` instead. 24958 */ 24959 const MultiSelectScrollIntoView = deprecateComponent('MultiSelectScrollIntoView', external_wp_blockEditor_namespaceObject.MultiSelectScrollIntoView); 24960 /** 24961 * @deprecated since 5.3, use `wp.blockEditor.NavigableToolbar` instead. 24962 */ 24963 const NavigableToolbar = deprecateComponent('NavigableToolbar', external_wp_blockEditor_namespaceObject.NavigableToolbar); 24964 /** 24965 * @deprecated since 5.3, use `wp.blockEditor.ObserveTyping` instead. 24966 */ 24967 const ObserveTyping = deprecateComponent('ObserveTyping', external_wp_blockEditor_namespaceObject.ObserveTyping); 24968 /** 24969 * @deprecated since 5.3, use `wp.blockEditor.SkipToSelectedBlock` instead. 24970 */ 24971 const SkipToSelectedBlock = deprecateComponent('SkipToSelectedBlock', external_wp_blockEditor_namespaceObject.SkipToSelectedBlock); 24972 /** 24973 * @deprecated since 5.3, use `wp.blockEditor.URLInput` instead. 24974 */ 24975 const URLInput = deprecateComponent('URLInput', external_wp_blockEditor_namespaceObject.URLInput); 24976 /** 24977 * @deprecated since 5.3, use `wp.blockEditor.URLInputButton` instead. 24978 */ 24979 const URLInputButton = deprecateComponent('URLInputButton', external_wp_blockEditor_namespaceObject.URLInputButton); 24980 /** 24981 * @deprecated since 5.3, use `wp.blockEditor.URLPopover` instead. 24982 */ 24983 const URLPopover = deprecateComponent('URLPopover', external_wp_blockEditor_namespaceObject.URLPopover); 24984 /** 24985 * @deprecated since 5.3, use `wp.blockEditor.Warning` instead. 24986 */ 24987 const Warning = deprecateComponent('Warning', external_wp_blockEditor_namespaceObject.Warning); 24988 /** 24989 * @deprecated since 5.3, use `wp.blockEditor.WritingFlow` instead. 24990 */ 24991 const WritingFlow = deprecateComponent('WritingFlow', external_wp_blockEditor_namespaceObject.WritingFlow); 24992 24993 /** 24994 * @deprecated since 5.3, use `wp.blockEditor.createCustomColorsHOC` instead. 24995 */ 24996 const createCustomColorsHOC = deprecateFunction('createCustomColorsHOC', external_wp_blockEditor_namespaceObject.createCustomColorsHOC); 24997 /** 24998 * @deprecated since 5.3, use `wp.blockEditor.getColorClassName` instead. 24999 */ 25000 const getColorClassName = deprecateFunction('getColorClassName', external_wp_blockEditor_namespaceObject.getColorClassName); 25001 /** 25002 * @deprecated since 5.3, use `wp.blockEditor.getColorObjectByAttributeValues` instead. 25003 */ 25004 const getColorObjectByAttributeValues = deprecateFunction('getColorObjectByAttributeValues', external_wp_blockEditor_namespaceObject.getColorObjectByAttributeValues); 25005 /** 25006 * @deprecated since 5.3, use `wp.blockEditor.getColorObjectByColorValue` instead. 25007 */ 25008 const getColorObjectByColorValue = deprecateFunction('getColorObjectByColorValue', external_wp_blockEditor_namespaceObject.getColorObjectByColorValue); 25009 /** 25010 * @deprecated since 5.3, use `wp.blockEditor.getFontSize` instead. 25011 */ 25012 const getFontSize = deprecateFunction('getFontSize', external_wp_blockEditor_namespaceObject.getFontSize); 25013 /** 25014 * @deprecated since 5.3, use `wp.blockEditor.getFontSizeClass` instead. 25015 */ 25016 const getFontSizeClass = deprecateFunction('getFontSizeClass', external_wp_blockEditor_namespaceObject.getFontSizeClass); 25017 /** 25018 * @deprecated since 5.3, use `wp.blockEditor.createCustomColorsHOC` instead. 25019 */ 25020 const withColorContext = deprecateFunction('withColorContext', external_wp_blockEditor_namespaceObject.withColorContext); 25021 /** 25022 * @deprecated since 5.3, use `wp.blockEditor.withColors` instead. 25023 */ 25024 const withColors = deprecateFunction('withColors', external_wp_blockEditor_namespaceObject.withColors); 25025 /** 25026 * @deprecated since 5.3, use `wp.blockEditor.withFontSizes` instead. 25027 */ 25028 const withFontSizes = deprecateFunction('withFontSizes', external_wp_blockEditor_namespaceObject.withFontSizes); 25029 25030 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/index.js 25031 /** 25032 * Internal dependencies 25033 */ 25034 25035 25036 // Block Creation Components. 25037 25038 25039 // Post Related Components. 25040 25041 25042 25043 25044 25045 25046 25047 25048 25049 25050 25051 25052 25053 25054 25055 25056 25057 25058 25059 25060 25061 25062 25063 25064 25065 25066 25067 25068 25069 25070 25071 25072 25073 25074 25075 25076 25077 25078 25079 25080 25081 25082 25083 25084 25085 25086 25087 25088 25089 25090 25091 25092 25093 25094 25095 25096 25097 25098 25099 25100 25101 25102 25103 25104 25105 25106 25107 25108 25109 25110 25111 25112 25113 25114 25115 25116 25117 25118 25119 25120 25121 25122 25123 25124 25125 25126 25127 25128 25129 // State Related Components. 25130 25131 25132 25133 /** 25134 * Handles the keyboard shortcuts for the editor. 25135 * 25136 * It provides functionality for various keyboard shortcuts such as toggling editor mode, 25137 * toggling distraction-free mode, undo/redo, saving the post, toggling list view, 25138 * and toggling the sidebar. 25139 */ 25140 const VisualEditorGlobalKeyboardShortcuts = EditorKeyboardShortcuts; 25141 25142 /** 25143 * Handles the keyboard shortcuts for the editor. 25144 * 25145 * It provides functionality for various keyboard shortcuts such as toggling editor mode, 25146 * toggling distraction-free mode, undo/redo, saving the post, toggling list view, 25147 * and toggling the sidebar. 25148 */ 25149 const TextEditorGlobalKeyboardShortcuts = EditorKeyboardShortcuts; 25150 25151 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/utils/url.js 25152 /** 25153 * WordPress dependencies 25154 */ 25155 25156 25157 25158 /** 25159 * Performs some basic cleanup of a string for use as a post slug 25160 * 25161 * This replicates some of what sanitize_title() does in WordPress core, but 25162 * is only designed to approximate what the slug will be. 25163 * 25164 * Converts Latin-1 Supplement and Latin Extended-A letters to basic Latin letters. 25165 * Removes combining diacritical marks. Converts whitespace, periods, 25166 * and forward slashes to hyphens. Removes any remaining non-word characters 25167 * except hyphens and underscores. Converts remaining string to lowercase. 25168 * It does not account for octets, HTML entities, or other encoded characters. 25169 * 25170 * @param {string} string Title or slug to be processed 25171 * 25172 * @return {string} Processed string 25173 */ 25174 function cleanForSlug(string) { 25175 external_wp_deprecated_default()('wp.editor.cleanForSlug', { 25176 since: '12.7', 25177 plugin: 'Gutenberg', 25178 alternative: 'wp.url.cleanForSlug' 25179 }); 25180 return (0,external_wp_url_namespaceObject.cleanForSlug)(string); 25181 } 25182 25183 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/utils/index.js 25184 /** 25185 * Internal dependencies 25186 */ 25187 25188 25189 25190 25191 25192 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/editor-interface/content-slot-fill.js 25193 /** 25194 * WordPress dependencies 25195 */ 25196 25197 25198 /** 25199 * Internal dependencies 25200 */ 25201 25202 const { 25203 createPrivateSlotFill 25204 } = unlock(external_wp_components_namespaceObject.privateApis); 25205 const SLOT_FILL_NAME = 'EditCanvasContainerSlot'; 25206 const EditorContentSlotFill = createPrivateSlotFill(SLOT_FILL_NAME); 25207 /* harmony default export */ const content_slot_fill = (EditorContentSlotFill); 25208 25209 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/header/back-button.js 25210 /** 25211 * WordPress dependencies 25212 */ 25213 25214 25215 // Keeping an old name for backward compatibility. 25216 25217 const slotName = '__experimentalMainDashboardButton'; 25218 const useHasBackButton = () => { 25219 const fills = (0,external_wp_components_namespaceObject.__experimentalUseSlotFills)(slotName); 25220 return Boolean(fills && fills.length); 25221 }; 25222 const { 25223 Fill: back_button_Fill, 25224 Slot: back_button_Slot 25225 } = (0,external_wp_components_namespaceObject.createSlotFill)(slotName); 25226 const BackButton = back_button_Fill; 25227 const BackButtonSlot = () => { 25228 const fills = (0,external_wp_components_namespaceObject.__experimentalUseSlotFills)(slotName); 25229 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(back_button_Slot, { 25230 bubblesVirtually: true, 25231 fillProps: { 25232 length: !fills ? 0 : fills.length 25233 } 25234 }); 25235 }; 25236 BackButton.Slot = BackButtonSlot; 25237 /* harmony default export */ const back_button = (BackButton); 25238 25239 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/next.js 25240 /** 25241 * WordPress dependencies 25242 */ 25243 25244 25245 const next = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 25246 xmlns: "http://www.w3.org/2000/svg", 25247 viewBox: "0 0 24 24", 25248 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 25249 d: "M6.6 6L5.4 7l4.5 5-4.5 5 1.1 1 5.5-6-5.4-6zm6 0l-1.1 1 4.5 5-4.5 5 1.1 1 5.5-6-5.5-6z" 25250 }) 25251 }); 25252 /* harmony default export */ const library_next = (next); 25253 25254 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/previous.js 25255 /** 25256 * WordPress dependencies 25257 */ 25258 25259 25260 const previous = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 25261 xmlns: "http://www.w3.org/2000/svg", 25262 viewBox: "0 0 24 24", 25263 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 25264 d: "M11.6 7l-1.1-1L5 12l5.5 6 1.1-1L7 12l4.6-5zm6 0l-1.1-1-5.5 6 5.5 6 1.1-1-4.6-5 4.6-5z" 25265 }) 25266 }); 25267 /* harmony default export */ const library_previous = (previous); 25268 25269 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/collapsible-block-toolbar/index.js 25270 /** 25271 * External dependencies 25272 */ 25273 25274 25275 /** 25276 * WordPress dependencies 25277 */ 25278 25279 25280 25281 25282 25283 25284 25285 /** 25286 * Internal dependencies 25287 */ 25288 25289 25290 25291 25292 const { 25293 useHasBlockToolbar 25294 } = unlock(external_wp_blockEditor_namespaceObject.privateApis); 25295 function CollapsibleBlockToolbar({ 25296 isCollapsed, 25297 onToggle 25298 }) { 25299 const { 25300 blockSelectionStart 25301 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 25302 return { 25303 blockSelectionStart: select(external_wp_blockEditor_namespaceObject.store).getBlockSelectionStart() 25304 }; 25305 }, []); 25306 const hasBlockToolbar = useHasBlockToolbar(); 25307 const hasBlockSelection = !!blockSelectionStart; 25308 (0,external_wp_element_namespaceObject.useEffect)(() => { 25309 // If we have a new block selection, show the block tools 25310 if (blockSelectionStart) { 25311 onToggle(false); 25312 } 25313 }, [blockSelectionStart, onToggle]); 25314 if (!hasBlockToolbar) { 25315 return null; 25316 } 25317 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 25318 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 25319 className: dist_clsx('editor-collapsible-block-toolbar', { 25320 'is-collapsed': isCollapsed || !hasBlockSelection 25321 }), 25322 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.BlockToolbar, { 25323 hideDragHandle: true 25324 }) 25325 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Popover.Slot, { 25326 name: "block-toolbar" 25327 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 25328 className: "editor-collapsible-block-toolbar__toggle", 25329 icon: isCollapsed ? library_next : library_previous, 25330 onClick: () => { 25331 onToggle(!isCollapsed); 25332 }, 25333 label: isCollapsed ? (0,external_wp_i18n_namespaceObject.__)('Show block tools') : (0,external_wp_i18n_namespaceObject.__)('Hide block tools'), 25334 size: "compact" 25335 })] 25336 }); 25337 } 25338 25339 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/plus.js 25340 /** 25341 * WordPress dependencies 25342 */ 25343 25344 25345 const plus = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 25346 xmlns: "http://www.w3.org/2000/svg", 25347 viewBox: "0 0 24 24", 25348 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 25349 d: "M11 12.5V17.5H12.5V12.5H17.5V11H12.5V6H11V11H6V12.5H11Z" 25350 }) 25351 }); 25352 /* harmony default export */ const library_plus = (plus); 25353 25354 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/document-tools/index.js 25355 /** 25356 * External dependencies 25357 */ 25358 25359 25360 /** 25361 * WordPress dependencies 25362 */ 25363 25364 25365 25366 25367 25368 25369 25370 25371 25372 25373 /** 25374 * Internal dependencies 25375 */ 25376 25377 25378 25379 25380 25381 25382 25383 function DocumentTools({ 25384 className, 25385 disableBlockTools = false 25386 }) { 25387 const { 25388 setIsInserterOpened, 25389 setIsListViewOpened 25390 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 25391 const { 25392 isDistractionFree, 25393 isInserterOpened, 25394 isListViewOpen, 25395 listViewShortcut, 25396 inserterSidebarToggleRef, 25397 listViewToggleRef, 25398 hasFixedToolbar, 25399 showIconLabels 25400 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 25401 const { 25402 getSettings 25403 } = select(external_wp_blockEditor_namespaceObject.store); 25404 const { 25405 get 25406 } = select(external_wp_preferences_namespaceObject.store); 25407 const { 25408 isListViewOpened, 25409 getEditorMode, 25410 getInserterSidebarToggleRef, 25411 getListViewToggleRef 25412 } = unlock(select(store_store)); 25413 const { 25414 getShortcutRepresentation 25415 } = select(external_wp_keyboardShortcuts_namespaceObject.store); 25416 const { 25417 __unstableGetEditorMode 25418 } = select(external_wp_blockEditor_namespaceObject.store); 25419 return { 25420 isInserterOpened: select(store_store).isInserterOpened(), 25421 isListViewOpen: isListViewOpened(), 25422 listViewShortcut: getShortcutRepresentation('core/editor/toggle-list-view'), 25423 inserterSidebarToggleRef: getInserterSidebarToggleRef(), 25424 listViewToggleRef: getListViewToggleRef(), 25425 hasFixedToolbar: getSettings().hasFixedToolbar, 25426 showIconLabels: get('core', 'showIconLabels'), 25427 isDistractionFree: get('core', 'distractionFree'), 25428 isVisualMode: getEditorMode() === 'visual', 25429 isZoomedOutView: __unstableGetEditorMode() === 'zoom-out' 25430 }; 25431 }, []); 25432 const preventDefault = event => { 25433 // Because the inserter behaves like a dialog, 25434 // if the inserter is opened already then when we click on the toggle button 25435 // then the initial click event will close the inserter and then be propagated 25436 // to the inserter toggle and it will open it again. 25437 // To prevent this we need to stop the propagation of the event. 25438 // This won't be necessary when the inserter no longer behaves like a dialog. 25439 25440 if (isInserterOpened) { 25441 event.preventDefault(); 25442 } 25443 }; 25444 const isLargeViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium'); 25445 const isWideViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('wide'); 25446 25447 /* translators: accessibility text for the editor toolbar */ 25448 const toolbarAriaLabel = (0,external_wp_i18n_namespaceObject.__)('Document tools'); 25449 const toggleListView = (0,external_wp_element_namespaceObject.useCallback)(() => setIsListViewOpened(!isListViewOpen), [setIsListViewOpened, isListViewOpen]); 25450 const toggleInserter = (0,external_wp_element_namespaceObject.useCallback)(() => setIsInserterOpened(!isInserterOpened), [isInserterOpened, setIsInserterOpened]); 25451 25452 /* translators: button label text should, if possible, be under 16 characters. */ 25453 const longLabel = (0,external_wp_i18n_namespaceObject._x)('Toggle block inserter', 'Generic label for block inserter button'); 25454 const shortLabel = !isInserterOpened ? (0,external_wp_i18n_namespaceObject.__)('Add') : (0,external_wp_i18n_namespaceObject.__)('Close'); 25455 return ( 25456 /*#__PURE__*/ 25457 // Some plugins expect and use the `edit-post-header-toolbar` CSS class to 25458 // find the toolbar and inject UI elements into it. This is not officially 25459 // supported, but we're keeping it in the list of class names for backwards 25460 // compatibility. 25461 (0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.NavigableToolbar, { 25462 className: dist_clsx('editor-document-tools', 'edit-post-header-toolbar', className), 25463 "aria-label": toolbarAriaLabel, 25464 variant: "unstyled", 25465 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 25466 className: "editor-document-tools__left", 25467 children: [!isDistractionFree && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ToolbarItem, { 25468 ref: inserterSidebarToggleRef, 25469 as: external_wp_components_namespaceObject.Button, 25470 className: "editor-document-tools__inserter-toggle", 25471 variant: "primary", 25472 isPressed: isInserterOpened, 25473 onMouseDown: preventDefault, 25474 onClick: toggleInserter, 25475 disabled: disableBlockTools, 25476 icon: library_plus, 25477 label: showIconLabels ? shortLabel : longLabel, 25478 showTooltip: !showIconLabels, 25479 "aria-expanded": isInserterOpened 25480 }), (isWideViewport || !showIconLabels) && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 25481 children: [isLargeViewport && !hasFixedToolbar && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ToolbarItem, { 25482 as: external_wp_blockEditor_namespaceObject.ToolSelector, 25483 showTooltip: !showIconLabels, 25484 variant: showIconLabels ? 'tertiary' : undefined, 25485 disabled: disableBlockTools, 25486 size: "compact" 25487 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ToolbarItem, { 25488 as: editor_history_undo, 25489 showTooltip: !showIconLabels, 25490 variant: showIconLabels ? 'tertiary' : undefined, 25491 size: "compact" 25492 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ToolbarItem, { 25493 as: editor_history_redo, 25494 showTooltip: !showIconLabels, 25495 variant: showIconLabels ? 'tertiary' : undefined, 25496 size: "compact" 25497 }), !isDistractionFree && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ToolbarItem, { 25498 as: external_wp_components_namespaceObject.Button, 25499 className: "editor-document-tools__document-overview-toggle", 25500 icon: list_view, 25501 disabled: disableBlockTools, 25502 isPressed: isListViewOpen 25503 /* translators: button label text should, if possible, be under 16 characters. */, 25504 label: (0,external_wp_i18n_namespaceObject.__)('Document Overview'), 25505 onClick: toggleListView, 25506 shortcut: listViewShortcut, 25507 showTooltip: !showIconLabels, 25508 variant: showIconLabels ? 'tertiary' : undefined, 25509 "aria-expanded": isListViewOpen, 25510 ref: listViewToggleRef, 25511 size: "compact" 25512 })] 25513 })] 25514 }) 25515 }) 25516 ); 25517 } 25518 /* harmony default export */ const document_tools = (DocumentTools); 25519 25520 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/more-vertical.js 25521 /** 25522 * WordPress dependencies 25523 */ 25524 25525 25526 const moreVertical = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 25527 xmlns: "http://www.w3.org/2000/svg", 25528 viewBox: "0 0 24 24", 25529 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 25530 d: "M13 19h-2v-2h2v2zm0-6h-2v-2h2v2zm0-6h-2V5h2v2z" 25531 }) 25532 }); 25533 /* harmony default export */ const more_vertical = (moreVertical); 25534 25535 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/more-menu/copy-content-menu-item.js 25536 /** 25537 * WordPress dependencies 25538 */ 25539 25540 25541 25542 25543 25544 25545 25546 25547 /** 25548 * Internal dependencies 25549 */ 25550 25551 25552 function CopyContentMenuItem() { 25553 const { 25554 createNotice 25555 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); 25556 const { 25557 getCurrentPostId, 25558 getCurrentPostType 25559 } = (0,external_wp_data_namespaceObject.useSelect)(store_store); 25560 const { 25561 getEditedEntityRecord 25562 } = (0,external_wp_data_namespaceObject.useSelect)(external_wp_coreData_namespaceObject.store); 25563 function getText() { 25564 const record = getEditedEntityRecord('postType', getCurrentPostType(), getCurrentPostId()); 25565 if (!record) { 25566 return ''; 25567 } 25568 if (typeof record.content === 'function') { 25569 return record.content(record); 25570 } else if (record.blocks) { 25571 return (0,external_wp_blocks_namespaceObject.__unstableSerializeAndClean)(record.blocks); 25572 } else if (record.content) { 25573 return record.content; 25574 } 25575 } 25576 function onSuccess() { 25577 createNotice('info', (0,external_wp_i18n_namespaceObject.__)('All content copied.'), { 25578 isDismissible: true, 25579 type: 'snackbar' 25580 }); 25581 } 25582 const ref = (0,external_wp_compose_namespaceObject.useCopyToClipboard)(getText, onSuccess); 25583 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItem, { 25584 ref: ref, 25585 children: (0,external_wp_i18n_namespaceObject.__)('Copy all blocks') 25586 }); 25587 } 25588 25589 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/mode-switcher/index.js 25590 /** 25591 * WordPress dependencies 25592 */ 25593 25594 25595 25596 25597 25598 /** 25599 * Internal dependencies 25600 */ 25601 25602 25603 /** 25604 * Set of available mode options. 25605 * 25606 * @type {Array} 25607 */ 25608 25609 const MODES = [{ 25610 value: 'visual', 25611 label: (0,external_wp_i18n_namespaceObject.__)('Visual editor') 25612 }, { 25613 value: 'text', 25614 label: (0,external_wp_i18n_namespaceObject.__)('Code editor') 25615 }]; 25616 function ModeSwitcher() { 25617 const { 25618 shortcut, 25619 isRichEditingEnabled, 25620 isCodeEditingEnabled, 25621 mode 25622 } = (0,external_wp_data_namespaceObject.useSelect)(select => ({ 25623 shortcut: select(external_wp_keyboardShortcuts_namespaceObject.store).getShortcutRepresentation('core/editor/toggle-mode'), 25624 isRichEditingEnabled: select(store_store).getEditorSettings().richEditingEnabled, 25625 isCodeEditingEnabled: select(store_store).getEditorSettings().codeEditingEnabled, 25626 mode: select(store_store).getEditorMode() 25627 }), []); 25628 const { 25629 switchEditorMode 25630 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 25631 let selectedMode = mode; 25632 if (!isRichEditingEnabled && mode === 'visual') { 25633 selectedMode = 'text'; 25634 } 25635 if (!isCodeEditingEnabled && mode === 'text') { 25636 selectedMode = 'visual'; 25637 } 25638 const choices = MODES.map(choice => { 25639 if (!isCodeEditingEnabled && choice.value === 'text') { 25640 choice = { 25641 ...choice, 25642 disabled: true 25643 }; 25644 } 25645 if (!isRichEditingEnabled && choice.value === 'visual') { 25646 choice = { 25647 ...choice, 25648 disabled: true, 25649 info: (0,external_wp_i18n_namespaceObject.__)('You can enable the visual editor in your profile settings.') 25650 }; 25651 } 25652 if (choice.value !== selectedMode && !choice.disabled) { 25653 return { 25654 ...choice, 25655 shortcut 25656 }; 25657 } 25658 return choice; 25659 }); 25660 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuGroup, { 25661 label: (0,external_wp_i18n_namespaceObject.__)('Editor'), 25662 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItemsChoice, { 25663 choices: choices, 25664 value: selectedMode, 25665 onSelect: switchEditorMode 25666 }) 25667 }); 25668 } 25669 /* harmony default export */ const mode_switcher = (ModeSwitcher); 25670 25671 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/more-menu/tools-more-menu-group.js 25672 /** 25673 * WordPress dependencies 25674 */ 25675 25676 25677 const { 25678 Fill: ToolsMoreMenuGroup, 25679 Slot: tools_more_menu_group_Slot 25680 } = (0,external_wp_components_namespaceObject.createSlotFill)('ToolsMoreMenuGroup'); 25681 ToolsMoreMenuGroup.Slot = ({ 25682 fillProps 25683 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(tools_more_menu_group_Slot, { 25684 fillProps: fillProps 25685 }); 25686 /* harmony default export */ const tools_more_menu_group = (ToolsMoreMenuGroup); 25687 25688 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/more-menu/view-more-menu-group.js 25689 /** 25690 * WordPress dependencies 25691 */ 25692 25693 25694 25695 const { 25696 Fill: ViewMoreMenuGroup, 25697 Slot: view_more_menu_group_Slot 25698 } = (0,external_wp_components_namespaceObject.createSlotFill)(external_wp_element_namespaceObject.Platform.OS === 'web' ? Symbol('ViewMoreMenuGroup') : 'ViewMoreMenuGroup'); 25699 ViewMoreMenuGroup.Slot = ({ 25700 fillProps 25701 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(view_more_menu_group_Slot, { 25702 fillProps: fillProps 25703 }); 25704 /* harmony default export */ const view_more_menu_group = (ViewMoreMenuGroup); 25705 25706 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/more-menu/index.js 25707 /** 25708 * WordPress dependencies 25709 */ 25710 25711 25712 25713 25714 25715 25716 25717 25718 /** 25719 * Internal dependencies 25720 */ 25721 25722 25723 25724 25725 25726 25727 25728 25729 function MoreMenu() { 25730 const { 25731 openModal 25732 } = (0,external_wp_data_namespaceObject.useDispatch)(store); 25733 const { 25734 set: setPreference 25735 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_preferences_namespaceObject.store); 25736 const { 25737 toggleDistractionFree 25738 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 25739 const showIconLabels = (0,external_wp_data_namespaceObject.useSelect)(select => select(external_wp_preferences_namespaceObject.store).get('core', 'showIconLabels'), []); 25740 const turnOffDistractionFree = () => { 25741 setPreference('core', 'distractionFree', false); 25742 }; 25743 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_ReactJSXRuntime_namespaceObject.Fragment, { 25744 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.DropdownMenu, { 25745 icon: more_vertical, 25746 label: (0,external_wp_i18n_namespaceObject.__)('Options'), 25747 popoverProps: { 25748 placement: 'bottom-end', 25749 className: 'more-menu-dropdown__content' 25750 }, 25751 toggleProps: { 25752 showTooltip: !showIconLabels, 25753 ...(showIconLabels && { 25754 variant: 'tertiary' 25755 }), 25756 tooltipPosition: 'bottom', 25757 size: 'compact' 25758 }, 25759 children: ({ 25760 onClose 25761 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 25762 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.MenuGroup, { 25763 label: (0,external_wp_i18n_namespaceObject._x)('View', 'noun'), 25764 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_preferences_namespaceObject.PreferenceToggleMenuItem, { 25765 scope: "core", 25766 name: "fixedToolbar", 25767 onToggle: turnOffDistractionFree, 25768 label: (0,external_wp_i18n_namespaceObject.__)('Top toolbar'), 25769 info: (0,external_wp_i18n_namespaceObject.__)('Access all block and document tools in a single place'), 25770 messageActivated: (0,external_wp_i18n_namespaceObject.__)('Top toolbar activated'), 25771 messageDeactivated: (0,external_wp_i18n_namespaceObject.__)('Top toolbar deactivated') 25772 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_preferences_namespaceObject.PreferenceToggleMenuItem, { 25773 scope: "core", 25774 name: "distractionFree", 25775 label: (0,external_wp_i18n_namespaceObject.__)('Distraction free'), 25776 info: (0,external_wp_i18n_namespaceObject.__)('Write with calmness'), 25777 handleToggling: false, 25778 onToggle: toggleDistractionFree, 25779 messageActivated: (0,external_wp_i18n_namespaceObject.__)('Distraction free mode activated'), 25780 messageDeactivated: (0,external_wp_i18n_namespaceObject.__)('Distraction free mode deactivated'), 25781 shortcut: external_wp_keycodes_namespaceObject.displayShortcut.primaryShift('\\') 25782 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_preferences_namespaceObject.PreferenceToggleMenuItem, { 25783 scope: "core", 25784 name: "focusMode", 25785 label: (0,external_wp_i18n_namespaceObject.__)('Spotlight mode'), 25786 info: (0,external_wp_i18n_namespaceObject.__)('Focus on one block at a time'), 25787 messageActivated: (0,external_wp_i18n_namespaceObject.__)('Spotlight mode activated'), 25788 messageDeactivated: (0,external_wp_i18n_namespaceObject.__)('Spotlight mode deactivated') 25789 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(view_more_menu_group.Slot, { 25790 fillProps: { 25791 onClose 25792 } 25793 })] 25794 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(mode_switcher, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(action_item.Slot, { 25795 name: "core/plugin-more-menu", 25796 label: (0,external_wp_i18n_namespaceObject.__)('Plugins'), 25797 as: external_wp_components_namespaceObject.MenuGroup, 25798 fillProps: { 25799 onClick: onClose 25800 } 25801 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.MenuGroup, { 25802 label: (0,external_wp_i18n_namespaceObject.__)('Tools'), 25803 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItem, { 25804 onClick: () => openModal('editor/keyboard-shortcut-help'), 25805 shortcut: external_wp_keycodes_namespaceObject.displayShortcut.access('h'), 25806 children: (0,external_wp_i18n_namespaceObject.__)('Keyboard shortcuts') 25807 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(CopyContentMenuItem, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.MenuItem, { 25808 icon: library_external, 25809 href: (0,external_wp_i18n_namespaceObject.__)('https://wordpress.org/documentation/article/wordpress-block-editor/'), 25810 target: "_blank", 25811 rel: "noopener noreferrer", 25812 children: [(0,external_wp_i18n_namespaceObject.__)('Help'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.VisuallyHidden, { 25813 as: "span", 25814 children: /* translators: accessibility text */ 25815 (0,external_wp_i18n_namespaceObject.__)('(opens in a new tab)') 25816 })] 25817 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(tools_more_menu_group.Slot, { 25818 fillProps: { 25819 onClose 25820 } 25821 })] 25822 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuGroup, { 25823 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItem, { 25824 onClick: () => openModal('editor/preferences'), 25825 children: (0,external_wp_i18n_namespaceObject.__)('Preferences') 25826 }) 25827 })] 25828 }) 25829 }) 25830 }); 25831 } 25832 25833 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-button/post-publish-button-or-toggle.js 25834 /** 25835 * WordPress dependencies 25836 */ 25837 25838 25839 25840 /** 25841 * Internal dependencies 25842 */ 25843 25844 25845 25846 function PostPublishButtonOrToggle({ 25847 forceIsDirty, 25848 hasPublishAction, 25849 isBeingScheduled, 25850 isPending, 25851 isPublished, 25852 isPublishSidebarEnabled, 25853 isPublishSidebarOpened, 25854 isScheduled, 25855 togglePublishSidebar, 25856 setEntitiesSavedStatesCallback, 25857 postStatusHasChanged, 25858 postStatus 25859 }) { 25860 const IS_TOGGLE = 'toggle'; 25861 const IS_BUTTON = 'button'; 25862 const isSmallerThanMediumViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium', '<'); 25863 let component; 25864 25865 /** 25866 * Conditions to show a BUTTON (publish directly) or a TOGGLE (open publish sidebar): 25867 * 25868 * 1) We want to show a BUTTON when the post status is at the _final stage_ 25869 * for a particular role (see https://wordpress.org/documentation/article/post-status/): 25870 * 25871 * - is published 25872 * - post status has changed explicitely to something different than 'future' or 'publish' 25873 * - is scheduled to be published 25874 * - is pending and can't be published (but only for viewports >= medium). 25875 * Originally, we considered showing a button for pending posts that couldn't be published 25876 * (for example, for an author with the contributor role). Some languages can have 25877 * long translations for "Submit for review", so given the lack of UI real estate available 25878 * we decided to take into account the viewport in that case. 25879 * See: https://github.com/WordPress/gutenberg/issues/10475 25880 * 25881 * 2) Then, in small viewports, we'll show a TOGGLE. 25882 * 25883 * 3) Finally, we'll use the publish sidebar status to decide: 25884 * 25885 * - if it is enabled, we show a TOGGLE 25886 * - if it is disabled, we show a BUTTON 25887 */ 25888 if (isPublished || postStatusHasChanged && !['future', 'publish'].includes(postStatus) || isScheduled && isBeingScheduled || isPending && !hasPublishAction && !isSmallerThanMediumViewport) { 25889 component = IS_BUTTON; 25890 } else if (isSmallerThanMediumViewport || isPublishSidebarEnabled) { 25891 component = IS_TOGGLE; 25892 } else { 25893 component = IS_BUTTON; 25894 } 25895 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_publish_button, { 25896 forceIsDirty: forceIsDirty, 25897 isOpen: isPublishSidebarOpened, 25898 isToggle: component === IS_TOGGLE, 25899 onToggle: togglePublishSidebar, 25900 setEntitiesSavedStatesCallback: setEntitiesSavedStatesCallback 25901 }); 25902 } 25903 /* harmony default export */ const post_publish_button_or_toggle = ((0,external_wp_compose_namespaceObject.compose)((0,external_wp_data_namespaceObject.withSelect)(select => { 25904 var _select$getCurrentPos; 25905 return { 25906 hasPublishAction: (_select$getCurrentPos = select(store_store).getCurrentPost()?._links?.['wp:action-publish']) !== null && _select$getCurrentPos !== void 0 ? _select$getCurrentPos : false, 25907 isBeingScheduled: select(store_store).isEditedPostBeingScheduled(), 25908 isPending: select(store_store).isCurrentPostPending(), 25909 isPublished: select(store_store).isCurrentPostPublished(), 25910 isPublishSidebarEnabled: select(store_store).isPublishSidebarEnabled(), 25911 isPublishSidebarOpened: select(store_store).isPublishSidebarOpened(), 25912 isScheduled: select(store_store).isCurrentPostScheduled(), 25913 postStatus: select(store_store).getEditedPostAttribute('status'), 25914 postStatusHasChanged: select(store_store).getPostEdits()?.status 25915 }; 25916 }), (0,external_wp_data_namespaceObject.withDispatch)(dispatch => { 25917 const { 25918 togglePublishSidebar 25919 } = dispatch(store_store); 25920 return { 25921 togglePublishSidebar 25922 }; 25923 }))(PostPublishButtonOrToggle)); 25924 25925 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-view-link/index.js 25926 /** 25927 * WordPress dependencies 25928 */ 25929 25930 25931 25932 25933 25934 25935 25936 /** 25937 * Internal dependencies 25938 */ 25939 25940 25941 function PostViewLink() { 25942 const { 25943 hasLoaded, 25944 permalink, 25945 isPublished, 25946 label, 25947 showIconLabels 25948 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 25949 // Grab post type to retrieve the view_item label. 25950 const postTypeSlug = select(store_store).getCurrentPostType(); 25951 const postType = select(external_wp_coreData_namespaceObject.store).getPostType(postTypeSlug); 25952 const { 25953 get 25954 } = select(external_wp_preferences_namespaceObject.store); 25955 return { 25956 permalink: select(store_store).getPermalink(), 25957 isPublished: select(store_store).isCurrentPostPublished(), 25958 label: postType?.labels.view_item, 25959 hasLoaded: !!postType, 25960 showIconLabels: get('core', 'showIconLabels') 25961 }; 25962 }, []); 25963 25964 // Only render the view button if the post is published and has a permalink. 25965 if (!isPublished || !permalink || !hasLoaded) { 25966 return null; 25967 } 25968 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 25969 icon: library_external, 25970 label: label || (0,external_wp_i18n_namespaceObject.__)('View post'), 25971 href: permalink, 25972 target: "_blank", 25973 showTooltip: !showIconLabels, 25974 size: "compact" 25975 }); 25976 } 25977 25978 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/desktop.js 25979 /** 25980 * WordPress dependencies 25981 */ 25982 25983 25984 const desktop = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 25985 xmlns: "http://www.w3.org/2000/svg", 25986 viewBox: "0 0 24 24", 25987 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 25988 d: "M20.5 16h-.7V8c0-1.1-.9-2-2-2H6.2c-1.1 0-2 .9-2 2v8h-.7c-.8 0-1.5.7-1.5 1.5h20c0-.8-.7-1.5-1.5-1.5zM5.7 8c0-.3.2-.5.5-.5h11.6c.3 0 .5.2.5.5v7.6H5.7V8z" 25989 }) 25990 }); 25991 /* harmony default export */ const library_desktop = (desktop); 25992 25993 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/mobile.js 25994 /** 25995 * WordPress dependencies 25996 */ 25997 25998 25999 const mobile = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 26000 xmlns: "http://www.w3.org/2000/svg", 26001 viewBox: "0 0 24 24", 26002 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 26003 d: "M15 4H9c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h6c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm.5 14c0 .3-.2.5-.5.5H9c-.3 0-.5-.2-.5-.5V6c0-.3.2-.5.5-.5h6c.3 0 .5.2.5.5v12zm-4.5-.5h2V16h-2v1.5z" 26004 }) 26005 }); 26006 /* harmony default export */ const library_mobile = (mobile); 26007 26008 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/tablet.js 26009 /** 26010 * WordPress dependencies 26011 */ 26012 26013 26014 const tablet = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 26015 xmlns: "http://www.w3.org/2000/svg", 26016 viewBox: "0 0 24 24", 26017 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 26018 d: "M17 4H7c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm.5 14c0 .3-.2.5-.5.5H7c-.3 0-.5-.2-.5-.5V6c0-.3.2-.5.5-.5h10c.3 0 .5.2.5.5v12zm-7.5-.5h4V16h-4v1.5z" 26019 }) 26020 }); 26021 /* harmony default export */ const library_tablet = (tablet); 26022 26023 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/preview-dropdown/index.js 26024 /** 26025 * External dependencies 26026 */ 26027 26028 26029 /** 26030 * WordPress dependencies 26031 */ 26032 26033 26034 26035 26036 26037 26038 26039 26040 26041 /** 26042 * Internal dependencies 26043 */ 26044 26045 26046 26047 26048 26049 26050 26051 function PreviewDropdown({ 26052 forceIsAutosaveable, 26053 disabled 26054 }) { 26055 const { 26056 deviceType, 26057 homeUrl, 26058 isTemplate, 26059 isViewable, 26060 showIconLabels 26061 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 26062 var _getPostType$viewable; 26063 const { 26064 getDeviceType, 26065 getCurrentPostType 26066 } = select(store_store); 26067 const { 26068 getEntityRecord, 26069 getPostType 26070 } = select(external_wp_coreData_namespaceObject.store); 26071 const { 26072 get 26073 } = select(external_wp_preferences_namespaceObject.store); 26074 const _currentPostType = getCurrentPostType(); 26075 return { 26076 deviceType: getDeviceType(), 26077 homeUrl: getEntityRecord('root', '__unstableBase')?.home, 26078 isTemplate: _currentPostType === 'wp_template', 26079 isViewable: (_getPostType$viewable = getPostType(_currentPostType)?.viewable) !== null && _getPostType$viewable !== void 0 ? _getPostType$viewable : false, 26080 showIconLabels: get('core', 'showIconLabels') 26081 }; 26082 }, []); 26083 const { 26084 setDeviceType 26085 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 26086 const { 26087 __unstableSetEditorMode 26088 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_blockEditor_namespaceObject.store); 26089 const { 26090 resetZoomLevel 26091 } = unlock((0,external_wp_data_namespaceObject.useDispatch)(external_wp_blockEditor_namespaceObject.store)); 26092 const handleDevicePreviewChange = newDeviceType => { 26093 setDeviceType(newDeviceType); 26094 __unstableSetEditorMode('edit'); 26095 resetZoomLevel(); 26096 }; 26097 const isMobile = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium', '<'); 26098 if (isMobile) { 26099 return null; 26100 } 26101 const popoverProps = { 26102 placement: 'bottom-end' 26103 }; 26104 const toggleProps = { 26105 className: 'editor-preview-dropdown__toggle', 26106 iconPosition: 'right', 26107 size: 'compact', 26108 showTooltip: !showIconLabels, 26109 disabled, 26110 accessibleWhenDisabled: disabled 26111 }; 26112 const menuProps = { 26113 'aria-label': (0,external_wp_i18n_namespaceObject.__)('View options') 26114 }; 26115 const deviceIcons = { 26116 desktop: library_desktop, 26117 mobile: library_mobile, 26118 tablet: library_tablet 26119 }; 26120 26121 /** 26122 * The choices for the device type. 26123 * 26124 * @type {Array} 26125 */ 26126 const choices = [{ 26127 value: 'Desktop', 26128 label: (0,external_wp_i18n_namespaceObject.__)('Desktop'), 26129 icon: library_desktop 26130 }, { 26131 value: 'Tablet', 26132 label: (0,external_wp_i18n_namespaceObject.__)('Tablet'), 26133 icon: library_tablet 26134 }, { 26135 value: 'Mobile', 26136 label: (0,external_wp_i18n_namespaceObject.__)('Mobile'), 26137 icon: library_mobile 26138 }]; 26139 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.DropdownMenu, { 26140 className: dist_clsx('editor-preview-dropdown', `editor-preview-dropdown--$deviceType.toLowerCase()}`), 26141 popoverProps: popoverProps, 26142 toggleProps: toggleProps, 26143 menuProps: menuProps, 26144 icon: deviceIcons[deviceType.toLowerCase()], 26145 label: (0,external_wp_i18n_namespaceObject.__)('View'), 26146 disableOpenOnArrowDown: disabled, 26147 children: ({ 26148 onClose 26149 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 26150 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuGroup, { 26151 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuItemsChoice, { 26152 choices: choices, 26153 value: deviceType, 26154 onSelect: handleDevicePreviewChange 26155 }) 26156 }), isTemplate && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuGroup, { 26157 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.MenuItem, { 26158 href: homeUrl, 26159 target: "_blank", 26160 icon: library_external, 26161 onClick: onClose, 26162 children: [(0,external_wp_i18n_namespaceObject.__)('View site'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.VisuallyHidden, { 26163 as: "span", 26164 children: /* translators: accessibility text */ 26165 (0,external_wp_i18n_namespaceObject.__)('(opens in a new tab)') 26166 })] 26167 }) 26168 }), isViewable && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.MenuGroup, { 26169 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostPreviewButton, { 26170 className: "editor-preview-dropdown__button-external", 26171 role: "menuitem", 26172 forceIsAutosaveable: forceIsAutosaveable, 26173 "aria-label": (0,external_wp_i18n_namespaceObject.__)('Preview in new tab'), 26174 textContent: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 26175 children: [(0,external_wp_i18n_namespaceObject.__)('Preview in new tab'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Icon, { 26176 icon: library_external 26177 })] 26178 }), 26179 onPreview: onClose 26180 }) 26181 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(action_item.Slot, { 26182 name: "core/plugin-preview-menu", 26183 as: external_wp_components_namespaceObject.MenuGroup, 26184 fillProps: { 26185 onClick: onClose 26186 } 26187 })] 26188 }) 26189 }); 26190 } 26191 26192 ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/square.js 26193 /** 26194 * WordPress dependencies 26195 */ 26196 26197 26198 const square = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { 26199 xmlns: "http://www.w3.org/2000/svg", 26200 viewBox: "0 0 24 24", 26201 fill: "none", 26202 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { 26203 fill: "none", 26204 d: "M5.75 12.75V18.25H11.25M12.75 5.75H18.25V11.25", 26205 stroke: "currentColor", 26206 strokeWidth: "1.5", 26207 strokeLinecap: "square" 26208 }) 26209 }); 26210 /* harmony default export */ const library_square = (square); 26211 26212 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/zoom-out-toggle/index.js 26213 /** 26214 * WordPress dependencies 26215 */ 26216 26217 26218 26219 26220 26221 26222 26223 /** 26224 * Internal dependencies 26225 */ 26226 26227 26228 const ZoomOutToggle = ({ 26229 disabled 26230 }) => { 26231 const { 26232 isZoomOut, 26233 showIconLabels 26234 } = (0,external_wp_data_namespaceObject.useSelect)(select => ({ 26235 isZoomOut: unlock(select(external_wp_blockEditor_namespaceObject.store)).isZoomOut(), 26236 showIconLabels: select(external_wp_preferences_namespaceObject.store).get('core', 'showIconLabels') 26237 })); 26238 const { 26239 resetZoomLevel, 26240 setZoomLevel, 26241 __unstableSetEditorMode 26242 } = unlock((0,external_wp_data_namespaceObject.useDispatch)(external_wp_blockEditor_namespaceObject.store)); 26243 const handleZoomOut = () => { 26244 if (isZoomOut) { 26245 resetZoomLevel(); 26246 } else { 26247 setZoomLevel(50); 26248 } 26249 __unstableSetEditorMode(isZoomOut ? 'edit' : 'zoom-out'); 26250 }; 26251 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 26252 accessibleWhenDisabled: true, 26253 disabled: disabled, 26254 onClick: handleZoomOut, 26255 icon: library_square, 26256 label: (0,external_wp_i18n_namespaceObject.__)('Zoom Out'), 26257 isPressed: isZoomOut, 26258 size: "compact", 26259 showTooltip: !showIconLabels 26260 }); 26261 }; 26262 /* harmony default export */ const zoom_out_toggle = (ZoomOutToggle); 26263 26264 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/header/index.js 26265 /** 26266 * WordPress dependencies 26267 */ 26268 26269 26270 26271 26272 26273 26274 26275 26276 /** 26277 * Internal dependencies 26278 */ 26279 26280 26281 26282 26283 26284 26285 26286 26287 26288 26289 26290 26291 26292 26293 const toolbarVariations = { 26294 distractionFreeDisabled: { 26295 y: '-50px' 26296 }, 26297 distractionFreeHover: { 26298 y: 0 26299 }, 26300 distractionFreeHidden: { 26301 y: '-50px' 26302 }, 26303 visible: { 26304 y: 0 26305 }, 26306 hidden: { 26307 y: 0 26308 } 26309 }; 26310 const backButtonVariations = { 26311 distractionFreeDisabled: { 26312 x: '-100%' 26313 }, 26314 distractionFreeHover: { 26315 x: 0 26316 }, 26317 distractionFreeHidden: { 26318 x: '-100%' 26319 }, 26320 visible: { 26321 x: 0 26322 }, 26323 hidden: { 26324 x: 0 26325 } 26326 }; 26327 function Header({ 26328 customSaveButton, 26329 forceIsDirty, 26330 forceDisableBlockTools, 26331 setEntitiesSavedStatesCallback, 26332 title, 26333 isEditorIframed 26334 }) { 26335 const isWideViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('large'); 26336 const isLargeViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium'); 26337 const isTooNarrowForDocumentBar = (0,external_wp_compose_namespaceObject.useMediaQuery)('(max-width: 403px)'); 26338 const { 26339 isTextEditor, 26340 isPublishSidebarOpened, 26341 showIconLabels, 26342 hasFixedToolbar, 26343 hasBlockSelection, 26344 isNestedEntity 26345 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 26346 const { 26347 get: getPreference 26348 } = select(external_wp_preferences_namespaceObject.store); 26349 const { 26350 getEditorMode, 26351 getEditorSettings, 26352 isPublishSidebarOpened: _isPublishSidebarOpened 26353 } = select(store_store); 26354 const { 26355 __unstableGetEditorMode 26356 } = select(external_wp_blockEditor_namespaceObject.store); 26357 return { 26358 isTextEditor: getEditorMode() === 'text', 26359 isPublishSidebarOpened: _isPublishSidebarOpened(), 26360 showIconLabels: getPreference('core', 'showIconLabels'), 26361 hasFixedToolbar: getPreference('core', 'fixedToolbar'), 26362 hasBlockSelection: !!select(external_wp_blockEditor_namespaceObject.store).getBlockSelectionStart(), 26363 isNestedEntity: !!getEditorSettings().onNavigateToPreviousEntityRecord, 26364 isZoomedOutView: __unstableGetEditorMode() === 'zoom-out' 26365 }; 26366 }, []); 26367 const [isBlockToolsCollapsed, setIsBlockToolsCollapsed] = (0,external_wp_element_namespaceObject.useState)(true); 26368 const hasCenter = (!hasBlockSelection || isBlockToolsCollapsed) && !isTooNarrowForDocumentBar; 26369 const hasBackButton = useHasBackButton(); 26370 26371 // The edit-post-header classname is only kept for backward compatibilty 26372 // as some plugins might be relying on its presence. 26373 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 26374 className: "editor-header edit-post-header", 26375 children: [hasBackButton && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__unstableMotion.div, { 26376 className: "editor-header__back-button", 26377 variants: backButtonVariations, 26378 transition: { 26379 type: 'tween' 26380 }, 26381 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(back_button.Slot, {}) 26382 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__unstableMotion.div, { 26383 variants: toolbarVariations, 26384 className: "editor-header__toolbar", 26385 transition: { 26386 type: 'tween' 26387 }, 26388 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(document_tools, { 26389 disableBlockTools: forceDisableBlockTools || isTextEditor 26390 }), hasFixedToolbar && isLargeViewport && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(CollapsibleBlockToolbar, { 26391 isCollapsed: isBlockToolsCollapsed, 26392 onToggle: setIsBlockToolsCollapsed 26393 })] 26394 }), hasCenter && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__unstableMotion.div, { 26395 className: "editor-header__center", 26396 variants: toolbarVariations, 26397 transition: { 26398 type: 'tween' 26399 }, 26400 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(DocumentBar, { 26401 title: title 26402 }) 26403 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__unstableMotion.div, { 26404 variants: toolbarVariations, 26405 transition: { 26406 type: 'tween' 26407 }, 26408 className: "editor-header__settings", 26409 children: [!customSaveButton && !isPublishSidebarOpened && 26410 /*#__PURE__*/ 26411 // This button isn't completely hidden by the publish sidebar. 26412 // We can't hide the whole toolbar when the publish sidebar is open because 26413 // we want to prevent mounting/unmounting the PostPublishButtonOrToggle DOM node. 26414 // We track that DOM node to return focus to the PostPublishButtonOrToggle 26415 // when the publish sidebar has been closed. 26416 (0,external_ReactJSXRuntime_namespaceObject.jsx)(PostSavedState, { 26417 forceIsDirty: forceIsDirty 26418 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PreviewDropdown, { 26419 forceIsAutosaveable: forceIsDirty, 26420 disabled: isNestedEntity 26421 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostPreviewButton, { 26422 className: "editor-header__post-preview-button", 26423 forceIsAutosaveable: forceIsDirty 26424 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostViewLink, {}), isEditorIframed && isWideViewport && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(zoom_out_toggle, { 26425 disabled: forceDisableBlockTools 26426 }), (isWideViewport || !showIconLabels) && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(pinned_items.Slot, { 26427 scope: "core" 26428 }), !customSaveButton && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_publish_button_or_toggle, { 26429 forceIsDirty: forceIsDirty, 26430 setEntitiesSavedStatesCallback: setEntitiesSavedStatesCallback 26431 }), customSaveButton, /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(MoreMenu, {})] 26432 })] 26433 }); 26434 } 26435 /* harmony default export */ const components_header = (Header); 26436 26437 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/inserter-sidebar/index.js 26438 /** 26439 * WordPress dependencies 26440 */ 26441 26442 26443 26444 26445 26446 26447 26448 26449 /** 26450 * Internal dependencies 26451 */ 26452 26453 26454 26455 const { 26456 PrivateInserterLibrary 26457 } = unlock(external_wp_blockEditor_namespaceObject.privateApis); 26458 function InserterSidebar() { 26459 const { 26460 blockSectionRootClientId, 26461 inserterSidebarToggleRef, 26462 insertionPoint, 26463 showMostUsedBlocks, 26464 sidebarIsOpened 26465 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 26466 const { 26467 getInserterSidebarToggleRef, 26468 getInsertionPoint, 26469 isPublishSidebarOpened 26470 } = unlock(select(store_store)); 26471 const { 26472 getBlockRootClientId, 26473 __unstableGetEditorMode, 26474 getSectionRootClientId 26475 } = unlock(select(external_wp_blockEditor_namespaceObject.store)); 26476 const { 26477 get 26478 } = select(external_wp_preferences_namespaceObject.store); 26479 const { 26480 getActiveComplementaryArea 26481 } = select(store); 26482 const getBlockSectionRootClientId = () => { 26483 if (__unstableGetEditorMode() === 'zoom-out') { 26484 const sectionRootClientId = getSectionRootClientId(); 26485 if (sectionRootClientId) { 26486 return sectionRootClientId; 26487 } 26488 } 26489 return getBlockRootClientId(); 26490 }; 26491 return { 26492 inserterSidebarToggleRef: getInserterSidebarToggleRef(), 26493 insertionPoint: getInsertionPoint(), 26494 showMostUsedBlocks: get('core', 'mostUsedBlocks'), 26495 blockSectionRootClientId: getBlockSectionRootClientId(), 26496 sidebarIsOpened: !!(getActiveComplementaryArea('core') || isPublishSidebarOpened()) 26497 }; 26498 }, []); 26499 const { 26500 setIsInserterOpened 26501 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 26502 const { 26503 disableComplementaryArea 26504 } = (0,external_wp_data_namespaceObject.useDispatch)(store); 26505 const isMobileViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium', '<'); 26506 const libraryRef = (0,external_wp_element_namespaceObject.useRef)(); 26507 26508 // When closing the inserter, focus should return to the toggle button. 26509 const closeInserterSidebar = (0,external_wp_element_namespaceObject.useCallback)(() => { 26510 setIsInserterOpened(false); 26511 inserterSidebarToggleRef.current?.focus(); 26512 }, [inserterSidebarToggleRef, setIsInserterOpened]); 26513 const closeOnEscape = (0,external_wp_element_namespaceObject.useCallback)(event => { 26514 if (event.keyCode === external_wp_keycodes_namespaceObject.ESCAPE && !event.defaultPrevented) { 26515 event.preventDefault(); 26516 closeInserterSidebar(); 26517 } 26518 }, [closeInserterSidebar]); 26519 const inserterContents = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 26520 className: "editor-inserter-sidebar__content", 26521 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PrivateInserterLibrary, { 26522 showMostUsedBlocks: showMostUsedBlocks, 26523 showInserterHelpPanel: true, 26524 shouldFocusBlock: isMobileViewport, 26525 rootClientId: blockSectionRootClientId !== null && blockSectionRootClientId !== void 0 ? blockSectionRootClientId : insertionPoint.rootClientId, 26526 __experimentalInsertionIndex: insertionPoint.insertionIndex, 26527 onSelect: insertionPoint.onSelect, 26528 __experimentalInitialTab: insertionPoint.tab, 26529 __experimentalInitialCategory: insertionPoint.category, 26530 __experimentalFilterValue: insertionPoint.filterValue, 26531 onPatternCategorySelection: sidebarIsOpened ? () => disableComplementaryArea('core') : undefined, 26532 ref: libraryRef, 26533 onClose: closeInserterSidebar 26534 }) 26535 }); 26536 return ( 26537 /*#__PURE__*/ 26538 // eslint-disable-next-line jsx-a11y/no-static-element-interactions 26539 (0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 26540 onKeyDown: closeOnEscape, 26541 className: "editor-inserter-sidebar", 26542 children: inserterContents 26543 }) 26544 ); 26545 } 26546 26547 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/list-view-sidebar/list-view-outline.js 26548 /** 26549 * WordPress dependencies 26550 */ 26551 26552 26553 26554 /** 26555 * Internal dependencies 26556 */ 26557 26558 26559 26560 26561 26562 26563 26564 function ListViewOutline() { 26565 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 26566 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 26567 className: "editor-list-view-sidebar__outline", 26568 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 26569 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { 26570 children: (0,external_wp_i18n_namespaceObject.__)('Characters:') 26571 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { 26572 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(CharacterCount, {}) 26573 })] 26574 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 26575 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { 26576 children: (0,external_wp_i18n_namespaceObject.__)('Words:') 26577 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(WordCount, {})] 26578 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 26579 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { 26580 children: (0,external_wp_i18n_namespaceObject.__)('Time to read:') 26581 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TimeToRead, {})] 26582 })] 26583 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(DocumentOutline, {})] 26584 }); 26585 } 26586 26587 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/list-view-sidebar/index.js 26588 /** 26589 * WordPress dependencies 26590 */ 26591 26592 26593 26594 26595 26596 26597 26598 26599 26600 /** 26601 * Internal dependencies 26602 */ 26603 26604 26605 26606 26607 const { 26608 TabbedSidebar 26609 } = unlock(external_wp_blockEditor_namespaceObject.privateApis); 26610 function ListViewSidebar() { 26611 const { 26612 setIsListViewOpened 26613 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 26614 const { 26615 getListViewToggleRef 26616 } = unlock((0,external_wp_data_namespaceObject.useSelect)(store_store)); 26617 26618 // This hook handles focus when the sidebar first renders. 26619 const focusOnMountRef = (0,external_wp_compose_namespaceObject.useFocusOnMount)('firstElement'); 26620 26621 // When closing the list view, focus should return to the toggle button. 26622 const closeListView = (0,external_wp_element_namespaceObject.useCallback)(() => { 26623 setIsListViewOpened(false); 26624 getListViewToggleRef().current?.focus(); 26625 }, [getListViewToggleRef, setIsListViewOpened]); 26626 const closeOnEscape = (0,external_wp_element_namespaceObject.useCallback)(event => { 26627 if (event.keyCode === external_wp_keycodes_namespaceObject.ESCAPE && !event.defaultPrevented) { 26628 event.preventDefault(); 26629 closeListView(); 26630 } 26631 }, [closeListView]); 26632 26633 // Use internal state instead of a ref to make sure that the component 26634 // re-renders when the dropZoneElement updates. 26635 const [dropZoneElement, setDropZoneElement] = (0,external_wp_element_namespaceObject.useState)(null); 26636 // Tracks our current tab. 26637 const [tab, setTab] = (0,external_wp_element_namespaceObject.useState)('list-view'); 26638 26639 // This ref refers to the sidebar as a whole. 26640 const sidebarRef = (0,external_wp_element_namespaceObject.useRef)(); 26641 // This ref refers to the tab panel. 26642 const tabsRef = (0,external_wp_element_namespaceObject.useRef)(); 26643 // This ref refers to the list view application area. 26644 const listViewRef = (0,external_wp_element_namespaceObject.useRef)(); 26645 26646 // Must merge the refs together so focus can be handled properly in the next function. 26647 const listViewContainerRef = (0,external_wp_compose_namespaceObject.useMergeRefs)([focusOnMountRef, listViewRef, setDropZoneElement]); 26648 26649 /* 26650 * Callback function to handle list view or outline focus. 26651 * 26652 * @param {string} currentTab The current tab. Either list view or outline. 26653 * 26654 * @return void 26655 */ 26656 function handleSidebarFocus(currentTab) { 26657 // Tab panel focus. 26658 const tabPanelFocus = external_wp_dom_namespaceObject.focus.tabbable.find(tabsRef.current)[0]; 26659 // List view tab is selected. 26660 if (currentTab === 'list-view') { 26661 // Either focus the list view or the tab panel. Must have a fallback because the list view does not render when there are no blocks. 26662 const listViewApplicationFocus = external_wp_dom_namespaceObject.focus.tabbable.find(listViewRef.current)[0]; 26663 const listViewFocusArea = sidebarRef.current.contains(listViewApplicationFocus) ? listViewApplicationFocus : tabPanelFocus; 26664 listViewFocusArea.focus(); 26665 // Outline tab is selected. 26666 } else { 26667 tabPanelFocus.focus(); 26668 } 26669 } 26670 const handleToggleListViewShortcut = (0,external_wp_element_namespaceObject.useCallback)(() => { 26671 // If the sidebar has focus, it is safe to close. 26672 if (sidebarRef.current.contains(sidebarRef.current.ownerDocument.activeElement)) { 26673 closeListView(); 26674 } else { 26675 // If the list view or outline does not have focus, focus should be moved to it. 26676 handleSidebarFocus(tab); 26677 } 26678 }, [closeListView, tab]); 26679 26680 // This only fires when the sidebar is open because of the conditional rendering. 26681 // It is the same shortcut to open but that is defined as a global shortcut and only fires when the sidebar is closed. 26682 (0,external_wp_keyboardShortcuts_namespaceObject.useShortcut)('core/editor/toggle-list-view', handleToggleListViewShortcut); 26683 return ( 26684 /*#__PURE__*/ 26685 // eslint-disable-next-line jsx-a11y/no-static-element-interactions 26686 (0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 26687 className: "editor-list-view-sidebar", 26688 onKeyDown: closeOnEscape, 26689 ref: sidebarRef, 26690 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TabbedSidebar, { 26691 tabs: [{ 26692 name: 'list-view', 26693 title: (0,external_wp_i18n_namespaceObject._x)('List View', 'Post overview'), 26694 panel: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 26695 className: "editor-list-view-sidebar__list-view-container", 26696 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 26697 className: "editor-list-view-sidebar__list-view-panel-content", 26698 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalListView, { 26699 dropZoneElement: dropZoneElement 26700 }) 26701 }) 26702 }), 26703 panelRef: listViewContainerRef 26704 }, { 26705 name: 'outline', 26706 title: (0,external_wp_i18n_namespaceObject._x)('Outline', 'Post overview'), 26707 panel: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 26708 className: "editor-list-view-sidebar__list-view-container", 26709 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ListViewOutline, {}) 26710 }) 26711 }], 26712 onClose: closeListView, 26713 onSelect: tabName => setTab(tabName), 26714 defaultTabId: "list-view", 26715 ref: tabsRef, 26716 closeButtonLabel: (0,external_wp_i18n_namespaceObject.__)('Close') 26717 }) 26718 }) 26719 ); 26720 } 26721 26722 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/save-publish-panels/index.js 26723 /** 26724 * WordPress dependencies 26725 */ 26726 26727 26728 26729 26730 26731 /** 26732 * Internal dependencies 26733 */ 26734 26735 26736 26737 26738 26739 26740 26741 26742 const { 26743 Fill: save_publish_panels_Fill, 26744 Slot: save_publish_panels_Slot 26745 } = (0,external_wp_components_namespaceObject.createSlotFill)('ActionsPanel'); 26746 const ActionsPanelFill = (/* unused pure expression or super */ null && (save_publish_panels_Fill)); 26747 function SavePublishPanels({ 26748 setEntitiesSavedStatesCallback, 26749 closeEntitiesSavedStates, 26750 isEntitiesSavedStatesOpen, 26751 forceIsDirtyPublishPanel 26752 }) { 26753 const { 26754 closePublishSidebar, 26755 togglePublishSidebar 26756 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 26757 const { 26758 publishSidebarOpened, 26759 isPublishable, 26760 isDirty, 26761 hasOtherEntitiesChanges 26762 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 26763 const { 26764 isPublishSidebarOpened, 26765 isEditedPostPublishable, 26766 isCurrentPostPublished, 26767 isEditedPostDirty, 26768 hasNonPostEntityChanges 26769 } = select(store_store); 26770 const _hasOtherEntitiesChanges = hasNonPostEntityChanges(); 26771 return { 26772 publishSidebarOpened: isPublishSidebarOpened(), 26773 isPublishable: !isCurrentPostPublished() && isEditedPostPublishable(), 26774 isDirty: _hasOtherEntitiesChanges || isEditedPostDirty(), 26775 hasOtherEntitiesChanges: _hasOtherEntitiesChanges 26776 }; 26777 }, []); 26778 const openEntitiesSavedStates = (0,external_wp_element_namespaceObject.useCallback)(() => setEntitiesSavedStatesCallback(true), []); 26779 26780 // It is ok for these components to be unmounted when not in visual use. 26781 // We don't want more than one present at a time, decide which to render. 26782 let unmountableContent; 26783 if (publishSidebarOpened) { 26784 unmountableContent = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_publish_panel, { 26785 onClose: closePublishSidebar, 26786 forceIsDirty: forceIsDirtyPublishPanel, 26787 PrePublishExtension: plugin_pre_publish_panel.Slot, 26788 PostPublishExtension: plugin_post_publish_panel.Slot 26789 }); 26790 } else if (isPublishable && !hasOtherEntitiesChanges) { 26791 unmountableContent = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 26792 className: "editor-layout__toggle-publish-panel", 26793 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 26794 __next40pxDefaultSize: true, 26795 variant: "secondary", 26796 onClick: togglePublishSidebar, 26797 "aria-expanded": false, 26798 children: (0,external_wp_i18n_namespaceObject.__)('Open publish panel') 26799 }) 26800 }); 26801 } else { 26802 unmountableContent = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 26803 className: "editor-layout__toggle-entities-saved-states-panel", 26804 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 26805 __next40pxDefaultSize: true, 26806 variant: "secondary", 26807 onClick: openEntitiesSavedStates, 26808 "aria-expanded": false, 26809 disabled: !isDirty, 26810 accessibleWhenDisabled: true, 26811 children: (0,external_wp_i18n_namespaceObject.__)('Open save panel') 26812 }) 26813 }); 26814 } 26815 26816 // Since EntitiesSavedStates controls its own panel, we can keep it 26817 // always mounted to retain its own component state (such as checkboxes). 26818 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 26819 children: [isEntitiesSavedStatesOpen && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(EntitiesSavedStates, { 26820 close: closeEntitiesSavedStates 26821 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(save_publish_panels_Slot, { 26822 bubblesVirtually: true 26823 }), !isEntitiesSavedStatesOpen && unmountableContent] 26824 }); 26825 } 26826 26827 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/text-editor/index.js 26828 /** 26829 * WordPress dependencies 26830 */ 26831 26832 26833 26834 26835 26836 26837 26838 /** 26839 * Internal dependencies 26840 */ 26841 26842 26843 26844 26845 26846 26847 function TextEditor({ 26848 autoFocus = false 26849 }) { 26850 const { 26851 switchEditorMode 26852 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 26853 const { 26854 shortcut, 26855 isRichEditingEnabled 26856 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 26857 const { 26858 getEditorSettings 26859 } = select(store_store); 26860 const { 26861 getShortcutRepresentation 26862 } = select(external_wp_keyboardShortcuts_namespaceObject.store); 26863 return { 26864 shortcut: getShortcutRepresentation('core/editor/toggle-mode'), 26865 isRichEditingEnabled: getEditorSettings().richEditingEnabled 26866 }; 26867 }, []); 26868 const { 26869 resetZoomLevel, 26870 __unstableSetEditorMode 26871 } = unlock((0,external_wp_data_namespaceObject.useDispatch)(external_wp_blockEditor_namespaceObject.store)); 26872 const titleRef = (0,external_wp_element_namespaceObject.useRef)(); 26873 (0,external_wp_element_namespaceObject.useEffect)(() => { 26874 resetZoomLevel(); 26875 __unstableSetEditorMode('edit'); 26876 if (autoFocus) { 26877 return; 26878 } 26879 titleRef?.current?.focus(); 26880 }, [autoFocus, resetZoomLevel, __unstableSetEditorMode]); 26881 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 26882 className: "editor-text-editor", 26883 children: [isRichEditingEnabled && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 26884 className: "editor-text-editor__toolbar", 26885 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("h2", { 26886 children: (0,external_wp_i18n_namespaceObject.__)('Editing code') 26887 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 26888 __next40pxDefaultSize: true, 26889 variant: "tertiary", 26890 onClick: () => switchEditorMode('visual'), 26891 shortcut: shortcut, 26892 children: (0,external_wp_i18n_namespaceObject.__)('Exit code editor') 26893 })] 26894 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 26895 className: "editor-text-editor__body", 26896 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_title_raw, { 26897 ref: titleRef 26898 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostTextEditor, {})] 26899 })] 26900 }); 26901 } 26902 26903 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/visual-editor/edit-template-blocks-notification.js 26904 /** 26905 * WordPress dependencies 26906 */ 26907 26908 26909 26910 26911 26912 26913 /** 26914 * Internal dependencies 26915 */ 26916 26917 26918 /** 26919 * Component that: 26920 * 26921 * - Displays a 'Edit your template to edit this block' notification when the 26922 * user is focusing on editing page content and clicks on a disabled template 26923 * block. 26924 * - Displays a 'Edit your template to edit this block' dialog when the user 26925 * is focusing on editing page conetnt and double clicks on a disabled 26926 * template block. 26927 * 26928 * @param {Object} props 26929 * @param {import('react').RefObject<HTMLElement>} props.contentRef Ref to the block 26930 * editor iframe canvas. 26931 */ 26932 26933 function EditTemplateBlocksNotification({ 26934 contentRef 26935 }) { 26936 const { 26937 onNavigateToEntityRecord, 26938 templateId 26939 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 26940 const { 26941 getEditorSettings, 26942 getCurrentTemplateId 26943 } = select(store_store); 26944 return { 26945 onNavigateToEntityRecord: getEditorSettings().onNavigateToEntityRecord, 26946 templateId: getCurrentTemplateId() 26947 }; 26948 }, []); 26949 const canEditTemplate = (0,external_wp_data_namespaceObject.useSelect)(select => !!select(external_wp_coreData_namespaceObject.store).canUser('create', { 26950 kind: 'postType', 26951 name: 'wp_template' 26952 }), []); 26953 const [isDialogOpen, setIsDialogOpen] = (0,external_wp_element_namespaceObject.useState)(false); 26954 (0,external_wp_element_namespaceObject.useEffect)(() => { 26955 const handleDblClick = event => { 26956 if (!canEditTemplate) { 26957 return; 26958 } 26959 if (!event.target.classList.contains('is-root-container') || event.target.dataset?.type === 'core/template-part') { 26960 return; 26961 } 26962 if (!event.defaultPrevented) { 26963 event.preventDefault(); 26964 setIsDialogOpen(true); 26965 } 26966 }; 26967 const canvas = contentRef.current; 26968 canvas?.addEventListener('dblclick', handleDblClick); 26969 return () => { 26970 canvas?.removeEventListener('dblclick', handleDblClick); 26971 }; 26972 }, [contentRef, canEditTemplate]); 26973 if (!canEditTemplate) { 26974 return null; 26975 } 26976 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalConfirmDialog, { 26977 isOpen: isDialogOpen, 26978 confirmButtonText: (0,external_wp_i18n_namespaceObject.__)('Edit template'), 26979 onConfirm: () => { 26980 setIsDialogOpen(false); 26981 onNavigateToEntityRecord({ 26982 postId: templateId, 26983 postType: 'wp_template' 26984 }); 26985 }, 26986 onCancel: () => setIsDialogOpen(false), 26987 size: "medium", 26988 children: (0,external_wp_i18n_namespaceObject.__)('You’ve tried to select a block that is part of a template, which may be used on other posts and pages. Would you like to edit the template?') 26989 }); 26990 } 26991 26992 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/resizable-editor/resize-handle.js 26993 /** 26994 * WordPress dependencies 26995 */ 26996 26997 26998 26999 27000 27001 27002 const DELTA_DISTANCE = 20; // The distance to resize per keydown in pixels. 27003 27004 function ResizeHandle({ 27005 direction, 27006 resizeWidthBy 27007 }) { 27008 function handleKeyDown(event) { 27009 const { 27010 keyCode 27011 } = event; 27012 if (direction === 'left' && keyCode === external_wp_keycodes_namespaceObject.LEFT || direction === 'right' && keyCode === external_wp_keycodes_namespaceObject.RIGHT) { 27013 resizeWidthBy(DELTA_DISTANCE); 27014 } else if (direction === 'left' && keyCode === external_wp_keycodes_namespaceObject.RIGHT || direction === 'right' && keyCode === external_wp_keycodes_namespaceObject.LEFT) { 27015 resizeWidthBy(-DELTA_DISTANCE); 27016 } 27017 } 27018 const resizeHandleVariants = { 27019 active: { 27020 opacity: 1, 27021 scaleY: 1.3 27022 } 27023 }; 27024 const resizableHandleHelpId = `resizable-editor__resize-help-$direction}`; 27025 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 27026 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Tooltip, { 27027 text: (0,external_wp_i18n_namespaceObject.__)('Drag to resize'), 27028 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__unstableMotion.button, { 27029 className: `editor-resizable-editor__resize-handle is-$direction}`, 27030 "aria-label": (0,external_wp_i18n_namespaceObject.__)('Drag to resize'), 27031 "aria-describedby": resizableHandleHelpId, 27032 onKeyDown: handleKeyDown, 27033 variants: resizeHandleVariants, 27034 whileFocus: "active", 27035 whileHover: "active", 27036 whileTap: "active", 27037 role: "separator", 27038 "aria-orientation": "vertical" 27039 }, "handle") 27040 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.VisuallyHidden, { 27041 id: resizableHandleHelpId, 27042 children: (0,external_wp_i18n_namespaceObject.__)('Use left and right arrow keys to resize the canvas.') 27043 })] 27044 }); 27045 } 27046 27047 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/resizable-editor/index.js 27048 /** 27049 * External dependencies 27050 */ 27051 27052 27053 /** 27054 * WordPress dependencies 27055 */ 27056 27057 27058 27059 /** 27060 * Internal dependencies 27061 */ 27062 27063 27064 // Removes the inline styles in the drag handles. 27065 27066 const HANDLE_STYLES_OVERRIDE = { 27067 position: undefined, 27068 userSelect: undefined, 27069 cursor: undefined, 27070 width: undefined, 27071 height: undefined, 27072 top: undefined, 27073 right: undefined, 27074 bottom: undefined, 27075 left: undefined 27076 }; 27077 function ResizableEditor({ 27078 className, 27079 enableResizing, 27080 height, 27081 children 27082 }) { 27083 const [width, setWidth] = (0,external_wp_element_namespaceObject.useState)('100%'); 27084 const resizableRef = (0,external_wp_element_namespaceObject.useRef)(); 27085 const resizeWidthBy = (0,external_wp_element_namespaceObject.useCallback)(deltaPixels => { 27086 if (resizableRef.current) { 27087 setWidth(resizableRef.current.offsetWidth + deltaPixels); 27088 } 27089 }, []); 27090 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.ResizableBox, { 27091 className: dist_clsx('editor-resizable-editor', className, { 27092 'is-resizable': enableResizing 27093 }), 27094 ref: api => { 27095 resizableRef.current = api?.resizable; 27096 }, 27097 size: { 27098 width: enableResizing ? width : '100%', 27099 height: enableResizing && height ? height : '100%' 27100 }, 27101 onResizeStop: (event, direction, element) => { 27102 setWidth(element.style.width); 27103 }, 27104 minWidth: 300, 27105 maxWidth: "100%", 27106 maxHeight: "100%", 27107 enable: { 27108 left: enableResizing, 27109 right: enableResizing 27110 }, 27111 showHandle: enableResizing 27112 // The editor is centered horizontally, resizing it only 27113 // moves half the distance. Hence double the ratio to correctly 27114 // align the cursor to the resizer handle. 27115 , 27116 resizeRatio: 2, 27117 handleComponent: { 27118 left: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ResizeHandle, { 27119 direction: "left", 27120 resizeWidthBy: resizeWidthBy 27121 }), 27122 right: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ResizeHandle, { 27123 direction: "right", 27124 resizeWidthBy: resizeWidthBy 27125 }) 27126 }, 27127 handleClasses: undefined, 27128 handleStyles: { 27129 left: HANDLE_STYLES_OVERRIDE, 27130 right: HANDLE_STYLES_OVERRIDE 27131 }, 27132 children: children 27133 }); 27134 } 27135 /* harmony default export */ const resizable_editor = (ResizableEditor); 27136 27137 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/visual-editor/use-select-nearest-editable-block.js 27138 /** 27139 * WordPress dependencies 27140 */ 27141 27142 27143 27144 27145 /** 27146 * Internal dependencies 27147 */ 27148 27149 const DISTANCE_THRESHOLD = 500; 27150 function clamp(value, min, max) { 27151 return Math.min(Math.max(value, min), max); 27152 } 27153 function distanceFromRect(x, y, rect) { 27154 const dx = x - clamp(x, rect.left, rect.right); 27155 const dy = y - clamp(y, rect.top, rect.bottom); 27156 return Math.sqrt(dx * dx + dy * dy); 27157 } 27158 function useSelectNearestEditableBlock({ 27159 isEnabled = true 27160 } = {}) { 27161 const { 27162 getEnabledClientIdsTree, 27163 getBlockName, 27164 getBlockOrder 27165 } = unlock((0,external_wp_data_namespaceObject.useSelect)(external_wp_blockEditor_namespaceObject.store)); 27166 const { 27167 selectBlock 27168 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_blockEditor_namespaceObject.store); 27169 return (0,external_wp_compose_namespaceObject.useRefEffect)(element => { 27170 if (!isEnabled) { 27171 return; 27172 } 27173 const selectNearestEditableBlock = (x, y) => { 27174 const editableBlockClientIds = getEnabledClientIdsTree().flatMap(({ 27175 clientId 27176 }) => { 27177 const blockName = getBlockName(clientId); 27178 if (blockName === 'core/template-part') { 27179 return []; 27180 } 27181 if (blockName === 'core/post-content') { 27182 const innerBlocks = getBlockOrder(clientId); 27183 if (innerBlocks.length) { 27184 return innerBlocks; 27185 } 27186 } 27187 return [clientId]; 27188 }); 27189 let nearestDistance = Infinity, 27190 nearestClientId = null; 27191 for (const clientId of editableBlockClientIds) { 27192 const block = element.querySelector(`[data-block="$clientId}"]`); 27193 if (!block) { 27194 continue; 27195 } 27196 const rect = block.getBoundingClientRect(); 27197 const distance = distanceFromRect(x, y, rect); 27198 if (distance < nearestDistance && distance < DISTANCE_THRESHOLD) { 27199 nearestDistance = distance; 27200 nearestClientId = clientId; 27201 } 27202 } 27203 if (nearestClientId) { 27204 selectBlock(nearestClientId); 27205 } 27206 }; 27207 const handleClick = event => { 27208 const shouldSelect = event.target === element || event.target.classList.contains('is-root-container'); 27209 if (shouldSelect) { 27210 selectNearestEditableBlock(event.clientX, event.clientY); 27211 } 27212 }; 27213 element.addEventListener('click', handleClick); 27214 return () => element.removeEventListener('click', handleClick); 27215 }, [isEnabled]); 27216 } 27217 27218 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/visual-editor/index.js 27219 /** 27220 * External dependencies 27221 */ 27222 27223 27224 /** 27225 * WordPress dependencies 27226 */ 27227 27228 27229 27230 27231 27232 27233 27234 /** 27235 * Internal dependencies 27236 */ 27237 27238 27239 27240 27241 27242 27243 27244 27245 27246 27247 const { 27248 LayoutStyle, 27249 useLayoutClasses, 27250 useLayoutStyles, 27251 ExperimentalBlockCanvas: BlockCanvas, 27252 useFlashEditableBlocks, 27253 useZoomOutModeExit 27254 } = unlock(external_wp_blockEditor_namespaceObject.privateApis); 27255 27256 /** 27257 * These post types have a special editor where they don't allow you to fill the title 27258 * and they don't apply the layout styles. 27259 */ 27260 const visual_editor_DESIGN_POST_TYPES = [PATTERN_POST_TYPE, TEMPLATE_POST_TYPE, NAVIGATION_POST_TYPE, TEMPLATE_PART_POST_TYPE]; 27261 27262 /** 27263 * Given an array of nested blocks, find the first Post Content 27264 * block inside it, recursing through any nesting levels, 27265 * and return its attributes. 27266 * 27267 * @param {Array} blocks A list of blocks. 27268 * 27269 * @return {Object | undefined} The Post Content block. 27270 */ 27271 function getPostContentAttributes(blocks) { 27272 for (let i = 0; i < blocks.length; i++) { 27273 if (blocks[i].name === 'core/post-content') { 27274 return blocks[i].attributes; 27275 } 27276 if (blocks[i].innerBlocks.length) { 27277 const nestedPostContent = getPostContentAttributes(blocks[i].innerBlocks); 27278 if (nestedPostContent) { 27279 return nestedPostContent; 27280 } 27281 } 27282 } 27283 } 27284 function checkForPostContentAtRootLevel(blocks) { 27285 for (let i = 0; i < blocks.length; i++) { 27286 if (blocks[i].name === 'core/post-content') { 27287 return true; 27288 } 27289 } 27290 return false; 27291 } 27292 function VisualEditor({ 27293 // Ideally as we unify post and site editors, we won't need these props. 27294 autoFocus, 27295 styles, 27296 disableIframe = false, 27297 iframeProps, 27298 contentRef, 27299 className 27300 }) { 27301 const [resizeObserver, sizes] = (0,external_wp_compose_namespaceObject.useResizeObserver)(); 27302 const isMobileViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('small', '<'); 27303 const isTabletViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium', '<'); 27304 const { 27305 renderingMode, 27306 postContentAttributes, 27307 editedPostTemplate = {}, 27308 wrapperBlockName, 27309 wrapperUniqueId, 27310 deviceType, 27311 isFocusedEntity, 27312 isDesignPostType, 27313 postType, 27314 isPreview 27315 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 27316 const { 27317 getCurrentPostId, 27318 getCurrentPostType, 27319 getCurrentTemplateId, 27320 getEditorSettings, 27321 getRenderingMode, 27322 getDeviceType 27323 } = select(store_store); 27324 const { 27325 getPostType, 27326 getEditedEntityRecord 27327 } = select(external_wp_coreData_namespaceObject.store); 27328 const postTypeSlug = getCurrentPostType(); 27329 const _renderingMode = getRenderingMode(); 27330 let _wrapperBlockName; 27331 if (postTypeSlug === PATTERN_POST_TYPE) { 27332 _wrapperBlockName = 'core/block'; 27333 } else if (_renderingMode === 'post-only') { 27334 _wrapperBlockName = 'core/post-content'; 27335 } 27336 const editorSettings = getEditorSettings(); 27337 const supportsTemplateMode = editorSettings.supportsTemplateMode; 27338 const postTypeObject = getPostType(postTypeSlug); 27339 const currentTemplateId = getCurrentTemplateId(); 27340 const template = currentTemplateId ? getEditedEntityRecord('postType', TEMPLATE_POST_TYPE, currentTemplateId) : undefined; 27341 return { 27342 renderingMode: _renderingMode, 27343 postContentAttributes: editorSettings.postContentAttributes, 27344 isDesignPostType: visual_editor_DESIGN_POST_TYPES.includes(postTypeSlug), 27345 // Post template fetch returns a 404 on classic themes, which 27346 // messes with e2e tests, so check it's a block theme first. 27347 editedPostTemplate: postTypeObject?.viewable && supportsTemplateMode ? template : undefined, 27348 wrapperBlockName: _wrapperBlockName, 27349 wrapperUniqueId: getCurrentPostId(), 27350 deviceType: getDeviceType(), 27351 isFocusedEntity: !!editorSettings.onNavigateToPreviousEntityRecord, 27352 postType: postTypeSlug, 27353 isPreview: editorSettings.__unstableIsPreviewMode 27354 }; 27355 }, []); 27356 const { 27357 isCleanNewPost 27358 } = (0,external_wp_data_namespaceObject.useSelect)(store_store); 27359 const { 27360 hasRootPaddingAwareAlignments, 27361 themeHasDisabledLayoutStyles, 27362 themeSupportsLayout, 27363 isZoomedOut 27364 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 27365 const { 27366 getSettings, 27367 isZoomOut: _isZoomOut 27368 } = unlock(select(external_wp_blockEditor_namespaceObject.store)); 27369 const _settings = getSettings(); 27370 return { 27371 themeHasDisabledLayoutStyles: _settings.disableLayoutStyles, 27372 themeSupportsLayout: _settings.supportsLayout, 27373 hasRootPaddingAwareAlignments: _settings.__experimentalFeatures?.useRootPaddingAwareAlignments, 27374 isZoomedOut: _isZoomOut() 27375 }; 27376 }, []); 27377 const deviceStyles = (0,external_wp_blockEditor_namespaceObject.__experimentalUseResizeCanvas)(deviceType); 27378 const [globalLayoutSettings] = (0,external_wp_blockEditor_namespaceObject.useSettings)('layout'); 27379 27380 // fallbackLayout is used if there is no Post Content, 27381 // and for Post Title. 27382 const fallbackLayout = (0,external_wp_element_namespaceObject.useMemo)(() => { 27383 if (renderingMode !== 'post-only' || isDesignPostType) { 27384 return { 27385 type: 'default' 27386 }; 27387 } 27388 if (themeSupportsLayout) { 27389 // We need to ensure support for wide and full alignments, 27390 // so we add the constrained type. 27391 return { 27392 ...globalLayoutSettings, 27393 type: 'constrained' 27394 }; 27395 } 27396 // Set default layout for classic themes so all alignments are supported. 27397 return { 27398 type: 'default' 27399 }; 27400 }, [renderingMode, themeSupportsLayout, globalLayoutSettings, isDesignPostType]); 27401 const newestPostContentAttributes = (0,external_wp_element_namespaceObject.useMemo)(() => { 27402 if (!editedPostTemplate?.content && !editedPostTemplate?.blocks && postContentAttributes) { 27403 return postContentAttributes; 27404 } 27405 // When in template editing mode, we can access the blocks directly. 27406 if (editedPostTemplate?.blocks) { 27407 return getPostContentAttributes(editedPostTemplate?.blocks); 27408 } 27409 // If there are no blocks, we have to parse the content string. 27410 // Best double-check it's a string otherwise the parse function gets unhappy. 27411 const parseableContent = typeof editedPostTemplate?.content === 'string' ? editedPostTemplate?.content : ''; 27412 return getPostContentAttributes((0,external_wp_blocks_namespaceObject.parse)(parseableContent)) || {}; 27413 }, [editedPostTemplate?.content, editedPostTemplate?.blocks, postContentAttributes]); 27414 const hasPostContentAtRootLevel = (0,external_wp_element_namespaceObject.useMemo)(() => { 27415 if (!editedPostTemplate?.content && !editedPostTemplate?.blocks) { 27416 return false; 27417 } 27418 // When in template editing mode, we can access the blocks directly. 27419 if (editedPostTemplate?.blocks) { 27420 return checkForPostContentAtRootLevel(editedPostTemplate?.blocks); 27421 } 27422 // If there are no blocks, we have to parse the content string. 27423 // Best double-check it's a string otherwise the parse function gets unhappy. 27424 const parseableContent = typeof editedPostTemplate?.content === 'string' ? editedPostTemplate?.content : ''; 27425 return checkForPostContentAtRootLevel((0,external_wp_blocks_namespaceObject.parse)(parseableContent)) || false; 27426 }, [editedPostTemplate?.content, editedPostTemplate?.blocks]); 27427 const { 27428 layout = {}, 27429 align = '' 27430 } = newestPostContentAttributes || {}; 27431 const postContentLayoutClasses = useLayoutClasses(newestPostContentAttributes, 'core/post-content'); 27432 const blockListLayoutClass = dist_clsx({ 27433 'is-layout-flow': !themeSupportsLayout 27434 }, themeSupportsLayout && postContentLayoutClasses, align && `align$align}`); 27435 const postContentLayoutStyles = useLayoutStyles(newestPostContentAttributes, 'core/post-content', '.block-editor-block-list__layout.is-root-container'); 27436 27437 // Update type for blocks using legacy layouts. 27438 const postContentLayout = (0,external_wp_element_namespaceObject.useMemo)(() => { 27439 return layout && (layout?.type === 'constrained' || layout?.inherit || layout?.contentSize || layout?.wideSize) ? { 27440 ...globalLayoutSettings, 27441 ...layout, 27442 type: 'constrained' 27443 } : { 27444 ...globalLayoutSettings, 27445 ...layout, 27446 type: 'default' 27447 }; 27448 }, [layout?.type, layout?.inherit, layout?.contentSize, layout?.wideSize, globalLayoutSettings]); 27449 27450 // If there is a Post Content block we use its layout for the block list; 27451 // if not, this must be a classic theme, in which case we use the fallback layout. 27452 const blockListLayout = postContentAttributes ? postContentLayout : fallbackLayout; 27453 const postEditorLayout = blockListLayout?.type === 'default' && !hasPostContentAtRootLevel ? fallbackLayout : blockListLayout; 27454 const observeTypingRef = (0,external_wp_blockEditor_namespaceObject.__unstableUseTypingObserver)(); 27455 const titleRef = (0,external_wp_element_namespaceObject.useRef)(); 27456 (0,external_wp_element_namespaceObject.useEffect)(() => { 27457 if (!autoFocus || !isCleanNewPost()) { 27458 return; 27459 } 27460 titleRef?.current?.focus(); 27461 }, [autoFocus, isCleanNewPost]); 27462 27463 // Add some styles for alignwide/alignfull Post Content and its children. 27464 const alignCSS = `.is-root-container.alignwide { max-width: var(--wp--style--global--wide-size); margin-left: auto; margin-right: auto;} 27465 .is-root-container.alignwide:where(.is-layout-flow) > :not(.alignleft):not(.alignright) { max-width: var(--wp--style--global--wide-size);} 27466 .is-root-container.alignfull { max-width: none; margin-left: auto; margin-right: auto;} 27467 .is-root-container.alignfull:where(.is-layout-flow) > :not(.alignleft):not(.alignright) { max-width: none;}`; 27468 const localRef = (0,external_wp_element_namespaceObject.useRef)(); 27469 const typewriterRef = (0,external_wp_blockEditor_namespaceObject.__unstableUseTypewriter)(); 27470 contentRef = (0,external_wp_compose_namespaceObject.useMergeRefs)([localRef, contentRef, renderingMode === 'post-only' ? typewriterRef : null, useFlashEditableBlocks({ 27471 isEnabled: renderingMode === 'template-locked' 27472 }), useSelectNearestEditableBlock({ 27473 isEnabled: renderingMode === 'template-locked' 27474 }), useZoomOutModeExit()]); 27475 const zoomOutProps = isZoomedOut && !isTabletViewport ? { 27476 scale: 'default', 27477 frameSize: '40px' 27478 } : {}; 27479 const forceFullHeight = postType === NAVIGATION_POST_TYPE; 27480 const enableResizing = [NAVIGATION_POST_TYPE, TEMPLATE_PART_POST_TYPE, PATTERN_POST_TYPE].includes(postType) && 27481 // Disable in previews / view mode. 27482 !isPreview && 27483 // Disable resizing in mobile viewport. 27484 !isMobileViewport && 27485 // Dsiable resizing in zoomed-out mode. 27486 !isZoomedOut; 27487 const shouldIframe = !disableIframe || ['Tablet', 'Mobile'].includes(deviceType); 27488 const iframeStyles = (0,external_wp_element_namespaceObject.useMemo)(() => { 27489 return [...(styles !== null && styles !== void 0 ? styles : []), { 27490 // Ensures margins of children are contained so that the body background paints behind them. 27491 // Otherwise, the background of html (when zoomed out) would show there and appear broken. It’s 27492 // important mostly for post-only views yet conceivably an issue in templated views too. 27493 css: `:where(.block-editor-iframe__body){display:flow-root;}.is-root-container{display:flow-root;${ 27494 // Some themes will have `min-height: 100vh` for the root container, 27495 // which isn't a requirement in auto resize mode. 27496 enableResizing ? 'min-height:0!important;' : ''}}` 27497 }]; 27498 }, [styles, enableResizing]); 27499 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 27500 className: dist_clsx('editor-visual-editor', 27501 // this class is here for backward compatibility reasons. 27502 'edit-post-visual-editor', className, { 27503 'has-padding': isFocusedEntity || enableResizing, 27504 'is-resizable': enableResizing, 27505 'is-iframed': shouldIframe 27506 }), 27507 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(resizable_editor, { 27508 enableResizing: enableResizing, 27509 height: sizes.height && !forceFullHeight ? sizes.height : '100%', 27510 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(BlockCanvas, { 27511 shouldIframe: shouldIframe, 27512 contentRef: contentRef, 27513 styles: iframeStyles, 27514 height: "100%", 27515 iframeProps: { 27516 ...iframeProps, 27517 ...zoomOutProps, 27518 style: { 27519 ...iframeProps?.style, 27520 ...deviceStyles 27521 } 27522 }, 27523 children: [themeSupportsLayout && !themeHasDisabledLayoutStyles && renderingMode === 'post-only' && !isDesignPostType && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 27524 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(LayoutStyle, { 27525 selector: ".editor-visual-editor__post-title-wrapper", 27526 layout: fallbackLayout 27527 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(LayoutStyle, { 27528 selector: ".block-editor-block-list__layout.is-root-container", 27529 layout: postEditorLayout 27530 }), align && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(LayoutStyle, { 27531 css: alignCSS 27532 }), postContentLayoutStyles && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(LayoutStyle, { 27533 layout: postContentLayout, 27534 css: postContentLayoutStyles 27535 })] 27536 }), renderingMode === 'post-only' && !isDesignPostType && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 27537 className: dist_clsx('editor-visual-editor__post-title-wrapper', 27538 // The following class is only here for backward comapatibility 27539 // some themes might be using it to style the post title. 27540 'edit-post-visual-editor__post-title-wrapper', { 27541 'has-global-padding': hasRootPaddingAwareAlignments 27542 }), 27543 contentEditable: false, 27544 ref: observeTypingRef, 27545 style: { 27546 // This is using inline styles 27547 // so it's applied for both iframed and non iframed editors. 27548 marginTop: '4rem' 27549 }, 27550 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_title, { 27551 ref: titleRef 27552 }) 27553 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_blockEditor_namespaceObject.RecursionProvider, { 27554 blockName: wrapperBlockName, 27555 uniqueId: wrapperUniqueId, 27556 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.BlockList, { 27557 className: dist_clsx('is-' + deviceType.toLowerCase() + '-preview', renderingMode !== 'post-only' || isDesignPostType ? 'wp-site-blocks' : `$blockListLayoutClass} wp-block-post-content` // Ensure root level blocks receive default/flow blockGap styling rules. 27558 ), 27559 layout: blockListLayout, 27560 dropZoneElement: 27561 // When iframed, pass in the html element of the iframe to 27562 // ensure the drop zone extends to the edges of the iframe. 27563 disableIframe ? localRef.current : localRef.current?.parentNode, 27564 __unstableDisableDropZone: 27565 // In template preview mode, disable drop zones at the root of the template. 27566 renderingMode === 'template-locked' ? true : false 27567 }), renderingMode === 'template-locked' && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(EditTemplateBlocksNotification, { 27568 contentRef: localRef 27569 })] 27570 }), 27571 // Avoid resize listeners when not needed, 27572 // these will trigger unnecessary re-renders 27573 // when animating the iframe width. 27574 enableResizing && resizeObserver] 27575 }) 27576 }) 27577 }); 27578 } 27579 /* harmony default export */ const visual_editor = (VisualEditor); 27580 27581 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/editor-interface/index.js 27582 /** 27583 * External dependencies 27584 */ 27585 27586 27587 /** 27588 * WordPress dependencies 27589 */ 27590 27591 27592 27593 27594 27595 27596 27597 27598 /** 27599 * Internal dependencies 27600 */ 27601 27602 27603 27604 27605 27606 27607 27608 27609 27610 27611 27612 27613 27614 const interfaceLabels = { 27615 /* translators: accessibility text for the editor top bar landmark region. */ 27616 header: (0,external_wp_i18n_namespaceObject.__)('Editor top bar'), 27617 /* translators: accessibility text for the editor content landmark region. */ 27618 body: (0,external_wp_i18n_namespaceObject.__)('Editor content'), 27619 /* translators: accessibility text for the editor settings landmark region. */ 27620 sidebar: (0,external_wp_i18n_namespaceObject.__)('Editor settings'), 27621 /* translators: accessibility text for the editor publish landmark region. */ 27622 actions: (0,external_wp_i18n_namespaceObject.__)('Editor publish'), 27623 /* translators: accessibility text for the editor footer landmark region. */ 27624 footer: (0,external_wp_i18n_namespaceObject.__)('Editor footer') 27625 }; 27626 function EditorInterface({ 27627 className, 27628 styles, 27629 children, 27630 forceIsDirty, 27631 contentRef, 27632 disableIframe, 27633 autoFocus, 27634 customSaveButton, 27635 customSavePanel, 27636 forceDisableBlockTools, 27637 title, 27638 iframeProps 27639 }) { 27640 const { 27641 mode, 27642 isRichEditingEnabled, 27643 isInserterOpened, 27644 isListViewOpened, 27645 isDistractionFree, 27646 isPreviewMode, 27647 showBlockBreadcrumbs, 27648 documentLabel, 27649 isZoomOut 27650 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 27651 const { 27652 get 27653 } = select(external_wp_preferences_namespaceObject.store); 27654 const { 27655 getEditorSettings, 27656 getPostTypeLabel 27657 } = select(store_store); 27658 const editorSettings = getEditorSettings(); 27659 const postTypeLabel = getPostTypeLabel(); 27660 const { 27661 isZoomOut: _isZoomOut 27662 } = unlock(select(external_wp_blockEditor_namespaceObject.store)); 27663 return { 27664 mode: select(store_store).getEditorMode(), 27665 isRichEditingEnabled: editorSettings.richEditingEnabled, 27666 isInserterOpened: select(store_store).isInserterOpened(), 27667 isListViewOpened: select(store_store).isListViewOpened(), 27668 isDistractionFree: get('core', 'distractionFree'), 27669 isPreviewMode: editorSettings.__unstableIsPreviewMode, 27670 showBlockBreadcrumbs: get('core', 'showBlockBreadcrumbs'), 27671 documentLabel: 27672 // translators: Default label for the Document in the Block Breadcrumb. 27673 postTypeLabel || (0,external_wp_i18n_namespaceObject._x)('Document', 'noun, breadcrumb'), 27674 isZoomOut: _isZoomOut() 27675 }; 27676 }, []); 27677 const isLargeViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium'); 27678 const secondarySidebarLabel = isListViewOpened ? (0,external_wp_i18n_namespaceObject.__)('Document Overview') : (0,external_wp_i18n_namespaceObject.__)('Block Library'); 27679 27680 // Local state for save panel. 27681 // Note 'truthy' callback implies an open panel. 27682 const [entitiesSavedStatesCallback, setEntitiesSavedStatesCallback] = (0,external_wp_element_namespaceObject.useState)(false); 27683 const closeEntitiesSavedStates = (0,external_wp_element_namespaceObject.useCallback)(arg => { 27684 if (typeof entitiesSavedStatesCallback === 'function') { 27685 entitiesSavedStatesCallback(arg); 27686 } 27687 setEntitiesSavedStatesCallback(false); 27688 }, [entitiesSavedStatesCallback]); 27689 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(interface_skeleton, { 27690 isDistractionFree: isDistractionFree, 27691 className: dist_clsx('editor-editor-interface', className, { 27692 'is-entity-save-view-open': !!entitiesSavedStatesCallback, 27693 'is-distraction-free': isDistractionFree && !isPreviewMode 27694 }), 27695 labels: { 27696 ...interfaceLabels, 27697 secondarySidebar: secondarySidebarLabel 27698 }, 27699 header: !isPreviewMode && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(components_header, { 27700 forceIsDirty: forceIsDirty, 27701 setEntitiesSavedStatesCallback: setEntitiesSavedStatesCallback, 27702 customSaveButton: customSaveButton, 27703 forceDisableBlockTools: forceDisableBlockTools, 27704 title: title, 27705 isEditorIframed: !disableIframe 27706 }), 27707 editorNotices: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(editor_notices, {}), 27708 secondarySidebar: !isPreviewMode && mode === 'visual' && (isInserterOpened && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(InserterSidebar, {}) || isListViewOpened && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ListViewSidebar, {})), 27709 sidebar: !isPreviewMode && !isDistractionFree && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(complementary_area.Slot, { 27710 scope: "core" 27711 }), 27712 content: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 27713 children: [!isDistractionFree && !isPreviewMode && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(editor_notices, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(content_slot_fill.Slot, { 27714 children: ([editorCanvasView]) => editorCanvasView ? editorCanvasView : /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 27715 children: [!isPreviewMode && (mode === 'text' || !isRichEditingEnabled) && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TextEditor 27716 // We should auto-focus the canvas (title) on load. 27717 // eslint-disable-next-line jsx-a11y/no-autofocus 27718 , { 27719 autoFocus: autoFocus 27720 }), !isPreviewMode && !isLargeViewport && mode === 'visual' && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.BlockToolbar, { 27721 hideDragHandle: true 27722 }), (isPreviewMode || isRichEditingEnabled && mode === 'visual') && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(visual_editor, { 27723 styles: styles, 27724 contentRef: contentRef, 27725 disableIframe: disableIframe 27726 // We should auto-focus the canvas (title) on load. 27727 // eslint-disable-next-line jsx-a11y/no-autofocus 27728 , 27729 autoFocus: autoFocus, 27730 iframeProps: iframeProps 27731 }), children] 27732 }) 27733 })] 27734 }), 27735 footer: !isPreviewMode && !isDistractionFree && isLargeViewport && showBlockBreadcrumbs && isRichEditingEnabled && !isZoomOut && mode === 'visual' && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.BlockBreadcrumb, { 27736 rootLabelText: documentLabel 27737 }), 27738 actions: !isPreviewMode ? customSavePanel || /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(SavePublishPanels, { 27739 closeEntitiesSavedStates: closeEntitiesSavedStates, 27740 isEntitiesSavedStatesOpen: entitiesSavedStatesCallback, 27741 setEntitiesSavedStatesCallback: setEntitiesSavedStatesCallback, 27742 forceIsDirtyPublishPanel: forceIsDirty 27743 }) : undefined 27744 }); 27745 } 27746 27747 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/pattern-overrides-panel/index.js 27748 /** 27749 * WordPress dependencies 27750 */ 27751 27752 27753 27754 /** 27755 * Internal dependencies 27756 */ 27757 27758 27759 27760 const { 27761 OverridesPanel 27762 } = unlock(external_wp_patterns_namespaceObject.privateApis); 27763 function PatternOverridesPanel() { 27764 const supportsPatternOverridesPanel = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getCurrentPostType() === 'wp_block', []); 27765 if (!supportsPatternOverridesPanel) { 27766 return null; 27767 } 27768 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(OverridesPanel, {}); 27769 } 27770 27771 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-actions/actions.js 27772 /** 27773 * WordPress dependencies 27774 */ 27775 27776 27777 27778 /** 27779 * Internal dependencies 27780 */ 27781 27782 27783 27784 function usePostActions({ 27785 postType, 27786 onActionPerformed, 27787 context 27788 }) { 27789 const { 27790 defaultActions 27791 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 27792 const { 27793 getEntityActions 27794 } = unlock(select(store_store)); 27795 return { 27796 defaultActions: getEntityActions('postType', postType) 27797 }; 27798 }, [postType]); 27799 const { 27800 registerPostTypeActions 27801 } = unlock((0,external_wp_data_namespaceObject.useDispatch)(store_store)); 27802 (0,external_wp_element_namespaceObject.useEffect)(() => { 27803 registerPostTypeActions(postType); 27804 }, [registerPostTypeActions, postType]); 27805 return (0,external_wp_element_namespaceObject.useMemo)(() => { 27806 // Filter actions based on provided context. If not provided 27807 // all actions are returned. We'll have a single entry for getting the actions 27808 // and the consumer should provide the context to filter the actions, if needed. 27809 // Actions should also provide the `context` they support, if it's specific, to 27810 // compare with the provided context to get all the actions. 27811 // Right now the only supported context is `list`. 27812 const actions = defaultActions.filter(action => { 27813 if (!action.context) { 27814 return true; 27815 } 27816 return action.context === context; 27817 }); 27818 if (onActionPerformed) { 27819 for (let i = 0; i < actions.length; ++i) { 27820 if (actions[i].callback) { 27821 const existingCallback = actions[i].callback; 27822 actions[i] = { 27823 ...actions[i], 27824 callback: (items, argsObject) => { 27825 existingCallback(items, { 27826 ...argsObject, 27827 onActionPerformed: _items => { 27828 if (argsObject?.onActionPerformed) { 27829 argsObject.onActionPerformed(_items); 27830 } 27831 onActionPerformed(actions[i].id, _items); 27832 } 27833 }); 27834 } 27835 }; 27836 } 27837 if (actions[i].RenderModal) { 27838 const ExistingRenderModal = actions[i].RenderModal; 27839 actions[i] = { 27840 ...actions[i], 27841 RenderModal: props => { 27842 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ExistingRenderModal, { 27843 ...props, 27844 onActionPerformed: _items => { 27845 if (props.onActionPerformed) { 27846 props.onActionPerformed(_items); 27847 } 27848 onActionPerformed(actions[i].id, _items); 27849 } 27850 }); 27851 } 27852 }; 27853 } 27854 } 27855 } 27856 return actions; 27857 }, [defaultActions, onActionPerformed, context]); 27858 } 27859 27860 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-actions/index.js 27861 /** 27862 * WordPress dependencies 27863 */ 27864 27865 27866 27867 27868 27869 27870 27871 /** 27872 * Internal dependencies 27873 */ 27874 27875 27876 27877 27878 27879 const { 27880 DropdownMenuV2, 27881 kebabCase 27882 } = unlock(external_wp_components_namespaceObject.privateApis); 27883 function PostActions({ 27884 postType, 27885 postId, 27886 onActionPerformed 27887 }) { 27888 const [isActionsMenuOpen, setIsActionsMenuOpen] = (0,external_wp_element_namespaceObject.useState)(false); 27889 const { 27890 item, 27891 permissions 27892 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 27893 const { 27894 getEditedEntityRecord, 27895 getEntityRecordPermissions 27896 } = unlock(select(external_wp_coreData_namespaceObject.store)); 27897 return { 27898 item: getEditedEntityRecord('postType', postType, postId), 27899 permissions: getEntityRecordPermissions('postType', postType, postId) 27900 }; 27901 }, [postId, postType]); 27902 const itemWithPermissions = (0,external_wp_element_namespaceObject.useMemo)(() => { 27903 return { 27904 ...item, 27905 permissions 27906 }; 27907 }, [item, permissions]); 27908 const allActions = usePostActions({ 27909 postType, 27910 onActionPerformed 27911 }); 27912 const actions = (0,external_wp_element_namespaceObject.useMemo)(() => { 27913 return allActions.filter(action => { 27914 return !action.isEligible || action.isEligible(itemWithPermissions); 27915 }); 27916 }, [allActions, itemWithPermissions]); 27917 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(DropdownMenuV2, { 27918 open: isActionsMenuOpen, 27919 trigger: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 27920 size: "small", 27921 icon: more_vertical, 27922 label: (0,external_wp_i18n_namespaceObject.__)('Actions'), 27923 disabled: !actions.length, 27924 accessibleWhenDisabled: true, 27925 className: "editor-all-actions-button", 27926 onClick: () => setIsActionsMenuOpen(!isActionsMenuOpen) 27927 }), 27928 onOpenChange: setIsActionsMenuOpen, 27929 placement: "bottom-end", 27930 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ActionsDropdownMenuGroup, { 27931 actions: actions, 27932 item: itemWithPermissions, 27933 onClose: () => { 27934 setIsActionsMenuOpen(false); 27935 } 27936 }) 27937 }); 27938 } 27939 27940 // From now on all the functions on this file are copied as from the dataviews packages, 27941 // The editor packages should not be using the dataviews packages directly, 27942 // and the dataviews package should not be using the editor packages directly, 27943 // so duplicating the code here seems like the least bad option. 27944 27945 // Copied as is from packages/dataviews/src/item-actions.js 27946 function DropdownMenuItemTrigger({ 27947 action, 27948 onClick, 27949 items 27950 }) { 27951 const label = typeof action.label === 'string' ? action.label : action.label(items); 27952 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(DropdownMenuV2.Item, { 27953 onClick: onClick, 27954 hideOnClick: !action.RenderModal, 27955 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(DropdownMenuV2.ItemLabel, { 27956 children: label 27957 }) 27958 }); 27959 } 27960 27961 // Copied as is from packages/dataviews/src/item-actions.js 27962 // With an added onClose prop. 27963 function ActionWithModal({ 27964 action, 27965 item, 27966 ActionTrigger, 27967 onClose 27968 }) { 27969 const [isModalOpen, setIsModalOpen] = (0,external_wp_element_namespaceObject.useState)(false); 27970 const actionTriggerProps = { 27971 action, 27972 onClick: () => setIsModalOpen(true), 27973 items: [item] 27974 }; 27975 const { 27976 RenderModal, 27977 hideModalHeader 27978 } = action; 27979 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 27980 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ActionTrigger, { 27981 ...actionTriggerProps 27982 }), isModalOpen && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Modal, { 27983 title: action.modalHeader || action.label, 27984 __experimentalHideHeader: !!hideModalHeader, 27985 onRequestClose: () => { 27986 setIsModalOpen(false); 27987 }, 27988 overlayClassName: `editor-action-modal editor-action-modal__$kebabCase(action.id)}`, 27989 focusOnMount: "firstContentElement", 27990 size: "small", 27991 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(RenderModal, { 27992 items: [item], 27993 closeModal: () => { 27994 setIsModalOpen(false); 27995 onClose(); 27996 } 27997 }) 27998 })] 27999 }); 28000 } 28001 28002 // Copied as is from packages/dataviews/src/item-actions.js 28003 // With an added onClose prop. 28004 function ActionsDropdownMenuGroup({ 28005 actions, 28006 item, 28007 onClose 28008 }) { 28009 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(DropdownMenuV2.Group, { 28010 children: actions.map(action => { 28011 if (action.RenderModal) { 28012 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ActionWithModal, { 28013 action: action, 28014 item: item, 28015 ActionTrigger: DropdownMenuItemTrigger, 28016 onClose: onClose 28017 }, action.id); 28018 } 28019 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(DropdownMenuItemTrigger, { 28020 action: action, 28021 onClick: () => action.callback([item]), 28022 items: [item] 28023 }, action.id); 28024 }) 28025 }); 28026 } 28027 28028 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-card-panel/index.js 28029 /** 28030 * External dependencies 28031 */ 28032 28033 /** 28034 * WordPress dependencies 28035 */ 28036 28037 28038 28039 28040 28041 28042 /** 28043 * Internal dependencies 28044 */ 28045 28046 28047 28048 28049 28050 28051 function PostCardPanel({ 28052 postType, 28053 postId, 28054 onActionPerformed 28055 }) { 28056 const { 28057 isFrontPage, 28058 isPostsPage, 28059 title, 28060 icon, 28061 isSync 28062 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 28063 const { 28064 __experimentalGetTemplateInfo 28065 } = select(store_store); 28066 const { 28067 canUser, 28068 getEditedEntityRecord 28069 } = select(external_wp_coreData_namespaceObject.store); 28070 const siteSettings = canUser('read', { 28071 kind: 'root', 28072 name: 'site' 28073 }) ? getEditedEntityRecord('root', 'site') : undefined; 28074 const _record = getEditedEntityRecord('postType', postType, postId); 28075 const _templateInfo = [TEMPLATE_POST_TYPE, TEMPLATE_PART_POST_TYPE].includes(postType) && __experimentalGetTemplateInfo(_record); 28076 let _isSync = false; 28077 if (GLOBAL_POST_TYPES.includes(postType)) { 28078 if (PATTERN_POST_TYPE === postType) { 28079 // When the post is first created, the top level wp_pattern_sync_status is not set so get meta value instead. 28080 const currentSyncStatus = _record?.meta?.wp_pattern_sync_status === 'unsynced' ? 'unsynced' : _record?.wp_pattern_sync_status; 28081 _isSync = currentSyncStatus !== 'unsynced'; 28082 } else { 28083 _isSync = true; 28084 } 28085 } 28086 return { 28087 title: _templateInfo?.title || _record?.title, 28088 icon: unlock(select(store_store)).getPostIcon(postType, { 28089 area: _record?.area 28090 }), 28091 isSync: _isSync, 28092 isFrontPage: siteSettings?.page_on_front === postId, 28093 isPostsPage: siteSettings?.page_for_posts === postId 28094 }; 28095 }, [postId, postType]); 28096 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 28097 className: "editor-post-card-panel", 28098 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, { 28099 spacing: 2, 28100 className: "editor-post-card-panel__header", 28101 align: "flex-start", 28102 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Icon, { 28103 className: dist_clsx('editor-post-card-panel__icon', { 28104 'is-sync': isSync 28105 }), 28106 icon: icon 28107 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalText, { 28108 numberOfLines: 2, 28109 truncate: true, 28110 className: "editor-post-card-panel__title", 28111 weight: 500, 28112 as: "h2", 28113 lineHeight: "20px", 28114 children: [title ? (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(title) : (0,external_wp_i18n_namespaceObject.__)('No title'), isFrontPage && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 28115 className: "editor-post-card-panel__title-badge", 28116 children: (0,external_wp_i18n_namespaceObject.__)('Homepage') 28117 }), isPostsPage && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 28118 className: "editor-post-card-panel__title-badge", 28119 children: (0,external_wp_i18n_namespaceObject.__)('Posts Page') 28120 })] 28121 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostActions, { 28122 postType: postType, 28123 postId: postId, 28124 onActionPerformed: onActionPerformed 28125 })] 28126 }) 28127 }); 28128 } 28129 28130 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-content-information/index.js 28131 /** 28132 * WordPress dependencies 28133 */ 28134 28135 28136 28137 28138 28139 28140 28141 /** 28142 * Internal dependencies 28143 */ 28144 28145 28146 28147 // Taken from packages/editor/src/components/time-to-read/index.js. 28148 28149 const post_content_information_AVERAGE_READING_RATE = 189; 28150 28151 // This component renders the wordcount and reading time for the post. 28152 function PostContentInformation() { 28153 const { 28154 postContent 28155 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 28156 const { 28157 getEditedPostAttribute, 28158 getCurrentPostType, 28159 getCurrentPostId 28160 } = select(store_store); 28161 const { 28162 canUser 28163 } = select(external_wp_coreData_namespaceObject.store); 28164 const { 28165 getEntityRecord 28166 } = select(external_wp_coreData_namespaceObject.store); 28167 const siteSettings = canUser('read', { 28168 kind: 'root', 28169 name: 'site' 28170 }) ? getEntityRecord('root', 'site') : undefined; 28171 const postType = getCurrentPostType(); 28172 const _id = getCurrentPostId(); 28173 const isPostsPage = +_id === siteSettings?.page_for_posts; 28174 const showPostContentInfo = !isPostsPage && ![TEMPLATE_POST_TYPE, TEMPLATE_PART_POST_TYPE].includes(postType); 28175 return { 28176 postContent: showPostContentInfo && getEditedPostAttribute('content') 28177 }; 28178 }, []); 28179 28180 /* 28181 * translators: If your word count is based on single characters (e.g. East Asian characters), 28182 * enter 'characters_excluding_spaces' or 'characters_including_spaces'. Otherwise, enter 'words'. 28183 * Do not translate into your own language. 28184 */ 28185 const wordCountType = (0,external_wp_i18n_namespaceObject._x)('words', 'Word count type. Do not translate!'); 28186 const wordsCounted = (0,external_wp_element_namespaceObject.useMemo)(() => postContent ? (0,external_wp_wordcount_namespaceObject.count)(postContent, wordCountType) : 0, [postContent, wordCountType]); 28187 if (!wordsCounted) { 28188 return null; 28189 } 28190 const readingTime = Math.round(wordsCounted / post_content_information_AVERAGE_READING_RATE); 28191 const wordsCountText = (0,external_wp_i18n_namespaceObject.sprintf)( 28192 // translators: %s: the number of words in the post. 28193 (0,external_wp_i18n_namespaceObject._n)('%s word', '%s words', wordsCounted), wordsCounted.toLocaleString()); 28194 const minutesText = readingTime <= 1 ? (0,external_wp_i18n_namespaceObject.__)('1 minute') : (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: the number of minutes to read the post. */ 28195 (0,external_wp_i18n_namespaceObject._n)('%s minute', '%s minutes', readingTime), readingTime.toLocaleString()); 28196 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 28197 className: "editor-post-content-information", 28198 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { 28199 children: (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: 1: How many words a post has. 2: the number of minutes to read the post (e.g. 130 words, 2 minutes read time.) */ 28200 (0,external_wp_i18n_namespaceObject.__)('%1$s, %2$s read time.'), wordsCountText, minutesText) 28201 }) 28202 }); 28203 } 28204 28205 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-format/panel.js 28206 /** 28207 * WordPress dependencies 28208 */ 28209 28210 28211 28212 28213 28214 28215 /** 28216 * Internal dependencies 28217 */ 28218 28219 28220 28221 28222 28223 /** 28224 * Renders the Post Author Panel component. 28225 * 28226 * @return {Component} The component to be rendered. 28227 */ 28228 28229 28230 function panel_PostFormat() { 28231 const { 28232 postFormat 28233 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 28234 const { 28235 getEditedPostAttribute 28236 } = select(store_store); 28237 const _postFormat = getEditedPostAttribute('format'); 28238 return { 28239 postFormat: _postFormat !== null && _postFormat !== void 0 ? _postFormat : 'standard' 28240 }; 28241 }, []); 28242 const activeFormat = POST_FORMATS.find(format => format.id === postFormat); 28243 28244 // Use internal state instead of a ref to make sure that the component 28245 // re-renders when the popover's anchor updates. 28246 const [popoverAnchor, setPopoverAnchor] = (0,external_wp_element_namespaceObject.useState)(null); 28247 // Memoize popoverProps to avoid returning a new object every time. 28248 const popoverProps = (0,external_wp_element_namespaceObject.useMemo)(() => ({ 28249 // Anchor the popover to the middle of the entire row so that it doesn't 28250 // move around when the label changes. 28251 anchor: popoverAnchor, 28252 placement: 'left-start', 28253 offset: 36, 28254 shift: true 28255 }), [popoverAnchor]); 28256 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_format_check, { 28257 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { 28258 label: (0,external_wp_i18n_namespaceObject.__)('Format'), 28259 ref: setPopoverAnchor, 28260 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Dropdown, { 28261 popoverProps: popoverProps, 28262 contentClassName: "editor-post-format__dialog", 28263 focusOnMount: true, 28264 renderToggle: ({ 28265 isOpen, 28266 onToggle 28267 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 28268 size: "compact", 28269 variant: "tertiary", 28270 "aria-expanded": isOpen, 28271 "aria-label": (0,external_wp_i18n_namespaceObject.sprintf)( 28272 // translators: %s: Current post format. 28273 (0,external_wp_i18n_namespaceObject.__)('Change format: %s'), activeFormat?.caption), 28274 onClick: onToggle, 28275 children: activeFormat?.caption 28276 }), 28277 renderContent: ({ 28278 onClose 28279 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 28280 className: "editor-post-format__dialog-content", 28281 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalInspectorPopoverHeader, { 28282 title: (0,external_wp_i18n_namespaceObject.__)('Format'), 28283 onClose: onClose 28284 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostFormat, {})] 28285 }) 28286 }) 28287 }) 28288 }); 28289 } 28290 /* harmony default export */ const post_format_panel = (panel_PostFormat); 28291 28292 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-last-edited-panel/index.js 28293 /** 28294 * WordPress dependencies 28295 */ 28296 28297 28298 28299 28300 28301 /** 28302 * Internal dependencies 28303 */ 28304 28305 28306 function PostLastEditedPanel() { 28307 const modified = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getEditedPostAttribute('modified'), []); 28308 const lastEditedText = modified && (0,external_wp_i18n_namespaceObject.sprintf)( 28309 // translators: %s: Human-readable time difference, e.g. "2 days ago". 28310 (0,external_wp_i18n_namespaceObject.__)('Last edited %s.'), (0,external_wp_date_namespaceObject.humanTimeDiff)(modified)); 28311 if (!lastEditedText) { 28312 return null; 28313 } 28314 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { 28315 className: "editor-post-last-edited-panel", 28316 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { 28317 children: lastEditedText 28318 }) 28319 }); 28320 } 28321 28322 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-panel-section/index.js 28323 /** 28324 * External dependencies 28325 */ 28326 28327 28328 /** 28329 * WordPress dependencies 28330 */ 28331 28332 28333 function PostPanelSection({ 28334 className, 28335 children 28336 }) { 28337 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalVStack, { 28338 className: dist_clsx('editor-post-panel__section', className), 28339 children: children 28340 }); 28341 } 28342 /* harmony default export */ const post_panel_section = (PostPanelSection); 28343 28344 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/blog-title/index.js 28345 /** 28346 * WordPress dependencies 28347 */ 28348 28349 28350 28351 28352 28353 28354 28355 28356 28357 /** 28358 * Internal dependencies 28359 */ 28360 28361 28362 28363 28364 28365 28366 const blog_title_EMPTY_OBJECT = {}; 28367 function BlogTitle() { 28368 const { 28369 editEntityRecord 28370 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); 28371 const { 28372 postsPageTitle, 28373 postsPageId, 28374 isTemplate, 28375 postSlug 28376 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 28377 const { 28378 getEntityRecord, 28379 getEditedEntityRecord, 28380 canUser 28381 } = select(external_wp_coreData_namespaceObject.store); 28382 const siteSettings = canUser('read', { 28383 kind: 'root', 28384 name: 'site' 28385 }) ? getEntityRecord('root', 'site') : undefined; 28386 const _postsPageRecord = siteSettings?.page_for_posts ? getEditedEntityRecord('postType', 'page', siteSettings?.page_for_posts) : blog_title_EMPTY_OBJECT; 28387 const { 28388 getEditedPostAttribute, 28389 getCurrentPostType 28390 } = select(store_store); 28391 return { 28392 postsPageId: _postsPageRecord?.id, 28393 postsPageTitle: _postsPageRecord?.title, 28394 isTemplate: getCurrentPostType() === TEMPLATE_POST_TYPE, 28395 postSlug: getEditedPostAttribute('slug') 28396 }; 28397 }, []); 28398 // Use internal state instead of a ref to make sure that the component 28399 // re-renders when the popover's anchor updates. 28400 const [popoverAnchor, setPopoverAnchor] = (0,external_wp_element_namespaceObject.useState)(null); 28401 // Memoize popoverProps to avoid returning a new object every time. 28402 const popoverProps = (0,external_wp_element_namespaceObject.useMemo)(() => ({ 28403 // Anchor the popover to the middle of the entire row so that it doesn't 28404 // move around when the label changes. 28405 anchor: popoverAnchor, 28406 placement: 'left-start', 28407 offset: 36, 28408 shift: true 28409 }), [popoverAnchor]); 28410 if (!isTemplate || !['home', 'index'].includes(postSlug) || !postsPageId) { 28411 return null; 28412 } 28413 const setPostsPageTitle = newValue => { 28414 editEntityRecord('postType', 'page', postsPageId, { 28415 title: newValue 28416 }); 28417 }; 28418 const decodedTitle = (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(postsPageTitle); 28419 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { 28420 label: (0,external_wp_i18n_namespaceObject.__)('Blog title'), 28421 ref: setPopoverAnchor, 28422 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Dropdown, { 28423 popoverProps: popoverProps, 28424 contentClassName: "editor-blog-title-dropdown__content", 28425 focusOnMount: true, 28426 renderToggle: ({ 28427 isOpen, 28428 onToggle 28429 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 28430 size: "compact", 28431 variant: "tertiary", 28432 "aria-expanded": isOpen, 28433 "aria-label": (0,external_wp_i18n_namespaceObject.sprintf)( 28434 // translators: %s: Current post link. 28435 (0,external_wp_i18n_namespaceObject.__)('Change blog title: %s'), decodedTitle), 28436 onClick: onToggle, 28437 children: decodedTitle 28438 }), 28439 renderContent: ({ 28440 onClose 28441 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 28442 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalInspectorPopoverHeader, { 28443 title: (0,external_wp_i18n_namespaceObject.__)('Blog title'), 28444 onClose: onClose 28445 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalInputControl, { 28446 placeholder: (0,external_wp_i18n_namespaceObject.__)('No title'), 28447 size: "__unstable-large", 28448 value: postsPageTitle, 28449 onChange: (0,external_wp_compose_namespaceObject.debounce)(setPostsPageTitle, 300), 28450 label: (0,external_wp_i18n_namespaceObject.__)('Blog title'), 28451 help: (0,external_wp_i18n_namespaceObject.__)('Set the Posts Page title. Appears in search results, and when the page is shared on social media.'), 28452 hideLabelFromVision: true 28453 })] 28454 }) 28455 }) 28456 }); 28457 } 28458 28459 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/posts-per-page/index.js 28460 /** 28461 * WordPress dependencies 28462 */ 28463 28464 28465 28466 28467 28468 28469 28470 /** 28471 * Internal dependencies 28472 */ 28473 28474 28475 28476 28477 28478 28479 function PostsPerPage() { 28480 const { 28481 editEntityRecord 28482 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); 28483 const { 28484 postsPerPage, 28485 isTemplate, 28486 postSlug 28487 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 28488 const { 28489 getEditedPostAttribute, 28490 getCurrentPostType 28491 } = select(store_store); 28492 const { 28493 getEditedEntityRecord, 28494 canUser 28495 } = select(external_wp_coreData_namespaceObject.store); 28496 const siteSettings = canUser('read', { 28497 kind: 'root', 28498 name: 'site' 28499 }) ? getEditedEntityRecord('root', 'site') : undefined; 28500 return { 28501 isTemplate: getCurrentPostType() === TEMPLATE_POST_TYPE, 28502 postSlug: getEditedPostAttribute('slug'), 28503 postsPerPage: siteSettings?.posts_per_page || 1 28504 }; 28505 }, []); 28506 // Use internal state instead of a ref to make sure that the component 28507 // re-renders when the popover's anchor updates. 28508 const [popoverAnchor, setPopoverAnchor] = (0,external_wp_element_namespaceObject.useState)(null); 28509 // Memoize popoverProps to avoid returning a new object every time. 28510 const popoverProps = (0,external_wp_element_namespaceObject.useMemo)(() => ({ 28511 // Anchor the popover to the middle of the entire row so that it doesn't 28512 // move around when the label changes. 28513 anchor: popoverAnchor, 28514 placement: 'left-start', 28515 offset: 36, 28516 shift: true 28517 }), [popoverAnchor]); 28518 if (!isTemplate || !['home', 'index'].includes(postSlug)) { 28519 return null; 28520 } 28521 const setPostsPerPage = newValue => { 28522 editEntityRecord('root', 'site', undefined, { 28523 posts_per_page: newValue 28524 }); 28525 }; 28526 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { 28527 label: (0,external_wp_i18n_namespaceObject.__)('Posts per page'), 28528 ref: setPopoverAnchor, 28529 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Dropdown, { 28530 popoverProps: popoverProps, 28531 contentClassName: "editor-posts-per-page-dropdown__content", 28532 focusOnMount: true, 28533 renderToggle: ({ 28534 isOpen, 28535 onToggle 28536 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 28537 size: "compact", 28538 variant: "tertiary", 28539 "aria-expanded": isOpen, 28540 "aria-label": (0,external_wp_i18n_namespaceObject.__)('Change posts per page'), 28541 onClick: onToggle, 28542 children: postsPerPage 28543 }), 28544 renderContent: ({ 28545 onClose 28546 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 28547 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalInspectorPopoverHeader, { 28548 title: (0,external_wp_i18n_namespaceObject.__)('Posts per page'), 28549 onClose: onClose 28550 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalNumberControl, { 28551 placeholder: 0, 28552 value: postsPerPage, 28553 size: "__unstable-large", 28554 spinControls: "custom", 28555 step: "1", 28556 min: "1", 28557 onChange: setPostsPerPage, 28558 label: (0,external_wp_i18n_namespaceObject.__)('Posts per page'), 28559 help: (0,external_wp_i18n_namespaceObject.__)('Set the default number of posts to display on blog pages, including categories and tags. Some templates may override this setting.'), 28560 hideLabelFromVision: true 28561 })] 28562 }) 28563 }) 28564 }); 28565 } 28566 28567 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/site-discussion/index.js 28568 /** 28569 * WordPress dependencies 28570 */ 28571 28572 28573 28574 28575 28576 28577 28578 /** 28579 * Internal dependencies 28580 */ 28581 28582 28583 28584 28585 28586 28587 const site_discussion_COMMENT_OPTIONS = [{ 28588 label: (0,external_wp_i18n_namespaceObject._x)('Open', 'Adjective: e.g. "Comments are open"'), 28589 value: 'open', 28590 description: (0,external_wp_i18n_namespaceObject.__)('Visitors can add new comments and replies.') 28591 }, { 28592 label: (0,external_wp_i18n_namespaceObject.__)('Closed'), 28593 value: '', 28594 description: [(0,external_wp_i18n_namespaceObject.__)('Visitors cannot add new comments or replies.'), (0,external_wp_i18n_namespaceObject.__)('Existing comments remain visible.')].join(' ') 28595 }]; 28596 function SiteDiscussion() { 28597 const { 28598 editEntityRecord 28599 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); 28600 const { 28601 allowCommentsOnNewPosts, 28602 isTemplate, 28603 postSlug 28604 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 28605 const { 28606 getEditedPostAttribute, 28607 getCurrentPostType 28608 } = select(store_store); 28609 const { 28610 getEditedEntityRecord, 28611 canUser 28612 } = select(external_wp_coreData_namespaceObject.store); 28613 const siteSettings = canUser('read', { 28614 kind: 'root', 28615 name: 'site' 28616 }) ? getEditedEntityRecord('root', 'site') : undefined; 28617 return { 28618 isTemplate: getCurrentPostType() === TEMPLATE_POST_TYPE, 28619 postSlug: getEditedPostAttribute('slug'), 28620 allowCommentsOnNewPosts: siteSettings?.default_comment_status || '' 28621 }; 28622 }, []); 28623 // Use internal state instead of a ref to make sure that the component 28624 // re-renders when the popover's anchor updates. 28625 const [popoverAnchor, setPopoverAnchor] = (0,external_wp_element_namespaceObject.useState)(null); 28626 // Memoize popoverProps to avoid returning a new object every time. 28627 const popoverProps = (0,external_wp_element_namespaceObject.useMemo)(() => ({ 28628 // Anchor the popover to the middle of the entire row so that it doesn't 28629 // move around when the label changes. 28630 anchor: popoverAnchor, 28631 placement: 'left-start', 28632 offset: 36, 28633 shift: true 28634 }), [popoverAnchor]); 28635 if (!isTemplate || !['home', 'index'].includes(postSlug)) { 28636 return null; 28637 } 28638 const setAllowCommentsOnNewPosts = newValue => { 28639 editEntityRecord('root', 'site', undefined, { 28640 default_comment_status: newValue ? 'open' : null 28641 }); 28642 }; 28643 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_row, { 28644 label: (0,external_wp_i18n_namespaceObject.__)('Discussion'), 28645 ref: setPopoverAnchor, 28646 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Dropdown, { 28647 popoverProps: popoverProps, 28648 contentClassName: "editor-site-discussion-dropdown__content", 28649 focusOnMount: true, 28650 renderToggle: ({ 28651 isOpen, 28652 onToggle 28653 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 28654 size: "compact", 28655 variant: "tertiary", 28656 "aria-expanded": isOpen, 28657 "aria-label": (0,external_wp_i18n_namespaceObject.__)('Change discussion settings'), 28658 onClick: onToggle, 28659 children: allowCommentsOnNewPosts ? (0,external_wp_i18n_namespaceObject.__)('Comments open') : (0,external_wp_i18n_namespaceObject.__)('Comments closed') 28660 }), 28661 renderContent: ({ 28662 onClose 28663 }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 28664 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalInspectorPopoverHeader, { 28665 title: (0,external_wp_i18n_namespaceObject.__)('Discussion'), 28666 onClose: onClose 28667 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { 28668 spacing: 3, 28669 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalText, { 28670 children: (0,external_wp_i18n_namespaceObject.__)('Changes will apply to new posts only. Individual posts may override these settings.') 28671 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.RadioControl, { 28672 className: "editor-site-discussion__options", 28673 hideLabelFromVision: true, 28674 label: (0,external_wp_i18n_namespaceObject.__)('Comment status'), 28675 options: site_discussion_COMMENT_OPTIONS, 28676 onChange: setAllowCommentsOnNewPosts, 28677 selected: allowCommentsOnNewPosts 28678 })] 28679 })] 28680 }) 28681 }) 28682 }); 28683 } 28684 28685 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/sidebar/post-summary.js 28686 /** 28687 * WordPress dependencies 28688 */ 28689 28690 28691 28692 /** 28693 * Internal dependencies 28694 */ 28695 28696 28697 28698 28699 28700 28701 28702 28703 28704 28705 28706 28707 28708 28709 28710 28711 28712 28713 28714 28715 28716 28717 28718 /** 28719 * Module Constants 28720 */ 28721 28722 28723 28724 const post_summary_PANEL_NAME = 'post-status'; 28725 function PostSummary({ 28726 onActionPerformed 28727 }) { 28728 const { 28729 isRemovedPostStatusPanel, 28730 postType, 28731 postId 28732 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 28733 // We use isEditorPanelRemoved to hide the panel if it was programatically removed. We do 28734 // not use isEditorPanelEnabled since this panel should not be disabled through the UI. 28735 const { 28736 isEditorPanelRemoved, 28737 getCurrentPostType, 28738 getCurrentPostId 28739 } = select(store_store); 28740 return { 28741 isRemovedPostStatusPanel: isEditorPanelRemoved(post_summary_PANEL_NAME), 28742 postType: getCurrentPostType(), 28743 postId: getCurrentPostId() 28744 }; 28745 }, []); 28746 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_panel_section, { 28747 className: "editor-post-summary", 28748 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(plugin_post_status_info.Slot, { 28749 children: fills => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_ReactJSXRuntime_namespaceObject.Fragment, { 28750 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { 28751 spacing: 4, 28752 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostCardPanel, { 28753 postType: postType, 28754 postId: postId, 28755 onActionPerformed: onActionPerformed 28756 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostFeaturedImagePanel, { 28757 withPanelBody: false 28758 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PrivatePostExcerptPanel, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { 28759 spacing: 1, 28760 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostContentInformation, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostLastEditedPanel, {})] 28761 }), !isRemovedPostStatusPanel && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { 28762 spacing: 4, 28763 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalVStack, { 28764 spacing: 1, 28765 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostStatus, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostSchedulePanel, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostURLPanel, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(panel, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostTemplatePanel, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostDiscussionPanel, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PrivatePostLastRevision, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PageAttributesPanel, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostSyncStatus, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(BlogTitle, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostsPerPage, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(SiteDiscussion, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_format_panel, {}), fills] 28766 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostTrash, { 28767 onActionPerformed: onActionPerformed 28768 })] 28769 })] 28770 }) 28771 }) 28772 }) 28773 }); 28774 } 28775 28776 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-transform-panel/hooks.js 28777 /** 28778 * WordPress dependencies 28779 */ 28780 28781 28782 28783 28784 28785 28786 /** 28787 * Internal dependencies 28788 */ 28789 28790 28791 const { 28792 EXCLUDED_PATTERN_SOURCES, 28793 PATTERN_TYPES: hooks_PATTERN_TYPES 28794 } = unlock(external_wp_patterns_namespaceObject.privateApis); 28795 function injectThemeAttributeInBlockTemplateContent(block, currentThemeStylesheet) { 28796 block.innerBlocks = block.innerBlocks.map(innerBlock => { 28797 return injectThemeAttributeInBlockTemplateContent(innerBlock, currentThemeStylesheet); 28798 }); 28799 if (block.name === 'core/template-part' && block.attributes.theme === undefined) { 28800 block.attributes.theme = currentThemeStylesheet; 28801 } 28802 return block; 28803 } 28804 28805 /** 28806 * Filter all patterns and return only the ones that are compatible with the current template. 28807 * 28808 * @param {Array} patterns An array of patterns. 28809 * @param {Object} template The current template. 28810 * @return {Array} Array of patterns that are compatible with the current template. 28811 */ 28812 function filterPatterns(patterns, template) { 28813 // Filter out duplicates. 28814 const filterOutDuplicatesByName = (currentItem, index, items) => index === items.findIndex(item => currentItem.name === item.name); 28815 28816 // Filter out core/directory patterns not included in theme.json. 28817 const filterOutExcludedPatternSources = pattern => !EXCLUDED_PATTERN_SOURCES.includes(pattern.source); 28818 28819 // Looks for patterns that have the same template type as the current template, 28820 // or have a block type that matches the current template area. 28821 const filterCompatiblePatterns = pattern => pattern.templateTypes?.includes(template.slug) || pattern.blockTypes?.includes('core/template-part/' + template.area); 28822 return patterns.filter((pattern, index, items) => { 28823 return filterOutDuplicatesByName(pattern, index, items) && filterOutExcludedPatternSources(pattern) && filterCompatiblePatterns(pattern); 28824 }); 28825 } 28826 function preparePatterns(patterns, currentThemeStylesheet) { 28827 return patterns.map(pattern => ({ 28828 ...pattern, 28829 keywords: pattern.keywords || [], 28830 type: hooks_PATTERN_TYPES.theme, 28831 blocks: (0,external_wp_blocks_namespaceObject.parse)(pattern.content, { 28832 __unstableSkipMigrationLogs: true 28833 }).map(block => injectThemeAttributeInBlockTemplateContent(block, currentThemeStylesheet)) 28834 })); 28835 } 28836 function useAvailablePatterns(template) { 28837 const { 28838 blockPatterns, 28839 restBlockPatterns, 28840 currentThemeStylesheet 28841 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 28842 var _settings$__experimen; 28843 const { 28844 getEditorSettings 28845 } = select(store_store); 28846 const settings = getEditorSettings(); 28847 return { 28848 blockPatterns: (_settings$__experimen = settings.__experimentalAdditionalBlockPatterns) !== null && _settings$__experimen !== void 0 ? _settings$__experimen : settings.__experimentalBlockPatterns, 28849 restBlockPatterns: select(external_wp_coreData_namespaceObject.store).getBlockPatterns(), 28850 currentThemeStylesheet: select(external_wp_coreData_namespaceObject.store).getCurrentTheme().stylesheet 28851 }; 28852 }, []); 28853 return (0,external_wp_element_namespaceObject.useMemo)(() => { 28854 const mergedPatterns = [...(blockPatterns || []), ...(restBlockPatterns || [])]; 28855 const filteredPatterns = filterPatterns(mergedPatterns, template); 28856 return preparePatterns(filteredPatterns, template, currentThemeStylesheet); 28857 }, [blockPatterns, restBlockPatterns, template, currentThemeStylesheet]); 28858 } 28859 28860 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-transform-panel/index.js 28861 /** 28862 * WordPress dependencies 28863 */ 28864 28865 28866 28867 28868 28869 28870 28871 28872 /** 28873 * Internal dependencies 28874 */ 28875 28876 28877 28878 28879 function post_transform_panel_TemplatesList({ 28880 availableTemplates, 28881 onSelect 28882 }) { 28883 const shownTemplates = (0,external_wp_compose_namespaceObject.useAsyncList)(availableTemplates); 28884 if (!availableTemplates || availableTemplates?.length === 0) { 28885 return null; 28886 } 28887 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.__experimentalBlockPatternsList, { 28888 label: (0,external_wp_i18n_namespaceObject.__)('Templates'), 28889 blockPatterns: availableTemplates, 28890 shownPatterns: shownTemplates, 28891 onClickPattern: onSelect, 28892 showTitlesAsTooltip: true 28893 }); 28894 } 28895 function PostTransform() { 28896 const { 28897 record, 28898 postType, 28899 postId 28900 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 28901 const { 28902 getCurrentPostType, 28903 getCurrentPostId 28904 } = select(store_store); 28905 const { 28906 getEditedEntityRecord 28907 } = select(external_wp_coreData_namespaceObject.store); 28908 const type = getCurrentPostType(); 28909 const id = getCurrentPostId(); 28910 return { 28911 postType: type, 28912 postId: id, 28913 record: getEditedEntityRecord('postType', type, id) 28914 }; 28915 }, []); 28916 const { 28917 editEntityRecord 28918 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); 28919 const availablePatterns = useAvailablePatterns(record); 28920 const onTemplateSelect = async selectedTemplate => { 28921 await editEntityRecord('postType', postType, postId, { 28922 blocks: selectedTemplate.blocks, 28923 content: (0,external_wp_blocks_namespaceObject.serialize)(selectedTemplate.blocks) 28924 }); 28925 }; 28926 if (!availablePatterns?.length) { 28927 return null; 28928 } 28929 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelBody, { 28930 title: (0,external_wp_i18n_namespaceObject.__)('Design'), 28931 initialOpen: record.type === TEMPLATE_PART_POST_TYPE, 28932 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_transform_panel_TemplatesList, { 28933 availableTemplates: availablePatterns, 28934 onSelect: onTemplateSelect 28935 }) 28936 }); 28937 } 28938 function PostTransformPanel() { 28939 const { 28940 postType 28941 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 28942 const { 28943 getCurrentPostType 28944 } = select(store_store); 28945 return { 28946 postType: getCurrentPostType() 28947 }; 28948 }, []); 28949 if (![TEMPLATE_PART_POST_TYPE, TEMPLATE_POST_TYPE].includes(postType)) { 28950 return null; 28951 } 28952 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostTransform, {}); 28953 } 28954 28955 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/sidebar/constants.js 28956 const sidebars = { 28957 document: 'edit-post/document', 28958 block: 'edit-post/block' 28959 }; 28960 28961 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/sidebar/header.js 28962 /** 28963 * WordPress dependencies 28964 */ 28965 28966 28967 28968 28969 28970 /** 28971 * Internal dependencies 28972 */ 28973 28974 28975 28976 28977 28978 const { 28979 Tabs 28980 } = unlock(external_wp_components_namespaceObject.privateApis); 28981 const SidebarHeader = (_, ref) => { 28982 const { 28983 documentLabel 28984 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 28985 const { 28986 getPostTypeLabel 28987 } = select(store_store); 28988 return { 28989 documentLabel: 28990 // translators: Default label for the Document sidebar tab, not selected. 28991 getPostTypeLabel() || (0,external_wp_i18n_namespaceObject._x)('Document', 'noun, sidebar') 28992 }; 28993 }, []); 28994 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(Tabs.TabList, { 28995 ref: ref, 28996 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(Tabs.Tab, { 28997 tabId: sidebars.document 28998 // Used for focus management in the SettingsSidebar component. 28999 , 29000 "data-tab-id": sidebars.document, 29001 children: documentLabel 29002 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(Tabs.Tab, { 29003 tabId: sidebars.block 29004 // Used for focus management in the SettingsSidebar component. 29005 , 29006 "data-tab-id": sidebars.block, 29007 children: (0,external_wp_i18n_namespaceObject.__)('Block') 29008 })] 29009 }); 29010 }; 29011 /* harmony default export */ const sidebar_header = ((0,external_wp_element_namespaceObject.forwardRef)(SidebarHeader)); 29012 29013 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/template-content-panel/index.js 29014 /** 29015 * WordPress dependencies 29016 */ 29017 29018 29019 29020 29021 29022 29023 29024 29025 /** 29026 * Internal dependencies 29027 */ 29028 29029 29030 29031 29032 const { 29033 BlockQuickNavigation 29034 } = unlock(external_wp_blockEditor_namespaceObject.privateApis); 29035 const template_content_panel_POST_CONTENT_BLOCK_TYPES = ['core/post-title', 'core/post-featured-image', 'core/post-content']; 29036 const TEMPLATE_PART_BLOCK = 'core/template-part'; 29037 function TemplateContentPanel() { 29038 const postContentBlockTypes = (0,external_wp_element_namespaceObject.useMemo)(() => (0,external_wp_hooks_namespaceObject.applyFilters)('editor.postContentBlockTypes', template_content_panel_POST_CONTENT_BLOCK_TYPES), []); 29039 const { 29040 clientIds, 29041 postType, 29042 renderingMode 29043 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 29044 const { 29045 getCurrentPostType, 29046 getPostBlocksByName, 29047 getRenderingMode 29048 } = unlock(select(store_store)); 29049 const _postType = getCurrentPostType(); 29050 return { 29051 postType: _postType, 29052 clientIds: getPostBlocksByName(TEMPLATE_POST_TYPE === _postType ? TEMPLATE_PART_BLOCK : postContentBlockTypes), 29053 renderingMode: getRenderingMode() 29054 }; 29055 }, [postContentBlockTypes]); 29056 const { 29057 enableComplementaryArea 29058 } = (0,external_wp_data_namespaceObject.useDispatch)(store); 29059 if (renderingMode === 'post-only' && postType !== TEMPLATE_POST_TYPE || clientIds.length === 0) { 29060 return null; 29061 } 29062 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelBody, { 29063 title: (0,external_wp_i18n_namespaceObject.__)('Content'), 29064 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(BlockQuickNavigation, { 29065 clientIds: clientIds, 29066 onSelect: () => { 29067 enableComplementaryArea('core', 'edit-post/document'); 29068 } 29069 }) 29070 }); 29071 } 29072 29073 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/template-part-content-panel/index.js 29074 /** 29075 * WordPress dependencies 29076 */ 29077 29078 29079 29080 29081 29082 29083 29084 /** 29085 * Internal dependencies 29086 */ 29087 29088 29089 29090 29091 const { 29092 BlockQuickNavigation: template_part_content_panel_BlockQuickNavigation 29093 } = unlock(external_wp_blockEditor_namespaceObject.privateApis); 29094 function TemplatePartContentPanelInner() { 29095 const blockTypes = (0,external_wp_data_namespaceObject.useSelect)(select => { 29096 const { 29097 getBlockTypes 29098 } = select(external_wp_blocks_namespaceObject.store); 29099 return getBlockTypes(); 29100 }, []); 29101 const themeBlockNames = (0,external_wp_element_namespaceObject.useMemo)(() => { 29102 return blockTypes.filter(blockType => { 29103 return blockType.category === 'theme'; 29104 }).map(({ 29105 name 29106 }) => name); 29107 }, [blockTypes]); 29108 const themeBlocks = (0,external_wp_data_namespaceObject.useSelect)(select => { 29109 const { 29110 getBlocksByName 29111 } = select(external_wp_blockEditor_namespaceObject.store); 29112 return getBlocksByName(themeBlockNames); 29113 }, [themeBlockNames]); 29114 if (themeBlocks.length === 0) { 29115 return null; 29116 } 29117 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.PanelBody, { 29118 title: (0,external_wp_i18n_namespaceObject.__)('Content'), 29119 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(template_part_content_panel_BlockQuickNavigation, { 29120 clientIds: themeBlocks 29121 }) 29122 }); 29123 } 29124 function TemplatePartContentPanel() { 29125 const postType = (0,external_wp_data_namespaceObject.useSelect)(select => { 29126 const { 29127 getCurrentPostType 29128 } = select(store_store); 29129 return getCurrentPostType(); 29130 }, []); 29131 if (postType !== TEMPLATE_PART_POST_TYPE) { 29132 return null; 29133 } 29134 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TemplatePartContentPanelInner, {}); 29135 } 29136 29137 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/provider/use-auto-switch-editor-sidebars.js 29138 /** 29139 * WordPress dependencies 29140 */ 29141 29142 29143 29144 29145 29146 29147 /** 29148 * This listener hook monitors for block selection and triggers the appropriate 29149 * sidebar state. 29150 */ 29151 function useAutoSwitchEditorSidebars() { 29152 const { 29153 hasBlockSelection 29154 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 29155 return { 29156 hasBlockSelection: !!select(external_wp_blockEditor_namespaceObject.store).getBlockSelectionStart() 29157 }; 29158 }, []); 29159 const { 29160 getActiveComplementaryArea 29161 } = (0,external_wp_data_namespaceObject.useSelect)(store); 29162 const { 29163 enableComplementaryArea 29164 } = (0,external_wp_data_namespaceObject.useDispatch)(store); 29165 const { 29166 get: getPreference 29167 } = (0,external_wp_data_namespaceObject.useSelect)(external_wp_preferences_namespaceObject.store); 29168 (0,external_wp_element_namespaceObject.useEffect)(() => { 29169 const activeGeneralSidebar = getActiveComplementaryArea('core'); 29170 const isEditorSidebarOpened = ['edit-post/document', 'edit-post/block'].includes(activeGeneralSidebar); 29171 const isDistractionFree = getPreference('core', 'distractionFree'); 29172 if (!isEditorSidebarOpened || isDistractionFree) { 29173 return; 29174 } 29175 if (hasBlockSelection) { 29176 enableComplementaryArea('core', 'edit-post/block'); 29177 } else { 29178 enableComplementaryArea('core', 'edit-post/document'); 29179 } 29180 }, [hasBlockSelection, getActiveComplementaryArea, enableComplementaryArea, getPreference]); 29181 } 29182 /* harmony default export */ const use_auto_switch_editor_sidebars = (useAutoSwitchEditorSidebars); 29183 29184 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/sidebar/index.js 29185 /** 29186 * WordPress dependencies 29187 */ 29188 29189 29190 29191 29192 29193 29194 29195 29196 29197 /** 29198 * Internal dependencies 29199 */ 29200 29201 29202 29203 29204 29205 29206 29207 29208 29209 29210 29211 29212 29213 29214 29215 29216 const { 29217 Tabs: sidebar_Tabs 29218 } = unlock(external_wp_components_namespaceObject.privateApis); 29219 const SIDEBAR_ACTIVE_BY_DEFAULT = external_wp_element_namespaceObject.Platform.select({ 29220 web: true, 29221 native: false 29222 }); 29223 const SidebarContent = ({ 29224 tabName, 29225 keyboardShortcut, 29226 onActionPerformed, 29227 extraPanels 29228 }) => { 29229 const tabListRef = (0,external_wp_element_namespaceObject.useRef)(null); 29230 // Because `PluginSidebar` renders a `ComplementaryArea`, we 29231 // need to forward the `Tabs` context so it can be passed through the 29232 // underlying slot/fill. 29233 const tabsContextValue = (0,external_wp_element_namespaceObject.useContext)(sidebar_Tabs.Context); 29234 29235 // This effect addresses a race condition caused by tabbing from the last 29236 // block in the editor into the settings sidebar. Without this effect, the 29237 // selected tab and browser focus can become separated in an unexpected way 29238 // (e.g the "block" tab is focused, but the "post" tab is selected). 29239 (0,external_wp_element_namespaceObject.useEffect)(() => { 29240 const tabsElements = Array.from(tabListRef.current?.querySelectorAll('[role="tab"]') || []); 29241 const selectedTabElement = tabsElements.find( 29242 // We are purposefully using a custom `data-tab-id` attribute here 29243 // because we don't want rely on any assumptions about `Tabs` 29244 // component internals. 29245 element => element.getAttribute('data-tab-id') === tabName); 29246 const activeElement = selectedTabElement?.ownerDocument.activeElement; 29247 const tabsHasFocus = tabsElements.some(element => { 29248 return activeElement && activeElement.id === element.id; 29249 }); 29250 if (tabsHasFocus && selectedTabElement && selectedTabElement.id !== activeElement?.id) { 29251 selectedTabElement?.focus(); 29252 } 29253 }, [tabName]); 29254 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PluginSidebar, { 29255 identifier: tabName, 29256 header: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(sidebar_Tabs.Context.Provider, { 29257 value: tabsContextValue, 29258 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(sidebar_header, { 29259 ref: tabListRef 29260 }) 29261 }), 29262 closeLabel: (0,external_wp_i18n_namespaceObject.__)('Close Settings') 29263 // This classname is added so we can apply a corrective negative 29264 // margin to the panel. 29265 // see https://github.com/WordPress/gutenberg/pull/55360#pullrequestreview-1737671049 29266 , 29267 className: "editor-sidebar__panel", 29268 headerClassName: "editor-sidebar__panel-tabs", 29269 title: /* translators: button label text should, if possible, be under 16 characters. */ 29270 (0,external_wp_i18n_namespaceObject._x)('Settings', 'sidebar button label'), 29271 toggleShortcut: keyboardShortcut, 29272 icon: (0,external_wp_i18n_namespaceObject.isRTL)() ? drawer_left : drawer_right, 29273 isActiveByDefault: SIDEBAR_ACTIVE_BY_DEFAULT, 29274 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(sidebar_Tabs.Context.Provider, { 29275 value: tabsContextValue, 29276 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(sidebar_Tabs.TabPanel, { 29277 tabId: sidebars.document, 29278 focusable: false, 29279 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostSummary, { 29280 onActionPerformed: onActionPerformed 29281 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(plugin_document_setting_panel.Slot, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TemplateContentPanel, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TemplatePartContentPanel, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostTransformPanel, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_taxonomies_panel, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PatternOverridesPanel, {}), extraPanels] 29282 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(sidebar_Tabs.TabPanel, { 29283 tabId: sidebars.block, 29284 focusable: false, 29285 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.BlockInspector, {}) 29286 })] 29287 }) 29288 }); 29289 }; 29290 const Sidebar = ({ 29291 extraPanels, 29292 onActionPerformed 29293 }) => { 29294 use_auto_switch_editor_sidebars(); 29295 const { 29296 tabName, 29297 keyboardShortcut, 29298 showSummary 29299 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 29300 const shortcut = select(external_wp_keyboardShortcuts_namespaceObject.store).getShortcutRepresentation('core/editor/toggle-sidebar'); 29301 const sidebar = select(store).getActiveComplementaryArea('core'); 29302 const _isEditorSidebarOpened = [sidebars.block, sidebars.document].includes(sidebar); 29303 let _tabName = sidebar; 29304 if (!_isEditorSidebarOpened) { 29305 _tabName = !!select(external_wp_blockEditor_namespaceObject.store).getBlockSelectionStart() ? sidebars.block : sidebars.document; 29306 } 29307 return { 29308 tabName: _tabName, 29309 keyboardShortcut: shortcut, 29310 showSummary: ![TEMPLATE_POST_TYPE, TEMPLATE_PART_POST_TYPE, NAVIGATION_POST_TYPE].includes(select(store_store).getCurrentPostType()) 29311 }; 29312 }, []); 29313 const { 29314 enableComplementaryArea 29315 } = (0,external_wp_data_namespaceObject.useDispatch)(store); 29316 const onTabSelect = (0,external_wp_element_namespaceObject.useCallback)(newSelectedTabId => { 29317 if (!!newSelectedTabId) { 29318 enableComplementaryArea('core', newSelectedTabId); 29319 } 29320 }, [enableComplementaryArea]); 29321 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(sidebar_Tabs, { 29322 selectedTabId: tabName, 29323 onSelect: onTabSelect, 29324 selectOnMove: false, 29325 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(SidebarContent, { 29326 tabName: tabName, 29327 keyboardShortcut: keyboardShortcut, 29328 showSummary: showSummary, 29329 onActionPerformed: onActionPerformed, 29330 extraPanels: extraPanels 29331 }) 29332 }); 29333 }; 29334 /* harmony default export */ const components_sidebar = (Sidebar); 29335 29336 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/editor/index.js 29337 /** 29338 * WordPress dependencies 29339 */ 29340 29341 29342 29343 29344 29345 /** 29346 * Internal dependencies 29347 */ 29348 29349 29350 29351 29352 29353 29354 29355 function Editor({ 29356 postType, 29357 postId, 29358 templateId, 29359 settings, 29360 children, 29361 initialEdits, 29362 // This could be part of the settings. 29363 onActionPerformed, 29364 // The following abstractions are not ideal but necessary 29365 // to account for site editor and post editor differences for now. 29366 extraContent, 29367 extraSidebarPanels, 29368 ...props 29369 }) { 29370 const { 29371 post, 29372 template, 29373 hasLoadedPost 29374 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 29375 const { 29376 getEntityRecord, 29377 hasFinishedResolution 29378 } = select(external_wp_coreData_namespaceObject.store); 29379 return { 29380 post: getEntityRecord('postType', postType, postId), 29381 template: templateId ? getEntityRecord('postType', TEMPLATE_POST_TYPE, templateId) : undefined, 29382 hasLoadedPost: hasFinishedResolution('getEntityRecord', ['postType', postType, postId]) 29383 }; 29384 }, [postType, postId, templateId]); 29385 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 29386 children: [hasLoadedPost && !post && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Notice, { 29387 status: "warning", 29388 isDismissible: false, 29389 children: (0,external_wp_i18n_namespaceObject.__)("You attempted to edit an item that doesn't exist. Perhaps it was deleted?") 29390 }), !!post && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(ExperimentalEditorProvider, { 29391 post: post, 29392 __unstableTemplate: template, 29393 settings: settings, 29394 initialEdits: initialEdits, 29395 useSubRegistry: false, 29396 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(EditorInterface, { 29397 ...props, 29398 children: extraContent 29399 }), children, /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(components_sidebar, { 29400 onActionPerformed: onActionPerformed, 29401 extraPanels: extraSidebarPanels 29402 })] 29403 })] 29404 }); 29405 } 29406 /* harmony default export */ const editor = (Editor); 29407 29408 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/preferences-modal/enable-publish-sidebar.js 29409 /** 29410 * WordPress dependencies 29411 */ 29412 29413 29414 29415 29416 /** 29417 * Internal dependencies 29418 */ 29419 29420 29421 const { 29422 PreferenceBaseOption: enable_publish_sidebar_PreferenceBaseOption 29423 } = unlock(external_wp_preferences_namespaceObject.privateApis); 29424 /* harmony default export */ const enable_publish_sidebar = ((0,external_wp_compose_namespaceObject.compose)((0,external_wp_data_namespaceObject.withSelect)(select => ({ 29425 isChecked: select(store_store).isPublishSidebarEnabled() 29426 })), (0,external_wp_data_namespaceObject.withDispatch)(dispatch => { 29427 const { 29428 enablePublishSidebar, 29429 disablePublishSidebar 29430 } = dispatch(store_store); 29431 return { 29432 onChange: isEnabled => isEnabled ? enablePublishSidebar() : disablePublishSidebar() 29433 }; 29434 }))(enable_publish_sidebar_PreferenceBaseOption)); 29435 29436 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-manager/checklist.js 29437 /** 29438 * WordPress dependencies 29439 */ 29440 29441 29442 29443 29444 function BlockTypesChecklist({ 29445 blockTypes, 29446 value, 29447 onItemChange 29448 }) { 29449 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("ul", { 29450 className: "editor-block-manager__checklist", 29451 children: blockTypes.map(blockType => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("li", { 29452 className: "editor-block-manager__checklist-item", 29453 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.CheckboxControl, { 29454 __nextHasNoMarginBottom: true, 29455 label: blockType.title, 29456 checked: value.includes(blockType.name), 29457 onChange: (...args) => onItemChange(blockType.name, ...args) 29458 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_blockEditor_namespaceObject.BlockIcon, { 29459 icon: blockType.icon 29460 })] 29461 }, blockType.name)) 29462 }); 29463 } 29464 /* harmony default export */ const checklist = (BlockTypesChecklist); 29465 29466 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-manager/category.js 29467 /** 29468 * WordPress dependencies 29469 */ 29470 29471 29472 29473 29474 29475 29476 /** 29477 * Internal dependencies 29478 */ 29479 29480 29481 29482 29483 29484 function BlockManagerCategory({ 29485 title, 29486 blockTypes 29487 }) { 29488 const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(BlockManagerCategory); 29489 const { 29490 allowedBlockTypes, 29491 hiddenBlockTypes 29492 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 29493 const { 29494 getEditorSettings 29495 } = select(store_store); 29496 const { 29497 get 29498 } = select(external_wp_preferences_namespaceObject.store); 29499 return { 29500 allowedBlockTypes: getEditorSettings().allowedBlockTypes, 29501 hiddenBlockTypes: get('core', 'hiddenBlockTypes') 29502 }; 29503 }, []); 29504 const filteredBlockTypes = (0,external_wp_element_namespaceObject.useMemo)(() => { 29505 if (allowedBlockTypes === true) { 29506 return blockTypes; 29507 } 29508 return blockTypes.filter(({ 29509 name 29510 }) => { 29511 return allowedBlockTypes?.includes(name); 29512 }); 29513 }, [allowedBlockTypes, blockTypes]); 29514 const { 29515 showBlockTypes, 29516 hideBlockTypes 29517 } = unlock((0,external_wp_data_namespaceObject.useDispatch)(store_store)); 29518 const toggleVisible = (0,external_wp_element_namespaceObject.useCallback)((blockName, nextIsChecked) => { 29519 if (nextIsChecked) { 29520 showBlockTypes(blockName); 29521 } else { 29522 hideBlockTypes(blockName); 29523 } 29524 }, [showBlockTypes, hideBlockTypes]); 29525 const toggleAllVisible = (0,external_wp_element_namespaceObject.useCallback)(nextIsChecked => { 29526 const blockNames = blockTypes.map(({ 29527 name 29528 }) => name); 29529 if (nextIsChecked) { 29530 showBlockTypes(blockNames); 29531 } else { 29532 hideBlockTypes(blockNames); 29533 } 29534 }, [blockTypes, showBlockTypes, hideBlockTypes]); 29535 if (!filteredBlockTypes.length) { 29536 return null; 29537 } 29538 const checkedBlockNames = filteredBlockTypes.map(({ 29539 name 29540 }) => name).filter(type => !(hiddenBlockTypes !== null && hiddenBlockTypes !== void 0 ? hiddenBlockTypes : []).includes(type)); 29541 const titleId = 'editor-block-manager__category-title-' + instanceId; 29542 const isAllChecked = checkedBlockNames.length === filteredBlockTypes.length; 29543 const isIndeterminate = !isAllChecked && checkedBlockNames.length > 0; 29544 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 29545 role: "group", 29546 "aria-labelledby": titleId, 29547 className: "editor-block-manager__category", 29548 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.CheckboxControl, { 29549 __nextHasNoMarginBottom: true, 29550 checked: isAllChecked, 29551 onChange: toggleAllVisible, 29552 className: "editor-block-manager__category-title", 29553 indeterminate: isIndeterminate, 29554 label: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { 29555 id: titleId, 29556 children: title 29557 }) 29558 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(checklist, { 29559 blockTypes: filteredBlockTypes, 29560 value: checkedBlockNames, 29561 onItemChange: toggleVisible 29562 })] 29563 }); 29564 } 29565 /* harmony default export */ const block_manager_category = (BlockManagerCategory); 29566 29567 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-manager/index.js 29568 /** 29569 * WordPress dependencies 29570 */ 29571 29572 29573 29574 29575 29576 29577 29578 29579 29580 /** 29581 * Internal dependencies 29582 */ 29583 29584 29585 29586 29587 29588 function BlockManager() { 29589 const debouncedSpeak = (0,external_wp_compose_namespaceObject.useDebounce)(external_wp_a11y_namespaceObject.speak, 500); 29590 const [search, setSearch] = (0,external_wp_element_namespaceObject.useState)(''); 29591 const { 29592 showBlockTypes 29593 } = unlock((0,external_wp_data_namespaceObject.useDispatch)(store_store)); 29594 const { 29595 blockTypes, 29596 categories, 29597 hasBlockSupport, 29598 isMatchingSearchTerm, 29599 numberOfHiddenBlocks 29600 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 29601 var _select$get; 29602 // Some hidden blocks become unregistered 29603 // by removing for instance the plugin that registered them, yet 29604 // they're still remain as hidden by the user's action. 29605 // We consider "hidden", blocks which were hidden and 29606 // are still registered. 29607 const _blockTypes = select(external_wp_blocks_namespaceObject.store).getBlockTypes(); 29608 const hiddenBlockTypes = ((_select$get = select(external_wp_preferences_namespaceObject.store).get('core', 'hiddenBlockTypes')) !== null && _select$get !== void 0 ? _select$get : []).filter(hiddenBlock => { 29609 return _blockTypes.some(registeredBlock => registeredBlock.name === hiddenBlock); 29610 }); 29611 return { 29612 blockTypes: _blockTypes, 29613 categories: select(external_wp_blocks_namespaceObject.store).getCategories(), 29614 hasBlockSupport: select(external_wp_blocks_namespaceObject.store).hasBlockSupport, 29615 isMatchingSearchTerm: select(external_wp_blocks_namespaceObject.store).isMatchingSearchTerm, 29616 numberOfHiddenBlocks: Array.isArray(hiddenBlockTypes) && hiddenBlockTypes.length 29617 }; 29618 }, []); 29619 function enableAllBlockTypes(newBlockTypes) { 29620 const blockNames = newBlockTypes.map(({ 29621 name 29622 }) => name); 29623 showBlockTypes(blockNames); 29624 } 29625 const filteredBlockTypes = blockTypes.filter(blockType => hasBlockSupport(blockType, 'inserter', true) && (!search || isMatchingSearchTerm(blockType, search)) && (!blockType.parent || blockType.parent.includes('core/post-content'))); 29626 29627 // Announce search results on change 29628 (0,external_wp_element_namespaceObject.useEffect)(() => { 29629 if (!search) { 29630 return; 29631 } 29632 const count = filteredBlockTypes.length; 29633 const resultsFoundMessage = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %d: number of results. */ 29634 (0,external_wp_i18n_namespaceObject._n)('%d result found.', '%d results found.', count), count); 29635 debouncedSpeak(resultsFoundMessage); 29636 }, [filteredBlockTypes?.length, search, debouncedSpeak]); 29637 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 29638 className: "editor-block-manager__content", 29639 children: [!!numberOfHiddenBlocks && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 29640 className: "editor-block-manager__disabled-blocks-count", 29641 children: [(0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %d: number of blocks. */ 29642 (0,external_wp_i18n_namespaceObject._n)('%d block is hidden.', '%d blocks are hidden.', numberOfHiddenBlocks), numberOfHiddenBlocks), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, { 29643 __next40pxDefaultSize: true, 29644 variant: "link", 29645 onClick: () => enableAllBlockTypes(filteredBlockTypes), 29646 children: (0,external_wp_i18n_namespaceObject.__)('Reset') 29647 })] 29648 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.SearchControl, { 29649 __nextHasNoMarginBottom: true, 29650 label: (0,external_wp_i18n_namespaceObject.__)('Search for a block'), 29651 placeholder: (0,external_wp_i18n_namespaceObject.__)('Search for a block'), 29652 value: search, 29653 onChange: nextSearch => setSearch(nextSearch), 29654 className: "editor-block-manager__search" 29655 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { 29656 tabIndex: "0", 29657 role: "region", 29658 "aria-label": (0,external_wp_i18n_namespaceObject.__)('Available block types'), 29659 className: "editor-block-manager__results", 29660 children: [filteredBlockTypes.length === 0 && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { 29661 className: "editor-block-manager__no-results", 29662 children: (0,external_wp_i18n_namespaceObject.__)('No blocks found.') 29663 }), categories.map(category => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(block_manager_category, { 29664 title: category.title, 29665 blockTypes: filteredBlockTypes.filter(blockType => blockType.category === category.slug) 29666 }, category.slug)), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(block_manager_category, { 29667 title: (0,external_wp_i18n_namespaceObject.__)('Uncategorized'), 29668 blockTypes: filteredBlockTypes.filter(({ 29669 category 29670 }) => !category) 29671 })] 29672 })] 29673 }); 29674 } 29675 29676 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/preferences-modal/index.js 29677 /** 29678 * WordPress dependencies 29679 */ 29680 29681 29682 29683 29684 29685 29686 29687 29688 /** 29689 * Internal dependencies 29690 */ 29691 29692 29693 29694 29695 29696 29697 29698 29699 29700 29701 29702 29703 29704 29705 29706 const { 29707 PreferencesModal, 29708 PreferencesModalTabs, 29709 PreferencesModalSection, 29710 PreferenceToggleControl 29711 } = unlock(external_wp_preferences_namespaceObject.privateApis); 29712 function EditorPreferencesModal({ 29713 extraSections = {} 29714 }) { 29715 const isActive = (0,external_wp_data_namespaceObject.useSelect)(select => { 29716 return select(store).isModalActive('editor/preferences'); 29717 }, []); 29718 const { 29719 closeModal 29720 } = (0,external_wp_data_namespaceObject.useDispatch)(store); 29721 if (!isActive) { 29722 return null; 29723 } 29724 29725 // Please wrap all contents inside PreferencesModalContents to prevent all 29726 // hooks from executing when the modal is not open. 29727 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PreferencesModal, { 29728 closeModal: closeModal, 29729 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PreferencesModalContents, { 29730 extraSections: extraSections 29731 }) 29732 }); 29733 } 29734 function PreferencesModalContents({ 29735 extraSections = {} 29736 }) { 29737 const isLargeViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium'); 29738 const showBlockBreadcrumbsOption = (0,external_wp_data_namespaceObject.useSelect)(select => { 29739 const { 29740 getEditorSettings 29741 } = select(store_store); 29742 const { 29743 get 29744 } = select(external_wp_preferences_namespaceObject.store); 29745 const isRichEditingEnabled = getEditorSettings().richEditingEnabled; 29746 const isDistractionFreeEnabled = get('core', 'distractionFree'); 29747 return !isDistractionFreeEnabled && isLargeViewport && isRichEditingEnabled; 29748 }, [isLargeViewport]); 29749 const { 29750 setIsListViewOpened, 29751 setIsInserterOpened 29752 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store); 29753 const { 29754 set: setPreference 29755 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_preferences_namespaceObject.store); 29756 const hasStarterPatterns = !!useStartPatterns().length; 29757 const sections = (0,external_wp_element_namespaceObject.useMemo)(() => [{ 29758 name: 'general', 29759 tabLabel: (0,external_wp_i18n_namespaceObject.__)('General'), 29760 content: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 29761 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(PreferencesModalSection, { 29762 title: (0,external_wp_i18n_namespaceObject.__)('Interface'), 29763 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PreferenceToggleControl, { 29764 scope: "core", 29765 featureName: "showListViewByDefault", 29766 help: (0,external_wp_i18n_namespaceObject.__)('Opens the List View sidebar by default.'), 29767 label: (0,external_wp_i18n_namespaceObject.__)('Always open List View') 29768 }), showBlockBreadcrumbsOption && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PreferenceToggleControl, { 29769 scope: "core", 29770 featureName: "showBlockBreadcrumbs", 29771 help: (0,external_wp_i18n_namespaceObject.__)('Display the block hierarchy trail at the bottom of the editor.'), 29772 label: (0,external_wp_i18n_namespaceObject.__)('Show block breadcrumbs') 29773 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PreferenceToggleControl, { 29774 scope: "core", 29775 featureName: "allowRightClickOverrides", 29776 help: (0,external_wp_i18n_namespaceObject.__)('Allows contextual List View menus via right-click, overriding browser defaults.'), 29777 label: (0,external_wp_i18n_namespaceObject.__)('Allow right-click contextual menus') 29778 }), hasStarterPatterns && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PreferenceToggleControl, { 29779 scope: "core", 29780 featureName: "enableChoosePatternModal", 29781 help: (0,external_wp_i18n_namespaceObject.__)('Shows starter patterns when creating a new page.'), 29782 label: (0,external_wp_i18n_namespaceObject.__)('Show starter patterns') 29783 })] 29784 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(PreferencesModalSection, { 29785 title: (0,external_wp_i18n_namespaceObject.__)('Document settings'), 29786 description: (0,external_wp_i18n_namespaceObject.__)('Select what settings are shown in the document panel.'), 29787 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(enable_plugin_document_setting_panel.Slot, {}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_taxonomies, { 29788 taxonomyWrapper: (content, taxonomy) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(enable_panel, { 29789 label: taxonomy.labels.menu_name, 29790 panelName: `taxonomy-panel-$taxonomy.slug}` 29791 }) 29792 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_featured_image_check, { 29793 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(enable_panel, { 29794 label: (0,external_wp_i18n_namespaceObject.__)('Featured image'), 29795 panelName: "featured-image" 29796 }) 29797 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_excerpt_check, { 29798 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(enable_panel, { 29799 label: (0,external_wp_i18n_namespaceObject.__)('Excerpt'), 29800 panelName: "post-excerpt" 29801 }) 29802 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(post_type_support_check, { 29803 supportKeys: ['comments', 'trackbacks'], 29804 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(enable_panel, { 29805 label: (0,external_wp_i18n_namespaceObject.__)('Discussion'), 29806 panelName: "discussion-panel" 29807 }) 29808 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(page_attributes_check, { 29809 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(enable_panel, { 29810 label: (0,external_wp_i18n_namespaceObject.__)('Page attributes'), 29811 panelName: "page-attributes" 29812 }) 29813 })] 29814 }), isLargeViewport && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PreferencesModalSection, { 29815 title: (0,external_wp_i18n_namespaceObject.__)('Publishing'), 29816 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(enable_publish_sidebar, { 29817 help: (0,external_wp_i18n_namespaceObject.__)('Review settings, such as visibility and tags.'), 29818 label: (0,external_wp_i18n_namespaceObject.__)('Enable pre-publish checks') 29819 }) 29820 }), extraSections?.general] 29821 }) 29822 }, { 29823 name: 'appearance', 29824 tabLabel: (0,external_wp_i18n_namespaceObject.__)('Appearance'), 29825 content: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(PreferencesModalSection, { 29826 title: (0,external_wp_i18n_namespaceObject.__)('Appearance'), 29827 description: (0,external_wp_i18n_namespaceObject.__)('Customize the editor interface to suit your needs.'), 29828 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PreferenceToggleControl, { 29829 scope: "core", 29830 featureName: "fixedToolbar", 29831 onToggle: () => setPreference('core', 'distractionFree', false), 29832 help: (0,external_wp_i18n_namespaceObject.__)('Access all block and document tools in a single place.'), 29833 label: (0,external_wp_i18n_namespaceObject.__)('Top toolbar') 29834 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PreferenceToggleControl, { 29835 scope: "core", 29836 featureName: "distractionFree", 29837 onToggle: () => { 29838 setPreference('core', 'fixedToolbar', true); 29839 setIsInserterOpened(false); 29840 setIsListViewOpened(false); 29841 }, 29842 help: (0,external_wp_i18n_namespaceObject.__)('Reduce visual distractions by hiding the toolbar and other elements to focus on writing.'), 29843 label: (0,external_wp_i18n_namespaceObject.__)('Distraction free') 29844 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PreferenceToggleControl, { 29845 scope: "core", 29846 featureName: "focusMode", 29847 help: (0,external_wp_i18n_namespaceObject.__)('Highlights the current block and fades other content.'), 29848 label: (0,external_wp_i18n_namespaceObject.__)('Spotlight mode') 29849 }), extraSections?.appearance] 29850 }) 29851 }, { 29852 name: 'accessibility', 29853 tabLabel: (0,external_wp_i18n_namespaceObject.__)('Accessibility'), 29854 content: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 29855 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PreferencesModalSection, { 29856 title: (0,external_wp_i18n_namespaceObject.__)('Navigation'), 29857 description: (0,external_wp_i18n_namespaceObject.__)('Optimize the editing experience for enhanced control.'), 29858 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PreferenceToggleControl, { 29859 scope: "core", 29860 featureName: "keepCaretInsideBlock", 29861 help: (0,external_wp_i18n_namespaceObject.__)('Keeps the text cursor within the block boundaries, aiding users with screen readers by preventing unintentional cursor movement outside the block.'), 29862 label: (0,external_wp_i18n_namespaceObject.__)('Contain text cursor inside block') 29863 }) 29864 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PreferencesModalSection, { 29865 title: (0,external_wp_i18n_namespaceObject.__)('Interface'), 29866 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PreferenceToggleControl, { 29867 scope: "core", 29868 featureName: "showIconLabels", 29869 label: (0,external_wp_i18n_namespaceObject.__)('Show button text labels'), 29870 help: (0,external_wp_i18n_namespaceObject.__)('Show text instead of icons on buttons across the interface.') 29871 }) 29872 })] 29873 }) 29874 }, { 29875 name: 'blocks', 29876 tabLabel: (0,external_wp_i18n_namespaceObject.__)('Blocks'), 29877 content: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { 29878 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PreferencesModalSection, { 29879 title: (0,external_wp_i18n_namespaceObject.__)('Inserter'), 29880 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PreferenceToggleControl, { 29881 scope: "core", 29882 featureName: "mostUsedBlocks", 29883 help: (0,external_wp_i18n_namespaceObject.__)('Adds a category with the most frequently used blocks in the inserter.'), 29884 label: (0,external_wp_i18n_namespaceObject.__)('Show most used blocks') 29885 }) 29886 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PreferencesModalSection, { 29887 title: (0,external_wp_i18n_namespaceObject.__)('Manage block visibility'), 29888 description: (0,external_wp_i18n_namespaceObject.__)("Disable blocks that you don't want to appear in the inserter. They can always be toggled back on later."), 29889 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(BlockManager, {}) 29890 })] 29891 }) 29892 }, window.__experimentalMediaProcessing && { 29893 name: 'media', 29894 tabLabel: (0,external_wp_i18n_namespaceObject.__)('Media'), 29895 content: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_ReactJSXRuntime_namespaceObject.Fragment, { 29896 children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(PreferencesModalSection, { 29897 title: (0,external_wp_i18n_namespaceObject.__)('General'), 29898 description: (0,external_wp_i18n_namespaceObject.__)('Customize options related to the media upload flow.'), 29899 children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PreferenceToggleControl, { 29900 scope: "core/media", 29901 featureName: "optimizeOnUpload", 29902 help: (0,external_wp_i18n_namespaceObject.__)('Compress media items before uploading to the server.'), 29903 label: (0,external_wp_i18n_namespaceObject.__)('Pre-upload compression') 29904 }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PreferenceToggleControl, { 29905 scope: "core/media", 29906 featureName: "requireApproval", 29907 help: (0,external_wp_i18n_namespaceObject.__)('Require approval step when optimizing existing media.'), 29908 label: (0,external_wp_i18n_namespaceObject.__)('Approval step') 29909 })] 29910 }) 29911 }) 29912 }].filter(Boolean), [showBlockBreadcrumbsOption, extraSections, setIsInserterOpened, setIsListViewOpened, setPreference, isLargeViewport, hasStarterPatterns]); 29913 return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PreferencesModalTabs, { 29914 sections: sections 29915 }); 29916 } 29917 29918 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/bindings/pattern-overrides.js 29919 /** 29920 * WordPress dependencies 29921 */ 29922 29923 const CONTENT = 'content'; 29924 /* harmony default export */ const pattern_overrides = ({ 29925 name: 'core/pattern-overrides', 29926 getValues({ 29927 select, 29928 clientId, 29929 context, 29930 bindings 29931 }) { 29932 const patternOverridesContent = context['pattern/overrides']; 29933 const { 29934 getBlockAttributes 29935 } = select(external_wp_blockEditor_namespaceObject.store); 29936 const currentBlockAttributes = getBlockAttributes(clientId); 29937 const overridesValues = {}; 29938 for (const attributeName of Object.keys(bindings)) { 29939 const overridableValue = patternOverridesContent?.[currentBlockAttributes?.metadata?.name]?.[attributeName]; 29940 29941 // If it has not been overriden, return the original value. 29942 // Check undefined because empty string is a valid value. 29943 if (overridableValue === undefined) { 29944 overridesValues[attributeName] = currentBlockAttributes[attributeName]; 29945 continue; 29946 } else { 29947 overridesValues[attributeName] = overridableValue === '' ? undefined : overridableValue; 29948 } 29949 } 29950 return overridesValues; 29951 }, 29952 setValues({ 29953 select, 29954 dispatch, 29955 clientId, 29956 bindings 29957 }) { 29958 const { 29959 getBlockAttributes, 29960 getBlockParentsByBlockName, 29961 getBlocks 29962 } = select(external_wp_blockEditor_namespaceObject.store); 29963 const currentBlockAttributes = getBlockAttributes(clientId); 29964 const blockName = currentBlockAttributes?.metadata?.name; 29965 if (!blockName) { 29966 return; 29967 } 29968 const [patternClientId] = getBlockParentsByBlockName(clientId, 'core/block', true); 29969 29970 // Extract the updated attributes from the source bindings. 29971 const attributes = Object.entries(bindings).reduce((attrs, [key, { 29972 newValue 29973 }]) => { 29974 attrs[key] = newValue; 29975 return attrs; 29976 }, {}); 29977 29978 // If there is no pattern client ID, sync blocks with the same name and same attributes. 29979 if (!patternClientId) { 29980 const syncBlocksWithSameName = blocks => { 29981 for (const block of blocks) { 29982 if (block.attributes?.metadata?.name === blockName) { 29983 dispatch(external_wp_blockEditor_namespaceObject.store).updateBlockAttributes(block.clientId, attributes); 29984 } 29985 syncBlocksWithSameName(block.innerBlocks); 29986 } 29987 }; 29988 syncBlocksWithSameName(getBlocks()); 29989 return; 29990 } 29991 const currentBindingValue = getBlockAttributes(patternClientId)?.[CONTENT]; 29992 dispatch(external_wp_blockEditor_namespaceObject.store).updateBlockAttributes(patternClientId, { 29993 [CONTENT]: { 29994 ...currentBindingValue, 29995 [blockName]: { 29996 ...currentBindingValue?.[blockName], 29997 ...Object.entries(attributes).reduce((acc, [key, value]) => { 29998 // TODO: We need a way to represent `undefined` in the serialized overrides. 29999 // Also see: https://github.com/WordPress/gutenberg/pull/57249#discussion_r1452987871 30000 // We use an empty string to represent undefined for now until 30001 // we support a richer format for overrides and the block bindings API. 30002 acc[key] = value === undefined ? '' : value; 30003 return acc; 30004 }, {}) 30005 } 30006 } 30007 }); 30008 }, 30009 canUserEditValue: () => true 30010 }); 30011 30012 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/bindings/post-meta.js 30013 /** 30014 * WordPress dependencies 30015 */ 30016 30017 30018 /** 30019 * Internal dependencies 30020 */ 30021 30022 30023 30024 /** 30025 * Gets a list of post meta fields with their values and labels 30026 * to be consumed in the needed callbacks. 30027 * If the value is not available based on context, like in templates, 30028 * it falls back to the default value, label, or key. 30029 * 30030 * @param {Object} select The select function from the data store. 30031 * @param {Object} context The context provided. 30032 * @return {Object} List of post meta fields with their value and label. 30033 * 30034 * @example 30035 * ```js 30036 * { 30037 * field_1_key: { 30038 * label: 'Field 1 Label', 30039 * value: 'Field 1 Value', 30040 * }, 30041 * field_2_key: { 30042 * label: 'Field 2 Label', 30043 * value: 'Field 2 Value', 30044 * }, 30045 * ... 30046 * } 30047 * ``` 30048 */ 30049 function getPostMetaFields(select, context) { 30050 const { 30051 getEditedEntityRecord 30052 } = select(external_wp_coreData_namespaceObject.store); 30053 const { 30054 getRegisteredPostMeta 30055 } = unlock(select(external_wp_coreData_namespaceObject.store)); 30056 let entityMetaValues; 30057 // Try to get the current entity meta values. 30058 if (context?.postType && context?.postId) { 30059 entityMetaValues = getEditedEntityRecord('postType', context?.postType, context?.postId).meta; 30060 } 30061 const registeredFields = getRegisteredPostMeta(context?.postType); 30062 const metaFields = {}; 30063 Object.entries(registeredFields || {}).forEach(([key, props]) => { 30064 // Don't include footnotes or private fields. 30065 if (key !== 'footnotes' && key.charAt(0) !== '_') { 30066 var _entityMetaValues$key; 30067 metaFields[key] = { 30068 label: props.title || key, 30069 value: // When using the entity value, an empty string IS a valid value. 30070 (_entityMetaValues$key = entityMetaValues?.[key]) !== null && _entityMetaValues$key !== void 0 ? _entityMetaValues$key : 30071 // When using the default, an empty string IS NOT a valid value. 30072 props.default || undefined, 30073 type: props.type 30074 }; 30075 } 30076 }); 30077 if (!Object.keys(metaFields || {}).length) { 30078 return null; 30079 } 30080 return metaFields; 30081 } 30082 /* harmony default export */ const post_meta = ({ 30083 name: 'core/post-meta', 30084 getValues({ 30085 select, 30086 context, 30087 bindings 30088 }) { 30089 const metaFields = getPostMetaFields(select, context); 30090 const newValues = {}; 30091 for (const [attributeName, source] of Object.entries(bindings)) { 30092 var _ref; 30093 // Use the value, the field label, or the field key. 30094 const fieldKey = source.args.key; 30095 const { 30096 value: fieldValue, 30097 label: fieldLabel 30098 } = metaFields?.[fieldKey] || {}; 30099 newValues[attributeName] = (_ref = fieldValue !== null && fieldValue !== void 0 ? fieldValue : fieldLabel) !== null && _ref !== void 0 ? _ref : fieldKey; 30100 } 30101 return newValues; 30102 }, 30103 setValues({ 30104 dispatch, 30105 context, 30106 bindings 30107 }) { 30108 const newMeta = {}; 30109 Object.values(bindings).forEach(({ 30110 args, 30111 newValue 30112 }) => { 30113 newMeta[args.key] = newValue; 30114 }); 30115 dispatch(external_wp_coreData_namespaceObject.store).editEntityRecord('postType', context?.postType, context?.postId, { 30116 meta: newMeta 30117 }); 30118 }, 30119 canUserEditValue({ 30120 select, 30121 context, 30122 args 30123 }) { 30124 // Lock editing in query loop. 30125 if (context?.query || context?.queryId) { 30126 return false; 30127 } 30128 const postType = context?.postType || select(store_store).getCurrentPostType(); 30129 30130 // Check that editing is happening in the post editor and not a template. 30131 if (postType === 'wp_template') { 30132 return false; 30133 } 30134 const fieldValue = getPostMetaFields(select, context)?.[args.key]?.value; 30135 // Empty string or `false` could be a valid value, so we need to check if the field value is undefined. 30136 if (fieldValue === undefined) { 30137 return false; 30138 } 30139 // Check that custom fields metabox is not enabled. 30140 const areCustomFieldsEnabled = select(store_store).getEditorSettings().enableCustomFields; 30141 if (areCustomFieldsEnabled) { 30142 return false; 30143 } 30144 30145 // Check that the user has the capability to edit post meta. 30146 const canUserEdit = select(external_wp_coreData_namespaceObject.store).canUser('update', { 30147 kind: 'postType', 30148 name: context?.postType, 30149 id: context?.postId 30150 }); 30151 if (!canUserEdit) { 30152 return false; 30153 } 30154 return true; 30155 }, 30156 getFieldsList({ 30157 select, 30158 context 30159 }) { 30160 return getPostMetaFields(select, context); 30161 } 30162 }); 30163 30164 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/bindings/api.js 30165 /** 30166 * WordPress dependencies 30167 */ 30168 30169 30170 /** 30171 * Internal dependencies 30172 */ 30173 30174 30175 30176 /** 30177 * Function to register core block bindings sources provided by the editor. 30178 * 30179 * @example 30180 * ```js 30181 * import { registerCoreBlockBindingsSources } from '@wordpress/editor'; 30182 * 30183 * registerCoreBlockBindingsSources(); 30184 * ``` 30185 */ 30186 function registerCoreBlockBindingsSources() { 30187 (0,external_wp_blocks_namespaceObject.registerBlockBindingsSource)(pattern_overrides); 30188 (0,external_wp_blocks_namespaceObject.registerBlockBindingsSource)(post_meta); 30189 } 30190 30191 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/private-apis.js 30192 /** 30193 * WordPress dependencies 30194 */ 30195 30196 30197 /** 30198 * Internal dependencies 30199 */ 30200 30201 30202 30203 30204 30205 30206 30207 30208 30209 30210 30211 30212 30213 30214 30215 const { 30216 store: interfaceStore, 30217 ...remainingInterfaceApis 30218 } = build_module_namespaceObject; 30219 const privateApis = {}; 30220 lock(privateApis, { 30221 CreateTemplatePartModal: CreateTemplatePartModal, 30222 BackButton: back_button, 30223 EntitiesSavedStatesExtensible: EntitiesSavedStatesExtensible, 30224 Editor: editor, 30225 EditorContentSlotFill: content_slot_fill, 30226 GlobalStylesProvider: GlobalStylesProvider, 30227 mergeBaseAndUserConfigs: mergeBaseAndUserConfigs, 30228 PluginPostExcerpt: post_excerpt_plugin, 30229 PostCardPanel: PostCardPanel, 30230 PreferencesModal: EditorPreferencesModal, 30231 usePostActions: usePostActions, 30232 ToolsMoreMenuGroup: tools_more_menu_group, 30233 ViewMoreMenuGroup: view_more_menu_group, 30234 ResizableEditor: resizable_editor, 30235 registerCoreBlockBindingsSources: registerCoreBlockBindingsSources, 30236 // This is a temporary private API while we're updating the site editor to use EditorProvider. 30237 interfaceStore, 30238 ...remainingInterfaceApis 30239 }); 30240 30241 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/dataviews/api.js 30242 /** 30243 * WordPress dependencies 30244 */ 30245 30246 30247 /** 30248 * Internal dependencies 30249 */ 30250 30251 30252 30253 /** 30254 * @typedef {import('@wordpress/dataviews').Action} Action 30255 */ 30256 30257 /** 30258 * Registers a new DataViews action. 30259 * 30260 * This is an experimental API and is subject to change. 30261 * it's only available in the Gutenberg plugin for now. 30262 * 30263 * @param {string} kind Entity kind. 30264 * @param {string} name Entity name. 30265 * @param {Action} config Action configuration. 30266 */ 30267 30268 function api_registerEntityAction(kind, name, config) { 30269 const { 30270 registerEntityAction: _registerEntityAction 30271 } = unlock((0,external_wp_data_namespaceObject.dispatch)(store_store)); 30272 if (false) {} 30273 } 30274 30275 /** 30276 * Unregisters a DataViews action. 30277 * 30278 * This is an experimental API and is subject to change. 30279 * it's only available in the Gutenberg plugin for now. 30280 * 30281 * @param {string} kind Entity kind. 30282 * @param {string} name Entity name. 30283 * @param {string} actionId Action ID. 30284 */ 30285 function api_unregisterEntityAction(kind, name, actionId) { 30286 const { 30287 unregisterEntityAction: _unregisterEntityAction 30288 } = unlock((0,external_wp_data_namespaceObject.dispatch)(store_store)); 30289 if (false) {} 30290 } 30291 30292 ;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/index.js 30293 /** 30294 * Internal dependencies 30295 */ 30296 30297 30298 30299 30300 30301 30302 30303 /* 30304 * Backward compatibility 30305 */ 30306 30307 30308 })(); 30309 30310 (window.wp = window.wp || {}).editor = __webpack_exports__; 30311 /******/ })() 30312 ;
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated : Thu Nov 21 08:20:01 2024 | Cross-referenced by PHPXref |