[ Index ]

PHP Cross Reference of WordPress

title

Body

[close]

/wp-includes/js/dist/ -> block-editor.js (source)

   1  /******/ (function() { // webpackBootstrap
   2  /******/     var __webpack_modules__ = ({
   3  
   4  /***/ 6411:
   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  /***/ 4403:
 294  /***/ (function(module, exports) {
 295  
 296  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
 297    Copyright (c) 2018 Jed Watson.
 298    Licensed under the MIT License (MIT), see
 299    http://jedwatson.github.io/classnames
 300  */
 301  /* global define */
 302  
 303  (function () {
 304      'use strict';
 305  
 306      var hasOwn = {}.hasOwnProperty;
 307  
 308  	function classNames() {
 309          var classes = [];
 310  
 311          for (var i = 0; i < arguments.length; i++) {
 312              var arg = arguments[i];
 313              if (!arg) continue;
 314  
 315              var argType = typeof arg;
 316  
 317              if (argType === 'string' || argType === 'number') {
 318                  classes.push(arg);
 319              } else if (Array.isArray(arg)) {
 320                  if (arg.length) {
 321                      var inner = classNames.apply(null, arg);
 322                      if (inner) {
 323                          classes.push(inner);
 324                      }
 325                  }
 326              } else if (argType === 'object') {
 327                  if (arg.toString === Object.prototype.toString) {
 328                      for (var key in arg) {
 329                          if (hasOwn.call(arg, key) && arg[key]) {
 330                              classes.push(key);
 331                          }
 332                      }
 333                  } else {
 334                      classes.push(arg.toString());
 335                  }
 336              }
 337          }
 338  
 339          return classes.join(' ');
 340      }
 341  
 342      if ( true && module.exports) {
 343          classNames.default = classNames;
 344          module.exports = classNames;
 345      } else if (true) {
 346          // register as 'classnames', consistent with npm package name
 347          !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () {
 348              return classNames;
 349          }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
 350          __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
 351      } else {}
 352  }());
 353  
 354  
 355  /***/ }),
 356  
 357  /***/ 4827:
 358  /***/ (function(module) {
 359  
 360  // This code has been refactored for 140 bytes
 361  // You can see the original here: https://github.com/twolfson/computedStyle/blob/04cd1da2e30fa45844f95f5cb1ac898e9b9ef050/lib/computedStyle.js
 362  var computedStyle = function (el, prop, getComputedStyle) {
 363    getComputedStyle = window.getComputedStyle;
 364  
 365    // In one fell swoop
 366    return (
 367      // If we have getComputedStyle
 368      getComputedStyle ?
 369        // Query it
 370        // TODO: From CSS-Query notes, we might need (node, null) for FF
 371        getComputedStyle(el) :
 372  
 373      // Otherwise, we are in IE and use currentStyle
 374        el.currentStyle
 375    )[
 376      // Switch to camelCase for CSSOM
 377      // DEV: Grabbed from jQuery
 378      // https://github.com/jquery/jquery/blob/1.9-stable/src/css.js#L191-L194
 379      // https://github.com/jquery/jquery/blob/1.9-stable/src/core.js#L593-L597
 380      prop.replace(/-(\w)/gi, function (word, letter) {
 381        return letter.toUpperCase();
 382      })
 383    ];
 384  };
 385  
 386  module.exports = computedStyle;
 387  
 388  
 389  /***/ }),
 390  
 391  /***/ 1198:
 392  /***/ (function(__unused_webpack_module, exports) {
 393  
 394  "use strict";
 395  /*istanbul ignore start*/
 396  
 397  
 398  Object.defineProperty(exports, "__esModule", ({
 399    value: true
 400  }));
 401  exports["default"] = Diff;
 402  
 403  /*istanbul ignore end*/
 404  function Diff() {}
 405  
 406  Diff.prototype = {
 407    /*istanbul ignore start*/
 408  
 409    /*istanbul ignore end*/
 410    diff: function diff(oldString, newString) {
 411      /*istanbul ignore start*/
 412      var
 413      /*istanbul ignore end*/
 414      options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
 415      var callback = options.callback;
 416  
 417      if (typeof options === 'function') {
 418        callback = options;
 419        options = {};
 420      }
 421  
 422      this.options = options;
 423      var self = this;
 424  
 425      function done(value) {
 426        if (callback) {
 427          setTimeout(function () {
 428            callback(undefined, value);
 429          }, 0);
 430          return true;
 431        } else {
 432          return value;
 433        }
 434      } // Allow subclasses to massage the input prior to running
 435  
 436  
 437      oldString = this.castInput(oldString);
 438      newString = this.castInput(newString);
 439      oldString = this.removeEmpty(this.tokenize(oldString));
 440      newString = this.removeEmpty(this.tokenize(newString));
 441      var newLen = newString.length,
 442          oldLen = oldString.length;
 443      var editLength = 1;
 444      var maxEditLength = newLen + oldLen;
 445      var bestPath = [{
 446        newPos: -1,
 447        components: []
 448      }]; // Seed editLength = 0, i.e. the content starts with the same values
 449  
 450      var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0);
 451  
 452      if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) {
 453        // Identity per the equality and tokenizer
 454        return done([{
 455          value: this.join(newString),
 456          count: newString.length
 457        }]);
 458      } // Main worker method. checks all permutations of a given edit length for acceptance.
 459  
 460  
 461      function execEditLength() {
 462        for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) {
 463          var basePath =
 464          /*istanbul ignore start*/
 465          void 0
 466          /*istanbul ignore end*/
 467          ;
 468  
 469          var addPath = bestPath[diagonalPath - 1],
 470              removePath = bestPath[diagonalPath + 1],
 471              _oldPos = (removePath ? removePath.newPos : 0) - diagonalPath;
 472  
 473          if (addPath) {
 474            // No one else is going to attempt to use this value, clear it
 475            bestPath[diagonalPath - 1] = undefined;
 476          }
 477  
 478          var canAdd = addPath && addPath.newPos + 1 < newLen,
 479              canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen;
 480  
 481          if (!canAdd && !canRemove) {
 482            // If this path is a terminal then prune
 483            bestPath[diagonalPath] = undefined;
 484            continue;
 485          } // Select the diagonal that we want to branch from. We select the prior
 486          // path whose position in the new string is the farthest from the origin
 487          // and does not pass the bounds of the diff graph
 488  
 489  
 490          if (!canAdd || canRemove && addPath.newPos < removePath.newPos) {
 491            basePath = clonePath(removePath);
 492            self.pushComponent(basePath.components, undefined, true);
 493          } else {
 494            basePath = addPath; // No need to clone, we've pulled it from the list
 495  
 496            basePath.newPos++;
 497            self.pushComponent(basePath.components, true, undefined);
 498          }
 499  
 500          _oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); // If we have hit the end of both strings, then we are done
 501  
 502          if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) {
 503            return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken));
 504          } else {
 505            // Otherwise track this path as a potential candidate and continue.
 506            bestPath[diagonalPath] = basePath;
 507          }
 508        }
 509  
 510        editLength++;
 511      } // Performs the length of edit iteration. Is a bit fugly as this has to support the
 512      // sync and async mode which is never fun. Loops over execEditLength until a value
 513      // is produced.
 514  
 515  
 516      if (callback) {
 517        (function exec() {
 518          setTimeout(function () {
 519            // This should not happen, but we want to be safe.
 520  
 521            /* istanbul ignore next */
 522            if (editLength > maxEditLength) {
 523              return callback();
 524            }
 525  
 526            if (!execEditLength()) {
 527              exec();
 528            }
 529          }, 0);
 530        })();
 531      } else {
 532        while (editLength <= maxEditLength) {
 533          var ret = execEditLength();
 534  
 535          if (ret) {
 536            return ret;
 537          }
 538        }
 539      }
 540    },
 541  
 542    /*istanbul ignore start*/
 543  
 544    /*istanbul ignore end*/
 545    pushComponent: function pushComponent(components, added, removed) {
 546      var last = components[components.length - 1];
 547  
 548      if (last && last.added === added && last.removed === removed) {
 549        // We need to clone here as the component clone operation is just
 550        // as shallow array clone
 551        components[components.length - 1] = {
 552          count: last.count + 1,
 553          added: added,
 554          removed: removed
 555        };
 556      } else {
 557        components.push({
 558          count: 1,
 559          added: added,
 560          removed: removed
 561        });
 562      }
 563    },
 564  
 565    /*istanbul ignore start*/
 566  
 567    /*istanbul ignore end*/
 568    extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) {
 569      var newLen = newString.length,
 570          oldLen = oldString.length,
 571          newPos = basePath.newPos,
 572          oldPos = newPos - diagonalPath,
 573          commonCount = 0;
 574  
 575      while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) {
 576        newPos++;
 577        oldPos++;
 578        commonCount++;
 579      }
 580  
 581      if (commonCount) {
 582        basePath.components.push({
 583          count: commonCount
 584        });
 585      }
 586  
 587      basePath.newPos = newPos;
 588      return oldPos;
 589    },
 590  
 591    /*istanbul ignore start*/
 592  
 593    /*istanbul ignore end*/
 594    equals: function equals(left, right) {
 595      if (this.options.comparator) {
 596        return this.options.comparator(left, right);
 597      } else {
 598        return left === right || this.options.ignoreCase && left.toLowerCase() === right.toLowerCase();
 599      }
 600    },
 601  
 602    /*istanbul ignore start*/
 603  
 604    /*istanbul ignore end*/
 605    removeEmpty: function removeEmpty(array) {
 606      var ret = [];
 607  
 608      for (var i = 0; i < array.length; i++) {
 609        if (array[i]) {
 610          ret.push(array[i]);
 611        }
 612      }
 613  
 614      return ret;
 615    },
 616  
 617    /*istanbul ignore start*/
 618  
 619    /*istanbul ignore end*/
 620    castInput: function castInput(value) {
 621      return value;
 622    },
 623  
 624    /*istanbul ignore start*/
 625  
 626    /*istanbul ignore end*/
 627    tokenize: function tokenize(value) {
 628      return value.split('');
 629    },
 630  
 631    /*istanbul ignore start*/
 632  
 633    /*istanbul ignore end*/
 634    join: function join(chars) {
 635      return chars.join('');
 636    }
 637  };
 638  
 639  function buildValues(diff, components, newString, oldString, useLongestToken) {
 640    var componentPos = 0,
 641        componentLen = components.length,
 642        newPos = 0,
 643        oldPos = 0;
 644  
 645    for (; componentPos < componentLen; componentPos++) {
 646      var component = components[componentPos];
 647  
 648      if (!component.removed) {
 649        if (!component.added && useLongestToken) {
 650          var value = newString.slice(newPos, newPos + component.count);
 651          value = value.map(function (value, i) {
 652            var oldValue = oldString[oldPos + i];
 653            return oldValue.length > value.length ? oldValue : value;
 654          });
 655          component.value = diff.join(value);
 656        } else {
 657          component.value = diff.join(newString.slice(newPos, newPos + component.count));
 658        }
 659  
 660        newPos += component.count; // Common case
 661  
 662        if (!component.added) {
 663          oldPos += component.count;
 664        }
 665      } else {
 666        component.value = diff.join(oldString.slice(oldPos, oldPos + component.count));
 667        oldPos += component.count; // Reverse add and remove so removes are output first to match common convention
 668        // The diffing algorithm is tied to add then remove output and this is the simplest
 669        // route to get the desired output with minimal overhead.
 670  
 671        if (componentPos && components[componentPos - 1].added) {
 672          var tmp = components[componentPos - 1];
 673          components[componentPos - 1] = components[componentPos];
 674          components[componentPos] = tmp;
 675        }
 676      }
 677    } // Special case handle for when one terminal is ignored (i.e. whitespace).
 678    // For this case we merge the terminal into the prior string and drop the change.
 679    // This is only available for string mode.
 680  
 681  
 682    var lastComponent = components[componentLen - 1];
 683  
 684    if (componentLen > 1 && typeof lastComponent.value === 'string' && (lastComponent.added || lastComponent.removed) && diff.equals('', lastComponent.value)) {
 685      components[componentLen - 2].value += lastComponent.value;
 686      components.pop();
 687    }
 688  
 689    return components;
 690  }
 691  
 692  function clonePath(path) {
 693    return {
 694      newPos: path.newPos,
 695      components: path.components.slice(0)
 696    };
 697  }
 698  
 699  
 700  /***/ }),
 701  
 702  /***/ 1973:
 703  /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
 704  
 705  "use strict";
 706  var __webpack_unused_export__;
 707  /*istanbul ignore start*/
 708  
 709  
 710  __webpack_unused_export__ = ({
 711    value: true
 712  });
 713  exports.Kx = diffChars;
 714  __webpack_unused_export__ = void 0;
 715  
 716  /*istanbul ignore end*/
 717  var
 718  /*istanbul ignore start*/
 719  _base = _interopRequireDefault(__webpack_require__(1198))
 720  /*istanbul ignore end*/
 721  ;
 722  
 723  /*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 724  
 725  /*istanbul ignore end*/
 726  var characterDiff = new
 727  /*istanbul ignore start*/
 728  _base
 729  /*istanbul ignore end*/
 730  .
 731  /*istanbul ignore start*/
 732  default
 733  /*istanbul ignore end*/
 734  ();
 735  
 736  /*istanbul ignore start*/
 737  __webpack_unused_export__ = characterDiff;
 738  
 739  /*istanbul ignore end*/
 740  function diffChars(oldStr, newStr, options) {
 741    return characterDiff.diff(oldStr, newStr, options);
 742  }
 743  
 744  
 745  /***/ }),
 746  
 747  /***/ 1345:
 748  /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
 749  
 750  "use strict";
 751  
 752  
 753  var util = __webpack_require__(5022);
 754  
 755  function scrollIntoView(elem, container, config) {
 756    config = config || {};
 757    // document 归一化到 window
 758    if (container.nodeType === 9) {
 759      container = util.getWindow(container);
 760    }
 761  
 762    var allowHorizontalScroll = config.allowHorizontalScroll;
 763    var onlyScrollIfNeeded = config.onlyScrollIfNeeded;
 764    var alignWithTop = config.alignWithTop;
 765    var alignWithLeft = config.alignWithLeft;
 766    var offsetTop = config.offsetTop || 0;
 767    var offsetLeft = config.offsetLeft || 0;
 768    var offsetBottom = config.offsetBottom || 0;
 769    var offsetRight = config.offsetRight || 0;
 770  
 771    allowHorizontalScroll = allowHorizontalScroll === undefined ? true : allowHorizontalScroll;
 772  
 773    var isWin = util.isWindow(container);
 774    var elemOffset = util.offset(elem);
 775    var eh = util.outerHeight(elem);
 776    var ew = util.outerWidth(elem);
 777    var containerOffset = undefined;
 778    var ch = undefined;
 779    var cw = undefined;
 780    var containerScroll = undefined;
 781    var diffTop = undefined;
 782    var diffBottom = undefined;
 783    var win = undefined;
 784    var winScroll = undefined;
 785    var ww = undefined;
 786    var wh = undefined;
 787  
 788    if (isWin) {
 789      win = container;
 790      wh = util.height(win);
 791      ww = util.width(win);
 792      winScroll = {
 793        left: util.scrollLeft(win),
 794        top: util.scrollTop(win)
 795      };
 796      // elem 相对 container 可视视窗的距离
 797      diffTop = {
 798        left: elemOffset.left - winScroll.left - offsetLeft,
 799        top: elemOffset.top - winScroll.top - offsetTop
 800      };
 801      diffBottom = {
 802        left: elemOffset.left + ew - (winScroll.left + ww) + offsetRight,
 803        top: elemOffset.top + eh - (winScroll.top + wh) + offsetBottom
 804      };
 805      containerScroll = winScroll;
 806    } else {
 807      containerOffset = util.offset(container);
 808      ch = container.clientHeight;
 809      cw = container.clientWidth;
 810      containerScroll = {
 811        left: container.scrollLeft,
 812        top: container.scrollTop
 813      };
 814      // elem 相对 container 可视视窗的距离
 815      // 注意边框, offset 是边框到根节点
 816      diffTop = {
 817        left: elemOffset.left - (containerOffset.left + (parseFloat(util.css(container, 'borderLeftWidth')) || 0)) - offsetLeft,
 818        top: elemOffset.top - (containerOffset.top + (parseFloat(util.css(container, 'borderTopWidth')) || 0)) - offsetTop
 819      };
 820      diffBottom = {
 821        left: elemOffset.left + ew - (containerOffset.left + cw + (parseFloat(util.css(container, 'borderRightWidth')) || 0)) + offsetRight,
 822        top: elemOffset.top + eh - (containerOffset.top + ch + (parseFloat(util.css(container, 'borderBottomWidth')) || 0)) + offsetBottom
 823      };
 824    }
 825  
 826    if (diffTop.top < 0 || diffBottom.top > 0) {
 827      // 强制向上
 828      if (alignWithTop === true) {
 829        util.scrollTop(container, containerScroll.top + diffTop.top);
 830      } else if (alignWithTop === false) {
 831        util.scrollTop(container, containerScroll.top + diffBottom.top);
 832      } else {
 833        // 自动调整
 834        if (diffTop.top < 0) {
 835          util.scrollTop(container, containerScroll.top + diffTop.top);
 836        } else {
 837          util.scrollTop(container, containerScroll.top + diffBottom.top);
 838        }
 839      }
 840    } else {
 841      if (!onlyScrollIfNeeded) {
 842        alignWithTop = alignWithTop === undefined ? true : !!alignWithTop;
 843        if (alignWithTop) {
 844          util.scrollTop(container, containerScroll.top + diffTop.top);
 845        } else {
 846          util.scrollTop(container, containerScroll.top + diffBottom.top);
 847        }
 848      }
 849    }
 850  
 851    if (allowHorizontalScroll) {
 852      if (diffTop.left < 0 || diffBottom.left > 0) {
 853        // 强制向上
 854        if (alignWithLeft === true) {
 855          util.scrollLeft(container, containerScroll.left + diffTop.left);
 856        } else if (alignWithLeft === false) {
 857          util.scrollLeft(container, containerScroll.left + diffBottom.left);
 858        } else {
 859          // 自动调整
 860          if (diffTop.left < 0) {
 861            util.scrollLeft(container, containerScroll.left + diffTop.left);
 862          } else {
 863            util.scrollLeft(container, containerScroll.left + diffBottom.left);
 864          }
 865        }
 866      } else {
 867        if (!onlyScrollIfNeeded) {
 868          alignWithLeft = alignWithLeft === undefined ? true : !!alignWithLeft;
 869          if (alignWithLeft) {
 870            util.scrollLeft(container, containerScroll.left + diffTop.left);
 871          } else {
 872            util.scrollLeft(container, containerScroll.left + diffBottom.left);
 873          }
 874        }
 875      }
 876    }
 877  }
 878  
 879  module.exports = scrollIntoView;
 880  
 881  /***/ }),
 882  
 883  /***/ 5425:
 884  /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
 885  
 886  "use strict";
 887  
 888  
 889  module.exports = __webpack_require__(1345);
 890  
 891  /***/ }),
 892  
 893  /***/ 5022:
 894  /***/ (function(module) {
 895  
 896  "use strict";
 897  
 898  
 899  var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 900  
 901  var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; };
 902  
 903  var RE_NUM = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source;
 904  
 905  function getClientPosition(elem) {
 906    var box = undefined;
 907    var x = undefined;
 908    var y = undefined;
 909    var doc = elem.ownerDocument;
 910    var body = doc.body;
 911    var docElem = doc && doc.documentElement;
 912    // 根据 GBS 最新数据,A-Grade Browsers 都已支持 getBoundingClientRect 方法,不用再考虑传统的实现方式
 913    box = elem.getBoundingClientRect();
 914  
 915    // 注:jQuery 还考虑减去 docElem.clientLeft/clientTop
 916    // 但测试发现,这样反而会导致当 html 和 body 有边距/边框样式时,获取的值不正确
 917    // 此外,ie6 会忽略 html 的 margin 值,幸运地是没有谁会去设置 html 的 margin
 918  
 919    x = box.left;
 920    y = box.top;
 921  
 922    // In IE, most of the time, 2 extra pixels are added to the top and left
 923    // due to the implicit 2-pixel inset border.  In IE6/7 quirks mode and
 924    // IE6 standards mode, this border can be overridden by setting the
 925    // document element's border to zero -- thus, we cannot rely on the
 926    // offset always being 2 pixels.
 927  
 928    // In quirks mode, the offset can be determined by querying the body's
 929    // clientLeft/clientTop, but in standards mode, it is found by querying
 930    // the document element's clientLeft/clientTop.  Since we already called
 931    // getClientBoundingRect we have already forced a reflow, so it is not
 932    // too expensive just to query them all.
 933  
 934    // ie 下应该减去窗口的边框吧,毕竟默认 absolute 都是相对窗口定位的
 935    // 窗口边框标准是设 documentElement ,quirks 时设置 body
 936    // 最好禁止在 body 和 html 上边框 ,但 ie < 9 html 默认有 2px ,减去
 937    // 但是非 ie 不可能设置窗口边框,body html 也不是窗口 ,ie 可以通过 html,body 设置
 938    // 标准 ie 下 docElem.clientTop 就是 border-top
 939    // ie7 html 即窗口边框改变不了。永远为 2
 940    // 但标准 firefox/chrome/ie9 下 docElem.clientTop 是窗口边框,即使设了 border-top 也为 0
 941  
 942    x -= docElem.clientLeft || body.clientLeft || 0;
 943    y -= docElem.clientTop || body.clientTop || 0;
 944  
 945    return {
 946      left: x,
 947      top: y
 948    };
 949  }
 950  
 951  function getScroll(w, top) {
 952    var ret = w['page' + (top ? 'Y' : 'X') + 'Offset'];
 953    var method = 'scroll' + (top ? 'Top' : 'Left');
 954    if (typeof ret !== 'number') {
 955      var d = w.document;
 956      // ie6,7,8 standard mode
 957      ret = d.documentElement[method];
 958      if (typeof ret !== 'number') {
 959        // quirks mode
 960        ret = d.body[method];
 961      }
 962    }
 963    return ret;
 964  }
 965  
 966  function getScrollLeft(w) {
 967    return getScroll(w);
 968  }
 969  
 970  function getScrollTop(w) {
 971    return getScroll(w, true);
 972  }
 973  
 974  function getOffset(el) {
 975    var pos = getClientPosition(el);
 976    var doc = el.ownerDocument;
 977    var w = doc.defaultView || doc.parentWindow;
 978    pos.left += getScrollLeft(w);
 979    pos.top += getScrollTop(w);
 980    return pos;
 981  }
 982  function _getComputedStyle(elem, name, computedStyle_) {
 983    var val = '';
 984    var d = elem.ownerDocument;
 985    var computedStyle = computedStyle_ || d.defaultView.getComputedStyle(elem, null);
 986  
 987    // https://github.com/kissyteam/kissy/issues/61
 988    if (computedStyle) {
 989      val = computedStyle.getPropertyValue(name) || computedStyle[name];
 990    }
 991  
 992    return val;
 993  }
 994  
 995  var _RE_NUM_NO_PX = new RegExp('^(' + RE_NUM + ')(?!px)[a-z%]+$', 'i');
 996  var RE_POS = /^(top|right|bottom|left)$/;
 997  var CURRENT_STYLE = 'currentStyle';
 998  var RUNTIME_STYLE = 'runtimeStyle';
 999  var LEFT = 'left';
1000  var PX = 'px';
1001  
1002  function _getComputedStyleIE(elem, name) {
1003    // currentStyle maybe null
1004    // http://msdn.microsoft.com/en-us/library/ms535231.aspx
1005    var ret = elem[CURRENT_STYLE] && elem[CURRENT_STYLE][name];
1006  
1007    // 当 width/height 设置为百分比时,通过 pixelLeft 方式转换的 width/height 值
1008    // 一开始就处理了! CUSTOM_STYLE.height,CUSTOM_STYLE.width ,cssHook 解决@2011-08-19
1009    // 在 ie 下不对,需要直接用 offset 方式
1010    // borderWidth 等值也有问题,但考虑到 borderWidth 设为百分比的概率很小,这里就不考虑了
1011  
1012    // From the awesome hack by Dean Edwards
1013    // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
1014    // If we're not dealing with a regular pixel number
1015    // but a number that has a weird ending, we need to convert it to pixels
1016    // exclude left right for relativity
1017    if (_RE_NUM_NO_PX.test(ret) && !RE_POS.test(name)) {
1018      // Remember the original values
1019      var style = elem.style;
1020      var left = style[LEFT];
1021      var rsLeft = elem[RUNTIME_STYLE][LEFT];
1022  
1023      // prevent flashing of content
1024      elem[RUNTIME_STYLE][LEFT] = elem[CURRENT_STYLE][LEFT];
1025  
1026      // Put in the new values to get a computed value out
1027      style[LEFT] = name === 'fontSize' ? '1em' : ret || 0;
1028      ret = style.pixelLeft + PX;
1029  
1030      // Revert the changed values
1031      style[LEFT] = left;
1032  
1033      elem[RUNTIME_STYLE][LEFT] = rsLeft;
1034    }
1035    return ret === '' ? 'auto' : ret;
1036  }
1037  
1038  var getComputedStyleX = undefined;
1039  if (typeof window !== 'undefined') {
1040    getComputedStyleX = window.getComputedStyle ? _getComputedStyle : _getComputedStyleIE;
1041  }
1042  
1043  function each(arr, fn) {
1044    for (var i = 0; i < arr.length; i++) {
1045      fn(arr[i]);
1046    }
1047  }
1048  
1049  function isBorderBoxFn(elem) {
1050    return getComputedStyleX(elem, 'boxSizing') === 'border-box';
1051  }
1052  
1053  var BOX_MODELS = ['margin', 'border', 'padding'];
1054  var CONTENT_INDEX = -1;
1055  var PADDING_INDEX = 2;
1056  var BORDER_INDEX = 1;
1057  var MARGIN_INDEX = 0;
1058  
1059  function swap(elem, options, callback) {
1060    var old = {};
1061    var style = elem.style;
1062    var name = undefined;
1063  
1064    // Remember the old values, and insert the new ones
1065    for (name in options) {
1066      if (options.hasOwnProperty(name)) {
1067        old[name] = style[name];
1068        style[name] = options[name];
1069      }
1070    }
1071  
1072    callback.call(elem);
1073  
1074    // Revert the old values
1075    for (name in options) {
1076      if (options.hasOwnProperty(name)) {
1077        style[name] = old[name];
1078      }
1079    }
1080  }
1081  
1082  function getPBMWidth(elem, props, which) {
1083    var value = 0;
1084    var prop = undefined;
1085    var j = undefined;
1086    var i = undefined;
1087    for (j = 0; j < props.length; j++) {
1088      prop = props[j];
1089      if (prop) {
1090        for (i = 0; i < which.length; i++) {
1091          var cssProp = undefined;
1092          if (prop === 'border') {
1093            cssProp = prop + which[i] + 'Width';
1094          } else {
1095            cssProp = prop + which[i];
1096          }
1097          value += parseFloat(getComputedStyleX(elem, cssProp)) || 0;
1098        }
1099      }
1100    }
1101    return value;
1102  }
1103  
1104  /**
1105   * A crude way of determining if an object is a window
1106   * @member util
1107   */
1108  function isWindow(obj) {
1109    // must use == for ie8
1110    /* eslint eqeqeq:0 */
1111    return obj != null && obj == obj.window;
1112  }
1113  
1114  var domUtils = {};
1115  
1116  each(['Width', 'Height'], function (name) {
1117    domUtils['doc' + name] = function (refWin) {
1118      var d = refWin.document;
1119      return Math.max(
1120      // firefox chrome documentElement.scrollHeight< body.scrollHeight
1121      // ie standard mode : documentElement.scrollHeight> body.scrollHeight
1122      d.documentElement['scroll' + name],
1123      // quirks : documentElement.scrollHeight 最大等于可视窗口多一点?
1124      d.body['scroll' + name], domUtils['viewport' + name](d));
1125    };
1126  
1127    domUtils['viewport' + name] = function (win) {
1128      // pc browser includes scrollbar in window.innerWidth
1129      var prop = 'client' + name;
1130      var doc = win.document;
1131      var body = doc.body;
1132      var documentElement = doc.documentElement;
1133      var documentElementProp = documentElement[prop];
1134      // 标准模式取 documentElement
1135      // backcompat 取 body
1136      return doc.compatMode === 'CSS1Compat' && documentElementProp || body && body[prop] || documentElementProp;
1137    };
1138  });
1139  
1140  /*
1141   得到元素的大小信息
1142   @param elem
1143   @param name
1144   @param {String} [extra]  'padding' : (css width) + padding
1145   'border' : (css width) + padding + border
1146   'margin' : (css width) + padding + border + margin
1147   */
1148  function getWH(elem, name, extra) {
1149    if (isWindow(elem)) {
1150      return name === 'width' ? domUtils.viewportWidth(elem) : domUtils.viewportHeight(elem);
1151    } else if (elem.nodeType === 9) {
1152      return name === 'width' ? domUtils.docWidth(elem) : domUtils.docHeight(elem);
1153    }
1154    var which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom'];
1155    var borderBoxValue = name === 'width' ? elem.offsetWidth : elem.offsetHeight;
1156    var computedStyle = getComputedStyleX(elem);
1157    var isBorderBox = isBorderBoxFn(elem, computedStyle);
1158    var cssBoxValue = 0;
1159    if (borderBoxValue == null || borderBoxValue <= 0) {
1160      borderBoxValue = undefined;
1161      // Fall back to computed then un computed css if necessary
1162      cssBoxValue = getComputedStyleX(elem, name);
1163      if (cssBoxValue == null || Number(cssBoxValue) < 0) {
1164        cssBoxValue = elem.style[name] || 0;
1165      }
1166      // Normalize '', auto, and prepare for extra
1167      cssBoxValue = parseFloat(cssBoxValue) || 0;
1168    }
1169    if (extra === undefined) {
1170      extra = isBorderBox ? BORDER_INDEX : CONTENT_INDEX;
1171    }
1172    var borderBoxValueOrIsBorderBox = borderBoxValue !== undefined || isBorderBox;
1173    var val = borderBoxValue || cssBoxValue;
1174    if (extra === CONTENT_INDEX) {
1175      if (borderBoxValueOrIsBorderBox) {
1176        return val - getPBMWidth(elem, ['border', 'padding'], which, computedStyle);
1177      }
1178      return cssBoxValue;
1179    }
1180    if (borderBoxValueOrIsBorderBox) {
1181      var padding = extra === PADDING_INDEX ? -getPBMWidth(elem, ['border'], which, computedStyle) : getPBMWidth(elem, ['margin'], which, computedStyle);
1182      return val + (extra === BORDER_INDEX ? 0 : padding);
1183    }
1184    return cssBoxValue + getPBMWidth(elem, BOX_MODELS.slice(extra), which, computedStyle);
1185  }
1186  
1187  var cssShow = {
1188    position: 'absolute',
1189    visibility: 'hidden',
1190    display: 'block'
1191  };
1192  
1193  // fix #119 : https://github.com/kissyteam/kissy/issues/119
1194  function getWHIgnoreDisplay(elem) {
1195    var val = undefined;
1196    var args = arguments;
1197    // in case elem is window
1198    // elem.offsetWidth === undefined
1199    if (elem.offsetWidth !== 0) {
1200      val = getWH.apply(undefined, args);
1201    } else {
1202      swap(elem, cssShow, function () {
1203        val = getWH.apply(undefined, args);
1204      });
1205    }
1206    return val;
1207  }
1208  
1209  function css(el, name, v) {
1210    var value = v;
1211    if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object') {
1212      for (var i in name) {
1213        if (name.hasOwnProperty(i)) {
1214          css(el, i, name[i]);
1215        }
1216      }
1217      return undefined;
1218    }
1219    if (typeof value !== 'undefined') {
1220      if (typeof value === 'number') {
1221        value += 'px';
1222      }
1223      el.style[name] = value;
1224      return undefined;
1225    }
1226    return getComputedStyleX(el, name);
1227  }
1228  
1229  each(['width', 'height'], function (name) {
1230    var first = name.charAt(0).toUpperCase() + name.slice(1);
1231    domUtils['outer' + first] = function (el, includeMargin) {
1232      return el && getWHIgnoreDisplay(el, name, includeMargin ? MARGIN_INDEX : BORDER_INDEX);
1233    };
1234    var which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom'];
1235  
1236    domUtils[name] = function (elem, val) {
1237      if (val !== undefined) {
1238        if (elem) {
1239          var computedStyle = getComputedStyleX(elem);
1240          var isBorderBox = isBorderBoxFn(elem);
1241          if (isBorderBox) {
1242            val += getPBMWidth(elem, ['padding', 'border'], which, computedStyle);
1243          }
1244          return css(elem, name, val);
1245        }
1246        return undefined;
1247      }
1248      return elem && getWHIgnoreDisplay(elem, name, CONTENT_INDEX);
1249    };
1250  });
1251  
1252  // 设置 elem 相对 elem.ownerDocument 的坐标
1253  function setOffset(elem, offset) {
1254    // set position first, in-case top/left are set even on static elem
1255    if (css(elem, 'position') === 'static') {
1256      elem.style.position = 'relative';
1257    }
1258  
1259    var old = getOffset(elem);
1260    var ret = {};
1261    var current = undefined;
1262    var key = undefined;
1263  
1264    for (key in offset) {
1265      if (offset.hasOwnProperty(key)) {
1266        current = parseFloat(css(elem, key)) || 0;
1267        ret[key] = current + offset[key] - old[key];
1268      }
1269    }
1270    css(elem, ret);
1271  }
1272  
1273  module.exports = _extends({
1274    getWindow: function getWindow(node) {
1275      var doc = node.ownerDocument || node;
1276      return doc.defaultView || doc.parentWindow;
1277    },
1278    offset: function offset(el, value) {
1279      if (typeof value !== 'undefined') {
1280        setOffset(el, value);
1281      } else {
1282        return getOffset(el);
1283      }
1284    },
1285  
1286    isWindow: isWindow,
1287    each: each,
1288    css: css,
1289    clone: function clone(obj) {
1290      var ret = {};
1291      for (var i in obj) {
1292        if (obj.hasOwnProperty(i)) {
1293          ret[i] = obj[i];
1294        }
1295      }
1296      var overflow = obj.overflow;
1297      if (overflow) {
1298        for (var i in obj) {
1299          if (obj.hasOwnProperty(i)) {
1300            ret.overflow[i] = obj.overflow[i];
1301          }
1302        }
1303      }
1304      return ret;
1305    },
1306    scrollLeft: function scrollLeft(w, v) {
1307      if (isWindow(w)) {
1308        if (v === undefined) {
1309          return getScrollLeft(w);
1310        }
1311        window.scrollTo(v, getScrollTop(w));
1312      } else {
1313        if (v === undefined) {
1314          return w.scrollLeft;
1315        }
1316        w.scrollLeft = v;
1317      }
1318    },
1319    scrollTop: function scrollTop(w, v) {
1320      if (isWindow(w)) {
1321        if (v === undefined) {
1322          return getScrollTop(w);
1323        }
1324        window.scrollTo(getScrollLeft(w), v);
1325      } else {
1326        if (v === undefined) {
1327          return w.scrollTop;
1328        }
1329        w.scrollTop = v;
1330      }
1331    },
1332  
1333    viewportWidth: 0,
1334    viewportHeight: 0
1335  }, domUtils);
1336  
1337  /***/ }),
1338  
1339  /***/ 8575:
1340  /***/ (function(module) {
1341  
1342  if (typeof Object.create === 'function') {
1343    // implementation from standard node.js 'util' module
1344    module.exports = function inherits(ctor, superCtor) {
1345      if (superCtor) {
1346        ctor.super_ = superCtor
1347        ctor.prototype = Object.create(superCtor.prototype, {
1348          constructor: {
1349            value: ctor,
1350            enumerable: false,
1351            writable: true,
1352            configurable: true
1353          }
1354        })
1355      }
1356    };
1357  } else {
1358    // old school shim for old browsers
1359    module.exports = function inherits(ctor, superCtor) {
1360      if (superCtor) {
1361        ctor.super_ = superCtor
1362        var TempCtor = function () {}
1363        TempCtor.prototype = superCtor.prototype
1364        ctor.prototype = new TempCtor()
1365        ctor.prototype.constructor = ctor
1366      }
1367    }
1368  }
1369  
1370  
1371  /***/ }),
1372  
1373  /***/ 9894:
1374  /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
1375  
1376  // Load in dependencies
1377  var computedStyle = __webpack_require__(4827);
1378  
1379  /**
1380   * Calculate the `line-height` of a given node
1381   * @param {HTMLElement} node Element to calculate line height of. Must be in the DOM.
1382   * @returns {Number} `line-height` of the element in pixels
1383   */
1384  function lineHeight(node) {
1385    // Grab the line-height via style
1386    var lnHeightStr = computedStyle(node, 'line-height');
1387    var lnHeight = parseFloat(lnHeightStr, 10);
1388  
1389    // If the lineHeight did not contain a unit (i.e. it was numeric), convert it to ems (e.g. '2.3' === '2.3em')
1390    if (lnHeightStr === lnHeight + '') {
1391      // Save the old lineHeight style and update the em unit to the element
1392      var _lnHeightStyle = node.style.lineHeight;
1393      node.style.lineHeight = lnHeightStr + 'em';
1394  
1395      // Calculate the em based height
1396      lnHeightStr = computedStyle(node, 'line-height');
1397      lnHeight = parseFloat(lnHeightStr, 10);
1398  
1399      // Revert the lineHeight style
1400      if (_lnHeightStyle) {
1401        node.style.lineHeight = _lnHeightStyle;
1402      } else {
1403        delete node.style.lineHeight;
1404      }
1405    }
1406  
1407    // If the lineHeight is in `pt`, convert it to pixels (4px for 3pt)
1408    // DEV: `em` units are converted to `pt` in IE6
1409    // Conversion ratio from https://developer.mozilla.org/en-US/docs/Web/CSS/length
1410    if (lnHeightStr.indexOf('pt') !== -1) {
1411      lnHeight *= 4;
1412      lnHeight /= 3;
1413    // Otherwise, if the lineHeight is in `mm`, convert it to pixels (96px for 25.4mm)
1414    } else if (lnHeightStr.indexOf('mm') !== -1) {
1415      lnHeight *= 96;
1416      lnHeight /= 25.4;
1417    // Otherwise, if the lineHeight is in `cm`, convert it to pixels (96px for 2.54cm)
1418    } else if (lnHeightStr.indexOf('cm') !== -1) {
1419      lnHeight *= 96;
1420      lnHeight /= 2.54;
1421    // Otherwise, if the lineHeight is in `in`, convert it to pixels (96px for 1in)
1422    } else if (lnHeightStr.indexOf('in') !== -1) {
1423      lnHeight *= 96;
1424    // Otherwise, if the lineHeight is in `pc`, convert it to pixels (12pt for 1pc)
1425    } else if (lnHeightStr.indexOf('pc') !== -1) {
1426      lnHeight *= 16;
1427    }
1428  
1429    // Continue our computation
1430    lnHeight = Math.round(lnHeight);
1431  
1432    // If the line-height is "normal", calculate by font-size
1433    if (lnHeightStr === 'normal') {
1434      // Create a temporary node
1435      var nodeName = node.nodeName;
1436      var _node = document.createElement(nodeName);
1437      _node.innerHTML = '&nbsp;';
1438  
1439      // If we have a text area, reset it to only 1 row
1440      // https://github.com/twolfson/line-height/issues/4
1441      if (nodeName.toUpperCase() === 'TEXTAREA') {
1442        _node.setAttribute('rows', '1');
1443      }
1444  
1445      // Set the font-size of the element
1446      var fontSizeStr = computedStyle(node, 'font-size');
1447      _node.style.fontSize = fontSizeStr;
1448  
1449      // Remove default padding/border which can affect offset height
1450      // https://github.com/twolfson/line-height/issues/4
1451      // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetHeight
1452      _node.style.padding = '0px';
1453      _node.style.border = '0px';
1454  
1455      // Append it to the body
1456      var body = document.body;
1457      body.appendChild(_node);
1458  
1459      // Assume the line height of the element is the height
1460      var height = _node.offsetHeight;
1461      lnHeight = height;
1462  
1463      // Remove our child from the DOM
1464      body.removeChild(_node);
1465    }
1466  
1467    // Return the calculated height
1468    return lnHeight;
1469  }
1470  
1471  // Export lineHeight
1472  module.exports = lineHeight;
1473  
1474  
1475  /***/ }),
1476  
1477  /***/ 7970:
1478  /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
1479  
1480  module.exports = __webpack_require__(195);
1481  
1482  
1483  /***/ }),
1484  
1485  /***/ 3110:
1486  /***/ (function(module) {
1487  
1488  "use strict";
1489  /**
1490   * Copyright (c) 2015, Facebook, Inc.
1491   * All rights reserved.
1492   *
1493   * This source code is licensed under the BSD-style license found in the
1494   * LICENSE file in the root directory of this source tree. An additional grant
1495   * of patent rights can be found in the PATENTS file in the same directory.
1496   *
1497   * @providesModule ExecutionEnvironment
1498   */
1499  
1500  /*jslint evil: true */
1501  
1502  
1503  
1504  var canUseDOM = !!(
1505    typeof window !== 'undefined' &&
1506    window.document &&
1507    window.document.createElement
1508  );
1509  
1510  /**
1511   * Simple, lightweight module assisting with the detection and context of
1512   * Worker. Helps avoid circular dependencies and allows code to reason about
1513   * whether or not they are in a Worker, even if they never include the main
1514   * `ReactWorker` dependency.
1515   */
1516  var ExecutionEnvironment = {
1517  
1518    canUseDOM: canUseDOM,
1519  
1520    canUseWorkers: typeof Worker !== 'undefined',
1521  
1522    canUseEventListeners:
1523      canUseDOM && !!(window.addEventListener || window.attachEvent),
1524  
1525    canUseViewport: canUseDOM && !!window.screen,
1526  
1527    isInWorker: !canUseDOM // For now, this is true - might change in the future.
1528  
1529  };
1530  
1531  module.exports = ExecutionEnvironment;
1532  
1533  
1534  /***/ }),
1535  
1536  /***/ 3812:
1537  /***/ (function(module) {
1538  
1539  /**
1540   * Copyright 2004-present Facebook. All Rights Reserved.
1541   *
1542   * @providesModule UserAgent_DEPRECATED
1543   */
1544  
1545  /**
1546   *  Provides entirely client-side User Agent and OS detection. You should prefer
1547   *  the non-deprecated UserAgent module when possible, which exposes our
1548   *  authoritative server-side PHP-based detection to the client.
1549   *
1550   *  Usage is straightforward:
1551   *
1552   *    if (UserAgent_DEPRECATED.ie()) {
1553   *      //  IE
1554   *    }
1555   *
1556   *  You can also do version checks:
1557   *
1558   *    if (UserAgent_DEPRECATED.ie() >= 7) {
1559   *      //  IE7 or better
1560   *    }
1561   *
1562   *  The browser functions will return NaN if the browser does not match, so
1563   *  you can also do version compares the other way:
1564   *
1565   *    if (UserAgent_DEPRECATED.ie() < 7) {
1566   *      //  IE6 or worse
1567   *    }
1568   *
1569   *  Note that the version is a float and may include a minor version number,
1570   *  so you should always use range operators to perform comparisons, not
1571   *  strict equality.
1572   *
1573   *  **Note:** You should **strongly** prefer capability detection to browser
1574   *  version detection where it's reasonable:
1575   *
1576   *    http://www.quirksmode.org/js/support.html
1577   *
1578   *  Further, we have a large number of mature wrapper functions and classes
1579   *  which abstract away many browser irregularities. Check the documentation,
1580   *  grep for things, or ask on javascript@lists.facebook.com before writing yet
1581   *  another copy of "event || window.event".
1582   *
1583   */
1584  
1585  var _populated = false;
1586  
1587  // Browsers
1588  var _ie, _firefox, _opera, _webkit, _chrome;
1589  
1590  // Actual IE browser for compatibility mode
1591  var _ie_real_version;
1592  
1593  // Platforms
1594  var _osx, _windows, _linux, _android;
1595  
1596  // Architectures
1597  var _win64;
1598  
1599  // Devices
1600  var _iphone, _ipad, _native;
1601  
1602  var _mobile;
1603  
1604  function _populate() {
1605    if (_populated) {
1606      return;
1607    }
1608  
1609    _populated = true;
1610  
1611    // To work around buggy JS libraries that can't handle multi-digit
1612    // version numbers, Opera 10's user agent string claims it's Opera
1613    // 9, then later includes a Version/X.Y field:
1614    //
1615    // Opera/9.80 (foo) Presto/2.2.15 Version/10.10
1616    var uas = navigator.userAgent;
1617    var agent = /(?:MSIE.(\d+\.\d+))|(?:(?:Firefox|GranParadiso|Iceweasel).(\d+\.\d+))|(?:Opera(?:.+Version.|.)(\d+\.\d+))|(?:AppleWebKit.(\d+(?:\.\d+)?))|(?:Trident\/\d+\.\d+.*rv:(\d+\.\d+))/.exec(uas);
1618    var os    = /(Mac OS X)|(Windows)|(Linux)/.exec(uas);
1619  
1620    _iphone = /\b(iPhone|iP[ao]d)/.exec(uas);
1621    _ipad = /\b(iP[ao]d)/.exec(uas);
1622    _android = /Android/i.exec(uas);
1623    _native = /FBAN\/\w+;/i.exec(uas);
1624    _mobile = /Mobile/i.exec(uas);
1625  
1626    // Note that the IE team blog would have you believe you should be checking
1627    // for 'Win64; x64'.  But MSDN then reveals that you can actually be coming
1628    // from either x64 or ia64;  so ultimately, you should just check for Win64
1629    // as in indicator of whether you're in 64-bit IE.  32-bit IE on 64-bit
1630    // Windows will send 'WOW64' instead.
1631    _win64 = !!(/Win64/.exec(uas));
1632  
1633    if (agent) {
1634      _ie = agent[1] ? parseFloat(agent[1]) : (
1635            agent[5] ? parseFloat(agent[5]) : NaN);
1636      // IE compatibility mode
1637      if (_ie && document && document.documentMode) {
1638        _ie = document.documentMode;
1639      }
1640      // grab the "true" ie version from the trident token if available
1641      var trident = /(?:Trident\/(\d+.\d+))/.exec(uas);
1642      _ie_real_version = trident ? parseFloat(trident[1]) + 4 : _ie;
1643  
1644      _firefox = agent[2] ? parseFloat(agent[2]) : NaN;
1645      _opera   = agent[3] ? parseFloat(agent[3]) : NaN;
1646      _webkit  = agent[4] ? parseFloat(agent[4]) : NaN;
1647      if (_webkit) {
1648        // We do not add the regexp to the above test, because it will always
1649        // match 'safari' only since 'AppleWebKit' appears before 'Chrome' in
1650        // the userAgent string.
1651        agent = /(?:Chrome\/(\d+\.\d+))/.exec(uas);
1652        _chrome = agent && agent[1] ? parseFloat(agent[1]) : NaN;
1653      } else {
1654        _chrome = NaN;
1655      }
1656    } else {
1657      _ie = _firefox = _opera = _chrome = _webkit = NaN;
1658    }
1659  
1660    if (os) {
1661      if (os[1]) {
1662        // Detect OS X version.  If no version number matches, set _osx to true.
1663        // Version examples:  10, 10_6_1, 10.7
1664        // Parses version number as a float, taking only first two sets of
1665        // digits.  If only one set of digits is found, returns just the major
1666        // version number.
1667        var ver = /(?:Mac OS X (\d+(?:[._]\d+)?))/.exec(uas);
1668  
1669        _osx = ver ? parseFloat(ver[1].replace('_', '.')) : true;
1670      } else {
1671        _osx = false;
1672      }
1673      _windows = !!os[2];
1674      _linux   = !!os[3];
1675    } else {
1676      _osx = _windows = _linux = false;
1677    }
1678  }
1679  
1680  var UserAgent_DEPRECATED = {
1681  
1682    /**
1683     *  Check if the UA is Internet Explorer.
1684     *
1685     *
1686     *  @return float|NaN Version number (if match) or NaN.
1687     */
1688    ie: function() {
1689      return _populate() || _ie;
1690    },
1691  
1692    /**
1693     * Check if we're in Internet Explorer compatibility mode.
1694     *
1695     * @return bool true if in compatibility mode, false if
1696     * not compatibility mode or not ie
1697     */
1698    ieCompatibilityMode: function() {
1699      return _populate() || (_ie_real_version > _ie);
1700    },
1701  
1702  
1703    /**
1704     * Whether the browser is 64-bit IE.  Really, this is kind of weak sauce;  we
1705     * only need this because Skype can't handle 64-bit IE yet.  We need to remove
1706     * this when we don't need it -- tracked by #601957.
1707     */
1708    ie64: function() {
1709      return UserAgent_DEPRECATED.ie() && _win64;
1710    },
1711  
1712    /**
1713     *  Check if the UA is Firefox.
1714     *
1715     *
1716     *  @return float|NaN Version number (if match) or NaN.
1717     */
1718    firefox: function() {
1719      return _populate() || _firefox;
1720    },
1721  
1722  
1723    /**
1724     *  Check if the UA is Opera.
1725     *
1726     *
1727     *  @return float|NaN Version number (if match) or NaN.
1728     */
1729    opera: function() {
1730      return _populate() || _opera;
1731    },
1732  
1733  
1734    /**
1735     *  Check if the UA is WebKit.
1736     *
1737     *
1738     *  @return float|NaN Version number (if match) or NaN.
1739     */
1740    webkit: function() {
1741      return _populate() || _webkit;
1742    },
1743  
1744    /**
1745     *  For Push
1746     *  WILL BE REMOVED VERY SOON. Use UserAgent_DEPRECATED.webkit
1747     */
1748    safari: function() {
1749      return UserAgent_DEPRECATED.webkit();
1750    },
1751  
1752    /**
1753     *  Check if the UA is a Chrome browser.
1754     *
1755     *
1756     *  @return float|NaN Version number (if match) or NaN.
1757     */
1758    chrome : function() {
1759      return _populate() || _chrome;
1760    },
1761  
1762  
1763    /**
1764     *  Check if the user is running Windows.
1765     *
1766     *  @return bool `true' if the user's OS is Windows.
1767     */
1768    windows: function() {
1769      return _populate() || _windows;
1770    },
1771  
1772  
1773    /**
1774     *  Check if the user is running Mac OS X.
1775     *
1776     *  @return float|bool   Returns a float if a version number is detected,
1777     *                       otherwise true/false.
1778     */
1779    osx: function() {
1780      return _populate() || _osx;
1781    },
1782  
1783    /**
1784     * Check if the user is running Linux.
1785     *
1786     * @return bool `true' if the user's OS is some flavor of Linux.
1787     */
1788    linux: function() {
1789      return _populate() || _linux;
1790    },
1791  
1792    /**
1793     * Check if the user is running on an iPhone or iPod platform.
1794     *
1795     * @return bool `true' if the user is running some flavor of the
1796     *    iPhone OS.
1797     */
1798    iphone: function() {
1799      return _populate() || _iphone;
1800    },
1801  
1802    mobile: function() {
1803      return _populate() || (_iphone || _ipad || _android || _mobile);
1804    },
1805  
1806    nativeApp: function() {
1807      // webviews inside of the native apps
1808      return _populate() || _native;
1809    },
1810  
1811    android: function() {
1812      return _populate() || _android;
1813    },
1814  
1815    ipad: function() {
1816      return _populate() || _ipad;
1817    }
1818  };
1819  
1820  module.exports = UserAgent_DEPRECATED;
1821  
1822  
1823  /***/ }),
1824  
1825  /***/ 7939:
1826  /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
1827  
1828  "use strict";
1829  /**
1830   * Copyright 2013-2015, Facebook, Inc.
1831   * All rights reserved.
1832   *
1833   * This source code is licensed under the BSD-style license found in the
1834   * LICENSE file in the root directory of this source tree. An additional grant
1835   * of patent rights can be found in the PATENTS file in the same directory.
1836   *
1837   * @providesModule isEventSupported
1838   */
1839  
1840  
1841  
1842  var ExecutionEnvironment = __webpack_require__(3110);
1843  
1844  var useHasFeature;
1845  if (ExecutionEnvironment.canUseDOM) {
1846    useHasFeature =
1847      document.implementation &&
1848      document.implementation.hasFeature &&
1849      // always returns true in newer browsers as per the standard.
1850      // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature
1851      document.implementation.hasFeature('', '') !== true;
1852  }
1853  
1854  /**
1855   * Checks if an event is supported in the current execution environment.
1856   *
1857   * NOTE: This will not work correctly for non-generic events such as `change`,
1858   * `reset`, `load`, `error`, and `select`.
1859   *
1860   * Borrows from Modernizr.
1861   *
1862   * @param {string} eventNameSuffix Event name, e.g. "click".
1863   * @param {?boolean} capture Check if the capture phase is supported.
1864   * @return {boolean} True if the event is supported.
1865   * @internal
1866   * @license Modernizr 3.0.0pre (Custom Build) | MIT
1867   */
1868  function isEventSupported(eventNameSuffix, capture) {
1869    if (!ExecutionEnvironment.canUseDOM ||
1870        capture && !('addEventListener' in document)) {
1871      return false;
1872    }
1873  
1874    var eventName = 'on' + eventNameSuffix;
1875    var isSupported = eventName in document;
1876  
1877    if (!isSupported) {
1878      var element = document.createElement('div');
1879      element.setAttribute(eventName, 'return;');
1880      isSupported = typeof element[eventName] === 'function';
1881    }
1882  
1883    if (!isSupported && useHasFeature && eventNameSuffix === 'wheel') {
1884      // This is the only way to test support for the `wheel` event in IE9+.
1885      isSupported = document.implementation.hasFeature('Events.wheel', '3.0');
1886    }
1887  
1888    return isSupported;
1889  }
1890  
1891  module.exports = isEventSupported;
1892  
1893  
1894  /***/ }),
1895  
1896  /***/ 195:
1897  /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
1898  
1899  "use strict";
1900  /**
1901   * Copyright (c) 2015, Facebook, Inc.
1902   * All rights reserved.
1903   *
1904   * This source code is licensed under the BSD-style license found in the
1905   * LICENSE file in the root directory of this source tree. An additional grant
1906   * of patent rights can be found in the PATENTS file in the same directory.
1907   *
1908   * @providesModule normalizeWheel
1909   * @typechecks
1910   */
1911  
1912  
1913  
1914  var UserAgent_DEPRECATED = __webpack_require__(3812);
1915  
1916  var isEventSupported = __webpack_require__(7939);
1917  
1918  
1919  // Reasonable defaults
1920  var PIXEL_STEP  = 10;
1921  var LINE_HEIGHT = 40;
1922  var PAGE_HEIGHT = 800;
1923  
1924  /**
1925   * Mouse wheel (and 2-finger trackpad) support on the web sucks.  It is
1926   * complicated, thus this doc is long and (hopefully) detailed enough to answer
1927   * your questions.
1928   *
1929   * If you need to react to the mouse wheel in a predictable way, this code is
1930   * like your bestest friend. * hugs *
1931   *
1932   * As of today, there are 4 DOM event types you can listen to:
1933   *
1934   *   'wheel'                -- Chrome(31+), FF(17+), IE(9+)
1935   *   'mousewheel'           -- Chrome, IE(6+), Opera, Safari
1936   *   'MozMousePixelScroll'  -- FF(3.5 only!) (2010-2013) -- don't bother!
1937   *   'DOMMouseScroll'       -- FF(0.9.7+) since 2003
1938   *
1939   * So what to do?  The is the best:
1940   *
1941   *   normalizeWheel.getEventType();
1942   *
1943   * In your event callback, use this code to get sane interpretation of the
1944   * deltas.  This code will return an object with properties:
1945   *
1946   *   spinX   -- normalized spin speed (use for zoom) - x plane
1947   *   spinY   -- " - y plane
1948   *   pixelX  -- normalized distance (to pixels) - x plane
1949   *   pixelY  -- " - y plane
1950   *
1951   * Wheel values are provided by the browser assuming you are using the wheel to
1952   * scroll a web page by a number of lines or pixels (or pages).  Values can vary
1953   * significantly on different platforms and browsers, forgetting that you can
1954   * scroll at different speeds.  Some devices (like trackpads) emit more events
1955   * at smaller increments with fine granularity, and some emit massive jumps with
1956   * linear speed or acceleration.
1957   *
1958   * This code does its best to normalize the deltas for you:
1959   *
1960   *   - spin is trying to normalize how far the wheel was spun (or trackpad
1961   *     dragged).  This is super useful for zoom support where you want to
1962   *     throw away the chunky scroll steps on the PC and make those equal to
1963   *     the slow and smooth tiny steps on the Mac. Key data: This code tries to
1964   *     resolve a single slow step on a wheel to 1.
1965   *
1966   *   - pixel is normalizing the desired scroll delta in pixel units.  You'll
1967   *     get the crazy differences between browsers, but at least it'll be in
1968   *     pixels!
1969   *
1970   *   - positive value indicates scrolling DOWN/RIGHT, negative UP/LEFT.  This
1971   *     should translate to positive value zooming IN, negative zooming OUT.
1972   *     This matches the newer 'wheel' event.
1973   *
1974   * Why are there spinX, spinY (or pixels)?
1975   *
1976   *   - spinX is a 2-finger side drag on the trackpad, and a shift + wheel turn
1977   *     with a mouse.  It results in side-scrolling in the browser by default.
1978   *
1979   *   - spinY is what you expect -- it's the classic axis of a mouse wheel.
1980   *
1981   *   - I dropped spinZ/pixelZ.  It is supported by the DOM 3 'wheel' event and
1982   *     probably is by browsers in conjunction with fancy 3D controllers .. but
1983   *     you know.
1984   *
1985   * Implementation info:
1986   *
1987   * Examples of 'wheel' event if you scroll slowly (down) by one step with an
1988   * average mouse:
1989   *
1990   *   OS X + Chrome  (mouse)     -    4   pixel delta  (wheelDelta -120)
1991   *   OS X + Safari  (mouse)     -  N/A   pixel delta  (wheelDelta  -12)
1992   *   OS X + Firefox (mouse)     -    0.1 line  delta  (wheelDelta  N/A)
1993   *   Win8 + Chrome  (mouse)     -  100   pixel delta  (wheelDelta -120)
1994   *   Win8 + Firefox (mouse)     -    3   line  delta  (wheelDelta -120)
1995   *
1996   * On the trackpad:
1997   *
1998   *   OS X + Chrome  (trackpad)  -    2   pixel delta  (wheelDelta   -6)
1999   *   OS X + Firefox (trackpad)  -    1   pixel delta  (wheelDelta  N/A)
2000   *
2001   * On other/older browsers.. it's more complicated as there can be multiple and
2002   * also missing delta values.
2003   *
2004   * The 'wheel' event is more standard:
2005   *
2006   * http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
2007   *
2008   * The basics is that it includes a unit, deltaMode (pixels, lines, pages), and
2009   * deltaX, deltaY and deltaZ.  Some browsers provide other values to maintain
2010   * backward compatibility with older events.  Those other values help us
2011   * better normalize spin speed.  Example of what the browsers provide:
2012   *
2013   *                          | event.wheelDelta | event.detail
2014   *        ------------------+------------------+--------------
2015   *          Safari v5/OS X  |       -120       |       0
2016   *          Safari v5/Win7  |       -120       |       0
2017   *         Chrome v17/OS X  |       -120       |       0
2018   *         Chrome v17/Win7  |       -120       |       0
2019   *                IE9/Win7  |       -120       |   undefined
2020   *         Firefox v4/OS X  |     undefined    |       1
2021   *         Firefox v4/Win7  |     undefined    |       3
2022   *
2023   */
2024  function normalizeWheel(/*object*/ event) /*object*/ {
2025    var sX = 0, sY = 0,       // spinX, spinY
2026        pX = 0, pY = 0;       // pixelX, pixelY
2027  
2028    // Legacy
2029    if ('detail'      in event) { sY = event.detail; }
2030    if ('wheelDelta'  in event) { sY = -event.wheelDelta / 120; }
2031    if ('wheelDeltaY' in event) { sY = -event.wheelDeltaY / 120; }
2032    if ('wheelDeltaX' in event) { sX = -event.wheelDeltaX / 120; }
2033  
2034    // side scrolling on FF with DOMMouseScroll
2035    if ( 'axis' in event && event.axis === event.HORIZONTAL_AXIS ) {
2036      sX = sY;
2037      sY = 0;
2038    }
2039  
2040    pX = sX * PIXEL_STEP;
2041    pY = sY * PIXEL_STEP;
2042  
2043    if ('deltaY' in event) { pY = event.deltaY; }
2044    if ('deltaX' in event) { pX = event.deltaX; }
2045  
2046    if ((pX || pY) && event.deltaMode) {
2047      if (event.deltaMode == 1) {          // delta in LINE units
2048        pX *= LINE_HEIGHT;
2049        pY *= LINE_HEIGHT;
2050      } else {                             // delta in PAGE units
2051        pX *= PAGE_HEIGHT;
2052        pY *= PAGE_HEIGHT;
2053      }
2054    }
2055  
2056    // Fall-back if spin cannot be determined
2057    if (pX && !sX) { sX = (pX < 1) ? -1 : 1; }
2058    if (pY && !sY) { sY = (pY < 1) ? -1 : 1; }
2059  
2060    return { spinX  : sX,
2061             spinY  : sY,
2062             pixelX : pX,
2063             pixelY : pY };
2064  }
2065  
2066  
2067  /**
2068   * The best combination if you prefer spinX + spinY normalization.  It favors
2069   * the older DOMMouseScroll for Firefox, as FF does not include wheelDelta with
2070   * 'wheel' event, making spin speed determination impossible.
2071   */
2072  normalizeWheel.getEventType = function() /*string*/ {
2073    return (UserAgent_DEPRECATED.firefox())
2074             ? 'DOMMouseScroll'
2075             : (isEventSupported('wheel'))
2076                 ? 'wheel'
2077                 : 'mousewheel';
2078  };
2079  
2080  module.exports = normalizeWheel;
2081  
2082  
2083  /***/ }),
2084  
2085  /***/ 5372:
2086  /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2087  
2088  "use strict";
2089  /**
2090   * Copyright (c) 2013-present, Facebook, Inc.
2091   *
2092   * This source code is licensed under the MIT license found in the
2093   * LICENSE file in the root directory of this source tree.
2094   */
2095  
2096  
2097  
2098  var ReactPropTypesSecret = __webpack_require__(9567);
2099  
2100  function emptyFunction() {}
2101  function emptyFunctionWithReset() {}
2102  emptyFunctionWithReset.resetWarningCache = emptyFunction;
2103  
2104  module.exports = function() {
2105    function shim(props, propName, componentName, location, propFullName, secret) {
2106      if (secret === ReactPropTypesSecret) {
2107        // It is still safe when called from React.
2108        return;
2109      }
2110      var err = new Error(
2111        'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +
2112        'Use PropTypes.checkPropTypes() to call them. ' +
2113        'Read more at http://fb.me/use-check-prop-types'
2114      );
2115      err.name = 'Invariant Violation';
2116      throw err;
2117    };
2118    shim.isRequired = shim;
2119    function getShim() {
2120      return shim;
2121    };
2122    // Important!
2123    // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.
2124    var ReactPropTypes = {
2125      array: shim,
2126      bigint: shim,
2127      bool: shim,
2128      func: shim,
2129      number: shim,
2130      object: shim,
2131      string: shim,
2132      symbol: shim,
2133  
2134      any: shim,
2135      arrayOf: getShim,
2136      element: shim,
2137      elementType: shim,
2138      instanceOf: getShim,
2139      node: shim,
2140      objectOf: getShim,
2141      oneOf: getShim,
2142      oneOfType: getShim,
2143      shape: getShim,
2144      exact: getShim,
2145  
2146      checkPropTypes: emptyFunctionWithReset,
2147      resetWarningCache: emptyFunction
2148    };
2149  
2150    ReactPropTypes.PropTypes = ReactPropTypes;
2151  
2152    return ReactPropTypes;
2153  };
2154  
2155  
2156  /***/ }),
2157  
2158  /***/ 2652:
2159  /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2160  
2161  /**
2162   * Copyright (c) 2013-present, Facebook, Inc.
2163   *
2164   * This source code is licensed under the MIT license found in the
2165   * LICENSE file in the root directory of this source tree.
2166   */
2167  
2168  if (false) { var throwOnDirectAccess, ReactIs; } else {
2169    // By explicitly using `prop-types` you are opting into new production behavior.
2170    // http://fb.me/prop-types-in-prod
2171    module.exports = __webpack_require__(5372)();
2172  }
2173  
2174  
2175  /***/ }),
2176  
2177  /***/ 9567:
2178  /***/ (function(module) {
2179  
2180  "use strict";
2181  /**
2182   * Copyright (c) 2013-present, Facebook, Inc.
2183   *
2184   * This source code is licensed under the MIT license found in the
2185   * LICENSE file in the root directory of this source tree.
2186   */
2187  
2188  
2189  
2190  var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';
2191  
2192  module.exports = ReactPropTypesSecret;
2193  
2194  
2195  /***/ }),
2196  
2197  /***/ 5438:
2198  /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
2199  
2200  "use strict";
2201  
2202  var __extends = (this && this.__extends) || (function () {
2203      var extendStatics = Object.setPrototypeOf ||
2204          ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
2205          function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
2206      return function (d, b) {
2207          extendStatics(d, b);
2208          function __() { this.constructor = d; }
2209          d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
2210      };
2211  })();
2212  var __assign = (this && this.__assign) || Object.assign || function(t) {
2213      for (var s, i = 1, n = arguments.length; i < n; i++) {
2214          s = arguments[i];
2215          for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
2216              t[p] = s[p];
2217      }
2218      return t;
2219  };
2220  var __rest = (this && this.__rest) || function (s, e) {
2221      var t = {};
2222      for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
2223          t[p] = s[p];
2224      if (s != null && typeof Object.getOwnPropertySymbols === "function")
2225          for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)
2226              t[p[i]] = s[p[i]];
2227      return t;
2228  };
2229  exports.__esModule = true;
2230  var React = __webpack_require__(9196);
2231  var PropTypes = __webpack_require__(2652);
2232  var autosize = __webpack_require__(6411);
2233  var _getLineHeight = __webpack_require__(9894);
2234  var getLineHeight = _getLineHeight;
2235  var RESIZED = "autosize:resized";
2236  /**
2237   * A light replacement for built-in textarea component
2238   * which automaticaly adjusts its height to match the content
2239   */
2240  var TextareaAutosizeClass = /** @class */ (function (_super) {
2241      __extends(TextareaAutosizeClass, _super);
2242      function TextareaAutosizeClass() {
2243          var _this = _super !== null && _super.apply(this, arguments) || this;
2244          _this.state = {
2245              lineHeight: null
2246          };
2247          _this.textarea = null;
2248          _this.onResize = function (e) {
2249              if (_this.props.onResize) {
2250                  _this.props.onResize(e);
2251              }
2252          };
2253          _this.updateLineHeight = function () {
2254              if (_this.textarea) {
2255                  _this.setState({
2256                      lineHeight: getLineHeight(_this.textarea)
2257                  });
2258              }
2259          };
2260          _this.onChange = function (e) {
2261              var onChange = _this.props.onChange;
2262              _this.currentValue = e.currentTarget.value;
2263              onChange && onChange(e);
2264          };
2265          return _this;
2266      }
2267      TextareaAutosizeClass.prototype.componentDidMount = function () {
2268          var _this = this;
2269          var _a = this.props, maxRows = _a.maxRows, async = _a.async;
2270          if (typeof maxRows === "number") {
2271              this.updateLineHeight();
2272          }
2273          if (typeof maxRows === "number" || async) {
2274              /*
2275                the defer is needed to:
2276                  - force "autosize" to activate the scrollbar when this.props.maxRows is passed
2277                  - support StyledComponents (see #71)
2278              */
2279              setTimeout(function () { return _this.textarea && autosize(_this.textarea); });
2280          }
2281          else {
2282              this.textarea && autosize(this.textarea);
2283          }
2284          if (this.textarea) {
2285              this.textarea.addEventListener(RESIZED, this.onResize);
2286          }
2287      };
2288      TextareaAutosizeClass.prototype.componentWillUnmount = function () {
2289          if (this.textarea) {
2290              this.textarea.removeEventListener(RESIZED, this.onResize);
2291              autosize.destroy(this.textarea);
2292          }
2293      };
2294      TextareaAutosizeClass.prototype.render = function () {
2295          var _this = this;
2296          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;
2297          var maxHeight = maxRows && lineHeight ? lineHeight * maxRows : null;
2298          return (React.createElement("textarea", __assign({}, props, { onChange: this.onChange, style: maxHeight ? __assign({}, style, { maxHeight: maxHeight }) : style, ref: function (element) {
2299                  _this.textarea = element;
2300                  if (typeof _this.props.innerRef === 'function') {
2301                      _this.props.innerRef(element);
2302                  }
2303                  else if (_this.props.innerRef) {
2304                      _this.props.innerRef.current = element;
2305                  }
2306              } }), children));
2307      };
2308      TextareaAutosizeClass.prototype.componentDidUpdate = function () {
2309          this.textarea && autosize.update(this.textarea);
2310      };
2311      TextareaAutosizeClass.defaultProps = {
2312          rows: 1,
2313          async: false
2314      };
2315      TextareaAutosizeClass.propTypes = {
2316          rows: PropTypes.number,
2317          maxRows: PropTypes.number,
2318          onResize: PropTypes.func,
2319          innerRef: PropTypes.any,
2320          async: PropTypes.bool
2321      };
2322      return TextareaAutosizeClass;
2323  }(React.Component));
2324  exports.TextareaAutosize = React.forwardRef(function (props, ref) {
2325      return React.createElement(TextareaAutosizeClass, __assign({}, props, { innerRef: ref }));
2326  });
2327  
2328  
2329  /***/ }),
2330  
2331  /***/ 773:
2332  /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
2333  
2334  "use strict";
2335  var __webpack_unused_export__;
2336  
2337  __webpack_unused_export__ = true;
2338  var TextareaAutosize_1 = __webpack_require__(5438);
2339  exports.Z = TextareaAutosize_1.TextareaAutosize;
2340  
2341  
2342  /***/ }),
2343  
2344  /***/ 3124:
2345  /***/ (function(module) {
2346  
2347  var traverse = module.exports = function (obj) {
2348      return new Traverse(obj);
2349  };
2350  
2351  function Traverse (obj) {
2352      this.value = obj;
2353  }
2354  
2355  Traverse.prototype.get = function (ps) {
2356      var node = this.value;
2357      for (var i = 0; i < ps.length; i ++) {
2358          var key = ps[i];
2359          if (!node || !hasOwnProperty.call(node, key)) {
2360              node = undefined;
2361              break;
2362          }
2363          node = node[key];
2364      }
2365      return node;
2366  };
2367  
2368  Traverse.prototype.has = function (ps) {
2369      var node = this.value;
2370      for (var i = 0; i < ps.length; i ++) {
2371          var key = ps[i];
2372          if (!node || !hasOwnProperty.call(node, key)) {
2373              return false;
2374          }
2375          node = node[key];
2376      }
2377      return true;
2378  };
2379  
2380  Traverse.prototype.set = function (ps, value) {
2381      var node = this.value;
2382      for (var i = 0; i < ps.length - 1; i ++) {
2383          var key = ps[i];
2384          if (!hasOwnProperty.call(node, key)) node[key] = {};
2385          node = node[key];
2386      }
2387      node[ps[i]] = value;
2388      return value;
2389  };
2390  
2391  Traverse.prototype.map = function (cb) {
2392      return walk(this.value, cb, true);
2393  };
2394  
2395  Traverse.prototype.forEach = function (cb) {
2396      this.value = walk(this.value, cb, false);
2397      return this.value;
2398  };
2399  
2400  Traverse.prototype.reduce = function (cb, init) {
2401      var skip = arguments.length === 1;
2402      var acc = skip ? this.value : init;
2403      this.forEach(function (x) {
2404          if (!this.isRoot || !skip) {
2405              acc = cb.call(this, acc, x);
2406          }
2407      });
2408      return acc;
2409  };
2410  
2411  Traverse.prototype.paths = function () {
2412      var acc = [];
2413      this.forEach(function (x) {
2414          acc.push(this.path); 
2415      });
2416      return acc;
2417  };
2418  
2419  Traverse.prototype.nodes = function () {
2420      var acc = [];
2421      this.forEach(function (x) {
2422          acc.push(this.node);
2423      });
2424      return acc;
2425  };
2426  
2427  Traverse.prototype.clone = function () {
2428      var parents = [], nodes = [];
2429      
2430      return (function clone (src) {
2431          for (var i = 0; i < parents.length; i++) {
2432              if (parents[i] === src) {
2433                  return nodes[i];
2434              }
2435          }
2436          
2437          if (typeof src === 'object' && src !== null) {
2438              var dst = copy(src);
2439              
2440              parents.push(src);
2441              nodes.push(dst);
2442              
2443              forEach(objectKeys(src), function (key) {
2444                  dst[key] = clone(src[key]);
2445              });
2446              
2447              parents.pop();
2448              nodes.pop();
2449              return dst;
2450          }
2451          else {
2452              return src;
2453          }
2454      })(this.value);
2455  };
2456  
2457  function walk (root, cb, immutable) {
2458      var path = [];
2459      var parents = [];
2460      var alive = true;
2461      
2462      return (function walker (node_) {
2463          var node = immutable ? copy(node_) : node_;
2464          var modifiers = {};
2465          
2466          var keepGoing = true;
2467          
2468          var state = {
2469              node : node,
2470              node_ : node_,
2471              path : [].concat(path),
2472              parent : parents[parents.length - 1],
2473              parents : parents,
2474              key : path.slice(-1)[0],
2475              isRoot : path.length === 0,
2476              level : path.length,
2477              circular : null,
2478              update : function (x, stopHere) {
2479                  if (!state.isRoot) {
2480                      state.parent.node[state.key] = x;
2481                  }
2482                  state.node = x;
2483                  if (stopHere) keepGoing = false;
2484              },
2485              'delete' : function (stopHere) {
2486                  delete state.parent.node[state.key];
2487                  if (stopHere) keepGoing = false;
2488              },
2489              remove : function (stopHere) {
2490                  if (isArray(state.parent.node)) {
2491                      state.parent.node.splice(state.key, 1);
2492                  }
2493                  else {
2494                      delete state.parent.node[state.key];
2495                  }
2496                  if (stopHere) keepGoing = false;
2497              },
2498              keys : null,
2499              before : function (f) { modifiers.before = f },
2500              after : function (f) { modifiers.after = f },
2501              pre : function (f) { modifiers.pre = f },
2502              post : function (f) { modifiers.post = f },
2503              stop : function () { alive = false },
2504              block : function () { keepGoing = false }
2505          };
2506          
2507          if (!alive) return state;
2508          
2509          function updateState() {
2510              if (typeof state.node === 'object' && state.node !== null) {
2511                  if (!state.keys || state.node_ !== state.node) {
2512                      state.keys = objectKeys(state.node)
2513                  }
2514                  
2515                  state.isLeaf = state.keys.length == 0;
2516                  
2517                  for (var i = 0; i < parents.length; i++) {
2518                      if (parents[i].node_ === node_) {
2519                          state.circular = parents[i];
2520                          break;
2521                      }
2522                  }
2523              }
2524              else {
2525                  state.isLeaf = true;
2526                  state.keys = null;
2527              }
2528              
2529              state.notLeaf = !state.isLeaf;
2530              state.notRoot = !state.isRoot;
2531          }
2532          
2533          updateState();
2534          
2535          // use return values to update if defined
2536          var ret = cb.call(state, state.node);
2537          if (ret !== undefined && state.update) state.update(ret);
2538          
2539          if (modifiers.before) modifiers.before.call(state, state.node);
2540          
2541          if (!keepGoing) return state;
2542          
2543          if (typeof state.node == 'object'
2544          && state.node !== null && !state.circular) {
2545              parents.push(state);
2546              
2547              updateState();
2548              
2549              forEach(state.keys, function (key, i) {
2550                  path.push(key);
2551                  
2552                  if (modifiers.pre) modifiers.pre.call(state, state.node[key], key);
2553                  
2554                  var child = walker(state.node[key]);
2555                  if (immutable && hasOwnProperty.call(state.node, key)) {
2556                      state.node[key] = child.node;
2557                  }
2558                  
2559                  child.isLast = i == state.keys.length - 1;
2560                  child.isFirst = i == 0;
2561                  
2562                  if (modifiers.post) modifiers.post.call(state, child);
2563                  
2564                  path.pop();
2565              });
2566              parents.pop();
2567          }
2568          
2569          if (modifiers.after) modifiers.after.call(state, state.node);
2570          
2571          return state;
2572      })(root).node;
2573  }
2574  
2575  function copy (src) {
2576      if (typeof src === 'object' && src !== null) {
2577          var dst;
2578          
2579          if (isArray(src)) {
2580              dst = [];
2581          }
2582          else if (isDate(src)) {
2583              dst = new Date(src.getTime ? src.getTime() : src);
2584          }
2585          else if (isRegExp(src)) {
2586              dst = new RegExp(src);
2587          }
2588          else if (isError(src)) {
2589              dst = { message: src.message };
2590          }
2591          else if (isBoolean(src)) {
2592              dst = new Boolean(src);
2593          }
2594          else if (isNumber(src)) {
2595              dst = new Number(src);
2596          }
2597          else if (isString(src)) {
2598              dst = new String(src);
2599          }
2600          else if (Object.create && Object.getPrototypeOf) {
2601              dst = Object.create(Object.getPrototypeOf(src));
2602          }
2603          else if (src.constructor === Object) {
2604              dst = {};
2605          }
2606          else {
2607              var proto =
2608                  (src.constructor && src.constructor.prototype)
2609                  || src.__proto__
2610                  || {}
2611              ;
2612              var T = function () {};
2613              T.prototype = proto;
2614              dst = new T;
2615          }
2616          
2617          forEach(objectKeys(src), function (key) {
2618              dst[key] = src[key];
2619          });
2620          return dst;
2621      }
2622      else return src;
2623  }
2624  
2625  var objectKeys = Object.keys || function keys (obj) {
2626      var res = [];
2627      for (var key in obj) res.push(key)
2628      return res;
2629  };
2630  
2631  function toS (obj) { return Object.prototype.toString.call(obj) }
2632  function isDate (obj) { return toS(obj) === '[object Date]' }
2633  function isRegExp (obj) { return toS(obj) === '[object RegExp]' }
2634  function isError (obj) { return toS(obj) === '[object Error]' }
2635  function isBoolean (obj) { return toS(obj) === '[object Boolean]' }
2636  function isNumber (obj) { return toS(obj) === '[object Number]' }
2637  function isString (obj) { return toS(obj) === '[object String]' }
2638  
2639  var isArray = Array.isArray || function isArray (xs) {
2640      return Object.prototype.toString.call(xs) === '[object Array]';
2641  };
2642  
2643  var forEach = function (xs, fn) {
2644      if (xs.forEach) return xs.forEach(fn)
2645      else for (var i = 0; i < xs.length; i++) {
2646          fn(xs[i], i, xs);
2647      }
2648  };
2649  
2650  forEach(objectKeys(Traverse.prototype), function (key) {
2651      traverse[key] = function (obj) {
2652          var args = [].slice.call(arguments, 1);
2653          var t = new Traverse(obj);
2654          return t[key].apply(t, args);
2655      };
2656  });
2657  
2658  var hasOwnProperty = Object.hasOwnProperty || function (obj, key) {
2659      return key in obj;
2660  };
2661  
2662  
2663  /***/ }),
2664  
2665  /***/ 9196:
2666  /***/ (function(module) {
2667  
2668  "use strict";
2669  module.exports = window["React"];
2670  
2671  /***/ })
2672  
2673  /******/     });
2674  /************************************************************************/
2675  /******/     // The module cache
2676  /******/     var __webpack_module_cache__ = {};
2677  /******/     
2678  /******/     // The require function
2679  /******/ 	function __webpack_require__(moduleId) {
2680  /******/         // Check if module is in cache
2681  /******/         var cachedModule = __webpack_module_cache__[moduleId];
2682  /******/         if (cachedModule !== undefined) {
2683  /******/             return cachedModule.exports;
2684  /******/         }
2685  /******/         // Create a new module (and put it into the cache)
2686  /******/         var module = __webpack_module_cache__[moduleId] = {
2687  /******/             // no module.id needed
2688  /******/             // no module.loaded needed
2689  /******/             exports: {}
2690  /******/         };
2691  /******/     
2692  /******/         // Execute the module function
2693  /******/         __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
2694  /******/     
2695  /******/         // Return the exports of the module
2696  /******/         return module.exports;
2697  /******/     }
2698  /******/     
2699  /************************************************************************/
2700  /******/     /* webpack/runtime/compat get default export */
2701  /******/     !function() {
2702  /******/         // getDefaultExport function for compatibility with non-harmony modules
2703  /******/         __webpack_require__.n = function(module) {
2704  /******/             var getter = module && module.__esModule ?
2705  /******/                 function() { return module['default']; } :
2706  /******/                 function() { return module; };
2707  /******/             __webpack_require__.d(getter, { a: getter });
2708  /******/             return getter;
2709  /******/         };
2710  /******/     }();
2711  /******/     
2712  /******/     /* webpack/runtime/define property getters */
2713  /******/     !function() {
2714  /******/         // define getter functions for harmony exports
2715  /******/         __webpack_require__.d = function(exports, definition) {
2716  /******/             for(var key in definition) {
2717  /******/                 if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
2718  /******/                     Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
2719  /******/                 }
2720  /******/             }
2721  /******/         };
2722  /******/     }();
2723  /******/     
2724  /******/     /* webpack/runtime/hasOwnProperty shorthand */
2725  /******/     !function() {
2726  /******/         __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
2727  /******/     }();
2728  /******/     
2729  /******/     /* webpack/runtime/make namespace object */
2730  /******/     !function() {
2731  /******/         // define __esModule on exports
2732  /******/         __webpack_require__.r = function(exports) {
2733  /******/             if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
2734  /******/                 Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2735  /******/             }
2736  /******/             Object.defineProperty(exports, '__esModule', { value: true });
2737  /******/         };
2738  /******/     }();
2739  /******/     
2740  /************************************************************************/
2741  var __webpack_exports__ = {};
2742  // This entry need to be wrapped in an IIFE because it need to be in strict mode.
2743  !function() {
2744  "use strict";
2745  // ESM COMPAT FLAG
2746  __webpack_require__.r(__webpack_exports__);
2747  
2748  // EXPORTS
2749  __webpack_require__.d(__webpack_exports__, {
2750    "AlignmentControl": function() { return /* reexport */ AlignmentControl; },
2751    "AlignmentToolbar": function() { return /* reexport */ AlignmentToolbar; },
2752    "Autocomplete": function() { return /* reexport */ autocomplete; },
2753    "BlockAlignmentControl": function() { return /* reexport */ BlockAlignmentControl; },
2754    "BlockAlignmentToolbar": function() { return /* reexport */ BlockAlignmentToolbar; },
2755    "BlockBreadcrumb": function() { return /* reexport */ block_breadcrumb; },
2756    "BlockColorsStyleSelector": function() { return /* reexport */ color_style_selector; },
2757    "BlockContextProvider": function() { return /* reexport */ BlockContextProvider; },
2758    "BlockControls": function() { return /* reexport */ block_controls; },
2759    "BlockEdit": function() { return /* reexport */ BlockEdit; },
2760    "BlockEditorKeyboardShortcuts": function() { return /* reexport */ keyboard_shortcuts; },
2761    "BlockEditorProvider": function() { return /* reexport */ provider; },
2762    "BlockFormatControls": function() { return /* reexport */ BlockFormatControls; },
2763    "BlockIcon": function() { return /* reexport */ block_icon; },
2764    "BlockInspector": function() { return /* reexport */ block_inspector; },
2765    "BlockList": function() { return /* reexport */ BlockList; },
2766    "BlockMover": function() { return /* reexport */ block_mover; },
2767    "BlockNavigationDropdown": function() { return /* reexport */ dropdown; },
2768    "BlockPreview": function() { return /* reexport */ block_preview; },
2769    "BlockSelectionClearer": function() { return /* reexport */ BlockSelectionClearer; },
2770    "BlockSettingsMenu": function() { return /* reexport */ block_settings_menu; },
2771    "BlockSettingsMenuControls": function() { return /* reexport */ block_settings_menu_controls; },
2772    "BlockStyles": function() { return /* reexport */ block_styles; },
2773    "BlockTitle": function() { return /* reexport */ BlockTitle; },
2774    "BlockToolbar": function() { return /* reexport */ block_toolbar; },
2775    "BlockTools": function() { return /* reexport */ BlockTools; },
2776    "BlockVerticalAlignmentControl": function() { return /* reexport */ BlockVerticalAlignmentControl; },
2777    "BlockVerticalAlignmentToolbar": function() { return /* reexport */ BlockVerticalAlignmentToolbar; },
2778    "ButtonBlockAppender": function() { return /* reexport */ button_block_appender; },
2779    "ButtonBlockerAppender": function() { return /* reexport */ ButtonBlockerAppender; },
2780    "ColorPalette": function() { return /* reexport */ color_palette; },
2781    "ColorPaletteControl": function() { return /* reexport */ ColorPaletteControl; },
2782    "ContrastChecker": function() { return /* reexport */ contrast_checker; },
2783    "CopyHandler": function() { return /* reexport */ copy_handler; },
2784    "DefaultBlockAppender": function() { return /* reexport */ default_block_appender; },
2785    "FontSizePicker": function() { return /* reexport */ font_size_picker; },
2786    "InnerBlocks": function() { return /* reexport */ inner_blocks; },
2787    "Inserter": function() { return /* reexport */ inserter; },
2788    "InspectorAdvancedControls": function() { return /* reexport */ InspectorAdvancedControls; },
2789    "InspectorControls": function() { return /* reexport */ inspector_controls; },
2790    "JustifyContentControl": function() { return /* reexport */ JustifyContentControl; },
2791    "JustifyToolbar": function() { return /* reexport */ JustifyToolbar; },
2792    "LineHeightControl": function() { return /* reexport */ line_height_control; },
2793    "MediaPlaceholder": function() { return /* reexport */ media_placeholder; },
2794    "MediaReplaceFlow": function() { return /* reexport */ media_replace_flow; },
2795    "MediaUpload": function() { return /* reexport */ media_upload; },
2796    "MediaUploadCheck": function() { return /* reexport */ media_upload_check; },
2797    "MultiSelectScrollIntoView": function() { return /* reexport */ MultiSelectScrollIntoView; },
2798    "NavigableToolbar": function() { return /* reexport */ navigable_toolbar; },
2799    "ObserveTyping": function() { return /* reexport */ observe_typing; },
2800    "PanelColorSettings": function() { return /* reexport */ panel_color_settings; },
2801    "PlainText": function() { return /* reexport */ plain_text; },
2802    "RichText": function() { return /* reexport */ rich_text; },
2803    "RichTextShortcut": function() { return /* reexport */ RichTextShortcut; },
2804    "RichTextToolbarButton": function() { return /* reexport */ RichTextToolbarButton; },
2805    "SETTINGS_DEFAULTS": function() { return /* reexport */ SETTINGS_DEFAULTS; },
2806    "SkipToSelectedBlock": function() { return /* reexport */ skip_to_selected_block; },
2807    "ToolSelector": function() { return /* reexport */ tool_selector; },
2808    "Typewriter": function() { return /* reexport */ typewriter; },
2809    "URLInput": function() { return /* reexport */ url_input; },
2810    "URLInputButton": function() { return /* reexport */ url_input_button; },
2811    "URLPopover": function() { return /* reexport */ url_popover; },
2812    "Warning": function() { return /* reexport */ warning; },
2813    "WritingFlow": function() { return /* reexport */ writing_flow; },
2814    "__experimentalBlockAlignmentMatrixControl": function() { return /* reexport */ block_alignment_matrix_control; },
2815    "__experimentalBlockContentOverlay": function() { return /* reexport */ BlockContentOverlay; },
2816    "__experimentalBlockFullHeightAligmentControl": function() { return /* reexport */ block_full_height_alignment_control; },
2817    "__experimentalBlockPatternSetup": function() { return /* reexport */ block_pattern_setup; },
2818    "__experimentalBlockPatternsList": function() { return /* reexport */ block_patterns_list; },
2819    "__experimentalBlockVariationPicker": function() { return /* reexport */ block_variation_picker; },
2820    "__experimentalBlockVariationTransforms": function() { return /* reexport */ block_variation_transforms; },
2821    "__experimentalBorderRadiusControl": function() { return /* reexport */ BorderRadiusControl; },
2822    "__experimentalBorderStyleControl": function() { return /* reexport */ BorderStyleControl; },
2823    "__experimentalColorGradientControl": function() { return /* reexport */ control; },
2824    "__experimentalColorGradientSettingsDropdown": function() { return /* reexport */ ColorGradientSettingsDropdown; },
2825    "__experimentalDateFormatPicker": function() { return /* reexport */ DateFormatPicker; },
2826    "__experimentalDuotoneControl": function() { return /* reexport */ duotone_control; },
2827    "__experimentalFontAppearanceControl": function() { return /* reexport */ FontAppearanceControl; },
2828    "__experimentalFontFamilyControl": function() { return /* reexport */ FontFamilyControl; },
2829    "__experimentalGetBorderClassesAndStyles": function() { return /* reexport */ getBorderClassesAndStyles; },
2830    "__experimentalGetColorClassesAndStyles": function() { return /* reexport */ getColorClassesAndStyles; },
2831    "__experimentalGetGradientClass": function() { return /* reexport */ __experimentalGetGradientClass; },
2832    "__experimentalGetGradientObjectByGradientValue": function() { return /* reexport */ __experimentalGetGradientObjectByGradientValue; },
2833    "__experimentalGetMatchingVariation": function() { return /* reexport */ __experimentalGetMatchingVariation; },
2834    "__experimentalGetSpacingClassesAndStyles": function() { return /* reexport */ getSpacingClassesAndStyles; },
2835    "__experimentalImageEditingProvider": function() { return /* reexport */ ImageEditingProvider; },
2836    "__experimentalImageEditor": function() { return /* reexport */ ImageEditor; },
2837    "__experimentalImageSizeControl": function() { return /* reexport */ ImageSizeControl; },
2838    "__experimentalImageURLInputUI": function() { return /* reexport */ ImageURLInputUI; },
2839    "__experimentalLayoutStyle": function() { return /* reexport */ LayoutStyle; },
2840    "__experimentalLetterSpacingControl": function() { return /* reexport */ LetterSpacingControl; },
2841    "__experimentalLibrary": function() { return /* reexport */ library; },
2842    "__experimentalLinkControl": function() { return /* reexport */ link_control; },
2843    "__experimentalLinkControlSearchInput": function() { return /* reexport */ search_input; },
2844    "__experimentalLinkControlSearchItem": function() { return /* reexport */ search_item; },
2845    "__experimentalLinkControlSearchResults": function() { return /* reexport */ LinkControlSearchResults; },
2846    "__experimentalListView": function() { return /* reexport */ components_list_view; },
2847    "__experimentalPanelColorGradientSettings": function() { return /* reexport */ panel_color_gradient_settings; },
2848    "__experimentalPreviewOptions": function() { return /* reexport */ PreviewOptions; },
2849    "__experimentalResponsiveBlockControl": function() { return /* reexport */ responsive_block_control; },
2850    "__experimentalTextDecorationControl": function() { return /* reexport */ TextDecorationControl; },
2851    "__experimentalTextTransformControl": function() { return /* reexport */ TextTransformControl; },
2852    "__experimentalToolsPanelColorDropdown": function() { return /* reexport */ ToolsPanelColorDropdown; },
2853    "__experimentalUnitControl": function() { return /* reexport */ UnitControl; },
2854    "__experimentalUseBlockPreview": function() { return /* reexport */ useBlockPreview; },
2855    "__experimentalUseBorderProps": function() { return /* reexport */ useBorderProps; },
2856    "__experimentalUseColorProps": function() { return /* reexport */ useColorProps; },
2857    "__experimentalUseCustomSides": function() { return /* reexport */ useCustomSides; },
2858    "__experimentalUseGradient": function() { return /* reexport */ __experimentalUseGradient; },
2859    "__experimentalUseNoRecursiveRenders": function() { return /* reexport */ useNoRecursiveRenders; },
2860    "__experimentalUseResizeCanvas": function() { return /* reexport */ useResizeCanvas; },
2861    "__unstableBlockNameContext": function() { return /* reexport */ block_name_context; },
2862    "__unstableBlockSettingsMenuFirstItem": function() { return /* reexport */ block_settings_menu_first_item; },
2863    "__unstableBlockToolbarLastItem": function() { return /* reexport */ block_toolbar_last_item; },
2864    "__unstableEditorStyles": function() { return /* reexport */ EditorStyles; },
2865    "__unstableIframe": function() { return /* reexport */ iframe; },
2866    "__unstableInserterMenuExtension": function() { return /* reexport */ inserter_menu_extension; },
2867    "__unstablePresetDuotoneFilter": function() { return /* reexport */ PresetDuotoneFilter; },
2868    "__unstableRichTextInputEvent": function() { return /* reexport */ __unstableRichTextInputEvent; },
2869    "__unstableUseBlockSelectionClearer": function() { return /* reexport */ useBlockSelectionClearer; },
2870    "__unstableUseClipboardHandler": function() { return /* reexport */ useClipboardHandler; },
2871    "__unstableUseMouseMoveTypingReset": function() { return /* reexport */ useMouseMoveTypingReset; },
2872    "__unstableUseTypewriter": function() { return /* reexport */ useTypewriter; },
2873    "__unstableUseTypingObserver": function() { return /* reexport */ useTypingObserver; },
2874    "createCustomColorsHOC": function() { return /* reexport */ createCustomColorsHOC; },
2875    "getColorClassName": function() { return /* reexport */ getColorClassName; },
2876    "getColorObjectByAttributeValues": function() { return /* reexport */ getColorObjectByAttributeValues; },
2877    "getColorObjectByColorValue": function() { return /* reexport */ getColorObjectByColorValue; },
2878    "getFontSize": function() { return /* reexport */ getFontSize; },
2879    "getFontSizeClass": function() { return /* reexport */ getFontSizeClass; },
2880    "getFontSizeObjectByValue": function() { return /* reexport */ getFontSizeObjectByValue; },
2881    "getGradientSlugByValue": function() { return /* reexport */ getGradientSlugByValue; },
2882    "getGradientValueBySlug": function() { return /* reexport */ getGradientValueBySlug; },
2883    "getPxFromCssUnit": function() { return /* reexport */ parse_css_unit_to_px; },
2884    "store": function() { return /* reexport */ store; },
2885    "storeConfig": function() { return /* reexport */ storeConfig; },
2886    "transformStyles": function() { return /* reexport */ transform_styles; },
2887    "useBlockDisplayInformation": function() { return /* reexport */ useBlockDisplayInformation; },
2888    "useBlockEditContext": function() { return /* reexport */ useBlockEditContext; },
2889    "useBlockProps": function() { return /* reexport */ useBlockProps; },
2890    "useCachedTruthy": function() { return /* reexport */ useCachedTruthy; },
2891    "useInnerBlocksProps": function() { return /* reexport */ useInnerBlocksProps; },
2892    "useSetting": function() { return /* reexport */ useSetting; },
2893    "withColorContext": function() { return /* reexport */ with_color_context; },
2894    "withColors": function() { return /* reexport */ withColors; },
2895    "withFontSizes": function() { return /* reexport */ with_font_sizes; }
2896  });
2897  
2898  // NAMESPACE OBJECT: ./node_modules/@wordpress/block-editor/build-module/store/selectors.js
2899  var selectors_namespaceObject = {};
2900  __webpack_require__.r(selectors_namespaceObject);
2901  __webpack_require__.d(selectors_namespaceObject, {
2902    "__experimentalGetActiveBlockIdByBlockNames": function() { return __experimentalGetActiveBlockIdByBlockNames; },
2903    "__experimentalGetAllowedBlocks": function() { return __experimentalGetAllowedBlocks; },
2904    "__experimentalGetAllowedPatterns": function() { return __experimentalGetAllowedPatterns; },
2905    "__experimentalGetBlockListSettingsForBlocks": function() { return __experimentalGetBlockListSettingsForBlocks; },
2906    "__experimentalGetDirectInsertBlock": function() { return __experimentalGetDirectInsertBlock; },
2907    "__experimentalGetGlobalBlocksByName": function() { return __experimentalGetGlobalBlocksByName; },
2908    "__experimentalGetLastBlockAttributeChanges": function() { return __experimentalGetLastBlockAttributeChanges; },
2909    "__experimentalGetParsedPattern": function() { return __experimentalGetParsedPattern; },
2910    "__experimentalGetPatternTransformItems": function() { return __experimentalGetPatternTransformItems; },
2911    "__experimentalGetPatternsByBlockTypes": function() { return __experimentalGetPatternsByBlockTypes; },
2912    "__experimentalGetReusableBlockTitle": function() { return __experimentalGetReusableBlockTitle; },
2913    "__unstableGetBlockWithoutInnerBlocks": function() { return __unstableGetBlockWithoutInnerBlocks; },
2914    "__unstableGetClientIdWithClientIdsTree": function() { return __unstableGetClientIdWithClientIdsTree; },
2915    "__unstableGetClientIdsTree": function() { return __unstableGetClientIdsTree; },
2916    "__unstableGetSelectedBlocksWithPartialSelection": function() { return __unstableGetSelectedBlocksWithPartialSelection; },
2917    "__unstableIsFullySelected": function() { return __unstableIsFullySelected; },
2918    "__unstableIsLastBlockChangeIgnored": function() { return __unstableIsLastBlockChangeIgnored; },
2919    "__unstableIsSelectionCollapsed": function() { return __unstableIsSelectionCollapsed; },
2920    "__unstableIsSelectionMergeable": function() { return __unstableIsSelectionMergeable; },
2921    "areInnerBlocksControlled": function() { return areInnerBlocksControlled; },
2922    "canInsertBlockType": function() { return canInsertBlockType; },
2923    "canInsertBlocks": function() { return canInsertBlocks; },
2924    "canLockBlockType": function() { return canLockBlockType; },
2925    "canMoveBlock": function() { return canMoveBlock; },
2926    "canMoveBlocks": function() { return canMoveBlocks; },
2927    "canRemoveBlock": function() { return canRemoveBlock; },
2928    "canRemoveBlocks": function() { return canRemoveBlocks; },
2929    "didAutomaticChange": function() { return didAutomaticChange; },
2930    "getAdjacentBlockClientId": function() { return getAdjacentBlockClientId; },
2931    "getBlock": function() { return getBlock; },
2932    "getBlockAttributes": function() { return getBlockAttributes; },
2933    "getBlockCount": function() { return getBlockCount; },
2934    "getBlockHierarchyRootClientId": function() { return getBlockHierarchyRootClientId; },
2935    "getBlockIndex": function() { return getBlockIndex; },
2936    "getBlockInsertionPoint": function() { return getBlockInsertionPoint; },
2937    "getBlockListSettings": function() { return getBlockListSettings; },
2938    "getBlockMode": function() { return getBlockMode; },
2939    "getBlockName": function() { return getBlockName; },
2940    "getBlockOrder": function() { return getBlockOrder; },
2941    "getBlockParents": function() { return getBlockParents; },
2942    "getBlockParentsByBlockName": function() { return getBlockParentsByBlockName; },
2943    "getBlockRootClientId": function() { return getBlockRootClientId; },
2944    "getBlockSelectionEnd": function() { return getBlockSelectionEnd; },
2945    "getBlockSelectionStart": function() { return getBlockSelectionStart; },
2946    "getBlockTransformItems": function() { return getBlockTransformItems; },
2947    "getBlocks": function() { return getBlocks; },
2948    "getBlocksByClientId": function() { return getBlocksByClientId; },
2949    "getClientIdsOfDescendants": function() { return getClientIdsOfDescendants; },
2950    "getClientIdsWithDescendants": function() { return getClientIdsWithDescendants; },
2951    "getDraggedBlockClientIds": function() { return getDraggedBlockClientIds; },
2952    "getFirstMultiSelectedBlockClientId": function() { return getFirstMultiSelectedBlockClientId; },
2953    "getGlobalBlockCount": function() { return getGlobalBlockCount; },
2954    "getInserterItems": function() { return getInserterItems; },
2955    "getLastMultiSelectedBlockClientId": function() { return getLastMultiSelectedBlockClientId; },
2956    "getLowestCommonAncestorWithSelectedBlock": function() { return getLowestCommonAncestorWithSelectedBlock; },
2957    "getMultiSelectedBlockClientIds": function() { return getMultiSelectedBlockClientIds; },
2958    "getMultiSelectedBlocks": function() { return getMultiSelectedBlocks; },
2959    "getMultiSelectedBlocksEndClientId": function() { return getMultiSelectedBlocksEndClientId; },
2960    "getMultiSelectedBlocksStartClientId": function() { return getMultiSelectedBlocksStartClientId; },
2961    "getNextBlockClientId": function() { return getNextBlockClientId; },
2962    "getPreviousBlockClientId": function() { return getPreviousBlockClientId; },
2963    "getSelectedBlock": function() { return getSelectedBlock; },
2964    "getSelectedBlockClientId": function() { return getSelectedBlockClientId; },
2965    "getSelectedBlockClientIds": function() { return getSelectedBlockClientIds; },
2966    "getSelectedBlockCount": function() { return getSelectedBlockCount; },
2967    "getSelectedBlocksInitialCaretPosition": function() { return getSelectedBlocksInitialCaretPosition; },
2968    "getSelectionEnd": function() { return getSelectionEnd; },
2969    "getSelectionStart": function() { return getSelectionStart; },
2970    "getSettings": function() { return getSettings; },
2971    "getTemplate": function() { return getTemplate; },
2972    "getTemplateLock": function() { return getTemplateLock; },
2973    "hasBlockMovingClientId": function() { return selectors_hasBlockMovingClientId; },
2974    "hasInserterItems": function() { return hasInserterItems; },
2975    "hasMultiSelection": function() { return hasMultiSelection; },
2976    "hasSelectedBlock": function() { return hasSelectedBlock; },
2977    "hasSelectedInnerBlock": function() { return hasSelectedInnerBlock; },
2978    "isAncestorBeingDragged": function() { return isAncestorBeingDragged; },
2979    "isAncestorMultiSelected": function() { return isAncestorMultiSelected; },
2980    "isBlockBeingDragged": function() { return isBlockBeingDragged; },
2981    "isBlockHighlighted": function() { return isBlockHighlighted; },
2982    "isBlockInsertionPointVisible": function() { return isBlockInsertionPointVisible; },
2983    "isBlockMultiSelected": function() { return isBlockMultiSelected; },
2984    "isBlockSelected": function() { return isBlockSelected; },
2985    "isBlockValid": function() { return isBlockValid; },
2986    "isBlockWithinSelection": function() { return isBlockWithinSelection; },
2987    "isCaretWithinFormattedText": function() { return selectors_isCaretWithinFormattedText; },
2988    "isDraggingBlocks": function() { return isDraggingBlocks; },
2989    "isFirstMultiSelectedBlock": function() { return isFirstMultiSelectedBlock; },
2990    "isLastBlockChangePersistent": function() { return isLastBlockChangePersistent; },
2991    "isMultiSelecting": function() { return selectors_isMultiSelecting; },
2992    "isNavigationMode": function() { return selectors_isNavigationMode; },
2993    "isSelectionEnabled": function() { return selectors_isSelectionEnabled; },
2994    "isTyping": function() { return selectors_isTyping; },
2995    "isValidTemplate": function() { return isValidTemplate; },
2996    "wasBlockJustInserted": function() { return wasBlockJustInserted; }
2997  });
2998  
2999  // NAMESPACE OBJECT: ./node_modules/@wordpress/block-editor/build-module/store/actions.js
3000  var actions_namespaceObject = {};
3001  __webpack_require__.r(actions_namespaceObject);
3002  __webpack_require__.d(actions_namespaceObject, {
3003    "__unstableDeleteSelection": function() { return __unstableDeleteSelection; },
3004    "__unstableExpandSelection": function() { return __unstableExpandSelection; },
3005    "__unstableMarkAutomaticChange": function() { return __unstableMarkAutomaticChange; },
3006    "__unstableMarkLastChangeAsPersistent": function() { return __unstableMarkLastChangeAsPersistent; },
3007    "__unstableMarkNextChangeAsNotPersistent": function() { return __unstableMarkNextChangeAsNotPersistent; },
3008    "__unstableSaveReusableBlock": function() { return __unstableSaveReusableBlock; },
3009    "__unstableSplitSelection": function() { return __unstableSplitSelection; },
3010    "clearSelectedBlock": function() { return clearSelectedBlock; },
3011    "duplicateBlocks": function() { return duplicateBlocks; },
3012    "enterFormattedText": function() { return enterFormattedText; },
3013    "exitFormattedText": function() { return exitFormattedText; },
3014    "flashBlock": function() { return flashBlock; },
3015    "hideInsertionPoint": function() { return hideInsertionPoint; },
3016    "insertAfterBlock": function() { return insertAfterBlock; },
3017    "insertBeforeBlock": function() { return insertBeforeBlock; },
3018    "insertBlock": function() { return insertBlock; },
3019    "insertBlocks": function() { return insertBlocks; },
3020    "insertDefaultBlock": function() { return insertDefaultBlock; },
3021    "mergeBlocks": function() { return mergeBlocks; },
3022    "moveBlockToPosition": function() { return moveBlockToPosition; },
3023    "moveBlocksDown": function() { return moveBlocksDown; },
3024    "moveBlocksToPosition": function() { return moveBlocksToPosition; },
3025    "moveBlocksUp": function() { return moveBlocksUp; },
3026    "multiSelect": function() { return multiSelect; },
3027    "receiveBlocks": function() { return receiveBlocks; },
3028    "removeBlock": function() { return removeBlock; },
3029    "removeBlocks": function() { return removeBlocks; },
3030    "replaceBlock": function() { return replaceBlock; },
3031    "replaceBlocks": function() { return replaceBlocks; },
3032    "replaceInnerBlocks": function() { return replaceInnerBlocks; },
3033    "resetBlocks": function() { return resetBlocks; },
3034    "resetSelection": function() { return resetSelection; },
3035    "selectBlock": function() { return selectBlock; },
3036    "selectNextBlock": function() { return selectNextBlock; },
3037    "selectPreviousBlock": function() { return selectPreviousBlock; },
3038    "selectionChange": function() { return selectionChange; },
3039    "setBlockMovingClientId": function() { return setBlockMovingClientId; },
3040    "setHasControlledInnerBlocks": function() { return setHasControlledInnerBlocks; },
3041    "setNavigationMode": function() { return setNavigationMode; },
3042    "setTemplateValidity": function() { return setTemplateValidity; },
3043    "showInsertionPoint": function() { return showInsertionPoint; },
3044    "startDraggingBlocks": function() { return startDraggingBlocks; },
3045    "startMultiSelect": function() { return startMultiSelect; },
3046    "startTyping": function() { return startTyping; },
3047    "stopDraggingBlocks": function() { return stopDraggingBlocks; },
3048    "stopMultiSelect": function() { return stopMultiSelect; },
3049    "stopTyping": function() { return stopTyping; },
3050    "synchronizeTemplate": function() { return synchronizeTemplate; },
3051    "toggleBlockHighlight": function() { return toggleBlockHighlight; },
3052    "toggleBlockMode": function() { return toggleBlockMode; },
3053    "toggleSelection": function() { return toggleSelection; },
3054    "updateBlock": function() { return updateBlock; },
3055    "updateBlockAttributes": function() { return updateBlockAttributes; },
3056    "updateBlockListSettings": function() { return updateBlockListSettings; },
3057    "updateSettings": function() { return updateSettings; },
3058    "validateBlocksToTemplate": function() { return validateBlocksToTemplate; }
3059  });
3060  
3061  ;// CONCATENATED MODULE: external ["wp","blocks"]
3062  var external_wp_blocks_namespaceObject = window["wp"]["blocks"];
3063  ;// CONCATENATED MODULE: external ["wp","hooks"]
3064  var external_wp_hooks_namespaceObject = window["wp"]["hooks"];
3065  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/compat.js
3066  /**
3067   * WordPress dependencies
3068   */
3069  
3070  
3071  
3072  function migrateLightBlockWrapper(settings) {
3073    const {
3074      apiVersion = 1
3075    } = settings;
3076  
3077    if (apiVersion < 2 && (0,external_wp_blocks_namespaceObject.hasBlockSupport)(settings, 'lightBlockWrapper', false)) {
3078      settings.apiVersion = 2;
3079    }
3080  
3081    return settings;
3082  }
3083  
3084  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.registerBlockType', 'core/compat/migrateLightBlockWrapper', migrateLightBlockWrapper);
3085  
3086  ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/extends.js
3087  function _extends() {
3088    _extends = Object.assign || function (target) {
3089      for (var i = 1; i < arguments.length; i++) {
3090        var source = arguments[i];
3091  
3092        for (var key in source) {
3093          if (Object.prototype.hasOwnProperty.call(source, key)) {
3094            target[key] = source[key];
3095          }
3096        }
3097      }
3098  
3099      return target;
3100    };
3101  
3102    return _extends.apply(this, arguments);
3103  }
3104  ;// CONCATENATED MODULE: external ["wp","element"]
3105  var external_wp_element_namespaceObject = window["wp"]["element"];
3106  // EXTERNAL MODULE: ./node_modules/classnames/index.js
3107  var classnames = __webpack_require__(4403);
3108  var classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);
3109  ;// CONCATENATED MODULE: external "lodash"
3110  var external_lodash_namespaceObject = window["lodash"];
3111  ;// CONCATENATED MODULE: external ["wp","compose"]
3112  var external_wp_compose_namespaceObject = window["wp"]["compose"];
3113  ;// CONCATENATED MODULE: external ["wp","components"]
3114  var external_wp_components_namespaceObject = window["wp"]["components"];
3115  ;// CONCATENATED MODULE: external ["wp","data"]
3116  var external_wp_data_namespaceObject = window["wp"]["data"];
3117  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-controls/groups.js
3118  /**
3119   * WordPress dependencies
3120   */
3121  
3122  const BlockControlsDefault = (0,external_wp_components_namespaceObject.createSlotFill)('BlockControls');
3123  const BlockControlsBlock = (0,external_wp_components_namespaceObject.createSlotFill)('BlockControlsBlock');
3124  const BlockControlsInline = (0,external_wp_components_namespaceObject.createSlotFill)('BlockFormatControls');
3125  const BlockControlsOther = (0,external_wp_components_namespaceObject.createSlotFill)('BlockControlsOther');
3126  const BlockControlsParent = (0,external_wp_components_namespaceObject.createSlotFill)('BlockControlsParent');
3127  const groups = {
3128    default: BlockControlsDefault,
3129    block: BlockControlsBlock,
3130    inline: BlockControlsInline,
3131    other: BlockControlsOther,
3132    parent: BlockControlsParent
3133  };
3134  /* harmony default export */ var block_controls_groups = (groups);
3135  
3136  ;// CONCATENATED MODULE: external ["wp","i18n"]
3137  var external_wp_i18n_namespaceObject = window["wp"]["i18n"];
3138  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/store/defaults.js
3139  /**
3140   * WordPress dependencies
3141   */
3142  
3143  const PREFERENCES_DEFAULTS = {
3144    insertUsage: {}
3145  };
3146  /**
3147   * The default editor settings
3148   *
3149   * @typedef {Object} SETTINGS_DEFAULT
3150   * @property {boolean}       alignWide                              Enable/Disable Wide/Full Alignments
3151   * @property {boolean}       supportsLayout                         Enable/disable layouts support in container blocks.
3152   * @property {boolean}       imageEditing                           Image Editing settings set to false to disable.
3153   * @property {Array}         imageSizes                             Available image sizes
3154   * @property {number}        maxWidth                               Max width to constraint resizing
3155   * @property {boolean|Array} allowedBlockTypes                      Allowed block types
3156   * @property {boolean}       hasFixedToolbar                        Whether or not the editor toolbar is fixed
3157   * @property {boolean}       focusMode                              Whether the focus mode is enabled or not
3158   * @property {Array}         styles                                 Editor Styles
3159   * @property {boolean}       keepCaretInsideBlock                   Whether caret should move between blocks in edit mode
3160   * @property {string}        bodyPlaceholder                        Empty post placeholder
3161   * @property {string}        titlePlaceholder                       Empty title placeholder
3162   * @property {boolean}       canLockBlocks                          Whether the user can manage Block Lock state
3163   * @property {boolean}       codeEditingEnabled                     Whether or not the user can switch to the code editor
3164   * @property {boolean}       generateAnchors                        Enable/Disable auto anchor generation for Heading blocks
3165   * @property {boolean}       __experimentalCanUserUseUnfilteredHTML Whether the user should be able to use unfiltered HTML or the HTML should be filtered e.g., to remove elements considered insecure like iframes.
3166   * @property {boolean}       __experimentalBlockDirectory           Whether the user has enabled the Block Directory
3167   * @property {Array}         __experimentalBlockPatterns            Array of objects representing the block patterns
3168   * @property {Array}         __experimentalBlockPatternCategories   Array of objects representing the block pattern categories
3169   * @property {boolean}       __unstableGalleryWithImageBlocks       Whether the user has enabled the refactored gallery block which uses InnerBlocks
3170   */
3171  
3172  const SETTINGS_DEFAULTS = {
3173    alignWide: false,
3174    supportsLayout: true,
3175    // colors setting is not used anymore now defaults are passed from theme.json on the server and core has its own defaults.
3176    // The setting is only kept for backward compatibility purposes.
3177    colors: [{
3178      name: (0,external_wp_i18n_namespaceObject.__)('Black'),
3179      slug: 'black',
3180      color: '#000000'
3181    }, {
3182      name: (0,external_wp_i18n_namespaceObject.__)('Cyan bluish gray'),
3183      slug: 'cyan-bluish-gray',
3184      color: '#abb8c3'
3185    }, {
3186      name: (0,external_wp_i18n_namespaceObject.__)('White'),
3187      slug: 'white',
3188      color: '#ffffff'
3189    }, {
3190      name: (0,external_wp_i18n_namespaceObject.__)('Pale pink'),
3191      slug: 'pale-pink',
3192      color: '#f78da7'
3193    }, {
3194      name: (0,external_wp_i18n_namespaceObject.__)('Vivid red'),
3195      slug: 'vivid-red',
3196      color: '#cf2e2e'
3197    }, {
3198      name: (0,external_wp_i18n_namespaceObject.__)('Luminous vivid orange'),
3199      slug: 'luminous-vivid-orange',
3200      color: '#ff6900'
3201    }, {
3202      name: (0,external_wp_i18n_namespaceObject.__)('Luminous vivid amber'),
3203      slug: 'luminous-vivid-amber',
3204      color: '#fcb900'
3205    }, {
3206      name: (0,external_wp_i18n_namespaceObject.__)('Light green cyan'),
3207      slug: 'light-green-cyan',
3208      color: '#7bdcb5'
3209    }, {
3210      name: (0,external_wp_i18n_namespaceObject.__)('Vivid green cyan'),
3211      slug: 'vivid-green-cyan',
3212      color: '#00d084'
3213    }, {
3214      name: (0,external_wp_i18n_namespaceObject.__)('Pale cyan blue'),
3215      slug: 'pale-cyan-blue',
3216      color: '#8ed1fc'
3217    }, {
3218      name: (0,external_wp_i18n_namespaceObject.__)('Vivid cyan blue'),
3219      slug: 'vivid-cyan-blue',
3220      color: '#0693e3'
3221    }, {
3222      name: (0,external_wp_i18n_namespaceObject.__)('Vivid purple'),
3223      slug: 'vivid-purple',
3224      color: '#9b51e0'
3225    }],
3226    // fontSizes setting is not used anymore now defaults are passed from theme.json on the server and core has its own defaults.
3227    // The setting is only kept for backward compatibility purposes.
3228    fontSizes: [{
3229      name: (0,external_wp_i18n_namespaceObject._x)('Small', 'font size name'),
3230      size: 13,
3231      slug: 'small'
3232    }, {
3233      name: (0,external_wp_i18n_namespaceObject._x)('Normal', 'font size name'),
3234      size: 16,
3235      slug: 'normal'
3236    }, {
3237      name: (0,external_wp_i18n_namespaceObject._x)('Medium', 'font size name'),
3238      size: 20,
3239      slug: 'medium'
3240    }, {
3241      name: (0,external_wp_i18n_namespaceObject._x)('Large', 'font size name'),
3242      size: 36,
3243      slug: 'large'
3244    }, {
3245      name: (0,external_wp_i18n_namespaceObject._x)('Huge', 'font size name'),
3246      size: 42,
3247      slug: 'huge'
3248    }],
3249    // Image default size slug.
3250    imageDefaultSize: 'large',
3251    imageSizes: [{
3252      slug: 'thumbnail',
3253      name: (0,external_wp_i18n_namespaceObject.__)('Thumbnail')
3254    }, {
3255      slug: 'medium',
3256      name: (0,external_wp_i18n_namespaceObject.__)('Medium')
3257    }, {
3258      slug: 'large',
3259      name: (0,external_wp_i18n_namespaceObject.__)('Large')
3260    }, {
3261      slug: 'full',
3262      name: (0,external_wp_i18n_namespaceObject.__)('Full Size')
3263    }],
3264    // Allow plugin to disable Image Editor if need be.
3265    imageEditing: true,
3266    // This is current max width of the block inner area
3267    // It's used to constraint image resizing and this value could be overridden later by themes
3268    maxWidth: 580,
3269    // Allowed block types for the editor, defaulting to true (all supported).
3270    allowedBlockTypes: true,
3271    // Maximum upload size in bytes allowed for the site.
3272    maxUploadFileSize: 0,
3273    // List of allowed mime types and file extensions.
3274    allowedMimeTypes: null,
3275    // Allows to disable block locking interface.
3276    canLockBlocks: true,
3277    __experimentalCanUserUseUnfilteredHTML: false,
3278    __experimentalBlockDirectory: false,
3279    __mobileEnablePageTemplates: false,
3280    __experimentalBlockPatterns: [],
3281    __experimentalBlockPatternCategories: [],
3282    __experimentalSpotlightEntityBlocks: [],
3283    __unstableGalleryWithImageBlocks: false,
3284    generateAnchors: false,
3285    // gradients setting is not used anymore now defaults are passed from theme.json on the server and core has its own defaults.
3286    // The setting is only kept for backward compatibility purposes.
3287    gradients: [{
3288      name: (0,external_wp_i18n_namespaceObject.__)('Vivid cyan blue to vivid purple'),
3289      gradient: 'linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%)',
3290      slug: 'vivid-cyan-blue-to-vivid-purple'
3291    }, {
3292      name: (0,external_wp_i18n_namespaceObject.__)('Light green cyan to vivid green cyan'),
3293      gradient: 'linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%)',
3294      slug: 'light-green-cyan-to-vivid-green-cyan'
3295    }, {
3296      name: (0,external_wp_i18n_namespaceObject.__)('Luminous vivid amber to luminous vivid orange'),
3297      gradient: 'linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%)',
3298      slug: 'luminous-vivid-amber-to-luminous-vivid-orange'
3299    }, {
3300      name: (0,external_wp_i18n_namespaceObject.__)('Luminous vivid orange to vivid red'),
3301      gradient: 'linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%)',
3302      slug: 'luminous-vivid-orange-to-vivid-red'
3303    }, {
3304      name: (0,external_wp_i18n_namespaceObject.__)('Very light gray to cyan bluish gray'),
3305      gradient: 'linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%)',
3306      slug: 'very-light-gray-to-cyan-bluish-gray'
3307    }, {
3308      name: (0,external_wp_i18n_namespaceObject.__)('Cool to warm spectrum'),
3309      gradient: 'linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%)',
3310      slug: 'cool-to-warm-spectrum'
3311    }, {
3312      name: (0,external_wp_i18n_namespaceObject.__)('Blush light purple'),
3313      gradient: 'linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%)',
3314      slug: 'blush-light-purple'
3315    }, {
3316      name: (0,external_wp_i18n_namespaceObject.__)('Blush bordeaux'),
3317      gradient: 'linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%)',
3318      slug: 'blush-bordeaux'
3319    }, {
3320      name: (0,external_wp_i18n_namespaceObject.__)('Luminous dusk'),
3321      gradient: 'linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%)',
3322      slug: 'luminous-dusk'
3323    }, {
3324      name: (0,external_wp_i18n_namespaceObject.__)('Pale ocean'),
3325      gradient: 'linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%)',
3326      slug: 'pale-ocean'
3327    }, {
3328      name: (0,external_wp_i18n_namespaceObject.__)('Electric grass'),
3329      gradient: 'linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%)',
3330      slug: 'electric-grass'
3331    }, {
3332      name: (0,external_wp_i18n_namespaceObject.__)('Midnight'),
3333      gradient: 'linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%)',
3334      slug: 'midnight'
3335    }],
3336    __unstableResolvedAssets: {
3337      styles: [],
3338      scripts: []
3339    }
3340  };
3341  
3342  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/store/array.js
3343  /**
3344   * External dependencies
3345   */
3346  
3347  /**
3348   * Insert one or multiple elements into a given position of an array.
3349   *
3350   * @param {Array}  array    Source array.
3351   * @param {*}      elements Elements to insert.
3352   * @param {number} index    Insert Position.
3353   *
3354   * @return {Array} Result.
3355   */
3356  
3357  function insertAt(array, elements, index) {
3358    return [...array.slice(0, index), ...(0,external_lodash_namespaceObject.castArray)(elements), ...array.slice(index)];
3359  }
3360  /**
3361   * Moves an element in an array.
3362   *
3363   * @param {Array}  array Source array.
3364   * @param {number} from  Source index.
3365   * @param {number} to    Destination index.
3366   * @param {number} count Number of elements to move.
3367   *
3368   * @return {Array} Result.
3369   */
3370  
3371  function moveTo(array, from, to) {
3372    let count = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;
3373    const withoutMovedElements = [...array];
3374    withoutMovedElements.splice(from, count);
3375    return insertAt(withoutMovedElements, array.slice(from, from + count), to);
3376  }
3377  
3378  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/store/reducer.js
3379  /**
3380   * External dependencies
3381   */
3382  
3383  /**
3384   * WordPress dependencies
3385   */
3386  
3387  
3388  
3389  /**
3390   * Internal dependencies
3391   */
3392  
3393  
3394  
3395  /**
3396   * Given an array of blocks, returns an object where each key is a nesting
3397   * context, the value of which is an array of block client IDs existing within
3398   * that nesting context.
3399   *
3400   * @param {Array}   blocks       Blocks to map.
3401   * @param {?string} rootClientId Assumed root client ID.
3402   *
3403   * @return {Object} Block order map object.
3404   */
3405  
3406  function mapBlockOrder(blocks) {
3407    let rootClientId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
3408    const result = {
3409      [rootClientId]: []
3410    };
3411    blocks.forEach(block => {
3412      const {
3413        clientId,
3414        innerBlocks
3415      } = block;
3416      result[rootClientId].push(clientId);
3417      Object.assign(result, mapBlockOrder(innerBlocks, clientId));
3418    });
3419    return result;
3420  }
3421  /**
3422   * Given an array of blocks, returns an object where each key contains
3423   * the clientId of the block and the value is the parent of the block.
3424   *
3425   * @param {Array}   blocks       Blocks to map.
3426   * @param {?string} rootClientId Assumed root client ID.
3427   *
3428   * @return {Object} Block order map object.
3429   */
3430  
3431  
3432  function mapBlockParents(blocks) {
3433    let rootClientId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
3434    return blocks.reduce((result, block) => Object.assign(result, {
3435      [block.clientId]: rootClientId
3436    }, mapBlockParents(block.innerBlocks, block.clientId)), {});
3437  }
3438  /**
3439   * Helper method to iterate through all blocks, recursing into inner blocks,
3440   * applying a transformation function to each one.
3441   * Returns a flattened object with the transformed blocks.
3442   *
3443   * @param {Array}    blocks    Blocks to flatten.
3444   * @param {Function} transform Transforming function to be applied to each block.
3445   *
3446   * @return {Object} Flattened object.
3447   */
3448  
3449  
3450  function flattenBlocks(blocks) {
3451    let transform = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : external_lodash_namespaceObject.identity;
3452    const result = {};
3453    const stack = [...blocks];
3454  
3455    while (stack.length) {
3456      const {
3457        innerBlocks,
3458        ...block
3459      } = stack.shift();
3460      stack.push(...innerBlocks);
3461      result[block.clientId] = transform(block);
3462    }
3463  
3464    return result;
3465  }
3466  /**
3467   * Given an array of blocks, returns an object containing all blocks, without
3468   * attributes, recursing into inner blocks. Keys correspond to the block client
3469   * ID, the value of which is the attributes object.
3470   *
3471   * @param {Array} blocks Blocks to flatten.
3472   *
3473   * @return {Object} Flattened block attributes object.
3474   */
3475  
3476  
3477  function getFlattenedBlocksWithoutAttributes(blocks) {
3478    return flattenBlocks(blocks, block => (0,external_lodash_namespaceObject.omit)(block, 'attributes'));
3479  }
3480  /**
3481   * Given an array of blocks, returns an object containing all block attributes,
3482   * recursing into inner blocks. Keys correspond to the block client ID, the
3483   * value of which is the attributes object.
3484   *
3485   * @param {Array} blocks Blocks to flatten.
3486   *
3487   * @return {Object} Flattened block attributes object.
3488   */
3489  
3490  
3491  function getFlattenedBlockAttributes(blocks) {
3492    return flattenBlocks(blocks, block => block.attributes);
3493  }
3494  /**
3495   * Returns an object against which it is safe to perform mutating operations,
3496   * given the original object and its current working copy.
3497   *
3498   * @param {Object} original Original object.
3499   * @param {Object} working  Working object.
3500   *
3501   * @return {Object} Mutation-safe object.
3502   */
3503  
3504  
3505  function getMutateSafeObject(original, working) {
3506    if (original === working) {
3507      return { ...original
3508      };
3509    }
3510  
3511    return working;
3512  }
3513  /**
3514   * Returns true if the two object arguments have the same keys, or false
3515   * otherwise.
3516   *
3517   * @param {Object} a First object.
3518   * @param {Object} b Second object.
3519   *
3520   * @return {boolean} Whether the two objects have the same keys.
3521   */
3522  
3523  
3524  function hasSameKeys(a, b) {
3525    return (0,external_lodash_namespaceObject.isEqual)((0,external_lodash_namespaceObject.keys)(a), (0,external_lodash_namespaceObject.keys)(b));
3526  }
3527  /**
3528   * Returns true if, given the currently dispatching action and the previously
3529   * dispatched action, the two actions are updating the same block attribute, or
3530   * false otherwise.
3531   *
3532   * @param {Object} action     Currently dispatching action.
3533   * @param {Object} lastAction Previously dispatched action.
3534   *
3535   * @return {boolean} Whether actions are updating the same block attribute.
3536   */
3537  
3538  function isUpdatingSameBlockAttribute(action, lastAction) {
3539    return action.type === 'UPDATE_BLOCK_ATTRIBUTES' && lastAction !== undefined && lastAction.type === 'UPDATE_BLOCK_ATTRIBUTES' && (0,external_lodash_namespaceObject.isEqual)(action.clientIds, lastAction.clientIds) && hasSameKeys(action.attributes, lastAction.attributes);
3540  }
3541  
3542  function buildBlockTree(state, blocks) {
3543    const result = {};
3544    const stack = [...blocks];
3545    const flattenedBlocks = [...blocks];
3546  
3547    while (stack.length) {
3548      const block = stack.shift();
3549      stack.push(...block.innerBlocks);
3550      flattenedBlocks.push(...block.innerBlocks);
3551    } // Create objects before mutating them, that way it's always defined.
3552  
3553  
3554    for (const block of flattenedBlocks) {
3555      result[block.clientId] = {};
3556    }
3557  
3558    for (const block of flattenedBlocks) {
3559      result[block.clientId] = Object.assign(result[block.clientId], { ...state.byClientId[block.clientId],
3560        attributes: state.attributes[block.clientId],
3561        innerBlocks: block.innerBlocks.map(subBlock => result[subBlock.clientId])
3562      });
3563    }
3564  
3565    return result;
3566  }
3567  
3568  function updateParentInnerBlocksInTree(state, tree, updatedClientIds) {
3569    let updateChildrenOfUpdatedClientIds = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
3570    const uncontrolledParents = new Set([]);
3571    const controlledParents = new Set();
3572  
3573    for (const clientId of updatedClientIds) {
3574      let current = updateChildrenOfUpdatedClientIds ? clientId : state.parents[clientId];
3575  
3576      do {
3577        if (state.controlledInnerBlocks[current]) {
3578          // Should stop on controlled blocks.
3579          // If we reach a controlled parent, break out of the loop.
3580          controlledParents.add(current);
3581          break;
3582        } else {
3583          // Else continue traversing up through parents.
3584          uncontrolledParents.add(current);
3585          current = state.parents[current];
3586        }
3587      } while (current !== undefined);
3588    } // To make sure the order of assignments doesn't matter,
3589    // we first create empty objects and mutates the inner blocks later.
3590  
3591  
3592    for (const clientId of uncontrolledParents) {
3593      tree[clientId] = { ...tree[clientId]
3594      };
3595    }
3596  
3597    for (const clientId of uncontrolledParents) {
3598      tree[clientId].innerBlocks = (state.order[clientId] || []).map(subClientId => tree[subClientId]);
3599    } // Controlled parent blocks, need a dedicated key for their inner blocks
3600    // to be used when doing getBlocks( controlledBlockClientId ).
3601  
3602  
3603    for (const clientId of controlledParents) {
3604      tree['controlled||' + clientId] = {
3605        innerBlocks: (state.order[clientId] || []).map(subClientId => tree[subClientId])
3606      };
3607    }
3608  
3609    return tree;
3610  }
3611  /**
3612   * Higher-order reducer intended to compute full block objects key for each block in the post.
3613   * This is a denormalization to optimize the performance of the getBlock selectors and avoid
3614   * recomputing the block objects and avoid heavy memoization.
3615   *
3616   * @param {Function} reducer Original reducer function.
3617   *
3618   * @return {Function} Enhanced reducer function.
3619   */
3620  
3621  
3622  const withBlockTree = reducer => function () {
3623    let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
3624    let action = arguments.length > 1 ? arguments[1] : undefined;
3625    const newState = reducer(state, action);
3626  
3627    if (newState === state) {
3628      return state;
3629    }
3630  
3631    newState.tree = state.tree ? state.tree : {};
3632  
3633    switch (action.type) {
3634      case 'RECEIVE_BLOCKS':
3635      case 'INSERT_BLOCKS':
3636        {
3637          const subTree = buildBlockTree(newState, action.blocks);
3638          newState.tree = updateParentInnerBlocksInTree(newState, { ...newState.tree,
3639            ...subTree
3640          }, action.rootClientId ? [action.rootClientId] : [''], true);
3641          break;
3642        }
3643  
3644      case 'UPDATE_BLOCK':
3645        newState.tree = updateParentInnerBlocksInTree(newState, { ...newState.tree,
3646          [action.clientId]: { ...newState.tree[action.clientId],
3647            ...newState.byClientId[action.clientId],
3648            attributes: newState.attributes[action.clientId]
3649          }
3650        }, [action.clientId], false);
3651        break;
3652  
3653      case 'UPDATE_BLOCK_ATTRIBUTES':
3654        {
3655          const newSubTree = action.clientIds.reduce((result, clientId) => {
3656            result[clientId] = { ...newState.tree[clientId],
3657              attributes: newState.attributes[clientId]
3658            };
3659            return result;
3660          }, {});
3661          newState.tree = updateParentInnerBlocksInTree(newState, { ...newState.tree,
3662            ...newSubTree
3663          }, action.clientIds, false);
3664          break;
3665        }
3666  
3667      case 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN':
3668        {
3669          const subTree = buildBlockTree(newState, action.blocks);
3670          newState.tree = updateParentInnerBlocksInTree(newState, { ...(0,external_lodash_namespaceObject.omit)(newState.tree, action.replacedClientIds.concat( // Controlled inner blocks are only removed
3671            // if the block doesn't move to another position
3672            // otherwise their content will be lost.
3673            action.replacedClientIds.filter(clientId => !subTree[clientId]).map(clientId => 'controlled||' + clientId))),
3674            ...subTree
3675          }, action.blocks.map(b => b.clientId), false); // If there are no replaced blocks, it means we're removing blocks so we need to update their parent.
3676  
3677          const parentsOfRemovedBlocks = [];
3678  
3679          for (const clientId of action.clientIds) {
3680            if (state.parents[clientId] !== undefined && (state.parents[clientId] === '' || newState.byClientId[state.parents[clientId]])) {
3681              parentsOfRemovedBlocks.push(state.parents[clientId]);
3682            }
3683          }
3684  
3685          newState.tree = updateParentInnerBlocksInTree(newState, newState.tree, parentsOfRemovedBlocks, true);
3686          break;
3687        }
3688  
3689      case 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN':
3690        const parentsOfRemovedBlocks = [];
3691  
3692        for (const clientId of action.clientIds) {
3693          if (state.parents[clientId] !== undefined && (state.parents[clientId] === '' || newState.byClientId[state.parents[clientId]])) {
3694            parentsOfRemovedBlocks.push(state.parents[clientId]);
3695          }
3696        }
3697  
3698        newState.tree = updateParentInnerBlocksInTree(newState, (0,external_lodash_namespaceObject.omit)(newState.tree, action.removedClientIds.concat(action.removedClientIds.map(clientId => 'controlled||' + clientId))), parentsOfRemovedBlocks, true);
3699        break;
3700  
3701      case 'MOVE_BLOCKS_TO_POSITION':
3702        {
3703          const updatedBlockUids = [];
3704  
3705          if (action.fromRootClientId) {
3706            updatedBlockUids.push(action.fromRootClientId);
3707          }
3708  
3709          if (action.toRootClientId) {
3710            updatedBlockUids.push(action.toRootClientId);
3711          }
3712  
3713          if (!action.fromRootClientId || !action.fromRootClientId) {
3714            updatedBlockUids.push('');
3715          }
3716  
3717          newState.tree = updateParentInnerBlocksInTree(newState, newState.tree, updatedBlockUids, true);
3718          break;
3719        }
3720  
3721      case 'MOVE_BLOCKS_UP':
3722      case 'MOVE_BLOCKS_DOWN':
3723        {
3724          const updatedBlockUids = [action.rootClientId ? action.rootClientId : ''];
3725          newState.tree = updateParentInnerBlocksInTree(newState, newState.tree, updatedBlockUids, true);
3726          break;
3727        }
3728  
3729      case 'SAVE_REUSABLE_BLOCK_SUCCESS':
3730        {
3731          const updatedBlockUids = (0,external_lodash_namespaceObject.keys)((0,external_lodash_namespaceObject.omitBy)(newState.attributes, (attributes, clientId) => {
3732            return newState.byClientId[clientId].name !== 'core/block' || attributes.ref !== action.updatedId;
3733          }));
3734          newState.tree = updateParentInnerBlocksInTree(newState, { ...newState.tree,
3735            ...updatedBlockUids.reduce((result, clientId) => {
3736              result[clientId] = { ...newState.byClientId[clientId],
3737                attributes: newState.attributes[clientId],
3738                innerBlocks: newState.tree[clientId].innerBlocks
3739              };
3740              return result;
3741            }, {})
3742          }, updatedBlockUids, false);
3743        }
3744    }
3745  
3746    return newState;
3747  };
3748  /**
3749   * Higher-order reducer intended to augment the blocks reducer, assigning an
3750   * `isPersistentChange` property value corresponding to whether a change in
3751   * state can be considered as persistent. All changes are considered persistent
3752   * except when updating the same block attribute as in the previous action.
3753   *
3754   * @param {Function} reducer Original reducer function.
3755   *
3756   * @return {Function} Enhanced reducer function.
3757   */
3758  
3759  
3760  function withPersistentBlockChange(reducer) {
3761    let lastAction;
3762    let markNextChangeAsNotPersistent = false;
3763    return (state, action) => {
3764      let nextState = reducer(state, action);
3765      const isExplicitPersistentChange = action.type === 'MARK_LAST_CHANGE_AS_PERSISTENT' || markNextChangeAsNotPersistent; // Defer to previous state value (or default) unless changing or
3766      // explicitly marking as persistent.
3767  
3768      if (state === nextState && !isExplicitPersistentChange) {
3769        var _state$isPersistentCh;
3770  
3771        markNextChangeAsNotPersistent = action.type === 'MARK_NEXT_CHANGE_AS_NOT_PERSISTENT';
3772        const nextIsPersistentChange = (_state$isPersistentCh = state === null || state === void 0 ? void 0 : state.isPersistentChange) !== null && _state$isPersistentCh !== void 0 ? _state$isPersistentCh : true;
3773  
3774        if (state.isPersistentChange === nextIsPersistentChange) {
3775          return state;
3776        }
3777  
3778        return { ...nextState,
3779          isPersistentChange: nextIsPersistentChange
3780        };
3781      }
3782  
3783      nextState = { ...nextState,
3784        isPersistentChange: isExplicitPersistentChange ? !markNextChangeAsNotPersistent : !isUpdatingSameBlockAttribute(action, lastAction)
3785      }; // In comparing against the previous action, consider only those which
3786      // would have qualified as one which would have been ignored or not
3787      // have resulted in a changed state.
3788  
3789      lastAction = action;
3790      markNextChangeAsNotPersistent = action.type === 'MARK_NEXT_CHANGE_AS_NOT_PERSISTENT';
3791      return nextState;
3792    };
3793  }
3794  /**
3795   * Higher-order reducer intended to augment the blocks reducer, assigning an
3796   * `isIgnoredChange` property value corresponding to whether a change in state
3797   * can be considered as ignored. A change is considered ignored when the result
3798   * of an action not incurred by direct user interaction.
3799   *
3800   * @param {Function} reducer Original reducer function.
3801   *
3802   * @return {Function} Enhanced reducer function.
3803   */
3804  
3805  
3806  function withIgnoredBlockChange(reducer) {
3807    /**
3808     * Set of action types for which a blocks state change should be ignored.
3809     *
3810     * @type {Set}
3811     */
3812    const IGNORED_ACTION_TYPES = new Set(['RECEIVE_BLOCKS']);
3813    return (state, action) => {
3814      const nextState = reducer(state, action);
3815  
3816      if (nextState !== state) {
3817        nextState.isIgnoredChange = IGNORED_ACTION_TYPES.has(action.type);
3818      }
3819  
3820      return nextState;
3821    };
3822  }
3823  /**
3824   * Higher-order reducer targeting the combined blocks reducer, augmenting
3825   * block client IDs in remove action to include cascade of inner blocks.
3826   *
3827   * @param {Function} reducer Original reducer function.
3828   *
3829   * @return {Function} Enhanced reducer function.
3830   */
3831  
3832  
3833  const withInnerBlocksRemoveCascade = reducer => (state, action) => {
3834    // Gets all children which need to be removed.
3835    const getAllChildren = clientIds => {
3836      let result = clientIds;
3837  
3838      for (let i = 0; i < result.length; i++) {
3839        if (!state.order[result[i]] || action.keepControlledInnerBlocks && action.keepControlledInnerBlocks[result[i]]) {
3840          continue;
3841        }
3842  
3843        if (result === clientIds) {
3844          result = [...result];
3845        }
3846  
3847        result.push(...state.order[result[i]]);
3848      }
3849  
3850      return result;
3851    };
3852  
3853    if (state) {
3854      switch (action.type) {
3855        case 'REMOVE_BLOCKS':
3856          action = { ...action,
3857            type: 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN',
3858            removedClientIds: getAllChildren(action.clientIds)
3859          };
3860          break;
3861  
3862        case 'REPLACE_BLOCKS':
3863          action = { ...action,
3864            type: 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN',
3865            replacedClientIds: getAllChildren(action.clientIds)
3866          };
3867          break;
3868      }
3869    }
3870  
3871    return reducer(state, action);
3872  };
3873  /**
3874   * Higher-order reducer which targets the combined blocks reducer and handles
3875   * the `RESET_BLOCKS` action. When dispatched, this action will replace all
3876   * blocks that exist in the post, leaving blocks that exist only in state (e.g.
3877   * reusable blocks and blocks controlled by inner blocks controllers) alone.
3878   *
3879   * @param {Function} reducer Original reducer function.
3880   *
3881   * @return {Function} Enhanced reducer function.
3882   */
3883  
3884  
3885  const withBlockReset = reducer => (state, action) => {
3886    if (action.type === 'RESET_BLOCKS') {
3887      const newState = { ...state,
3888        byClientId: getFlattenedBlocksWithoutAttributes(action.blocks),
3889        attributes: getFlattenedBlockAttributes(action.blocks),
3890        order: mapBlockOrder(action.blocks),
3891        parents: mapBlockParents(action.blocks),
3892        controlledInnerBlocks: {}
3893      };
3894      const subTree = buildBlockTree(newState, action.blocks);
3895      newState.tree = { ...subTree,
3896        // Root.
3897        '': {
3898          innerBlocks: action.blocks.map(subBlock => subTree[subBlock.clientId])
3899        }
3900      };
3901      return newState;
3902    }
3903  
3904    return reducer(state, action);
3905  };
3906  /**
3907   * Higher-order reducer which targets the combined blocks reducer and handles
3908   * the `REPLACE_INNER_BLOCKS` action. When dispatched, this action the state
3909   * should become equivalent to the execution of a `REMOVE_BLOCKS` action
3910   * containing all the child's of the root block followed by the execution of
3911   * `INSERT_BLOCKS` with the new blocks.
3912   *
3913   * @param {Function} reducer Original reducer function.
3914   *
3915   * @return {Function} Enhanced reducer function.
3916   */
3917  
3918  
3919  const withReplaceInnerBlocks = reducer => (state, action) => {
3920    if (action.type !== 'REPLACE_INNER_BLOCKS') {
3921      return reducer(state, action);
3922    } // Finds every nested inner block controller. We must check the action blocks
3923    // and not just the block parent state because some inner block controllers
3924    // should be deleted if specified, whereas others should not be deleted. If
3925    // a controlled should not be deleted, then we need to avoid deleting its
3926    // inner blocks from the block state because its inner blocks will not be
3927    // attached to the block in the action.
3928  
3929  
3930    const nestedControllers = {};
3931  
3932    if (Object.keys(state.controlledInnerBlocks).length) {
3933      const stack = [...action.blocks];
3934  
3935      while (stack.length) {
3936        const {
3937          innerBlocks,
3938          ...block
3939        } = stack.shift();
3940        stack.push(...innerBlocks);
3941  
3942        if (!!state.controlledInnerBlocks[block.clientId]) {
3943          nestedControllers[block.clientId] = true;
3944        }
3945      }
3946    } // The `keepControlledInnerBlocks` prop will keep the inner blocks of the
3947    // marked block in the block state so that they can be reattached to the
3948    // marked block when we re-insert everything a few lines below.
3949  
3950  
3951    let stateAfterBlocksRemoval = state;
3952  
3953    if (state.order[action.rootClientId]) {
3954      stateAfterBlocksRemoval = reducer(stateAfterBlocksRemoval, {
3955        type: 'REMOVE_BLOCKS',
3956        keepControlledInnerBlocks: nestedControllers,
3957        clientIds: state.order[action.rootClientId]
3958      });
3959    }
3960  
3961    let stateAfterInsert = stateAfterBlocksRemoval;
3962  
3963    if (action.blocks.length) {
3964      stateAfterInsert = reducer(stateAfterInsert, { ...action,
3965        type: 'INSERT_BLOCKS',
3966        index: 0
3967      }); // We need to re-attach the block order of the controlled inner blocks.
3968      // Otherwise, an inner block controller's blocks will be deleted entirely
3969      // from its entity..
3970  
3971      stateAfterInsert.order = { ...stateAfterInsert.order,
3972        ...(0,external_lodash_namespaceObject.reduce)(nestedControllers, (result, value, key) => {
3973          if (state.order[key]) {
3974            result[key] = state.order[key];
3975          }
3976  
3977          return result;
3978        }, {})
3979      };
3980    }
3981  
3982    return stateAfterInsert;
3983  };
3984  /**
3985   * Higher-order reducer which targets the combined blocks reducer and handles
3986   * the `SAVE_REUSABLE_BLOCK_SUCCESS` action. This action can't be handled by
3987   * regular reducers and needs a higher-order reducer since it needs access to
3988   * both `byClientId` and `attributes` simultaneously.
3989   *
3990   * @param {Function} reducer Original reducer function.
3991   *
3992   * @return {Function} Enhanced reducer function.
3993   */
3994  
3995  
3996  const withSaveReusableBlock = reducer => (state, action) => {
3997    if (state && action.type === 'SAVE_REUSABLE_BLOCK_SUCCESS') {
3998      const {
3999        id,
4000        updatedId
4001      } = action; // If a temporary reusable block is saved, we swap the temporary id with the final one.
4002  
4003      if (id === updatedId) {
4004        return state;
4005      }
4006  
4007      state = { ...state
4008      };
4009      state.attributes = (0,external_lodash_namespaceObject.mapValues)(state.attributes, (attributes, clientId) => {
4010        const {
4011          name
4012        } = state.byClientId[clientId];
4013  
4014        if (name === 'core/block' && attributes.ref === id) {
4015          return { ...attributes,
4016            ref: updatedId
4017          };
4018        }
4019  
4020        return attributes;
4021      });
4022    }
4023  
4024    return reducer(state, action);
4025  };
4026  /**
4027   * Higher-order reducer which removes blocks from state when switching parent block controlled state.
4028   *
4029   * @param {Function} reducer Original reducer function.
4030   *
4031   * @return {Function} Enhanced reducer function.
4032   */
4033  
4034  
4035  const withResetControlledBlocks = reducer => (state, action) => {
4036    if (action.type === 'SET_HAS_CONTROLLED_INNER_BLOCKS') {
4037      // when switching a block from controlled to uncontrolled or inverse,
4038      // we need to remove its content first.
4039      const tempState = reducer(state, {
4040        type: 'REPLACE_INNER_BLOCKS',
4041        rootClientId: action.clientId,
4042        blocks: []
4043      });
4044      return reducer(tempState, action);
4045    }
4046  
4047    return reducer(state, action);
4048  };
4049  /**
4050   * Reducer returning the blocks state.
4051   *
4052   * @param {Object} state  Current state.
4053   * @param {Object} action Dispatched action.
4054   *
4055   * @return {Object} Updated state.
4056   */
4057  
4058  
4059  const blocks = (0,external_lodash_namespaceObject.flow)(external_wp_data_namespaceObject.combineReducers, withSaveReusableBlock, // Needs to be before withBlockCache.
4060  withBlockTree, // Needs to be before withInnerBlocksRemoveCascade.
4061  withInnerBlocksRemoveCascade, withReplaceInnerBlocks, // Needs to be after withInnerBlocksRemoveCascade.
4062  withBlockReset, withPersistentBlockChange, withIgnoredBlockChange, withResetControlledBlocks)({
4063    byClientId() {
4064      let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
4065      let action = arguments.length > 1 ? arguments[1] : undefined;
4066  
4067      switch (action.type) {
4068        case 'RECEIVE_BLOCKS':
4069        case 'INSERT_BLOCKS':
4070          return { ...state,
4071            ...getFlattenedBlocksWithoutAttributes(action.blocks)
4072          };
4073  
4074        case 'UPDATE_BLOCK':
4075          // Ignore updates if block isn't known.
4076          if (!state[action.clientId]) {
4077            return state;
4078          } // Do nothing if only attributes change.
4079  
4080  
4081          const changes = (0,external_lodash_namespaceObject.omit)(action.updates, 'attributes');
4082  
4083          if ((0,external_lodash_namespaceObject.isEmpty)(changes)) {
4084            return state;
4085          }
4086  
4087          return { ...state,
4088            [action.clientId]: { ...state[action.clientId],
4089              ...changes
4090            }
4091          };
4092  
4093        case 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN':
4094          if (!action.blocks) {
4095            return state;
4096          }
4097  
4098          return { ...(0,external_lodash_namespaceObject.omit)(state, action.replacedClientIds),
4099            ...getFlattenedBlocksWithoutAttributes(action.blocks)
4100          };
4101  
4102        case 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN':
4103          return (0,external_lodash_namespaceObject.omit)(state, action.removedClientIds);
4104      }
4105  
4106      return state;
4107    },
4108  
4109    attributes() {
4110      let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
4111      let action = arguments.length > 1 ? arguments[1] : undefined;
4112  
4113      switch (action.type) {
4114        case 'RECEIVE_BLOCKS':
4115        case 'INSERT_BLOCKS':
4116          return { ...state,
4117            ...getFlattenedBlockAttributes(action.blocks)
4118          };
4119  
4120        case 'UPDATE_BLOCK':
4121          // Ignore updates if block isn't known or there are no attribute changes.
4122          if (!state[action.clientId] || !action.updates.attributes) {
4123            return state;
4124          }
4125  
4126          return { ...state,
4127            [action.clientId]: { ...state[action.clientId],
4128              ...action.updates.attributes
4129            }
4130          };
4131  
4132        case 'UPDATE_BLOCK_ATTRIBUTES':
4133          {
4134            // Avoid a state change if none of the block IDs are known.
4135            if (action.clientIds.every(id => !state[id])) {
4136              return state;
4137            }
4138  
4139            const next = action.clientIds.reduce((accumulator, id) => ({ ...accumulator,
4140              [id]: (0,external_lodash_namespaceObject.reduce)(action.uniqueByBlock ? action.attributes[id] : action.attributes, (result, value, key) => {
4141                // Consider as updates only changed values.
4142                if (value !== result[key]) {
4143                  result = getMutateSafeObject(state[id], result);
4144                  result[key] = value;
4145                }
4146  
4147                return result;
4148              }, state[id])
4149            }), {});
4150  
4151            if (action.clientIds.every(id => next[id] === state[id])) {
4152              return state;
4153            }
4154  
4155            return { ...state,
4156              ...next
4157            };
4158          }
4159  
4160        case 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN':
4161          if (!action.blocks) {
4162            return state;
4163          }
4164  
4165          return { ...(0,external_lodash_namespaceObject.omit)(state, action.replacedClientIds),
4166            ...getFlattenedBlockAttributes(action.blocks)
4167          };
4168  
4169        case 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN':
4170          return (0,external_lodash_namespaceObject.omit)(state, action.removedClientIds);
4171      }
4172  
4173      return state;
4174    },
4175  
4176    order() {
4177      let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
4178      let action = arguments.length > 1 ? arguments[1] : undefined;
4179  
4180      switch (action.type) {
4181        case 'RECEIVE_BLOCKS':
4182          {
4183            const blockOrder = mapBlockOrder(action.blocks);
4184            return { ...state,
4185              ...(0,external_lodash_namespaceObject.omit)(blockOrder, ''),
4186              '': ((state === null || state === void 0 ? void 0 : state['']) || []).concat(blockOrder[''])
4187            };
4188          }
4189  
4190        case 'INSERT_BLOCKS':
4191          {
4192            const {
4193              rootClientId = ''
4194            } = action;
4195            const subState = state[rootClientId] || [];
4196            const mappedBlocks = mapBlockOrder(action.blocks, rootClientId);
4197            const {
4198              index = subState.length
4199            } = action;
4200            return { ...state,
4201              ...mappedBlocks,
4202              [rootClientId]: insertAt(subState, mappedBlocks[rootClientId], index)
4203            };
4204          }
4205  
4206        case 'MOVE_BLOCKS_TO_POSITION':
4207          {
4208            const {
4209              fromRootClientId = '',
4210              toRootClientId = '',
4211              clientIds
4212            } = action;
4213            const {
4214              index = state[toRootClientId].length
4215            } = action; // Moving inside the same parent block.
4216  
4217            if (fromRootClientId === toRootClientId) {
4218              const subState = state[toRootClientId];
4219              const fromIndex = subState.indexOf(clientIds[0]);
4220              return { ...state,
4221                [toRootClientId]: moveTo(state[toRootClientId], fromIndex, index, clientIds.length)
4222              };
4223            } // Moving from a parent block to another.
4224  
4225  
4226            return { ...state,
4227              [fromRootClientId]: (0,external_lodash_namespaceObject.without)(state[fromRootClientId], ...clientIds),
4228              [toRootClientId]: insertAt(state[toRootClientId], clientIds, index)
4229            };
4230          }
4231  
4232        case 'MOVE_BLOCKS_UP':
4233          {
4234            const {
4235              clientIds,
4236              rootClientId = ''
4237            } = action;
4238            const firstClientId = (0,external_lodash_namespaceObject.first)(clientIds);
4239            const subState = state[rootClientId];
4240  
4241            if (!subState.length || firstClientId === (0,external_lodash_namespaceObject.first)(subState)) {
4242              return state;
4243            }
4244  
4245            const firstIndex = subState.indexOf(firstClientId);
4246            return { ...state,
4247              [rootClientId]: moveTo(subState, firstIndex, firstIndex - 1, clientIds.length)
4248            };
4249          }
4250  
4251        case 'MOVE_BLOCKS_DOWN':
4252          {
4253            const {
4254              clientIds,
4255              rootClientId = ''
4256            } = action;
4257            const firstClientId = (0,external_lodash_namespaceObject.first)(clientIds);
4258            const lastClientId = (0,external_lodash_namespaceObject.last)(clientIds);
4259            const subState = state[rootClientId];
4260  
4261            if (!subState.length || lastClientId === (0,external_lodash_namespaceObject.last)(subState)) {
4262              return state;
4263            }
4264  
4265            const firstIndex = subState.indexOf(firstClientId);
4266            return { ...state,
4267              [rootClientId]: moveTo(subState, firstIndex, firstIndex + 1, clientIds.length)
4268            };
4269          }
4270  
4271        case 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN':
4272          {
4273            const {
4274              clientIds
4275            } = action;
4276  
4277            if (!action.blocks) {
4278              return state;
4279            }
4280  
4281            const mappedBlocks = mapBlockOrder(action.blocks);
4282            return (0,external_lodash_namespaceObject.flow)([nextState => (0,external_lodash_namespaceObject.omit)(nextState, action.replacedClientIds), nextState => ({ ...nextState,
4283              ...(0,external_lodash_namespaceObject.omit)(mappedBlocks, '')
4284            }), nextState => (0,external_lodash_namespaceObject.mapValues)(nextState, subState => (0,external_lodash_namespaceObject.reduce)(subState, (result, clientId) => {
4285              if (clientId === clientIds[0]) {
4286                return [...result, ...mappedBlocks['']];
4287              }
4288  
4289              if (clientIds.indexOf(clientId) === -1) {
4290                result.push(clientId);
4291              }
4292  
4293              return result;
4294            }, []))])(state);
4295          }
4296  
4297        case 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN':
4298          return (0,external_lodash_namespaceObject.flow)([// Remove inner block ordering for removed blocks.
4299          nextState => (0,external_lodash_namespaceObject.omit)(nextState, action.removedClientIds), // Remove deleted blocks from other blocks' orderings.
4300          nextState => (0,external_lodash_namespaceObject.mapValues)(nextState, subState => (0,external_lodash_namespaceObject.without)(subState, ...action.removedClientIds))])(state);
4301      }
4302  
4303      return state;
4304    },
4305  
4306    // While technically redundant data as the inverse of `order`, it serves as
4307    // an optimization for the selectors which derive the ancestry of a block.
4308    parents() {
4309      let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
4310      let action = arguments.length > 1 ? arguments[1] : undefined;
4311  
4312      switch (action.type) {
4313        case 'RECEIVE_BLOCKS':
4314          return { ...state,
4315            ...mapBlockParents(action.blocks)
4316          };
4317  
4318        case 'INSERT_BLOCKS':
4319          return { ...state,
4320            ...mapBlockParents(action.blocks, action.rootClientId || '')
4321          };
4322  
4323        case 'MOVE_BLOCKS_TO_POSITION':
4324          {
4325            return { ...state,
4326              ...action.clientIds.reduce((accumulator, id) => {
4327                accumulator[id] = action.toRootClientId || '';
4328                return accumulator;
4329              }, {})
4330            };
4331          }
4332  
4333        case 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN':
4334          return { ...(0,external_lodash_namespaceObject.omit)(state, action.replacedClientIds),
4335            ...mapBlockParents(action.blocks, state[action.clientIds[0]])
4336          };
4337  
4338        case 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN':
4339          return (0,external_lodash_namespaceObject.omit)(state, action.removedClientIds);
4340      }
4341  
4342      return state;
4343    },
4344  
4345    controlledInnerBlocks() {
4346      let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
4347      let {
4348        type,
4349        clientId,
4350        hasControlledInnerBlocks
4351      } = arguments.length > 1 ? arguments[1] : undefined;
4352  
4353      if (type === 'SET_HAS_CONTROLLED_INNER_BLOCKS') {
4354        return { ...state,
4355          [clientId]: hasControlledInnerBlocks
4356        };
4357      }
4358  
4359      return state;
4360    }
4361  
4362  });
4363  /**
4364   * Reducer returning typing state.
4365   *
4366   * @param {boolean} state  Current state.
4367   * @param {Object}  action Dispatched action.
4368   *
4369   * @return {boolean} Updated state.
4370   */
4371  
4372  function isTyping() {
4373    let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
4374    let action = arguments.length > 1 ? arguments[1] : undefined;
4375  
4376    switch (action.type) {
4377      case 'START_TYPING':
4378        return true;
4379  
4380      case 'STOP_TYPING':
4381        return false;
4382    }
4383  
4384    return state;
4385  }
4386  /**
4387   * Reducer returning dragged block client id.
4388   *
4389   * @param {string[]} state  Current state.
4390   * @param {Object}   action Dispatched action.
4391   *
4392   * @return {string[]} Updated state.
4393   */
4394  
4395  function draggedBlocks() {
4396    let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
4397    let action = arguments.length > 1 ? arguments[1] : undefined;
4398  
4399    switch (action.type) {
4400      case 'START_DRAGGING_BLOCKS':
4401        return action.clientIds;
4402  
4403      case 'STOP_DRAGGING_BLOCKS':
4404        return [];
4405    }
4406  
4407    return state;
4408  }
4409  /**
4410   * Reducer returning whether the caret is within formatted text.
4411   *
4412   * @param {boolean} state  Current state.
4413   * @param {Object}  action Dispatched action.
4414   *
4415   * @return {boolean} Updated state.
4416   */
4417  
4418  function isCaretWithinFormattedText() {
4419    let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
4420    let action = arguments.length > 1 ? arguments[1] : undefined;
4421  
4422    switch (action.type) {
4423      case 'ENTER_FORMATTED_TEXT':
4424        return true;
4425  
4426      case 'EXIT_FORMATTED_TEXT':
4427        return false;
4428    }
4429  
4430    return state;
4431  }
4432  /**
4433   * Internal helper reducer for selectionStart and selectionEnd. Can hold a block
4434   * selection, represented by an object with property clientId.
4435   *
4436   * @param {Object} state  Current state.
4437   * @param {Object} action Dispatched action.
4438   *
4439   * @return {Object} Updated state.
4440   */
4441  
4442  function selectionHelper() {
4443    let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
4444    let action = arguments.length > 1 ? arguments[1] : undefined;
4445  
4446    switch (action.type) {
4447      case 'CLEAR_SELECTED_BLOCK':
4448        {
4449          if (state.clientId) {
4450            return {};
4451          }
4452  
4453          return state;
4454        }
4455  
4456      case 'SELECT_BLOCK':
4457        if (action.clientId === state.clientId) {
4458          return state;
4459        }
4460  
4461        return {
4462          clientId: action.clientId
4463        };
4464  
4465      case 'REPLACE_INNER_BLOCKS':
4466      case 'INSERT_BLOCKS':
4467        {
4468          if (!action.updateSelection || !action.blocks.length) {
4469            return state;
4470          }
4471  
4472          return {
4473            clientId: action.blocks[0].clientId
4474          };
4475        }
4476  
4477      case 'REMOVE_BLOCKS':
4478        if (!action.clientIds || !action.clientIds.length || action.clientIds.indexOf(state.clientId) === -1) {
4479          return state;
4480        }
4481  
4482        return {};
4483  
4484      case 'REPLACE_BLOCKS':
4485        {
4486          if (action.clientIds.indexOf(state.clientId) === -1) {
4487            return state;
4488          }
4489  
4490          const blockToSelect = action.blocks[action.indexToSelect] || action.blocks[action.blocks.length - 1];
4491  
4492          if (!blockToSelect) {
4493            return {};
4494          }
4495  
4496          if (blockToSelect.clientId === state.clientId) {
4497            return state;
4498          }
4499  
4500          return {
4501            clientId: blockToSelect.clientId
4502          };
4503        }
4504    }
4505  
4506    return state;
4507  }
4508  /**
4509   * Reducer returning the selection state.
4510   *
4511   * @param {boolean} state  Current state.
4512   * @param {Object}  action Dispatched action.
4513   *
4514   * @return {boolean} Updated state.
4515   */
4516  
4517  
4518  function selection() {
4519    var _state$selectionStart, _state$selectionEnd, _state$selectionStart2, _state$selectionEnd2;
4520  
4521    let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
4522    let action = arguments.length > 1 ? arguments[1] : undefined;
4523  
4524    switch (action.type) {
4525      case 'SELECTION_CHANGE':
4526        if (action.clientId) {
4527          return {
4528            selectionStart: {
4529              clientId: action.clientId,
4530              attributeKey: action.attributeKey,
4531              offset: action.startOffset
4532            },
4533            selectionEnd: {
4534              clientId: action.clientId,
4535              attributeKey: action.attributeKey,
4536              offset: action.endOffset
4537            }
4538          };
4539        }
4540  
4541        return {
4542          selectionStart: action.start || state.selectionStart,
4543          selectionEnd: action.end || state.selectionEnd
4544        };
4545  
4546      case 'RESET_SELECTION':
4547        const {
4548          selectionStart,
4549          selectionEnd
4550        } = action;
4551        return {
4552          selectionStart,
4553          selectionEnd
4554        };
4555  
4556      case 'MULTI_SELECT':
4557        const {
4558          start,
4559          end
4560        } = action;
4561  
4562        if (start === ((_state$selectionStart = state.selectionStart) === null || _state$selectionStart === void 0 ? void 0 : _state$selectionStart.clientId) && end === ((_state$selectionEnd = state.selectionEnd) === null || _state$selectionEnd === void 0 ? void 0 : _state$selectionEnd.clientId)) {
4563          return state;
4564        }
4565  
4566        return {
4567          selectionStart: {
4568            clientId: start
4569          },
4570          selectionEnd: {
4571            clientId: end
4572          }
4573        };
4574  
4575      case 'RESET_BLOCKS':
4576        const startClientId = state === null || state === void 0 ? void 0 : (_state$selectionStart2 = state.selectionStart) === null || _state$selectionStart2 === void 0 ? void 0 : _state$selectionStart2.clientId;
4577        const endClientId = state === null || state === void 0 ? void 0 : (_state$selectionEnd2 = state.selectionEnd) === null || _state$selectionEnd2 === void 0 ? void 0 : _state$selectionEnd2.clientId; // Do nothing if there's no selected block.
4578  
4579        if (!startClientId && !endClientId) {
4580          return state;
4581        } // If the start of the selection won't exist after reset, remove selection.
4582  
4583  
4584        if (!action.blocks.some(block => block.clientId === startClientId)) {
4585          return {
4586            selectionStart: {},
4587            selectionEnd: {}
4588          };
4589        } // If the end of the selection won't exist after reset, collapse selection.
4590  
4591  
4592        if (!action.blocks.some(block => block.clientId === endClientId)) {
4593          return { ...state,
4594            selectionEnd: state.selectionStart
4595          };
4596        }
4597  
4598    }
4599  
4600    return {
4601      selectionStart: selectionHelper(state.selectionStart, action),
4602      selectionEnd: selectionHelper(state.selectionEnd, action)
4603    };
4604  }
4605  /**
4606   * Reducer returning whether the user is multi-selecting.
4607   *
4608   * @param {boolean} state  Current state.
4609   * @param {Object}  action Dispatched action.
4610   *
4611   * @return {boolean} Updated state.
4612   */
4613  
4614  function isMultiSelecting() {
4615    let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
4616    let action = arguments.length > 1 ? arguments[1] : undefined;
4617  
4618    switch (action.type) {
4619      case 'START_MULTI_SELECT':
4620        return true;
4621  
4622      case 'STOP_MULTI_SELECT':
4623        return false;
4624    }
4625  
4626    return state;
4627  }
4628  /**
4629   * Reducer returning whether selection is enabled.
4630   *
4631   * @param {boolean} state  Current state.
4632   * @param {Object}  action Dispatched action.
4633   *
4634   * @return {boolean} Updated state.
4635   */
4636  
4637  function isSelectionEnabled() {
4638    let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
4639    let action = arguments.length > 1 ? arguments[1] : undefined;
4640  
4641    switch (action.type) {
4642      case 'TOGGLE_SELECTION':
4643        return action.isSelectionEnabled;
4644    }
4645  
4646    return state;
4647  }
4648  /**
4649   * Reducer returning the initial block selection.
4650   *
4651   * Currently this in only used to restore the selection after block deletion and
4652   * pasting new content.This reducer should eventually be removed in favour of setting
4653   * selection directly.
4654   *
4655   * @param {boolean} state  Current state.
4656   * @param {Object}  action Dispatched action.
4657   *
4658   * @return {number|null} Initial position: 0, -1 or null.
4659   */
4660  
4661  function initialPosition() {
4662    let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
4663    let action = arguments.length > 1 ? arguments[1] : undefined;
4664  
4665    if (action.type === 'REPLACE_BLOCKS' && action.initialPosition !== undefined) {
4666      return action.initialPosition;
4667    } else if (['MULTI_SELECT', 'SELECT_BLOCK', 'RESET_SELECTION', 'INSERT_BLOCKS', 'REPLACE_INNER_BLOCKS'].includes(action.type)) {
4668      return action.initialPosition;
4669    }
4670  
4671    return state;
4672  }
4673  function blocksMode() {
4674    let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
4675    let action = arguments.length > 1 ? arguments[1] : undefined;
4676  
4677    if (action.type === 'TOGGLE_BLOCK_MODE') {
4678      const {
4679        clientId
4680      } = action;
4681      return { ...state,
4682        [clientId]: state[clientId] && state[clientId] === 'html' ? 'visual' : 'html'
4683      };
4684    }
4685  
4686    return state;
4687  }
4688  /**
4689   * Reducer returning the block insertion point visibility, either null if there
4690   * is not an explicit insertion point assigned, or an object of its `index` and
4691   * `rootClientId`.
4692   *
4693   * @param {Object} state  Current state.
4694   * @param {Object} action Dispatched action.
4695   *
4696   * @return {Object} Updated state.
4697   */
4698  
4699  function insertionPoint() {
4700    let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
4701    let action = arguments.length > 1 ? arguments[1] : undefined;
4702  
4703    switch (action.type) {
4704      case 'SHOW_INSERTION_POINT':
4705        const {
4706          rootClientId,
4707          index,
4708          __unstableWithInserter
4709        } = action;
4710        return {
4711          rootClientId,
4712          index,
4713          __unstableWithInserter
4714        };
4715  
4716      case 'HIDE_INSERTION_POINT':
4717        return null;
4718    }
4719  
4720    return state;
4721  }
4722  /**
4723   * Reducer returning whether the post blocks match the defined template or not.
4724   *
4725   * @param {Object} state  Current state.
4726   * @param {Object} action Dispatched action.
4727   *
4728   * @return {boolean} Updated state.
4729   */
4730  
4731  function template() {
4732    let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
4733      isValid: true
4734    };
4735    let action = arguments.length > 1 ? arguments[1] : undefined;
4736  
4737    switch (action.type) {
4738      case 'SET_TEMPLATE_VALIDITY':
4739        return { ...state,
4740          isValid: action.isValid
4741        };
4742    }
4743  
4744    return state;
4745  }
4746  /**
4747   * Reducer returning the editor setting.
4748   *
4749   * @param {Object} state  Current state.
4750   * @param {Object} action Dispatched action.
4751   *
4752   * @return {Object} Updated state.
4753   */
4754  
4755  function settings() {
4756    let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : SETTINGS_DEFAULTS;
4757    let action = arguments.length > 1 ? arguments[1] : undefined;
4758  
4759    switch (action.type) {
4760      case 'UPDATE_SETTINGS':
4761        return { ...state,
4762          ...action.settings
4763        };
4764    }
4765  
4766    return state;
4767  }
4768  /**
4769   * Reducer returning the user preferences.
4770   *
4771   * @param {Object} state  Current state.
4772   * @param {Object} action Dispatched action.
4773   *
4774   * @return {string} Updated state.
4775   */
4776  
4777  function preferences() {
4778    let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : PREFERENCES_DEFAULTS;
4779    let action = arguments.length > 1 ? arguments[1] : undefined;
4780  
4781    switch (action.type) {
4782      case 'INSERT_BLOCKS':
4783      case 'REPLACE_BLOCKS':
4784        return action.blocks.reduce((prevState, block) => {
4785          const {
4786            attributes,
4787            name: blockName
4788          } = block;
4789          const match = (0,external_wp_data_namespaceObject.select)(external_wp_blocks_namespaceObject.store).getActiveBlockVariation(blockName, attributes); // If a block variation match is found change the name to be the same with the
4790          // one that is used for block variations in the Inserter (`getItemFromVariation`).
4791  
4792          let id = match !== null && match !== void 0 && match.name ? `$blockName}/$match.name}` : blockName;
4793          const insert = {
4794            name: id
4795          };
4796  
4797          if (blockName === 'core/block') {
4798            insert.ref = attributes.ref;
4799            id += '/' + attributes.ref;
4800          }
4801  
4802          return { ...prevState,
4803            insertUsage: { ...prevState.insertUsage,
4804              [id]: {
4805                time: action.time,
4806                count: prevState.insertUsage[id] ? prevState.insertUsage[id].count + 1 : 1,
4807                insert
4808              }
4809            }
4810          };
4811        }, state);
4812    }
4813  
4814    return state;
4815  }
4816  /**
4817   * Reducer returning an object where each key is a block client ID, its value
4818   * representing the settings for its nested blocks.
4819   *
4820   * @param {Object} state  Current state.
4821   * @param {Object} action Dispatched action.
4822   *
4823   * @return {Object} Updated state.
4824   */
4825  
4826  const blockListSettings = function () {
4827    let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
4828    let action = arguments.length > 1 ? arguments[1] : undefined;
4829  
4830    switch (action.type) {
4831      // Even if the replaced blocks have the same client ID, our logic
4832      // should correct the state.
4833      case 'REPLACE_BLOCKS':
4834      case 'REMOVE_BLOCKS':
4835        {
4836          return (0,external_lodash_namespaceObject.omit)(state, action.clientIds);
4837        }
4838  
4839      case 'UPDATE_BLOCK_LIST_SETTINGS':
4840        {
4841          const {
4842            clientId
4843          } = action;
4844  
4845          if (!action.settings) {
4846            if (state.hasOwnProperty(clientId)) {
4847              return (0,external_lodash_namespaceObject.omit)(state, clientId);
4848            }
4849  
4850            return state;
4851          }
4852  
4853          if ((0,external_lodash_namespaceObject.isEqual)(state[clientId], action.settings)) {
4854            return state;
4855          }
4856  
4857          return { ...state,
4858            [clientId]: action.settings
4859          };
4860        }
4861    }
4862  
4863    return state;
4864  };
4865  /**
4866   * Reducer returning whether the navigation mode is enabled or not.
4867   *
4868   * @param {string} state  Current state.
4869   * @param {Object} action Dispatched action.
4870   *
4871   * @return {string} Updated state.
4872   */
4873  
4874  function isNavigationMode() {
4875    let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
4876    let action = arguments.length > 1 ? arguments[1] : undefined;
4877  
4878    // Let inserting block always trigger Edit mode.
4879    if (action.type === 'INSERT_BLOCKS') {
4880      return false;
4881    }
4882  
4883    if (action.type === 'SET_NAVIGATION_MODE') {
4884      return action.isNavigationMode;
4885    }
4886  
4887    return state;
4888  }
4889  /**
4890   * Reducer returning whether the block moving mode is enabled or not.
4891   *
4892   * @param {string|null} state  Current state.
4893   * @param {Object}      action Dispatched action.
4894   *
4895   * @return {string|null} Updated state.
4896   */
4897  
4898  function hasBlockMovingClientId() {
4899    let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
4900    let action = arguments.length > 1 ? arguments[1] : undefined;
4901  
4902    // Let inserting block always trigger Edit mode.
4903    if (action.type === 'SET_BLOCK_MOVING_MODE') {
4904      return action.hasBlockMovingClientId;
4905    }
4906  
4907    if (action.type === 'SET_NAVIGATION_MODE') {
4908      return null;
4909    }
4910  
4911    return state;
4912  }
4913  /**
4914   * Reducer return an updated state representing the most recent block attribute
4915   * update. The state is structured as an object where the keys represent the
4916   * client IDs of blocks, the values a subset of attributes from the most recent
4917   * block update. The state is always reset to null if the last action is
4918   * anything other than an attributes update.
4919   *
4920   * @param {Object<string,Object>} state  Current state.
4921   * @param {Object}                action Action object.
4922   *
4923   * @return {[string,Object]} Updated state.
4924   */
4925  
4926  function lastBlockAttributesChange(state, action) {
4927    switch (action.type) {
4928      case 'UPDATE_BLOCK':
4929        if (!action.updates.attributes) {
4930          break;
4931        }
4932  
4933        return {
4934          [action.clientId]: action.updates.attributes
4935        };
4936  
4937      case 'UPDATE_BLOCK_ATTRIBUTES':
4938        return action.clientIds.reduce((accumulator, id) => ({ ...accumulator,
4939          [id]: action.uniqueByBlock ? action.attributes[id] : action.attributes
4940        }), {});
4941    }
4942  
4943    return null;
4944  }
4945  /**
4946   * Reducer returning automatic change state.
4947   *
4948   * @param {boolean} state  Current state.
4949   * @param {Object}  action Dispatched action.
4950   *
4951   * @return {string} Updated state.
4952   */
4953  
4954  function automaticChangeStatus(state, action) {
4955    switch (action.type) {
4956      case 'MARK_AUTOMATIC_CHANGE':
4957        return 'pending';
4958  
4959      case 'MARK_AUTOMATIC_CHANGE_FINAL':
4960        if (state === 'pending') {
4961          return 'final';
4962        }
4963  
4964        return;
4965  
4966      case 'SELECTION_CHANGE':
4967        // As long as the state is not final, ignore any selection changes.
4968        if (state !== 'final') {
4969          return state;
4970        }
4971  
4972        return;
4973      // Undoing an automatic change should still be possible after mouse
4974      // move.
4975  
4976      case 'START_TYPING':
4977      case 'STOP_TYPING':
4978        return state;
4979    } // Reset the state by default (for any action not handled).
4980  
4981  }
4982  /**
4983   * Reducer returning current highlighted block.
4984   *
4985   * @param {boolean} state  Current highlighted block.
4986   * @param {Object}  action Dispatched action.
4987   *
4988   * @return {string} Updated state.
4989   */
4990  
4991  function highlightedBlock(state, action) {
4992    switch (action.type) {
4993      case 'TOGGLE_BLOCK_HIGHLIGHT':
4994        const {
4995          clientId,
4996          isHighlighted
4997        } = action;
4998  
4999        if (isHighlighted) {
5000          return clientId;
5001        } else if (state === clientId) {
5002          return null;
5003        }
5004  
5005        return state;
5006  
5007      case 'SELECT_BLOCK':
5008        if (action.clientId !== state) {
5009          return null;
5010        }
5011  
5012    }
5013  
5014    return state;
5015  }
5016  /**
5017   * Reducer returning the block insertion event list state.
5018   *
5019   * @param {Object} state  Current state.
5020   * @param {Object} action Dispatched action.
5021   *
5022   * @return {Object} Updated state.
5023   */
5024  
5025  function lastBlockInserted() {
5026    var _action$meta;
5027  
5028    let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
5029    let action = arguments.length > 1 ? arguments[1] : undefined;
5030  
5031    switch (action.type) {
5032      case 'INSERT_BLOCKS':
5033        if (!action.blocks.length) {
5034          return state;
5035        }
5036  
5037        const clientId = action.blocks[0].clientId;
5038        const source = (_action$meta = action.meta) === null || _action$meta === void 0 ? void 0 : _action$meta.source;
5039        return {
5040          clientId,
5041          source
5042        };
5043  
5044      case 'RESET_BLOCKS':
5045        return {};
5046    }
5047  
5048    return state;
5049  }
5050  /* harmony default export */ var reducer = ((0,external_wp_data_namespaceObject.combineReducers)({
5051    blocks,
5052    isTyping,
5053    draggedBlocks,
5054    isCaretWithinFormattedText,
5055    selection,
5056    isMultiSelecting,
5057    isSelectionEnabled,
5058    initialPosition,
5059    blocksMode,
5060    blockListSettings,
5061    insertionPoint,
5062    template,
5063    settings,
5064    preferences,
5065    lastBlockAttributesChange,
5066    isNavigationMode,
5067    hasBlockMovingClientId,
5068    automaticChangeStatus,
5069    highlightedBlock,
5070    lastBlockInserted
5071  }));
5072  
5073  ;// CONCATENATED MODULE: ./node_modules/rememo/es/rememo.js
5074  
5075  
5076  var LEAF_KEY, hasWeakMap;
5077  
5078  /**
5079   * Arbitrary value used as key for referencing cache object in WeakMap tree.
5080   *
5081   * @type {Object}
5082   */
5083  LEAF_KEY = {};
5084  
5085  /**
5086   * Whether environment supports WeakMap.
5087   *
5088   * @type {boolean}
5089   */
5090  hasWeakMap = typeof WeakMap !== 'undefined';
5091  
5092  /**
5093   * Returns the first argument as the sole entry in an array.
5094   *
5095   * @param {*} value Value to return.
5096   *
5097   * @return {Array} Value returned as entry in array.
5098   */
5099  function arrayOf( value ) {
5100      return [ value ];
5101  }
5102  
5103  /**
5104   * Returns true if the value passed is object-like, or false otherwise. A value
5105   * is object-like if it can support property assignment, e.g. object or array.
5106   *
5107   * @param {*} value Value to test.
5108   *
5109   * @return {boolean} Whether value is object-like.
5110   */
5111  function isObjectLike( value ) {
5112      return !! value && 'object' === typeof value;
5113  }
5114  
5115  /**
5116   * Creates and returns a new cache object.
5117   *
5118   * @return {Object} Cache object.
5119   */
5120  function createCache() {
5121      var cache = {
5122          clear: function() {
5123              cache.head = null;
5124          },
5125      };
5126  
5127      return cache;
5128  }
5129  
5130  /**
5131   * Returns true if entries within the two arrays are strictly equal by
5132   * reference from a starting index.
5133   *
5134   * @param {Array}  a         First array.
5135   * @param {Array}  b         Second array.
5136   * @param {number} fromIndex Index from which to start comparison.
5137   *
5138   * @return {boolean} Whether arrays are shallowly equal.
5139   */
5140  function isShallowEqual( a, b, fromIndex ) {
5141      var i;
5142  
5143      if ( a.length !== b.length ) {
5144          return false;
5145      }
5146  
5147      for ( i = fromIndex; i < a.length; i++ ) {
5148          if ( a[ i ] !== b[ i ] ) {
5149              return false;
5150          }
5151      }
5152  
5153      return true;
5154  }
5155  
5156  /**
5157   * Returns a memoized selector function. The getDependants function argument is
5158   * called before the memoized selector and is expected to return an immutable
5159   * reference or array of references on which the selector depends for computing
5160   * its own return value. The memoize cache is preserved only as long as those
5161   * dependant references remain the same. If getDependants returns a different
5162   * reference(s), the cache is cleared and the selector value regenerated.
5163   *
5164   * @param {Function} selector      Selector function.
5165   * @param {Function} getDependants Dependant getter returning an immutable
5166   *                                 reference or array of reference used in
5167   *                                 cache bust consideration.
5168   *
5169   * @return {Function} Memoized selector.
5170   */
5171  /* harmony default export */ function rememo(selector, getDependants ) {
5172      var rootCache, getCache;
5173  
5174      // Use object source as dependant if getter not provided
5175      if ( ! getDependants ) {
5176          getDependants = arrayOf;
5177      }
5178  
5179      /**
5180       * Returns the root cache. If WeakMap is supported, this is assigned to the
5181       * root WeakMap cache set, otherwise it is a shared instance of the default
5182       * cache object.
5183       *
5184       * @return {(WeakMap|Object)} Root cache object.
5185       */
5186  	function getRootCache() {
5187          return rootCache;
5188      }
5189  
5190      /**
5191       * Returns the cache for a given dependants array. When possible, a WeakMap
5192       * will be used to create a unique cache for each set of dependants. This
5193       * is feasible due to the nature of WeakMap in allowing garbage collection
5194       * to occur on entries where the key object is no longer referenced. Since
5195       * WeakMap requires the key to be an object, this is only possible when the
5196       * dependant is object-like. The root cache is created as a hierarchy where
5197       * each top-level key is the first entry in a dependants set, the value a
5198       * WeakMap where each key is the next dependant, and so on. This continues
5199       * so long as the dependants are object-like. If no dependants are object-
5200       * like, then the cache is shared across all invocations.
5201       *
5202       * @see isObjectLike
5203       *
5204       * @param {Array} dependants Selector dependants.
5205       *
5206       * @return {Object} Cache object.
5207       */
5208  	function getWeakMapCache( dependants ) {
5209          var caches = rootCache,
5210              isUniqueByDependants = true,
5211              i, dependant, map, cache;
5212  
5213          for ( i = 0; i < dependants.length; i++ ) {
5214              dependant = dependants[ i ];
5215  
5216              // Can only compose WeakMap from object-like key.
5217              if ( ! isObjectLike( dependant ) ) {
5218                  isUniqueByDependants = false;
5219                  break;
5220              }
5221  
5222              // Does current segment of cache already have a WeakMap?
5223              if ( caches.has( dependant ) ) {
5224                  // Traverse into nested WeakMap.
5225                  caches = caches.get( dependant );
5226              } else {
5227                  // Create, set, and traverse into a new one.
5228                  map = new WeakMap();
5229                  caches.set( dependant, map );
5230                  caches = map;
5231              }
5232          }
5233  
5234          // We use an arbitrary (but consistent) object as key for the last item
5235          // in the WeakMap to serve as our running cache.
5236          if ( ! caches.has( LEAF_KEY ) ) {
5237              cache = createCache();
5238              cache.isUniqueByDependants = isUniqueByDependants;
5239              caches.set( LEAF_KEY, cache );
5240          }
5241  
5242          return caches.get( LEAF_KEY );
5243      }
5244  
5245      // Assign cache handler by availability of WeakMap
5246      getCache = hasWeakMap ? getWeakMapCache : getRootCache;
5247  
5248      /**
5249       * Resets root memoization cache.
5250       */
5251  	function clear() {
5252          rootCache = hasWeakMap ? new WeakMap() : createCache();
5253      }
5254  
5255      // eslint-disable-next-line jsdoc/check-param-names
5256      /**
5257       * The augmented selector call, considering first whether dependants have
5258       * changed before passing it to underlying memoize function.
5259       *
5260       * @param {Object} source    Source object for derivation.
5261       * @param {...*}   extraArgs Additional arguments to pass to selector.
5262       *
5263       * @return {*} Selector result.
5264       */
5265  	function callSelector( /* source, ...extraArgs */ ) {
5266          var len = arguments.length,
5267              cache, node, i, args, dependants;
5268  
5269          // Create copy of arguments (avoid leaking deoptimization).
5270          args = new Array( len );
5271          for ( i = 0; i < len; i++ ) {
5272              args[ i ] = arguments[ i ];
5273          }
5274  
5275          dependants = getDependants.apply( null, args );
5276          cache = getCache( dependants );
5277  
5278          // If not guaranteed uniqueness by dependants (primitive type or lack
5279          // of WeakMap support), shallow compare against last dependants and, if
5280          // references have changed, destroy cache to recalculate result.
5281          if ( ! cache.isUniqueByDependants ) {
5282              if ( cache.lastDependants && ! isShallowEqual( dependants, cache.lastDependants, 0 ) ) {
5283                  cache.clear();
5284              }
5285  
5286              cache.lastDependants = dependants;
5287          }
5288  
5289          node = cache.head;
5290          while ( node ) {
5291              // Check whether node arguments match arguments
5292              if ( ! isShallowEqual( node.args, args, 1 ) ) {
5293                  node = node.next;
5294                  continue;
5295              }
5296  
5297              // At this point we can assume we've found a match
5298  
5299              // Surface matched node to head if not already
5300              if ( node !== cache.head ) {
5301                  // Adjust siblings to point to each other.
5302                  node.prev.next = node.next;
5303                  if ( node.next ) {
5304                      node.next.prev = node.prev;
5305                  }
5306  
5307                  node.next = cache.head;
5308                  node.prev = null;
5309                  cache.head.prev = node;
5310                  cache.head = node;
5311              }
5312  
5313              // Return immediately
5314              return node.val;
5315          }
5316  
5317          // No cached value found. Continue to insertion phase:
5318  
5319          node = {
5320              // Generate the result from original function
5321              val: selector.apply( null, args ),
5322          };
5323  
5324          // Avoid including the source object in the cache.
5325          args[ 0 ] = null;
5326          node.args = args;
5327  
5328          // Don't need to check whether node is already head, since it would
5329          // have been returned above already if it was
5330  
5331          // Shift existing head down list
5332          if ( cache.head ) {
5333              cache.head.prev = node;
5334              node.next = cache.head;
5335          }
5336  
5337          cache.head = node;
5338  
5339          return node.val;
5340      }
5341  
5342      callSelector.getDependants = getDependants;
5343      callSelector.clear = clear;
5344      clear();
5345  
5346      return callSelector;
5347  }
5348  
5349  ;// CONCATENATED MODULE: external ["wp","primitives"]
5350  var external_wp_primitives_namespaceObject = window["wp"]["primitives"];
5351  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/symbol.js
5352  
5353  
5354  /**
5355   * WordPress dependencies
5356   */
5357  
5358  const symbol = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
5359    xmlns: "http://www.w3.org/2000/svg",
5360    viewBox: "0 0 24 24"
5361  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
5362    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"
5363  }));
5364  /* harmony default export */ var library_symbol = (symbol);
5365  
5366  ;// CONCATENATED MODULE: external ["wp","richText"]
5367  var external_wp_richText_namespaceObject = window["wp"]["richText"];
5368  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/store/utils.js
5369  /**
5370   * Helper function that maps attribute definition properties to the
5371   * ones used by RichText utils like `create, toHTMLString, etc..`.
5372   *
5373   * @param {Object} attributeDefinition A block's attribute definition object.
5374   * @return {Object} The mapped object.
5375   */
5376  function mapRichTextSettings(attributeDefinition) {
5377    const {
5378      multiline: multilineTag,
5379      __unstableMultilineWrapperTags: multilineWrapperTags,
5380      __unstablePreserveWhiteSpace: preserveWhiteSpace
5381    } = attributeDefinition;
5382    return {
5383      multilineTag,
5384      multilineWrapperTags,
5385      preserveWhiteSpace
5386    };
5387  }
5388  
5389  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/store/selectors.js
5390  /**
5391   * External dependencies
5392   */
5393  
5394  
5395  /**
5396   * WordPress dependencies
5397   */
5398  
5399  
5400  
5401  
5402  
5403  
5404  
5405  /**
5406   * Internal dependencies
5407   */
5408  
5409  
5410  /**
5411   * A block selection object.
5412   *
5413   * @typedef {Object} WPBlockSelection
5414   *
5415   * @property {string} clientId     A block client ID.
5416   * @property {string} attributeKey A block attribute key.
5417   * @property {number} offset       An attribute value offset, based on the rich
5418   *                                 text value. See `wp.richText.create`.
5419   */
5420  // Module constants.
5421  
5422  const MILLISECONDS_PER_HOUR = 3600 * 1000;
5423  const MILLISECONDS_PER_DAY = 24 * 3600 * 1000;
5424  const MILLISECONDS_PER_WEEK = 7 * 24 * 3600 * 1000;
5425  /**
5426   * Shared reference to an empty array for cases where it is important to avoid
5427   * returning a new array reference on every invocation, as in a connected or
5428   * other pure component which performs `shouldComponentUpdate` check on props.
5429   * This should be used as a last resort, since the normalized data should be
5430   * maintained by the reducer result in state.
5431   *
5432   * @type {Array}
5433   */
5434  
5435  const EMPTY_ARRAY = [];
5436  /**
5437   * Returns a block's name given its client ID, or null if no block exists with
5438   * the client ID.
5439   *
5440   * @param {Object} state    Editor state.
5441   * @param {string} clientId Block client ID.
5442   *
5443   * @return {string} Block name.
5444   */
5445  
5446  function getBlockName(state, clientId) {
5447    const block = state.blocks.byClientId[clientId];
5448    const socialLinkName = 'core/social-link';
5449  
5450    if (external_wp_element_namespaceObject.Platform.OS !== 'web' && (block === null || block === void 0 ? void 0 : block.name) === socialLinkName) {
5451      const attributes = state.blocks.attributes[clientId];
5452      const {
5453        service
5454      } = attributes;
5455      return service ? `$socialLinkName}-$service}` : socialLinkName;
5456    }
5457  
5458    return block ? block.name : null;
5459  }
5460  /**
5461   * Returns whether a block is valid or not.
5462   *
5463   * @param {Object} state    Editor state.
5464   * @param {string} clientId Block client ID.
5465   *
5466   * @return {boolean} Is Valid.
5467   */
5468  
5469  function isBlockValid(state, clientId) {
5470    const block = state.blocks.byClientId[clientId];
5471    return !!block && block.isValid;
5472  }
5473  /**
5474   * Returns a block's attributes given its client ID, or null if no block exists with
5475   * the client ID.
5476   *
5477   * @param {Object} state    Editor state.
5478   * @param {string} clientId Block client ID.
5479   *
5480   * @return {Object?} Block attributes.
5481   */
5482  
5483  function getBlockAttributes(state, clientId) {
5484    const block = state.blocks.byClientId[clientId];
5485  
5486    if (!block) {
5487      return null;
5488    }
5489  
5490    return state.blocks.attributes[clientId];
5491  }
5492  /**
5493   * Returns a block given its client ID. This is a parsed copy of the block,
5494   * containing its `blockName`, `clientId`, and current `attributes` state. This
5495   * is not the block's registration settings, which must be retrieved from the
5496   * blocks module registration store.
5497   *
5498   * getBlock recurses through its inner blocks until all its children blocks have
5499   * been retrieved. Note that getBlock will not return the child inner blocks of
5500   * an inner block controller. This is because an inner block controller syncs
5501   * itself with its own entity, and should therefore not be included with the
5502   * blocks of a different entity. For example, say you call `getBlocks( TP )` to
5503   * get the blocks of a template part. If another template part is a child of TP,
5504   * then the nested template part's child blocks will not be returned. This way,
5505   * the template block itself is considered part of the parent, but the children
5506   * are not.
5507   *
5508   * @param {Object} state    Editor state.
5509   * @param {string} clientId Block client ID.
5510   *
5511   * @return {Object} Parsed block object.
5512   */
5513  
5514  function getBlock(state, clientId) {
5515    const block = state.blocks.byClientId[clientId];
5516  
5517    if (!block) {
5518      return null;
5519    }
5520  
5521    return state.blocks.tree[clientId];
5522  }
5523  const __unstableGetBlockWithoutInnerBlocks = rememo((state, clientId) => {
5524    const block = state.blocks.byClientId[clientId];
5525  
5526    if (!block) {
5527      return null;
5528    }
5529  
5530    return { ...block,
5531      attributes: getBlockAttributes(state, clientId)
5532    };
5533  }, (state, clientId) => [state.blocks.byClientId[clientId], state.blocks.attributes[clientId]]);
5534  /**
5535   * Returns all block objects for the current post being edited as an array in
5536   * the order they appear in the post. Note that this will exclude child blocks
5537   * of nested inner block controllers.
5538   *
5539   * @param {Object}  state        Editor state.
5540   * @param {?string} rootClientId Optional root client ID of block list.
5541   *
5542   * @return {Object[]} Post blocks.
5543   */
5544  
5545  function getBlocks(state, rootClientId) {
5546    var _state$blocks$tree$tr;
5547  
5548    const treeKey = !rootClientId || !areInnerBlocksControlled(state, rootClientId) ? rootClientId || '' : 'controlled||' + rootClientId;
5549    return ((_state$blocks$tree$tr = state.blocks.tree[treeKey]) === null || _state$blocks$tree$tr === void 0 ? void 0 : _state$blocks$tree$tr.innerBlocks) || EMPTY_ARRAY;
5550  }
5551  /**
5552   * Returns a stripped down block object containing only its client ID,
5553   * and its inner blocks' client IDs.
5554   *
5555   * @param {Object} state    Editor state.
5556   * @param {string} clientId Client ID of the block to get.
5557   *
5558   * @return {Object} Client IDs of the post blocks.
5559   */
5560  
5561  const __unstableGetClientIdWithClientIdsTree = rememo((state, clientId) => ({
5562    clientId,
5563    innerBlocks: __unstableGetClientIdsTree(state, clientId)
5564  }), state => [state.blocks.order]);
5565  /**
5566   * Returns the block tree represented in the block-editor store from the
5567   * given root, consisting of stripped down block objects containing only
5568   * their client IDs, and their inner blocks' client IDs.
5569   *
5570   * @param {Object}  state        Editor state.
5571   * @param {?string} rootClientId Optional root client ID of block list.
5572   *
5573   * @return {Object[]} Client IDs of the post blocks.
5574   */
5575  
5576  const __unstableGetClientIdsTree = rememo(function (state) {
5577    let rootClientId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
5578    return (0,external_lodash_namespaceObject.map)(getBlockOrder(state, rootClientId), clientId => __unstableGetClientIdWithClientIdsTree(state, clientId));
5579  }, state => [state.blocks.order]);
5580  /**
5581   * Returns an array containing the clientIds of all descendants of the blocks
5582   * given. Returned ids are ordered first by the order of the ids given, then
5583   * by the order that they appear in the editor.
5584   *
5585   * @param {Object} state     Global application state.
5586   * @param {Array}  clientIds Array of blocks to inspect.
5587   *
5588   * @return {Array} ids of descendants.
5589   */
5590  
5591  const getClientIdsOfDescendants = rememo((state, clientIds) => {
5592    const collectedIds = [];
5593  
5594    for (const givenId of clientIds) {
5595      for (const descendantId of getBlockOrder(state, givenId)) {
5596        collectedIds.push(descendantId, ...getClientIdsOfDescendants(state, [descendantId]));
5597      }
5598    }
5599  
5600    return collectedIds;
5601  }, state => [state.blocks.order]);
5602  /**
5603   * Returns an array containing the clientIds of the top-level blocks and
5604   * their descendants of any depth (for nested blocks). Ids are returned
5605   * in the same order that they appear in the editor.
5606   *
5607   * @param {Object} state Global application state.
5608   *
5609   * @return {Array} ids of top-level and descendant blocks.
5610   */
5611  
5612  const getClientIdsWithDescendants = rememo(state => {
5613    const collectedIds = [];
5614  
5615    for (const topLevelId of getBlockOrder(state)) {
5616      collectedIds.push(topLevelId, ...getClientIdsOfDescendants(state, [topLevelId]));
5617    }
5618  
5619    return collectedIds;
5620  }, state => [state.blocks.order]);
5621  /**
5622   * Returns the total number of blocks, or the total number of blocks with a specific name in a post.
5623   * The number returned includes nested blocks.
5624   *
5625   * @param {Object}  state     Global application state.
5626   * @param {?string} blockName Optional block name, if specified only blocks of that type will be counted.
5627   *
5628   * @return {number} Number of blocks in the post, or number of blocks with name equal to blockName.
5629   */
5630  
5631  const getGlobalBlockCount = rememo((state, blockName) => {
5632    const clientIds = getClientIdsWithDescendants(state);
5633  
5634    if (!blockName) {
5635      return clientIds.length;
5636    }
5637  
5638    return (0,external_lodash_namespaceObject.reduce)(clientIds, (accumulator, clientId) => {
5639      const block = state.blocks.byClientId[clientId];
5640      return block.name === blockName ? accumulator + 1 : accumulator;
5641    }, 0);
5642  }, state => [state.blocks.order, state.blocks.byClientId]);
5643  /**
5644   * Returns all global blocks that match a blockName. Results include nested blocks.
5645   *
5646   * @param {Object}  state     Global application state.
5647   * @param {?string} blockName Optional block name, if not specified, returns an empty array.
5648   *
5649   * @return {Array} Array of clientIds of blocks with name equal to blockName.
5650   */
5651  
5652  const __experimentalGetGlobalBlocksByName = rememo((state, blockName) => {
5653    if (!blockName) {
5654      return EMPTY_ARRAY;
5655    }
5656  
5657    const clientIds = getClientIdsWithDescendants(state);
5658    const foundBlocks = clientIds.filter(clientId => {
5659      const block = state.blocks.byClientId[clientId];
5660      return block.name === blockName;
5661    });
5662    return foundBlocks.length > 0 ? foundBlocks : EMPTY_ARRAY;
5663  }, state => [state.blocks.order, state.blocks.byClientId]);
5664  /**
5665   * Given an array of block client IDs, returns the corresponding array of block
5666   * objects.
5667   *
5668   * @param {Object}   state     Editor state.
5669   * @param {string[]} clientIds Client IDs for which blocks are to be returned.
5670   *
5671   * @return {WPBlock[]} Block objects.
5672   */
5673  
5674  const getBlocksByClientId = rememo((state, clientIds) => (0,external_lodash_namespaceObject.map)((0,external_lodash_namespaceObject.castArray)(clientIds), clientId => getBlock(state, clientId)), (state, clientIds) => (0,external_lodash_namespaceObject.map)((0,external_lodash_namespaceObject.castArray)(clientIds), clientId => state.blocks.tree[clientId]));
5675  /**
5676   * Returns the number of blocks currently present in the post.
5677   *
5678   * @param {Object}  state        Editor state.
5679   * @param {?string} rootClientId Optional root client ID of block list.
5680   *
5681   * @return {number} Number of blocks in the post.
5682   */
5683  
5684  function getBlockCount(state, rootClientId) {
5685    return getBlockOrder(state, rootClientId).length;
5686  }
5687  /**
5688   * Returns the current selection start block client ID, attribute key and text
5689   * offset.
5690   *
5691   * @param {Object} state Block editor state.
5692   *
5693   * @return {WPBlockSelection} Selection start information.
5694   */
5695  
5696  function getSelectionStart(state) {
5697    return state.selection.selectionStart;
5698  }
5699  /**
5700   * Returns the current selection end block client ID, attribute key and text
5701   * offset.
5702   *
5703   * @param {Object} state Block editor state.
5704   *
5705   * @return {WPBlockSelection} Selection end information.
5706   */
5707  
5708  function getSelectionEnd(state) {
5709    return state.selection.selectionEnd;
5710  }
5711  /**
5712   * Returns the current block selection start. This value may be null, and it
5713   * may represent either a singular block selection or multi-selection start.
5714   * A selection is singular if its start and end match.
5715   *
5716   * @param {Object} state Global application state.
5717   *
5718   * @return {?string} Client ID of block selection start.
5719   */
5720  
5721  function getBlockSelectionStart(state) {
5722    return state.selection.selectionStart.clientId;
5723  }
5724  /**
5725   * Returns the current block selection end. This value may be null, and it
5726   * may represent either a singular block selection or multi-selection end.
5727   * A selection is singular if its start and end match.
5728   *
5729   * @param {Object} state Global application state.
5730   *
5731   * @return {?string} Client ID of block selection end.
5732   */
5733  
5734  function getBlockSelectionEnd(state) {
5735    return state.selection.selectionEnd.clientId;
5736  }
5737  /**
5738   * Returns the number of blocks currently selected in the post.
5739   *
5740   * @param {Object} state Global application state.
5741   *
5742   * @return {number} Number of blocks selected in the post.
5743   */
5744  
5745  function getSelectedBlockCount(state) {
5746    const multiSelectedBlockCount = getMultiSelectedBlockClientIds(state).length;
5747  
5748    if (multiSelectedBlockCount) {
5749      return multiSelectedBlockCount;
5750    }
5751  
5752    return state.selection.selectionStart.clientId ? 1 : 0;
5753  }
5754  /**
5755   * Returns true if there is a single selected block, or false otherwise.
5756   *
5757   * @param {Object} state Editor state.
5758   *
5759   * @return {boolean} Whether a single block is selected.
5760   */
5761  
5762  function hasSelectedBlock(state) {
5763    const {
5764      selectionStart,
5765      selectionEnd
5766    } = state.selection;
5767    return !!selectionStart.clientId && selectionStart.clientId === selectionEnd.clientId;
5768  }
5769  /**
5770   * Returns the currently selected block client ID, or null if there is no
5771   * selected block.
5772   *
5773   * @param {Object} state Editor state.
5774   *
5775   * @return {?string} Selected block client ID.
5776   */
5777  
5778  function getSelectedBlockClientId(state) {
5779    const {
5780      selectionStart,
5781      selectionEnd
5782    } = state.selection;
5783    const {
5784      clientId
5785    } = selectionStart;
5786  
5787    if (!clientId || clientId !== selectionEnd.clientId) {
5788      return null;
5789    }
5790  
5791    return clientId;
5792  }
5793  /**
5794   * Returns the currently selected block, or null if there is no selected block.
5795   *
5796   * @param {Object} state Global application state.
5797   *
5798   * @return {?Object} Selected block.
5799   */
5800  
5801  function getSelectedBlock(state) {
5802    const clientId = getSelectedBlockClientId(state);
5803    return clientId ? getBlock(state, clientId) : null;
5804  }
5805  /**
5806   * Given a block client ID, returns the root block from which the block is
5807   * nested, an empty string for top-level blocks, or null if the block does not
5808   * exist.
5809   *
5810   * @param {Object} state    Editor state.
5811   * @param {string} clientId Block from which to find root client ID.
5812   *
5813   * @return {?string} Root client ID, if exists
5814   */
5815  
5816  function getBlockRootClientId(state, clientId) {
5817    return state.blocks.parents[clientId] !== undefined ? state.blocks.parents[clientId] : null;
5818  }
5819  /**
5820   * Given a block client ID, returns the list of all its parents from top to bottom.
5821   *
5822   * @param {Object}  state     Editor state.
5823   * @param {string}  clientId  Block from which to find root client ID.
5824   * @param {boolean} ascending Order results from bottom to top (true) or top to bottom (false).
5825   *
5826   * @return {Array} ClientIDs of the parent blocks.
5827   */
5828  
5829  const getBlockParents = rememo(function (state, clientId) {
5830    let ascending = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
5831    const parents = [];
5832    let current = clientId;
5833  
5834    while (!!state.blocks.parents[current]) {
5835      current = state.blocks.parents[current];
5836      parents.push(current);
5837    }
5838  
5839    return ascending ? parents : parents.reverse();
5840  }, state => [state.blocks.parents]);
5841  /**
5842   * Given a block client ID and a block name, returns the list of all its parents
5843   * from top to bottom, filtered by the given name(s). For example, if passed
5844   * 'core/group' as the blockName, it will only return parents which are group
5845   * blocks. If passed `[ 'core/group', 'core/cover']`, as the blockName, it will
5846   * return parents which are group blocks and parents which are cover blocks.
5847   *
5848   * @param {Object}          state     Editor state.
5849   * @param {string}          clientId  Block from which to find root client ID.
5850   * @param {string|string[]} blockName Block name(s) to filter.
5851   * @param {boolean}         ascending Order results from bottom to top (true) or top to bottom (false).
5852   *
5853   * @return {Array} ClientIDs of the parent blocks.
5854   */
5855  
5856  const getBlockParentsByBlockName = rememo(function (state, clientId, blockName) {
5857    let ascending = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
5858    const parents = getBlockParents(state, clientId, ascending);
5859    return (0,external_lodash_namespaceObject.map)((0,external_lodash_namespaceObject.filter)((0,external_lodash_namespaceObject.map)(parents, id => ({
5860      id,
5861      name: getBlockName(state, id)
5862    })), _ref => {
5863      let {
5864        name
5865      } = _ref;
5866  
5867      if (Array.isArray(blockName)) {
5868        return blockName.includes(name);
5869      }
5870  
5871      return name === blockName;
5872    }), _ref2 => {
5873      let {
5874        id
5875      } = _ref2;
5876      return id;
5877    });
5878  }, state => [state.blocks.parents]);
5879  /**
5880   * Given a block client ID, returns the root of the hierarchy from which the block is nested, return the block itself for root level blocks.
5881   *
5882   * @param {Object} state    Editor state.
5883   * @param {string} clientId Block from which to find root client ID.
5884   *
5885   * @return {string} Root client ID
5886   */
5887  
5888  function getBlockHierarchyRootClientId(state, clientId) {
5889    let current = clientId;
5890    let parent;
5891  
5892    do {
5893      parent = current;
5894      current = state.blocks.parents[current];
5895    } while (current);
5896  
5897    return parent;
5898  }
5899  /**
5900   * Given a block client ID, returns the lowest common ancestor with selected client ID.
5901   *
5902   * @param {Object} state    Editor state.
5903   * @param {string} clientId Block from which to find common ancestor client ID.
5904   *
5905   * @return {string} Common ancestor client ID or undefined
5906   */
5907  
5908  function getLowestCommonAncestorWithSelectedBlock(state, clientId) {
5909    const selectedId = getSelectedBlockClientId(state);
5910    const clientParents = [...getBlockParents(state, clientId), clientId];
5911    const selectedParents = [...getBlockParents(state, selectedId), selectedId];
5912    let lowestCommonAncestor;
5913    const maxDepth = Math.min(clientParents.length, selectedParents.length);
5914  
5915    for (let index = 0; index < maxDepth; index++) {
5916      if (clientParents[index] === selectedParents[index]) {
5917        lowestCommonAncestor = clientParents[index];
5918      } else {
5919        break;
5920      }
5921    }
5922  
5923    return lowestCommonAncestor;
5924  }
5925  /**
5926   * Returns the client ID of the block adjacent one at the given reference
5927   * startClientId and modifier directionality. Defaults start startClientId to
5928   * the selected block, and direction as next block. Returns null if there is no
5929   * adjacent block.
5930   *
5931   * @param {Object}  state         Editor state.
5932   * @param {?string} startClientId Optional client ID of block from which to
5933   *                                search.
5934   * @param {?number} modifier      Directionality multiplier (1 next, -1
5935   *                                previous).
5936   *
5937   * @return {?string} Return the client ID of the block, or null if none exists.
5938   */
5939  
5940  function getAdjacentBlockClientId(state, startClientId) {
5941    let modifier = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
5942  
5943    // Default to selected block.
5944    if (startClientId === undefined) {
5945      startClientId = getSelectedBlockClientId(state);
5946    } // Try multi-selection starting at extent based on modifier.
5947  
5948  
5949    if (startClientId === undefined) {
5950      if (modifier < 0) {
5951        startClientId = getFirstMultiSelectedBlockClientId(state);
5952      } else {
5953        startClientId = getLastMultiSelectedBlockClientId(state);
5954      }
5955    } // Validate working start client ID.
5956  
5957  
5958    if (!startClientId) {
5959      return null;
5960    } // Retrieve start block root client ID, being careful to allow the falsey
5961    // empty string top-level root by explicitly testing against null.
5962  
5963  
5964    const rootClientId = getBlockRootClientId(state, startClientId);
5965  
5966    if (rootClientId === null) {
5967      return null;
5968    }
5969  
5970    const {
5971      order
5972    } = state.blocks;
5973    const orderSet = order[rootClientId];
5974    const index = orderSet.indexOf(startClientId);
5975    const nextIndex = index + 1 * modifier; // Block was first in set and we're attempting to get previous.
5976  
5977    if (nextIndex < 0) {
5978      return null;
5979    } // Block was last in set and we're attempting to get next.
5980  
5981  
5982    if (nextIndex === orderSet.length) {
5983      return null;
5984    } // Assume incremented index is within the set.
5985  
5986  
5987    return orderSet[nextIndex];
5988  }
5989  /**
5990   * Returns the previous block's client ID from the given reference start ID.
5991   * Defaults start to the selected block. Returns null if there is no previous
5992   * block.
5993   *
5994   * @param {Object}  state         Editor state.
5995   * @param {?string} startClientId Optional client ID of block from which to
5996   *                                search.
5997   *
5998   * @return {?string} Adjacent block's client ID, or null if none exists.
5999   */
6000  
6001  function getPreviousBlockClientId(state, startClientId) {
6002    return getAdjacentBlockClientId(state, startClientId, -1);
6003  }
6004  /**
6005   * Returns the next block's client ID from the given reference start ID.
6006   * Defaults start to the selected block. Returns null if there is no next
6007   * block.
6008   *
6009   * @param {Object}  state         Editor state.
6010   * @param {?string} startClientId Optional client ID of block from which to
6011   *                                search.
6012   *
6013   * @return {?string} Adjacent block's client ID, or null if none exists.
6014   */
6015  
6016  function getNextBlockClientId(state, startClientId) {
6017    return getAdjacentBlockClientId(state, startClientId, 1);
6018  }
6019  /* eslint-disable jsdoc/valid-types */
6020  
6021  /**
6022   * Returns the initial caret position for the selected block.
6023   * This position is to used to position the caret properly when the selected block changes.
6024   * If the current block is not a RichText, having initial position set to 0 means "focus block"
6025   *
6026   * @param {Object} state Global application state.
6027   *
6028   * @return {0|-1|null} Initial position.
6029   */
6030  
6031  function getSelectedBlocksInitialCaretPosition(state) {
6032    /* eslint-enable jsdoc/valid-types */
6033    return state.initialPosition;
6034  }
6035  /**
6036   * Returns the current selection set of block client IDs (multiselection or single selection).
6037   *
6038   * @param {Object} state Editor state.
6039   *
6040   * @return {Array} Multi-selected block client IDs.
6041   */
6042  
6043  const getSelectedBlockClientIds = rememo(state => {
6044    const {
6045      selectionStart,
6046      selectionEnd
6047    } = state.selection;
6048  
6049    if (selectionStart.clientId === undefined || selectionEnd.clientId === undefined) {
6050      return EMPTY_ARRAY;
6051    }
6052  
6053    if (selectionStart.clientId === selectionEnd.clientId) {
6054      return [selectionStart.clientId];
6055    } // Retrieve root client ID to aid in retrieving relevant nested block
6056    // order, being careful to allow the falsey empty string top-level root
6057    // by explicitly testing against null.
6058  
6059  
6060    const rootClientId = getBlockRootClientId(state, selectionStart.clientId);
6061  
6062    if (rootClientId === null) {
6063      return EMPTY_ARRAY;
6064    }
6065  
6066    const blockOrder = getBlockOrder(state, rootClientId);
6067    const startIndex = blockOrder.indexOf(selectionStart.clientId);
6068    const endIndex = blockOrder.indexOf(selectionEnd.clientId);
6069  
6070    if (startIndex > endIndex) {
6071      return blockOrder.slice(endIndex, startIndex + 1);
6072    }
6073  
6074    return blockOrder.slice(startIndex, endIndex + 1);
6075  }, state => [state.blocks.order, state.selection.selectionStart.clientId, state.selection.selectionEnd.clientId]);
6076  /**
6077   * Returns the current multi-selection set of block client IDs, or an empty
6078   * array if there is no multi-selection.
6079   *
6080   * @param {Object} state Editor state.
6081   *
6082   * @return {Array} Multi-selected block client IDs.
6083   */
6084  
6085  function getMultiSelectedBlockClientIds(state) {
6086    const {
6087      selectionStart,
6088      selectionEnd
6089    } = state.selection;
6090  
6091    if (selectionStart.clientId === selectionEnd.clientId) {
6092      return EMPTY_ARRAY;
6093    }
6094  
6095    return getSelectedBlockClientIds(state);
6096  }
6097  /**
6098   * Returns the current multi-selection set of blocks, or an empty array if
6099   * there is no multi-selection.
6100   *
6101   * @param {Object} state Editor state.
6102   *
6103   * @return {Array} Multi-selected block objects.
6104   */
6105  
6106  const getMultiSelectedBlocks = rememo(state => {
6107    const multiSelectedBlockClientIds = getMultiSelectedBlockClientIds(state);
6108  
6109    if (!multiSelectedBlockClientIds.length) {
6110      return EMPTY_ARRAY;
6111    }
6112  
6113    return multiSelectedBlockClientIds.map(clientId => getBlock(state, clientId));
6114  }, state => [...getSelectedBlockClientIds.getDependants(state), state.blocks.byClientId, state.blocks.order, state.blocks.attributes]);
6115  /**
6116   * Returns the client ID of the first block in the multi-selection set, or null
6117   * if there is no multi-selection.
6118   *
6119   * @param {Object} state Editor state.
6120   *
6121   * @return {?string} First block client ID in the multi-selection set.
6122   */
6123  
6124  function getFirstMultiSelectedBlockClientId(state) {
6125    return (0,external_lodash_namespaceObject.first)(getMultiSelectedBlockClientIds(state)) || null;
6126  }
6127  /**
6128   * Returns the client ID of the last block in the multi-selection set, or null
6129   * if there is no multi-selection.
6130   *
6131   * @param {Object} state Editor state.
6132   *
6133   * @return {?string} Last block client ID in the multi-selection set.
6134   */
6135  
6136  function getLastMultiSelectedBlockClientId(state) {
6137    return (0,external_lodash_namespaceObject.last)(getMultiSelectedBlockClientIds(state)) || null;
6138  }
6139  /**
6140   * Returns true if a multi-selection exists, and the block corresponding to the
6141   * specified client ID is the first block of the multi-selection set, or false
6142   * otherwise.
6143   *
6144   * @param {Object} state    Editor state.
6145   * @param {string} clientId Block client ID.
6146   *
6147   * @return {boolean} Whether block is first in multi-selection.
6148   */
6149  
6150  function isFirstMultiSelectedBlock(state, clientId) {
6151    return getFirstMultiSelectedBlockClientId(state) === clientId;
6152  }
6153  /**
6154   * Returns true if the client ID occurs within the block multi-selection, or
6155   * false otherwise.
6156   *
6157   * @param {Object} state    Editor state.
6158   * @param {string} clientId Block client ID.
6159   *
6160   * @return {boolean} Whether block is in multi-selection set.
6161   */
6162  
6163  function isBlockMultiSelected(state, clientId) {
6164    return getMultiSelectedBlockClientIds(state).indexOf(clientId) !== -1;
6165  }
6166  /**
6167   * Returns true if an ancestor of the block is multi-selected, or false
6168   * otherwise.
6169   *
6170   * @param {Object} state    Editor state.
6171   * @param {string} clientId Block client ID.
6172   *
6173   * @return {boolean} Whether an ancestor of the block is in multi-selection
6174   *                   set.
6175   */
6176  
6177  const isAncestorMultiSelected = rememo((state, clientId) => {
6178    let ancestorClientId = clientId;
6179    let isMultiSelected = false;
6180  
6181    while (ancestorClientId && !isMultiSelected) {
6182      ancestorClientId = getBlockRootClientId(state, ancestorClientId);
6183      isMultiSelected = isBlockMultiSelected(state, ancestorClientId);
6184    }
6185  
6186    return isMultiSelected;
6187  }, state => [state.blocks.order, state.selection.selectionStart.clientId, state.selection.selectionEnd.clientId]);
6188  /**
6189   * Returns the client ID of the block which begins the multi-selection set, or
6190   * null if there is no multi-selection.
6191   *
6192   * This is not necessarily the first client ID in the selection.
6193   *
6194   * @see getFirstMultiSelectedBlockClientId
6195   *
6196   * @param {Object} state Editor state.
6197   *
6198   * @return {?string} Client ID of block beginning multi-selection.
6199   */
6200  
6201  function getMultiSelectedBlocksStartClientId(state) {
6202    const {
6203      selectionStart,
6204      selectionEnd
6205    } = state.selection;
6206  
6207    if (selectionStart.clientId === selectionEnd.clientId) {
6208      return null;
6209    }
6210  
6211    return selectionStart.clientId || null;
6212  }
6213  /**
6214   * Returns the client ID of the block which ends the multi-selection set, or
6215   * null if there is no multi-selection.
6216   *
6217   * This is not necessarily the last client ID in the selection.
6218   *
6219   * @see getLastMultiSelectedBlockClientId
6220   *
6221   * @param {Object} state Editor state.
6222   *
6223   * @return {?string} Client ID of block ending multi-selection.
6224   */
6225  
6226  function getMultiSelectedBlocksEndClientId(state) {
6227    const {
6228      selectionStart,
6229      selectionEnd
6230    } = state.selection;
6231  
6232    if (selectionStart.clientId === selectionEnd.clientId) {
6233      return null;
6234    }
6235  
6236    return selectionEnd.clientId || null;
6237  }
6238  /**
6239   * Returns true if the selection is not partial.
6240   *
6241   * @param {Object} state Editor state.
6242   *
6243   * @return {boolean} Whether the selection is mergeable.
6244   */
6245  
6246  function __unstableIsFullySelected(state) {
6247    const selectionAnchor = getSelectionStart(state);
6248    const selectionFocus = getSelectionEnd(state);
6249    return !selectionAnchor.attributeKey && !selectionFocus.attributeKey && typeof selectionAnchor.offset === 'undefined' && typeof selectionFocus.offset === 'undefined';
6250  }
6251  /**
6252   * Returns true if the selection is collapsed.
6253   *
6254   * @param {Object} state Editor state.
6255   *
6256   * @return {boolean} Whether the selection is collapsed.
6257   */
6258  
6259  function __unstableIsSelectionCollapsed(state) {
6260    const selectionAnchor = getSelectionStart(state);
6261    const selectionFocus = getSelectionEnd(state);
6262    return !!selectionAnchor && !!selectionFocus && selectionAnchor.clientId === selectionFocus.clientId && selectionAnchor.attributeKey === selectionFocus.attributeKey && selectionAnchor.offset === selectionFocus.offset;
6263  }
6264  /**
6265   * Check whether the selection is mergeable.
6266   *
6267   * @param {Object}  state     Editor state.
6268   * @param {boolean} isForward Whether to merge forwards.
6269   *
6270   * @return {boolean} Whether the selection is mergeable.
6271   */
6272  
6273  function __unstableIsSelectionMergeable(state, isForward) {
6274    const selectionAnchor = getSelectionStart(state);
6275    const selectionFocus = getSelectionEnd(state); // It's not mergeable if the start and end are within the same block.
6276  
6277    if (selectionAnchor.clientId === selectionFocus.clientId) return false; // It's not mergeable if there's no rich text selection.
6278  
6279    if (!selectionAnchor.attributeKey || !selectionFocus.attributeKey || typeof selectionAnchor.offset === 'undefined' || typeof selectionFocus.offset === 'undefined') return false;
6280    const anchorRootClientId = getBlockRootClientId(state, selectionAnchor.clientId);
6281    const focusRootClientId = getBlockRootClientId(state, selectionFocus.clientId); // It's not mergeable if the selection doesn't start and end in the same
6282    // block list. Maybe in the future it should be allowed.
6283  
6284    if (anchorRootClientId !== focusRootClientId) {
6285      return false;
6286    }
6287  
6288    const blockOrder = getBlockOrder(state, anchorRootClientId);
6289    const anchorIndex = blockOrder.indexOf(selectionAnchor.clientId);
6290    const focusIndex = blockOrder.indexOf(selectionFocus.clientId); // Reassign selection start and end based on order.
6291  
6292    let selectionStart, selectionEnd;
6293  
6294    if (anchorIndex > focusIndex) {
6295      selectionStart = selectionFocus;
6296      selectionEnd = selectionAnchor;
6297    } else {
6298      selectionStart = selectionAnchor;
6299      selectionEnd = selectionFocus;
6300    }
6301  
6302    const targetBlockClientId = isForward ? selectionEnd.clientId : selectionStart.clientId;
6303    const blockToMergeClientId = isForward ? selectionStart.clientId : selectionEnd.clientId;
6304    const targetBlock = getBlock(state, targetBlockClientId);
6305    const targetBlockType = (0,external_wp_blocks_namespaceObject.getBlockType)(targetBlock.name);
6306    if (!targetBlockType.merge) return false;
6307    const blockToMerge = getBlock(state, blockToMergeClientId); // It's mergeable if the blocks are of the same type.
6308  
6309    if (blockToMerge.name === targetBlock.name) return true; // If the blocks are of a different type, try to transform the block being
6310    // merged into the same type of block.
6311  
6312    const blocksToMerge = (0,external_wp_blocks_namespaceObject.switchToBlockType)(blockToMerge, targetBlock.name);
6313    return blocksToMerge && blocksToMerge.length;
6314  }
6315  /**
6316   * Get partial selected blocks with their content updated
6317   * based on the selection.
6318   *
6319   * @param {Object} state Editor state.
6320   *
6321   * @return {Object[]} Updated partial selected blocks.
6322   */
6323  
6324  const __unstableGetSelectedBlocksWithPartialSelection = state => {
6325    const selectionAnchor = getSelectionStart(state);
6326    const selectionFocus = getSelectionEnd(state);
6327  
6328    if (selectionAnchor.clientId === selectionFocus.clientId) {
6329      return EMPTY_ARRAY;
6330    } // Can't split if the selection is not set.
6331  
6332  
6333    if (!selectionAnchor.attributeKey || !selectionFocus.attributeKey || typeof selectionAnchor.offset === 'undefined' || typeof selectionFocus.offset === 'undefined') {
6334      return EMPTY_ARRAY;
6335    }
6336  
6337    const anchorRootClientId = getBlockRootClientId(state, selectionAnchor.clientId);
6338    const focusRootClientId = getBlockRootClientId(state, selectionFocus.clientId); // It's not splittable if the selection doesn't start and end in the same
6339    // block list. Maybe in the future it should be allowed.
6340  
6341    if (anchorRootClientId !== focusRootClientId) {
6342      return EMPTY_ARRAY;
6343    }
6344  
6345    const blockOrder = getBlockOrder(state, anchorRootClientId);
6346    const anchorIndex = blockOrder.indexOf(selectionAnchor.clientId);
6347    const focusIndex = blockOrder.indexOf(selectionFocus.clientId); // Reassign selection start and end based on order.
6348  
6349    const [selectionStart, selectionEnd] = anchorIndex > focusIndex ? [selectionFocus, selectionAnchor] : [selectionAnchor, selectionFocus];
6350    const blockA = getBlock(state, selectionStart.clientId);
6351    const blockAType = (0,external_wp_blocks_namespaceObject.getBlockType)(blockA.name);
6352    const blockB = getBlock(state, selectionEnd.clientId);
6353    const blockBType = (0,external_wp_blocks_namespaceObject.getBlockType)(blockB.name);
6354    const htmlA = blockA.attributes[selectionStart.attributeKey];
6355    const htmlB = blockB.attributes[selectionEnd.attributeKey];
6356    const attributeDefinitionA = blockAType.attributes[selectionStart.attributeKey];
6357    const attributeDefinitionB = blockBType.attributes[selectionEnd.attributeKey];
6358    let valueA = (0,external_wp_richText_namespaceObject.create)({
6359      html: htmlA,
6360      ...mapRichTextSettings(attributeDefinitionA)
6361    });
6362    let valueB = (0,external_wp_richText_namespaceObject.create)({
6363      html: htmlB,
6364      ...mapRichTextSettings(attributeDefinitionB)
6365    });
6366    valueA = (0,external_wp_richText_namespaceObject.remove)(valueA, 0, selectionStart.offset);
6367    valueB = (0,external_wp_richText_namespaceObject.remove)(valueB, selectionEnd.offset, valueB.text.length);
6368    return [{ ...blockA,
6369      attributes: { ...blockA.attributes,
6370        [selectionStart.attributeKey]: (0,external_wp_richText_namespaceObject.toHTMLString)({
6371          value: valueA,
6372          ...mapRichTextSettings(attributeDefinitionA)
6373        })
6374      }
6375    }, { ...blockB,
6376      attributes: { ...blockB.attributes,
6377        [selectionEnd.attributeKey]: (0,external_wp_richText_namespaceObject.toHTMLString)({
6378          value: valueB,
6379          ...mapRichTextSettings(attributeDefinitionB)
6380        })
6381      }
6382    }];
6383  };
6384  /**
6385   * Returns an array containing all block client IDs in the editor in the order
6386   * they appear. Optionally accepts a root client ID of the block list for which
6387   * the order should be returned, defaulting to the top-level block order.
6388   *
6389   * @param {Object}  state        Editor state.
6390   * @param {?string} rootClientId Optional root client ID of block list.
6391   *
6392   * @return {Array} Ordered client IDs of editor blocks.
6393   */
6394  
6395  function getBlockOrder(state, rootClientId) {
6396    return state.blocks.order[rootClientId || ''] || EMPTY_ARRAY;
6397  }
6398  /**
6399   * Returns the index at which the block corresponding to the specified client
6400   * ID occurs within the block order, or `-1` if the block does not exist.
6401   *
6402   * @param {Object} state    Editor state.
6403   * @param {string} clientId Block client ID.
6404   *
6405   * @return {number} Index at which block exists in order.
6406   */
6407  
6408  function getBlockIndex(state, clientId) {
6409    const rootClientId = getBlockRootClientId(state, clientId);
6410    return getBlockOrder(state, rootClientId).indexOf(clientId);
6411  }
6412  /**
6413   * Returns true if the block corresponding to the specified client ID is
6414   * currently selected and no multi-selection exists, or false otherwise.
6415   *
6416   * @param {Object} state    Editor state.
6417   * @param {string} clientId Block client ID.
6418   *
6419   * @return {boolean} Whether block is selected and multi-selection exists.
6420   */
6421  
6422  function isBlockSelected(state, clientId) {
6423    const {
6424      selectionStart,
6425      selectionEnd
6426    } = state.selection;
6427  
6428    if (selectionStart.clientId !== selectionEnd.clientId) {
6429      return false;
6430    }
6431  
6432    return selectionStart.clientId === clientId;
6433  }
6434  /**
6435   * Returns true if one of the block's inner blocks is selected.
6436   *
6437   * @param {Object}  state    Editor state.
6438   * @param {string}  clientId Block client ID.
6439   * @param {boolean} deep     Perform a deep check.
6440   *
6441   * @return {boolean} Whether the block as an inner block selected
6442   */
6443  
6444  function hasSelectedInnerBlock(state, clientId) {
6445    let deep = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
6446    return (0,external_lodash_namespaceObject.some)(getBlockOrder(state, clientId), innerClientId => isBlockSelected(state, innerClientId) || isBlockMultiSelected(state, innerClientId) || deep && hasSelectedInnerBlock(state, innerClientId, deep));
6447  }
6448  /**
6449   * Returns true if the block corresponding to the specified client ID is
6450   * currently selected but isn't the last of the selected blocks. Here "last"
6451   * refers to the block sequence in the document, _not_ the sequence of
6452   * multi-selection, which is why `state.selectionEnd` isn't used.
6453   *
6454   * @param {Object} state    Editor state.
6455   * @param {string} clientId Block client ID.
6456   *
6457   * @return {boolean} Whether block is selected and not the last in the
6458   *                   selection.
6459   */
6460  
6461  function isBlockWithinSelection(state, clientId) {
6462    if (!clientId) {
6463      return false;
6464    }
6465  
6466    const clientIds = getMultiSelectedBlockClientIds(state);
6467    const index = clientIds.indexOf(clientId);
6468    return index > -1 && index < clientIds.length - 1;
6469  }
6470  /**
6471   * Returns true if a multi-selection has been made, or false otherwise.
6472   *
6473   * @param {Object} state Editor state.
6474   *
6475   * @return {boolean} Whether multi-selection has been made.
6476   */
6477  
6478  function hasMultiSelection(state) {
6479    const {
6480      selectionStart,
6481      selectionEnd
6482    } = state.selection;
6483    return selectionStart.clientId !== selectionEnd.clientId;
6484  }
6485  /**
6486   * Whether in the process of multi-selecting or not. This flag is only true
6487   * while the multi-selection is being selected (by mouse move), and is false
6488   * once the multi-selection has been settled.
6489   *
6490   * @see hasMultiSelection
6491   *
6492   * @param {Object} state Global application state.
6493   *
6494   * @return {boolean} True if multi-selecting, false if not.
6495   */
6496  
6497  function selectors_isMultiSelecting(state) {
6498    return state.isMultiSelecting;
6499  }
6500  /**
6501   * Selector that returns if multi-selection is enabled or not.
6502   *
6503   * @param {Object} state Global application state.
6504   *
6505   * @return {boolean} True if it should be possible to multi-select blocks, false if multi-selection is disabled.
6506   */
6507  
6508  function selectors_isSelectionEnabled(state) {
6509    return state.isSelectionEnabled;
6510  }
6511  /**
6512   * Returns the block's editing mode, defaulting to "visual" if not explicitly
6513   * assigned.
6514   *
6515   * @param {Object} state    Editor state.
6516   * @param {string} clientId Block client ID.
6517   *
6518   * @return {Object} Block editing mode.
6519   */
6520  
6521  function getBlockMode(state, clientId) {
6522    return state.blocksMode[clientId] || 'visual';
6523  }
6524  /**
6525   * Returns true if the user is typing, or false otherwise.
6526   *
6527   * @param {Object} state Global application state.
6528   *
6529   * @return {boolean} Whether user is typing.
6530   */
6531  
6532  function selectors_isTyping(state) {
6533    return state.isTyping;
6534  }
6535  /**
6536   * Returns true if the user is dragging blocks, or false otherwise.
6537   *
6538   * @param {Object} state Global application state.
6539   *
6540   * @return {boolean} Whether user is dragging blocks.
6541   */
6542  
6543  function isDraggingBlocks(state) {
6544    return !!state.draggedBlocks.length;
6545  }
6546  /**
6547   * Returns the client ids of any blocks being directly dragged.
6548   *
6549   * This does not include children of a parent being dragged.
6550   *
6551   * @param {Object} state Global application state.
6552   *
6553   * @return {string[]} Array of dragged block client ids.
6554   */
6555  
6556  function getDraggedBlockClientIds(state) {
6557    return state.draggedBlocks;
6558  }
6559  /**
6560   * Returns whether the block is being dragged.
6561   *
6562   * Only returns true if the block is being directly dragged,
6563   * not if the block is a child of a parent being dragged.
6564   * See `isAncestorBeingDragged` for child blocks.
6565   *
6566   * @param {Object} state    Global application state.
6567   * @param {string} clientId Client id for block to check.
6568   *
6569   * @return {boolean} Whether the block is being dragged.
6570   */
6571  
6572  function isBlockBeingDragged(state, clientId) {
6573    return state.draggedBlocks.includes(clientId);
6574  }
6575  /**
6576   * Returns whether a parent/ancestor of the block is being dragged.
6577   *
6578   * @param {Object} state    Global application state.
6579   * @param {string} clientId Client id for block to check.
6580   *
6581   * @return {boolean} Whether the block's ancestor is being dragged.
6582   */
6583  
6584  function isAncestorBeingDragged(state, clientId) {
6585    // Return early if no blocks are being dragged rather than
6586    // the more expensive check for parents.
6587    if (!isDraggingBlocks(state)) {
6588      return false;
6589    }
6590  
6591    const parents = getBlockParents(state, clientId);
6592    return (0,external_lodash_namespaceObject.some)(parents, parentClientId => isBlockBeingDragged(state, parentClientId));
6593  }
6594  /**
6595   * Returns true if the caret is within formatted text, or false otherwise.
6596   *
6597   * @param {Object} state Global application state.
6598   *
6599   * @return {boolean} Whether the caret is within formatted text.
6600   */
6601  
6602  function selectors_isCaretWithinFormattedText(state) {
6603    return state.isCaretWithinFormattedText;
6604  }
6605  /**
6606   * Returns the insertion point, the index at which the new inserted block would
6607   * be placed. Defaults to the last index.
6608   *
6609   * @param {Object} state Editor state.
6610   *
6611   * @return {Object} Insertion point object with `rootClientId`, `index`.
6612   */
6613  
6614  function getBlockInsertionPoint(state) {
6615    let rootClientId, index;
6616    const {
6617      insertionPoint,
6618      selection: {
6619        selectionEnd
6620      }
6621    } = state;
6622  
6623    if (insertionPoint !== null) {
6624      return insertionPoint;
6625    }
6626  
6627    const {
6628      clientId
6629    } = selectionEnd;
6630  
6631    if (clientId) {
6632      rootClientId = getBlockRootClientId(state, clientId) || undefined;
6633      index = getBlockIndex(state, selectionEnd.clientId, rootClientId) + 1;
6634    } else {
6635      index = getBlockOrder(state).length;
6636    }
6637  
6638    return {
6639      rootClientId,
6640      index
6641    };
6642  }
6643  /**
6644   * Returns true if we should show the block insertion point.
6645   *
6646   * @param {Object} state Global application state.
6647   *
6648   * @return {?boolean} Whether the insertion point is visible or not.
6649   */
6650  
6651  function isBlockInsertionPointVisible(state) {
6652    return state.insertionPoint !== null;
6653  }
6654  /**
6655   * Returns whether the blocks matches the template or not.
6656   *
6657   * @param {boolean} state
6658   * @return {?boolean} Whether the template is valid or not.
6659   */
6660  
6661  function isValidTemplate(state) {
6662    return state.template.isValid;
6663  }
6664  /**
6665   * Returns the defined block template
6666   *
6667   * @param {boolean} state
6668   *
6669   * @return {?Array} Block Template.
6670   */
6671  
6672  function getTemplate(state) {
6673    return state.settings.template;
6674  }
6675  /**
6676   * Returns the defined block template lock. Optionally accepts a root block
6677   * client ID as context, otherwise defaulting to the global context.
6678   *
6679   * @param {Object}  state        Editor state.
6680   * @param {?string} rootClientId Optional block root client ID.
6681   *
6682   * @return {?string} Block Template Lock
6683   */
6684  
6685  function getTemplateLock(state, rootClientId) {
6686    if (!rootClientId) {
6687      return state.settings.templateLock;
6688    }
6689  
6690    const blockListSettings = getBlockListSettings(state, rootClientId);
6691  
6692    if (!blockListSettings) {
6693      return null;
6694    }
6695  
6696    return blockListSettings.templateLock;
6697  }
6698  
6699  const checkAllowList = function (list, item) {
6700    let defaultResult = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
6701  
6702    if ((0,external_lodash_namespaceObject.isBoolean)(list)) {
6703      return list;
6704    }
6705  
6706    if ((0,external_lodash_namespaceObject.isArray)(list)) {
6707      // TODO: when there is a canonical way to detect that we are editing a post
6708      // the following check should be changed to something like:
6709      // if ( list.includes( 'core/post-content' ) && getEditorMode() === 'post-content' && item === null )
6710      if (list.includes('core/post-content') && item === null) {
6711        return true;
6712      }
6713  
6714      return list.includes(item);
6715    }
6716  
6717    return defaultResult;
6718  };
6719  /**
6720   * Determines if the given block type is allowed to be inserted into the block list.
6721   * This function is not exported and not memoized because using a memoized selector
6722   * inside another memoized selector is just a waste of time.
6723   *
6724   * @param {Object}        state        Editor state.
6725   * @param {string|Object} blockName    The block type object, e.g., the response
6726   *                                     from the block directory; or a string name of
6727   *                                     an installed block type, e.g.' core/paragraph'.
6728   * @param {?string}       rootClientId Optional root client ID of block list.
6729   *
6730   * @return {boolean} Whether the given block type is allowed to be inserted.
6731   */
6732  
6733  
6734  const canInsertBlockTypeUnmemoized = function (state, blockName) {
6735    let rootClientId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
6736    let blockType;
6737  
6738    if (blockName && 'object' === typeof blockName) {
6739      blockType = blockName;
6740      blockName = blockType.name;
6741    } else {
6742      blockType = (0,external_wp_blocks_namespaceObject.getBlockType)(blockName);
6743    }
6744  
6745    if (!blockType) {
6746      return false;
6747    }
6748  
6749    const {
6750      allowedBlockTypes
6751    } = getSettings(state);
6752    const isBlockAllowedInEditor = checkAllowList(allowedBlockTypes, blockName, true);
6753  
6754    if (!isBlockAllowedInEditor) {
6755      return false;
6756    }
6757  
6758    const isLocked = !!getTemplateLock(state, rootClientId);
6759  
6760    if (isLocked) {
6761      return false;
6762    }
6763  
6764    const parentBlockListSettings = getBlockListSettings(state, rootClientId); // The parent block doesn't have settings indicating it doesn't support
6765    // inner blocks, return false.
6766  
6767    if (rootClientId && parentBlockListSettings === undefined) {
6768      return false;
6769    }
6770  
6771    const parentAllowedBlocks = parentBlockListSettings === null || parentBlockListSettings === void 0 ? void 0 : parentBlockListSettings.allowedBlocks;
6772    const hasParentAllowedBlock = checkAllowList(parentAllowedBlocks, blockName);
6773    const blockAllowedParentBlocks = blockType.parent;
6774    const parentName = getBlockName(state, rootClientId);
6775    const hasBlockAllowedParent = checkAllowList(blockAllowedParentBlocks, parentName);
6776    let hasBlockAllowedAncestor = true;
6777    const blockAllowedAncestorBlocks = blockType.ancestor;
6778  
6779    if (blockAllowedAncestorBlocks) {
6780      const ancestors = [rootClientId, ...getBlockParents(state, rootClientId)];
6781      hasBlockAllowedAncestor = (0,external_lodash_namespaceObject.some)(ancestors, ancestorClientId => checkAllowList(blockAllowedAncestorBlocks, getBlockName(state, ancestorClientId)));
6782    }
6783  
6784    const canInsert = hasBlockAllowedAncestor && (hasParentAllowedBlock === null && hasBlockAllowedParent === null || hasParentAllowedBlock === true || hasBlockAllowedParent === true);
6785  
6786    if (!canInsert) {
6787      return canInsert;
6788    }
6789    /**
6790     * This filter is an ad-hoc solution to prevent adding template parts inside post content.
6791     * Conceptually, having a filter inside a selector is bad pattern so this code will be
6792     * replaced by a declarative API that doesn't the following drawbacks:
6793     *
6794     * Filters are not reactive: Upon switching between "template mode" and non "template mode",
6795     * the filter and selector won't necessarily be executed again. For now, it doesn't matter much
6796     * because you can't switch between the two modes while the inserter stays open.
6797     *
6798     * Filters are global: Once they're defined, they will affect all editor instances and all registries.
6799     * An ideal API would only affect specific editor instances.
6800     */
6801  
6802  
6803    return (0,external_wp_hooks_namespaceObject.applyFilters)('blockEditor.__unstableCanInsertBlockType', canInsert, blockType, rootClientId, {
6804      // Pass bound selectors of the current registry. If we're in a nested
6805      // context, the data will differ from the one selected from the root
6806      // registry.
6807      getBlock: getBlock.bind(null, state),
6808      getBlockParentsByBlockName: getBlockParentsByBlockName.bind(null, state)
6809    });
6810  };
6811  /**
6812   * Determines if the given block type is allowed to be inserted into the block list.
6813   *
6814   * @param {Object}  state        Editor state.
6815   * @param {string}  blockName    The name of the block type, e.g.' core/paragraph'.
6816   * @param {?string} rootClientId Optional root client ID of block list.
6817   *
6818   * @return {boolean} Whether the given block type is allowed to be inserted.
6819   */
6820  
6821  
6822  const canInsertBlockType = rememo(canInsertBlockTypeUnmemoized, (state, blockName, rootClientId) => [state.blockListSettings[rootClientId], state.blocks.byClientId[rootClientId], state.settings.allowedBlockTypes, state.settings.templateLock]);
6823  /**
6824   * Determines if the given blocks are allowed to be inserted into the block
6825   * list.
6826   *
6827   * @param {Object}  state        Editor state.
6828   * @param {string}  clientIds    The block client IDs to be inserted.
6829   * @param {?string} rootClientId Optional root client ID of block list.
6830   *
6831   * @return {boolean} Whether the given blocks are allowed to be inserted.
6832   */
6833  
6834  function canInsertBlocks(state, clientIds) {
6835    let rootClientId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
6836    return clientIds.every(id => canInsertBlockType(state, getBlockName(state, id), rootClientId));
6837  }
6838  /**
6839   * Determines if the given block is allowed to be deleted.
6840   *
6841   * @param {Object}  state        Editor state.
6842   * @param {string}  clientId     The block client Id.
6843   * @param {?string} rootClientId Optional root client ID of block list.
6844   *
6845   * @return {boolean} Whether the given block is allowed to be removed.
6846   */
6847  
6848  function canRemoveBlock(state, clientId) {
6849    let rootClientId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
6850    const attributes = getBlockAttributes(state, clientId); // attributes can be null if the block is already deleted.
6851  
6852    if (attributes === null) {
6853      return true;
6854    }
6855  
6856    const {
6857      lock
6858    } = attributes;
6859    const parentIsLocked = !!getTemplateLock(state, rootClientId); // If we don't have a lock on the blockType level, we defer to the parent templateLock.
6860  
6861    if (lock === undefined || (lock === null || lock === void 0 ? void 0 : lock.remove) === undefined) {
6862      return !parentIsLocked;
6863    } // When remove is true, it means we cannot remove it.
6864  
6865  
6866    return !(lock !== null && lock !== void 0 && lock.remove);
6867  }
6868  /**
6869   * Determines if the given blocks are allowed to be removed.
6870   *
6871   * @param {Object}  state        Editor state.
6872   * @param {string}  clientIds    The block client IDs to be removed.
6873   * @param {?string} rootClientId Optional root client ID of block list.
6874   *
6875   * @return {boolean} Whether the given blocks are allowed to be removed.
6876   */
6877  
6878  function canRemoveBlocks(state, clientIds) {
6879    let rootClientId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
6880    return clientIds.every(clientId => canRemoveBlock(state, clientId, rootClientId));
6881  }
6882  /**
6883   * Determines if the given block is allowed to be moved.
6884   *
6885   * @param {Object}  state        Editor state.
6886   * @param {string}  clientId     The block client Id.
6887   * @param {?string} rootClientId Optional root client ID of block list.
6888   *
6889   * @return {boolean} Whether the given block is allowed to be moved.
6890   */
6891  
6892  function canMoveBlock(state, clientId) {
6893    let rootClientId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
6894    const attributes = getBlockAttributes(state, clientId);
6895  
6896    if (attributes === null) {
6897      return;
6898    }
6899  
6900    const {
6901      lock
6902    } = attributes;
6903    const parentIsLocked = getTemplateLock(state, rootClientId) === 'all'; // If we don't have a lock on the blockType level, we defer to the parent templateLock.
6904  
6905    if (lock === undefined || (lock === null || lock === void 0 ? void 0 : lock.move) === undefined) {
6906      return !parentIsLocked;
6907    } // When move is true, it means we cannot move it.
6908  
6909  
6910    return !(lock !== null && lock !== void 0 && lock.move);
6911  }
6912  /**
6913   * Determines if the given blocks are allowed to be moved.
6914   *
6915   * @param {Object}  state        Editor state.
6916   * @param {string}  clientIds    The block client IDs to be moved.
6917   * @param {?string} rootClientId Optional root client ID of block list.
6918   *
6919   * @return {boolean} Whether the given blocks are allowed to be moved.
6920   */
6921  
6922  function canMoveBlocks(state, clientIds) {
6923    let rootClientId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
6924    return clientIds.every(clientId => canMoveBlock(state, clientId, rootClientId));
6925  }
6926  /**
6927   * Determines if the given block type can be locked/unlocked by a user.
6928   *
6929   * @param {Object}          state      Editor state.
6930   * @param {(string|Object)} nameOrType Block name or type object.
6931   *
6932   * @return {boolean} Whether a given block type can be locked/unlocked.
6933   */
6934  
6935  function canLockBlockType(state, nameOrType) {
6936    var _state$settings;
6937  
6938    if (!(0,external_wp_blocks_namespaceObject.hasBlockSupport)(nameOrType, 'lock', true)) {
6939      return false;
6940    } // Use block editor settings as the default value.
6941  
6942  
6943    return !!((_state$settings = state.settings) !== null && _state$settings !== void 0 && _state$settings.canLockBlocks);
6944  }
6945  /**
6946   * Returns information about how recently and frequently a block has been inserted.
6947   *
6948   * @param {Object} state Global application state.
6949   * @param {string} id    A string which identifies the insert, e.g. 'core/block/12'
6950   *
6951   * @return {?{ time: number, count: number }} An object containing `time` which is when the last
6952   *                                            insert occurred as a UNIX epoch, and `count` which is
6953   *                                            the number of inserts that have occurred.
6954   */
6955  
6956  function getInsertUsage(state, id) {
6957    var _state$preferences$in, _state$preferences$in2;
6958  
6959    return (_state$preferences$in = (_state$preferences$in2 = state.preferences.insertUsage) === null || _state$preferences$in2 === void 0 ? void 0 : _state$preferences$in2[id]) !== null && _state$preferences$in !== void 0 ? _state$preferences$in : null;
6960  }
6961  /**
6962   * Returns whether we can show a block type in the inserter
6963   *
6964   * @param {Object}  state        Global State
6965   * @param {Object}  blockType    BlockType
6966   * @param {?string} rootClientId Optional root client ID of block list.
6967   *
6968   * @return {boolean} Whether the given block type is allowed to be shown in the inserter.
6969   */
6970  
6971  
6972  const canIncludeBlockTypeInInserter = (state, blockType, rootClientId) => {
6973    if (!(0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockType, 'inserter', true)) {
6974      return false;
6975    }
6976  
6977    return canInsertBlockTypeUnmemoized(state, blockType.name, rootClientId);
6978  };
6979  /**
6980   * Return a function to be used to tranform a block variation to an inserter item
6981   *
6982   * @param {Object} state Global State
6983   * @param {Object} item  Denormalized inserter item
6984   * @return {Function} Function to transform a block variation to inserter item
6985   */
6986  
6987  
6988  const getItemFromVariation = (state, item) => variation => {
6989    const variationId = `$item.id}/$variation.name}`;
6990    const {
6991      time,
6992      count = 0
6993    } = getInsertUsage(state, variationId) || {};
6994    return { ...item,
6995      id: variationId,
6996      icon: variation.icon || item.icon,
6997      title: variation.title || item.title,
6998      description: variation.description || item.description,
6999      category: variation.category || item.category,
7000      // If `example` is explicitly undefined for the variation, the preview will not be shown.
7001      example: variation.hasOwnProperty('example') ? variation.example : item.example,
7002      initialAttributes: { ...item.initialAttributes,
7003        ...variation.attributes
7004      },
7005      innerBlocks: variation.innerBlocks,
7006      keywords: variation.keywords || item.keywords,
7007      frecency: calculateFrecency(time, count)
7008    };
7009  };
7010  /**
7011   * Returns the calculated frecency.
7012   *
7013   * 'frecency' is a heuristic (https://en.wikipedia.org/wiki/Frecency)
7014   * that combines block usage frequenty and recency.
7015   *
7016   * @param {number} time  When the last insert occurred as a UNIX epoch
7017   * @param {number} count The number of inserts that have occurred.
7018   *
7019   * @return {number} The calculated frecency.
7020   */
7021  
7022  
7023  const calculateFrecency = (time, count) => {
7024    if (!time) {
7025      return count;
7026    } // The selector is cached, which means Date.now() is the last time that the
7027    // relevant state changed. This suits our needs.
7028  
7029  
7030    const duration = Date.now() - time;
7031  
7032    switch (true) {
7033      case duration < MILLISECONDS_PER_HOUR:
7034        return count * 4;
7035  
7036      case duration < MILLISECONDS_PER_DAY:
7037        return count * 2;
7038  
7039      case duration < MILLISECONDS_PER_WEEK:
7040        return count / 2;
7041  
7042      default:
7043        return count / 4;
7044    }
7045  };
7046  /**
7047   * Returns a function that accepts a block type and builds an item to be shown
7048   * in a specific context. It's used for building items for Inserter and available
7049   * block Transfroms list.
7050   *
7051   * @param {Object} state              Editor state.
7052   * @param {Object} options            Options object for handling the building of a block type.
7053   * @param {string} options.buildScope The scope for which the item is going to be used.
7054   * @return {Function} Function returns an item to be shown in a specific context (Inserter|Transforms list).
7055   */
7056  
7057  
7058  const buildBlockTypeItem = (state, _ref3) => {
7059    let {
7060      buildScope = 'inserter'
7061    } = _ref3;
7062    return blockType => {
7063      const id = blockType.name;
7064      let isDisabled = false;
7065  
7066      if (!(0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockType.name, 'multiple', true)) {
7067        isDisabled = (0,external_lodash_namespaceObject.some)(getBlocksByClientId(state, getClientIdsWithDescendants(state)), {
7068          name: blockType.name
7069        });
7070      }
7071  
7072      const {
7073        time,
7074        count = 0
7075      } = getInsertUsage(state, id) || {};
7076      const blockItemBase = {
7077        id,
7078        name: blockType.name,
7079        title: blockType.title,
7080        icon: blockType.icon,
7081        isDisabled,
7082        frecency: calculateFrecency(time, count)
7083      };
7084      if (buildScope === 'transform') return blockItemBase;
7085      const inserterVariations = (0,external_wp_blocks_namespaceObject.getBlockVariations)(blockType.name, 'inserter');
7086      return { ...blockItemBase,
7087        initialAttributes: {},
7088        description: blockType.description,
7089        category: blockType.category,
7090        keywords: blockType.keywords,
7091        variations: inserterVariations,
7092        example: blockType.example,
7093        utility: 1 // Deprecated.
7094  
7095      };
7096    };
7097  };
7098  /**
7099   * Determines the items that appear in the inserter. Includes both static
7100   * items (e.g. a regular block type) and dynamic items (e.g. a reusable block).
7101   *
7102   * Each item object contains what's necessary to display a button in the
7103   * inserter and handle its selection.
7104   *
7105   * The 'frecency' property is a heuristic (https://en.wikipedia.org/wiki/Frecency)
7106   * that combines block usage frequenty and recency.
7107   *
7108   * Items are returned ordered descendingly by their 'utility' and 'frecency'.
7109   *
7110   * @param    {Object}   state             Editor state.
7111   * @param    {?string}  rootClientId      Optional root client ID of block list.
7112   *
7113   * @return {WPEditorInserterItem[]} Items that appear in inserter.
7114   *
7115   * @typedef {Object} WPEditorInserterItem
7116   * @property {string}   id                Unique identifier for the item.
7117   * @property {string}   name              The type of block to create.
7118   * @property {Object}   initialAttributes Attributes to pass to the newly created block.
7119   * @property {string}   title             Title of the item, as it appears in the inserter.
7120   * @property {string}   icon              Dashicon for the item, as it appears in the inserter.
7121   * @property {string}   category          Block category that the item is associated with.
7122   * @property {string[]} keywords          Keywords that can be searched to find this item.
7123   * @property {boolean}  isDisabled        Whether or not the user should be prevented from inserting
7124   *                                        this item.
7125   * @property {number}   frecency          Heuristic that combines frequency and recency.
7126   */
7127  
7128  
7129  const getInserterItems = rememo(function (state) {
7130    let rootClientId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
7131    const buildBlockTypeInserterItem = buildBlockTypeItem(state, {
7132      buildScope: 'inserter'
7133    });
7134    /*
7135     * Matches block comment delimiters amid serialized content.
7136     *
7137     * @see `tokenizer` in `@wordpress/block-serialization-default-parser`
7138     * package
7139     *
7140     * blockParserTokenizer differs from the original tokenizer in the
7141     * following ways:
7142     *
7143     * - removed global flag (/g)
7144     * - prepended ^\s*
7145     *
7146     */
7147  
7148    const blockParserTokenizer = /^\s*<!--\s+(\/)?wp:([a-z][a-z0-9_-]*\/)?([a-z][a-z0-9_-]*)\s+({(?:(?=([^}]+|}+(?=})|(?!}\s+\/?-->)[^])*)\5|[^]*?)}\s+)?(\/)?-->/;
7149  
7150    const buildReusableBlockInserterItem = reusableBlock => {
7151      let icon = library_symbol;
7152      /*
7153       * Instead of always displaying a generic "symbol" icon for every
7154       * reusable block, try to use an icon that represents the first
7155       * outermost block contained in the reusable block. This requires
7156       * scanning the serialized form of the reusable block to find its
7157       * first block delimiter, then looking up the corresponding block
7158       * type, if available.
7159       */
7160  
7161      if (external_wp_element_namespaceObject.Platform.OS === 'web') {
7162        const content = typeof reusableBlock.content.raw === 'string' ? reusableBlock.content.raw : reusableBlock.content;
7163        const rawBlockMatch = content.match(blockParserTokenizer);
7164  
7165        if (rawBlockMatch) {
7166          const [,, namespace = 'core/', blockName] = rawBlockMatch;
7167          const referencedBlockType = (0,external_wp_blocks_namespaceObject.getBlockType)(namespace + blockName);
7168  
7169          if (referencedBlockType) {
7170            icon = referencedBlockType.icon;
7171          }
7172        }
7173      }
7174  
7175      const id = `core/block/$reusableBlock.id}`;
7176      const {
7177        time,
7178        count = 0
7179      } = getInsertUsage(state, id) || {};
7180      const frecency = calculateFrecency(time, count);
7181      return {
7182        id,
7183        name: 'core/block',
7184        initialAttributes: {
7185          ref: reusableBlock.id
7186        },
7187        title: reusableBlock.title.raw,
7188        icon,
7189        category: 'reusable',
7190        keywords: [],
7191        isDisabled: false,
7192        utility: 1,
7193        // Deprecated.
7194        frecency
7195      };
7196    };
7197  
7198    const blockTypeInserterItems = (0,external_wp_blocks_namespaceObject.getBlockTypes)().filter(blockType => canIncludeBlockTypeInInserter(state, blockType, rootClientId)).map(buildBlockTypeInserterItem);
7199    const reusableBlockInserterItems = canInsertBlockTypeUnmemoized(state, 'core/block', rootClientId) ? getReusableBlocks(state).map(buildReusableBlockInserterItem) : [];
7200    const items = blockTypeInserterItems.reduce((accumulator, item) => {
7201      const {
7202        variations = []
7203      } = item; // Exclude any block type item that is to be replaced by a default variation.
7204  
7205      if (!variations.some(_ref4 => {
7206        let {
7207          isDefault
7208        } = _ref4;
7209        return isDefault;
7210      })) {
7211        accumulator.push(item);
7212      }
7213  
7214      if (variations.length) {
7215        const variationMapper = getItemFromVariation(state, item);
7216        accumulator.push(...variations.map(variationMapper));
7217      }
7218  
7219      return accumulator;
7220    }, []); // Ensure core blocks are prioritized in the returned results,
7221    // because third party blocks can be registered earlier than
7222    // the core blocks (usually by using the `init` action),
7223    // thus affecting the display order.
7224    // We don't sort reusable blocks as they are handled differently.
7225  
7226    const groupByType = (blocks, block) => {
7227      const {
7228        core,
7229        noncore
7230      } = blocks;
7231      const type = block.name.startsWith('core/') ? core : noncore;
7232      type.push(block);
7233      return blocks;
7234    };
7235  
7236    const {
7237      core: coreItems,
7238      noncore: nonCoreItems
7239    } = items.reduce(groupByType, {
7240      core: [],
7241      noncore: []
7242    });
7243    const sortedBlockTypes = [...coreItems, ...nonCoreItems];
7244    return [...sortedBlockTypes, ...reusableBlockInserterItems];
7245  }, (state, rootClientId) => [state.blockListSettings[rootClientId], state.blocks.byClientId, state.blocks.order, state.preferences.insertUsage, state.settings.allowedBlockTypes, state.settings.templateLock, getReusableBlocks(state), (0,external_wp_blocks_namespaceObject.getBlockTypes)()]);
7246  /**
7247   * Determines the items that appear in the available block transforms list.
7248   *
7249   * Each item object contains what's necessary to display a menu item in the
7250   * transform list and handle its selection.
7251   *
7252   * The 'frecency' property is a heuristic (https://en.wikipedia.org/wiki/Frecency)
7253   * that combines block usage frequenty and recency.
7254   *
7255   * Items are returned ordered descendingly by their 'frecency'.
7256   *
7257   * @param    {Object}  state        Editor state.
7258   * @param    {?string} rootClientId Optional root client ID of block list.
7259   *
7260   * @return {WPEditorTransformItem[]} Items that appear in inserter.
7261   *
7262   * @typedef {Object} WPEditorTransformItem
7263   * @property {string}  id           Unique identifier for the item.
7264   * @property {string}  name         The type of block to create.
7265   * @property {string}  title        Title of the item, as it appears in the inserter.
7266   * @property {string}  icon         Dashicon for the item, as it appears in the inserter.
7267   * @property {boolean} isDisabled   Whether or not the user should be prevented from inserting
7268   *                                  this item.
7269   * @property {number}  frecency     Heuristic that combines frequency and recency.
7270   */
7271  
7272  const getBlockTransformItems = rememo(function (state, blocks) {
7273    var _itemsByName$sourceBl;
7274  
7275    let rootClientId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
7276    const [sourceBlock] = blocks;
7277    const buildBlockTypeTransformItem = buildBlockTypeItem(state, {
7278      buildScope: 'transform'
7279    });
7280    const blockTypeTransformItems = (0,external_wp_blocks_namespaceObject.getBlockTypes)().filter(blockType => canIncludeBlockTypeInInserter(state, blockType, rootClientId)).map(buildBlockTypeTransformItem);
7281    const itemsByName = (0,external_lodash_namespaceObject.mapKeys)(blockTypeTransformItems, _ref5 => {
7282      let {
7283        name
7284      } = _ref5;
7285      return name;
7286    }); // Consider unwraping the highest priority.
7287  
7288    itemsByName['*'] = {
7289      frecency: +Infinity,
7290      id: '*',
7291      isDisabled: false,
7292      name: '*',
7293      title: (0,external_wp_i18n_namespaceObject.__)('Unwrap'),
7294      icon: (_itemsByName$sourceBl = itemsByName[sourceBlock.name]) === null || _itemsByName$sourceBl === void 0 ? void 0 : _itemsByName$sourceBl.icon
7295    };
7296    const possibleTransforms = (0,external_wp_blocks_namespaceObject.getPossibleBlockTransformations)(blocks).reduce((accumulator, block) => {
7297      if (block === '*') {
7298        accumulator.push(itemsByName['*']);
7299      } else if (itemsByName[block === null || block === void 0 ? void 0 : block.name]) {
7300        accumulator.push(itemsByName[block.name]);
7301      }
7302  
7303      return accumulator;
7304    }, []);
7305    return (0,external_lodash_namespaceObject.orderBy)(possibleTransforms, block => itemsByName[block.name].frecency, 'desc');
7306  }, (state, rootClientId) => [state.blockListSettings[rootClientId], state.blocks.byClientId, state.preferences.insertUsage, state.settings.allowedBlockTypes, state.settings.templateLock, (0,external_wp_blocks_namespaceObject.getBlockTypes)()]);
7307  /**
7308   * Determines whether there are items to show in the inserter.
7309   *
7310   * @param {Object}  state        Editor state.
7311   * @param {?string} rootClientId Optional root client ID of block list.
7312   *
7313   * @return {boolean} Items that appear in inserter.
7314   */
7315  
7316  const hasInserterItems = rememo(function (state) {
7317    let rootClientId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
7318    const hasBlockType = (0,external_lodash_namespaceObject.some)((0,external_wp_blocks_namespaceObject.getBlockTypes)(), blockType => canIncludeBlockTypeInInserter(state, blockType, rootClientId));
7319  
7320    if (hasBlockType) {
7321      return true;
7322    }
7323  
7324    const hasReusableBlock = canInsertBlockTypeUnmemoized(state, 'core/block', rootClientId) && getReusableBlocks(state).length > 0;
7325    return hasReusableBlock;
7326  }, (state, rootClientId) => [state.blockListSettings[rootClientId], state.blocks.byClientId, state.settings.allowedBlockTypes, state.settings.templateLock, getReusableBlocks(state), (0,external_wp_blocks_namespaceObject.getBlockTypes)()]);
7327  /**
7328   * Returns the list of allowed inserter blocks for inner blocks children
7329   *
7330   * @param {Object}  state        Editor state.
7331   * @param {?string} rootClientId Optional root client ID of block list.
7332   *
7333   * @return {Array?} The list of allowed block types.
7334   */
7335  
7336  const __experimentalGetAllowedBlocks = rememo(function (state) {
7337    let rootClientId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
7338  
7339    if (!rootClientId) {
7340      return;
7341    }
7342  
7343    return (0,external_lodash_namespaceObject.filter)((0,external_wp_blocks_namespaceObject.getBlockTypes)(), blockType => canIncludeBlockTypeInInserter(state, blockType, rootClientId));
7344  }, (state, rootClientId) => [state.blockListSettings[rootClientId], state.blocks.byClientId, state.settings.allowedBlockTypes, state.settings.templateLock, (0,external_wp_blocks_namespaceObject.getBlockTypes)()]);
7345  /**
7346   * Returns the block to be directly inserted by the block appender.
7347   *
7348   * @param    {Object}         state            Editor state.
7349   * @param    {?string}        rootClientId     Optional root client ID of block list.
7350   *
7351   * @return {?WPDirectInsertBlock}              The block type to be directly inserted.
7352   *
7353   * @typedef {Object} WPDirectInsertBlock
7354   * @property {string}         name             The type of block.
7355   * @property {?Object}        attributes       Attributes to pass to the newly created block.
7356   * @property {?Array<string>} attributesToCopy Attributes to be copied from adjecent blocks when inserted.
7357   */
7358  
7359  const __experimentalGetDirectInsertBlock = rememo(function (state) {
7360    var _state$blockListSetti, _state$blockListSetti2;
7361  
7362    let rootClientId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
7363  
7364    if (!rootClientId) {
7365      return;
7366    }
7367  
7368    const defaultBlock = (_state$blockListSetti = state.blockListSettings[rootClientId]) === null || _state$blockListSetti === void 0 ? void 0 : _state$blockListSetti.__experimentalDefaultBlock;
7369    const directInsert = (_state$blockListSetti2 = state.blockListSettings[rootClientId]) === null || _state$blockListSetti2 === void 0 ? void 0 : _state$blockListSetti2.__experimentalDirectInsert;
7370  
7371    if (!defaultBlock || !directInsert) {
7372      return;
7373    }
7374  
7375    if (typeof directInsert === 'function') {
7376      return directInsert(getBlock(state, rootClientId)) ? defaultBlock : null;
7377    }
7378  
7379    return defaultBlock;
7380  }, (state, rootClientId) => [state.blockListSettings[rootClientId], state.blocks.tree[rootClientId]]);
7381  
7382  const checkAllowListRecursive = (blocks, allowedBlockTypes) => {
7383    if ((0,external_lodash_namespaceObject.isBoolean)(allowedBlockTypes)) {
7384      return allowedBlockTypes;
7385    }
7386  
7387    const blocksQueue = [...blocks];
7388  
7389    while (blocksQueue.length > 0) {
7390      var _block$innerBlocks;
7391  
7392      const block = blocksQueue.shift();
7393      const isAllowed = checkAllowList(allowedBlockTypes, block.name || block.blockName, true);
7394  
7395      if (!isAllowed) {
7396        return false;
7397      }
7398  
7399      (_block$innerBlocks = block.innerBlocks) === null || _block$innerBlocks === void 0 ? void 0 : _block$innerBlocks.forEach(innerBlock => {
7400        blocksQueue.push(innerBlock);
7401      });
7402    }
7403  
7404    return true;
7405  };
7406  
7407  const __experimentalGetParsedPattern = rememo((state, patternName) => {
7408    const patterns = state.settings.__experimentalBlockPatterns;
7409    const pattern = patterns.find(_ref6 => {
7410      let {
7411        name
7412      } = _ref6;
7413      return name === patternName;
7414    });
7415  
7416    if (!pattern) {
7417      return null;
7418    }
7419  
7420    return { ...pattern,
7421      blocks: (0,external_wp_blocks_namespaceObject.parse)(pattern.content, {
7422        __unstableSkipMigrationLogs: true
7423      })
7424    };
7425  }, state => [state.settings.__experimentalBlockPatterns]);
7426  const getAllAllowedPatterns = rememo(state => {
7427    const patterns = state.settings.__experimentalBlockPatterns;
7428    const {
7429      allowedBlockTypes
7430    } = getSettings(state);
7431    const parsedPatterns = patterns.filter(_ref7 => {
7432      let {
7433        inserter = true
7434      } = _ref7;
7435      return !!inserter;
7436    }).map(_ref8 => {
7437      let {
7438        name
7439      } = _ref8;
7440      return __experimentalGetParsedPattern(state, name);
7441    });
7442    const allowedPatterns = parsedPatterns.filter(_ref9 => {
7443      let {
7444        blocks
7445      } = _ref9;
7446      return checkAllowListRecursive(blocks, allowedBlockTypes);
7447    });
7448    return allowedPatterns;
7449  }, state => [state.settings.__experimentalBlockPatterns, state.settings.allowedBlockTypes]);
7450  /**
7451   * Returns the list of allowed patterns for inner blocks children.
7452   *
7453   * @param {Object}  state        Editor state.
7454   * @param {?string} rootClientId Optional target root client ID.
7455   *
7456   * @return {Array?} The list of allowed patterns.
7457   */
7458  
7459  const __experimentalGetAllowedPatterns = rememo(function (state) {
7460    let rootClientId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
7461    const availableParsedPatterns = getAllAllowedPatterns(state);
7462    const patternsAllowed = (0,external_lodash_namespaceObject.filter)(availableParsedPatterns, _ref10 => {
7463      let {
7464        blocks
7465      } = _ref10;
7466      return blocks.every(_ref11 => {
7467        let {
7468          name
7469        } = _ref11;
7470        return canInsertBlockType(state, name, rootClientId);
7471      });
7472    });
7473    return patternsAllowed;
7474  }, (state, rootClientId) => [state.settings.__experimentalBlockPatterns, state.settings.allowedBlockTypes, state.settings.templateLock, state.blockListSettings[rootClientId], state.blocks.byClientId[rootClientId]]);
7475  /**
7476   * Returns the list of patterns based on their declared `blockTypes`
7477   * and a block's name.
7478   * Patterns can use `blockTypes` to integrate in work flows like
7479   * suggesting appropriate patterns in a Placeholder state(during insertion)
7480   * or blocks transformations.
7481   *
7482   * @param {Object}          state        Editor state.
7483   * @param {string|string[]} blockNames   Block's name or array of block names to find matching pattens.
7484   * @param {?string}         rootClientId Optional target root client ID.
7485   *
7486   * @return {Array} The list of matched block patterns based on declared `blockTypes` and block name.
7487   */
7488  
7489  const __experimentalGetPatternsByBlockTypes = rememo(function (state, blockNames) {
7490    let rootClientId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
7491    if (!blockNames) return EMPTY_ARRAY;
7492  
7493    const patterns = __experimentalGetAllowedPatterns(state, rootClientId);
7494  
7495    const normalizedBlockNames = Array.isArray(blockNames) ? blockNames : [blockNames];
7496    return patterns.filter(pattern => {
7497      var _pattern$blockTypes, _pattern$blockTypes$s;
7498  
7499      return pattern === null || pattern === void 0 ? void 0 : (_pattern$blockTypes = pattern.blockTypes) === null || _pattern$blockTypes === void 0 ? void 0 : (_pattern$blockTypes$s = _pattern$blockTypes.some) === null || _pattern$blockTypes$s === void 0 ? void 0 : _pattern$blockTypes$s.call(_pattern$blockTypes, blockName => normalizedBlockNames.includes(blockName));
7500    });
7501  }, (state, rootClientId) => [...__experimentalGetAllowedPatterns.getDependants(state, rootClientId)]);
7502  /**
7503   * Determines the items that appear in the available pattern transforms list.
7504   *
7505   * For now we only handle blocks without InnerBlocks and take into account
7506   * the `__experimentalRole` property of blocks' attributes for the transformation.
7507   *
7508   * We return the first set of possible eligible block patterns,
7509   * by checking the `blockTypes` property. We still have to recurse through
7510   * block pattern's blocks and try to find matches from the selected blocks.
7511   * Now this happens in the consumer to avoid heavy operations in the selector.
7512   *
7513   * @param {Object}   state        Editor state.
7514   * @param {Object[]} blocks       The selected blocks.
7515   * @param {?string}  rootClientId Optional root client ID of block list.
7516   *
7517   * @return {WPBlockPattern[]} Items that are eligible for a pattern transformation.
7518   */
7519  
7520  const __experimentalGetPatternTransformItems = rememo(function (state, blocks) {
7521    let rootClientId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
7522    if (!blocks) return EMPTY_ARRAY;
7523    /**
7524     * For now we only handle blocks without InnerBlocks and take into account
7525     * the `__experimentalRole` property of blocks' attributes for the transformation.
7526     * Note that the blocks have been retrieved through `getBlock`, which doesn't
7527     * return the inner blocks of an inner block controller, so we still need
7528     * to check for this case too.
7529     */
7530  
7531    if (blocks.some(_ref12 => {
7532      let {
7533        clientId,
7534        innerBlocks
7535      } = _ref12;
7536      return innerBlocks.length || areInnerBlocksControlled(state, clientId);
7537    })) {
7538      return EMPTY_ARRAY;
7539    } // Create a Set of the selected block names that is used in patterns filtering.
7540  
7541  
7542    const selectedBlockNames = Array.from(new Set(blocks.map(_ref13 => {
7543      let {
7544        name
7545      } = _ref13;
7546      return name;
7547    })));
7548    /**
7549     * Here we will return first set of possible eligible block patterns,
7550     * by checking the `blockTypes` property. We still have to recurse through
7551     * block pattern's blocks and try to find matches from the selected blocks.
7552     * Now this happens in the consumer to avoid heavy operations in the selector.
7553     */
7554  
7555    return __experimentalGetPatternsByBlockTypes(state, selectedBlockNames, rootClientId);
7556  }, (state, rootClientId) => [...__experimentalGetPatternsByBlockTypes.getDependants(state, rootClientId)]);
7557  /**
7558   * Returns the Block List settings of a block, if any exist.
7559   *
7560   * @param {Object}  state    Editor state.
7561   * @param {?string} clientId Block client ID.
7562   *
7563   * @return {?Object} Block settings of the block if set.
7564   */
7565  
7566  function getBlockListSettings(state, clientId) {
7567    return state.blockListSettings[clientId];
7568  }
7569  /**
7570   * Returns the editor settings.
7571   *
7572   * @param {Object} state Editor state.
7573   *
7574   * @return {Object} The editor settings object.
7575   */
7576  
7577  function getSettings(state) {
7578    return state.settings;
7579  }
7580  /**
7581   * Returns true if the most recent block change is be considered persistent, or
7582   * false otherwise. A persistent change is one committed by BlockEditorProvider
7583   * via its `onChange` callback, in addition to `onInput`.
7584   *
7585   * @param {Object} state Block editor state.
7586   *
7587   * @return {boolean} Whether the most recent block change was persistent.
7588   */
7589  
7590  function isLastBlockChangePersistent(state) {
7591    return state.blocks.isPersistentChange;
7592  }
7593  /**
7594   * Returns the block list settings for an array of blocks, if any exist.
7595   *
7596   * @param {Object} state     Editor state.
7597   * @param {Array}  clientIds Block client IDs.
7598   *
7599   * @return {Object} An object where the keys are client ids and the values are
7600   *                  a block list setting object.
7601   */
7602  
7603  const __experimentalGetBlockListSettingsForBlocks = rememo(function (state) {
7604    let clientIds = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
7605    return clientIds.reduce((blockListSettingsForBlocks, clientId) => {
7606      if (!state.blockListSettings[clientId]) {
7607        return blockListSettingsForBlocks;
7608      }
7609  
7610      return { ...blockListSettingsForBlocks,
7611        [clientId]: state.blockListSettings[clientId]
7612      };
7613    }, {});
7614  }, state => [state.blockListSettings]);
7615  /**
7616   * Returns the title of a given reusable block
7617   *
7618   * @param {Object}        state Global application state.
7619   * @param {number|string} ref   The shared block's ID.
7620   *
7621   * @return {string} The reusable block saved title.
7622   */
7623  
7624  const __experimentalGetReusableBlockTitle = rememo((state, ref) => {
7625    var _reusableBlock$title;
7626  
7627    const reusableBlock = (0,external_lodash_namespaceObject.find)(getReusableBlocks(state), block => block.id === ref);
7628  
7629    if (!reusableBlock) {
7630      return null;
7631    }
7632  
7633    return (_reusableBlock$title = reusableBlock.title) === null || _reusableBlock$title === void 0 ? void 0 : _reusableBlock$title.raw;
7634  }, state => [getReusableBlocks(state)]);
7635  /**
7636   * Returns true if the most recent block change is be considered ignored, or
7637   * false otherwise. An ignored change is one not to be committed by
7638   * BlockEditorProvider, neither via `onChange` nor `onInput`.
7639   *
7640   * @param {Object} state Block editor state.
7641   *
7642   * @return {boolean} Whether the most recent block change was ignored.
7643   */
7644  
7645  function __unstableIsLastBlockChangeIgnored(state) {
7646    // TODO: Removal Plan: Changes incurred by RECEIVE_BLOCKS should not be
7647    // ignored if in-fact they result in a change in blocks state. The current
7648    // need to ignore changes not a result of user interaction should be
7649    // accounted for in the refactoring of reusable blocks as occurring within
7650    // their own separate block editor / state (#7119).
7651    return state.blocks.isIgnoredChange;
7652  }
7653  /**
7654   * Returns the block attributes changed as a result of the last dispatched
7655   * action.
7656   *
7657   * @param {Object} state Block editor state.
7658   *
7659   * @return {Object<string,Object>} Subsets of block attributes changed, keyed
7660   *                                 by block client ID.
7661   */
7662  
7663  function __experimentalGetLastBlockAttributeChanges(state) {
7664    return state.lastBlockAttributesChange;
7665  }
7666  /**
7667   * Returns the available reusable blocks
7668   *
7669   * @param {Object} state Global application state.
7670   *
7671   * @return {Array} Reusable blocks
7672   */
7673  
7674  function getReusableBlocks(state) {
7675    var _state$settings$__exp, _state$settings2;
7676  
7677    return (_state$settings$__exp = state === null || state === void 0 ? void 0 : (_state$settings2 = state.settings) === null || _state$settings2 === void 0 ? void 0 : _state$settings2.__experimentalReusableBlocks) !== null && _state$settings$__exp !== void 0 ? _state$settings$__exp : EMPTY_ARRAY;
7678  }
7679  /**
7680   * Returns whether the navigation mode is enabled.
7681   *
7682   * @param {Object} state Editor state.
7683   *
7684   * @return {boolean} Is navigation mode enabled.
7685   */
7686  
7687  
7688  function selectors_isNavigationMode(state) {
7689    return state.isNavigationMode;
7690  }
7691  /**
7692   * Returns whether block moving mode is enabled.
7693   *
7694   * @param {Object} state Editor state.
7695   *
7696   * @return {string} Client Id of moving block.
7697   */
7698  
7699  function selectors_hasBlockMovingClientId(state) {
7700    return state.hasBlockMovingClientId;
7701  }
7702  /**
7703   * Returns true if the last change was an automatic change, false otherwise.
7704   *
7705   * @param {Object} state Global application state.
7706   *
7707   * @return {boolean} Whether the last change was automatic.
7708   */
7709  
7710  function didAutomaticChange(state) {
7711    return !!state.automaticChangeStatus;
7712  }
7713  /**
7714   * Returns true if the current highlighted block matches the block clientId.
7715   *
7716   * @param {Object} state    Global application state.
7717   * @param {string} clientId The block to check.
7718   *
7719   * @return {boolean} Whether the block is currently highlighted.
7720   */
7721  
7722  function isBlockHighlighted(state, clientId) {
7723    return state.highlightedBlock === clientId;
7724  }
7725  /**
7726   * Checks if a given block has controlled inner blocks.
7727   *
7728   * @param {Object} state    Global application state.
7729   * @param {string} clientId The block to check.
7730   *
7731   * @return {boolean} True if the block has controlled inner blocks.
7732   */
7733  
7734  function areInnerBlocksControlled(state, clientId) {
7735    return !!state.blocks.controlledInnerBlocks[clientId];
7736  }
7737  /**
7738   * Returns the clientId for the first 'active' block of a given array of block names.
7739   * A block is 'active' if it (or a child) is the selected block.
7740   * Returns the first match moving up the DOM from the selected block.
7741   *
7742   * @param {Object}   state            Global application state.
7743   * @param {string[]} validBlocksNames The names of block types to check for.
7744   *
7745   * @return {string} The matching block's clientId.
7746   */
7747  
7748  const __experimentalGetActiveBlockIdByBlockNames = rememo((state, validBlockNames) => {
7749    if (!validBlockNames.length) {
7750      return null;
7751    } // Check if selected block is a valid entity area.
7752  
7753  
7754    const selectedBlockClientId = getSelectedBlockClientId(state);
7755  
7756    if (validBlockNames.includes(getBlockName(state, selectedBlockClientId))) {
7757      return selectedBlockClientId;
7758    } // Check if first selected block is a child of a valid entity area.
7759  
7760  
7761    const multiSelectedBlockClientIds = getMultiSelectedBlockClientIds(state);
7762    const entityAreaParents = getBlockParentsByBlockName(state, selectedBlockClientId || multiSelectedBlockClientIds[0], validBlockNames);
7763  
7764    if (entityAreaParents) {
7765      // Last parent closest/most interior.
7766      return (0,external_lodash_namespaceObject.last)(entityAreaParents);
7767    }
7768  
7769    return null;
7770  }, (state, validBlockNames) => [state.selection.selectionStart.clientId, state.selection.selectionEnd.clientId, validBlockNames]);
7771  /**
7772   * Tells if the block with the passed clientId was just inserted.
7773   *
7774   * @param {Object}  state    Global application state.
7775   * @param {Object}  clientId Client Id of the block.
7776   * @param {?string} source   Optional insertion source of the block.
7777   * @return {boolean} True if the block matches the last block inserted from the specified source.
7778   */
7779  
7780  function wasBlockJustInserted(state, clientId, source) {
7781    const {
7782      lastBlockInserted
7783    } = state;
7784    return lastBlockInserted.clientId === clientId && lastBlockInserted.source === source;
7785  }
7786  
7787  ;// CONCATENATED MODULE: external ["wp","a11y"]
7788  var external_wp_a11y_namespaceObject = window["wp"]["a11y"];
7789  ;// CONCATENATED MODULE: external ["wp","deprecated"]
7790  var external_wp_deprecated_namespaceObject = window["wp"]["deprecated"];
7791  var external_wp_deprecated_default = /*#__PURE__*/__webpack_require__.n(external_wp_deprecated_namespaceObject);
7792  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/store/actions.js
7793  /**
7794   * External dependencies
7795   */
7796  
7797  /**
7798   * WordPress dependencies
7799   */
7800  
7801  
7802  
7803  
7804  
7805  
7806  /**
7807   * Internal dependencies
7808   */
7809  
7810  
7811  /**
7812   * Action which will insert a default block insert action if there
7813   * are no other blocks at the root of the editor. This action should be used
7814   * in actions which may result in no blocks remaining in the editor (removal,
7815   * replacement, etc).
7816   */
7817  
7818  const ensureDefaultBlock = () => _ref => {
7819    let {
7820      select,
7821      dispatch
7822    } = _ref;
7823    // To avoid a focus loss when removing the last block, assure there is
7824    // always a default block if the last of the blocks have been removed.
7825    const count = select.getBlockCount();
7826  
7827    if (count > 0) {
7828      return;
7829    } // If there's an custom appender, don't insert default block.
7830    // We have to remember to manually move the focus elsewhere to
7831    // prevent it from being lost though.
7832  
7833  
7834    const {
7835      __unstableHasCustomAppender
7836    } = select.getSettings();
7837  
7838    if (__unstableHasCustomAppender) {
7839      return;
7840    }
7841  
7842    dispatch.insertDefaultBlock();
7843  };
7844  /**
7845   * Action that resets blocks state to the specified array of blocks, taking precedence
7846   * over any other content reflected as an edit in state.
7847   *
7848   * @param {Array} blocks Array of blocks.
7849   */
7850  
7851  
7852  const resetBlocks = blocks => _ref2 => {
7853    let {
7854      dispatch
7855    } = _ref2;
7856    dispatch({
7857      type: 'RESET_BLOCKS',
7858      blocks
7859    });
7860    dispatch(validateBlocksToTemplate(blocks));
7861  };
7862  /**
7863   * Block validity is a function of blocks state (at the point of a
7864   * reset) and the template setting. As a compromise to its placement
7865   * across distinct parts of state, it is implemented here as a side-
7866   * effect of the block reset action.
7867   *
7868   * @param {Array} blocks Array of blocks.
7869   */
7870  
7871  const validateBlocksToTemplate = blocks => _ref3 => {
7872    let {
7873      select,
7874      dispatch
7875    } = _ref3;
7876    const template = select.getTemplate();
7877    const templateLock = select.getTemplateLock(); // Unlocked templates are considered always valid because they act
7878    // as default values only.
7879  
7880    const isBlocksValidToTemplate = !template || templateLock !== 'all' || (0,external_wp_blocks_namespaceObject.doBlocksMatchTemplate)(blocks, template); // Update if validity has changed.
7881  
7882    const isValidTemplate = select.isValidTemplate();
7883  
7884    if (isBlocksValidToTemplate !== isValidTemplate) {
7885      dispatch.setTemplateValidity(isBlocksValidToTemplate);
7886      return isBlocksValidToTemplate;
7887    }
7888  };
7889  /**
7890   * A block selection object.
7891   *
7892   * @typedef {Object} WPBlockSelection
7893   *
7894   * @property {string} clientId     A block client ID.
7895   * @property {string} attributeKey A block attribute key.
7896   * @property {number} offset       An attribute value offset, based on the rich
7897   *                                 text value. See `wp.richText.create`.
7898   */
7899  
7900  /**
7901   * A selection object.
7902   *
7903   * @typedef {Object} WPSelection
7904   *
7905   * @property {WPBlockSelection} start The selection start.
7906   * @property {WPBlockSelection} end   The selection end.
7907   */
7908  
7909  /* eslint-disable jsdoc/valid-types */
7910  
7911  /**
7912   * Returns an action object used in signalling that selection state should be
7913   * reset to the specified selection.
7914   *
7915   * @param {WPBlockSelection} selectionStart  The selection start.
7916   * @param {WPBlockSelection} selectionEnd    The selection end.
7917   * @param {0|-1|null}        initialPosition Initial block position.
7918   *
7919   * @return {Object} Action object.
7920   */
7921  
7922  function resetSelection(selectionStart, selectionEnd, initialPosition) {
7923    /* eslint-enable jsdoc/valid-types */
7924    return {
7925      type: 'RESET_SELECTION',
7926      selectionStart,
7927      selectionEnd,
7928      initialPosition
7929    };
7930  }
7931  /**
7932   * Returns an action object used in signalling that blocks have been received.
7933   * Unlike resetBlocks, these should be appended to the existing known set, not
7934   * replacing.
7935   *
7936   * @deprecated
7937   *
7938   * @param {Object[]} blocks Array of block objects.
7939   *
7940   * @return {Object} Action object.
7941   */
7942  
7943  function receiveBlocks(blocks) {
7944    external_wp_deprecated_default()('wp.data.dispatch( "core/block-editor" ).receiveBlocks', {
7945      since: '5.9',
7946      alternative: 'resetBlocks or insertBlocks'
7947    });
7948    return {
7949      type: 'RECEIVE_BLOCKS',
7950      blocks
7951    };
7952  }
7953  /**
7954   * Action that updates attributes of multiple blocks with the specified client IDs.
7955   *
7956   * @param {string|string[]} clientIds     Block client IDs.
7957   * @param {Object}          attributes    Block attributes to be merged. Should be keyed by clientIds if
7958   *                                        uniqueByBlock is true.
7959   * @param {boolean}         uniqueByBlock true if each block in clientIds array has a unique set of attributes
7960   * @return {Object} Action object.
7961   */
7962  
7963  function updateBlockAttributes(clientIds, attributes) {
7964    let uniqueByBlock = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
7965    return {
7966      type: 'UPDATE_BLOCK_ATTRIBUTES',
7967      clientIds: (0,external_lodash_namespaceObject.castArray)(clientIds),
7968      attributes,
7969      uniqueByBlock
7970    };
7971  }
7972  /**
7973   * Action that updates the block with the specified client ID.
7974   *
7975   * @param {string} clientId Block client ID.
7976   * @param {Object} updates  Block attributes to be merged.
7977   *
7978   * @return {Object} Action object.
7979   */
7980  
7981  function updateBlock(clientId, updates) {
7982    return {
7983      type: 'UPDATE_BLOCK',
7984      clientId,
7985      updates
7986    };
7987  }
7988  /* eslint-disable jsdoc/valid-types */
7989  
7990  /**
7991   * Returns an action object used in signalling that the block with the
7992   * specified client ID has been selected, optionally accepting a position
7993   * value reflecting its selection directionality. An initialPosition of -1
7994   * reflects a reverse selection.
7995   *
7996   * @param {string}    clientId        Block client ID.
7997   * @param {0|-1|null} initialPosition Optional initial position. Pass as -1 to
7998   *                                    reflect reverse selection.
7999   *
8000   * @return {Object} Action object.
8001   */
8002  
8003  function selectBlock(clientId) {
8004    let initialPosition = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
8005  
8006    /* eslint-enable jsdoc/valid-types */
8007    return {
8008      type: 'SELECT_BLOCK',
8009      initialPosition,
8010      clientId
8011    };
8012  }
8013  /**
8014   * Yields action objects used in signalling that the block preceding the given
8015   * clientId should be selected.
8016   *
8017   * @param {string} clientId Block client ID.
8018   */
8019  
8020  const selectPreviousBlock = clientId => _ref4 => {
8021    let {
8022      select,
8023      dispatch
8024    } = _ref4;
8025    const previousBlockClientId = select.getPreviousBlockClientId(clientId);
8026  
8027    if (previousBlockClientId) {
8028      dispatch.selectBlock(previousBlockClientId, -1);
8029    }
8030  };
8031  /**
8032   * Yields action objects used in signalling that the block following the given
8033   * clientId should be selected.
8034   *
8035   * @param {string} clientId Block client ID.
8036   */
8037  
8038  const selectNextBlock = clientId => _ref5 => {
8039    let {
8040      select,
8041      dispatch
8042    } = _ref5;
8043    const nextBlockClientId = select.getNextBlockClientId(clientId);
8044  
8045    if (nextBlockClientId) {
8046      dispatch.selectBlock(nextBlockClientId);
8047    }
8048  };
8049  /**
8050   * Action that starts block multi-selection.
8051   *
8052   * @return {Object} Action object.
8053   */
8054  
8055  function startMultiSelect() {
8056    return {
8057      type: 'START_MULTI_SELECT'
8058    };
8059  }
8060  /**
8061   * Action that stops block multi-selection.
8062   *
8063   * @return {Object} Action object.
8064   */
8065  
8066  function stopMultiSelect() {
8067    return {
8068      type: 'STOP_MULTI_SELECT'
8069    };
8070  }
8071  /**
8072   * Action that changes block multi-selection.
8073   *
8074   * @param {string}      start                         First block of the multi selection.
8075   * @param {string}      end                           Last block of the multiselection.
8076   * @param {number|null} __experimentalInitialPosition Optional initial position. Pass as null to skip focus within editor canvas.
8077   */
8078  
8079  const multiSelect = function (start, end) {
8080    let __experimentalInitialPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
8081  
8082    return _ref6 => {
8083      let {
8084        select,
8085        dispatch
8086      } = _ref6;
8087      const startBlockRootClientId = select.getBlockRootClientId(start);
8088      const endBlockRootClientId = select.getBlockRootClientId(end); // Only allow block multi-selections at the same level.
8089  
8090      if (startBlockRootClientId !== endBlockRootClientId) {
8091        return;
8092      }
8093  
8094      dispatch({
8095        type: 'MULTI_SELECT',
8096        start,
8097        end,
8098        initialPosition: __experimentalInitialPosition
8099      });
8100      const blockCount = select.getSelectedBlockCount();
8101      (0,external_wp_a11y_namespaceObject.speak)((0,external_wp_i18n_namespaceObject.sprintf)(
8102      /* translators: %s: number of selected blocks */
8103      (0,external_wp_i18n_namespaceObject._n)('%s block selected.', '%s blocks selected.', blockCount), blockCount), 'assertive');
8104    };
8105  };
8106  /**
8107   * Action that clears the block selection.
8108   *
8109   * @return {Object} Action object.
8110   */
8111  
8112  function clearSelectedBlock() {
8113    return {
8114      type: 'CLEAR_SELECTED_BLOCK'
8115    };
8116  }
8117  /**
8118   * Action that enables or disables block selection.
8119   *
8120   * @param {boolean} [isSelectionEnabled=true] Whether block selection should
8121   *                                            be enabled.
8122   *
8123   * @return {Object} Action object.
8124   */
8125  
8126  function toggleSelection() {
8127    let isSelectionEnabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
8128    return {
8129      type: 'TOGGLE_SELECTION',
8130      isSelectionEnabled
8131    };
8132  }
8133  
8134  function getBlocksWithDefaultStylesApplied(blocks, blockEditorSettings) {
8135    var _blockEditorSettings$, _blockEditorSettings$2;
8136  
8137    const preferredStyleVariations = (_blockEditorSettings$ = blockEditorSettings === null || blockEditorSettings === void 0 ? void 0 : (_blockEditorSettings$2 = blockEditorSettings.__experimentalPreferredStyleVariations) === null || _blockEditorSettings$2 === void 0 ? void 0 : _blockEditorSettings$2.value) !== null && _blockEditorSettings$ !== void 0 ? _blockEditorSettings$ : {};
8138    return blocks.map(block => {
8139      var _block$attributes;
8140  
8141      const blockName = block.name;
8142  
8143      if (!(0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockName, 'defaultStylePicker', true)) {
8144        return block;
8145      }
8146  
8147      if (!preferredStyleVariations[blockName]) {
8148        return block;
8149      }
8150  
8151      const className = (_block$attributes = block.attributes) === null || _block$attributes === void 0 ? void 0 : _block$attributes.className;
8152  
8153      if (className !== null && className !== void 0 && className.includes('is-style-')) {
8154        return block;
8155      }
8156  
8157      const {
8158        attributes = {}
8159      } = block;
8160      const blockStyle = preferredStyleVariations[blockName];
8161      return { ...block,
8162        attributes: { ...attributes,
8163          className: `$className || ''} is-style-$blockStyle}`.trim()
8164        }
8165      };
8166    });
8167  }
8168  /* eslint-disable jsdoc/valid-types */
8169  
8170  /**
8171   * Action that replaces given blocks with one or more replacement blocks.
8172   *
8173   * @param {(string|string[])} clientIds       Block client ID(s) to replace.
8174   * @param {(Object|Object[])} blocks          Replacement block(s).
8175   * @param {number}            indexToSelect   Index of replacement block to select.
8176   * @param {0|-1|null}         initialPosition Index of caret after in the selected block after the operation.
8177   * @param {?Object}           meta            Optional Meta values to be passed to the action object.
8178   *
8179   * @return {Object} Action object.
8180   */
8181  
8182  
8183  const replaceBlocks = function (clientIds, blocks, indexToSelect) {
8184    let initialPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
8185    let meta = arguments.length > 4 ? arguments[4] : undefined;
8186    return _ref7 => {
8187      let {
8188        select,
8189        dispatch
8190      } = _ref7;
8191  
8192      /* eslint-enable jsdoc/valid-types */
8193      clientIds = (0,external_lodash_namespaceObject.castArray)(clientIds);
8194      blocks = getBlocksWithDefaultStylesApplied((0,external_lodash_namespaceObject.castArray)(blocks), select.getSettings());
8195      const rootClientId = select.getBlockRootClientId((0,external_lodash_namespaceObject.first)(clientIds)); // Replace is valid if the new blocks can be inserted in the root block.
8196  
8197      for (let index = 0; index < blocks.length; index++) {
8198        const block = blocks[index];
8199        const canInsertBlock = select.canInsertBlockType(block.name, rootClientId);
8200  
8201        if (!canInsertBlock) {
8202          return;
8203        }
8204      }
8205  
8206      dispatch({
8207        type: 'REPLACE_BLOCKS',
8208        clientIds,
8209        blocks,
8210        time: Date.now(),
8211        indexToSelect,
8212        initialPosition,
8213        meta
8214      });
8215      dispatch(ensureDefaultBlock());
8216    };
8217  };
8218  /**
8219   * Action that replaces a single block with one or more replacement blocks.
8220   *
8221   * @param {(string|string[])} clientId Block client ID to replace.
8222   * @param {(Object|Object[])} block    Replacement block(s).
8223   *
8224   * @return {Object} Action object.
8225   */
8226  
8227  function replaceBlock(clientId, block) {
8228    return replaceBlocks(clientId, block);
8229  }
8230  /**
8231   * Higher-order action creator which, given the action type to dispatch creates
8232   * an action creator for managing block movement.
8233   *
8234   * @param {string} type Action type to dispatch.
8235   *
8236   * @return {Function} Action creator.
8237   */
8238  
8239  const createOnMove = type => (clientIds, rootClientId) => _ref8 => {
8240    let {
8241      select,
8242      dispatch
8243    } = _ref8;
8244    // If one of the blocks is locked or the parent is locked, we cannot move any block.
8245    const canMoveBlocks = select.canMoveBlocks(clientIds, rootClientId);
8246  
8247    if (!canMoveBlocks) {
8248      return;
8249    }
8250  
8251    dispatch({
8252      type,
8253      clientIds: (0,external_lodash_namespaceObject.castArray)(clientIds),
8254      rootClientId
8255    });
8256  };
8257  
8258  const moveBlocksDown = createOnMove('MOVE_BLOCKS_DOWN');
8259  const moveBlocksUp = createOnMove('MOVE_BLOCKS_UP');
8260  /**
8261   * Action that moves given blocks to a new position.
8262   *
8263   * @param {?string} clientIds        The client IDs of the blocks.
8264   * @param {?string} fromRootClientId Root client ID source.
8265   * @param {?string} toRootClientId   Root client ID destination.
8266   * @param {number}  index            The index to move the blocks to.
8267   */
8268  
8269  const moveBlocksToPosition = function (clientIds) {
8270    let fromRootClientId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
8271    let toRootClientId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
8272    let index = arguments.length > 3 ? arguments[3] : undefined;
8273    return _ref9 => {
8274      let {
8275        select,
8276        dispatch
8277      } = _ref9;
8278      const canMoveBlocks = select.canMoveBlocks(clientIds, fromRootClientId); // If one of the blocks is locked or the parent is locked, we cannot move any block.
8279  
8280      if (!canMoveBlocks) {
8281        return;
8282      } // If moving inside the same root block the move is always possible.
8283  
8284  
8285      if (fromRootClientId !== toRootClientId) {
8286        const canRemoveBlocks = select.canRemoveBlocks(clientIds, fromRootClientId); // If we're moving to another block, it means we're deleting blocks from
8287        // the original block, so we need to check if removing is possible.
8288  
8289        if (!canRemoveBlocks) {
8290          return;
8291        }
8292  
8293        const canInsertBlocks = select.canInsertBlocks(clientIds, toRootClientId); // If moving to other parent block, the move is possible if we can insert a block of the same type inside the new parent block.
8294  
8295        if (!canInsertBlocks) {
8296          return;
8297        }
8298      }
8299  
8300      dispatch({
8301        type: 'MOVE_BLOCKS_TO_POSITION',
8302        fromRootClientId,
8303        toRootClientId,
8304        clientIds,
8305        index
8306      });
8307    };
8308  };
8309  /**
8310   * Action that moves given block to a new position.
8311   *
8312   * @param {?string} clientId         The client ID of the block.
8313   * @param {?string} fromRootClientId Root client ID source.
8314   * @param {?string} toRootClientId   Root client ID destination.
8315   * @param {number}  index            The index to move the block to.
8316   */
8317  
8318  function moveBlockToPosition(clientId) {
8319    let fromRootClientId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
8320    let toRootClientId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
8321    let index = arguments.length > 3 ? arguments[3] : undefined;
8322    return moveBlocksToPosition([clientId], fromRootClientId, toRootClientId, index);
8323  }
8324  /**
8325   * Action that inserts a single block, optionally at a specific index respective a root block list.
8326   *
8327   * @param {Object}   block           Block object to insert.
8328   * @param {?number}  index           Index at which block should be inserted.
8329   * @param {?string}  rootClientId    Optional root client ID of block list on which to insert.
8330   * @param {?boolean} updateSelection If true block selection will be updated. If false, block selection will not change. Defaults to true.
8331   * @param {?Object}  meta            Optional Meta values to be passed to the action object.
8332   *
8333   * @return {Object} Action object.
8334   */
8335  
8336  function insertBlock(block, index, rootClientId, updateSelection, meta) {
8337    return insertBlocks([block], index, rootClientId, updateSelection, 0, meta);
8338  }
8339  /* eslint-disable jsdoc/valid-types */
8340  
8341  /**
8342   * Action that inserts an array of blocks, optionally at a specific index respective a root block list.
8343   *
8344   * @param {Object[]}  blocks          Block objects to insert.
8345   * @param {?number}   index           Index at which block should be inserted.
8346   * @param {?string}   rootClientId    Optional root client ID of block list on which to insert.
8347   * @param {?boolean}  updateSelection If true block selection will be updated.  If false, block selection will not change. Defaults to true.
8348   * @param {0|-1|null} initialPosition Initial focus position. Setting it to null prevent focusing the inserted block.
8349   * @param {?Object}   meta            Optional Meta values to be passed to the action object.
8350   * @return {Object} Action object.
8351   */
8352  
8353  const insertBlocks = function (blocks, index, rootClientId) {
8354    let updateSelection = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
8355    let initialPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;
8356    let meta = arguments.length > 5 ? arguments[5] : undefined;
8357    return _ref10 => {
8358      let {
8359        select,
8360        dispatch
8361      } = _ref10;
8362  
8363      /* eslint-enable jsdoc/valid-types */
8364      if ((0,external_lodash_namespaceObject.isObject)(initialPosition)) {
8365        meta = initialPosition;
8366        initialPosition = 0;
8367        external_wp_deprecated_default()("meta argument in wp.data.dispatch('core/block-editor')", {
8368          since: '5.8',
8369          hint: 'The meta argument is now the 6th argument of the function'
8370        });
8371      }
8372  
8373      blocks = getBlocksWithDefaultStylesApplied((0,external_lodash_namespaceObject.castArray)(blocks), select.getSettings());
8374      const allowedBlocks = [];
8375  
8376      for (const block of blocks) {
8377        const isValid = select.canInsertBlockType(block.name, rootClientId);
8378  
8379        if (isValid) {
8380          allowedBlocks.push(block);
8381        }
8382      }
8383  
8384      if (allowedBlocks.length) {
8385        dispatch({
8386          type: 'INSERT_BLOCKS',
8387          blocks: allowedBlocks,
8388          index,
8389          rootClientId,
8390          time: Date.now(),
8391          updateSelection,
8392          initialPosition: updateSelection ? initialPosition : null,
8393          meta
8394        });
8395      }
8396    };
8397  };
8398  /**
8399   * Action that shows the insertion point.
8400   *
8401   * @param {?string} rootClientId      Optional root client ID of block list on
8402   *                                    which to insert.
8403   * @param {?number} index             Index at which block should be inserted.
8404   * @param {Object}  __unstableOptions Whether or not to show an inserter button.
8405   *
8406   * @return {Object} Action object.
8407   */
8408  
8409  function showInsertionPoint(rootClientId, index) {
8410    let __unstableOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
8411  
8412    const {
8413      __unstableWithInserter
8414    } = __unstableOptions;
8415    return {
8416      type: 'SHOW_INSERTION_POINT',
8417      rootClientId,
8418      index,
8419      __unstableWithInserter
8420    };
8421  }
8422  /**
8423   * Action that hides the insertion point.
8424   *
8425   * @return {Object} Action object.
8426   */
8427  
8428  function hideInsertionPoint() {
8429    return {
8430      type: 'HIDE_INSERTION_POINT'
8431    };
8432  }
8433  /**
8434   * Action that resets the template validity.
8435   *
8436   * @param {boolean} isValid template validity flag.
8437   *
8438   * @return {Object} Action object.
8439   */
8440  
8441  function setTemplateValidity(isValid) {
8442    return {
8443      type: 'SET_TEMPLATE_VALIDITY',
8444      isValid
8445    };
8446  }
8447  /**
8448   * Action that synchronizes the template with the list of blocks.
8449   *
8450   * @return {Object} Action object.
8451   */
8452  
8453  const synchronizeTemplate = () => _ref11 => {
8454    let {
8455      select,
8456      dispatch
8457    } = _ref11;
8458    dispatch({
8459      type: 'SYNCHRONIZE_TEMPLATE'
8460    });
8461    const blocks = select.getBlocks();
8462    const template = select.getTemplate();
8463    const updatedBlockList = (0,external_wp_blocks_namespaceObject.synchronizeBlocksWithTemplate)(blocks, template);
8464    dispatch.resetBlocks(updatedBlockList);
8465  };
8466  /**
8467   * Delete the current selection.
8468   *
8469   * @param {boolean} isForward
8470   */
8471  
8472  const __unstableDeleteSelection = isForward => _ref12 => {
8473    let {
8474      registry,
8475      select,
8476      dispatch
8477    } = _ref12;
8478    const selectionAnchor = select.getSelectionStart();
8479    const selectionFocus = select.getSelectionEnd();
8480    if (selectionAnchor.clientId === selectionFocus.clientId) return; // It's not mergeable if there's no rich text selection.
8481  
8482    if (!selectionAnchor.attributeKey || !selectionFocus.attributeKey || typeof selectionAnchor.offset === 'undefined' || typeof selectionFocus.offset === 'undefined') return false;
8483    const anchorRootClientId = select.getBlockRootClientId(selectionAnchor.clientId);
8484    const focusRootClientId = select.getBlockRootClientId(selectionFocus.clientId); // It's not mergeable if the selection doesn't start and end in the same
8485    // block list. Maybe in the future it should be allowed.
8486  
8487    if (anchorRootClientId !== focusRootClientId) {
8488      return;
8489    }
8490  
8491    const blockOrder = select.getBlockOrder(anchorRootClientId);
8492    const anchorIndex = blockOrder.indexOf(selectionAnchor.clientId);
8493    const focusIndex = blockOrder.indexOf(selectionFocus.clientId); // Reassign selection start and end based on order.
8494  
8495    let selectionStart, selectionEnd;
8496  
8497    if (anchorIndex > focusIndex) {
8498      selectionStart = selectionFocus;
8499      selectionEnd = selectionAnchor;
8500    } else {
8501      selectionStart = selectionAnchor;
8502      selectionEnd = selectionFocus;
8503    }
8504  
8505    const targetSelection = isForward ? selectionEnd : selectionStart;
8506    const targetBlock = select.getBlock(targetSelection.clientId);
8507    const targetBlockType = (0,external_wp_blocks_namespaceObject.getBlockType)(targetBlock.name);
8508  
8509    if (!targetBlockType.merge) {
8510      return;
8511    }
8512  
8513    const selectionA = selectionStart;
8514    const selectionB = selectionEnd;
8515    const blockA = select.getBlock(selectionA.clientId);
8516    const blockAType = (0,external_wp_blocks_namespaceObject.getBlockType)(blockA.name);
8517    const blockB = select.getBlock(selectionB.clientId);
8518    const blockBType = (0,external_wp_blocks_namespaceObject.getBlockType)(blockB.name);
8519    const htmlA = blockA.attributes[selectionA.attributeKey];
8520    const htmlB = blockB.attributes[selectionB.attributeKey];
8521    const attributeDefinitionA = blockAType.attributes[selectionA.attributeKey];
8522    const attributeDefinitionB = blockBType.attributes[selectionB.attributeKey];
8523    let valueA = (0,external_wp_richText_namespaceObject.create)({
8524      html: htmlA,
8525      ...mapRichTextSettings(attributeDefinitionA)
8526    });
8527    let valueB = (0,external_wp_richText_namespaceObject.create)({
8528      html: htmlB,
8529      ...mapRichTextSettings(attributeDefinitionB)
8530    }); // A robust way to retain selection position through various transforms
8531    // is to insert a special character at the position and then recover it.
8532  
8533    const START_OF_SELECTED_AREA = '\u0086';
8534    valueA = (0,external_wp_richText_namespaceObject.remove)(valueA, selectionA.offset, valueA.text.length);
8535    valueB = (0,external_wp_richText_namespaceObject.insert)(valueB, START_OF_SELECTED_AREA, 0, selectionB.offset); // Clone the blocks so we don't manipulate the original.
8536  
8537    const cloneA = (0,external_wp_blocks_namespaceObject.cloneBlock)(blockA, {
8538      [selectionA.attributeKey]: (0,external_wp_richText_namespaceObject.toHTMLString)({
8539        value: valueA,
8540        ...mapRichTextSettings(attributeDefinitionA)
8541      })
8542    });
8543    const cloneB = (0,external_wp_blocks_namespaceObject.cloneBlock)(blockB, {
8544      [selectionB.attributeKey]: (0,external_wp_richText_namespaceObject.toHTMLString)({
8545        value: valueB,
8546        ...mapRichTextSettings(attributeDefinitionB)
8547      })
8548    });
8549    const followingBlock = isForward ? cloneA : cloneB; // We can only merge blocks with similar types
8550    // thus, we transform the block to merge first
8551  
8552    const blocksWithTheSameType = blockA.name === blockB.name ? [followingBlock] : (0,external_wp_blocks_namespaceObject.switchToBlockType)(followingBlock, targetBlockType.name); // If the block types can not match, do nothing
8553  
8554    if (!blocksWithTheSameType || !blocksWithTheSameType.length) {
8555      return;
8556    }
8557  
8558    let updatedAttributes;
8559  
8560    if (isForward) {
8561      const blockToMerge = blocksWithTheSameType.pop();
8562      updatedAttributes = targetBlockType.merge(blockToMerge.attributes, cloneB.attributes);
8563    } else {
8564      const blockToMerge = blocksWithTheSameType.shift();
8565      updatedAttributes = targetBlockType.merge(cloneA.attributes, blockToMerge.attributes);
8566    }
8567  
8568    const newAttributeKey = (0,external_lodash_namespaceObject.findKey)(updatedAttributes, v => typeof v === 'string' && v.indexOf(START_OF_SELECTED_AREA) !== -1);
8569    const convertedHtml = updatedAttributes[newAttributeKey];
8570    const convertedValue = (0,external_wp_richText_namespaceObject.create)({
8571      html: convertedHtml,
8572      ...mapRichTextSettings(targetBlockType.attributes[newAttributeKey])
8573    });
8574    const newOffset = convertedValue.text.indexOf(START_OF_SELECTED_AREA);
8575    const newValue = (0,external_wp_richText_namespaceObject.remove)(convertedValue, newOffset, newOffset + 1);
8576    const newHtml = (0,external_wp_richText_namespaceObject.toHTMLString)({
8577      value: newValue,
8578      ...mapRichTextSettings(targetBlockType.attributes[newAttributeKey])
8579    });
8580    updatedAttributes[newAttributeKey] = newHtml;
8581    const selectedBlockClientIds = select.getSelectedBlockClientIds();
8582    const replacement = [...(isForward ? blocksWithTheSameType : []), { // Preserve the original client ID.
8583      ...targetBlock,
8584      attributes: { ...targetBlock.attributes,
8585        ...updatedAttributes
8586      }
8587    }, ...(isForward ? [] : blocksWithTheSameType)];
8588    registry.batch(() => {
8589      dispatch.selectionChange(targetBlock.clientId, newAttributeKey, newOffset, newOffset);
8590      dispatch.replaceBlocks(selectedBlockClientIds, replacement, 0, // If we don't pass the `indexToSelect` it will default to the last block.
8591      select.getSelectedBlocksInitialCaretPosition());
8592    });
8593  };
8594  /**
8595   * Split the current selection.
8596   */
8597  
8598  const __unstableSplitSelection = () => _ref13 => {
8599    let {
8600      select,
8601      dispatch
8602    } = _ref13;
8603    const selectionAnchor = select.getSelectionStart();
8604    const selectionFocus = select.getSelectionEnd();
8605    if (selectionAnchor.clientId === selectionFocus.clientId) return; // Can't split if the selection is not set.
8606  
8607    if (!selectionAnchor.attributeKey || !selectionFocus.attributeKey || typeof selectionAnchor.offset === 'undefined' || typeof selectionFocus.offset === 'undefined') return;
8608    const anchorRootClientId = select.getBlockRootClientId(selectionAnchor.clientId);
8609    const focusRootClientId = select.getBlockRootClientId(selectionFocus.clientId); // It's not splittable if the selection doesn't start and end in the same
8610    // block list. Maybe in the future it should be allowed.
8611  
8612    if (anchorRootClientId !== focusRootClientId) {
8613      return;
8614    }
8615  
8616    const blockOrder = select.getBlockOrder(anchorRootClientId);
8617    const anchorIndex = blockOrder.indexOf(selectionAnchor.clientId);
8618    const focusIndex = blockOrder.indexOf(selectionFocus.clientId); // Reassign selection start and end based on order.
8619  
8620    let selectionStart, selectionEnd;
8621  
8622    if (anchorIndex > focusIndex) {
8623      selectionStart = selectionFocus;
8624      selectionEnd = selectionAnchor;
8625    } else {
8626      selectionStart = selectionAnchor;
8627      selectionEnd = selectionFocus;
8628    }
8629  
8630    const selectionA = selectionStart;
8631    const selectionB = selectionEnd;
8632    const blockA = select.getBlock(selectionA.clientId);
8633    const blockAType = (0,external_wp_blocks_namespaceObject.getBlockType)(blockA.name);
8634    const blockB = select.getBlock(selectionB.clientId);
8635    const blockBType = (0,external_wp_blocks_namespaceObject.getBlockType)(blockB.name);
8636    const htmlA = blockA.attributes[selectionA.attributeKey];
8637    const htmlB = blockB.attributes[selectionB.attributeKey];
8638    const attributeDefinitionA = blockAType.attributes[selectionA.attributeKey];
8639    const attributeDefinitionB = blockBType.attributes[selectionB.attributeKey];
8640    let valueA = (0,external_wp_richText_namespaceObject.create)({
8641      html: htmlA,
8642      ...mapRichTextSettings(attributeDefinitionA)
8643    });
8644    let valueB = (0,external_wp_richText_namespaceObject.create)({
8645      html: htmlB,
8646      ...mapRichTextSettings(attributeDefinitionB)
8647    });
8648    valueA = (0,external_wp_richText_namespaceObject.remove)(valueA, selectionA.offset, valueA.text.length);
8649    valueB = (0,external_wp_richText_namespaceObject.remove)(valueB, 0, selectionB.offset);
8650    dispatch.replaceBlocks(select.getSelectedBlockClientIds(), [{ // Preserve the original client ID.
8651      ...blockA,
8652      attributes: { ...blockA.attributes,
8653        [selectionA.attributeKey]: (0,external_wp_richText_namespaceObject.toHTMLString)({
8654          value: valueA,
8655          ...mapRichTextSettings(attributeDefinitionA)
8656        })
8657      }
8658    }, (0,external_wp_blocks_namespaceObject.createBlock)((0,external_wp_blocks_namespaceObject.getDefaultBlockName)()), { // Preserve the original client ID.
8659      ...blockB,
8660      attributes: { ...blockB.attributes,
8661        [selectionB.attributeKey]: (0,external_wp_richText_namespaceObject.toHTMLString)({
8662          value: valueB,
8663          ...mapRichTextSettings(attributeDefinitionB)
8664        })
8665      }
8666    }], 1, // If we don't pass the `indexToSelect` it will default to the last block.
8667    select.getSelectedBlocksInitialCaretPosition());
8668  };
8669  /**
8670   * Expand the selection to cover the entire blocks, removing partial selection.
8671   */
8672  
8673  const __unstableExpandSelection = () => _ref14 => {
8674    let {
8675      select,
8676      dispatch
8677    } = _ref14;
8678    const selectionAnchor = select.getSelectionStart();
8679    const selectionFocus = select.getSelectionEnd();
8680    dispatch.selectionChange({
8681      start: {
8682        clientId: selectionAnchor.clientId
8683      },
8684      end: {
8685        clientId: selectionFocus.clientId
8686      }
8687    });
8688  };
8689  /**
8690   * Action that merges two blocks.
8691   *
8692   * @param {string} firstBlockClientId  Client ID of the first block to merge.
8693   * @param {string} secondBlockClientId Client ID of the second block to merge.
8694   */
8695  
8696  const mergeBlocks = (firstBlockClientId, secondBlockClientId) => _ref15 => {
8697    let {
8698      select,
8699      dispatch
8700    } = _ref15;
8701    const blocks = [firstBlockClientId, secondBlockClientId];
8702    dispatch({
8703      type: 'MERGE_BLOCKS',
8704      blocks
8705    });
8706    const [clientIdA, clientIdB] = blocks;
8707    const blockA = select.getBlock(clientIdA);
8708    const blockAType = (0,external_wp_blocks_namespaceObject.getBlockType)(blockA.name); // Only focus the previous block if it's not mergeable.
8709  
8710    if (blockAType && !blockAType.merge) {
8711      dispatch.selectBlock(blockA.clientId);
8712      return;
8713    }
8714  
8715    const blockB = select.getBlock(clientIdB);
8716    const blockBType = (0,external_wp_blocks_namespaceObject.getBlockType)(blockB.name);
8717    const {
8718      clientId,
8719      attributeKey,
8720      offset
8721    } = select.getSelectionStart();
8722    const selectedBlockType = clientId === clientIdA ? blockAType : blockBType;
8723    const attributeDefinition = selectedBlockType.attributes[attributeKey];
8724    const canRestoreTextSelection = (clientId === clientIdA || clientId === clientIdB) && attributeKey !== undefined && offset !== undefined && // We cannot restore text selection if the RichText identifier
8725    // is not a defined block attribute key. This can be the case if the
8726    // fallback intance ID is used to store selection (and no RichText
8727    // identifier is set), or when the identifier is wrong.
8728    !!attributeDefinition;
8729  
8730    if (!attributeDefinition) {
8731      if (typeof attributeKey === 'number') {
8732        window.console.error(`RichText needs an identifier prop that is the block attribute key of the attribute it controls. Its type is expected to be a string, but was $typeof attributeKey}`);
8733      } else {
8734        window.console.error('The RichText identifier prop does not match any attributes defined by the block.');
8735      }
8736    } // A robust way to retain selection position through various transforms
8737    // is to insert a special character at the position and then recover it.
8738  
8739  
8740    const START_OF_SELECTED_AREA = '\u0086'; // Clone the blocks so we don't insert the character in a "live" block.
8741  
8742    const cloneA = (0,external_wp_blocks_namespaceObject.cloneBlock)(blockA);
8743    const cloneB = (0,external_wp_blocks_namespaceObject.cloneBlock)(blockB);
8744  
8745    if (canRestoreTextSelection) {
8746      const selectedBlock = clientId === clientIdA ? cloneA : cloneB;
8747      const html = selectedBlock.attributes[attributeKey];
8748      const value = (0,external_wp_richText_namespaceObject.insert)((0,external_wp_richText_namespaceObject.create)({
8749        html,
8750        ...mapRichTextSettings(attributeDefinition)
8751      }), START_OF_SELECTED_AREA, offset, offset);
8752      selectedBlock.attributes[attributeKey] = (0,external_wp_richText_namespaceObject.toHTMLString)({
8753        value,
8754        ...mapRichTextSettings(attributeDefinition)
8755      });
8756    } // We can only merge blocks with similar types
8757    // thus, we transform the block to merge first.
8758  
8759  
8760    const blocksWithTheSameType = blockA.name === blockB.name ? [cloneB] : (0,external_wp_blocks_namespaceObject.switchToBlockType)(cloneB, blockA.name); // If the block types can not match, do nothing.
8761  
8762    if (!blocksWithTheSameType || !blocksWithTheSameType.length) {
8763      return;
8764    } // Calling the merge to update the attributes and remove the block to be merged.
8765  
8766  
8767    const updatedAttributes = blockAType.merge(cloneA.attributes, blocksWithTheSameType[0].attributes);
8768  
8769    if (canRestoreTextSelection) {
8770      const newAttributeKey = (0,external_lodash_namespaceObject.findKey)(updatedAttributes, v => typeof v === 'string' && v.indexOf(START_OF_SELECTED_AREA) !== -1);
8771      const convertedHtml = updatedAttributes[newAttributeKey];
8772      const convertedValue = (0,external_wp_richText_namespaceObject.create)({
8773        html: convertedHtml,
8774        ...mapRichTextSettings(blockAType.attributes[newAttributeKey])
8775      });
8776      const newOffset = convertedValue.text.indexOf(START_OF_SELECTED_AREA);
8777      const newValue = (0,external_wp_richText_namespaceObject.remove)(convertedValue, newOffset, newOffset + 1);
8778      const newHtml = (0,external_wp_richText_namespaceObject.toHTMLString)({
8779        value: newValue,
8780        ...mapRichTextSettings(blockAType.attributes[newAttributeKey])
8781      });
8782      updatedAttributes[newAttributeKey] = newHtml;
8783      dispatch.selectionChange(blockA.clientId, newAttributeKey, newOffset, newOffset);
8784    }
8785  
8786    dispatch.replaceBlocks([blockA.clientId, blockB.clientId], [{ ...blockA,
8787      attributes: { ...blockA.attributes,
8788        ...updatedAttributes
8789      }
8790    }, ...blocksWithTheSameType.slice(1)], 0 // If we don't pass the `indexToSelect` it will default to the last block.
8791    );
8792  };
8793  /**
8794   * Yields action objects used in signalling that the blocks corresponding to
8795   * the set of specified client IDs are to be removed.
8796   *
8797   * @param {string|string[]} clientIds      Client IDs of blocks to remove.
8798   * @param {boolean}         selectPrevious True if the previous block should be
8799   *                                         selected when a block is removed.
8800   */
8801  
8802  const removeBlocks = function (clientIds) {
8803    let selectPrevious = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
8804    return _ref16 => {
8805      let {
8806        select,
8807        dispatch
8808      } = _ref16;
8809  
8810      if (!clientIds || !clientIds.length) {
8811        return;
8812      }
8813  
8814      clientIds = (0,external_lodash_namespaceObject.castArray)(clientIds);
8815      const rootClientId = select.getBlockRootClientId(clientIds[0]);
8816      const canRemoveBlocks = select.canRemoveBlocks(clientIds, rootClientId);
8817  
8818      if (!canRemoveBlocks) {
8819        return;
8820      }
8821  
8822      if (selectPrevious) {
8823        dispatch.selectPreviousBlock(clientIds[0]);
8824      }
8825  
8826      dispatch({
8827        type: 'REMOVE_BLOCKS',
8828        clientIds
8829      }); // To avoid a focus loss when removing the last block, assure there is
8830      // always a default block if the last of the blocks have been removed.
8831  
8832      dispatch(ensureDefaultBlock());
8833    };
8834  };
8835  /**
8836   * Returns an action object used in signalling that the block with the
8837   * specified client ID is to be removed.
8838   *
8839   * @param {string}  clientId       Client ID of block to remove.
8840   * @param {boolean} selectPrevious True if the previous block should be
8841   *                                 selected when a block is removed.
8842   *
8843   * @return {Object} Action object.
8844   */
8845  
8846  function removeBlock(clientId, selectPrevious) {
8847    return removeBlocks([clientId], selectPrevious);
8848  }
8849  /* eslint-disable jsdoc/valid-types */
8850  
8851  /**
8852   * Returns an action object used in signalling that the inner blocks with the
8853   * specified client ID should be replaced.
8854   *
8855   * @param {string}    rootClientId    Client ID of the block whose InnerBlocks will re replaced.
8856   * @param {Object[]}  blocks          Block objects to insert as new InnerBlocks
8857   * @param {?boolean}  updateSelection If true block selection will be updated. If false, block selection will not change. Defaults to false.
8858   * @param {0|-1|null} initialPosition Initial block position.
8859   * @return {Object} Action object.
8860   */
8861  
8862  function replaceInnerBlocks(rootClientId, blocks) {
8863    let updateSelection = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
8864    let initialPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
8865  
8866    /* eslint-enable jsdoc/valid-types */
8867    return {
8868      type: 'REPLACE_INNER_BLOCKS',
8869      rootClientId,
8870      blocks,
8871      updateSelection,
8872      initialPosition: updateSelection ? initialPosition : null,
8873      time: Date.now()
8874    };
8875  }
8876  /**
8877   * Returns an action object used to toggle the block editing mode between
8878   * visual and HTML modes.
8879   *
8880   * @param {string} clientId Block client ID.
8881   *
8882   * @return {Object} Action object.
8883   */
8884  
8885  function toggleBlockMode(clientId) {
8886    return {
8887      type: 'TOGGLE_BLOCK_MODE',
8888      clientId
8889    };
8890  }
8891  /**
8892   * Returns an action object used in signalling that the user has begun to type.
8893   *
8894   * @return {Object} Action object.
8895   */
8896  
8897  function startTyping() {
8898    return {
8899      type: 'START_TYPING'
8900    };
8901  }
8902  /**
8903   * Returns an action object used in signalling that the user has stopped typing.
8904   *
8905   * @return {Object} Action object.
8906   */
8907  
8908  function stopTyping() {
8909    return {
8910      type: 'STOP_TYPING'
8911    };
8912  }
8913  /**
8914   * Returns an action object used in signalling that the user has begun to drag blocks.
8915   *
8916   * @param {string[]} clientIds An array of client ids being dragged
8917   *
8918   * @return {Object} Action object.
8919   */
8920  
8921  function startDraggingBlocks() {
8922    let clientIds = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
8923    return {
8924      type: 'START_DRAGGING_BLOCKS',
8925      clientIds
8926    };
8927  }
8928  /**
8929   * Returns an action object used in signalling that the user has stopped dragging blocks.
8930   *
8931   * @return {Object} Action object.
8932   */
8933  
8934  function stopDraggingBlocks() {
8935    return {
8936      type: 'STOP_DRAGGING_BLOCKS'
8937    };
8938  }
8939  /**
8940   * Returns an action object used in signalling that the caret has entered formatted text.
8941   *
8942   * @return {Object} Action object.
8943   */
8944  
8945  function enterFormattedText() {
8946    return {
8947      type: 'ENTER_FORMATTED_TEXT'
8948    };
8949  }
8950  /**
8951   * Returns an action object used in signalling that the user caret has exited formatted text.
8952   *
8953   * @return {Object} Action object.
8954   */
8955  
8956  function exitFormattedText() {
8957    return {
8958      type: 'EXIT_FORMATTED_TEXT'
8959    };
8960  }
8961  /**
8962   * Action that changes the position of the user caret.
8963   *
8964   * @param {string|WPSelection} clientId     The selected block client ID.
8965   * @param {string}             attributeKey The selected block attribute key.
8966   * @param {number}             startOffset  The start offset.
8967   * @param {number}             endOffset    The end offset.
8968   *
8969   * @return {Object} Action object.
8970   */
8971  
8972  function selectionChange(clientId, attributeKey, startOffset, endOffset) {
8973    if (typeof clientId === 'string') {
8974      return {
8975        type: 'SELECTION_CHANGE',
8976        clientId,
8977        attributeKey,
8978        startOffset,
8979        endOffset
8980      };
8981    }
8982  
8983    return {
8984      type: 'SELECTION_CHANGE',
8985      ...clientId
8986    };
8987  }
8988  /**
8989   * Action that adds a new block of the default type to the block list.
8990   *
8991   * @param {?Object} attributes   Optional attributes of the block to assign.
8992   * @param {?string} rootClientId Optional root client ID of block list on which
8993   *                               to append.
8994   * @param {?number} index        Optional index where to insert the default block.
8995   */
8996  
8997  const insertDefaultBlock = (attributes, rootClientId, index) => _ref17 => {
8998    let {
8999      dispatch
9000    } = _ref17;
9001    // Abort if there is no default block type (if it has been unregistered).
9002    const defaultBlockName = (0,external_wp_blocks_namespaceObject.getDefaultBlockName)();
9003  
9004    if (!defaultBlockName) {
9005      return;
9006    }
9007  
9008    const block = (0,external_wp_blocks_namespaceObject.createBlock)(defaultBlockName, attributes);
9009    return dispatch.insertBlock(block, index, rootClientId);
9010  };
9011  /**
9012   * Action that changes the nested settings of a given block.
9013   *
9014   * @param {string} clientId Client ID of the block whose nested setting are
9015   *                          being received.
9016   * @param {Object} settings Object with the new settings for the nested block.
9017   *
9018   * @return {Object} Action object
9019   */
9020  
9021  function updateBlockListSettings(clientId, settings) {
9022    return {
9023      type: 'UPDATE_BLOCK_LIST_SETTINGS',
9024      clientId,
9025      settings
9026    };
9027  }
9028  /**
9029   * Action that updates the block editor settings.
9030   *
9031   * @param {Object} settings Updated settings
9032   *
9033   * @return {Object} Action object
9034   */
9035  
9036  function updateSettings(settings) {
9037    return {
9038      type: 'UPDATE_SETTINGS',
9039      settings
9040    };
9041  }
9042  /**
9043   * Action that signals that a temporary reusable block has been saved
9044   * in order to switch its temporary id with the real id.
9045   *
9046   * @param {string} id        Reusable block's id.
9047   * @param {string} updatedId Updated block's id.
9048   *
9049   * @return {Object} Action object.
9050   */
9051  
9052  function __unstableSaveReusableBlock(id, updatedId) {
9053    return {
9054      type: 'SAVE_REUSABLE_BLOCK_SUCCESS',
9055      id,
9056      updatedId
9057    };
9058  }
9059  /**
9060   * Action that marks the last block change explicitly as persistent.
9061   *
9062   * @return {Object} Action object.
9063   */
9064  
9065  function __unstableMarkLastChangeAsPersistent() {
9066    return {
9067      type: 'MARK_LAST_CHANGE_AS_PERSISTENT'
9068    };
9069  }
9070  /**
9071   * Action that signals that the next block change should be marked explicitly as not persistent.
9072   *
9073   * @return {Object} Action object.
9074   */
9075  
9076  function __unstableMarkNextChangeAsNotPersistent() {
9077    return {
9078      type: 'MARK_NEXT_CHANGE_AS_NOT_PERSISTENT'
9079    };
9080  }
9081  /**
9082   * Action that marks the last block change as an automatic change, meaning it was not
9083   * performed by the user, and can be undone using the `Escape` and `Backspace` keys.
9084   * This action must be called after the change was made, and any actions that are a
9085   * consequence of it, so it is recommended to be called at the next idle period to ensure all
9086   * selection changes have been recorded.
9087   */
9088  
9089  const __unstableMarkAutomaticChange = () => _ref18 => {
9090    let {
9091      dispatch
9092    } = _ref18;
9093    dispatch({
9094      type: 'MARK_AUTOMATIC_CHANGE'
9095    });
9096    const {
9097      requestIdleCallback = cb => setTimeout(cb, 100)
9098    } = window;
9099    requestIdleCallback(() => {
9100      dispatch({
9101        type: 'MARK_AUTOMATIC_CHANGE_FINAL'
9102      });
9103    });
9104  };
9105  /**
9106   * Action that enables or disables the navigation mode.
9107   *
9108   * @param {string} isNavigationMode Enable/Disable navigation mode.
9109   */
9110  
9111  const setNavigationMode = function () {
9112    let isNavigationMode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
9113    return _ref19 => {
9114      let {
9115        dispatch
9116      } = _ref19;
9117      dispatch({
9118        type: 'SET_NAVIGATION_MODE',
9119        isNavigationMode
9120      });
9121  
9122      if (isNavigationMode) {
9123        (0,external_wp_a11y_namespaceObject.speak)((0,external_wp_i18n_namespaceObject.__)('You are currently in navigation mode. Navigate blocks using the Tab key and Arrow keys. Use Left and Right Arrow keys to move between nesting levels. To exit navigation mode and edit the selected block, press Enter.'));
9124      } else {
9125        (0,external_wp_a11y_namespaceObject.speak)((0,external_wp_i18n_namespaceObject.__)('You are currently in edit mode. To return to the navigation mode, press Escape.'));
9126      }
9127    };
9128  };
9129  /**
9130   * Action that enables or disables the block moving mode.
9131   *
9132   * @param {string|null} hasBlockMovingClientId Enable/Disable block moving mode.
9133   */
9134  
9135  const setBlockMovingClientId = function () {
9136    let hasBlockMovingClientId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
9137    return _ref20 => {
9138      let {
9139        dispatch
9140      } = _ref20;
9141      dispatch({
9142        type: 'SET_BLOCK_MOVING_MODE',
9143        hasBlockMovingClientId
9144      });
9145  
9146      if (hasBlockMovingClientId) {
9147        (0,external_wp_a11y_namespaceObject.speak)((0,external_wp_i18n_namespaceObject.__)('Use the Tab key and Arrow keys to choose new block location. Use Left and Right Arrow keys to move between nesting levels. Once location is selected press Enter or Space to move the block.'));
9148      }
9149    };
9150  };
9151  /**
9152   * Action that duplicates a list of blocks.
9153   *
9154   * @param {string[]} clientIds
9155   * @param {boolean}  updateSelection
9156   */
9157  
9158  const duplicateBlocks = function (clientIds) {
9159    let updateSelection = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
9160    return _ref21 => {
9161      let {
9162        select,
9163        dispatch
9164      } = _ref21;
9165  
9166      if (!clientIds || !clientIds.length) {
9167        return;
9168      } // Return early if blocks don't exist.
9169  
9170  
9171      const blocks = select.getBlocksByClientId(clientIds);
9172  
9173      if ((0,external_lodash_namespaceObject.some)(blocks, block => !block)) {
9174        return;
9175      } // Return early if blocks don't support multiple usage.
9176  
9177  
9178      const blockNames = blocks.map(block => block.name);
9179  
9180      if (blockNames.some(blockName => !(0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockName, 'multiple', true))) {
9181        return;
9182      }
9183  
9184      const rootClientId = select.getBlockRootClientId(clientIds[0]);
9185      const lastSelectedIndex = select.getBlockIndex((0,external_lodash_namespaceObject.last)((0,external_lodash_namespaceObject.castArray)(clientIds)));
9186      const clonedBlocks = blocks.map(block => (0,external_wp_blocks_namespaceObject.__experimentalCloneSanitizedBlock)(block));
9187      dispatch.insertBlocks(clonedBlocks, lastSelectedIndex + 1, rootClientId, updateSelection);
9188  
9189      if (clonedBlocks.length > 1 && updateSelection) {
9190        dispatch.multiSelect((0,external_lodash_namespaceObject.first)(clonedBlocks).clientId, (0,external_lodash_namespaceObject.last)(clonedBlocks).clientId);
9191      }
9192  
9193      return clonedBlocks.map(block => block.clientId);
9194    };
9195  };
9196  /**
9197   * Action that inserts an empty block before a given block.
9198   *
9199   * @param {string} clientId
9200   */
9201  
9202  const insertBeforeBlock = clientId => _ref22 => {
9203    let {
9204      select,
9205      dispatch
9206    } = _ref22;
9207  
9208    if (!clientId) {
9209      return;
9210    }
9211  
9212    const rootClientId = select.getBlockRootClientId(clientId);
9213    const isLocked = select.getTemplateLock(rootClientId);
9214  
9215    if (isLocked) {
9216      return;
9217    }
9218  
9219    const firstSelectedIndex = select.getBlockIndex(clientId);
9220    return dispatch.insertDefaultBlock({}, rootClientId, firstSelectedIndex);
9221  };
9222  /**
9223   * Action that inserts an empty block after a given block.
9224   *
9225   * @param {string} clientId
9226   */
9227  
9228  const insertAfterBlock = clientId => _ref23 => {
9229    let {
9230      select,
9231      dispatch
9232    } = _ref23;
9233  
9234    if (!clientId) {
9235      return;
9236    }
9237  
9238    const rootClientId = select.getBlockRootClientId(clientId);
9239    const isLocked = select.getTemplateLock(rootClientId);
9240  
9241    if (isLocked) {
9242      return;
9243    }
9244  
9245    const firstSelectedIndex = select.getBlockIndex(clientId);
9246    return dispatch.insertDefaultBlock({}, rootClientId, firstSelectedIndex + 1);
9247  };
9248  /**
9249   * Action that toggles the highlighted block state.
9250   *
9251   * @param {string}  clientId      The block's clientId.
9252   * @param {boolean} isHighlighted The highlight state.
9253   */
9254  
9255  function toggleBlockHighlight(clientId, isHighlighted) {
9256    return {
9257      type: 'TOGGLE_BLOCK_HIGHLIGHT',
9258      clientId,
9259      isHighlighted
9260    };
9261  }
9262  /**
9263   * Action that "flashes" the block with a given `clientId` by rhythmically highlighting it.
9264   *
9265   * @param {string} clientId Target block client ID.
9266   */
9267  
9268  const flashBlock = clientId => async _ref24 => {
9269    let {
9270      dispatch
9271    } = _ref24;
9272    dispatch(toggleBlockHighlight(clientId, true));
9273    await new Promise(resolve => setTimeout(resolve, 150));
9274    dispatch(toggleBlockHighlight(clientId, false));
9275  };
9276  /**
9277   * Action that sets whether a block has controlled inner blocks.
9278   *
9279   * @param {string}  clientId                 The block's clientId.
9280   * @param {boolean} hasControlledInnerBlocks True if the block's inner blocks are controlled.
9281   */
9282  
9283  function setHasControlledInnerBlocks(clientId, hasControlledInnerBlocks) {
9284    return {
9285      type: 'SET_HAS_CONTROLLED_INNER_BLOCKS',
9286      hasControlledInnerBlocks,
9287      clientId
9288    };
9289  }
9290  
9291  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/store/constants.js
9292  const STORE_NAME = 'core/block-editor';
9293  
9294  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/store/index.js
9295  /**
9296   * WordPress dependencies
9297   */
9298  
9299  /**
9300   * Internal dependencies
9301   */
9302  
9303  
9304  
9305  
9306  
9307  /**
9308   * Block editor data store configuration.
9309   *
9310   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/data/README.md#registerStore
9311   *
9312   * @type {Object}
9313   */
9314  
9315  const storeConfig = {
9316    reducer: reducer,
9317    selectors: selectors_namespaceObject,
9318    actions: actions_namespaceObject
9319  };
9320  /**
9321   * Store definition for the block editor namespace.
9322   *
9323   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/data/README.md#createReduxStore
9324   *
9325   * @type {Object}
9326   */
9327  
9328  const store = (0,external_wp_data_namespaceObject.createReduxStore)(STORE_NAME, { ...storeConfig,
9329    persist: ['preferences']
9330  }); // Ideally we'd use register instead of register stores.
9331  
9332  (0,external_wp_data_namespaceObject.registerStore)(STORE_NAME, { ...storeConfig,
9333    persist: ['preferences']
9334  });
9335  
9336  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-edit/context.js
9337  /**
9338   * WordPress dependencies
9339   */
9340  
9341  const DEFAULT_BLOCK_EDIT_CONTEXT = {
9342    name: '',
9343    isSelected: false
9344  };
9345  const Context = (0,external_wp_element_namespaceObject.createContext)(DEFAULT_BLOCK_EDIT_CONTEXT);
9346  const {
9347    Provider
9348  } = Context;
9349  
9350  /**
9351   * A hook that returns the block edit context.
9352   *
9353   * @return {Object} Block edit context
9354   */
9355  
9356  function useBlockEditContext() {
9357    return (0,external_wp_element_namespaceObject.useContext)(Context);
9358  }
9359  
9360  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/use-display-block-controls/index.js
9361  /**
9362   * WordPress dependencies
9363   */
9364  
9365  /**
9366   * Internal dependencies
9367   */
9368  
9369  
9370  
9371  function useDisplayBlockControls() {
9372    const {
9373      isSelected,
9374      clientId,
9375      name
9376    } = useBlockEditContext();
9377    return (0,external_wp_data_namespaceObject.useSelect)(select => {
9378      if (isSelected) {
9379        return true;
9380      }
9381  
9382      const {
9383        getBlockName,
9384        isFirstMultiSelectedBlock,
9385        getMultiSelectedBlockClientIds
9386      } = select(store);
9387  
9388      if (isFirstMultiSelectedBlock(clientId)) {
9389        return getMultiSelectedBlockClientIds().every(id => getBlockName(id) === name);
9390      }
9391  
9392      return false;
9393    }, [clientId, isSelected, name]);
9394  }
9395  
9396  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-controls/hook.js
9397  /**
9398   * WordPress dependencies
9399   */
9400  
9401  
9402  /**
9403   * Internal dependencies
9404   */
9405  
9406  
9407  
9408  
9409  
9410  function useBlockControlsFill(group, shareWithChildBlocks) {
9411    const isDisplayed = useDisplayBlockControls();
9412    const {
9413      clientId
9414    } = useBlockEditContext();
9415    const isParentDisplayed = (0,external_wp_data_namespaceObject.useSelect)(select => {
9416      const {
9417        getBlockName,
9418        hasSelectedInnerBlock
9419      } = select(store);
9420      const {
9421        hasBlockSupport
9422      } = select(external_wp_blocks_namespaceObject.store);
9423      return shareWithChildBlocks && hasBlockSupport(getBlockName(clientId), '__experimentalExposeControlsToChildren', false) && hasSelectedInnerBlock(clientId);
9424    }, [shareWithChildBlocks, clientId]);
9425  
9426    if (isDisplayed) {
9427      var _groups$group;
9428  
9429      return (_groups$group = block_controls_groups[group]) === null || _groups$group === void 0 ? void 0 : _groups$group.Fill;
9430    }
9431  
9432    if (isParentDisplayed) {
9433      return block_controls_groups.parent.Fill;
9434    }
9435  
9436    return null;
9437  }
9438  
9439  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-controls/fill.js
9440  
9441  
9442  /**
9443   * External dependencies
9444   */
9445  
9446  /**
9447   * WordPress dependencies
9448   */
9449  
9450  
9451  /**
9452   * Internal dependencies
9453   */
9454  
9455  
9456  function BlockControlsFill(_ref) {
9457    let {
9458      group = 'default',
9459      controls,
9460      children,
9461      __experimentalShareWithChildBlocks = false
9462    } = _ref;
9463    const Fill = useBlockControlsFill(group, __experimentalShareWithChildBlocks);
9464  
9465    if (!Fill) {
9466      return null;
9467    }
9468  
9469    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalStyleProvider, {
9470      document: document
9471    }, (0,external_wp_element_namespaceObject.createElement)(Fill, null, fillProps => {
9472      // Children passed to BlockControlsFill will not have access to any
9473      // React Context whose Provider is part of the BlockControlsSlot tree.
9474      // So we re-create the Provider in this subtree.
9475      const value = !(0,external_lodash_namespaceObject.isEmpty)(fillProps) ? fillProps : null;
9476      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalToolbarContext.Provider, {
9477        value: value
9478      }, group === 'default' && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarGroup, {
9479        controls: controls
9480      }), children);
9481    }));
9482  }
9483  
9484  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-controls/slot.js
9485  
9486  
9487  
9488  /**
9489   * WordPress dependencies
9490   */
9491  
9492  
9493  /**
9494   * Internal dependencies
9495   */
9496  
9497  
9498  function BlockControlsSlot(_ref) {
9499    let {
9500      group = 'default',
9501      ...props
9502    } = _ref;
9503    const accessibleToolbarState = (0,external_wp_element_namespaceObject.useContext)(external_wp_components_namespaceObject.__experimentalToolbarContext);
9504    const Slot = block_controls_groups[group].Slot;
9505    const slot = (0,external_wp_components_namespaceObject.__experimentalUseSlot)(Slot.__unstableName);
9506    const hasFills = Boolean(slot.fills && slot.fills.length);
9507  
9508    if (!hasFills) {
9509      return null;
9510    }
9511  
9512    if (group === 'default') {
9513      return (0,external_wp_element_namespaceObject.createElement)(Slot, _extends({}, props, {
9514        bubblesVirtually: true,
9515        fillProps: accessibleToolbarState
9516      }));
9517    }
9518  
9519    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarGroup, null, (0,external_wp_element_namespaceObject.createElement)(Slot, _extends({}, props, {
9520      bubblesVirtually: true,
9521      fillProps: accessibleToolbarState
9522    })));
9523  }
9524  
9525  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-controls/index.js
9526  
9527  
9528  
9529  /**
9530   * Internal dependencies
9531   */
9532  
9533  
9534  const BlockControls = BlockControlsFill;
9535  BlockControls.Slot = BlockControlsSlot; // This is just here for backward compatibility.
9536  
9537  const BlockFormatControls = props => {
9538    return (0,external_wp_element_namespaceObject.createElement)(BlockControlsFill, _extends({
9539      group: "inline"
9540    }, props));
9541  };
9542  
9543  BlockFormatControls.Slot = props => {
9544    return (0,external_wp_element_namespaceObject.createElement)(BlockControlsSlot, _extends({
9545      group: "inline"
9546    }, props));
9547  };
9548  
9549  /* harmony default export */ var block_controls = (BlockControls);
9550  
9551  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/align-none.js
9552  
9553  
9554  /**
9555   * WordPress dependencies
9556   */
9557  
9558  const alignNone = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
9559    xmlns: "http://www.w3.org/2000/svg",
9560    viewBox: "0 0 24 24"
9561  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
9562    d: "M5 15h14V9H5v6zm0 4.8h14v-1.5H5v1.5zM5 4.2v1.5h14V4.2H5z"
9563  }));
9564  /* harmony default export */ var align_none = (alignNone);
9565  
9566  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/position-left.js
9567  
9568  
9569  /**
9570   * WordPress dependencies
9571   */
9572  
9573  const positionLeft = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
9574    xmlns: "http://www.w3.org/2000/svg",
9575    viewBox: "0 0 24 24"
9576  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
9577    d: "M4 9v6h14V9H4zm8-4.8H4v1.5h8V4.2zM4 19.8h8v-1.5H4v1.5z"
9578  }));
9579  /* harmony default export */ var position_left = (positionLeft);
9580  
9581  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/position-center.js
9582  
9583  
9584  /**
9585   * WordPress dependencies
9586   */
9587  
9588  const positionCenter = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
9589    xmlns: "http://www.w3.org/2000/svg",
9590    viewBox: "0 0 24 24"
9591  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
9592    d: "M7 9v6h10V9H7zM5 19.8h14v-1.5H5v1.5zM5 4.3v1.5h14V4.3H5z"
9593  }));
9594  /* harmony default export */ var position_center = (positionCenter);
9595  
9596  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/position-right.js
9597  
9598  
9599  /**
9600   * WordPress dependencies
9601   */
9602  
9603  const positionRight = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
9604    xmlns: "http://www.w3.org/2000/svg",
9605    viewBox: "0 0 24 24"
9606  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
9607    d: "M6 15h14V9H6v6zm6-10.8v1.5h8V4.2h-8zm0 15.6h8v-1.5h-8v1.5z"
9608  }));
9609  /* harmony default export */ var position_right = (positionRight);
9610  
9611  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/stretch-wide.js
9612  
9613  
9614  /**
9615   * WordPress dependencies
9616   */
9617  
9618  const stretchWide = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
9619    xmlns: "http://www.w3.org/2000/svg",
9620    viewBox: "0 0 24 24"
9621  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
9622    d: "M5 9v6h14V9H5zm11-4.8H8v1.5h8V4.2zM8 19.8h8v-1.5H8v1.5z"
9623  }));
9624  /* harmony default export */ var stretch_wide = (stretchWide);
9625  
9626  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/stretch-full-width.js
9627  
9628  
9629  /**
9630   * WordPress dependencies
9631   */
9632  
9633  const stretchFullWidth = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
9634    xmlns: "http://www.w3.org/2000/svg",
9635    viewBox: "0 0 24 24"
9636  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
9637    d: "M5 4v11h14V4H5zm3 15.8h8v-1.5H8v1.5z"
9638  }));
9639  /* harmony default export */ var stretch_full_width = (stretchFullWidth);
9640  
9641  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/justify-left.js
9642  
9643  
9644  /**
9645   * WordPress dependencies
9646   */
9647  
9648  const justifyLeft = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
9649    xmlns: "http://www.w3.org/2000/svg",
9650    viewBox: "0 0 24 24"
9651  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
9652    d: "M9 9v6h11V9H9zM4 20h1.5V4H4v16z"
9653  }));
9654  /* harmony default export */ var justify_left = (justifyLeft);
9655  
9656  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/justify-center.js
9657  
9658  
9659  /**
9660   * WordPress dependencies
9661   */
9662  
9663  const justifyCenter = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
9664    xmlns: "http://www.w3.org/2000/svg",
9665    viewBox: "0 0 24 24"
9666  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
9667    d: "M20 9h-7.2V4h-1.6v5H4v6h7.2v5h1.6v-5H20z"
9668  }));
9669  /* harmony default export */ var justify_center = (justifyCenter);
9670  
9671  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/justify-right.js
9672  
9673  
9674  /**
9675   * WordPress dependencies
9676   */
9677  
9678  const justifyRight = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
9679    xmlns: "http://www.w3.org/2000/svg",
9680    viewBox: "0 0 24 24"
9681  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
9682    d: "M4 15h11V9H4v6zM18.5 4v16H20V4h-1.5z"
9683  }));
9684  /* harmony default export */ var justify_right = (justifyRight);
9685  
9686  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/justify-space-between.js
9687  
9688  
9689  /**
9690   * WordPress dependencies
9691   */
9692  
9693  const justifySpaceBetween = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
9694    xmlns: "http://www.w3.org/2000/svg",
9695    viewBox: "0 0 24 24"
9696  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
9697    d: "M9 15h6V9H9v6zm-5 5h1.5V4H4v16zM18.5 4v16H20V4h-1.5z"
9698  }));
9699  /* harmony default export */ var justify_space_between = (justifySpaceBetween);
9700  
9701  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/arrow-right.js
9702  
9703  
9704  /**
9705   * WordPress dependencies
9706   */
9707  
9708  const arrowRight = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
9709    xmlns: "http://www.w3.org/2000/svg",
9710    viewBox: "0 0 24 24"
9711  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
9712    d: "M14.3 6.7l-1.1 1.1 4 4H4v1.5h13.3l-4.1 4.4 1.1 1.1 5.8-6.3z"
9713  }));
9714  /* harmony default export */ var arrow_right = (arrowRight);
9715  
9716  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/arrow-down.js
9717  
9718  
9719  /**
9720   * WordPress dependencies
9721   */
9722  
9723  const arrowDown = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
9724    xmlns: "http://www.w3.org/2000/svg",
9725    viewBox: "0 0 24 24"
9726  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
9727    d: "M16.2 13.2l-4 4V4h-1.5v13.3l-4.5-4.1-1 1.1 6.2 5.8 5.8-5.8-1-1.1z"
9728  }));
9729  /* harmony default export */ var arrow_down = (arrowDown);
9730  
9731  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/layouts/utils.js
9732  /**
9733   * Utility to generate the proper CSS selector for layout styles.
9734   *
9735   * @param {string|string[]} selectors - CSS selectors
9736   * @param {boolean}         append    - string to append.
9737   *
9738   * @return {string} - CSS selector.
9739   */
9740  function appendSelectors(selectors) {
9741    let append = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
9742    // Ideally we shouldn't need the `.editor-styles-wrapper` increased specificity here
9743    // The problem though is that we have a `.editor-styles-wrapper p { margin: reset; }` style
9744    // it's used to reset the default margin added by wp-admin to paragraphs
9745    // so we need this to be higher speficity otherwise, it won't be applied to paragraphs inside containers
9746    // When the post editor is fully iframed, this extra classname could be removed.
9747    return selectors.split(',').map(subselector => `.editor-styles-wrapper $subselector} $append}`).join(',');
9748  }
9749  
9750  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/provider/block-refs-provider.js
9751  
9752  
9753  /**
9754   * WordPress dependencies
9755   */
9756  
9757  const BlockRefs = (0,external_wp_element_namespaceObject.createContext)({
9758    refs: new Map(),
9759    callbacks: new Map()
9760  });
9761  function BlockRefsProvider(_ref) {
9762    let {
9763      children
9764    } = _ref;
9765    const value = (0,external_wp_element_namespaceObject.useMemo)(() => ({
9766      refs: new Map(),
9767      callbacks: new Map()
9768    }), []);
9769    return (0,external_wp_element_namespaceObject.createElement)(BlockRefs.Provider, {
9770      value: value
9771    }, children);
9772  }
9773  
9774  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-list/use-block-props/use-block-refs.js
9775  /**
9776   * WordPress dependencies
9777   */
9778  
9779  
9780  /**
9781   * Internal dependencies
9782   */
9783  
9784  
9785  /** @typedef {import('@wordpress/element').RefCallback} RefCallback */
9786  
9787  /** @typedef {import('@wordpress/element').RefObject} RefObject */
9788  
9789  /**
9790   * Provides a ref to the BlockRefs context.
9791   *
9792   * @param {string} clientId The client ID of the element ref.
9793   *
9794   * @return {RefCallback} Ref callback.
9795   */
9796  
9797  function useBlockRefProvider(clientId) {
9798    const {
9799      refs,
9800      callbacks
9801    } = (0,external_wp_element_namespaceObject.useContext)(BlockRefs);
9802    const ref = (0,external_wp_element_namespaceObject.useRef)();
9803    (0,external_wp_element_namespaceObject.useLayoutEffect)(() => {
9804      refs.set(ref, clientId);
9805      return () => {
9806        refs.delete(ref);
9807      };
9808    }, [clientId]);
9809    return (0,external_wp_compose_namespaceObject.useRefEffect)(element => {
9810      // Update the ref in the provider.
9811      ref.current = element; // Call any update functions.
9812  
9813      callbacks.forEach((id, setElement) => {
9814        if (clientId === id) {
9815          setElement(element);
9816        }
9817      });
9818    }, [clientId]);
9819  }
9820  /**
9821   * Gets a ref pointing to the current block element. Continues to return a
9822   * stable ref even if the block client ID changes.
9823   *
9824   * @param {string} clientId The client ID to get a ref for.
9825   *
9826   * @return {RefObject} A ref containing the element.
9827   */
9828  
9829  function useBlockRef(clientId) {
9830    const {
9831      refs
9832    } = (0,external_wp_element_namespaceObject.useContext)(BlockRefs);
9833    const freshClientId = (0,external_wp_element_namespaceObject.useRef)();
9834    freshClientId.current = clientId; // Always return an object, even if no ref exists for a given client ID, so
9835    // that `current` works at a later point.
9836  
9837    return (0,external_wp_element_namespaceObject.useMemo)(() => ({
9838      get current() {
9839        let element = null; // Multiple refs may be created for a single block. Find the
9840        // first that has an element set.
9841  
9842        for (const [ref, id] of refs.entries()) {
9843          if (id === freshClientId.current && ref.current) {
9844            element = ref.current;
9845          }
9846        }
9847  
9848        return element;
9849      }
9850  
9851    }), []);
9852  }
9853  /**
9854   * Return the element for a given client ID. Updates whenever the element
9855   * changes, becomes available, or disappears.
9856   *
9857   * @param {string} clientId The client ID to an element for.
9858   *
9859   * @return {Element|null} The block's wrapper element.
9860   */
9861  
9862  
9863  function useBlockElement(clientId) {
9864    const {
9865      callbacks
9866    } = (0,external_wp_element_namespaceObject.useContext)(BlockRefs);
9867    const ref = useBlockRef(clientId);
9868    const [element, setElement] = (0,external_wp_element_namespaceObject.useState)(null);
9869    (0,external_wp_element_namespaceObject.useLayoutEffect)(() => {
9870      if (!clientId) {
9871        return;
9872      }
9873  
9874      callbacks.set(setElement, clientId);
9875      return () => {
9876        callbacks.delete(setElement);
9877      };
9878    }, [clientId]);
9879    return ref.current || element;
9880  }
9881  
9882  
9883  
9884  
9885  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/use-setting/index.js
9886  /**
9887   * External dependencies
9888   */
9889  
9890  /**
9891   * WordPress dependencies
9892   */
9893  
9894  
9895  
9896  /**
9897   * Internal dependencies
9898   */
9899  
9900  
9901  
9902  const blockedPaths = ['color', 'border', 'typography', 'spacing'];
9903  const deprecatedFlags = {
9904    'color.palette': settings => settings.colors === undefined ? undefined : settings.colors,
9905    'color.gradients': settings => settings.gradients === undefined ? undefined : settings.gradients,
9906    'color.custom': settings => settings.disableCustomColors === undefined ? undefined : !settings.disableCustomColors,
9907    'color.customGradient': settings => settings.disableCustomGradients === undefined ? undefined : !settings.disableCustomGradients,
9908    'typography.fontSizes': settings => settings.fontSizes === undefined ? undefined : settings.fontSizes,
9909    'typography.customFontSize': settings => settings.disableCustomFontSizes === undefined ? undefined : !settings.disableCustomFontSizes,
9910    'typography.lineHeight': settings => settings.enableCustomLineHeight,
9911    'spacing.units': settings => {
9912      if (settings.enableCustomUnits === undefined) {
9913        return;
9914      }
9915  
9916      if (settings.enableCustomUnits === true) {
9917        return ['px', 'em', 'rem', 'vh', 'vw', '%'];
9918      }
9919  
9920      return settings.enableCustomUnits;
9921    },
9922    'spacing.padding': settings => settings.enableCustomSpacing
9923  };
9924  const prefixedFlags = {
9925    /*
9926     * These were only available in the plugin
9927     * and can be removed when the minimum WordPress version
9928     * for the plugin is 5.9.
9929     */
9930    'border.customColor': 'border.color',
9931    'border.customStyle': 'border.style',
9932    'border.customWidth': 'border.width',
9933    'typography.customFontStyle': 'typography.fontStyle',
9934    'typography.customFontWeight': 'typography.fontWeight',
9935    'typography.customLetterSpacing': 'typography.letterSpacing',
9936    'typography.customTextDecorations': 'typography.textDecoration',
9937    'typography.customTextTransforms': 'typography.textTransform',
9938  
9939    /*
9940     * These were part of WordPress 5.8 and we need to keep them.
9941     */
9942    'border.customRadius': 'border.radius',
9943    'spacing.customMargin': 'spacing.margin',
9944    'spacing.customPadding': 'spacing.padding',
9945    'typography.customLineHeight': 'typography.lineHeight'
9946  };
9947  /**
9948   * Remove `custom` prefixes for flags that did not land in 5.8.
9949   *
9950   * This provides continued support for `custom` prefixed properties. It will
9951   * be removed once third party devs have had sufficient time to update themes,
9952   * plugins, etc.
9953   *
9954   * @see https://github.com/WordPress/gutenberg/pull/34485
9955   *
9956   * @param {string} path Path to desired value in settings.
9957   * @return {string}     The value for defined setting.
9958   */
9959  
9960  const removeCustomPrefixes = path => {
9961    return prefixedFlags[path] || path;
9962  };
9963  /**
9964   * Hook that retrieves the editor setting.
9965   * It works with nested objects using by finding the value at path.
9966   *
9967   * @param {string} path The path to the setting.
9968   * @return {any} Returns the value defined for the setting.
9969   * @example
9970   * ```js
9971   * const isEnabled = useSetting( 'typography.dropCap' );
9972   * ```
9973   */
9974  
9975  
9976  function useSetting(path) {
9977    const {
9978      name: blockName
9979    } = useBlockEditContext();
9980    const setting = (0,external_wp_data_namespaceObject.useSelect)(select => {
9981      var _get;
9982  
9983      if (blockedPaths.includes(path)) {
9984        // eslint-disable-next-line no-console
9985        console.warn('Top level useSetting paths are disabled. Please use a subpath to query the information needed.');
9986        return undefined;
9987      }
9988  
9989      const settings = select(store).getSettings(); // 1 - Use __experimental features, if available.
9990      // We cascade to the all value if the block one is not available.
9991  
9992      const normalizedPath = removeCustomPrefixes(path);
9993      const defaultsPath = `__experimentalFeatures.$normalizedPath}`;
9994      const blockPath = `__experimentalFeatures.blocks.$blockName}.$normalizedPath}`;
9995      const experimentalFeaturesResult = (_get = (0,external_lodash_namespaceObject.get)(settings, blockPath)) !== null && _get !== void 0 ? _get : (0,external_lodash_namespaceObject.get)(settings, defaultsPath);
9996  
9997      if (experimentalFeaturesResult !== undefined) {
9998        if (external_wp_blocks_namespaceObject.__EXPERIMENTAL_PATHS_WITH_MERGE[normalizedPath]) {
9999          var _ref, _experimentalFeatures;
10000  
10001          return (_ref = (_experimentalFeatures = experimentalFeaturesResult.custom) !== null && _experimentalFeatures !== void 0 ? _experimentalFeatures : experimentalFeaturesResult.theme) !== null && _ref !== void 0 ? _ref : experimentalFeaturesResult.default;
10002        }
10003  
10004        return experimentalFeaturesResult;
10005      } // 2 - Use deprecated settings, otherwise.
10006  
10007  
10008      const deprecatedSettingsValue = deprecatedFlags[normalizedPath] ? deprecatedFlags[normalizedPath](settings) : undefined;
10009  
10010      if (deprecatedSettingsValue !== undefined) {
10011        return deprecatedSettingsValue;
10012      } // 3 - Fall back for typography.dropCap:
10013      // This is only necessary to support typography.dropCap.
10014      // when __experimentalFeatures are not present (core without plugin).
10015      // To remove when __experimentalFeatures are ported to core.
10016  
10017  
10018      return normalizedPath === 'typography.dropCap' ? true : undefined;
10019    }, [blockName, path]);
10020    return setting;
10021  }
10022  
10023  ;// CONCATENATED MODULE: external ["wp","warning"]
10024  var external_wp_warning_namespaceObject = window["wp"]["warning"];
10025  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inspector-controls/groups.js
10026  /**
10027   * WordPress dependencies
10028   */
10029  
10030  const InspectorControlsDefault = (0,external_wp_components_namespaceObject.createSlotFill)('InspectorControls');
10031  const InspectorControlsAdvanced = (0,external_wp_components_namespaceObject.createSlotFill)('InspectorAdvancedControls');
10032  const InspectorControlsBorder = (0,external_wp_components_namespaceObject.createSlotFill)('InspectorControlsBorder');
10033  const InspectorControlsColor = (0,external_wp_components_namespaceObject.createSlotFill)('InspectorControlsColor');
10034  const InspectorControlsDimensions = (0,external_wp_components_namespaceObject.createSlotFill)('InspectorControlsDimensions');
10035  const InspectorControlsTypography = (0,external_wp_components_namespaceObject.createSlotFill)('InspectorControlsTypography');
10036  const groups_groups = {
10037    default: InspectorControlsDefault,
10038    advanced: InspectorControlsAdvanced,
10039    border: InspectorControlsBorder,
10040    color: InspectorControlsColor,
10041    dimensions: InspectorControlsDimensions,
10042    typography: InspectorControlsTypography
10043  };
10044  /* harmony default export */ var inspector_controls_groups = (groups_groups);
10045  
10046  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inspector-controls/fill.js
10047  
10048  
10049  /**
10050   * External dependencies
10051   */
10052  
10053  /**
10054   * WordPress dependencies
10055   */
10056  
10057  
10058  
10059  /**
10060   * Internal dependencies
10061   */
10062  
10063  
10064  
10065  function InspectorControlsFill(_ref) {
10066    var _groups$group;
10067  
10068    let {
10069      __experimentalGroup: group = 'default',
10070      children
10071    } = _ref;
10072    const isDisplayed = useDisplayBlockControls();
10073    const Fill = (_groups$group = inspector_controls_groups[group]) === null || _groups$group === void 0 ? void 0 : _groups$group.Fill;
10074  
10075    if (!Fill) {
10076      typeof process !== "undefined" && process.env && "production" !== "production" ? 0 : void 0;
10077      return null;
10078    }
10079  
10080    if (!isDisplayed) {
10081      return null;
10082    }
10083  
10084    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalStyleProvider, {
10085      document: document
10086    }, (0,external_wp_element_namespaceObject.createElement)(Fill, null, fillProps => {
10087      // Children passed to InspectorControlsFill will not have
10088      // access to any React Context whose Provider is part of
10089      // the InspectorControlsSlot tree. So we re-create the
10090      // Provider in this subtree.
10091      const value = !(0,external_lodash_namespaceObject.isEmpty)(fillProps) ? fillProps : null;
10092      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalToolsPanelContext.Provider, {
10093        value: value
10094      }, children);
10095    }));
10096  }
10097  
10098  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/utils.js
10099  /**
10100   * External dependencies
10101   */
10102  
10103  /**
10104   * WordPress dependencies
10105   */
10106  
10107  
10108  /**
10109   * Removed falsy values from nested object.
10110   *
10111   * @param {*} object
10112   * @return {*} Object cleaned from falsy values
10113   */
10114  
10115  const cleanEmptyObject = object => {
10116    if (!(0,external_lodash_namespaceObject.isObject)(object) || Array.isArray(object)) {
10117      return object;
10118    }
10119  
10120    const cleanedNestedObjects = (0,external_lodash_namespaceObject.pickBy)((0,external_lodash_namespaceObject.mapValues)(object, cleanEmptyObject), external_lodash_namespaceObject.identity);
10121    return (0,external_lodash_namespaceObject.isEmpty)(cleanedNestedObjects) ? undefined : cleanedNestedObjects;
10122  };
10123  function immutableSet(object, path, value) {
10124    return (0,external_lodash_namespaceObject.setWith)(object ? (0,external_lodash_namespaceObject.clone)(object) : {}, path, value, external_lodash_namespaceObject.clone);
10125  }
10126  function transformStyles(activeSupports, migrationPaths, result, source, index, results) {
10127    var _source$;
10128  
10129    // If there are no active supports return early.
10130    if ((0,external_lodash_namespaceObject.every)(activeSupports, isActive => !isActive)) {
10131      return result;
10132    } // If the condition verifies we are probably in the presence of a wrapping transform
10133    // e.g: nesting paragraphs in a group or columns and in that case the styles should not be transformed.
10134  
10135  
10136    if (results.length === 1 && result.innerBlocks.length === source.length) {
10137      return result;
10138    } // For cases where we have a transform from one block to multiple blocks
10139    // or multiple blocks to one block we apply the styles of the first source block
10140    // to the result(s).
10141  
10142  
10143    let referenceBlockAttributes = (_source$ = source[0]) === null || _source$ === void 0 ? void 0 : _source$.attributes; // If we are in presence of transform between more than one block in the source
10144    // that has more than one block in the result
10145    // we apply the styles on source N to the result N,
10146    // if source N does not exists we do nothing.
10147  
10148    if (results.length > 1 && source.length > 1) {
10149      if (source[index]) {
10150        var _source$index;
10151  
10152        referenceBlockAttributes = (_source$index = source[index]) === null || _source$index === void 0 ? void 0 : _source$index.attributes;
10153      } else {
10154        return result;
10155      }
10156    }
10157  
10158    let returnBlock = result;
10159    (0,external_lodash_namespaceObject.forEach)(activeSupports, (isActive, support) => {
10160      if (isActive) {
10161        migrationPaths[support].forEach(path => {
10162          const styleValue = (0,external_lodash_namespaceObject.get)(referenceBlockAttributes, path);
10163  
10164          if (styleValue) {
10165            returnBlock = { ...returnBlock,
10166              attributes: immutableSet(returnBlock.attributes, path, styleValue)
10167            };
10168          }
10169        });
10170      }
10171    });
10172    return returnBlock;
10173  }
10174  /**
10175   * Check whether serialization of specific block support feature or set should
10176   * be skipped.
10177   *
10178   * @param {string|Object} blockType  Block name or block type object.
10179   * @param {string}        featureSet Name of block support feature set.
10180   * @param {string}        feature    Name of the individual feature to check.
10181   *
10182   * @return {boolean} Whether serialization should occur.
10183   */
10184  
10185  function shouldSkipSerialization(blockType, featureSet, feature) {
10186    const support = (0,external_wp_blocks_namespaceObject.getBlockSupport)(blockType, featureSet);
10187    const skipSerialization = support === null || support === void 0 ? void 0 : support.__experimentalSkipSerialization;
10188  
10189    if (Array.isArray(skipSerialization)) {
10190      return skipSerialization.includes(feature);
10191    }
10192  
10193    return skipSerialization;
10194  }
10195  
10196  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inspector-controls/block-support-tools-panel.js
10197  
10198  
10199  /**
10200   * WordPress dependencies
10201   */
10202  
10203  
10204  
10205  /**
10206   * Internal dependencies
10207   */
10208  
10209  
10210  
10211  function BlockSupportToolsPanel(_ref) {
10212    let {
10213      children,
10214      group,
10215      label
10216    } = _ref;
10217    const {
10218      updateBlockAttributes
10219    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
10220    const {
10221      getBlockAttributes,
10222      getMultiSelectedBlockClientIds,
10223      getSelectedBlockClientId,
10224      hasMultiSelection
10225    } = (0,external_wp_data_namespaceObject.useSelect)(store);
10226    const panelId = getSelectedBlockClientId();
10227    const resetAll = (0,external_wp_element_namespaceObject.useCallback)(function () {
10228      let resetFilters = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
10229      const newAttributes = {};
10230      const clientIds = hasMultiSelection() ? getMultiSelectedBlockClientIds() : [panelId];
10231      clientIds.forEach(clientId => {
10232        const {
10233          style
10234        } = getBlockAttributes(clientId);
10235        let newBlockAttributes = {
10236          style
10237        };
10238        resetFilters.forEach(resetFilter => {
10239          newBlockAttributes = { ...newBlockAttributes,
10240            ...resetFilter(newBlockAttributes)
10241          };
10242        }); // Enforce a cleaned style object.
10243  
10244        newBlockAttributes = { ...newBlockAttributes,
10245          style: cleanEmptyObject(newBlockAttributes.style)
10246        };
10247        newAttributes[clientId] = newBlockAttributes;
10248      });
10249      updateBlockAttributes(clientIds, newAttributes, true);
10250    }, [cleanEmptyObject, getBlockAttributes, getMultiSelectedBlockClientIds, hasMultiSelection, panelId, updateBlockAttributes]);
10251    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalToolsPanel, {
10252      className: `$group}-block-support-panel`,
10253      label: label,
10254      resetAll: resetAll,
10255      key: panelId,
10256      panelId: panelId,
10257      hasInnerWrapper: true,
10258      shouldRenderPlaceholderItems: true // Required to maintain fills ordering.
10259      ,
10260      __experimentalFirstVisibleItemClass: "first",
10261      __experimentalLastVisibleItemClass: "last"
10262    }, children);
10263  }
10264  
10265  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inspector-controls/block-support-slot-container.js
10266  
10267  
10268  
10269  /**
10270   * WordPress dependencies
10271   */
10272  
10273  
10274  function BlockSupportSlotContainer(_ref) {
10275    let {
10276      Slot,
10277      ...props
10278    } = _ref;
10279    const toolsPanelContext = (0,external_wp_element_namespaceObject.useContext)(external_wp_components_namespaceObject.__experimentalToolsPanelContext);
10280    return (0,external_wp_element_namespaceObject.createElement)(Slot, _extends({}, props, {
10281      fillProps: toolsPanelContext,
10282      bubblesVirtually: true
10283    }));
10284  }
10285  
10286  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inspector-controls/slot.js
10287  
10288  
10289  
10290  /**
10291   * WordPress dependencies
10292   */
10293  
10294  
10295  /**
10296   * Internal dependencies
10297   */
10298  
10299  
10300  
10301  
10302  function InspectorControlsSlot(_ref) {
10303    var _groups$group;
10304  
10305    let {
10306      __experimentalGroup: group = 'default',
10307      label,
10308      ...props
10309    } = _ref;
10310    const Slot = (_groups$group = inspector_controls_groups[group]) === null || _groups$group === void 0 ? void 0 : _groups$group.Slot;
10311    const slot = (0,external_wp_components_namespaceObject.__experimentalUseSlot)(Slot === null || Slot === void 0 ? void 0 : Slot.__unstableName);
10312  
10313    if (!Slot || !slot) {
10314      typeof process !== "undefined" && process.env && "production" !== "production" ? 0 : void 0;
10315      return null;
10316    }
10317  
10318    const hasFills = Boolean(slot.fills && slot.fills.length);
10319  
10320    if (!hasFills) {
10321      return null;
10322    }
10323  
10324    if (label) {
10325      return (0,external_wp_element_namespaceObject.createElement)(BlockSupportToolsPanel, {
10326        group: group,
10327        label: label
10328      }, (0,external_wp_element_namespaceObject.createElement)(BlockSupportSlotContainer, _extends({}, props, {
10329        Slot: Slot
10330      })));
10331    }
10332  
10333    return (0,external_wp_element_namespaceObject.createElement)(Slot, _extends({}, props, {
10334      bubblesVirtually: true
10335    }));
10336  }
10337  
10338  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inspector-controls/index.js
10339  
10340  
10341  
10342  /**
10343   * Internal dependencies
10344   */
10345  
10346  
10347  const InspectorControls = InspectorControlsFill;
10348  InspectorControls.Slot = InspectorControlsSlot; // This is just here for backward compatibility.
10349  
10350  const InspectorAdvancedControls = props => {
10351    return (0,external_wp_element_namespaceObject.createElement)(InspectorControlsFill, _extends({}, props, {
10352      __experimentalGroup: "advanced"
10353    }));
10354  };
10355  
10356  InspectorAdvancedControls.Slot = props => {
10357    return (0,external_wp_element_namespaceObject.createElement)(InspectorControlsSlot, _extends({}, props, {
10358      __experimentalGroup: "advanced"
10359    }));
10360  };
10361  
10362  InspectorAdvancedControls.slotName = 'InspectorAdvancedControls';
10363  /**
10364   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/inspector-controls/README.md
10365   */
10366  
10367  /* harmony default export */ var inspector_controls = (InspectorControls);
10368  
10369  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/margin.js
10370  
10371  
10372  /**
10373   * WordPress dependencies
10374   */
10375  
10376  
10377  
10378  
10379  /**
10380   * Internal dependencies
10381   */
10382  
10383  
10384  
10385  
10386  /**
10387   * Determines if there is margin support.
10388   *
10389   * @param {string|Object} blockType Block name or Block Type object.
10390   *
10391   * @return {boolean} Whether there is support.
10392   */
10393  
10394  function hasMarginSupport(blockType) {
10395    const support = (0,external_wp_blocks_namespaceObject.getBlockSupport)(blockType, SPACING_SUPPORT_KEY);
10396    return !!(true === support || support !== null && support !== void 0 && support.margin);
10397  }
10398  /**
10399   * Checks if there is a current value in the margin block support attributes.
10400   *
10401   * @param {Object} props Block props.
10402   * @return {boolean}      Whether or not the block has a margin value set.
10403   */
10404  
10405  function hasMarginValue(props) {
10406    var _props$attributes$sty, _props$attributes$sty2;
10407  
10408    return ((_props$attributes$sty = props.attributes.style) === null || _props$attributes$sty === void 0 ? void 0 : (_props$attributes$sty2 = _props$attributes$sty.spacing) === null || _props$attributes$sty2 === void 0 ? void 0 : _props$attributes$sty2.margin) !== undefined;
10409  }
10410  /**
10411   * Resets the margin block support attributes. This can be used when disabling
10412   * the margin support controls for a block via a `ToolsPanel`.
10413   *
10414   * @param {Object} props               Block props.
10415   * @param {Object} props.attributes    Block's attributes.
10416   * @param {Object} props.setAttributes Function to set block's attributes.
10417   */
10418  
10419  function resetMargin(_ref) {
10420    let {
10421      attributes = {},
10422      setAttributes
10423    } = _ref;
10424    const {
10425      style
10426    } = attributes;
10427    setAttributes({
10428      style: cleanEmptyObject({ ...style,
10429        spacing: { ...(style === null || style === void 0 ? void 0 : style.spacing),
10430          margin: undefined
10431        }
10432      })
10433    });
10434  }
10435  /**
10436   * Custom hook that checks if margin settings have been disabled.
10437   *
10438   * @param {string} name The name of the block.
10439   *
10440   * @return {boolean} Whether margin setting is disabled.
10441   */
10442  
10443  function useIsMarginDisabled() {
10444    let {
10445      name: blockName
10446    } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
10447    const isDisabled = !useSetting('spacing.margin');
10448    const isInvalid = !useIsDimensionsSupportValid(blockName, 'margin');
10449    return !hasMarginSupport(blockName) || isDisabled || isInvalid;
10450  }
10451  /**
10452   * Inspector control panel containing the margin related configuration
10453   *
10454   * @param {Object} props Block props.
10455   *
10456   * @return {WPElement} Margin edit element.
10457   */
10458  
10459  function MarginEdit(props) {
10460    var _style$spacing;
10461  
10462    const {
10463      name: blockName,
10464      attributes: {
10465        style
10466      },
10467      setAttributes
10468    } = props;
10469    const units = (0,external_wp_components_namespaceObject.__experimentalUseCustomUnits)({
10470      availableUnits: useSetting('spacing.units') || ['%', 'px', 'em', 'rem', 'vw']
10471    });
10472    const sides = useCustomSides(blockName, 'margin');
10473    const splitOnAxis = sides && sides.some(side => AXIAL_SIDES.includes(side));
10474  
10475    if (useIsMarginDisabled(props)) {
10476      return null;
10477    }
10478  
10479    const onChange = next => {
10480      const newStyle = { ...style,
10481        spacing: { ...(style === null || style === void 0 ? void 0 : style.spacing),
10482          margin: next
10483        }
10484      };
10485      setAttributes({
10486        style: cleanEmptyObject(newStyle)
10487      });
10488    };
10489  
10490    const onChangeShowVisualizer = next => {
10491      const newStyle = { ...style,
10492        visualizers: {
10493          margin: next
10494        }
10495      };
10496      setAttributes({
10497        style: cleanEmptyObject(newStyle)
10498      });
10499    };
10500  
10501    return external_wp_element_namespaceObject.Platform.select({
10502      web: (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalBoxControl, {
10503        values: style === null || style === void 0 ? void 0 : (_style$spacing = style.spacing) === null || _style$spacing === void 0 ? void 0 : _style$spacing.margin,
10504        onChange: onChange,
10505        onChangeShowVisualizer: onChangeShowVisualizer,
10506        label: (0,external_wp_i18n_namespaceObject.__)('Margin'),
10507        sides: sides,
10508        units: units,
10509        allowReset: false,
10510        splitOnAxis: splitOnAxis
10511      })),
10512      native: null
10513    });
10514  }
10515  
10516  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/padding.js
10517  
10518  
10519  /**
10520   * WordPress dependencies
10521   */
10522  
10523  
10524  
10525  
10526  /**
10527   * Internal dependencies
10528   */
10529  
10530  
10531  
10532  
10533  /**
10534   * Determines if there is padding support.
10535   *
10536   * @param {string|Object} blockType Block name or Block Type object.
10537   *
10538   * @return {boolean} Whether there is support.
10539   */
10540  
10541  function hasPaddingSupport(blockType) {
10542    const support = (0,external_wp_blocks_namespaceObject.getBlockSupport)(blockType, SPACING_SUPPORT_KEY);
10543    return !!(true === support || support !== null && support !== void 0 && support.padding);
10544  }
10545  /**
10546   * Checks if there is a current value in the padding block support attributes.
10547   *
10548   * @param {Object} props Block props.
10549   * @return {boolean}      Whether or not the block has a padding value set.
10550   */
10551  
10552  function hasPaddingValue(props) {
10553    var _props$attributes$sty, _props$attributes$sty2;
10554  
10555    return ((_props$attributes$sty = props.attributes.style) === null || _props$attributes$sty === void 0 ? void 0 : (_props$attributes$sty2 = _props$attributes$sty.spacing) === null || _props$attributes$sty2 === void 0 ? void 0 : _props$attributes$sty2.padding) !== undefined;
10556  }
10557  /**
10558   * Resets the padding block support attributes. This can be used when disabling
10559   * the padding support controls for a block via a `ToolsPanel`.
10560   *
10561   * @param {Object} props               Block props.
10562   * @param {Object} props.attributes    Block's attributes.
10563   * @param {Object} props.setAttributes Function to set block's attributes.
10564   */
10565  
10566  function resetPadding(_ref) {
10567    let {
10568      attributes = {},
10569      setAttributes
10570    } = _ref;
10571    const {
10572      style
10573    } = attributes;
10574    setAttributes({
10575      style: cleanEmptyObject({ ...style,
10576        spacing: { ...(style === null || style === void 0 ? void 0 : style.spacing),
10577          padding: undefined
10578        }
10579      })
10580    });
10581  }
10582  /**
10583   * Custom hook that checks if padding settings have been disabled.
10584   *
10585   * @param {string} name The name of the block.
10586   *
10587   * @return {boolean} Whether padding setting is disabled.
10588   */
10589  
10590  function useIsPaddingDisabled() {
10591    let {
10592      name: blockName
10593    } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
10594    const isDisabled = !useSetting('spacing.padding');
10595    const isInvalid = !useIsDimensionsSupportValid(blockName, 'padding');
10596    return !hasPaddingSupport(blockName) || isDisabled || isInvalid;
10597  }
10598  /**
10599   * Inspector control panel containing the padding related configuration
10600   *
10601   * @param {Object} props
10602   *
10603   * @return {WPElement} Padding edit element.
10604   */
10605  
10606  function PaddingEdit(props) {
10607    var _style$spacing;
10608  
10609    const {
10610      name: blockName,
10611      attributes: {
10612        style
10613      },
10614      setAttributes
10615    } = props;
10616    const units = (0,external_wp_components_namespaceObject.__experimentalUseCustomUnits)({
10617      availableUnits: useSetting('spacing.units') || ['%', 'px', 'em', 'rem', 'vw']
10618    });
10619    const sides = useCustomSides(blockName, 'padding');
10620    const splitOnAxis = sides && sides.some(side => AXIAL_SIDES.includes(side));
10621  
10622    if (useIsPaddingDisabled(props)) {
10623      return null;
10624    }
10625  
10626    const onChange = next => {
10627      const newStyle = { ...style,
10628        spacing: { ...(style === null || style === void 0 ? void 0 : style.spacing),
10629          padding: next
10630        }
10631      };
10632      setAttributes({
10633        style: cleanEmptyObject(newStyle)
10634      });
10635    };
10636  
10637    const onChangeShowVisualizer = next => {
10638      const newStyle = { ...style,
10639        visualizers: {
10640          padding: next
10641        }
10642      };
10643      setAttributes({
10644        style: cleanEmptyObject(newStyle)
10645      });
10646    };
10647  
10648    return external_wp_element_namespaceObject.Platform.select({
10649      web: (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalBoxControl, {
10650        values: style === null || style === void 0 ? void 0 : (_style$spacing = style.spacing) === null || _style$spacing === void 0 ? void 0 : _style$spacing.padding,
10651        onChange: onChange,
10652        onChangeShowVisualizer: onChangeShowVisualizer,
10653        label: (0,external_wp_i18n_namespaceObject.__)('Padding'),
10654        sides: sides,
10655        units: units,
10656        allowReset: false,
10657        splitOnAxis: splitOnAxis
10658      })),
10659      native: null
10660    });
10661  }
10662  
10663  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/dimensions.js
10664  
10665  
10666  /**
10667   * WordPress dependencies
10668   */
10669  
10670  
10671  
10672  
10673  /**
10674   * Internal dependencies
10675   */
10676  
10677  
10678  
10679  
10680  
10681  const SPACING_SUPPORT_KEY = 'spacing';
10682  const ALL_SIDES = ['top', 'right', 'bottom', 'left'];
10683  const AXIAL_SIDES = ['vertical', 'horizontal'];
10684  /**
10685   * Inspector controls for dimensions support.
10686   *
10687   * @param {Object} props Block props.
10688   *
10689   * @return {WPElement} Inspector controls for spacing support features.
10690   */
10691  
10692  function DimensionsPanel(props) {
10693    const isGapDisabled = useIsGapDisabled(props);
10694    const isPaddingDisabled = useIsPaddingDisabled(props);
10695    const isMarginDisabled = useIsMarginDisabled(props);
10696    const isDisabled = useIsDimensionsDisabled(props);
10697    const isSupported = hasDimensionsSupport(props.name);
10698  
10699    if (isDisabled || !isSupported) {
10700      return null;
10701    }
10702  
10703    const defaultSpacingControls = (0,external_wp_blocks_namespaceObject.getBlockSupport)(props.name, [SPACING_SUPPORT_KEY, '__experimentalDefaultControls']);
10704  
10705    const createResetAllFilter = attribute => newAttributes => {
10706      var _newAttributes$style;
10707  
10708      return { ...newAttributes,
10709        style: { ...newAttributes.style,
10710          spacing: { ...((_newAttributes$style = newAttributes.style) === null || _newAttributes$style === void 0 ? void 0 : _newAttributes$style.spacing),
10711            [attribute]: undefined
10712          }
10713        }
10714      };
10715    };
10716  
10717    return (0,external_wp_element_namespaceObject.createElement)(inspector_controls, {
10718      __experimentalGroup: "dimensions"
10719    }, !isPaddingDisabled && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalToolsPanelItem, {
10720      hasValue: () => hasPaddingValue(props),
10721      label: (0,external_wp_i18n_namespaceObject.__)('Padding'),
10722      onDeselect: () => resetPadding(props),
10723      resetAllFilter: createResetAllFilter('padding'),
10724      isShownByDefault: defaultSpacingControls === null || defaultSpacingControls === void 0 ? void 0 : defaultSpacingControls.padding,
10725      panelId: props.clientId
10726    }, (0,external_wp_element_namespaceObject.createElement)(PaddingEdit, props)), !isMarginDisabled && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalToolsPanelItem, {
10727      hasValue: () => hasMarginValue(props),
10728      label: (0,external_wp_i18n_namespaceObject.__)('Margin'),
10729      onDeselect: () => resetMargin(props),
10730      resetAllFilter: createResetAllFilter('margin'),
10731      isShownByDefault: defaultSpacingControls === null || defaultSpacingControls === void 0 ? void 0 : defaultSpacingControls.margin,
10732      panelId: props.clientId
10733    }, (0,external_wp_element_namespaceObject.createElement)(MarginEdit, props)), !isGapDisabled && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalToolsPanelItem, {
10734      hasValue: () => hasGapValue(props),
10735      label: (0,external_wp_i18n_namespaceObject.__)('Block spacing'),
10736      onDeselect: () => resetGap(props),
10737      resetAllFilter: createResetAllFilter('blockGap'),
10738      isShownByDefault: defaultSpacingControls === null || defaultSpacingControls === void 0 ? void 0 : defaultSpacingControls.blockGap,
10739      panelId: props.clientId
10740    }, (0,external_wp_element_namespaceObject.createElement)(GapEdit, props)));
10741  }
10742  /**
10743   * Determine whether there is dimensions related block support.
10744   *
10745   * @param {string} blockName Block name.
10746   *
10747   * @return {boolean} Whether there is support.
10748   */
10749  
10750  function hasDimensionsSupport(blockName) {
10751    if (external_wp_element_namespaceObject.Platform.OS !== 'web') {
10752      return false;
10753    }
10754  
10755    return hasGapSupport(blockName) || hasPaddingSupport(blockName) || hasMarginSupport(blockName);
10756  }
10757  /**
10758   * Determines whether dimensions support has been disabled.
10759   *
10760   * @param {Object} props Block properties.
10761   *
10762   * @return {boolean} If spacing support is completely disabled.
10763   */
10764  
10765  const useIsDimensionsDisabled = function () {
10766    let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
10767    const gapDisabled = useIsGapDisabled(props);
10768    const paddingDisabled = useIsPaddingDisabled(props);
10769    const marginDisabled = useIsMarginDisabled(props);
10770    return gapDisabled && paddingDisabled && marginDisabled;
10771  };
10772  /**
10773   * Custom hook to retrieve which padding/margin is supported
10774   * e.g. top, right, bottom or left.
10775   *
10776   * Sides are opted into by default. It is only if a specific side is set to
10777   * false that it is omitted.
10778   *
10779   * @param {string} blockName Block name.
10780   * @param {string} feature   The feature custom sides relate to e.g. padding or margins.
10781   *
10782   * @return {Object} Sides supporting custom margin.
10783   */
10784  
10785  
10786  function useCustomSides(blockName, feature) {
10787    const support = (0,external_wp_blocks_namespaceObject.getBlockSupport)(blockName, SPACING_SUPPORT_KEY); // Skip when setting is boolean as theme isn't setting arbitrary sides.
10788  
10789    if (!support || typeof support[feature] === 'boolean') {
10790      return;
10791    }
10792  
10793    return support[feature];
10794  }
10795  /**
10796   * Custom hook to determine whether the sides configured in the
10797   * block support are valid. A dimension property cannot declare
10798   * support for a mix of axial and individual sides.
10799   *
10800   * @param {string} blockName Block name.
10801   * @param {string} feature   The feature custom sides relate to e.g. padding or margins.
10802   *
10803   * @return {boolean} If the feature has a valid configuration of sides.
10804   */
10805  
10806  function useIsDimensionsSupportValid(blockName, feature) {
10807    const sides = useCustomSides(blockName, feature);
10808  
10809    if (sides && sides.some(side => ALL_SIDES.includes(side)) && sides.some(side => AXIAL_SIDES.includes(side))) {
10810      // eslint-disable-next-line no-console
10811      console.warn(`The $feature} support for the "$blockName}" block can not be configured to support both axial and arbitrary sides.`);
10812      return false;
10813    }
10814  
10815    return true;
10816  }
10817  
10818  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/gap.js
10819  
10820  
10821  /**
10822   * WordPress dependencies
10823   */
10824  
10825  
10826  
10827  
10828  /**
10829   * Internal dependencies
10830   */
10831  
10832  
10833  
10834  
10835  
10836  /**
10837   * Determines if there is gap support.
10838   *
10839   * @param {string|Object} blockType Block name or Block Type object.
10840   * @return {boolean}                Whether there is support.
10841   */
10842  
10843  function hasGapSupport(blockType) {
10844    const support = (0,external_wp_blocks_namespaceObject.getBlockSupport)(blockType, SPACING_SUPPORT_KEY);
10845    return !!(true === support || support !== null && support !== void 0 && support.blockGap);
10846  }
10847  /**
10848   * Checks if there is a current value in the gap block support attributes.
10849   *
10850   * @param {Object} props Block props.
10851   * @return {boolean}      Whether or not the block has a gap value set.
10852   */
10853  
10854  function hasGapValue(props) {
10855    var _props$attributes$sty, _props$attributes$sty2;
10856  
10857    return ((_props$attributes$sty = props.attributes.style) === null || _props$attributes$sty === void 0 ? void 0 : (_props$attributes$sty2 = _props$attributes$sty.spacing) === null || _props$attributes$sty2 === void 0 ? void 0 : _props$attributes$sty2.blockGap) !== undefined;
10858  }
10859  /**
10860   * Returns a BoxControl object value from a given blockGap style value.
10861   * The string check is for backwards compatibility before Gutenberg supported
10862   * split gap values (row and column) and the value was a string n + unit.
10863   *
10864   * @param {string? | Object?} blockGapValue A block gap string or axial object value, e.g., '10px' or { top: '10px', left: '10px'}.
10865   * @return {Object|null}                    A value to pass to the BoxControl component.
10866   */
10867  
10868  function getGapBoxControlValueFromStyle(blockGapValue) {
10869    if (!blockGapValue) {
10870      return null;
10871    }
10872  
10873    const isValueString = typeof blockGapValue === 'string';
10874    return {
10875      top: isValueString ? blockGapValue : blockGapValue === null || blockGapValue === void 0 ? void 0 : blockGapValue.top,
10876      left: isValueString ? blockGapValue : blockGapValue === null || blockGapValue === void 0 ? void 0 : blockGapValue.left
10877    };
10878  }
10879  /**
10880   * Returns a CSS value for the `gap` property from a given blockGap style.
10881   *
10882   * @param {string? | Object?} blockGapValue A block gap string or axial object value, e.g., '10px' or { top: '10px', left: '10px'}.
10883   * @param {string?}           defaultValue  A default gap value.
10884   * @return {string|null}                    The concatenated gap value (row and column).
10885   */
10886  
10887  function getGapCSSValue(blockGapValue) {
10888    let defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '0';
10889    const blockGapBoxControlValue = getGapBoxControlValueFromStyle(blockGapValue);
10890  
10891    if (!blockGapBoxControlValue) {
10892      return null;
10893    }
10894  
10895    const row = (blockGapBoxControlValue === null || blockGapBoxControlValue === void 0 ? void 0 : blockGapBoxControlValue.top) || defaultValue;
10896    const column = (blockGapBoxControlValue === null || blockGapBoxControlValue === void 0 ? void 0 : blockGapBoxControlValue.left) || defaultValue;
10897    return row === column ? row : `$row} $column}`;
10898  }
10899  /**
10900   * Resets the gap block support attribute. This can be used when disabling
10901   * the gap support controls for a block via a progressive discovery panel.
10902   *
10903   * @param {Object} props               Block props.
10904   * @param {Object} props.attributes    Block's attributes.
10905   * @param {Object} props.setAttributes Function to set block's attributes.
10906   */
10907  
10908  function resetGap(_ref) {
10909    let {
10910      attributes = {},
10911      setAttributes
10912    } = _ref;
10913    const {
10914      style
10915    } = attributes;
10916    setAttributes({
10917      style: { ...style,
10918        spacing: { ...(style === null || style === void 0 ? void 0 : style.spacing),
10919          blockGap: undefined
10920        }
10921      }
10922    });
10923  }
10924  /**
10925   * Custom hook that checks if gap settings have been disabled.
10926   *
10927   * @param {string} name The name of the block.
10928   * @return {boolean}     Whether the gap setting is disabled.
10929   */
10930  
10931  function useIsGapDisabled() {
10932    let {
10933      name: blockName
10934    } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
10935    const isDisabled = !useSetting('spacing.blockGap');
10936    return !hasGapSupport(blockName) || isDisabled;
10937  }
10938  /**
10939   * Inspector control panel containing the gap related configuration
10940   *
10941   * @param {Object} props
10942   *
10943   * @return {WPElement} Gap edit element.
10944   */
10945  
10946  function GapEdit(props) {
10947    var _style$spacing;
10948  
10949    const {
10950      clientId,
10951      attributes: {
10952        style
10953      },
10954      name: blockName,
10955      setAttributes
10956    } = props;
10957    const units = (0,external_wp_components_namespaceObject.__experimentalUseCustomUnits)({
10958      availableUnits: useSetting('spacing.units') || ['%', 'px', 'em', 'rem', 'vw']
10959    });
10960    const sides = useCustomSides(blockName, 'blockGap');
10961    const ref = useBlockRef(clientId);
10962  
10963    if (useIsGapDisabled(props)) {
10964      return null;
10965    }
10966  
10967    const splitOnAxis = sides && sides.some(side => AXIAL_SIDES.includes(side));
10968  
10969    const onChange = next => {
10970      var _window;
10971  
10972      let blockGap = next; // If splitOnAxis activated we need to return a BoxControl object to the BoxControl component.
10973  
10974      if (!!next && splitOnAxis) {
10975        blockGap = { ...getGapBoxControlValueFromStyle(next)
10976        };
10977      }
10978  
10979      const newStyle = { ...style,
10980        spacing: { ...(style === null || style === void 0 ? void 0 : style.spacing),
10981          blockGap
10982        }
10983      };
10984      setAttributes({
10985        style: cleanEmptyObject(newStyle)
10986      }); // In Safari, changing the `gap` CSS value on its own will not trigger the layout
10987      // to be recalculated / re-rendered. To force the updated gap to re-render, here
10988      // we replace the block's node with itself.
10989  
10990      const isSafari = ((_window = window) === null || _window === void 0 ? void 0 : _window.navigator.userAgent) && window.navigator.userAgent.includes('Safari') && !window.navigator.userAgent.includes('Chrome ') && !window.navigator.userAgent.includes('Chromium ');
10991  
10992      if (ref.current && isSafari) {
10993        var _ref$current$parentNo;
10994  
10995        (_ref$current$parentNo = ref.current.parentNode) === null || _ref$current$parentNo === void 0 ? void 0 : _ref$current$parentNo.replaceChild(ref.current, ref.current);
10996      }
10997    };
10998  
10999    const gapValue = getGapBoxControlValueFromStyle(style === null || style === void 0 ? void 0 : (_style$spacing = style.spacing) === null || _style$spacing === void 0 ? void 0 : _style$spacing.blockGap); // The BoxControl component expects a full complement of side values.
11000    // Gap row and column values translate to top/bottom and left/right respectively.
11001  
11002    const boxControlGapValue = splitOnAxis ? { ...gapValue,
11003      right: gapValue === null || gapValue === void 0 ? void 0 : gapValue.left,
11004      bottom: gapValue === null || gapValue === void 0 ? void 0 : gapValue.top
11005    } : gapValue === null || gapValue === void 0 ? void 0 : gapValue.top;
11006    return external_wp_element_namespaceObject.Platform.select({
11007      web: (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, splitOnAxis ? (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalBoxControl, {
11008        label: (0,external_wp_i18n_namespaceObject.__)('Block spacing'),
11009        min: 0,
11010        onChange: onChange,
11011        units: units,
11012        sides: sides,
11013        values: boxControlGapValue,
11014        allowReset: false,
11015        splitOnAxis: splitOnAxis
11016      }) : (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalUnitControl, {
11017        label: (0,external_wp_i18n_namespaceObject.__)('Block spacing'),
11018        __unstableInputWidth: "80px",
11019        min: 0,
11020        onChange: onChange,
11021        units: units // Default to `row` for combined values.
11022        ,
11023        value: boxControlGapValue
11024      })),
11025      native: null
11026    });
11027  }
11028  
11029  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-vertical-alignment-control/icons.js
11030  
11031  
11032  /**
11033   * WordPress dependencies
11034   */
11035  
11036  const alignBottom = (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.SVG, {
11037    xmlns: "http://www.w3.org/2000/svg",
11038    viewBox: "0 0 24 24"
11039  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Path, {
11040    d: "M15 4H9v11h6V4zM4 18.5V20h16v-1.5H4z"
11041  }));
11042  const alignCenter = (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.SVG, {
11043    xmlns: "http://www.w3.org/2000/svg",
11044    viewBox: "0 0 24 24"
11045  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Path, {
11046    d: "M20 11h-5V4H9v7H4v1.5h5V20h6v-7.5h5z"
11047  }));
11048  const alignTop = (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.SVG, {
11049    xmlns: "http://www.w3.org/2000/svg",
11050    viewBox: "0 0 24 24"
11051  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Path, {
11052    d: "M9 20h6V9H9v11zM4 4v1.5h16V4H4z"
11053  }));
11054  
11055  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-vertical-alignment-control/ui.js
11056  
11057  
11058  
11059  /**
11060   * WordPress dependencies
11061   */
11062  
11063  
11064  /**
11065   * Internal dependencies
11066   */
11067  
11068  
11069  const BLOCK_ALIGNMENTS_CONTROLS = {
11070    top: {
11071      icon: alignTop,
11072      title: (0,external_wp_i18n_namespaceObject._x)('Align top', 'Block vertical alignment setting')
11073    },
11074    center: {
11075      icon: alignCenter,
11076      title: (0,external_wp_i18n_namespaceObject._x)('Align middle', 'Block vertical alignment setting')
11077    },
11078    bottom: {
11079      icon: alignBottom,
11080      title: (0,external_wp_i18n_namespaceObject._x)('Align bottom', 'Block vertical alignment setting')
11081    }
11082  };
11083  const DEFAULT_CONTROLS = ['top', 'center', 'bottom'];
11084  const DEFAULT_CONTROL = 'top';
11085  const POPOVER_PROPS = {
11086    isAlternate: true
11087  };
11088  
11089  function BlockVerticalAlignmentUI(_ref) {
11090    let {
11091      value,
11092      onChange,
11093      controls = DEFAULT_CONTROLS,
11094      isCollapsed = true,
11095      isToolbar
11096    } = _ref;
11097  
11098    function applyOrUnset(align) {
11099      return () => onChange(value === align ? undefined : align);
11100    }
11101  
11102    const activeAlignment = BLOCK_ALIGNMENTS_CONTROLS[value];
11103    const defaultAlignmentControl = BLOCK_ALIGNMENTS_CONTROLS[DEFAULT_CONTROL];
11104    const UIComponent = isToolbar ? external_wp_components_namespaceObject.ToolbarGroup : external_wp_components_namespaceObject.ToolbarDropdownMenu;
11105    const extraProps = isToolbar ? {
11106      isCollapsed
11107    } : {};
11108    return (0,external_wp_element_namespaceObject.createElement)(UIComponent, _extends({
11109      popoverProps: POPOVER_PROPS,
11110      icon: activeAlignment ? activeAlignment.icon : defaultAlignmentControl.icon,
11111      label: (0,external_wp_i18n_namespaceObject._x)('Change vertical alignment', 'Block vertical alignment setting label'),
11112      controls: controls.map(control => {
11113        return { ...BLOCK_ALIGNMENTS_CONTROLS[control],
11114          isActive: value === control,
11115          role: isCollapsed ? 'menuitemradio' : undefined,
11116          onClick: applyOrUnset(control)
11117        };
11118      })
11119    }, extraProps));
11120  }
11121  /**
11122   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/block-vertical-alignment-toolbar/README.md
11123   */
11124  
11125  
11126  /* harmony default export */ var ui = (BlockVerticalAlignmentUI);
11127  
11128  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-vertical-alignment-control/index.js
11129  
11130  
11131  
11132  /**
11133   * Internal dependencies
11134   */
11135  
11136  
11137  const BlockVerticalAlignmentControl = props => {
11138    return (0,external_wp_element_namespaceObject.createElement)(ui, _extends({}, props, {
11139      isToolbar: false
11140    }));
11141  };
11142  
11143  const BlockVerticalAlignmentToolbar = props => {
11144    return (0,external_wp_element_namespaceObject.createElement)(ui, _extends({}, props, {
11145      isToolbar: true
11146    }));
11147  };
11148  /**
11149   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/block-vertical-alignment-control/README.md
11150   */
11151  
11152  
11153  
11154  
11155  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/justify-content-control/ui.js
11156  
11157  
11158  
11159  /**
11160   * WordPress dependencies
11161   */
11162  
11163  
11164  
11165  const icons = {
11166    left: justify_left,
11167    center: justify_center,
11168    right: justify_right,
11169    'space-between': justify_space_between
11170  };
11171  
11172  function JustifyContentUI(_ref) {
11173    let {
11174      allowedControls = ['left', 'center', 'right', 'space-between'],
11175      isCollapsed = true,
11176      onChange,
11177      value,
11178      popoverProps,
11179      isToolbar
11180    } = _ref;
11181  
11182    // If the control is already selected we want a click
11183    // again on the control to deselect the item, so we
11184    // call onChange( undefined )
11185    const handleClick = next => {
11186      if (next === value) {
11187        onChange(undefined);
11188      } else {
11189        onChange(next);
11190      }
11191    };
11192  
11193    const icon = value ? icons[value] : icons.left;
11194    const allControls = [{
11195      name: 'left',
11196      icon: justify_left,
11197      title: (0,external_wp_i18n_namespaceObject.__)('Justify items left'),
11198      isActive: 'left' === value,
11199      onClick: () => handleClick('left')
11200    }, {
11201      name: 'center',
11202      icon: justify_center,
11203      title: (0,external_wp_i18n_namespaceObject.__)('Justify items center'),
11204      isActive: 'center' === value,
11205      onClick: () => handleClick('center')
11206    }, {
11207      name: 'right',
11208      icon: justify_right,
11209      title: (0,external_wp_i18n_namespaceObject.__)('Justify items right'),
11210      isActive: 'right' === value,
11211      onClick: () => handleClick('right')
11212    }, {
11213      name: 'space-between',
11214      icon: justify_space_between,
11215      title: (0,external_wp_i18n_namespaceObject.__)('Space between items'),
11216      isActive: 'space-between' === value,
11217      onClick: () => handleClick('space-between')
11218    }];
11219    const UIComponent = isToolbar ? external_wp_components_namespaceObject.ToolbarGroup : external_wp_components_namespaceObject.ToolbarDropdownMenu;
11220    const extraProps = isToolbar ? {
11221      isCollapsed
11222    } : {};
11223    return (0,external_wp_element_namespaceObject.createElement)(UIComponent, _extends({
11224      icon: icon,
11225      popoverProps: popoverProps,
11226      label: (0,external_wp_i18n_namespaceObject.__)('Change items justification'),
11227      controls: allControls.filter(elem => allowedControls.includes(elem.name))
11228    }, extraProps));
11229  }
11230  
11231  /* harmony default export */ var justify_content_control_ui = (JustifyContentUI);
11232  
11233  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/justify-content-control/index.js
11234  
11235  
11236  
11237  /**
11238   * Internal dependencies
11239   */
11240  
11241  
11242  const JustifyContentControl = props => {
11243    return (0,external_wp_element_namespaceObject.createElement)(justify_content_control_ui, _extends({}, props, {
11244      isToolbar: false
11245    }));
11246  };
11247  
11248  const JustifyToolbar = props => {
11249    return (0,external_wp_element_namespaceObject.createElement)(justify_content_control_ui, _extends({}, props, {
11250      isToolbar: true
11251    }));
11252  };
11253  /**
11254   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/justify-content-control/README.md
11255   */
11256  
11257  
11258  
11259  
11260  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/layouts/flex.js
11261  
11262  
11263  /**
11264   * WordPress dependencies
11265   */
11266  
11267  
11268  
11269  /**
11270   * Internal dependencies
11271   */
11272  
11273  
11274  
11275  
11276  
11277   // Used with the default, horizontal flex orientation.
11278  
11279  const justifyContentMap = {
11280    left: 'flex-start',
11281    right: 'flex-end',
11282    center: 'center',
11283    'space-between': 'space-between'
11284  }; // Used with the vertical (column) flex orientation.
11285  
11286  const alignItemsMap = {
11287    left: 'flex-start',
11288    right: 'flex-end',
11289    center: 'center'
11290  };
11291  const verticalAlignmentMap = {
11292    top: 'flex-start',
11293    center: 'center',
11294    bottom: 'flex-end'
11295  };
11296  const flexWrapOptions = ['wrap', 'nowrap'];
11297  /* harmony default export */ var flex = ({
11298    name: 'flex',
11299    label: (0,external_wp_i18n_namespaceObject.__)('Flex'),
11300    inspectorControls: function FlexLayoutInspectorControls(_ref) {
11301      let {
11302        layout = {},
11303        onChange,
11304        layoutBlockSupport = {}
11305      } = _ref;
11306      const {
11307        allowOrientation = true
11308      } = layoutBlockSupport;
11309      return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Flex, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.FlexItem, null, (0,external_wp_element_namespaceObject.createElement)(FlexLayoutJustifyContentControl, {
11310        layout: layout,
11311        onChange: onChange
11312      })), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.FlexItem, null, allowOrientation && (0,external_wp_element_namespaceObject.createElement)(OrientationControl, {
11313        layout: layout,
11314        onChange: onChange
11315      }))), (0,external_wp_element_namespaceObject.createElement)(FlexWrapControl, {
11316        layout: layout,
11317        onChange: onChange
11318      }));
11319    },
11320    toolBarControls: function FlexLayoutToolbarControls(_ref2) {
11321      let {
11322        layout = {},
11323        onChange,
11324        layoutBlockSupport
11325      } = _ref2;
11326  
11327      if (layoutBlockSupport !== null && layoutBlockSupport !== void 0 && layoutBlockSupport.allowSwitching) {
11328        return null;
11329      }
11330  
11331      const {
11332        allowVerticalAlignment = true
11333      } = layoutBlockSupport;
11334      return (0,external_wp_element_namespaceObject.createElement)(block_controls, {
11335        group: "block",
11336        __experimentalShareWithChildBlocks: true
11337      }, (0,external_wp_element_namespaceObject.createElement)(FlexLayoutJustifyContentControl, {
11338        layout: layout,
11339        onChange: onChange,
11340        isToolbar: true
11341      }), allowVerticalAlignment && (layout === null || layout === void 0 ? void 0 : layout.orientation) !== 'vertical' && (0,external_wp_element_namespaceObject.createElement)(FlexLayoutVerticalAlignmentControl, {
11342        layout: layout,
11343        onChange: onChange,
11344        isToolbar: true
11345      }));
11346    },
11347    save: function FlexLayoutStyle(_ref3) {
11348      var _style$spacing, _style$spacing2;
11349  
11350      let {
11351        selector,
11352        layout,
11353        style,
11354        blockName
11355      } = _ref3;
11356      const {
11357        orientation = 'horizontal'
11358      } = layout;
11359      const blockGapSupport = useSetting('spacing.blockGap');
11360      const hasBlockGapStylesSupport = blockGapSupport !== null; // If a block's block.json skips serialization for spacing or spacing.blockGap,
11361      // don't apply the user-defined value to the styles.
11362  
11363      const blockGapValue = style !== null && style !== void 0 && (_style$spacing = style.spacing) !== null && _style$spacing !== void 0 && _style$spacing.blockGap && !shouldSkipSerialization(blockName, 'spacing', 'blockGap') ? getGapCSSValue(style === null || style === void 0 ? void 0 : (_style$spacing2 = style.spacing) === null || _style$spacing2 === void 0 ? void 0 : _style$spacing2.blockGap, '0.5em') : 'var( --wp--style--block-gap, 0.5em )';
11364      const justifyContent = justifyContentMap[layout.justifyContent] || justifyContentMap.left;
11365      const flexWrap = flexWrapOptions.includes(layout.flexWrap) ? layout.flexWrap : 'wrap';
11366      const verticalAlignment = verticalAlignmentMap[layout.verticalAlignment] || verticalAlignmentMap.center;
11367      const rowOrientation = `
11368          flex-direction: row;
11369          align-items: $verticalAlignment};
11370          justify-content: $justifyContent};
11371          `;
11372      const alignItems = alignItemsMap[layout.justifyContent] || alignItemsMap.left;
11373      const columnOrientation = `
11374          flex-direction: column;
11375          align-items: $alignItems};
11376          `;
11377      return (0,external_wp_element_namespaceObject.createElement)("style", null, `
11378                  $appendSelectors(selector)} {
11379                      display: flex;
11380                      flex-wrap: $flexWrap};
11381                      gap: $hasBlockGapStylesSupport ? blockGapValue : '0.5em'};
11382                      $orientation === 'horizontal' ? rowOrientation : columnOrientation}
11383                  }
11384  
11385                  $appendSelectors(selector, '> *')} {
11386                      margin: 0;
11387                  }
11388              `);
11389    },
11390  
11391    getOrientation(layout) {
11392      const {
11393        orientation = 'horizontal'
11394      } = layout;
11395      return orientation;
11396    },
11397  
11398    getAlignments() {
11399      return [];
11400    }
11401  
11402  });
11403  
11404  function FlexLayoutVerticalAlignmentControl(_ref4) {
11405    let {
11406      layout,
11407      onChange,
11408      isToolbar = false
11409    } = _ref4;
11410    const {
11411      verticalAlignment = verticalAlignmentMap.center
11412    } = layout;
11413  
11414    const onVerticalAlignmentChange = value => {
11415      onChange({ ...layout,
11416        verticalAlignment: value
11417      });
11418    };
11419  
11420    if (isToolbar) {
11421      return (0,external_wp_element_namespaceObject.createElement)(BlockVerticalAlignmentControl, {
11422        onChange: onVerticalAlignmentChange,
11423        value: verticalAlignment
11424      });
11425    }
11426  
11427    const verticalAlignmentOptions = [{
11428      value: 'flex-start',
11429      label: (0,external_wp_i18n_namespaceObject.__)('Align items top')
11430    }, {
11431      value: 'center',
11432      label: (0,external_wp_i18n_namespaceObject.__)('Align items center')
11433    }, {
11434      value: 'flex-end',
11435      label: (0,external_wp_i18n_namespaceObject.__)('Align items bottom')
11436    }];
11437    return (0,external_wp_element_namespaceObject.createElement)("fieldset", {
11438      className: "block-editor-hooks__flex-layout-vertical-alignment-control"
11439    }, (0,external_wp_element_namespaceObject.createElement)("legend", null, (0,external_wp_i18n_namespaceObject.__)('Vertical alignment')), (0,external_wp_element_namespaceObject.createElement)("div", null, verticalAlignmentOptions.map((value, icon, label) => {
11440      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
11441        key: value,
11442        label: label,
11443        icon: icon,
11444        isPressed: verticalAlignment === value,
11445        onClick: () => onVerticalAlignmentChange(value)
11446      });
11447    })));
11448  }
11449  
11450  function FlexLayoutJustifyContentControl(_ref5) {
11451    let {
11452      layout,
11453      onChange,
11454      isToolbar = false
11455    } = _ref5;
11456    const {
11457      justifyContent = 'left',
11458      orientation = 'horizontal'
11459    } = layout;
11460  
11461    const onJustificationChange = value => {
11462      onChange({ ...layout,
11463        justifyContent: value
11464      });
11465    };
11466  
11467    const allowedControls = ['left', 'center', 'right'];
11468  
11469    if (orientation === 'horizontal') {
11470      allowedControls.push('space-between');
11471    }
11472  
11473    if (isToolbar) {
11474      return (0,external_wp_element_namespaceObject.createElement)(JustifyContentControl, {
11475        allowedControls: allowedControls,
11476        value: justifyContent,
11477        onChange: onJustificationChange,
11478        popoverProps: {
11479          position: 'bottom right',
11480          isAlternate: true
11481        }
11482      });
11483    }
11484  
11485    const justificationOptions = [{
11486      value: 'left',
11487      icon: justify_left,
11488      label: (0,external_wp_i18n_namespaceObject.__)('Justify items left')
11489    }, {
11490      value: 'center',
11491      icon: justify_center,
11492      label: (0,external_wp_i18n_namespaceObject.__)('Justify items center')
11493    }, {
11494      value: 'right',
11495      icon: justify_right,
11496      label: (0,external_wp_i18n_namespaceObject.__)('Justify items right')
11497    }];
11498  
11499    if (orientation === 'horizontal') {
11500      justificationOptions.push({
11501        value: 'space-between',
11502        icon: justify_space_between,
11503        label: (0,external_wp_i18n_namespaceObject.__)('Space between items')
11504      });
11505    }
11506  
11507    return (0,external_wp_element_namespaceObject.createElement)("fieldset", {
11508      className: "block-editor-hooks__flex-layout-justification-controls"
11509    }, (0,external_wp_element_namespaceObject.createElement)("legend", null, (0,external_wp_i18n_namespaceObject.__)('Justification')), (0,external_wp_element_namespaceObject.createElement)("div", null, justificationOptions.map(_ref6 => {
11510      let {
11511        value,
11512        icon,
11513        label
11514      } = _ref6;
11515      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
11516        key: value,
11517        label: label,
11518        icon: icon,
11519        isPressed: justifyContent === value,
11520        onClick: () => onJustificationChange(value)
11521      });
11522    })));
11523  }
11524  
11525  function FlexWrapControl(_ref7) {
11526    let {
11527      layout,
11528      onChange
11529    } = _ref7;
11530    const {
11531      flexWrap = 'wrap'
11532    } = layout;
11533    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToggleControl, {
11534      label: (0,external_wp_i18n_namespaceObject.__)('Allow to wrap to multiple lines'),
11535      onChange: value => {
11536        onChange({ ...layout,
11537          flexWrap: value ? 'wrap' : 'nowrap'
11538        });
11539      },
11540      checked: flexWrap === 'wrap'
11541    });
11542  }
11543  
11544  function OrientationControl(_ref8) {
11545    let {
11546      layout,
11547      onChange
11548    } = _ref8;
11549    const {
11550      orientation = 'horizontal'
11551    } = layout;
11552    return (0,external_wp_element_namespaceObject.createElement)("fieldset", {
11553      className: "block-editor-hooks__flex-layout-orientation-controls"
11554    }, (0,external_wp_element_namespaceObject.createElement)("legend", null, (0,external_wp_i18n_namespaceObject.__)('Orientation')), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
11555      label: 'horizontal',
11556      icon: arrow_right,
11557      isPressed: orientation === 'horizontal',
11558      onClick: () => onChange({ ...layout,
11559        orientation: 'horizontal'
11560      })
11561    }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
11562      label: 'vertical',
11563      icon: arrow_down,
11564      isPressed: orientation === 'vertical',
11565      onClick: () => onChange({ ...layout,
11566        orientation: 'vertical'
11567      })
11568    }));
11569  }
11570  
11571  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/icon/index.js
11572  /**
11573   * WordPress dependencies
11574   */
11575  
11576  /** @typedef {{icon: JSX.Element, size?: number} & import('@wordpress/primitives').SVGProps} IconProps */
11577  
11578  /**
11579   * Return an SVG icon.
11580   *
11581   * @param {IconProps} props icon is the SVG component to render
11582   *                          size is a number specifiying the icon size in pixels
11583   *                          Other props will be passed to wrapped SVG component
11584   *
11585   * @return {JSX.Element}  Icon component
11586   */
11587  
11588  function Icon(_ref) {
11589    let {
11590      icon,
11591      size = 24,
11592      ...props
11593    } = _ref;
11594    return (0,external_wp_element_namespaceObject.cloneElement)(icon, {
11595      width: size,
11596      height: size,
11597      ...props
11598    });
11599  }
11600  
11601  /* harmony default export */ var build_module_icon = (Icon);
11602  
11603  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/layouts/flow.js
11604  
11605  
11606  /**
11607   * WordPress dependencies
11608   */
11609  
11610  
11611  
11612  /**
11613   * Internal dependencies
11614   */
11615  
11616  
11617  
11618  
11619  
11620  /* harmony default export */ var flow = ({
11621    name: 'default',
11622    label: (0,external_wp_i18n_namespaceObject.__)('Flow'),
11623    inspectorControls: function DefaultLayoutInspectorControls(_ref) {
11624      let {
11625        layout,
11626        onChange
11627      } = _ref;
11628      const {
11629        wideSize,
11630        contentSize
11631      } = layout;
11632      const units = (0,external_wp_components_namespaceObject.__experimentalUseCustomUnits)({
11633        availableUnits: useSetting('spacing.units') || ['%', 'px', 'em', 'rem', 'vw']
11634      });
11635      return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)("div", {
11636        className: "block-editor-hooks__layout-controls"
11637      }, (0,external_wp_element_namespaceObject.createElement)("div", {
11638        className: "block-editor-hooks__layout-controls-unit"
11639      }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalUnitControl, {
11640        label: (0,external_wp_i18n_namespaceObject.__)('Content'),
11641        labelPosition: "top",
11642        __unstableInputWidth: "80px",
11643        value: contentSize || wideSize || '',
11644        onChange: nextWidth => {
11645          nextWidth = 0 > parseFloat(nextWidth) ? '0' : nextWidth;
11646          onChange({ ...layout,
11647            contentSize: nextWidth
11648          });
11649        },
11650        units: units
11651      }), (0,external_wp_element_namespaceObject.createElement)(build_module_icon, {
11652        icon: position_center
11653      })), (0,external_wp_element_namespaceObject.createElement)("div", {
11654        className: "block-editor-hooks__layout-controls-unit"
11655      }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalUnitControl, {
11656        label: (0,external_wp_i18n_namespaceObject.__)('Wide'),
11657        labelPosition: "top",
11658        __unstableInputWidth: "80px",
11659        value: wideSize || contentSize || '',
11660        onChange: nextWidth => {
11661          nextWidth = 0 > parseFloat(nextWidth) ? '0' : nextWidth;
11662          onChange({ ...layout,
11663            wideSize: nextWidth
11664          });
11665        },
11666        units: units
11667      }), (0,external_wp_element_namespaceObject.createElement)(build_module_icon, {
11668        icon: stretch_wide
11669      }))), (0,external_wp_element_namespaceObject.createElement)("div", {
11670        className: "block-editor-hooks__layout-controls-reset"
11671      }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
11672        variant: "secondary",
11673        isSmall: true,
11674        disabled: !contentSize && !wideSize,
11675        onClick: () => onChange({
11676          contentSize: undefined,
11677          wideSize: undefined,
11678          inherit: false
11679        })
11680      }, (0,external_wp_i18n_namespaceObject.__)('Reset'))), (0,external_wp_element_namespaceObject.createElement)("p", {
11681        className: "block-editor-hooks__layout-controls-helptext"
11682      }, (0,external_wp_i18n_namespaceObject.__)('Customize the width for all elements that are assigned to the center or wide columns.')));
11683    },
11684    toolBarControls: function DefaultLayoutToolbarControls() {
11685      return null;
11686    },
11687    save: function DefaultLayoutStyle(_ref2) {
11688      var _style$spacing;
11689  
11690      let {
11691        selector,
11692        layout = {},
11693        style,
11694        blockName
11695      } = _ref2;
11696      const {
11697        contentSize,
11698        wideSize
11699      } = layout;
11700      const blockGapSupport = useSetting('spacing.blockGap');
11701      const hasBlockGapStylesSupport = blockGapSupport !== null;
11702      const blockGapStyleValue = getGapBoxControlValueFromStyle(style === null || style === void 0 ? void 0 : (_style$spacing = style.spacing) === null || _style$spacing === void 0 ? void 0 : _style$spacing.blockGap); // If a block's block.json skips serialization for spacing or
11703      // spacing.blockGap, don't apply the user-defined value to the styles.
11704  
11705      const blockGapValue = blockGapStyleValue !== null && blockGapStyleValue !== void 0 && blockGapStyleValue.top && !shouldSkipSerialization(blockName, 'spacing', 'blockGap') ? blockGapStyleValue === null || blockGapStyleValue === void 0 ? void 0 : blockGapStyleValue.top : 'var( --wp--style--block-gap )';
11706      let output = !!contentSize || !!wideSize ? `
11707                      $appendSelectors(selector, '> :where(:not(.alignleft):not(.alignright))')} {
11708                          max-width: $contentSize !== null && contentSize !== void 0 ? contentSize : wideSize};
11709                          margin-left: auto !important;
11710                          margin-right: auto !important;
11711                      }
11712                      $appendSelectors(selector, '> .alignwide')}  {
11713                          max-width: $wideSize !== null && wideSize !== void 0 ? wideSize : contentSize};
11714                      }
11715                      $appendSelectors(selector, '> .alignfull')} {
11716                          max-width: none;
11717                      }
11718                  ` : '';
11719      output += `
11720              $appendSelectors(selector, '> .alignleft')} {
11721                  float: left;
11722                  margin-inline-start: 0;
11723                  margin-inline-end: 2em;
11724              }
11725              $appendSelectors(selector, '> .alignright')} {
11726                  float: right;
11727                  margin-inline-start: 2em;
11728                  margin-inline-end: 0;
11729              }
11730  
11731              $appendSelectors(selector, '> .aligncenter')} {
11732                  margin-left: auto !important;
11733                  margin-right: auto !important;
11734              }
11735          `;
11736  
11737      if (hasBlockGapStylesSupport) {
11738        output += `
11739                  $appendSelectors(selector, '> *')} {
11740                      margin-block-start: 0;
11741                      margin-block-end: 0;
11742                  }
11743                  $appendSelectors(selector, '> * + *')} {
11744                      margin-block-start: $blockGapValue};
11745                  }
11746              `;
11747      }
11748  
11749      return (0,external_wp_element_namespaceObject.createElement)("style", null, output);
11750    },
11751  
11752    getOrientation() {
11753      return 'vertical';
11754    },
11755  
11756    getAlignments(layout) {
11757      const alignmentInfo = getAlignmentsInfo(layout);
11758  
11759      if (layout.alignments !== undefined) {
11760        if (!layout.alignments.includes('none')) {
11761          layout.alignments.unshift('none');
11762        }
11763  
11764        return layout.alignments.map(alignment => ({
11765          name: alignment,
11766          info: alignmentInfo[alignment]
11767        }));
11768      }
11769  
11770      const {
11771        contentSize,
11772        wideSize
11773      } = layout;
11774      const alignments = [{
11775        name: 'left'
11776      }, {
11777        name: 'center'
11778      }, {
11779        name: 'right'
11780      }];
11781  
11782      if (contentSize) {
11783        alignments.unshift({
11784          name: 'full'
11785        });
11786      }
11787  
11788      if (wideSize) {
11789        alignments.unshift({
11790          name: 'wide',
11791          info: alignmentInfo.wide
11792        });
11793      }
11794  
11795      alignments.unshift({
11796        name: 'none',
11797        info: alignmentInfo.none
11798      });
11799      return alignments;
11800    }
11801  
11802  });
11803  /**
11804   * Helper method to assign contextual info to clarify
11805   * alignment settings.
11806   *
11807   * Besides checking if `contentSize` and `wideSize` have a
11808   * value, we now show this information only if their values
11809   * are not a `css var`. This needs to change when parsing
11810   * css variables land.
11811   *
11812   * @see https://github.com/WordPress/gutenberg/pull/34710#issuecomment-918000752
11813   *
11814   * @param {Object} layout The layout object.
11815   * @return {Object} An object with contextual info per alignment.
11816   */
11817  
11818  function getAlignmentsInfo(layout) {
11819    const {
11820      contentSize,
11821      wideSize
11822    } = layout;
11823    const alignmentInfo = {};
11824    const sizeRegex = /^(?!0)\d+(px|em|rem|vw|vh|%)?$/i;
11825  
11826    if (sizeRegex.test(contentSize)) {
11827      // translators: %s: container size (i.e. 600px etc)
11828      alignmentInfo.none = (0,external_wp_i18n_namespaceObject.sprintf)((0,external_wp_i18n_namespaceObject.__)('Max %s wide'), contentSize);
11829    }
11830  
11831    if (sizeRegex.test(wideSize)) {
11832      // translators: %s: container size (i.e. 600px etc)
11833      alignmentInfo.wide = (0,external_wp_i18n_namespaceObject.sprintf)((0,external_wp_i18n_namespaceObject.__)('Max %s wide'), wideSize);
11834    }
11835  
11836    return alignmentInfo;
11837  }
11838  
11839  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/layouts/index.js
11840  /**
11841   * Internal dependencies
11842   */
11843  
11844  
11845  const layoutTypes = [flow, flex];
11846  /**
11847   * Retrieves a layout type by name.
11848   *
11849   * @param {string} name - The name of the layout type.
11850   * @return {Object} Layout type.
11851   */
11852  
11853  function getLayoutType() {
11854    let name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'default';
11855    return layoutTypes.find(layoutType => layoutType.name === name);
11856  }
11857  /**
11858   * Retrieves the available layout types.
11859   *
11860   * @return {Array} Layout types.
11861   */
11862  
11863  function getLayoutTypes() {
11864    return layoutTypes;
11865  }
11866  
11867  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-list/layout.js
11868  
11869  
11870  
11871  /**
11872   * WordPress dependencies
11873   */
11874  
11875  /**
11876   * Internal dependencies
11877   */
11878  
11879  
11880  const defaultLayout = {
11881    type: 'default'
11882  };
11883  const Layout = (0,external_wp_element_namespaceObject.createContext)(defaultLayout);
11884  /**
11885   * Allows to define the layout.
11886   */
11887  
11888  const LayoutProvider = Layout.Provider;
11889  /**
11890   * React hook used to retrieve the layout config.
11891   */
11892  
11893  function useLayout() {
11894    return (0,external_wp_element_namespaceObject.useContext)(Layout);
11895  }
11896  function LayoutStyle(_ref) {
11897    let {
11898      layout = {},
11899      ...props
11900    } = _ref;
11901    const layoutType = getLayoutType(layout.type);
11902  
11903    if (layoutType) {
11904      return (0,external_wp_element_namespaceObject.createElement)(layoutType.save, _extends({
11905        layout: layout
11906      }, props));
11907    }
11908  
11909    return null;
11910  }
11911  
11912  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-alignment-control/use-available-alignments.js
11913  /**
11914   * WordPress dependencies
11915   */
11916  
11917  /**
11918   * Internal dependencies
11919   */
11920  
11921  
11922  
11923  
11924  const use_available_alignments_DEFAULT_CONTROLS = ['none', 'left', 'center', 'right', 'wide', 'full'];
11925  const WIDE_CONTROLS = ['wide', 'full'];
11926  function useAvailableAlignments() {
11927    let controls = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : use_available_alignments_DEFAULT_CONTROLS;
11928  
11929    // Always add the `none` option if not exists.
11930    if (!controls.includes('none')) {
11931      controls = ['none', ...controls];
11932    }
11933  
11934    const {
11935      wideControlsEnabled = false,
11936      themeSupportsLayout
11937    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
11938      const {
11939        getSettings
11940      } = select(store);
11941      const settings = getSettings();
11942      return {
11943        wideControlsEnabled: settings.alignWide,
11944        themeSupportsLayout: settings.supportsLayout
11945      };
11946    }, []);
11947    const layout = useLayout();
11948    const layoutType = getLayoutType(layout === null || layout === void 0 ? void 0 : layout.type);
11949    const layoutAlignments = layoutType.getAlignments(layout);
11950  
11951    if (themeSupportsLayout) {
11952      const alignments = layoutAlignments.filter(_ref => {
11953        let {
11954          name: alignmentName
11955        } = _ref;
11956        return controls.includes(alignmentName);
11957      }); // While we treat `none` as an alignment, we shouldn't return it if no
11958      // other alignments exist.
11959  
11960      if (alignments.length === 1 && alignments[0].name === 'none') {
11961        return [];
11962      }
11963  
11964      return alignments;
11965    } // Starting here, it's the fallback for themes not supporting the layout config.
11966  
11967  
11968    if (layoutType.name !== 'default') {
11969      return [];
11970    }
11971  
11972    const {
11973      alignments: availableAlignments = use_available_alignments_DEFAULT_CONTROLS
11974    } = layout;
11975    const enabledControls = controls.filter(control => (layout.alignments || // Ignore the global wideAlignment check if the layout explicitely defines alignments.
11976    wideControlsEnabled || !WIDE_CONTROLS.includes(control)) && availableAlignments.includes(control)).map(enabledControl => ({
11977      name: enabledControl
11978    })); // While we treat `none` as an alignment, we shouldn't return it if no
11979    // other alignments exist.
11980  
11981    if (enabledControls.length === 1 && enabledControls[0].name === 'none') {
11982      return [];
11983    }
11984  
11985    return enabledControls;
11986  }
11987  
11988  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-alignment-control/ui.js
11989  
11990  
11991  
11992  /**
11993   * External dependencies
11994   */
11995  
11996  /**
11997   * WordPress dependencies
11998   */
11999  
12000  
12001  
12002  
12003  
12004  /**
12005   * Internal dependencies
12006   */
12007  
12008  
12009  const ui_BLOCK_ALIGNMENTS_CONTROLS = {
12010    none: {
12011      icon: align_none,
12012      title: (0,external_wp_i18n_namespaceObject._x)('None', 'Alignment option')
12013    },
12014    left: {
12015      icon: position_left,
12016      title: (0,external_wp_i18n_namespaceObject.__)('Align left')
12017    },
12018    center: {
12019      icon: position_center,
12020      title: (0,external_wp_i18n_namespaceObject.__)('Align center')
12021    },
12022    right: {
12023      icon: position_right,
12024      title: (0,external_wp_i18n_namespaceObject.__)('Align right')
12025    },
12026    wide: {
12027      icon: stretch_wide,
12028      title: (0,external_wp_i18n_namespaceObject.__)('Wide width')
12029    },
12030    full: {
12031      icon: stretch_full_width,
12032      title: (0,external_wp_i18n_namespaceObject.__)('Full width')
12033    }
12034  };
12035  const ui_DEFAULT_CONTROL = 'none';
12036  const ui_POPOVER_PROPS = {
12037    isAlternate: true
12038  };
12039  
12040  function BlockAlignmentUI(_ref) {
12041    let {
12042      value,
12043      onChange,
12044      controls,
12045      isToolbar,
12046      isCollapsed = true
12047    } = _ref;
12048    const enabledControls = useAvailableAlignments(controls);
12049    const hasEnabledControls = !!enabledControls.length;
12050  
12051    if (!hasEnabledControls) {
12052      return null;
12053    }
12054  
12055    function onChangeAlignment(align) {
12056      onChange([value, 'none'].includes(align) ? undefined : align);
12057    }
12058  
12059    const activeAlignmentControl = ui_BLOCK_ALIGNMENTS_CONTROLS[value];
12060    const defaultAlignmentControl = ui_BLOCK_ALIGNMENTS_CONTROLS[ui_DEFAULT_CONTROL];
12061    const UIComponent = isToolbar ? external_wp_components_namespaceObject.ToolbarGroup : external_wp_components_namespaceObject.ToolbarDropdownMenu;
12062    const commonProps = {
12063      popoverProps: ui_POPOVER_PROPS,
12064      icon: activeAlignmentControl ? activeAlignmentControl.icon : defaultAlignmentControl.icon,
12065      label: (0,external_wp_i18n_namespaceObject.__)('Align'),
12066      toggleProps: {
12067        describedBy: (0,external_wp_i18n_namespaceObject.__)('Change alignment')
12068      }
12069    };
12070    const extraProps = isToolbar || external_wp_element_namespaceObject.Platform.isNative ? {
12071      isCollapsed: isToolbar ? isCollapsed : undefined,
12072      controls: enabledControls.map(_ref2 => {
12073        let {
12074          name: controlName
12075        } = _ref2;
12076        return { ...ui_BLOCK_ALIGNMENTS_CONTROLS[controlName],
12077          isActive: value === controlName || !value && controlName === 'none',
12078          role: isCollapsed ? 'menuitemradio' : undefined,
12079          onClick: () => onChangeAlignment(controlName)
12080        };
12081      })
12082    } : {
12083      children: _ref3 => {
12084        let {
12085          onClose
12086        } = _ref3;
12087        return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuGroup, {
12088          className: "block-editor-block-alignment-control__menu-group"
12089        }, enabledControls.map(_ref4 => {
12090          let {
12091            name: controlName,
12092            info
12093          } = _ref4;
12094          const {
12095            icon,
12096            title
12097          } = ui_BLOCK_ALIGNMENTS_CONTROLS[controlName]; // If no value is provided, mark as selected the `none` option.
12098  
12099          const isSelected = controlName === value || !value && controlName === 'none';
12100          return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
12101            key: controlName,
12102            icon: icon,
12103            iconPosition: "left",
12104            className: classnames_default()('components-dropdown-menu__menu-item', {
12105              'is-active': isSelected
12106            }),
12107            isSelected: isSelected,
12108            onClick: () => {
12109              onChangeAlignment(controlName);
12110              onClose();
12111            },
12112            role: "menuitemradio",
12113            info: info
12114          }, title);
12115        })));
12116      }
12117    };
12118    return (0,external_wp_element_namespaceObject.createElement)(UIComponent, _extends({}, commonProps, extraProps));
12119  }
12120  
12121  /* harmony default export */ var block_alignment_control_ui = (BlockAlignmentUI);
12122  
12123  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-alignment-control/index.js
12124  
12125  
12126  
12127  /**
12128   * Internal dependencies
12129   */
12130  
12131  
12132  const BlockAlignmentControl = props => {
12133    return (0,external_wp_element_namespaceObject.createElement)(block_alignment_control_ui, _extends({}, props, {
12134      isToolbar: false
12135    }));
12136  };
12137  
12138  const BlockAlignmentToolbar = props => {
12139    return (0,external_wp_element_namespaceObject.createElement)(block_alignment_control_ui, _extends({}, props, {
12140      isToolbar: true
12141    }));
12142  };
12143  /**
12144   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/block-alignment-control/README.md
12145   */
12146  
12147  
12148  
12149  
12150  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/align.js
12151  
12152  
12153  
12154  /**
12155   * External dependencies
12156   */
12157  
12158  
12159  /**
12160   * WordPress dependencies
12161   */
12162  
12163  
12164  
12165  
12166  /**
12167   * Internal dependencies
12168   */
12169  
12170  
12171  
12172  /**
12173   * An array which includes all possible valid alignments,
12174   * used to validate if an alignment is valid or not.
12175   *
12176   * @constant
12177   * @type {string[]}
12178   */
12179  
12180  const ALL_ALIGNMENTS = ['left', 'center', 'right', 'wide', 'full'];
12181  /**
12182   * An array which includes all wide alignments.
12183   * In order for this alignments to be valid they need to be supported by the block,
12184   * and by the theme.
12185   *
12186   * @constant
12187   * @type {string[]}
12188   */
12189  
12190  const WIDE_ALIGNMENTS = ['wide', 'full'];
12191  /**
12192   * Returns the valid alignments.
12193   * Takes into consideration the aligns supported by a block, if the block supports wide controls or not and if theme supports wide controls or not.
12194   * Exported just for testing purposes, not exported outside the module.
12195   *
12196   * @param {?boolean|string[]} blockAlign          Aligns supported by the block.
12197   * @param {?boolean}          hasWideBlockSupport True if block supports wide alignments. And False otherwise.
12198   * @param {?boolean}          hasWideEnabled      True if theme supports wide alignments. And False otherwise.
12199   *
12200   * @return {string[]} Valid alignments.
12201   */
12202  
12203  function getValidAlignments(blockAlign) {
12204    let hasWideBlockSupport = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
12205    let hasWideEnabled = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
12206    let validAlignments;
12207  
12208    if (Array.isArray(blockAlign)) {
12209      validAlignments = ALL_ALIGNMENTS.filter(value => blockAlign.includes(value));
12210    } else if (blockAlign === true) {
12211      // `true` includes all alignments...
12212      validAlignments = [...ALL_ALIGNMENTS];
12213    } else {
12214      validAlignments = [];
12215    }
12216  
12217    if (!hasWideEnabled || blockAlign === true && !hasWideBlockSupport) {
12218      return (0,external_lodash_namespaceObject.without)(validAlignments, ...WIDE_ALIGNMENTS);
12219    }
12220  
12221    return validAlignments;
12222  }
12223  /**
12224   * Filters registered block settings, extending attributes to include `align`.
12225   *
12226   * @param {Object} settings Original block settings.
12227   *
12228   * @return {Object} Filtered block settings.
12229   */
12230  
12231  function addAttribute(settings) {
12232    // Allow blocks to specify their own attribute definition with default values if needed.
12233    if ((0,external_lodash_namespaceObject.has)(settings.attributes, ['align', 'type'])) {
12234      return settings;
12235    }
12236  
12237    if ((0,external_wp_blocks_namespaceObject.hasBlockSupport)(settings, 'align')) {
12238      // Gracefully handle if settings.attributes is undefined.
12239      settings.attributes = { ...settings.attributes,
12240        align: {
12241          type: 'string',
12242          // Allow for '' since it is used by updateAlignment function
12243          // in withToolbarControls for special cases with defined default values.
12244          enum: [...ALL_ALIGNMENTS, '']
12245        }
12246      };
12247    }
12248  
12249    return settings;
12250  }
12251  /**
12252   * Override the default edit UI to include new toolbar controls for block
12253   * alignment, if block defines support.
12254   *
12255   * @param {Function} BlockEdit Original component.
12256   *
12257   * @return {Function} Wrapped component.
12258   */
12259  
12260  const withToolbarControls = (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(BlockEdit => props => {
12261    const {
12262      name: blockName
12263    } = props; // Compute the block valid alignments by taking into account,
12264    // if the theme supports wide alignments or not and the layout's
12265    // availble alignments. We do that for conditionally rendering
12266    // Slot.
12267  
12268    const blockAllowedAlignments = getValidAlignments((0,external_wp_blocks_namespaceObject.getBlockSupport)(blockName, 'align'), (0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockName, 'alignWide', true));
12269    const validAlignments = useAvailableAlignments(blockAllowedAlignments).map(_ref => {
12270      let {
12271        name
12272      } = _ref;
12273      return name;
12274    });
12275  
12276    const updateAlignment = nextAlign => {
12277      if (!nextAlign) {
12278        var _blockType$attributes, _blockType$attributes2;
12279  
12280        const blockType = (0,external_wp_blocks_namespaceObject.getBlockType)(props.name);
12281        const blockDefaultAlign = blockType === null || blockType === void 0 ? void 0 : (_blockType$attributes = blockType.attributes) === null || _blockType$attributes === void 0 ? void 0 : (_blockType$attributes2 = _blockType$attributes.align) === null || _blockType$attributes2 === void 0 ? void 0 : _blockType$attributes2.default;
12282  
12283        if (blockDefaultAlign) {
12284          nextAlign = '';
12285        }
12286      }
12287  
12288      props.setAttributes({
12289        align: nextAlign
12290      });
12291    };
12292  
12293    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, !!validAlignments.length && (0,external_wp_element_namespaceObject.createElement)(block_controls, {
12294      group: "block",
12295      __experimentalShareWithChildBlocks: true
12296    }, (0,external_wp_element_namespaceObject.createElement)(BlockAlignmentControl, {
12297      value: props.attributes.align,
12298      onChange: updateAlignment,
12299      controls: validAlignments
12300    })), (0,external_wp_element_namespaceObject.createElement)(BlockEdit, props));
12301  }, 'withToolbarControls');
12302  /**
12303   * Override the default block element to add alignment wrapper props.
12304   *
12305   * @param {Function} BlockListBlock Original component.
12306   *
12307   * @return {Function} Wrapped component.
12308   */
12309  
12310  const withDataAlign = (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(BlockListBlock => props => {
12311    const {
12312      name,
12313      attributes
12314    } = props;
12315    const {
12316      align
12317    } = attributes;
12318    const blockAllowedAlignments = getValidAlignments((0,external_wp_blocks_namespaceObject.getBlockSupport)(name, 'align'), (0,external_wp_blocks_namespaceObject.hasBlockSupport)(name, 'alignWide', true));
12319    const validAlignments = useAvailableAlignments(blockAllowedAlignments); // If an alignment is not assigned, there's no need to go through the
12320    // effort to validate or assign its value.
12321  
12322    if (align === undefined) {
12323      return (0,external_wp_element_namespaceObject.createElement)(BlockListBlock, props);
12324    }
12325  
12326    let wrapperProps = props.wrapperProps;
12327  
12328    if (validAlignments.some(alignment => alignment.name === align)) {
12329      wrapperProps = { ...wrapperProps,
12330        'data-align': align
12331      };
12332    }
12333  
12334    return (0,external_wp_element_namespaceObject.createElement)(BlockListBlock, _extends({}, props, {
12335      wrapperProps: wrapperProps
12336    }));
12337  });
12338  /**
12339   * Override props assigned to save component to inject alignment class name if
12340   * block supports it.
12341   *
12342   * @param {Object} props      Additional props applied to save element.
12343   * @param {Object} blockType  Block type.
12344   * @param {Object} attributes Block attributes.
12345   *
12346   * @return {Object} Filtered props applied to save element.
12347   */
12348  
12349  function addAssignedAlign(props, blockType, attributes) {
12350    const {
12351      align
12352    } = attributes;
12353    const blockAlign = (0,external_wp_blocks_namespaceObject.getBlockSupport)(blockType, 'align');
12354    const hasWideBlockSupport = (0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockType, 'alignWide', true); // Compute valid alignments without taking into account if
12355    // the theme supports wide alignments or not.
12356    // This way changing themes does not impact the block save.
12357  
12358    const isAlignValid = getValidAlignments(blockAlign, hasWideBlockSupport).includes(align);
12359  
12360    if (isAlignValid) {
12361      props.className = classnames_default()(`align$align}`, props.className);
12362    }
12363  
12364    return props;
12365  }
12366  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.registerBlockType', 'core/align/addAttribute', addAttribute);
12367  (0,external_wp_hooks_namespaceObject.addFilter)('editor.BlockListBlock', 'core/editor/align/with-data-align', withDataAlign);
12368  (0,external_wp_hooks_namespaceObject.addFilter)('editor.BlockEdit', 'core/editor/align/with-toolbar-controls', withToolbarControls);
12369  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.getSaveContent.extraProps', 'core/align/addAssignedAlign', addAssignedAlign);
12370  
12371  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/lock.js
12372  /**
12373   * External dependencies
12374   */
12375  
12376  /**
12377   * WordPress dependencies
12378   */
12379  
12380  
12381  /**
12382   * Filters registered block settings, extending attributes to include `lock`.
12383   *
12384   * @param {Object} settings Original block settings.
12385   *
12386   * @return {Object} Filtered block settings.
12387   */
12388  
12389  function lock_addAttribute(settings) {
12390    // Allow blocks to specify their own attribute definition with default values if needed.
12391    if ((0,external_lodash_namespaceObject.has)(settings.attributes, ['lock', 'type'])) {
12392      return settings;
12393    } // Gracefully handle if settings.attributes is undefined.
12394  
12395  
12396    settings.attributes = { ...settings.attributes,
12397      lock: {
12398        type: 'object'
12399      }
12400    };
12401    return settings;
12402  }
12403  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.registerBlockType', 'core/lock/addAttribute', lock_addAttribute);
12404  
12405  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/anchor.js
12406  
12407  
12408  /**
12409   * External dependencies
12410   */
12411  
12412  /**
12413   * WordPress dependencies
12414   */
12415  
12416  
12417  
12418  
12419  
12420  
12421  
12422  /**
12423   * Internal dependencies
12424   */
12425  
12426  
12427  /**
12428   * Regular expression matching invalid anchor characters for replacement.
12429   *
12430   * @type {RegExp}
12431   */
12432  
12433  const ANCHOR_REGEX = /[\s#]/g;
12434  const ANCHOR_SCHEMA = {
12435    type: 'string',
12436    source: 'attribute',
12437    attribute: 'id',
12438    selector: '*'
12439  };
12440  /**
12441   * Filters registered block settings, extending attributes with anchor using ID
12442   * of the first node.
12443   *
12444   * @param {Object} settings Original block settings.
12445   *
12446   * @return {Object} Filtered block settings.
12447   */
12448  
12449  function anchor_addAttribute(settings) {
12450    // Allow blocks to specify their own attribute definition with default values if needed.
12451    if ((0,external_lodash_namespaceObject.has)(settings.attributes, ['anchor', 'type'])) {
12452      return settings;
12453    }
12454  
12455    if ((0,external_wp_blocks_namespaceObject.hasBlockSupport)(settings, 'anchor')) {
12456      // Gracefully handle if settings.attributes is undefined.
12457      settings.attributes = { ...settings.attributes,
12458        anchor: ANCHOR_SCHEMA
12459      };
12460    }
12461  
12462    return settings;
12463  }
12464  /**
12465   * Override the default edit UI to include a new block inspector control for
12466   * assigning the anchor ID, if block supports anchor.
12467   *
12468   * @param {WPComponent} BlockEdit Original component.
12469   *
12470   * @return {WPComponent} Wrapped component.
12471   */
12472  
12473  const withInspectorControl = (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(BlockEdit => {
12474    return props => {
12475      const hasAnchor = (0,external_wp_blocks_namespaceObject.hasBlockSupport)(props.name, 'anchor');
12476  
12477      if (hasAnchor && props.isSelected) {
12478        const isWeb = external_wp_element_namespaceObject.Platform.OS === 'web';
12479        const textControl = (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.TextControl, {
12480          className: "html-anchor-control",
12481          label: (0,external_wp_i18n_namespaceObject.__)('HTML anchor'),
12482          help: (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_i18n_namespaceObject.__)('Enter a word or two — without spaces — to make a unique web address just for this block, called an “anchor.” Then, you’ll be able to link directly to this section of your page.'), isWeb && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ExternalLink, {
12483            href: (0,external_wp_i18n_namespaceObject.__)('https://wordpress.org/support/article/page-jumps/')
12484          }, (0,external_wp_i18n_namespaceObject.__)('Learn more about anchors'))),
12485          value: props.attributes.anchor || '',
12486          placeholder: !isWeb ? (0,external_wp_i18n_namespaceObject.__)('Add an anchor') : null,
12487          onChange: nextValue => {
12488            nextValue = nextValue.replace(ANCHOR_REGEX, '-');
12489            props.setAttributes({
12490              anchor: nextValue
12491            });
12492          },
12493          autoCapitalize: "none",
12494          autoComplete: "off"
12495        });
12496        return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(BlockEdit, props), isWeb && (0,external_wp_element_namespaceObject.createElement)(inspector_controls, {
12497          __experimentalGroup: "advanced"
12498        }, textControl), !isWeb && props.name === 'core/heading' && (0,external_wp_element_namespaceObject.createElement)(inspector_controls, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.PanelBody, {
12499          title: (0,external_wp_i18n_namespaceObject.__)('Heading settings')
12500        }, textControl)));
12501      }
12502  
12503      return (0,external_wp_element_namespaceObject.createElement)(BlockEdit, props);
12504    };
12505  }, 'withInspectorControl');
12506  /**
12507   * Override props assigned to save component to inject anchor ID, if block
12508   * supports anchor. This is only applied if the block's save result is an
12509   * element and not a markup string.
12510   *
12511   * @param {Object} extraProps Additional props applied to save element.
12512   * @param {Object} blockType  Block type.
12513   * @param {Object} attributes Current block attributes.
12514   *
12515   * @return {Object} Filtered props applied to save element.
12516   */
12517  
12518  function addSaveProps(extraProps, blockType, attributes) {
12519    if ((0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockType, 'anchor')) {
12520      extraProps.id = attributes.anchor === '' ? null : attributes.anchor;
12521    }
12522  
12523    return extraProps;
12524  }
12525  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.registerBlockType', 'core/anchor/attribute', anchor_addAttribute);
12526  (0,external_wp_hooks_namespaceObject.addFilter)('editor.BlockEdit', 'core/editor/anchor/with-inspector-control', withInspectorControl);
12527  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.getSaveContent.extraProps', 'core/anchor/save-props', addSaveProps);
12528  
12529  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/custom-class-name.js
12530  
12531  
12532  /**
12533   * External dependencies
12534   */
12535  
12536  /**
12537   * WordPress dependencies
12538   */
12539  
12540  
12541  
12542  
12543  
12544  
12545  /**
12546   * Internal dependencies
12547   */
12548  
12549  
12550  /**
12551   * Filters registered block settings, extending attributes with anchor using ID
12552   * of the first node.
12553   *
12554   * @param {Object} settings Original block settings.
12555   *
12556   * @return {Object} Filtered block settings.
12557   */
12558  
12559  function custom_class_name_addAttribute(settings) {
12560    if ((0,external_wp_blocks_namespaceObject.hasBlockSupport)(settings, 'customClassName', true)) {
12561      // Gracefully handle if settings.attributes is undefined.
12562      settings.attributes = { ...settings.attributes,
12563        className: {
12564          type: 'string'
12565        }
12566      };
12567    }
12568  
12569    return settings;
12570  }
12571  /**
12572   * Override the default edit UI to include a new block inspector control for
12573   * assigning the custom class name, if block supports custom class name.
12574   *
12575   * @param {WPComponent} BlockEdit Original component.
12576   *
12577   * @return {WPComponent} Wrapped component.
12578   */
12579  
12580  const custom_class_name_withInspectorControl = (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(BlockEdit => {
12581    return props => {
12582      const hasCustomClassName = (0,external_wp_blocks_namespaceObject.hasBlockSupport)(props.name, 'customClassName', true);
12583  
12584      if (hasCustomClassName && props.isSelected) {
12585        return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(BlockEdit, props), (0,external_wp_element_namespaceObject.createElement)(inspector_controls, {
12586          __experimentalGroup: "advanced"
12587        }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.TextControl, {
12588          autoComplete: "off",
12589          label: (0,external_wp_i18n_namespaceObject.__)('Additional CSS class(es)'),
12590          value: props.attributes.className || '',
12591          onChange: nextValue => {
12592            props.setAttributes({
12593              className: nextValue !== '' ? nextValue : undefined
12594            });
12595          },
12596          help: (0,external_wp_i18n_namespaceObject.__)('Separate multiple classes with spaces.')
12597        })));
12598      }
12599  
12600      return (0,external_wp_element_namespaceObject.createElement)(BlockEdit, props);
12601    };
12602  }, 'withInspectorControl');
12603  /**
12604   * Override props assigned to save component to inject anchor ID, if block
12605   * supports anchor. This is only applied if the block's save result is an
12606   * element and not a markup string.
12607   *
12608   * @param {Object} extraProps Additional props applied to save element.
12609   * @param {Object} blockType  Block type.
12610   * @param {Object} attributes Current block attributes.
12611   *
12612   * @return {Object} Filtered props applied to save element.
12613   */
12614  
12615  function custom_class_name_addSaveProps(extraProps, blockType, attributes) {
12616    if ((0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockType, 'customClassName', true) && attributes.className) {
12617      extraProps.className = classnames_default()(extraProps.className, attributes.className);
12618    }
12619  
12620    return extraProps;
12621  }
12622  function addTransforms(result, source, index, results) {
12623    if (!(0,external_wp_blocks_namespaceObject.hasBlockSupport)(result.name, 'customClassName', true)) {
12624      return result;
12625    } // If the condition verifies we are probably in the presence of a wrapping transform
12626    // e.g: nesting paragraphs in a group or columns and in that case the class should not be kept.
12627  
12628  
12629    if (results.length === 1 && result.innerBlocks.length === source.length) {
12630      return result;
12631    } // If we are transforming one block to multiple blocks or multiple blocks to one block,
12632    // we ignore the class during the transform.
12633  
12634  
12635    if (results.length === 1 && source.length > 1 || results.length > 1 && source.length === 1) {
12636      return result;
12637    } // If we are in presence of transform between one or more block in the source
12638    // that have one or more blocks in the result
12639    // we apply the class on source N to the result N,
12640    // if source N does not exists we do nothing.
12641  
12642  
12643    if (source[index]) {
12644      var _source$index;
12645  
12646      const originClassName = (_source$index = source[index]) === null || _source$index === void 0 ? void 0 : _source$index.attributes.className;
12647  
12648      if (originClassName) {
12649        return { ...result,
12650          attributes: { ...result.attributes,
12651            className: originClassName
12652          }
12653        };
12654      }
12655    }
12656  
12657    return result;
12658  }
12659  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.registerBlockType', 'core/custom-class-name/attribute', custom_class_name_addAttribute);
12660  (0,external_wp_hooks_namespaceObject.addFilter)('editor.BlockEdit', 'core/editor/custom-class-name/with-inspector-control', custom_class_name_withInspectorControl);
12661  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.getSaveContent.extraProps', 'core/custom-class-name/save-props', custom_class_name_addSaveProps);
12662  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.switchToBlockType.transformedBlock', 'core/color/addTransforms', addTransforms);
12663  
12664  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/generated-class-name.js
12665  /**
12666   * External dependencies
12667   */
12668  
12669  /**
12670   * WordPress dependencies
12671   */
12672  
12673  
12674  
12675  /**
12676   * Override props assigned to save component to inject generated className if
12677   * block supports it. This is only applied if the block's save result is an
12678   * element and not a markup string.
12679   *
12680   * @param {Object} extraProps Additional props applied to save element.
12681   * @param {Object} blockType  Block type.
12682   *
12683   * @return {Object} Filtered props applied to save element.
12684   */
12685  
12686  function addGeneratedClassName(extraProps, blockType) {
12687    // Adding the generated className.
12688    if ((0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockType, 'className', true)) {
12689      if (typeof extraProps.className === 'string') {
12690        // We have some extra classes and want to add the default classname
12691        // We use uniq to prevent duplicate classnames.
12692        extraProps.className = (0,external_lodash_namespaceObject.uniq)([(0,external_wp_blocks_namespaceObject.getBlockDefaultClassName)(blockType.name), ...extraProps.className.split(' ')]).join(' ').trim();
12693      } else {
12694        // There is no string in the className variable,
12695        // so we just dump the default name in there.
12696        extraProps.className = (0,external_wp_blocks_namespaceObject.getBlockDefaultClassName)(blockType.name);
12697      }
12698    }
12699  
12700    return extraProps;
12701  }
12702  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.getSaveContent.extraProps', 'core/generated-class-name/save-props', addGeneratedClassName);
12703  
12704  ;// CONCATENATED MODULE: ./node_modules/@wordpress/style-engine/build-module/styles/utils.js
12705  /**
12706   * External dependencies
12707   */
12708  
12709  /**
12710   * Internal dependencies
12711   */
12712  
12713  function generateBoxRules(style, options, path, ruleKey) {
12714    const boxStyle = (0,external_lodash_namespaceObject.get)(style, path);
12715  
12716    if (!boxStyle) {
12717      return [];
12718    }
12719  
12720    const rules = [];
12721  
12722    if (typeof boxStyle === 'string') {
12723      rules.push({
12724        selector: options.selector,
12725        key: ruleKey,
12726        value: boxStyle
12727      });
12728    } else {
12729      const sideRules = ['top', 'right', 'bottom', 'left'].reduce((acc, side) => {
12730        const value = (0,external_lodash_namespaceObject.get)(boxStyle, [side]);
12731  
12732        if (value) {
12733          acc.push({
12734            selector: options.selector,
12735            key: `$ruleKey}${(0,external_lodash_namespaceObject.upperFirst)(side)}`,
12736            value
12737          });
12738        }
12739  
12740        return acc;
12741      }, []);
12742      rules.push(...sideRules);
12743    }
12744  
12745    return rules;
12746  }
12747  
12748  ;// CONCATENATED MODULE: ./node_modules/@wordpress/style-engine/build-module/styles/padding.js
12749  /**
12750   * Internal dependencies
12751   */
12752  
12753  const padding = {
12754    name: 'padding',
12755    generate: (style, options) => {
12756      return generateBoxRules(style, options, ['spacing', 'padding'], 'padding');
12757    }
12758  };
12759  /* harmony default export */ var styles_padding = (padding);
12760  
12761  ;// CONCATENATED MODULE: ./node_modules/@wordpress/style-engine/build-module/styles/margin.js
12762  /**
12763   * Internal dependencies
12764   */
12765  
12766  const margin = {
12767    name: 'margin',
12768    generate: (style, options) => {
12769      return generateBoxRules(style, options, ['spacing', 'margin'], 'margin');
12770    }
12771  };
12772  /* harmony default export */ var styles_margin = (margin);
12773  
12774  ;// CONCATENATED MODULE: ./node_modules/@wordpress/style-engine/build-module/styles/index.js
12775  /**
12776   * Internal dependencies
12777   */
12778  
12779  
12780  const styleDefinitions = [styles_margin, styles_padding];
12781  
12782  ;// CONCATENATED MODULE: ./node_modules/@wordpress/style-engine/build-module/index.js
12783  /**
12784   * External dependencies
12785   */
12786  
12787  /**
12788   * Internal dependencies
12789   */
12790  
12791  
12792  /**
12793   * Generates a stylesheet for a given style object and selector.
12794   *
12795   * @param  style   Style object.
12796   * @param  options Options object with settings to adjust how the styles are generated.
12797   *
12798   * @return generated stylesheet.
12799   */
12800  
12801  function generate(style, options) {
12802    const rules = getCSSRules(style, options);
12803    const groupedRules = groupBy(rules, 'selector');
12804    const selectorRules = Object.keys(groupedRules).reduce((acc, subSelector) => {
12805      acc.push(`$subSelector} { $groupedRules[subSelector].map(rule => `$kebabCase(rule.key)}: $rule.value};`).join(' ')} }`);
12806      return acc;
12807    }, []);
12808    return selectorRules.join('\n');
12809  }
12810  /**
12811   * Returns a JSON representation of the generated CSS rules.
12812   *
12813   * @param  style   Style object.
12814   * @param  options Options object with settings to adjust how the styles are generated.
12815   *
12816   * @return generated styles.
12817   */
12818  
12819  function getCSSRules(style, options) {
12820    const rules = [];
12821    styleDefinitions.forEach(definition => {
12822      rules.push(...definition.generate(style, options));
12823    });
12824    return rules;
12825  }
12826  
12827  ;// CONCATENATED MODULE: external ["wp","dom"]
12828  var external_wp_dom_namespaceObject = window["wp"]["dom"];
12829  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-context/index.js
12830  
12831  
12832  /**
12833   * WordPress dependencies
12834   */
12835  
12836  /** @typedef {import('react').ReactNode} ReactNode */
12837  
12838  /**
12839   * @typedef BlockContextProviderProps
12840   *
12841   * @property {Record<string,*>} value    Context value to merge with current
12842   *                                       value.
12843   * @property {ReactNode}        children Component children.
12844   */
12845  
12846  /** @type {import('react').Context<Record<string,*>>} */
12847  
12848  const block_context_Context = (0,external_wp_element_namespaceObject.createContext)({});
12849  /**
12850   * Component which merges passed value with current consumed block context.
12851   *
12852   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/block-context/README.md
12853   *
12854   * @param {BlockContextProviderProps} props
12855   */
12856  
12857  function BlockContextProvider(_ref) {
12858    let {
12859      value,
12860      children
12861    } = _ref;
12862    const context = (0,external_wp_element_namespaceObject.useContext)(block_context_Context);
12863    const nextValue = (0,external_wp_element_namespaceObject.useMemo)(() => ({ ...context,
12864      ...value
12865    }), [context, value]);
12866    return (0,external_wp_element_namespaceObject.createElement)(block_context_Context.Provider, {
12867      value: nextValue,
12868      children: children
12869    });
12870  }
12871  /* harmony default export */ var block_context = (block_context_Context);
12872  
12873  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-edit/edit.js
12874  
12875  
12876  
12877  /**
12878   * External dependencies
12879   */
12880  
12881  
12882  /**
12883   * WordPress dependencies
12884   */
12885  
12886  
12887  
12888  
12889  /**
12890   * Internal dependencies
12891   */
12892  
12893  
12894  /**
12895   * Default value used for blocks which do not define their own context needs,
12896   * used to guarantee that a block's `context` prop will always be an object. It
12897   * is assigned as a constant since it is always expected to be an empty object,
12898   * and in order to avoid unnecessary React reconciliations of a changing object.
12899   *
12900   * @type {{}}
12901   */
12902  
12903  const DEFAULT_BLOCK_CONTEXT = {};
12904  const Edit = props => {
12905    const {
12906      attributes = {},
12907      name
12908    } = props;
12909    const blockType = (0,external_wp_blocks_namespaceObject.getBlockType)(name);
12910    const blockContext = (0,external_wp_element_namespaceObject.useContext)(block_context); // Assign context values using the block type's declared context needs.
12911  
12912    const context = (0,external_wp_element_namespaceObject.useMemo)(() => {
12913      return blockType && blockType.usesContext ? (0,external_lodash_namespaceObject.pick)(blockContext, blockType.usesContext) : DEFAULT_BLOCK_CONTEXT;
12914    }, [blockType, blockContext]);
12915  
12916    if (!blockType) {
12917      return null;
12918    } // `edit` and `save` are functions or components describing the markup
12919    // with which a block is displayed. If `blockType` is valid, assign
12920    // them preferentially as the render value for the block.
12921  
12922  
12923    const Component = blockType.edit || blockType.save;
12924  
12925    if (blockType.apiVersion > 1) {
12926      return (0,external_wp_element_namespaceObject.createElement)(Component, _extends({}, props, {
12927        context: context
12928      }));
12929    } // Generate a class name for the block's editable form.
12930  
12931  
12932    const generatedClassName = (0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockType, 'className', true) ? (0,external_wp_blocks_namespaceObject.getBlockDefaultClassName)(name) : null;
12933    const className = classnames_default()(generatedClassName, attributes.className);
12934    return (0,external_wp_element_namespaceObject.createElement)(Component, _extends({}, props, {
12935      context: context,
12936      className: className
12937    }));
12938  };
12939  /* harmony default export */ var edit = ((0,external_wp_components_namespaceObject.withFilters)('editor.BlockEdit')(Edit));
12940  
12941  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-edit/index.js
12942  
12943  
12944  /**
12945   * WordPress dependencies
12946   */
12947  
12948  /**
12949   * Internal dependencies
12950   */
12951  
12952  
12953  
12954  /**
12955   * The `useBlockEditContext` hook provides information about the block this hook is being used in.
12956   * It returns an object with the `name`, `isSelected` state, and the `clientId` of the block.
12957   * It is useful if you want to create custom hooks that need access to the current blocks clientId
12958   * but don't want to rely on the data getting passed in as a parameter.
12959   *
12960   * @return {Object} Block edit context
12961   */
12962  
12963  
12964  function BlockEdit(props) {
12965    const {
12966      name,
12967      isSelected,
12968      clientId
12969    } = props;
12970    const context = {
12971      name,
12972      isSelected,
12973      clientId
12974    };
12975    return (0,external_wp_element_namespaceObject.createElement)(Provider // It is important to return the same object if props haven't
12976    // changed to avoid  unnecessary rerenders.
12977    // See https://reactjs.org/docs/context.html#caveats.
12978    , {
12979      value: (0,external_wp_element_namespaceObject.useMemo)(() => context, Object.values(context))
12980    }, (0,external_wp_element_namespaceObject.createElement)(edit, props));
12981  }
12982  
12983  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/more-horizontal.js
12984  
12985  
12986  /**
12987   * WordPress dependencies
12988   */
12989  
12990  const moreHorizontal = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
12991    xmlns: "http://www.w3.org/2000/svg",
12992    viewBox: "0 0 24 24"
12993  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
12994    d: "M11 13h2v-2h-2v2zm-6 0h2v-2H5v2zm12-2v2h2v-2h-2z"
12995  }));
12996  /* harmony default export */ var more_horizontal = (moreHorizontal);
12997  
12998  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/warning/index.js
12999  
13000  
13001  /**
13002   * External dependencies
13003   */
13004  
13005  /**
13006   * WordPress dependencies
13007   */
13008  
13009  
13010  
13011  
13012  
13013  
13014  function Warning(_ref) {
13015    let {
13016      className,
13017      actions,
13018      children,
13019      secondaryActions
13020    } = _ref;
13021    return (0,external_wp_element_namespaceObject.createElement)("div", {
13022      className: classnames_default()(className, 'block-editor-warning')
13023    }, (0,external_wp_element_namespaceObject.createElement)("div", {
13024      className: "block-editor-warning__contents"
13025    }, (0,external_wp_element_namespaceObject.createElement)("p", {
13026      className: "block-editor-warning__message"
13027    }, children), (external_wp_element_namespaceObject.Children.count(actions) > 0 || secondaryActions) && (0,external_wp_element_namespaceObject.createElement)("div", {
13028      className: "block-editor-warning__actions"
13029    }, external_wp_element_namespaceObject.Children.count(actions) > 0 && external_wp_element_namespaceObject.Children.map(actions, (action, i) => (0,external_wp_element_namespaceObject.createElement)("span", {
13030      key: i,
13031      className: "block-editor-warning__action"
13032    }, action)), secondaryActions && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.DropdownMenu, {
13033      className: "block-editor-warning__secondary",
13034      icon: more_horizontal,
13035      label: (0,external_wp_i18n_namespaceObject.__)('More options'),
13036      popoverProps: {
13037        position: 'bottom left',
13038        className: 'block-editor-warning__dropdown'
13039      },
13040      noIcons: true
13041    }, () => (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuGroup, null, secondaryActions.map((item, pos) => (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
13042      onClick: item.onClick,
13043      key: pos
13044    }, item.title)))))));
13045  }
13046  /**
13047   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/warning/README.md
13048   */
13049  
13050  
13051  /* harmony default export */ var warning = (Warning);
13052  
13053  // EXTERNAL MODULE: ./node_modules/diff/lib/diff/character.js
13054  var character = __webpack_require__(1973);
13055  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-compare/block-view.js
13056  
13057  
13058  /**
13059   * WordPress dependencies
13060   */
13061  
13062  
13063  
13064  function BlockView(_ref) {
13065    let {
13066      title,
13067      rawContent,
13068      renderedContent,
13069      action,
13070      actionText,
13071      className
13072    } = _ref;
13073    return (0,external_wp_element_namespaceObject.createElement)("div", {
13074      className: className
13075    }, (0,external_wp_element_namespaceObject.createElement)("div", {
13076      className: "block-editor-block-compare__content"
13077    }, (0,external_wp_element_namespaceObject.createElement)("h2", {
13078      className: "block-editor-block-compare__heading"
13079    }, title), (0,external_wp_element_namespaceObject.createElement)("div", {
13080      className: "block-editor-block-compare__html"
13081    }, rawContent), (0,external_wp_element_namespaceObject.createElement)("div", {
13082      className: "block-editor-block-compare__preview edit-post-visual-editor"
13083    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.RawHTML, null, (0,external_wp_dom_namespaceObject.safeHTML)(renderedContent)))), (0,external_wp_element_namespaceObject.createElement)("div", {
13084      className: "block-editor-block-compare__action"
13085    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
13086      variant: "secondary",
13087      tabIndex: "0",
13088      onClick: action
13089    }, actionText)));
13090  }
13091  
13092  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-compare/index.js
13093  
13094  
13095  /**
13096   * External dependencies
13097   */
13098  
13099   // diff doesn't tree-shake correctly, so we import from the individual
13100  // module here, to avoid including too much of the library
13101  
13102  
13103  /**
13104   * WordPress dependencies
13105   */
13106  
13107  
13108  
13109  /**
13110   * Internal dependencies
13111   */
13112  
13113  
13114  
13115  function BlockCompare(_ref) {
13116    let {
13117      block,
13118      onKeep,
13119      onConvert,
13120      convertor,
13121      convertButtonText
13122    } = _ref;
13123  
13124    function getDifference(originalContent, newContent) {
13125      const difference = (0,character/* diffChars */.Kx)(originalContent, newContent);
13126      return difference.map((item, pos) => {
13127        const classes = classnames_default()({
13128          'block-editor-block-compare__added': item.added,
13129          'block-editor-block-compare__removed': item.removed
13130        });
13131        return (0,external_wp_element_namespaceObject.createElement)("span", {
13132          key: pos,
13133          className: classes
13134        }, item.value);
13135      });
13136    }
13137  
13138    function getConvertedContent(convertedBlock) {
13139      // The convertor may return an array of items or a single item.
13140      const newBlocks = (0,external_lodash_namespaceObject.castArray)(convertedBlock); // Get converted block details.
13141  
13142      const newContent = newBlocks.map(item => (0,external_wp_blocks_namespaceObject.getSaveContent)(item.name, item.attributes, item.innerBlocks));
13143      return newContent.join('');
13144    }
13145  
13146    const converted = getConvertedContent(convertor(block));
13147    const difference = getDifference(block.originalContent, converted);
13148    return (0,external_wp_element_namespaceObject.createElement)("div", {
13149      className: "block-editor-block-compare__wrapper"
13150    }, (0,external_wp_element_namespaceObject.createElement)(BlockView, {
13151      title: (0,external_wp_i18n_namespaceObject.__)('Current'),
13152      className: "block-editor-block-compare__current",
13153      action: onKeep,
13154      actionText: (0,external_wp_i18n_namespaceObject.__)('Convert to HTML'),
13155      rawContent: block.originalContent,
13156      renderedContent: block.originalContent
13157    }), (0,external_wp_element_namespaceObject.createElement)(BlockView, {
13158      title: (0,external_wp_i18n_namespaceObject.__)('After Conversion'),
13159      className: "block-editor-block-compare__converted",
13160      action: onConvert,
13161      actionText: convertButtonText,
13162      rawContent: difference,
13163      renderedContent: converted
13164    }));
13165  }
13166  
13167  /* harmony default export */ var block_compare = (BlockCompare);
13168  
13169  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-list/block-invalid-warning.js
13170  
13171  
13172  /**
13173   * WordPress dependencies
13174   */
13175  
13176  
13177  
13178  
13179  
13180  
13181  /**
13182   * Internal dependencies
13183   */
13184  
13185  
13186  
13187  
13188  function BlockInvalidWarning(_ref) {
13189    let {
13190      convertToHTML,
13191      convertToBlocks,
13192      convertToClassic,
13193      attemptBlockRecovery,
13194      block
13195    } = _ref;
13196    const hasHTMLBlock = !!(0,external_wp_blocks_namespaceObject.getBlockType)('core/html');
13197    const [compare, setCompare] = (0,external_wp_element_namespaceObject.useState)(false);
13198    const onCompare = (0,external_wp_element_namespaceObject.useCallback)(() => setCompare(true), []);
13199    const onCompareClose = (0,external_wp_element_namespaceObject.useCallback)(() => setCompare(false), []); // We memo the array here to prevent the children components from being updated unexpectedly.
13200  
13201    const hiddenActions = (0,external_wp_element_namespaceObject.useMemo)(() => [{
13202      // translators: Button to fix block content
13203      title: (0,external_wp_i18n_namespaceObject._x)('Resolve', 'imperative verb'),
13204      onClick: onCompare
13205    }, hasHTMLBlock && {
13206      title: (0,external_wp_i18n_namespaceObject.__)('Convert to HTML'),
13207      onClick: convertToHTML
13208    }, {
13209      title: (0,external_wp_i18n_namespaceObject.__)('Convert to Classic Block'),
13210      onClick: convertToClassic
13211    }].filter(Boolean), [onCompare, convertToHTML, convertToClassic]);
13212    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(warning, {
13213      actions: [(0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
13214        key: "recover",
13215        onClick: attemptBlockRecovery,
13216        variant: "primary"
13217      }, (0,external_wp_i18n_namespaceObject.__)('Attempt Block Recovery'))],
13218      secondaryActions: hiddenActions
13219    }, (0,external_wp_i18n_namespaceObject.__)('This block contains unexpected or invalid content.')), compare && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Modal, {
13220      title: // translators: Dialog title to fix block content
13221      (0,external_wp_i18n_namespaceObject.__)('Resolve Block'),
13222      onRequestClose: onCompareClose,
13223      className: "block-editor-block-compare"
13224    }, (0,external_wp_element_namespaceObject.createElement)(block_compare, {
13225      block: block,
13226      onKeep: convertToHTML,
13227      onConvert: convertToBlocks,
13228      convertor: blockToBlocks,
13229      convertButtonText: (0,external_wp_i18n_namespaceObject.__)('Convert to Blocks')
13230    })));
13231  }
13232  
13233  const blockToClassic = block => (0,external_wp_blocks_namespaceObject.createBlock)('core/freeform', {
13234    content: block.originalContent
13235  });
13236  
13237  const blockToHTML = block => (0,external_wp_blocks_namespaceObject.createBlock)('core/html', {
13238    content: block.originalContent
13239  });
13240  
13241  const blockToBlocks = block => (0,external_wp_blocks_namespaceObject.rawHandler)({
13242    HTML: block.originalContent
13243  });
13244  
13245  const recoverBlock = _ref2 => {
13246    let {
13247      name,
13248      attributes,
13249      innerBlocks
13250    } = _ref2;
13251    return (0,external_wp_blocks_namespaceObject.createBlock)(name, attributes, innerBlocks);
13252  };
13253  
13254  /* harmony default export */ var block_invalid_warning = ((0,external_wp_compose_namespaceObject.compose)([(0,external_wp_data_namespaceObject.withSelect)((select, _ref3) => {
13255    let {
13256      clientId
13257    } = _ref3;
13258    return {
13259      block: select(store).getBlock(clientId)
13260    };
13261  }), (0,external_wp_data_namespaceObject.withDispatch)((dispatch, _ref4) => {
13262    let {
13263      block
13264    } = _ref4;
13265    const {
13266      replaceBlock
13267    } = dispatch(store);
13268    return {
13269      convertToClassic() {
13270        replaceBlock(block.clientId, blockToClassic(block));
13271      },
13272  
13273      convertToHTML() {
13274        replaceBlock(block.clientId, blockToHTML(block));
13275      },
13276  
13277      convertToBlocks() {
13278        replaceBlock(block.clientId, blockToBlocks(block));
13279      },
13280  
13281      attemptBlockRecovery() {
13282        replaceBlock(block.clientId, recoverBlock(block));
13283      }
13284  
13285    };
13286  })])(BlockInvalidWarning));
13287  
13288  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-list/block-crash-warning.js
13289  
13290  
13291  /**
13292   * WordPress dependencies
13293   */
13294  
13295  /**
13296   * Internal dependencies
13297   */
13298  
13299  
13300  const block_crash_warning_warning = (0,external_wp_element_namespaceObject.createElement)(warning, {
13301    className: "block-editor-block-list__block-crash-warning"
13302  }, (0,external_wp_i18n_namespaceObject.__)('This block has encountered an error and cannot be previewed.'));
13303  /* harmony default export */ var block_crash_warning = (() => block_crash_warning_warning);
13304  
13305  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-list/block-crash-boundary.js
13306  /**
13307   * WordPress dependencies
13308   */
13309  
13310  
13311  class BlockCrashBoundary extends external_wp_element_namespaceObject.Component {
13312    constructor() {
13313      super(...arguments);
13314      this.state = {
13315        hasError: false
13316      };
13317    }
13318  
13319    componentDidCatch() {
13320      this.setState({
13321        hasError: true
13322      });
13323    }
13324  
13325    render() {
13326      if (this.state.hasError) {
13327        return this.props.fallback;
13328      }
13329  
13330      return this.props.children;
13331    }
13332  
13333  }
13334  
13335  /* harmony default export */ var block_crash_boundary = (BlockCrashBoundary);
13336  
13337  // EXTERNAL MODULE: ./node_modules/react-autosize-textarea/lib/index.js
13338  var lib = __webpack_require__(773);
13339  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-list/block-html.js
13340  
13341  
13342  /**
13343   * External dependencies
13344   */
13345  
13346  /**
13347   * WordPress dependencies
13348   */
13349  
13350  
13351  
13352  
13353  /**
13354   * Internal dependencies
13355   */
13356  
13357  
13358  
13359  function BlockHTML(_ref) {
13360    let {
13361      clientId
13362    } = _ref;
13363    const [html, setHtml] = (0,external_wp_element_namespaceObject.useState)('');
13364    const block = (0,external_wp_data_namespaceObject.useSelect)(select => select(store).getBlock(clientId), [clientId]);
13365    const {
13366      updateBlock
13367    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
13368  
13369    const onChange = () => {
13370      const blockType = (0,external_wp_blocks_namespaceObject.getBlockType)(block.name);
13371  
13372      if (!blockType) {
13373        return;
13374      }
13375  
13376      const attributes = (0,external_wp_blocks_namespaceObject.getBlockAttributes)(blockType, html, block.attributes); // If html is empty  we reset the block to the default HTML and mark it as valid to avoid triggering an error
13377  
13378      const content = html ? html : (0,external_wp_blocks_namespaceObject.getSaveContent)(blockType, attributes);
13379      const [isValid] = html ? (0,external_wp_blocks_namespaceObject.validateBlock)({ ...block,
13380        attributes,
13381        originalContent: content
13382      }) : [true];
13383      updateBlock(clientId, {
13384        attributes,
13385        originalContent: content,
13386        isValid
13387      }); // Ensure the state is updated if we reset so it displays the default content.
13388  
13389      if (!html) {
13390        setHtml({
13391          content
13392        });
13393      }
13394    };
13395  
13396    (0,external_wp_element_namespaceObject.useEffect)(() => {
13397      setHtml((0,external_wp_blocks_namespaceObject.getBlockContent)(block));
13398    }, [block]);
13399    return (0,external_wp_element_namespaceObject.createElement)(lib/* default */.Z, {
13400      className: "block-editor-block-list__block-html-textarea",
13401      value: html,
13402      onBlur: onChange,
13403      onChange: event => setHtml(event.target.value)
13404    });
13405  }
13406  
13407  /* harmony default export */ var block_html = (BlockHTML);
13408  
13409  ;// CONCATENATED MODULE: ./node_modules/@react-spring/rafz/dist/react-spring-rafz.esm.js
13410  let updateQueue = makeQueue();
13411  const raf = fn => schedule(fn, updateQueue);
13412  let writeQueue = makeQueue();
13413  
13414  raf.write = fn => schedule(fn, writeQueue);
13415  
13416  let onStartQueue = makeQueue();
13417  
13418  raf.onStart = fn => schedule(fn, onStartQueue);
13419  
13420  let onFrameQueue = makeQueue();
13421  
13422  raf.onFrame = fn => schedule(fn, onFrameQueue);
13423  
13424  let onFinishQueue = makeQueue();
13425  
13426  raf.onFinish = fn => schedule(fn, onFinishQueue);
13427  
13428  let timeouts = [];
13429  
13430  raf.setTimeout = (handler, ms) => {
13431    let time = raf.now() + ms;
13432  
13433    let cancel = () => {
13434      let i = timeouts.findIndex(t => t.cancel == cancel);
13435      if (~i) timeouts.splice(i, 1);
13436      pendingCount -= ~i ? 1 : 0;
13437    };
13438  
13439    let timeout = {
13440      time,
13441      handler,
13442      cancel
13443    };
13444    timeouts.splice(findTimeout(time), 0, timeout);
13445    pendingCount += 1;
13446    start();
13447    return timeout;
13448  };
13449  
13450  let findTimeout = time => ~(~timeouts.findIndex(t => t.time > time) || ~timeouts.length);
13451  
13452  raf.cancel = fn => {
13453    onStartQueue.delete(fn);
13454    onFrameQueue.delete(fn);
13455    updateQueue.delete(fn);
13456    writeQueue.delete(fn);
13457    onFinishQueue.delete(fn);
13458  };
13459  
13460  raf.sync = fn => {
13461    sync = true;
13462    raf.batchedUpdates(fn);
13463    sync = false;
13464  };
13465  
13466  raf.throttle = fn => {
13467    let lastArgs;
13468  
13469    function queuedFn() {
13470      try {
13471        fn(...lastArgs);
13472      } finally {
13473        lastArgs = null;
13474      }
13475    }
13476  
13477    function throttled(...args) {
13478      lastArgs = args;
13479      raf.onStart(queuedFn);
13480    }
13481  
13482    throttled.handler = fn;
13483  
13484    throttled.cancel = () => {
13485      onStartQueue.delete(queuedFn);
13486      lastArgs = null;
13487    };
13488  
13489    return throttled;
13490  };
13491  
13492  let nativeRaf = typeof window != 'undefined' ? window.requestAnimationFrame : () => {};
13493  
13494  raf.use = impl => nativeRaf = impl;
13495  
13496  raf.now = typeof performance != 'undefined' ? () => performance.now() : Date.now;
13497  
13498  raf.batchedUpdates = fn => fn();
13499  
13500  raf.catch = console.error;
13501  raf.frameLoop = 'always';
13502  
13503  raf.advance = () => {
13504    if (raf.frameLoop !== 'demand') {
13505      console.warn('Cannot call the manual advancement of rafz whilst frameLoop is not set as demand');
13506    } else {
13507      update();
13508    }
13509  };
13510  
13511  let ts = -1;
13512  let pendingCount = 0;
13513  let sync = false;
13514  
13515  function schedule(fn, queue) {
13516    if (sync) {
13517      queue.delete(fn);
13518      fn(0);
13519    } else {
13520      queue.add(fn);
13521      start();
13522    }
13523  }
13524  
13525  function start() {
13526    if (ts < 0) {
13527      ts = 0;
13528  
13529      if (raf.frameLoop !== 'demand') {
13530        nativeRaf(loop);
13531      }
13532    }
13533  }
13534  
13535  function stop() {
13536    ts = -1;
13537  }
13538  
13539  function loop() {
13540    if (~ts) {
13541      nativeRaf(loop);
13542      raf.batchedUpdates(update);
13543    }
13544  }
13545  
13546  function update() {
13547    let prevTs = ts;
13548    ts = raf.now();
13549    let count = findTimeout(ts);
13550  
13551    if (count) {
13552      eachSafely(timeouts.splice(0, count), t => t.handler());
13553      pendingCount -= count;
13554    }
13555  
13556    onStartQueue.flush();
13557    updateQueue.flush(prevTs ? Math.min(64, ts - prevTs) : 16.667);
13558    onFrameQueue.flush();
13559    writeQueue.flush();
13560    onFinishQueue.flush();
13561  
13562    if (!pendingCount) {
13563      stop();
13564    }
13565  }
13566  
13567  function makeQueue() {
13568    let next = new Set();
13569    let current = next;
13570    return {
13571      add(fn) {
13572        pendingCount += current == next && !next.has(fn) ? 1 : 0;
13573        next.add(fn);
13574      },
13575  
13576      delete(fn) {
13577        pendingCount -= current == next && next.has(fn) ? 1 : 0;
13578        return next.delete(fn);
13579      },
13580  
13581      flush(arg) {
13582        if (current.size) {
13583          next = new Set();
13584          pendingCount -= current.size;
13585          eachSafely(current, fn => fn(arg) && next.add(fn));
13586          pendingCount += next.size;
13587          current = next;
13588        }
13589      }
13590  
13591    };
13592  }
13593  
13594  function eachSafely(values, each) {
13595    values.forEach(value => {
13596      try {
13597        each(value);
13598      } catch (e) {
13599        raf.catch(e);
13600      }
13601    });
13602  }
13603  
13604  const __raf = {
13605    count() {
13606      return pendingCount;
13607    },
13608  
13609    isRunning() {
13610      return ts >= 0;
13611    },
13612  
13613    clear() {
13614      ts = -1;
13615      timeouts = [];
13616      onStartQueue = makeQueue();
13617      updateQueue = makeQueue();
13618      onFrameQueue = makeQueue();
13619      writeQueue = makeQueue();
13620      onFinishQueue = makeQueue();
13621      pendingCount = 0;
13622    }
13623  
13624  };
13625  
13626  
13627  
13628  // EXTERNAL MODULE: external "React"
13629  var external_React_ = __webpack_require__(9196);
13630  var external_React_default = /*#__PURE__*/__webpack_require__.n(external_React_);
13631  ;// CONCATENATED MODULE: ./node_modules/@react-spring/shared/dist/react-spring-shared.esm.js
13632  
13633  
13634  
13635  
13636  
13637  function noop() {}
13638  const defineHidden = (obj, key, value) => Object.defineProperty(obj, key, {
13639    value,
13640    writable: true,
13641    configurable: true
13642  });
13643  const react_spring_shared_esm_is = {
13644    arr: Array.isArray,
13645    obj: a => !!a && a.constructor.name === 'Object',
13646    fun: a => typeof a === 'function',
13647    str: a => typeof a === 'string',
13648    num: a => typeof a === 'number',
13649    und: a => a === undefined
13650  };
13651  function isEqual(a, b) {
13652    if (react_spring_shared_esm_is.arr(a)) {
13653      if (!react_spring_shared_esm_is.arr(b) || a.length !== b.length) return false;
13654  
13655      for (let i = 0; i < a.length; i++) {
13656        if (a[i] !== b[i]) return false;
13657      }
13658  
13659      return true;
13660    }
13661  
13662    return a === b;
13663  }
13664  const react_spring_shared_esm_each = (obj, fn) => obj.forEach(fn);
13665  function eachProp(obj, fn, ctx) {
13666    if (react_spring_shared_esm_is.arr(obj)) {
13667      for (let i = 0; i < obj.length; i++) {
13668        fn.call(ctx, obj[i], `$i}`);
13669      }
13670  
13671      return;
13672    }
13673  
13674    for (const key in obj) {
13675      if (obj.hasOwnProperty(key)) {
13676        fn.call(ctx, obj[key], key);
13677      }
13678    }
13679  }
13680  const react_spring_shared_esm_toArray = a => react_spring_shared_esm_is.und(a) ? [] : react_spring_shared_esm_is.arr(a) ? a : [a];
13681  function flush(queue, iterator) {
13682    if (queue.size) {
13683      const items = Array.from(queue);
13684      queue.clear();
13685      react_spring_shared_esm_each(items, iterator);
13686    }
13687  }
13688  const flushCalls = (queue, ...args) => flush(queue, fn => fn(...args));
13689  const isSSR = () => typeof window === 'undefined' || !window.navigator || /ServerSideRendering|^Deno\//.test(window.navigator.userAgent);
13690  
13691  let createStringInterpolator$1;
13692  let to;
13693  let colors$1 = null;
13694  let skipAnimation = false;
13695  let willAdvance = noop;
13696  const react_spring_shared_esm_assign = globals => {
13697    if (globals.to) to = globals.to;
13698    if (globals.now) raf.now = globals.now;
13699    if (globals.colors !== undefined) colors$1 = globals.colors;
13700    if (globals.skipAnimation != null) skipAnimation = globals.skipAnimation;
13701    if (globals.createStringInterpolator) createStringInterpolator$1 = globals.createStringInterpolator;
13702    if (globals.requestAnimationFrame) raf.use(globals.requestAnimationFrame);
13703    if (globals.batchedUpdates) raf.batchedUpdates = globals.batchedUpdates;
13704    if (globals.willAdvance) willAdvance = globals.willAdvance;
13705    if (globals.frameLoop) raf.frameLoop = globals.frameLoop;
13706  };
13707  
13708  var globals = /*#__PURE__*/Object.freeze({
13709    __proto__: null,
13710    get createStringInterpolator () { return createStringInterpolator$1; },
13711    get to () { return to; },
13712    get colors () { return colors$1; },
13713    get skipAnimation () { return skipAnimation; },
13714    get willAdvance () { return willAdvance; },
13715    assign: react_spring_shared_esm_assign
13716  });
13717  
13718  const startQueue = new Set();
13719  let currentFrame = [];
13720  let prevFrame = [];
13721  let priority = 0;
13722  const frameLoop = {
13723    get idle() {
13724      return !startQueue.size && !currentFrame.length;
13725    },
13726  
13727    start(animation) {
13728      if (priority > animation.priority) {
13729        startQueue.add(animation);
13730        raf.onStart(flushStartQueue);
13731      } else {
13732        startSafely(animation);
13733        raf(advance);
13734      }
13735    },
13736  
13737    advance,
13738  
13739    sort(animation) {
13740      if (priority) {
13741        raf.onFrame(() => frameLoop.sort(animation));
13742      } else {
13743        const prevIndex = currentFrame.indexOf(animation);
13744  
13745        if (~prevIndex) {
13746          currentFrame.splice(prevIndex, 1);
13747          startUnsafely(animation);
13748        }
13749      }
13750    },
13751  
13752    clear() {
13753      currentFrame = [];
13754      startQueue.clear();
13755    }
13756  
13757  };
13758  
13759  function flushStartQueue() {
13760    startQueue.forEach(startSafely);
13761    startQueue.clear();
13762    raf(advance);
13763  }
13764  
13765  function startSafely(animation) {
13766    if (!currentFrame.includes(animation)) startUnsafely(animation);
13767  }
13768  
13769  function startUnsafely(animation) {
13770    currentFrame.splice(findIndex(currentFrame, other => other.priority > animation.priority), 0, animation);
13771  }
13772  
13773  function advance(dt) {
13774    const nextFrame = prevFrame;
13775  
13776    for (let i = 0; i < currentFrame.length; i++) {
13777      const animation = currentFrame[i];
13778      priority = animation.priority;
13779  
13780      if (!animation.idle) {
13781        willAdvance(animation);
13782        animation.advance(dt);
13783  
13784        if (!animation.idle) {
13785          nextFrame.push(animation);
13786        }
13787      }
13788    }
13789  
13790    priority = 0;
13791    prevFrame = currentFrame;
13792    prevFrame.length = 0;
13793    currentFrame = nextFrame;
13794    return currentFrame.length > 0;
13795  }
13796  
13797  function findIndex(arr, test) {
13798    const index = arr.findIndex(test);
13799    return index < 0 ? arr.length : index;
13800  }
13801  
13802  const colors = {
13803    transparent: 0x00000000,
13804    aliceblue: 0xf0f8ffff,
13805    antiquewhite: 0xfaebd7ff,
13806    aqua: 0x00ffffff,
13807    aquamarine: 0x7fffd4ff,
13808    azure: 0xf0ffffff,
13809    beige: 0xf5f5dcff,
13810    bisque: 0xffe4c4ff,
13811    black: 0x000000ff,
13812    blanchedalmond: 0xffebcdff,
13813    blue: 0x0000ffff,
13814    blueviolet: 0x8a2be2ff,
13815    brown: 0xa52a2aff,
13816    burlywood: 0xdeb887ff,
13817    burntsienna: 0xea7e5dff,
13818    cadetblue: 0x5f9ea0ff,
13819    chartreuse: 0x7fff00ff,
13820    chocolate: 0xd2691eff,
13821    coral: 0xff7f50ff,
13822    cornflowerblue: 0x6495edff,
13823    cornsilk: 0xfff8dcff,
13824    crimson: 0xdc143cff,
13825    cyan: 0x00ffffff,
13826    darkblue: 0x00008bff,
13827    darkcyan: 0x008b8bff,
13828    darkgoldenrod: 0xb8860bff,
13829    darkgray: 0xa9a9a9ff,
13830    darkgreen: 0x006400ff,
13831    darkgrey: 0xa9a9a9ff,
13832    darkkhaki: 0xbdb76bff,
13833    darkmagenta: 0x8b008bff,
13834    darkolivegreen: 0x556b2fff,
13835    darkorange: 0xff8c00ff,
13836    darkorchid: 0x9932ccff,
13837    darkred: 0x8b0000ff,
13838    darksalmon: 0xe9967aff,
13839    darkseagreen: 0x8fbc8fff,
13840    darkslateblue: 0x483d8bff,
13841    darkslategray: 0x2f4f4fff,
13842    darkslategrey: 0x2f4f4fff,
13843    darkturquoise: 0x00ced1ff,
13844    darkviolet: 0x9400d3ff,
13845    deeppink: 0xff1493ff,
13846    deepskyblue: 0x00bfffff,
13847    dimgray: 0x696969ff,
13848    dimgrey: 0x696969ff,
13849    dodgerblue: 0x1e90ffff,
13850    firebrick: 0xb22222ff,
13851    floralwhite: 0xfffaf0ff,
13852    forestgreen: 0x228b22ff,
13853    fuchsia: 0xff00ffff,
13854    gainsboro: 0xdcdcdcff,
13855    ghostwhite: 0xf8f8ffff,
13856    gold: 0xffd700ff,
13857    goldenrod: 0xdaa520ff,
13858    gray: 0x808080ff,
13859    green: 0x008000ff,
13860    greenyellow: 0xadff2fff,
13861    grey: 0x808080ff,
13862    honeydew: 0xf0fff0ff,
13863    hotpink: 0xff69b4ff,
13864    indianred: 0xcd5c5cff,
13865    indigo: 0x4b0082ff,
13866    ivory: 0xfffff0ff,
13867    khaki: 0xf0e68cff,
13868    lavender: 0xe6e6faff,
13869    lavenderblush: 0xfff0f5ff,
13870    lawngreen: 0x7cfc00ff,
13871    lemonchiffon: 0xfffacdff,
13872    lightblue: 0xadd8e6ff,
13873    lightcoral: 0xf08080ff,
13874    lightcyan: 0xe0ffffff,
13875    lightgoldenrodyellow: 0xfafad2ff,
13876    lightgray: 0xd3d3d3ff,
13877    lightgreen: 0x90ee90ff,
13878    lightgrey: 0xd3d3d3ff,
13879    lightpink: 0xffb6c1ff,
13880    lightsalmon: 0xffa07aff,
13881    lightseagreen: 0x20b2aaff,
13882    lightskyblue: 0x87cefaff,
13883    lightslategray: 0x778899ff,
13884    lightslategrey: 0x778899ff,
13885    lightsteelblue: 0xb0c4deff,
13886    lightyellow: 0xffffe0ff,
13887    lime: 0x00ff00ff,
13888    limegreen: 0x32cd32ff,
13889    linen: 0xfaf0e6ff,
13890    magenta: 0xff00ffff,
13891    maroon: 0x800000ff,
13892    mediumaquamarine: 0x66cdaaff,
13893    mediumblue: 0x0000cdff,
13894    mediumorchid: 0xba55d3ff,
13895    mediumpurple: 0x9370dbff,
13896    mediumseagreen: 0x3cb371ff,
13897    mediumslateblue: 0x7b68eeff,
13898    mediumspringgreen: 0x00fa9aff,
13899    mediumturquoise: 0x48d1ccff,
13900    mediumvioletred: 0xc71585ff,
13901    midnightblue: 0x191970ff,
13902    mintcream: 0xf5fffaff,
13903    mistyrose: 0xffe4e1ff,
13904    moccasin: 0xffe4b5ff,
13905    navajowhite: 0xffdeadff,
13906    navy: 0x000080ff,
13907    oldlace: 0xfdf5e6ff,
13908    olive: 0x808000ff,
13909    olivedrab: 0x6b8e23ff,
13910    orange: 0xffa500ff,
13911    orangered: 0xff4500ff,
13912    orchid: 0xda70d6ff,
13913    palegoldenrod: 0xeee8aaff,
13914    palegreen: 0x98fb98ff,
13915    paleturquoise: 0xafeeeeff,
13916    palevioletred: 0xdb7093ff,
13917    papayawhip: 0xffefd5ff,
13918    peachpuff: 0xffdab9ff,
13919    peru: 0xcd853fff,
13920    pink: 0xffc0cbff,
13921    plum: 0xdda0ddff,
13922    powderblue: 0xb0e0e6ff,
13923    purple: 0x800080ff,
13924    rebeccapurple: 0x663399ff,
13925    red: 0xff0000ff,
13926    rosybrown: 0xbc8f8fff,
13927    royalblue: 0x4169e1ff,
13928    saddlebrown: 0x8b4513ff,
13929    salmon: 0xfa8072ff,
13930    sandybrown: 0xf4a460ff,
13931    seagreen: 0x2e8b57ff,
13932    seashell: 0xfff5eeff,
13933    sienna: 0xa0522dff,
13934    silver: 0xc0c0c0ff,
13935    skyblue: 0x87ceebff,
13936    slateblue: 0x6a5acdff,
13937    slategray: 0x708090ff,
13938    slategrey: 0x708090ff,
13939    snow: 0xfffafaff,
13940    springgreen: 0x00ff7fff,
13941    steelblue: 0x4682b4ff,
13942    tan: 0xd2b48cff,
13943    teal: 0x008080ff,
13944    thistle: 0xd8bfd8ff,
13945    tomato: 0xff6347ff,
13946    turquoise: 0x40e0d0ff,
13947    violet: 0xee82eeff,
13948    wheat: 0xf5deb3ff,
13949    white: 0xffffffff,
13950    whitesmoke: 0xf5f5f5ff,
13951    yellow: 0xffff00ff,
13952    yellowgreen: 0x9acd32ff
13953  };
13954  
13955  const NUMBER = '[-+]?\\d*\\.?\\d+';
13956  const PERCENTAGE = NUMBER + '%';
13957  
13958  function call(...parts) {
13959    return '\\(\\s*(' + parts.join(')\\s*,\\s*(') + ')\\s*\\)';
13960  }
13961  
13962  const rgb = new RegExp('rgb' + call(NUMBER, NUMBER, NUMBER));
13963  const rgba = new RegExp('rgba' + call(NUMBER, NUMBER, NUMBER, NUMBER));
13964  const hsl = new RegExp('hsl' + call(NUMBER, PERCENTAGE, PERCENTAGE));
13965  const hsla = new RegExp('hsla' + call(NUMBER, PERCENTAGE, PERCENTAGE, NUMBER));
13966  const hex3 = /^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/;
13967  const hex4 = /^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/;
13968  const hex6 = /^#([0-9a-fA-F]{6})$/;
13969  const hex8 = /^#([0-9a-fA-F]{8})$/;
13970  
13971  function normalizeColor(color) {
13972    let match;
13973  
13974    if (typeof color === 'number') {
13975      return color >>> 0 === color && color >= 0 && color <= 0xffffffff ? color : null;
13976    }
13977  
13978    if (match = hex6.exec(color)) return parseInt(match[1] + 'ff', 16) >>> 0;
13979  
13980    if (colors$1 && colors$1[color] !== undefined) {
13981      return colors$1[color];
13982    }
13983  
13984    if (match = rgb.exec(color)) {
13985      return (parse255(match[1]) << 24 | parse255(match[2]) << 16 | parse255(match[3]) << 8 | 0x000000ff) >>> 0;
13986    }
13987  
13988    if (match = rgba.exec(color)) {
13989      return (parse255(match[1]) << 24 | parse255(match[2]) << 16 | parse255(match[3]) << 8 | parse1(match[4])) >>> 0;
13990    }
13991  
13992    if (match = hex3.exec(color)) {
13993      return parseInt(match[1] + match[1] + match[2] + match[2] + match[3] + match[3] + 'ff', 16) >>> 0;
13994    }
13995  
13996    if (match = hex8.exec(color)) return parseInt(match[1], 16) >>> 0;
13997  
13998    if (match = hex4.exec(color)) {
13999      return parseInt(match[1] + match[1] + match[2] + match[2] + match[3] + match[3] + match[4] + match[4], 16) >>> 0;
14000    }
14001  
14002    if (match = hsl.exec(color)) {
14003      return (hslToRgb(parse360(match[1]), parsePercentage(match[2]), parsePercentage(match[3])) | 0x000000ff) >>> 0;
14004    }
14005  
14006    if (match = hsla.exec(color)) {
14007      return (hslToRgb(parse360(match[1]), parsePercentage(match[2]), parsePercentage(match[3])) | parse1(match[4])) >>> 0;
14008    }
14009  
14010    return null;
14011  }
14012  
14013  function hue2rgb(p, q, t) {
14014    if (t < 0) t += 1;
14015    if (t > 1) t -= 1;
14016    if (t < 1 / 6) return p + (q - p) * 6 * t;
14017    if (t < 1 / 2) return q;
14018    if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
14019    return p;
14020  }
14021  
14022  function hslToRgb(h, s, l) {
14023    const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
14024    const p = 2 * l - q;
14025    const r = hue2rgb(p, q, h + 1 / 3);
14026    const g = hue2rgb(p, q, h);
14027    const b = hue2rgb(p, q, h - 1 / 3);
14028    return Math.round(r * 255) << 24 | Math.round(g * 255) << 16 | Math.round(b * 255) << 8;
14029  }
14030  
14031  function parse255(str) {
14032    const int = parseInt(str, 10);
14033    if (int < 0) return 0;
14034    if (int > 255) return 255;
14035    return int;
14036  }
14037  
14038  function parse360(str) {
14039    const int = parseFloat(str);
14040    return (int % 360 + 360) % 360 / 360;
14041  }
14042  
14043  function parse1(str) {
14044    const num = parseFloat(str);
14045    if (num < 0) return 0;
14046    if (num > 1) return 255;
14047    return Math.round(num * 255);
14048  }
14049  
14050  function parsePercentage(str) {
14051    const int = parseFloat(str);
14052    if (int < 0) return 0;
14053    if (int > 100) return 1;
14054    return int / 100;
14055  }
14056  
14057  function colorToRgba(input) {
14058    let int32Color = normalizeColor(input);
14059    if (int32Color === null) return input;
14060    int32Color = int32Color || 0;
14061    let r = (int32Color & 0xff000000) >>> 24;
14062    let g = (int32Color & 0x00ff0000) >>> 16;
14063    let b = (int32Color & 0x0000ff00) >>> 8;
14064    let a = (int32Color & 0x000000ff) / 255;
14065    return `rgba($r}, $g}, $b}, $a})`;
14066  }
14067  
14068  const createInterpolator = (range, output, extrapolate) => {
14069    if (react_spring_shared_esm_is.fun(range)) {
14070      return range;
14071    }
14072  
14073    if (react_spring_shared_esm_is.arr(range)) {
14074      return createInterpolator({
14075        range,
14076        output: output,
14077        extrapolate
14078      });
14079    }
14080  
14081    if (react_spring_shared_esm_is.str(range.output[0])) {
14082      return createStringInterpolator$1(range);
14083    }
14084  
14085    const config = range;
14086    const outputRange = config.output;
14087    const inputRange = config.range || [0, 1];
14088    const extrapolateLeft = config.extrapolateLeft || config.extrapolate || 'extend';
14089    const extrapolateRight = config.extrapolateRight || config.extrapolate || 'extend';
14090  
14091    const easing = config.easing || (t => t);
14092  
14093    return input => {
14094      const range = findRange(input, inputRange);
14095      return interpolate(input, inputRange[range], inputRange[range + 1], outputRange[range], outputRange[range + 1], easing, extrapolateLeft, extrapolateRight, config.map);
14096    };
14097  };
14098  
14099  function interpolate(input, inputMin, inputMax, outputMin, outputMax, easing, extrapolateLeft, extrapolateRight, map) {
14100    let result = map ? map(input) : input;
14101  
14102    if (result < inputMin) {
14103      if (extrapolateLeft === 'identity') return result;else if (extrapolateLeft === 'clamp') result = inputMin;
14104    }
14105  
14106    if (result > inputMax) {
14107      if (extrapolateRight === 'identity') return result;else if (extrapolateRight === 'clamp') result = inputMax;
14108    }
14109  
14110    if (outputMin === outputMax) return outputMin;
14111    if (inputMin === inputMax) return input <= inputMin ? outputMin : outputMax;
14112    if (inputMin === -Infinity) result = -result;else if (inputMax === Infinity) result = result - inputMin;else result = (result - inputMin) / (inputMax - inputMin);
14113    result = easing(result);
14114    if (outputMin === -Infinity) result = -result;else if (outputMax === Infinity) result = result + outputMin;else result = result * (outputMax - outputMin) + outputMin;
14115    return result;
14116  }
14117  
14118  function findRange(input, inputRange) {
14119    for (var i = 1; i < inputRange.length - 1; ++i) if (inputRange[i] >= input) break;
14120  
14121    return i - 1;
14122  }
14123  
14124  function react_spring_shared_esm_extends() {
14125    react_spring_shared_esm_extends = Object.assign || function (target) {
14126      for (var i = 1; i < arguments.length; i++) {
14127        var source = arguments[i];
14128  
14129        for (var key in source) {
14130          if (Object.prototype.hasOwnProperty.call(source, key)) {
14131            target[key] = source[key];
14132          }
14133        }
14134      }
14135  
14136      return target;
14137    };
14138  
14139    return react_spring_shared_esm_extends.apply(this, arguments);
14140  }
14141  
14142  const $get = Symbol.for('FluidValue.get');
14143  const $observers = Symbol.for('FluidValue.observers');
14144  
14145  const hasFluidValue = arg => Boolean(arg && arg[$get]);
14146  
14147  const getFluidValue = arg => arg && arg[$get] ? arg[$get]() : arg;
14148  
14149  const getFluidObservers = target => target[$observers] || null;
14150  
14151  function callFluidObserver(observer, event) {
14152    if (observer.eventObserved) {
14153      observer.eventObserved(event);
14154    } else {
14155      observer(event);
14156    }
14157  }
14158  
14159  function callFluidObservers(target, event) {
14160    let observers = target[$observers];
14161  
14162    if (observers) {
14163      observers.forEach(observer => {
14164        callFluidObserver(observer, event);
14165      });
14166    }
14167  }
14168  
14169  class FluidValue {
14170    constructor(get) {
14171      this[$get] = void 0;
14172      this[$observers] = void 0;
14173  
14174      if (!get && !(get = this.get)) {
14175        throw Error('Unknown getter');
14176      }
14177  
14178      setFluidGetter(this, get);
14179    }
14180  
14181  }
14182  
14183  const setFluidGetter = (target, get) => setHidden(target, $get, get);
14184  
14185  function addFluidObserver(target, observer) {
14186    if (target[$get]) {
14187      let observers = target[$observers];
14188  
14189      if (!observers) {
14190        setHidden(target, $observers, observers = new Set());
14191      }
14192  
14193      if (!observers.has(observer)) {
14194        observers.add(observer);
14195  
14196        if (target.observerAdded) {
14197          target.observerAdded(observers.size, observer);
14198        }
14199      }
14200    }
14201  
14202    return observer;
14203  }
14204  
14205  function removeFluidObserver(target, observer) {
14206    let observers = target[$observers];
14207  
14208    if (observers && observers.has(observer)) {
14209      const count = observers.size - 1;
14210  
14211      if (count) {
14212        observers.delete(observer);
14213      } else {
14214        target[$observers] = null;
14215      }
14216  
14217      if (target.observerRemoved) {
14218        target.observerRemoved(count, observer);
14219      }
14220    }
14221  }
14222  
14223  const setHidden = (target, key, value) => Object.defineProperty(target, key, {
14224    value,
14225    writable: true,
14226    configurable: true
14227  });
14228  
14229  const numberRegex = /[+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
14230  const colorRegex = /(#(?:[0-9a-f]{2}){2,4}|(#[0-9a-f]{3})|(rgb|hsl)a?\((-?\d+%?[,\s]+){2,3}\s*[\d\.]+%?\))/gi;
14231  const unitRegex = new RegExp(`($numberRegex.source})(%|[a-z]+)`, 'i');
14232  const rgbaRegex = /rgba\(([0-9\.-]+), ([0-9\.-]+), ([0-9\.-]+), ([0-9\.-]+)\)/gi;
14233  const cssVariableRegex = /var\((--[a-zA-Z0-9-_]+),? ?([a-zA-Z0-9 ()%#.,-]+)?\)/;
14234  
14235  const variableToRgba = input => {
14236    const [token, fallback] = parseCSSVariable(input);
14237  
14238    if (!token || isSSR()) {
14239      return input;
14240    }
14241  
14242    const value = window.getComputedStyle(document.documentElement).getPropertyValue(token);
14243  
14244    if (value) {
14245      return value.trim();
14246    } else if (fallback && fallback.startsWith('--')) {
14247      const _value = window.getComputedStyle(document.documentElement).getPropertyValue(fallback);
14248  
14249      if (_value) {
14250        return _value;
14251      } else {
14252        return input;
14253      }
14254    } else if (fallback && cssVariableRegex.test(fallback)) {
14255      return variableToRgba(fallback);
14256    } else if (fallback) {
14257      return fallback;
14258    }
14259  
14260    return input;
14261  };
14262  
14263  const parseCSSVariable = current => {
14264    const match = cssVariableRegex.exec(current);
14265    if (!match) return [,];
14266    const [, token, fallback] = match;
14267    return [token, fallback];
14268  };
14269  
14270  let namedColorRegex;
14271  
14272  const rgbaRound = (_, p1, p2, p3, p4) => `rgba($Math.round(p1)}, $Math.round(p2)}, $Math.round(p3)}, $p4})`;
14273  
14274  const createStringInterpolator = config => {
14275    if (!namedColorRegex) namedColorRegex = colors$1 ? new RegExp(`($Object.keys(colors$1).join('|')})(?!\\w)`, 'g') : /^\b$/;
14276    const output = config.output.map(value => {
14277      return getFluidValue(value).replace(cssVariableRegex, variableToRgba).replace(colorRegex, colorToRgba).replace(namedColorRegex, colorToRgba);
14278    });
14279    const keyframes = output.map(value => value.match(numberRegex).map(Number));
14280    const outputRanges = keyframes[0].map((_, i) => keyframes.map(values => {
14281      if (!(i in values)) {
14282        throw Error('The arity of each "output" value must be equal');
14283      }
14284  
14285      return values[i];
14286    }));
14287    const interpolators = outputRanges.map(output => createInterpolator(react_spring_shared_esm_extends({}, config, {
14288      output
14289    })));
14290    return input => {
14291      var _output$find;
14292  
14293      const missingUnit = !unitRegex.test(output[0]) && ((_output$find = output.find(value => unitRegex.test(value))) == null ? void 0 : _output$find.replace(numberRegex, ''));
14294      let i = 0;
14295      return output[0].replace(numberRegex, () => `$interpolators[i++](input)}$missingUnit || ''}`).replace(rgbaRegex, rgbaRound);
14296    };
14297  };
14298  
14299  const prefix = 'react-spring: ';
14300  
14301  const once = fn => {
14302    const func = fn;
14303    let called = false;
14304  
14305    if (typeof func != 'function') {
14306      throw new TypeError(`$prefix}once requires a function parameter`);
14307    }
14308  
14309    return (...args) => {
14310      if (!called) {
14311        func(...args);
14312        called = true;
14313      }
14314    };
14315  };
14316  
14317  const warnInterpolate = once(console.warn);
14318  function react_spring_shared_esm_deprecateInterpolate() {
14319    warnInterpolate(`$prefix}The "interpolate" function is deprecated in v9 (use "to" instead)`);
14320  }
14321  const warnDirectCall = once(console.warn);
14322  function deprecateDirectCall() {
14323    warnDirectCall(`$prefix}Directly calling start instead of using the api object is deprecated in v9 (use ".start" instead), this will be removed in later 0.X.0 versions`);
14324  }
14325  
14326  function isAnimatedString(value) {
14327    return react_spring_shared_esm_is.str(value) && (value[0] == '#' || /\d/.test(value) || !isSSR() && cssVariableRegex.test(value) || value in (colors$1 || {}));
14328  }
14329  
14330  const react_spring_shared_esm_useOnce = effect => (0,external_React_.useEffect)(effect, emptyDeps);
14331  const emptyDeps = [];
14332  
14333  function react_spring_shared_esm_useForceUpdate() {
14334    const update = (0,external_React_.useState)()[1];
14335    const mounted = (0,external_React_.useState)(makeMountedRef)[0];
14336    react_spring_shared_esm_useOnce(mounted.unmount);
14337    return () => {
14338      if (mounted.current) {
14339        update({});
14340      }
14341    };
14342  }
14343  
14344  function makeMountedRef() {
14345    const mounted = {
14346      current: true,
14347      unmount: () => () => {
14348        mounted.current = false;
14349      }
14350    };
14351    return mounted;
14352  }
14353  
14354  function useMemoOne(getResult, inputs) {
14355    const [initial] = (0,external_React_.useState)(() => ({
14356      inputs,
14357      result: getResult()
14358    }));
14359    const committed = (0,external_React_.useRef)();
14360    const prevCache = committed.current;
14361    let cache = prevCache;
14362  
14363    if (cache) {
14364      const useCache = Boolean(inputs && cache.inputs && areInputsEqual(inputs, cache.inputs));
14365  
14366      if (!useCache) {
14367        cache = {
14368          inputs,
14369          result: getResult()
14370        };
14371      }
14372    } else {
14373      cache = initial;
14374    }
14375  
14376    (0,external_React_.useEffect)(() => {
14377      committed.current = cache;
14378  
14379      if (prevCache == initial) {
14380        initial.inputs = initial.result = undefined;
14381      }
14382    }, [cache]);
14383    return cache.result;
14384  }
14385  
14386  function areInputsEqual(next, prev) {
14387    if (next.length !== prev.length) {
14388      return false;
14389    }
14390  
14391    for (let i = 0; i < next.length; i++) {
14392      if (next[i] !== prev[i]) {
14393        return false;
14394      }
14395    }
14396  
14397    return true;
14398  }
14399  
14400  function react_spring_shared_esm_usePrev(value) {
14401    const prevRef = (0,external_React_.useRef)();
14402    (0,external_React_.useEffect)(() => {
14403      prevRef.current = value;
14404    });
14405    return prevRef.current;
14406  }
14407  
14408  const react_spring_shared_esm_useLayoutEffect = typeof window !== 'undefined' && window.document && window.document.createElement ? external_React_.useLayoutEffect : external_React_.useEffect;
14409  
14410  
14411  
14412  ;// CONCATENATED MODULE: ./node_modules/@react-spring/animated/dist/react-spring-animated.esm.js
14413  
14414  
14415  
14416  
14417  const $node = Symbol.for('Animated:node');
14418  const isAnimated = value => !!value && value[$node] === value;
14419  const getAnimated = owner => owner && owner[$node];
14420  const setAnimated = (owner, node) => defineHidden(owner, $node, node);
14421  const getPayload = owner => owner && owner[$node] && owner[$node].getPayload();
14422  class Animated {
14423    constructor() {
14424      this.payload = void 0;
14425      setAnimated(this, this);
14426    }
14427  
14428    getPayload() {
14429      return this.payload || [];
14430    }
14431  
14432  }
14433  
14434  class AnimatedValue extends Animated {
14435    constructor(_value) {
14436      super();
14437      this.done = true;
14438      this.elapsedTime = void 0;
14439      this.lastPosition = void 0;
14440      this.lastVelocity = void 0;
14441      this.v0 = void 0;
14442      this.durationProgress = 0;
14443      this._value = _value;
14444  
14445      if (react_spring_shared_esm_is.num(this._value)) {
14446        this.lastPosition = this._value;
14447      }
14448    }
14449  
14450    static create(value) {
14451      return new AnimatedValue(value);
14452    }
14453  
14454    getPayload() {
14455      return [this];
14456    }
14457  
14458    getValue() {
14459      return this._value;
14460    }
14461  
14462    setValue(value, step) {
14463      if (react_spring_shared_esm_is.num(value)) {
14464        this.lastPosition = value;
14465  
14466        if (step) {
14467          value = Math.round(value / step) * step;
14468  
14469          if (this.done) {
14470            this.lastPosition = value;
14471          }
14472        }
14473      }
14474  
14475      if (this._value === value) {
14476        return false;
14477      }
14478  
14479      this._value = value;
14480      return true;
14481    }
14482  
14483    reset() {
14484      const {
14485        done
14486      } = this;
14487      this.done = false;
14488  
14489      if (react_spring_shared_esm_is.num(this._value)) {
14490        this.elapsedTime = 0;
14491        this.durationProgress = 0;
14492        this.lastPosition = this._value;
14493        if (done) this.lastVelocity = null;
14494        this.v0 = null;
14495      }
14496    }
14497  
14498  }
14499  
14500  class AnimatedString extends AnimatedValue {
14501    constructor(value) {
14502      super(0);
14503      this._string = null;
14504      this._toString = void 0;
14505      this._toString = createInterpolator({
14506        output: [value, value]
14507      });
14508    }
14509  
14510    static create(value) {
14511      return new AnimatedString(value);
14512    }
14513  
14514    getValue() {
14515      let value = this._string;
14516      return value == null ? this._string = this._toString(this._value) : value;
14517    }
14518  
14519    setValue(value) {
14520      if (react_spring_shared_esm_is.str(value)) {
14521        if (value == this._string) {
14522          return false;
14523        }
14524  
14525        this._string = value;
14526        this._value = 1;
14527      } else if (super.setValue(value)) {
14528        this._string = null;
14529      } else {
14530        return false;
14531      }
14532  
14533      return true;
14534    }
14535  
14536    reset(goal) {
14537      if (goal) {
14538        this._toString = createInterpolator({
14539          output: [this.getValue(), goal]
14540        });
14541      }
14542  
14543      this._value = 0;
14544      super.reset();
14545    }
14546  
14547  }
14548  
14549  const TreeContext = {
14550    dependencies: null
14551  };
14552  
14553  class AnimatedObject extends Animated {
14554    constructor(source) {
14555      super();
14556      this.source = source;
14557      this.setValue(source);
14558    }
14559  
14560    getValue(animated) {
14561      const values = {};
14562      eachProp(this.source, (source, key) => {
14563        if (isAnimated(source)) {
14564          values[key] = source.getValue(animated);
14565        } else if (hasFluidValue(source)) {
14566          values[key] = getFluidValue(source);
14567        } else if (!animated) {
14568          values[key] = source;
14569        }
14570      });
14571      return values;
14572    }
14573  
14574    setValue(source) {
14575      this.source = source;
14576      this.payload = this._makePayload(source);
14577    }
14578  
14579    reset() {
14580      if (this.payload) {
14581        react_spring_shared_esm_each(this.payload, node => node.reset());
14582      }
14583    }
14584  
14585    _makePayload(source) {
14586      if (source) {
14587        const payload = new Set();
14588        eachProp(source, this._addToPayload, payload);
14589        return Array.from(payload);
14590      }
14591    }
14592  
14593    _addToPayload(source) {
14594      if (TreeContext.dependencies && hasFluidValue(source)) {
14595        TreeContext.dependencies.add(source);
14596      }
14597  
14598      const payload = getPayload(source);
14599  
14600      if (payload) {
14601        react_spring_shared_esm_each(payload, node => this.add(node));
14602      }
14603    }
14604  
14605  }
14606  
14607  class AnimatedArray extends AnimatedObject {
14608    constructor(source) {
14609      super(source);
14610    }
14611  
14612    static create(source) {
14613      return new AnimatedArray(source);
14614    }
14615  
14616    getValue() {
14617      return this.source.map(node => node.getValue());
14618    }
14619  
14620    setValue(source) {
14621      const payload = this.getPayload();
14622  
14623      if (source.length == payload.length) {
14624        return payload.map((node, i) => node.setValue(source[i])).some(Boolean);
14625      }
14626  
14627      super.setValue(source.map(makeAnimated));
14628      return true;
14629    }
14630  
14631  }
14632  
14633  function makeAnimated(value) {
14634    const nodeType = isAnimatedString(value) ? AnimatedString : AnimatedValue;
14635    return nodeType.create(value);
14636  }
14637  
14638  function getAnimatedType(value) {
14639    const parentNode = getAnimated(value);
14640    return parentNode ? parentNode.constructor : react_spring_shared_esm_is.arr(value) ? AnimatedArray : isAnimatedString(value) ? AnimatedString : AnimatedValue;
14641  }
14642  
14643  function react_spring_animated_esm_extends() {
14644    react_spring_animated_esm_extends = Object.assign || function (target) {
14645      for (var i = 1; i < arguments.length; i++) {
14646        var source = arguments[i];
14647  
14648        for (var key in source) {
14649          if (Object.prototype.hasOwnProperty.call(source, key)) {
14650            target[key] = source[key];
14651          }
14652        }
14653      }
14654  
14655      return target;
14656    };
14657  
14658    return react_spring_animated_esm_extends.apply(this, arguments);
14659  }
14660  
14661  const withAnimated = (Component, host) => {
14662    const hasInstance = !react_spring_shared_esm_is.fun(Component) || Component.prototype && Component.prototype.isReactComponent;
14663    return (0,external_React_.forwardRef)((givenProps, givenRef) => {
14664      const instanceRef = (0,external_React_.useRef)(null);
14665      const ref = hasInstance && (0,external_React_.useCallback)(value => {
14666        instanceRef.current = updateRef(givenRef, value);
14667      }, [givenRef]);
14668      const [props, deps] = getAnimatedState(givenProps, host);
14669      const forceUpdate = react_spring_shared_esm_useForceUpdate();
14670  
14671      const callback = () => {
14672        const instance = instanceRef.current;
14673  
14674        if (hasInstance && !instance) {
14675          return;
14676        }
14677  
14678        const didUpdate = instance ? host.applyAnimatedValues(instance, props.getValue(true)) : false;
14679  
14680        if (didUpdate === false) {
14681          forceUpdate();
14682        }
14683      };
14684  
14685      const observer = new PropsObserver(callback, deps);
14686      const observerRef = (0,external_React_.useRef)();
14687      react_spring_shared_esm_useLayoutEffect(() => {
14688        const lastObserver = observerRef.current;
14689        observerRef.current = observer;
14690        react_spring_shared_esm_each(deps, dep => addFluidObserver(dep, observer));
14691  
14692        if (lastObserver) {
14693          react_spring_shared_esm_each(lastObserver.deps, dep => removeFluidObserver(dep, lastObserver));
14694          raf.cancel(lastObserver.update);
14695        }
14696      });
14697      (0,external_React_.useEffect)(callback, []);
14698      react_spring_shared_esm_useOnce(() => () => {
14699        const observer = observerRef.current;
14700        react_spring_shared_esm_each(observer.deps, dep => removeFluidObserver(dep, observer));
14701      });
14702      const usedProps = host.getComponentProps(props.getValue());
14703      return external_React_.createElement(Component, react_spring_animated_esm_extends({}, usedProps, {
14704        ref: ref
14705      }));
14706    });
14707  };
14708  
14709  class PropsObserver {
14710    constructor(update, deps) {
14711      this.update = update;
14712      this.deps = deps;
14713    }
14714  
14715    eventObserved(event) {
14716      if (event.type == 'change') {
14717        raf.write(this.update);
14718      }
14719    }
14720  
14721  }
14722  
14723  function getAnimatedState(props, host) {
14724    const dependencies = new Set();
14725    TreeContext.dependencies = dependencies;
14726    if (props.style) props = react_spring_animated_esm_extends({}, props, {
14727      style: host.createAnimatedStyle(props.style)
14728    });
14729    props = new AnimatedObject(props);
14730    TreeContext.dependencies = null;
14731    return [props, dependencies];
14732  }
14733  
14734  function updateRef(ref, value) {
14735    if (ref) {
14736      if (react_spring_shared_esm_is.fun(ref)) ref(value);else ref.current = value;
14737    }
14738  
14739    return value;
14740  }
14741  
14742  const cacheKey = Symbol.for('AnimatedComponent');
14743  const createHost = (components, {
14744    applyAnimatedValues: _applyAnimatedValues = () => false,
14745    createAnimatedStyle: _createAnimatedStyle = style => new AnimatedObject(style),
14746    getComponentProps: _getComponentProps = props => props
14747  } = {}) => {
14748    const hostConfig = {
14749      applyAnimatedValues: _applyAnimatedValues,
14750      createAnimatedStyle: _createAnimatedStyle,
14751      getComponentProps: _getComponentProps
14752    };
14753  
14754    const animated = Component => {
14755      const displayName = getDisplayName(Component) || 'Anonymous';
14756  
14757      if (react_spring_shared_esm_is.str(Component)) {
14758        Component = animated[Component] || (animated[Component] = withAnimated(Component, hostConfig));
14759      } else {
14760        Component = Component[cacheKey] || (Component[cacheKey] = withAnimated(Component, hostConfig));
14761      }
14762  
14763      Component.displayName = `Animated($displayName})`;
14764      return Component;
14765    };
14766  
14767    eachProp(components, (Component, key) => {
14768      if (react_spring_shared_esm_is.arr(components)) {
14769        key = getDisplayName(Component);
14770      }
14771  
14772      animated[key] = animated(Component);
14773    });
14774    return {
14775      animated
14776    };
14777  };
14778  
14779  const getDisplayName = arg => react_spring_shared_esm_is.str(arg) ? arg : arg && react_spring_shared_esm_is.str(arg.displayName) ? arg.displayName : react_spring_shared_esm_is.fun(arg) && arg.name || null;
14780  
14781  
14782  
14783  ;// CONCATENATED MODULE: ./node_modules/@react-spring/core/dist/react-spring-core.esm.js
14784  
14785  
14786  
14787  
14788  
14789  
14790  
14791  
14792  function react_spring_core_esm_extends() {
14793    react_spring_core_esm_extends = Object.assign || function (target) {
14794      for (var i = 1; i < arguments.length; i++) {
14795        var source = arguments[i];
14796  
14797        for (var key in source) {
14798          if (Object.prototype.hasOwnProperty.call(source, key)) {
14799            target[key] = source[key];
14800          }
14801        }
14802      }
14803  
14804      return target;
14805    };
14806  
14807    return react_spring_core_esm_extends.apply(this, arguments);
14808  }
14809  
14810  function callProp(value, ...args) {
14811    return react_spring_shared_esm_is.fun(value) ? value(...args) : value;
14812  }
14813  const matchProp = (value, key) => value === true || !!(key && value && (react_spring_shared_esm_is.fun(value) ? value(key) : react_spring_shared_esm_toArray(value).includes(key)));
14814  const resolveProp = (prop, key) => react_spring_shared_esm_is.obj(prop) ? key && prop[key] : prop;
14815  const getDefaultProp = (props, key) => props.default === true ? props[key] : props.default ? props.default[key] : undefined;
14816  
14817  const noopTransform = value => value;
14818  
14819  const getDefaultProps = (props, transform = noopTransform) => {
14820    let keys = DEFAULT_PROPS;
14821  
14822    if (props.default && props.default !== true) {
14823      props = props.default;
14824      keys = Object.keys(props);
14825    }
14826  
14827    const defaults = {};
14828  
14829    for (const key of keys) {
14830      const value = transform(props[key], key);
14831  
14832      if (!react_spring_shared_esm_is.und(value)) {
14833        defaults[key] = value;
14834      }
14835    }
14836  
14837    return defaults;
14838  };
14839  const DEFAULT_PROPS = ['config', 'onProps', 'onStart', 'onChange', 'onPause', 'onResume', 'onRest'];
14840  const RESERVED_PROPS = {
14841    config: 1,
14842    from: 1,
14843    to: 1,
14844    ref: 1,
14845    loop: 1,
14846    reset: 1,
14847    pause: 1,
14848    cancel: 1,
14849    reverse: 1,
14850    immediate: 1,
14851    default: 1,
14852    delay: 1,
14853    onProps: 1,
14854    onStart: 1,
14855    onChange: 1,
14856    onPause: 1,
14857    onResume: 1,
14858    onRest: 1,
14859    onResolve: 1,
14860    items: 1,
14861    trail: 1,
14862    sort: 1,
14863    expires: 1,
14864    initial: 1,
14865    enter: 1,
14866    update: 1,
14867    leave: 1,
14868    children: 1,
14869    onDestroyed: 1,
14870    keys: 1,
14871    callId: 1,
14872    parentId: 1
14873  };
14874  
14875  function getForwardProps(props) {
14876    const forward = {};
14877    let count = 0;
14878    eachProp(props, (value, prop) => {
14879      if (!RESERVED_PROPS[prop]) {
14880        forward[prop] = value;
14881        count++;
14882      }
14883    });
14884  
14885    if (count) {
14886      return forward;
14887    }
14888  }
14889  
14890  function inferTo(props) {
14891    const to = getForwardProps(props);
14892  
14893    if (to) {
14894      const out = {
14895        to
14896      };
14897      eachProp(props, (val, key) => key in to || (out[key] = val));
14898      return out;
14899    }
14900  
14901    return react_spring_core_esm_extends({}, props);
14902  }
14903  function computeGoal(value) {
14904    value = getFluidValue(value);
14905    return react_spring_shared_esm_is.arr(value) ? value.map(computeGoal) : isAnimatedString(value) ? globals.createStringInterpolator({
14906      range: [0, 1],
14907      output: [value, value]
14908    })(1) : value;
14909  }
14910  function hasProps(props) {
14911    for (const _ in props) return true;
14912  
14913    return false;
14914  }
14915  function isAsyncTo(to) {
14916    return react_spring_shared_esm_is.fun(to) || react_spring_shared_esm_is.arr(to) && react_spring_shared_esm_is.obj(to[0]);
14917  }
14918  function detachRefs(ctrl, ref) {
14919    var _ctrl$ref;
14920  
14921    (_ctrl$ref = ctrl.ref) == null ? void 0 : _ctrl$ref.delete(ctrl);
14922    ref == null ? void 0 : ref.delete(ctrl);
14923  }
14924  function replaceRef(ctrl, ref) {
14925    if (ref && ctrl.ref !== ref) {
14926      var _ctrl$ref2;
14927  
14928      (_ctrl$ref2 = ctrl.ref) == null ? void 0 : _ctrl$ref2.delete(ctrl);
14929      ref.add(ctrl);
14930      ctrl.ref = ref;
14931    }
14932  }
14933  
14934  function useChain(refs, timeSteps, timeFrame = 1000) {
14935    useLayoutEffect(() => {
14936      if (timeSteps) {
14937        let prevDelay = 0;
14938        each(refs, (ref, i) => {
14939          const controllers = ref.current;
14940  
14941          if (controllers.length) {
14942            let delay = timeFrame * timeSteps[i];
14943            if (isNaN(delay)) delay = prevDelay;else prevDelay = delay;
14944            each(controllers, ctrl => {
14945              each(ctrl.queue, props => {
14946                const memoizedDelayProp = props.delay;
14947  
14948                props.delay = key => delay + callProp(memoizedDelayProp || 0, key);
14949              });
14950            });
14951            ref.start();
14952          }
14953        });
14954      } else {
14955        let p = Promise.resolve();
14956        each(refs, ref => {
14957          const controllers = ref.current;
14958  
14959          if (controllers.length) {
14960            const queues = controllers.map(ctrl => {
14961              const q = ctrl.queue;
14962              ctrl.queue = [];
14963              return q;
14964            });
14965            p = p.then(() => {
14966              each(controllers, (ctrl, i) => each(queues[i] || [], update => ctrl.queue.push(update)));
14967              return Promise.all(ref.start());
14968            });
14969          }
14970        });
14971      }
14972    });
14973  }
14974  
14975  const config = {
14976    default: {
14977      tension: 170,
14978      friction: 26
14979    },
14980    gentle: {
14981      tension: 120,
14982      friction: 14
14983    },
14984    wobbly: {
14985      tension: 180,
14986      friction: 12
14987    },
14988    stiff: {
14989      tension: 210,
14990      friction: 20
14991    },
14992    slow: {
14993      tension: 280,
14994      friction: 60
14995    },
14996    molasses: {
14997      tension: 280,
14998      friction: 120
14999    }
15000  };
15001  const c1 = 1.70158;
15002  const c2 = c1 * 1.525;
15003  const c3 = c1 + 1;
15004  const c4 = 2 * Math.PI / 3;
15005  const c5 = 2 * Math.PI / 4.5;
15006  
15007  const bounceOut = x => {
15008    const n1 = 7.5625;
15009    const d1 = 2.75;
15010  
15011    if (x < 1 / d1) {
15012      return n1 * x * x;
15013    } else if (x < 2 / d1) {
15014      return n1 * (x -= 1.5 / d1) * x + 0.75;
15015    } else if (x < 2.5 / d1) {
15016      return n1 * (x -= 2.25 / d1) * x + 0.9375;
15017    } else {
15018      return n1 * (x -= 2.625 / d1) * x + 0.984375;
15019    }
15020  };
15021  
15022  const easings = {
15023    linear: x => x,
15024    easeInQuad: x => x * x,
15025    easeOutQuad: x => 1 - (1 - x) * (1 - x),
15026    easeInOutQuad: x => x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2,
15027    easeInCubic: x => x * x * x,
15028    easeOutCubic: x => 1 - Math.pow(1 - x, 3),
15029    easeInOutCubic: x => x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2,
15030    easeInQuart: x => x * x * x * x,
15031    easeOutQuart: x => 1 - Math.pow(1 - x, 4),
15032    easeInOutQuart: x => x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2,
15033    easeInQuint: x => x * x * x * x * x,
15034    easeOutQuint: x => 1 - Math.pow(1 - x, 5),
15035    easeInOutQuint: x => x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2,
15036    easeInSine: x => 1 - Math.cos(x * Math.PI / 2),
15037    easeOutSine: x => Math.sin(x * Math.PI / 2),
15038    easeInOutSine: x => -(Math.cos(Math.PI * x) - 1) / 2,
15039    easeInExpo: x => x === 0 ? 0 : Math.pow(2, 10 * x - 10),
15040    easeOutExpo: x => x === 1 ? 1 : 1 - Math.pow(2, -10 * x),
15041    easeInOutExpo: x => x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? Math.pow(2, 20 * x - 10) / 2 : (2 - Math.pow(2, -20 * x + 10)) / 2,
15042    easeInCirc: x => 1 - Math.sqrt(1 - Math.pow(x, 2)),
15043    easeOutCirc: x => Math.sqrt(1 - Math.pow(x - 1, 2)),
15044    easeInOutCirc: x => x < 0.5 ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2 : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2,
15045    easeInBack: x => c3 * x * x * x - c1 * x * x,
15046    easeOutBack: x => 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2),
15047    easeInOutBack: x => x < 0.5 ? Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2) / 2 : (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2,
15048    easeInElastic: x => x === 0 ? 0 : x === 1 ? 1 : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4),
15049    easeOutElastic: x => x === 0 ? 0 : x === 1 ? 1 : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1,
15050    easeInOutElastic: x => x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2 : Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5) / 2 + 1,
15051    easeInBounce: x => 1 - bounceOut(1 - x),
15052    easeOutBounce: bounceOut,
15053    easeInOutBounce: x => x < 0.5 ? (1 - bounceOut(1 - 2 * x)) / 2 : (1 + bounceOut(2 * x - 1)) / 2
15054  };
15055  
15056  const defaults = react_spring_core_esm_extends({}, config.default, {
15057    mass: 1,
15058    damping: 1,
15059    easing: easings.linear,
15060    clamp: false
15061  });
15062  
15063  class AnimationConfig {
15064    constructor() {
15065      this.tension = void 0;
15066      this.friction = void 0;
15067      this.frequency = void 0;
15068      this.damping = void 0;
15069      this.mass = void 0;
15070      this.velocity = 0;
15071      this.restVelocity = void 0;
15072      this.precision = void 0;
15073      this.progress = void 0;
15074      this.duration = void 0;
15075      this.easing = void 0;
15076      this.clamp = void 0;
15077      this.bounce = void 0;
15078      this.decay = void 0;
15079      this.round = void 0;
15080      Object.assign(this, defaults);
15081    }
15082  
15083  }
15084  function mergeConfig(config, newConfig, defaultConfig) {
15085    if (defaultConfig) {
15086      defaultConfig = react_spring_core_esm_extends({}, defaultConfig);
15087      sanitizeConfig(defaultConfig, newConfig);
15088      newConfig = react_spring_core_esm_extends({}, defaultConfig, newConfig);
15089    }
15090  
15091    sanitizeConfig(config, newConfig);
15092    Object.assign(config, newConfig);
15093  
15094    for (const key in defaults) {
15095      if (config[key] == null) {
15096        config[key] = defaults[key];
15097      }
15098    }
15099  
15100    let {
15101      mass,
15102      frequency,
15103      damping
15104    } = config;
15105  
15106    if (!react_spring_shared_esm_is.und(frequency)) {
15107      if (frequency < 0.01) frequency = 0.01;
15108      if (damping < 0) damping = 0;
15109      config.tension = Math.pow(2 * Math.PI / frequency, 2) * mass;
15110      config.friction = 4 * Math.PI * damping * mass / frequency;
15111    }
15112  
15113    return config;
15114  }
15115  
15116  function sanitizeConfig(config, props) {
15117    if (!react_spring_shared_esm_is.und(props.decay)) {
15118      config.duration = undefined;
15119    } else {
15120      const isTensionConfig = !react_spring_shared_esm_is.und(props.tension) || !react_spring_shared_esm_is.und(props.friction);
15121  
15122      if (isTensionConfig || !react_spring_shared_esm_is.und(props.frequency) || !react_spring_shared_esm_is.und(props.damping) || !react_spring_shared_esm_is.und(props.mass)) {
15123        config.duration = undefined;
15124        config.decay = undefined;
15125      }
15126  
15127      if (isTensionConfig) {
15128        config.frequency = undefined;
15129      }
15130    }
15131  }
15132  
15133  const emptyArray = [];
15134  class Animation {
15135    constructor() {
15136      this.changed = false;
15137      this.values = emptyArray;
15138      this.toValues = null;
15139      this.fromValues = emptyArray;
15140      this.to = void 0;
15141      this.from = void 0;
15142      this.config = new AnimationConfig();
15143      this.immediate = false;
15144    }
15145  
15146  }
15147  
15148  function scheduleProps(callId, {
15149    key,
15150    props,
15151    defaultProps,
15152    state,
15153    actions
15154  }) {
15155    return new Promise((resolve, reject) => {
15156      var _props$cancel;
15157  
15158      let delay;
15159      let timeout;
15160      let cancel = matchProp((_props$cancel = props.cancel) != null ? _props$cancel : defaultProps == null ? void 0 : defaultProps.cancel, key);
15161  
15162      if (cancel) {
15163        onStart();
15164      } else {
15165        if (!react_spring_shared_esm_is.und(props.pause)) {
15166          state.paused = matchProp(props.pause, key);
15167        }
15168  
15169        let pause = defaultProps == null ? void 0 : defaultProps.pause;
15170  
15171        if (pause !== true) {
15172          pause = state.paused || matchProp(pause, key);
15173        }
15174  
15175        delay = callProp(props.delay || 0, key);
15176  
15177        if (pause) {
15178          state.resumeQueue.add(onResume);
15179          actions.pause();
15180        } else {
15181          actions.resume();
15182          onResume();
15183        }
15184      }
15185  
15186      function onPause() {
15187        state.resumeQueue.add(onResume);
15188        state.timeouts.delete(timeout);
15189        timeout.cancel();
15190        delay = timeout.time - raf.now();
15191      }
15192  
15193      function onResume() {
15194        if (delay > 0 && !globals.skipAnimation) {
15195          state.delayed = true;
15196          timeout = raf.setTimeout(onStart, delay);
15197          state.pauseQueue.add(onPause);
15198          state.timeouts.add(timeout);
15199        } else {
15200          onStart();
15201        }
15202      }
15203  
15204      function onStart() {
15205        if (state.delayed) {
15206          state.delayed = false;
15207        }
15208  
15209        state.pauseQueue.delete(onPause);
15210        state.timeouts.delete(timeout);
15211  
15212        if (callId <= (state.cancelId || 0)) {
15213          cancel = true;
15214        }
15215  
15216        try {
15217          actions.start(react_spring_core_esm_extends({}, props, {
15218            callId,
15219            cancel
15220          }), resolve);
15221        } catch (err) {
15222          reject(err);
15223        }
15224      }
15225    });
15226  }
15227  
15228  const getCombinedResult = (target, results) => results.length == 1 ? results[0] : results.some(result => result.cancelled) ? getCancelledResult(target.get()) : results.every(result => result.noop) ? getNoopResult(target.get()) : getFinishedResult(target.get(), results.every(result => result.finished));
15229  const getNoopResult = value => ({
15230    value,
15231    noop: true,
15232    finished: true,
15233    cancelled: false
15234  });
15235  const getFinishedResult = (value, finished, cancelled = false) => ({
15236    value,
15237    finished,
15238    cancelled
15239  });
15240  const getCancelledResult = value => ({
15241    value,
15242    cancelled: true,
15243    finished: false
15244  });
15245  
15246  function runAsync(to, props, state, target) {
15247    const {
15248      callId,
15249      parentId,
15250      onRest
15251    } = props;
15252    const {
15253      asyncTo: prevTo,
15254      promise: prevPromise
15255    } = state;
15256  
15257    if (!parentId && to === prevTo && !props.reset) {
15258      return prevPromise;
15259    }
15260  
15261    return state.promise = (async () => {
15262      state.asyncId = callId;
15263      state.asyncTo = to;
15264      const defaultProps = getDefaultProps(props, (value, key) => key === 'onRest' ? undefined : value);
15265      let preventBail;
15266      let bail;
15267      const bailPromise = new Promise((resolve, reject) => (preventBail = resolve, bail = reject));
15268  
15269      const bailIfEnded = bailSignal => {
15270        const bailResult = callId <= (state.cancelId || 0) && getCancelledResult(target) || callId !== state.asyncId && getFinishedResult(target, false);
15271  
15272        if (bailResult) {
15273          bailSignal.result = bailResult;
15274          bail(bailSignal);
15275          throw bailSignal;
15276        }
15277      };
15278  
15279      const animate = (arg1, arg2) => {
15280        const bailSignal = new BailSignal();
15281        const skipAnimationSignal = new SkipAniamtionSignal();
15282        return (async () => {
15283          if (globals.skipAnimation) {
15284            stopAsync(state);
15285            skipAnimationSignal.result = getFinishedResult(target, false);
15286            bail(skipAnimationSignal);
15287            throw skipAnimationSignal;
15288          }
15289  
15290          bailIfEnded(bailSignal);
15291          const props = react_spring_shared_esm_is.obj(arg1) ? react_spring_core_esm_extends({}, arg1) : react_spring_core_esm_extends({}, arg2, {
15292            to: arg1
15293          });
15294          props.parentId = callId;
15295          eachProp(defaultProps, (value, key) => {
15296            if (react_spring_shared_esm_is.und(props[key])) {
15297              props[key] = value;
15298            }
15299          });
15300          const result = await target.start(props);
15301          bailIfEnded(bailSignal);
15302  
15303          if (state.paused) {
15304            await new Promise(resume => {
15305              state.resumeQueue.add(resume);
15306            });
15307          }
15308  
15309          return result;
15310        })();
15311      };
15312  
15313      let result;
15314  
15315      if (globals.skipAnimation) {
15316        stopAsync(state);
15317        return getFinishedResult(target, false);
15318      }
15319  
15320      try {
15321        let animating;
15322  
15323        if (react_spring_shared_esm_is.arr(to)) {
15324          animating = (async queue => {
15325            for (const props of queue) {
15326              await animate(props);
15327            }
15328          })(to);
15329        } else {
15330            animating = Promise.resolve(to(animate, target.stop.bind(target)));
15331          }
15332  
15333        await Promise.all([animating.then(preventBail), bailPromise]);
15334        result = getFinishedResult(target.get(), true, false);
15335      } catch (err) {
15336        if (err instanceof BailSignal) {
15337          result = err.result;
15338        } else if (err instanceof SkipAniamtionSignal) {
15339          result = err.result;
15340        } else {
15341          throw err;
15342        }
15343      } finally {
15344        if (callId == state.asyncId) {
15345          state.asyncId = parentId;
15346          state.asyncTo = parentId ? prevTo : undefined;
15347          state.promise = parentId ? prevPromise : undefined;
15348        }
15349      }
15350  
15351      if (react_spring_shared_esm_is.fun(onRest)) {
15352        raf.batchedUpdates(() => {
15353          onRest(result, target, target.item);
15354        });
15355      }
15356  
15357      return result;
15358    })();
15359  }
15360  function stopAsync(state, cancelId) {
15361    flush(state.timeouts, t => t.cancel());
15362    state.pauseQueue.clear();
15363    state.resumeQueue.clear();
15364    state.asyncId = state.asyncTo = state.promise = undefined;
15365    if (cancelId) state.cancelId = cancelId;
15366  }
15367  class BailSignal extends Error {
15368    constructor() {
15369      super('An async animation has been interrupted. You see this error because you ' + 'forgot to use `await` or `.catch(...)` on its returned promise.');
15370      this.result = void 0;
15371    }
15372  
15373  }
15374  class SkipAniamtionSignal extends Error {
15375    constructor() {
15376      super('SkipAnimationSignal');
15377      this.result = void 0;
15378    }
15379  
15380  }
15381  
15382  const isFrameValue = value => value instanceof FrameValue;
15383  let nextId$1 = 1;
15384  class FrameValue extends FluidValue {
15385    constructor(...args) {
15386      super(...args);
15387      this.id = nextId$1++;
15388      this.key = void 0;
15389      this._priority = 0;
15390    }
15391  
15392    get priority() {
15393      return this._priority;
15394    }
15395  
15396    set priority(priority) {
15397      if (this._priority != priority) {
15398        this._priority = priority;
15399  
15400        this._onPriorityChange(priority);
15401      }
15402    }
15403  
15404    get() {
15405      const node = getAnimated(this);
15406      return node && node.getValue();
15407    }
15408  
15409    to(...args) {
15410      return globals.to(this, args);
15411    }
15412  
15413    interpolate(...args) {
15414      react_spring_shared_esm_deprecateInterpolate();
15415      return globals.to(this, args);
15416    }
15417  
15418    toJSON() {
15419      return this.get();
15420    }
15421  
15422    observerAdded(count) {
15423      if (count == 1) this._attach();
15424    }
15425  
15426    observerRemoved(count) {
15427      if (count == 0) this._detach();
15428    }
15429  
15430    _attach() {}
15431  
15432    _detach() {}
15433  
15434    _onChange(value, idle = false) {
15435      callFluidObservers(this, {
15436        type: 'change',
15437        parent: this,
15438        value,
15439        idle
15440      });
15441    }
15442  
15443    _onPriorityChange(priority) {
15444      if (!this.idle) {
15445        frameLoop.sort(this);
15446      }
15447  
15448      callFluidObservers(this, {
15449        type: 'priority',
15450        parent: this,
15451        priority
15452      });
15453    }
15454  
15455  }
15456  
15457  const $P = Symbol.for('SpringPhase');
15458  const HAS_ANIMATED = 1;
15459  const IS_ANIMATING = 2;
15460  const IS_PAUSED = 4;
15461  const hasAnimated = target => (target[$P] & HAS_ANIMATED) > 0;
15462  const isAnimating = target => (target[$P] & IS_ANIMATING) > 0;
15463  const isPaused = target => (target[$P] & IS_PAUSED) > 0;
15464  const setActiveBit = (target, active) => active ? target[$P] |= IS_ANIMATING | HAS_ANIMATED : target[$P] &= ~IS_ANIMATING;
15465  const setPausedBit = (target, paused) => paused ? target[$P] |= IS_PAUSED : target[$P] &= ~IS_PAUSED;
15466  
15467  class SpringValue extends FrameValue {
15468    constructor(arg1, arg2) {
15469      super();
15470      this.key = void 0;
15471      this.animation = new Animation();
15472      this.queue = void 0;
15473      this.defaultProps = {};
15474      this._state = {
15475        paused: false,
15476        delayed: false,
15477        pauseQueue: new Set(),
15478        resumeQueue: new Set(),
15479        timeouts: new Set()
15480      };
15481      this._pendingCalls = new Set();
15482      this._lastCallId = 0;
15483      this._lastToId = 0;
15484      this._memoizedDuration = 0;
15485  
15486      if (!react_spring_shared_esm_is.und(arg1) || !react_spring_shared_esm_is.und(arg2)) {
15487        const props = react_spring_shared_esm_is.obj(arg1) ? react_spring_core_esm_extends({}, arg1) : react_spring_core_esm_extends({}, arg2, {
15488          from: arg1
15489        });
15490  
15491        if (react_spring_shared_esm_is.und(props.default)) {
15492          props.default = true;
15493        }
15494  
15495        this.start(props);
15496      }
15497    }
15498  
15499    get idle() {
15500      return !(isAnimating(this) || this._state.asyncTo) || isPaused(this);
15501    }
15502  
15503    get goal() {
15504      return getFluidValue(this.animation.to);
15505    }
15506  
15507    get velocity() {
15508      const node = getAnimated(this);
15509      return node instanceof AnimatedValue ? node.lastVelocity || 0 : node.getPayload().map(node => node.lastVelocity || 0);
15510    }
15511  
15512    get hasAnimated() {
15513      return hasAnimated(this);
15514    }
15515  
15516    get isAnimating() {
15517      return isAnimating(this);
15518    }
15519  
15520    get isPaused() {
15521      return isPaused(this);
15522    }
15523  
15524    get isDelayed() {
15525      return this._state.delayed;
15526    }
15527  
15528    advance(dt) {
15529      let idle = true;
15530      let changed = false;
15531      const anim = this.animation;
15532      let {
15533        config,
15534        toValues
15535      } = anim;
15536      const payload = getPayload(anim.to);
15537  
15538      if (!payload && hasFluidValue(anim.to)) {
15539        toValues = react_spring_shared_esm_toArray(getFluidValue(anim.to));
15540      }
15541  
15542      anim.values.forEach((node, i) => {
15543        if (node.done) return;
15544        const to = node.constructor == AnimatedString ? 1 : payload ? payload[i].lastPosition : toValues[i];
15545        let finished = anim.immediate;
15546        let position = to;
15547  
15548        if (!finished) {
15549          position = node.lastPosition;
15550  
15551          if (config.tension <= 0) {
15552            node.done = true;
15553            return;
15554          }
15555  
15556          let elapsed = node.elapsedTime += dt;
15557          const from = anim.fromValues[i];
15558          const v0 = node.v0 != null ? node.v0 : node.v0 = react_spring_shared_esm_is.arr(config.velocity) ? config.velocity[i] : config.velocity;
15559          let velocity;
15560  
15561          if (!react_spring_shared_esm_is.und(config.duration)) {
15562            let p = 1;
15563  
15564            if (config.duration > 0) {
15565              if (this._memoizedDuration !== config.duration) {
15566                this._memoizedDuration = config.duration;
15567  
15568                if (node.durationProgress > 0) {
15569                  node.elapsedTime = config.duration * node.durationProgress;
15570                  elapsed = node.elapsedTime += dt;
15571                }
15572              }
15573  
15574              p = (config.progress || 0) + elapsed / this._memoizedDuration;
15575              p = p > 1 ? 1 : p < 0 ? 0 : p;
15576              node.durationProgress = p;
15577            }
15578  
15579            position = from + config.easing(p) * (to - from);
15580            velocity = (position - node.lastPosition) / dt;
15581            finished = p == 1;
15582          } else if (config.decay) {
15583              const decay = config.decay === true ? 0.998 : config.decay;
15584              const e = Math.exp(-(1 - decay) * elapsed);
15585              position = from + v0 / (1 - decay) * (1 - e);
15586              finished = Math.abs(node.lastPosition - position) < 0.1;
15587              velocity = v0 * e;
15588            } else {
15589                velocity = node.lastVelocity == null ? v0 : node.lastVelocity;
15590                const precision = config.precision || (from == to ? 0.005 : Math.min(1, Math.abs(to - from) * 0.001));
15591                const restVelocity = config.restVelocity || precision / 10;
15592                const bounceFactor = config.clamp ? 0 : config.bounce;
15593                const canBounce = !react_spring_shared_esm_is.und(bounceFactor);
15594                const isGrowing = from == to ? node.v0 > 0 : from < to;
15595                let isMoving;
15596                let isBouncing = false;
15597                const step = 1;
15598                const numSteps = Math.ceil(dt / step);
15599  
15600                for (let n = 0; n < numSteps; ++n) {
15601                  isMoving = Math.abs(velocity) > restVelocity;
15602  
15603                  if (!isMoving) {
15604                    finished = Math.abs(to - position) <= precision;
15605  
15606                    if (finished) {
15607                      break;
15608                    }
15609                  }
15610  
15611                  if (canBounce) {
15612                    isBouncing = position == to || position > to == isGrowing;
15613  
15614                    if (isBouncing) {
15615                      velocity = -velocity * bounceFactor;
15616                      position = to;
15617                    }
15618                  }
15619  
15620                  const springForce = -config.tension * 0.000001 * (position - to);
15621                  const dampingForce = -config.friction * 0.001 * velocity;
15622                  const acceleration = (springForce + dampingForce) / config.mass;
15623                  velocity = velocity + acceleration * step;
15624                  position = position + velocity * step;
15625                }
15626              }
15627  
15628          node.lastVelocity = velocity;
15629  
15630          if (Number.isNaN(position)) {
15631            console.warn(`Got NaN while animating:`, this);
15632            finished = true;
15633          }
15634        }
15635  
15636        if (payload && !payload[i].done) {
15637          finished = false;
15638        }
15639  
15640        if (finished) {
15641          node.done = true;
15642        } else {
15643          idle = false;
15644        }
15645  
15646        if (node.setValue(position, config.round)) {
15647          changed = true;
15648        }
15649      });
15650      const node = getAnimated(this);
15651      const currVal = node.getValue();
15652  
15653      if (idle) {
15654        const finalVal = getFluidValue(anim.to);
15655  
15656        if ((currVal !== finalVal || changed) && !config.decay) {
15657          node.setValue(finalVal);
15658  
15659          this._onChange(finalVal);
15660        } else if (changed && config.decay) {
15661          this._onChange(currVal);
15662        }
15663  
15664        this._stop();
15665      } else if (changed) {
15666        this._onChange(currVal);
15667      }
15668    }
15669  
15670    set(value) {
15671      raf.batchedUpdates(() => {
15672        this._stop();
15673  
15674        this._focus(value);
15675  
15676        this._set(value);
15677      });
15678      return this;
15679    }
15680  
15681    pause() {
15682      this._update({
15683        pause: true
15684      });
15685    }
15686  
15687    resume() {
15688      this._update({
15689        pause: false
15690      });
15691    }
15692  
15693    finish() {
15694      if (isAnimating(this)) {
15695        const {
15696          to,
15697          config
15698        } = this.animation;
15699        raf.batchedUpdates(() => {
15700          this._onStart();
15701  
15702          if (!config.decay) {
15703            this._set(to, false);
15704          }
15705  
15706          this._stop();
15707        });
15708      }
15709  
15710      return this;
15711    }
15712  
15713    update(props) {
15714      const queue = this.queue || (this.queue = []);
15715      queue.push(props);
15716      return this;
15717    }
15718  
15719    start(to, arg2) {
15720      let queue;
15721  
15722      if (!react_spring_shared_esm_is.und(to)) {
15723        queue = [react_spring_shared_esm_is.obj(to) ? to : react_spring_core_esm_extends({}, arg2, {
15724          to
15725        })];
15726      } else {
15727        queue = this.queue || [];
15728        this.queue = [];
15729      }
15730  
15731      return Promise.all(queue.map(props => {
15732        const up = this._update(props);
15733  
15734        return up;
15735      })).then(results => getCombinedResult(this, results));
15736    }
15737  
15738    stop(cancel) {
15739      const {
15740        to
15741      } = this.animation;
15742  
15743      this._focus(this.get());
15744  
15745      stopAsync(this._state, cancel && this._lastCallId);
15746      raf.batchedUpdates(() => this._stop(to, cancel));
15747      return this;
15748    }
15749  
15750    reset() {
15751      this._update({
15752        reset: true
15753      });
15754    }
15755  
15756    eventObserved(event) {
15757      if (event.type == 'change') {
15758        this._start();
15759      } else if (event.type == 'priority') {
15760        this.priority = event.priority + 1;
15761      }
15762    }
15763  
15764    _prepareNode(props) {
15765      const key = this.key || '';
15766      let {
15767        to,
15768        from
15769      } = props;
15770      to = react_spring_shared_esm_is.obj(to) ? to[key] : to;
15771  
15772      if (to == null || isAsyncTo(to)) {
15773        to = undefined;
15774      }
15775  
15776      from = react_spring_shared_esm_is.obj(from) ? from[key] : from;
15777  
15778      if (from == null) {
15779        from = undefined;
15780      }
15781  
15782      const range = {
15783        to,
15784        from
15785      };
15786  
15787      if (!hasAnimated(this)) {
15788        if (props.reverse) [to, from] = [from, to];
15789        from = getFluidValue(from);
15790  
15791        if (!react_spring_shared_esm_is.und(from)) {
15792          this._set(from);
15793        } else if (!getAnimated(this)) {
15794            this._set(to);
15795          }
15796      }
15797  
15798      return range;
15799    }
15800  
15801    _update(_ref, isLoop) {
15802      let props = react_spring_core_esm_extends({}, _ref);
15803  
15804      const {
15805        key,
15806        defaultProps
15807      } = this;
15808      if (props.default) Object.assign(defaultProps, getDefaultProps(props, (value, prop) => /^on/.test(prop) ? resolveProp(value, key) : value));
15809      mergeActiveFn(this, props, 'onProps');
15810      sendEvent(this, 'onProps', props, this);
15811  
15812      const range = this._prepareNode(props);
15813  
15814      if (Object.isFrozen(this)) {
15815        throw Error('Cannot animate a `SpringValue` object that is frozen. ' + 'Did you forget to pass your component to `animated(...)` before animating its props?');
15816      }
15817  
15818      const state = this._state;
15819      return scheduleProps(++this._lastCallId, {
15820        key,
15821        props,
15822        defaultProps,
15823        state,
15824        actions: {
15825          pause: () => {
15826            if (!isPaused(this)) {
15827              setPausedBit(this, true);
15828              flushCalls(state.pauseQueue);
15829              sendEvent(this, 'onPause', getFinishedResult(this, checkFinished(this, this.animation.to)), this);
15830            }
15831          },
15832          resume: () => {
15833            if (isPaused(this)) {
15834              setPausedBit(this, false);
15835  
15836              if (isAnimating(this)) {
15837                this._resume();
15838              }
15839  
15840              flushCalls(state.resumeQueue);
15841              sendEvent(this, 'onResume', getFinishedResult(this, checkFinished(this, this.animation.to)), this);
15842            }
15843          },
15844          start: this._merge.bind(this, range)
15845        }
15846      }).then(result => {
15847        if (props.loop && result.finished && !(isLoop && result.noop)) {
15848          const nextProps = createLoopUpdate(props);
15849  
15850          if (nextProps) {
15851            return this._update(nextProps, true);
15852          }
15853        }
15854  
15855        return result;
15856      });
15857    }
15858  
15859    _merge(range, props, resolve) {
15860      if (props.cancel) {
15861        this.stop(true);
15862        return resolve(getCancelledResult(this));
15863      }
15864  
15865      const hasToProp = !react_spring_shared_esm_is.und(range.to);
15866      const hasFromProp = !react_spring_shared_esm_is.und(range.from);
15867  
15868      if (hasToProp || hasFromProp) {
15869        if (props.callId > this._lastToId) {
15870          this._lastToId = props.callId;
15871        } else {
15872          return resolve(getCancelledResult(this));
15873        }
15874      }
15875  
15876      const {
15877        key,
15878        defaultProps,
15879        animation: anim
15880      } = this;
15881      const {
15882        to: prevTo,
15883        from: prevFrom
15884      } = anim;
15885      let {
15886        to = prevTo,
15887        from = prevFrom
15888      } = range;
15889  
15890      if (hasFromProp && !hasToProp && (!props.default || react_spring_shared_esm_is.und(to))) {
15891        to = from;
15892      }
15893  
15894      if (props.reverse) [to, from] = [from, to];
15895      const hasFromChanged = !isEqual(from, prevFrom);
15896  
15897      if (hasFromChanged) {
15898        anim.from = from;
15899      }
15900  
15901      from = getFluidValue(from);
15902      const hasToChanged = !isEqual(to, prevTo);
15903  
15904      if (hasToChanged) {
15905        this._focus(to);
15906      }
15907  
15908      const hasAsyncTo = isAsyncTo(props.to);
15909      const {
15910        config
15911      } = anim;
15912      const {
15913        decay,
15914        velocity
15915      } = config;
15916  
15917      if (hasToProp || hasFromProp) {
15918        config.velocity = 0;
15919      }
15920  
15921      if (props.config && !hasAsyncTo) {
15922        mergeConfig(config, callProp(props.config, key), props.config !== defaultProps.config ? callProp(defaultProps.config, key) : void 0);
15923      }
15924  
15925      let node = getAnimated(this);
15926  
15927      if (!node || react_spring_shared_esm_is.und(to)) {
15928        return resolve(getFinishedResult(this, true));
15929      }
15930  
15931      const reset = react_spring_shared_esm_is.und(props.reset) ? hasFromProp && !props.default : !react_spring_shared_esm_is.und(from) && matchProp(props.reset, key);
15932      const value = reset ? from : this.get();
15933      const goal = computeGoal(to);
15934      const isAnimatable = react_spring_shared_esm_is.num(goal) || react_spring_shared_esm_is.arr(goal) || isAnimatedString(goal);
15935      const immediate = !hasAsyncTo && (!isAnimatable || matchProp(defaultProps.immediate || props.immediate, key));
15936  
15937      if (hasToChanged) {
15938        const nodeType = getAnimatedType(to);
15939  
15940        if (nodeType !== node.constructor) {
15941          if (immediate) {
15942            node = this._set(goal);
15943          } else throw Error(`Cannot animate between $node.constructor.name} and $nodeType.name}, as the "to" prop suggests`);
15944        }
15945      }
15946  
15947      const goalType = node.constructor;
15948      let started = hasFluidValue(to);
15949      let finished = false;
15950  
15951      if (!started) {
15952        const hasValueChanged = reset || !hasAnimated(this) && hasFromChanged;
15953  
15954        if (hasToChanged || hasValueChanged) {
15955          finished = isEqual(computeGoal(value), goal);
15956          started = !finished;
15957        }
15958  
15959        if (!isEqual(anim.immediate, immediate) && !immediate || !isEqual(config.decay, decay) || !isEqual(config.velocity, velocity)) {
15960          started = true;
15961        }
15962      }
15963  
15964      if (finished && isAnimating(this)) {
15965        if (anim.changed && !reset) {
15966          started = true;
15967        } else if (!started) {
15968            this._stop(prevTo);
15969          }
15970      }
15971  
15972      if (!hasAsyncTo) {
15973        if (started || hasFluidValue(prevTo)) {
15974          anim.values = node.getPayload();
15975          anim.toValues = hasFluidValue(to) ? null : goalType == AnimatedString ? [1] : react_spring_shared_esm_toArray(goal);
15976        }
15977  
15978        if (anim.immediate != immediate) {
15979          anim.immediate = immediate;
15980  
15981          if (!immediate && !reset) {
15982            this._set(prevTo);
15983          }
15984        }
15985  
15986        if (started) {
15987          const {
15988            onRest
15989          } = anim;
15990          react_spring_shared_esm_each(ACTIVE_EVENTS, type => mergeActiveFn(this, props, type));
15991          const result = getFinishedResult(this, checkFinished(this, prevTo));
15992          flushCalls(this._pendingCalls, result);
15993  
15994          this._pendingCalls.add(resolve);
15995  
15996          if (anim.changed) raf.batchedUpdates(() => {
15997            anim.changed = !reset;
15998            onRest == null ? void 0 : onRest(result, this);
15999  
16000            if (reset) {
16001              callProp(defaultProps.onRest, result);
16002            } else {
16003                anim.onStart == null ? void 0 : anim.onStart(result, this);
16004              }
16005          });
16006        }
16007      }
16008  
16009      if (reset) {
16010        this._set(value);
16011      }
16012  
16013      if (hasAsyncTo) {
16014        resolve(runAsync(props.to, props, this._state, this));
16015      } else if (started) {
16016          this._start();
16017        } else if (isAnimating(this) && !hasToChanged) {
16018            this._pendingCalls.add(resolve);
16019          } else {
16020              resolve(getNoopResult(value));
16021            }
16022    }
16023  
16024    _focus(value) {
16025      const anim = this.animation;
16026  
16027      if (value !== anim.to) {
16028        if (getFluidObservers(this)) {
16029          this._detach();
16030        }
16031  
16032        anim.to = value;
16033  
16034        if (getFluidObservers(this)) {
16035          this._attach();
16036        }
16037      }
16038    }
16039  
16040    _attach() {
16041      let priority = 0;
16042      const {
16043        to
16044      } = this.animation;
16045  
16046      if (hasFluidValue(to)) {
16047        addFluidObserver(to, this);
16048  
16049        if (isFrameValue(to)) {
16050          priority = to.priority + 1;
16051        }
16052      }
16053  
16054      this.priority = priority;
16055    }
16056  
16057    _detach() {
16058      const {
16059        to
16060      } = this.animation;
16061  
16062      if (hasFluidValue(to)) {
16063        removeFluidObserver(to, this);
16064      }
16065    }
16066  
16067    _set(arg, idle = true) {
16068      const value = getFluidValue(arg);
16069  
16070      if (!react_spring_shared_esm_is.und(value)) {
16071        const oldNode = getAnimated(this);
16072  
16073        if (!oldNode || !isEqual(value, oldNode.getValue())) {
16074          const nodeType = getAnimatedType(value);
16075  
16076          if (!oldNode || oldNode.constructor != nodeType) {
16077            setAnimated(this, nodeType.create(value));
16078          } else {
16079            oldNode.setValue(value);
16080          }
16081  
16082          if (oldNode) {
16083            raf.batchedUpdates(() => {
16084              this._onChange(value, idle);
16085            });
16086          }
16087        }
16088      }
16089  
16090      return getAnimated(this);
16091    }
16092  
16093    _onStart() {
16094      const anim = this.animation;
16095  
16096      if (!anim.changed) {
16097        anim.changed = true;
16098        sendEvent(this, 'onStart', getFinishedResult(this, checkFinished(this, anim.to)), this);
16099      }
16100    }
16101  
16102    _onChange(value, idle) {
16103      if (!idle) {
16104        this._onStart();
16105  
16106        callProp(this.animation.onChange, value, this);
16107      }
16108  
16109      callProp(this.defaultProps.onChange, value, this);
16110  
16111      super._onChange(value, idle);
16112    }
16113  
16114    _start() {
16115      const anim = this.animation;
16116      getAnimated(this).reset(getFluidValue(anim.to));
16117  
16118      if (!anim.immediate) {
16119        anim.fromValues = anim.values.map(node => node.lastPosition);
16120      }
16121  
16122      if (!isAnimating(this)) {
16123        setActiveBit(this, true);
16124  
16125        if (!isPaused(this)) {
16126          this._resume();
16127        }
16128      }
16129    }
16130  
16131    _resume() {
16132      if (globals.skipAnimation) {
16133        this.finish();
16134      } else {
16135        frameLoop.start(this);
16136      }
16137    }
16138  
16139    _stop(goal, cancel) {
16140      if (isAnimating(this)) {
16141        setActiveBit(this, false);
16142        const anim = this.animation;
16143        react_spring_shared_esm_each(anim.values, node => {
16144          node.done = true;
16145        });
16146  
16147        if (anim.toValues) {
16148          anim.onChange = anim.onPause = anim.onResume = undefined;
16149        }
16150  
16151        callFluidObservers(this, {
16152          type: 'idle',
16153          parent: this
16154        });
16155        const result = cancel ? getCancelledResult(this.get()) : getFinishedResult(this.get(), checkFinished(this, goal != null ? goal : anim.to));
16156        flushCalls(this._pendingCalls, result);
16157  
16158        if (anim.changed) {
16159          anim.changed = false;
16160          sendEvent(this, 'onRest', result, this);
16161        }
16162      }
16163    }
16164  
16165  }
16166  
16167  function checkFinished(target, to) {
16168    const goal = computeGoal(to);
16169    const value = computeGoal(target.get());
16170    return isEqual(value, goal);
16171  }
16172  
16173  function createLoopUpdate(props, loop = props.loop, to = props.to) {
16174    let loopRet = callProp(loop);
16175  
16176    if (loopRet) {
16177      const overrides = loopRet !== true && inferTo(loopRet);
16178      const reverse = (overrides || props).reverse;
16179      const reset = !overrides || overrides.reset;
16180      return createUpdate(react_spring_core_esm_extends({}, props, {
16181        loop,
16182        default: false,
16183        pause: undefined,
16184        to: !reverse || isAsyncTo(to) ? to : undefined,
16185        from: reset ? props.from : undefined,
16186        reset
16187      }, overrides));
16188    }
16189  }
16190  function createUpdate(props) {
16191    const {
16192      to,
16193      from
16194    } = props = inferTo(props);
16195    const keys = new Set();
16196    if (react_spring_shared_esm_is.obj(to)) findDefined(to, keys);
16197    if (react_spring_shared_esm_is.obj(from)) findDefined(from, keys);
16198    props.keys = keys.size ? Array.from(keys) : null;
16199    return props;
16200  }
16201  function declareUpdate(props) {
16202    const update = createUpdate(props);
16203  
16204    if (react_spring_shared_esm_is.und(update.default)) {
16205      update.default = getDefaultProps(update);
16206    }
16207  
16208    return update;
16209  }
16210  
16211  function findDefined(values, keys) {
16212    eachProp(values, (value, key) => value != null && keys.add(key));
16213  }
16214  
16215  const ACTIVE_EVENTS = ['onStart', 'onRest', 'onChange', 'onPause', 'onResume'];
16216  
16217  function mergeActiveFn(target, props, type) {
16218    target.animation[type] = props[type] !== getDefaultProp(props, type) ? resolveProp(props[type], target.key) : undefined;
16219  }
16220  
16221  function sendEvent(target, type, ...args) {
16222    var _target$animation$typ, _target$animation, _target$defaultProps$, _target$defaultProps;
16223  
16224    (_target$animation$typ = (_target$animation = target.animation)[type]) == null ? void 0 : _target$animation$typ.call(_target$animation, ...args);
16225    (_target$defaultProps$ = (_target$defaultProps = target.defaultProps)[type]) == null ? void 0 : _target$defaultProps$.call(_target$defaultProps, ...args);
16226  }
16227  
16228  const BATCHED_EVENTS = ['onStart', 'onChange', 'onRest'];
16229  let nextId = 1;
16230  class Controller {
16231    constructor(props, flush) {
16232      this.id = nextId++;
16233      this.springs = {};
16234      this.queue = [];
16235      this.ref = void 0;
16236      this._flush = void 0;
16237      this._initialProps = void 0;
16238      this._lastAsyncId = 0;
16239      this._active = new Set();
16240      this._changed = new Set();
16241      this._started = false;
16242      this._item = void 0;
16243      this._state = {
16244        paused: false,
16245        pauseQueue: new Set(),
16246        resumeQueue: new Set(),
16247        timeouts: new Set()
16248      };
16249      this._events = {
16250        onStart: new Map(),
16251        onChange: new Map(),
16252        onRest: new Map()
16253      };
16254      this._onFrame = this._onFrame.bind(this);
16255  
16256      if (flush) {
16257        this._flush = flush;
16258      }
16259  
16260      if (props) {
16261        this.start(react_spring_core_esm_extends({
16262          default: true
16263        }, props));
16264      }
16265    }
16266  
16267    get idle() {
16268      return !this._state.asyncTo && Object.values(this.springs).every(spring => {
16269        return spring.idle && !spring.isDelayed && !spring.isPaused;
16270      });
16271    }
16272  
16273    get item() {
16274      return this._item;
16275    }
16276  
16277    set item(item) {
16278      this._item = item;
16279    }
16280  
16281    get() {
16282      const values = {};
16283      this.each((spring, key) => values[key] = spring.get());
16284      return values;
16285    }
16286  
16287    set(values) {
16288      for (const key in values) {
16289        const value = values[key];
16290  
16291        if (!react_spring_shared_esm_is.und(value)) {
16292          this.springs[key].set(value);
16293        }
16294      }
16295    }
16296  
16297    update(props) {
16298      if (props) {
16299        this.queue.push(createUpdate(props));
16300      }
16301  
16302      return this;
16303    }
16304  
16305    start(props) {
16306      let {
16307        queue
16308      } = this;
16309  
16310      if (props) {
16311        queue = react_spring_shared_esm_toArray(props).map(createUpdate);
16312      } else {
16313        this.queue = [];
16314      }
16315  
16316      if (this._flush) {
16317        return this._flush(this, queue);
16318      }
16319  
16320      prepareKeys(this, queue);
16321      return flushUpdateQueue(this, queue);
16322    }
16323  
16324    stop(arg, keys) {
16325      if (arg !== !!arg) {
16326        keys = arg;
16327      }
16328  
16329      if (keys) {
16330        const springs = this.springs;
16331        react_spring_shared_esm_each(react_spring_shared_esm_toArray(keys), key => springs[key].stop(!!arg));
16332      } else {
16333        stopAsync(this._state, this._lastAsyncId);
16334        this.each(spring => spring.stop(!!arg));
16335      }
16336  
16337      return this;
16338    }
16339  
16340    pause(keys) {
16341      if (react_spring_shared_esm_is.und(keys)) {
16342        this.start({
16343          pause: true
16344        });
16345      } else {
16346        const springs = this.springs;
16347        react_spring_shared_esm_each(react_spring_shared_esm_toArray(keys), key => springs[key].pause());
16348      }
16349  
16350      return this;
16351    }
16352  
16353    resume(keys) {
16354      if (react_spring_shared_esm_is.und(keys)) {
16355        this.start({
16356          pause: false
16357        });
16358      } else {
16359        const springs = this.springs;
16360        react_spring_shared_esm_each(react_spring_shared_esm_toArray(keys), key => springs[key].resume());
16361      }
16362  
16363      return this;
16364    }
16365  
16366    each(iterator) {
16367      eachProp(this.springs, iterator);
16368    }
16369  
16370    _onFrame() {
16371      const {
16372        onStart,
16373        onChange,
16374        onRest
16375      } = this._events;
16376      const active = this._active.size > 0;
16377      const changed = this._changed.size > 0;
16378  
16379      if (active && !this._started || changed && !this._started) {
16380        this._started = true;
16381        flush(onStart, ([onStart, result]) => {
16382          result.value = this.get();
16383          onStart(result, this, this._item);
16384        });
16385      }
16386  
16387      const idle = !active && this._started;
16388      const values = changed || idle && onRest.size ? this.get() : null;
16389  
16390      if (changed && onChange.size) {
16391        flush(onChange, ([onChange, result]) => {
16392          result.value = values;
16393          onChange(result, this, this._item);
16394        });
16395      }
16396  
16397      if (idle) {
16398        this._started = false;
16399        flush(onRest, ([onRest, result]) => {
16400          result.value = values;
16401          onRest(result, this, this._item);
16402        });
16403      }
16404    }
16405  
16406    eventObserved(event) {
16407      if (event.type == 'change') {
16408        this._changed.add(event.parent);
16409  
16410        if (!event.idle) {
16411          this._active.add(event.parent);
16412        }
16413      } else if (event.type == 'idle') {
16414        this._active.delete(event.parent);
16415      } else return;
16416  
16417      raf.onFrame(this._onFrame);
16418    }
16419  
16420  }
16421  function flushUpdateQueue(ctrl, queue) {
16422    return Promise.all(queue.map(props => flushUpdate(ctrl, props))).then(results => getCombinedResult(ctrl, results));
16423  }
16424  async function flushUpdate(ctrl, props, isLoop) {
16425    const {
16426      keys,
16427      to,
16428      from,
16429      loop,
16430      onRest,
16431      onResolve
16432    } = props;
16433    const defaults = react_spring_shared_esm_is.obj(props.default) && props.default;
16434  
16435    if (loop) {
16436      props.loop = false;
16437    }
16438  
16439    if (to === false) props.to = null;
16440    if (from === false) props.from = null;
16441    const asyncTo = react_spring_shared_esm_is.arr(to) || react_spring_shared_esm_is.fun(to) ? to : undefined;
16442  
16443    if (asyncTo) {
16444      props.to = undefined;
16445      props.onRest = undefined;
16446  
16447      if (defaults) {
16448        defaults.onRest = undefined;
16449      }
16450    } else {
16451        react_spring_shared_esm_each(BATCHED_EVENTS, key => {
16452          const handler = props[key];
16453  
16454          if (react_spring_shared_esm_is.fun(handler)) {
16455            const queue = ctrl['_events'][key];
16456  
16457            props[key] = ({
16458              finished,
16459              cancelled
16460            }) => {
16461              const result = queue.get(handler);
16462  
16463              if (result) {
16464                if (!finished) result.finished = false;
16465                if (cancelled) result.cancelled = true;
16466              } else {
16467                queue.set(handler, {
16468                  value: null,
16469                  finished: finished || false,
16470                  cancelled: cancelled || false
16471                });
16472              }
16473            };
16474  
16475            if (defaults) {
16476              defaults[key] = props[key];
16477            }
16478          }
16479        });
16480      }
16481  
16482    const state = ctrl['_state'];
16483  
16484    if (props.pause === !state.paused) {
16485      state.paused = props.pause;
16486      flushCalls(props.pause ? state.pauseQueue : state.resumeQueue);
16487    } else if (state.paused) {
16488        props.pause = true;
16489      }
16490  
16491    const promises = (keys || Object.keys(ctrl.springs)).map(key => ctrl.springs[key].start(props));
16492    const cancel = props.cancel === true || getDefaultProp(props, 'cancel') === true;
16493  
16494    if (asyncTo || cancel && state.asyncId) {
16495      promises.push(scheduleProps(++ctrl['_lastAsyncId'], {
16496        props,
16497        state,
16498        actions: {
16499          pause: noop,
16500          resume: noop,
16501  
16502          start(props, resolve) {
16503            if (cancel) {
16504              stopAsync(state, ctrl['_lastAsyncId']);
16505              resolve(getCancelledResult(ctrl));
16506            } else {
16507              props.onRest = onRest;
16508              resolve(runAsync(asyncTo, props, state, ctrl));
16509            }
16510          }
16511  
16512        }
16513      }));
16514    }
16515  
16516    if (state.paused) {
16517      await new Promise(resume => {
16518        state.resumeQueue.add(resume);
16519      });
16520    }
16521  
16522    const result = getCombinedResult(ctrl, await Promise.all(promises));
16523  
16524    if (loop && result.finished && !(isLoop && result.noop)) {
16525      const nextProps = createLoopUpdate(props, loop, to);
16526  
16527      if (nextProps) {
16528        prepareKeys(ctrl, [nextProps]);
16529        return flushUpdate(ctrl, nextProps, true);
16530      }
16531    }
16532  
16533    if (onResolve) {
16534      raf.batchedUpdates(() => onResolve(result, ctrl, ctrl.item));
16535    }
16536  
16537    return result;
16538  }
16539  function getSprings(ctrl, props) {
16540    const springs = react_spring_core_esm_extends({}, ctrl.springs);
16541  
16542    if (props) {
16543      react_spring_shared_esm_each(react_spring_shared_esm_toArray(props), props => {
16544        if (react_spring_shared_esm_is.und(props.keys)) {
16545          props = createUpdate(props);
16546        }
16547  
16548        if (!react_spring_shared_esm_is.obj(props.to)) {
16549          props = react_spring_core_esm_extends({}, props, {
16550            to: undefined
16551          });
16552        }
16553  
16554        prepareSprings(springs, props, key => {
16555          return createSpring(key);
16556        });
16557      });
16558    }
16559  
16560    setSprings(ctrl, springs);
16561    return springs;
16562  }
16563  function setSprings(ctrl, springs) {
16564    eachProp(springs, (spring, key) => {
16565      if (!ctrl.springs[key]) {
16566        ctrl.springs[key] = spring;
16567        addFluidObserver(spring, ctrl);
16568      }
16569    });
16570  }
16571  
16572  function createSpring(key, observer) {
16573    const spring = new SpringValue();
16574    spring.key = key;
16575  
16576    if (observer) {
16577      addFluidObserver(spring, observer);
16578    }
16579  
16580    return spring;
16581  }
16582  
16583  function prepareSprings(springs, props, create) {
16584    if (props.keys) {
16585      react_spring_shared_esm_each(props.keys, key => {
16586        const spring = springs[key] || (springs[key] = create(key));
16587        spring['_prepareNode'](props);
16588      });
16589    }
16590  }
16591  
16592  function prepareKeys(ctrl, queue) {
16593    react_spring_shared_esm_each(queue, props => {
16594      prepareSprings(ctrl.springs, props, key => {
16595        return createSpring(key, ctrl);
16596      });
16597    });
16598  }
16599  
16600  function _objectWithoutPropertiesLoose(source, excluded) {
16601    if (source == null) return {};
16602    var target = {};
16603    var sourceKeys = Object.keys(source);
16604    var key, i;
16605  
16606    for (i = 0; i < sourceKeys.length; i++) {
16607      key = sourceKeys[i];
16608      if (excluded.indexOf(key) >= 0) continue;
16609      target[key] = source[key];
16610    }
16611  
16612    return target;
16613  }
16614  
16615  const _excluded$3 = ["children"];
16616  const SpringContext = _ref => {
16617    let {
16618      children
16619    } = _ref,
16620        props = _objectWithoutPropertiesLoose(_ref, _excluded$3);
16621  
16622    const inherited = (0,external_React_.useContext)(ctx);
16623    const pause = props.pause || !!inherited.pause,
16624          immediate = props.immediate || !!inherited.immediate;
16625    props = useMemoOne(() => ({
16626      pause,
16627      immediate
16628    }), [pause, immediate]);
16629    const {
16630      Provider
16631    } = ctx;
16632    return external_React_.createElement(Provider, {
16633      value: props
16634    }, children);
16635  };
16636  const ctx = makeContext(SpringContext, {});
16637  SpringContext.Provider = ctx.Provider;
16638  SpringContext.Consumer = ctx.Consumer;
16639  
16640  function makeContext(target, init) {
16641    Object.assign(target, external_React_.createContext(init));
16642    target.Provider._context = target;
16643    target.Consumer._context = target;
16644    return target;
16645  }
16646  
16647  const SpringRef = () => {
16648    const current = [];
16649  
16650    const SpringRef = function SpringRef(props) {
16651      deprecateDirectCall();
16652      const results = [];
16653      react_spring_shared_esm_each(current, (ctrl, i) => {
16654        if (react_spring_shared_esm_is.und(props)) {
16655          results.push(ctrl.start());
16656        } else {
16657          const update = _getProps(props, ctrl, i);
16658  
16659          if (update) {
16660            results.push(ctrl.start(update));
16661          }
16662        }
16663      });
16664      return results;
16665    };
16666  
16667    SpringRef.current = current;
16668  
16669    SpringRef.add = function (ctrl) {
16670      if (!current.includes(ctrl)) {
16671        current.push(ctrl);
16672      }
16673    };
16674  
16675    SpringRef.delete = function (ctrl) {
16676      const i = current.indexOf(ctrl);
16677      if (~i) current.splice(i, 1);
16678    };
16679  
16680    SpringRef.pause = function () {
16681      react_spring_shared_esm_each(current, ctrl => ctrl.pause(...arguments));
16682      return this;
16683    };
16684  
16685    SpringRef.resume = function () {
16686      react_spring_shared_esm_each(current, ctrl => ctrl.resume(...arguments));
16687      return this;
16688    };
16689  
16690    SpringRef.set = function (values) {
16691      react_spring_shared_esm_each(current, ctrl => ctrl.set(values));
16692    };
16693  
16694    SpringRef.start = function (props) {
16695      const results = [];
16696      react_spring_shared_esm_each(current, (ctrl, i) => {
16697        if (react_spring_shared_esm_is.und(props)) {
16698          results.push(ctrl.start());
16699        } else {
16700          const update = this._getProps(props, ctrl, i);
16701  
16702          if (update) {
16703            results.push(ctrl.start(update));
16704          }
16705        }
16706      });
16707      return results;
16708    };
16709  
16710    SpringRef.stop = function () {
16711      react_spring_shared_esm_each(current, ctrl => ctrl.stop(...arguments));
16712      return this;
16713    };
16714  
16715    SpringRef.update = function (props) {
16716      react_spring_shared_esm_each(current, (ctrl, i) => ctrl.update(this._getProps(props, ctrl, i)));
16717      return this;
16718    };
16719  
16720    const _getProps = function _getProps(arg, ctrl, index) {
16721      return react_spring_shared_esm_is.fun(arg) ? arg(index, ctrl) : arg;
16722    };
16723  
16724    SpringRef._getProps = _getProps;
16725    return SpringRef;
16726  };
16727  
16728  function useSprings(length, props, deps) {
16729    const propsFn = react_spring_shared_esm_is.fun(props) && props;
16730    if (propsFn && !deps) deps = [];
16731    const ref = (0,external_React_.useMemo)(() => propsFn || arguments.length == 3 ? SpringRef() : void 0, []);
16732    const layoutId = (0,external_React_.useRef)(0);
16733    const forceUpdate = react_spring_shared_esm_useForceUpdate();
16734    const state = (0,external_React_.useMemo)(() => ({
16735      ctrls: [],
16736      queue: [],
16737  
16738      flush(ctrl, updates) {
16739        const springs = getSprings(ctrl, updates);
16740        const canFlushSync = layoutId.current > 0 && !state.queue.length && !Object.keys(springs).some(key => !ctrl.springs[key]);
16741        return canFlushSync ? flushUpdateQueue(ctrl, updates) : new Promise(resolve => {
16742          setSprings(ctrl, springs);
16743          state.queue.push(() => {
16744            resolve(flushUpdateQueue(ctrl, updates));
16745          });
16746          forceUpdate();
16747        });
16748      }
16749  
16750    }), []);
16751    const ctrls = (0,external_React_.useRef)([...state.ctrls]);
16752    const updates = [];
16753    const prevLength = react_spring_shared_esm_usePrev(length) || 0;
16754    (0,external_React_.useMemo)(() => {
16755      react_spring_shared_esm_each(ctrls.current.slice(length, prevLength), ctrl => {
16756        detachRefs(ctrl, ref);
16757        ctrl.stop(true);
16758      });
16759      ctrls.current.length = length;
16760      declareUpdates(prevLength, length);
16761    }, [length]);
16762    (0,external_React_.useMemo)(() => {
16763      declareUpdates(0, Math.min(prevLength, length));
16764    }, deps);
16765  
16766    function declareUpdates(startIndex, endIndex) {
16767      for (let i = startIndex; i < endIndex; i++) {
16768        const ctrl = ctrls.current[i] || (ctrls.current[i] = new Controller(null, state.flush));
16769        const update = propsFn ? propsFn(i, ctrl) : props[i];
16770  
16771        if (update) {
16772          updates[i] = declareUpdate(update);
16773        }
16774      }
16775    }
16776  
16777    const springs = ctrls.current.map((ctrl, i) => getSprings(ctrl, updates[i]));
16778    const context = (0,external_React_.useContext)(SpringContext);
16779    const prevContext = react_spring_shared_esm_usePrev(context);
16780    const hasContext = context !== prevContext && hasProps(context);
16781    react_spring_shared_esm_useLayoutEffect(() => {
16782      layoutId.current++;
16783      state.ctrls = ctrls.current;
16784      const {
16785        queue
16786      } = state;
16787  
16788      if (queue.length) {
16789        state.queue = [];
16790        react_spring_shared_esm_each(queue, cb => cb());
16791      }
16792  
16793      react_spring_shared_esm_each(ctrls.current, (ctrl, i) => {
16794        ref == null ? void 0 : ref.add(ctrl);
16795  
16796        if (hasContext) {
16797          ctrl.start({
16798            default: context
16799          });
16800        }
16801  
16802        const update = updates[i];
16803  
16804        if (update) {
16805          replaceRef(ctrl, update.ref);
16806  
16807          if (ctrl.ref) {
16808            ctrl.queue.push(update);
16809          } else {
16810            ctrl.start(update);
16811          }
16812        }
16813      });
16814    });
16815    react_spring_shared_esm_useOnce(() => () => {
16816      react_spring_shared_esm_each(state.ctrls, ctrl => ctrl.stop(true));
16817    });
16818    const values = springs.map(x => react_spring_core_esm_extends({}, x));
16819    return ref ? [values, ref] : values;
16820  }
16821  
16822  function useSpring(props, deps) {
16823    const isFn = react_spring_shared_esm_is.fun(props);
16824    const [[values], ref] = useSprings(1, isFn ? props : [props], isFn ? deps || [] : deps);
16825    return isFn || arguments.length == 2 ? [values, ref] : values;
16826  }
16827  
16828  const initSpringRef = () => SpringRef();
16829  
16830  const useSpringRef = () => useState(initSpringRef)[0];
16831  
16832  function useTrail(length, propsArg, deps) {
16833    var _passedRef;
16834  
16835    const propsFn = is.fun(propsArg) && propsArg;
16836    if (propsFn && !deps) deps = [];
16837    let reverse = true;
16838    let passedRef = undefined;
16839    const result = useSprings(length, (i, ctrl) => {
16840      const props = propsFn ? propsFn(i, ctrl) : propsArg;
16841      passedRef = props.ref;
16842      reverse = reverse && props.reverse;
16843      return props;
16844    }, deps || [{}]);
16845    const ref = (_passedRef = passedRef) != null ? _passedRef : result[1];
16846    useLayoutEffect(() => {
16847      each(ref.current, (ctrl, i) => {
16848        const parent = ref.current[i + (reverse ? 1 : -1)];
16849  
16850        if (parent) {
16851          ctrl.start({
16852            to: parent.springs
16853          });
16854        } else {
16855          ctrl.start();
16856        }
16857      });
16858    }, deps);
16859  
16860    if (propsFn || arguments.length == 3) {
16861      ref['_getProps'] = (propsArg, ctrl, i) => {
16862        const props = is.fun(propsArg) ? propsArg(i, ctrl) : propsArg;
16863  
16864        if (props) {
16865          const parent = ref.current[i + (props.reverse ? 1 : -1)];
16866          if (parent) props.to = parent.springs;
16867          return props;
16868        }
16869      };
16870  
16871      return result;
16872    }
16873  
16874    ref['start'] = propsArg => {
16875      const results = [];
16876      each(ref.current, (ctrl, i) => {
16877        const props = is.fun(propsArg) ? propsArg(i, ctrl) : propsArg;
16878        const parent = ref.current[i + (reverse ? 1 : -1)];
16879  
16880        if (parent) {
16881          results.push(ctrl.start(react_spring_core_esm_extends({}, props, {
16882            to: parent.springs
16883          })));
16884        } else {
16885          results.push(ctrl.start(react_spring_core_esm_extends({}, props)));
16886        }
16887      });
16888      return results;
16889    };
16890  
16891    return result[0];
16892  }
16893  
16894  let TransitionPhase;
16895  
16896  (function (TransitionPhase) {
16897    TransitionPhase["MOUNT"] = "mount";
16898    TransitionPhase["ENTER"] = "enter";
16899    TransitionPhase["UPDATE"] = "update";
16900    TransitionPhase["LEAVE"] = "leave";
16901  })(TransitionPhase || (TransitionPhase = {}));
16902  
16903  function useTransition(data, props, deps) {
16904    const propsFn = is.fun(props) && props;
16905    const {
16906      reset,
16907      sort,
16908      trail = 0,
16909      expires = true,
16910      exitBeforeEnter = false,
16911      onDestroyed,
16912      ref: propsRef,
16913      config: propsConfig
16914    } = propsFn ? propsFn() : props;
16915    const ref = useMemo(() => propsFn || arguments.length == 3 ? SpringRef() : void 0, []);
16916    const items = toArray(data);
16917    const transitions = [];
16918    const usedTransitions = useRef(null);
16919    const prevTransitions = reset ? null : usedTransitions.current;
16920    useLayoutEffect(() => {
16921      usedTransitions.current = transitions;
16922    });
16923    useOnce(() => () => {
16924      each(usedTransitions.current, t => {
16925        if (t.expired) {
16926          clearTimeout(t.expirationId);
16927        }
16928  
16929        detachRefs(t.ctrl, ref);
16930        t.ctrl.stop(true);
16931      });
16932    });
16933    const keys = getKeys(items, propsFn ? propsFn() : props, prevTransitions);
16934    const expired = reset && usedTransitions.current || [];
16935    useLayoutEffect(() => each(expired, ({
16936      ctrl,
16937      item,
16938      key
16939    }) => {
16940      detachRefs(ctrl, ref);
16941      callProp(onDestroyed, item, key);
16942    }));
16943    const reused = [];
16944    if (prevTransitions) each(prevTransitions, (t, i) => {
16945      if (t.expired) {
16946        clearTimeout(t.expirationId);
16947        expired.push(t);
16948      } else {
16949        i = reused[i] = keys.indexOf(t.key);
16950        if (~i) transitions[i] = t;
16951      }
16952    });
16953    each(items, (item, i) => {
16954      if (!transitions[i]) {
16955        transitions[i] = {
16956          key: keys[i],
16957          item,
16958          phase: TransitionPhase.MOUNT,
16959          ctrl: new Controller()
16960        };
16961        transitions[i].ctrl.item = item;
16962      }
16963    });
16964  
16965    if (reused.length) {
16966      let i = -1;
16967      const {
16968        leave
16969      } = propsFn ? propsFn() : props;
16970      each(reused, (keyIndex, prevIndex) => {
16971        const t = prevTransitions[prevIndex];
16972  
16973        if (~keyIndex) {
16974          i = transitions.indexOf(t);
16975          transitions[i] = react_spring_core_esm_extends({}, t, {
16976            item: items[keyIndex]
16977          });
16978        } else if (leave) {
16979          transitions.splice(++i, 0, t);
16980        }
16981      });
16982    }
16983  
16984    if (is.fun(sort)) {
16985      transitions.sort((a, b) => sort(a.item, b.item));
16986    }
16987  
16988    let delay = -trail;
16989    const forceUpdate = useForceUpdate();
16990    const defaultProps = getDefaultProps(props);
16991    const changes = new Map();
16992    const exitingTransitions = useRef(new Map());
16993    const forceChange = useRef(false);
16994    each(transitions, (t, i) => {
16995      const key = t.key;
16996      const prevPhase = t.phase;
16997      const p = propsFn ? propsFn() : props;
16998      let to;
16999      let phase;
17000      let propsDelay = callProp(p.delay || 0, key);
17001  
17002      if (prevPhase == TransitionPhase.MOUNT) {
17003        to = p.enter;
17004        phase = TransitionPhase.ENTER;
17005      } else {
17006        const isLeave = keys.indexOf(key) < 0;
17007  
17008        if (prevPhase != TransitionPhase.LEAVE) {
17009          if (isLeave) {
17010            to = p.leave;
17011            phase = TransitionPhase.LEAVE;
17012          } else if (to = p.update) {
17013            phase = TransitionPhase.UPDATE;
17014          } else return;
17015        } else if (!isLeave) {
17016          to = p.enter;
17017          phase = TransitionPhase.ENTER;
17018        } else return;
17019      }
17020  
17021      to = callProp(to, t.item, i);
17022      to = is.obj(to) ? inferTo(to) : {
17023        to
17024      };
17025  
17026      if (!to.config) {
17027        const config = propsConfig || defaultProps.config;
17028        to.config = callProp(config, t.item, i, phase);
17029      }
17030  
17031      delay += trail;
17032  
17033      const payload = react_spring_core_esm_extends({}, defaultProps, {
17034        delay: propsDelay + delay,
17035        ref: propsRef,
17036        immediate: p.immediate,
17037        reset: false
17038      }, to);
17039  
17040      if (phase == TransitionPhase.ENTER && is.und(payload.from)) {
17041        const _p = propsFn ? propsFn() : props;
17042  
17043        const from = is.und(_p.initial) || prevTransitions ? _p.from : _p.initial;
17044        payload.from = callProp(from, t.item, i);
17045      }
17046  
17047      const {
17048        onResolve
17049      } = payload;
17050  
17051      payload.onResolve = result => {
17052        callProp(onResolve, result);
17053        const transitions = usedTransitions.current;
17054        const t = transitions.find(t => t.key === key);
17055        if (!t) return;
17056  
17057        if (result.cancelled && t.phase != TransitionPhase.UPDATE) {
17058          return;
17059        }
17060  
17061        if (t.ctrl.idle) {
17062          const idle = transitions.every(t => t.ctrl.idle);
17063  
17064          if (t.phase == TransitionPhase.LEAVE) {
17065            const expiry = callProp(expires, t.item);
17066  
17067            if (expiry !== false) {
17068              const expiryMs = expiry === true ? 0 : expiry;
17069              t.expired = true;
17070  
17071              if (!idle && expiryMs > 0) {
17072                if (expiryMs <= 0x7fffffff) t.expirationId = setTimeout(forceUpdate, expiryMs);
17073                return;
17074              }
17075            }
17076          }
17077  
17078          if (idle && transitions.some(t => t.expired)) {
17079            exitingTransitions.current.delete(t);
17080  
17081            if (exitBeforeEnter) {
17082              forceChange.current = true;
17083            }
17084  
17085            forceUpdate();
17086          }
17087        }
17088      };
17089  
17090      const springs = getSprings(t.ctrl, payload);
17091  
17092      if (phase === TransitionPhase.LEAVE && exitBeforeEnter) {
17093        exitingTransitions.current.set(t, {
17094          phase,
17095          springs,
17096          payload
17097        });
17098      } else {
17099        changes.set(t, {
17100          phase,
17101          springs,
17102          payload
17103        });
17104      }
17105    });
17106    const context = useContext(SpringContext);
17107    const prevContext = usePrev(context);
17108    const hasContext = context !== prevContext && hasProps(context);
17109    useLayoutEffect(() => {
17110      if (hasContext) {
17111        each(transitions, t => {
17112          t.ctrl.start({
17113            default: context
17114          });
17115        });
17116      }
17117    }, [context]);
17118    each(changes, (_, t) => {
17119      if (exitingTransitions.current.size) {
17120        const ind = transitions.findIndex(state => state.key === t.key);
17121        transitions.splice(ind, 1);
17122      }
17123    });
17124    useLayoutEffect(() => {
17125      each(exitingTransitions.current.size ? exitingTransitions.current : changes, ({
17126        phase,
17127        payload
17128      }, t) => {
17129        const {
17130          ctrl
17131        } = t;
17132        t.phase = phase;
17133        ref == null ? void 0 : ref.add(ctrl);
17134  
17135        if (hasContext && phase == TransitionPhase.ENTER) {
17136          ctrl.start({
17137            default: context
17138          });
17139        }
17140  
17141        if (payload) {
17142          replaceRef(ctrl, payload.ref);
17143  
17144          if (ctrl.ref && !forceChange.current) {
17145            ctrl.update(payload);
17146          } else {
17147            ctrl.start(payload);
17148  
17149            if (forceChange.current) {
17150              forceChange.current = false;
17151            }
17152          }
17153        }
17154      });
17155    }, reset ? void 0 : deps);
17156  
17157    const renderTransitions = render => React.createElement(React.Fragment, null, transitions.map((t, i) => {
17158      const {
17159        springs
17160      } = changes.get(t) || t.ctrl;
17161      const elem = render(react_spring_core_esm_extends({}, springs), t.item, t, i);
17162      return elem && elem.type ? React.createElement(elem.type, react_spring_core_esm_extends({}, elem.props, {
17163        key: is.str(t.key) || is.num(t.key) ? t.key : t.ctrl.id,
17164        ref: elem.ref
17165      })) : elem;
17166    }));
17167  
17168    return ref ? [renderTransitions, ref] : renderTransitions;
17169  }
17170  let nextKey = 1;
17171  
17172  function getKeys(items, {
17173    key,
17174    keys = key
17175  }, prevTransitions) {
17176    if (keys === null) {
17177      const reused = new Set();
17178      return items.map(item => {
17179        const t = prevTransitions && prevTransitions.find(t => t.item === item && t.phase !== TransitionPhase.LEAVE && !reused.has(t));
17180  
17181        if (t) {
17182          reused.add(t);
17183          return t.key;
17184        }
17185  
17186        return nextKey++;
17187      });
17188    }
17189  
17190    return is.und(keys) ? items : is.fun(keys) ? items.map(keys) : toArray(keys);
17191  }
17192  
17193  const _excluded$2 = (/* unused pure expression or super */ null && (["children"]));
17194  function Spring(_ref) {
17195    let {
17196      children
17197    } = _ref,
17198        props = _objectWithoutPropertiesLoose(_ref, _excluded$2);
17199  
17200    return children(useSpring(props));
17201  }
17202  
17203  const _excluded$1 = (/* unused pure expression or super */ null && (["items", "children"]));
17204  function Trail(_ref) {
17205    let {
17206      items,
17207      children
17208    } = _ref,
17209        props = _objectWithoutPropertiesLoose(_ref, _excluded$1);
17210  
17211    const trails = useTrail(items.length, props);
17212    return items.map((item, index) => {
17213      const result = children(item, index);
17214      return is.fun(result) ? result(trails[index]) : result;
17215    });
17216  }
17217  
17218  const _excluded = (/* unused pure expression or super */ null && (["items", "children"]));
17219  function Transition(_ref) {
17220    let {
17221      items,
17222      children
17223    } = _ref,
17224        props = _objectWithoutPropertiesLoose(_ref, _excluded);
17225  
17226    return useTransition(items, props)(children);
17227  }
17228  
17229  class Interpolation extends FrameValue {
17230    constructor(source, args) {
17231      super();
17232      this.key = void 0;
17233      this.idle = true;
17234      this.calc = void 0;
17235      this._active = new Set();
17236      this.source = source;
17237      this.calc = createInterpolator(...args);
17238  
17239      const value = this._get();
17240  
17241      const nodeType = getAnimatedType(value);
17242      setAnimated(this, nodeType.create(value));
17243    }
17244  
17245    advance(_dt) {
17246      const value = this._get();
17247  
17248      const oldValue = this.get();
17249  
17250      if (!isEqual(value, oldValue)) {
17251        getAnimated(this).setValue(value);
17252  
17253        this._onChange(value, this.idle);
17254      }
17255  
17256      if (!this.idle && checkIdle(this._active)) {
17257        becomeIdle(this);
17258      }
17259    }
17260  
17261    _get() {
17262      const inputs = react_spring_shared_esm_is.arr(this.source) ? this.source.map(getFluidValue) : react_spring_shared_esm_toArray(getFluidValue(this.source));
17263      return this.calc(...inputs);
17264    }
17265  
17266    _start() {
17267      if (this.idle && !checkIdle(this._active)) {
17268        this.idle = false;
17269        react_spring_shared_esm_each(getPayload(this), node => {
17270          node.done = false;
17271        });
17272  
17273        if (globals.skipAnimation) {
17274          raf.batchedUpdates(() => this.advance());
17275          becomeIdle(this);
17276        } else {
17277          frameLoop.start(this);
17278        }
17279      }
17280    }
17281  
17282    _attach() {
17283      let priority = 1;
17284      react_spring_shared_esm_each(react_spring_shared_esm_toArray(this.source), source => {
17285        if (hasFluidValue(source)) {
17286          addFluidObserver(source, this);
17287        }
17288  
17289        if (isFrameValue(source)) {
17290          if (!source.idle) {
17291            this._active.add(source);
17292          }
17293  
17294          priority = Math.max(priority, source.priority + 1);
17295        }
17296      });
17297      this.priority = priority;
17298  
17299      this._start();
17300    }
17301  
17302    _detach() {
17303      react_spring_shared_esm_each(react_spring_shared_esm_toArray(this.source), source => {
17304        if (hasFluidValue(source)) {
17305          removeFluidObserver(source, this);
17306        }
17307      });
17308  
17309      this._active.clear();
17310  
17311      becomeIdle(this);
17312    }
17313  
17314    eventObserved(event) {
17315      if (event.type == 'change') {
17316        if (event.idle) {
17317          this.advance();
17318        } else {
17319          this._active.add(event.parent);
17320  
17321          this._start();
17322        }
17323      } else if (event.type == 'idle') {
17324          this._active.delete(event.parent);
17325        } else if (event.type == 'priority') {
17326            this.priority = react_spring_shared_esm_toArray(this.source).reduce((highest, parent) => Math.max(highest, (isFrameValue(parent) ? parent.priority : 0) + 1), 0);
17327          }
17328    }
17329  
17330  }
17331  
17332  function isIdle(source) {
17333    return source.idle !== false;
17334  }
17335  
17336  function checkIdle(active) {
17337    return !active.size || Array.from(active).every(isIdle);
17338  }
17339  
17340  function becomeIdle(self) {
17341    if (!self.idle) {
17342      self.idle = true;
17343      react_spring_shared_esm_each(getPayload(self), node => {
17344        node.done = true;
17345      });
17346      callFluidObservers(self, {
17347        type: 'idle',
17348        parent: self
17349      });
17350    }
17351  }
17352  
17353  const react_spring_core_esm_to = (source, ...args) => new Interpolation(source, args);
17354  const react_spring_core_esm_interpolate = (source, ...args) => (deprecateInterpolate(), new Interpolation(source, args));
17355  
17356  globals.assign({
17357    createStringInterpolator: createStringInterpolator,
17358    to: (source, args) => new Interpolation(source, args)
17359  });
17360  const react_spring_core_esm_update = frameLoop.advance;
17361  
17362  
17363  
17364  ;// CONCATENATED MODULE: external "ReactDOM"
17365  var external_ReactDOM_namespaceObject = window["ReactDOM"];
17366  ;// CONCATENATED MODULE: ./node_modules/@react-spring/web/dist/react-spring-web.esm.js
17367  
17368  
17369  
17370  
17371  
17372  
17373  function react_spring_web_esm_objectWithoutPropertiesLoose(source, excluded) {
17374    if (source == null) return {};
17375    var target = {};
17376    var sourceKeys = Object.keys(source);
17377    var key, i;
17378  
17379    for (i = 0; i < sourceKeys.length; i++) {
17380      key = sourceKeys[i];
17381      if (excluded.indexOf(key) >= 0) continue;
17382      target[key] = source[key];
17383    }
17384  
17385    return target;
17386  }
17387  
17388  const react_spring_web_esm_excluded$2 = ["style", "children", "scrollTop", "scrollLeft"];
17389  const isCustomPropRE = /^--/;
17390  
17391  function dangerousStyleValue(name, value) {
17392    if (value == null || typeof value === 'boolean' || value === '') return '';
17393    if (typeof value === 'number' && value !== 0 && !isCustomPropRE.test(name) && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name])) return value + 'px';
17394    return ('' + value).trim();
17395  }
17396  
17397  const attributeCache = {};
17398  function applyAnimatedValues(instance, props) {
17399    if (!instance.nodeType || !instance.setAttribute) {
17400      return false;
17401    }
17402  
17403    const isFilterElement = instance.nodeName === 'filter' || instance.parentNode && instance.parentNode.nodeName === 'filter';
17404  
17405    const _ref = props,
17406          {
17407      style,
17408      children,
17409      scrollTop,
17410      scrollLeft
17411    } = _ref,
17412          attributes = react_spring_web_esm_objectWithoutPropertiesLoose(_ref, react_spring_web_esm_excluded$2);
17413  
17414    const values = Object.values(attributes);
17415    const names = Object.keys(attributes).map(name => isFilterElement || instance.hasAttribute(name) ? name : attributeCache[name] || (attributeCache[name] = name.replace(/([A-Z])/g, n => '-' + n.toLowerCase())));
17416  
17417    if (children !== void 0) {
17418      instance.textContent = children;
17419    }
17420  
17421    for (let name in style) {
17422      if (style.hasOwnProperty(name)) {
17423        const value = dangerousStyleValue(name, style[name]);
17424  
17425        if (isCustomPropRE.test(name)) {
17426          instance.style.setProperty(name, value);
17427        } else {
17428          instance.style[name] = value;
17429        }
17430      }
17431    }
17432  
17433    names.forEach((name, i) => {
17434      instance.setAttribute(name, values[i]);
17435    });
17436  
17437    if (scrollTop !== void 0) {
17438      instance.scrollTop = scrollTop;
17439    }
17440  
17441    if (scrollLeft !== void 0) {
17442      instance.scrollLeft = scrollLeft;
17443    }
17444  }
17445  let isUnitlessNumber = {
17446    animationIterationCount: true,
17447    borderImageOutset: true,
17448    borderImageSlice: true,
17449    borderImageWidth: true,
17450    boxFlex: true,
17451    boxFlexGroup: true,
17452    boxOrdinalGroup: true,
17453    columnCount: true,
17454    columns: true,
17455    flex: true,
17456    flexGrow: true,
17457    flexPositive: true,
17458    flexShrink: true,
17459    flexNegative: true,
17460    flexOrder: true,
17461    gridRow: true,
17462    gridRowEnd: true,
17463    gridRowSpan: true,
17464    gridRowStart: true,
17465    gridColumn: true,
17466    gridColumnEnd: true,
17467    gridColumnSpan: true,
17468    gridColumnStart: true,
17469    fontWeight: true,
17470    lineClamp: true,
17471    lineHeight: true,
17472    opacity: true,
17473    order: true,
17474    orphans: true,
17475    tabSize: true,
17476    widows: true,
17477    zIndex: true,
17478    zoom: true,
17479    fillOpacity: true,
17480    floodOpacity: true,
17481    stopOpacity: true,
17482    strokeDasharray: true,
17483    strokeDashoffset: true,
17484    strokeMiterlimit: true,
17485    strokeOpacity: true,
17486    strokeWidth: true
17487  };
17488  
17489  const prefixKey = (prefix, key) => prefix + key.charAt(0).toUpperCase() + key.substring(1);
17490  
17491  const prefixes = ['Webkit', 'Ms', 'Moz', 'O'];
17492  isUnitlessNumber = Object.keys(isUnitlessNumber).reduce((acc, prop) => {
17493    prefixes.forEach(prefix => acc[prefixKey(prefix, prop)] = acc[prop]);
17494    return acc;
17495  }, isUnitlessNumber);
17496  
17497  const react_spring_web_esm_excluded$1 = ["x", "y", "z"];
17498  const domTransforms = /^(matrix|translate|scale|rotate|skew)/;
17499  const pxTransforms = /^(translate)/;
17500  const degTransforms = /^(rotate|skew)/;
17501  
17502  const addUnit = (value, unit) => react_spring_shared_esm_is.num(value) && value !== 0 ? value + unit : value;
17503  
17504  const isValueIdentity = (value, id) => react_spring_shared_esm_is.arr(value) ? value.every(v => isValueIdentity(v, id)) : react_spring_shared_esm_is.num(value) ? value === id : parseFloat(value) === id;
17505  
17506  class AnimatedStyle extends AnimatedObject {
17507    constructor(_ref) {
17508      let {
17509        x,
17510        y,
17511        z
17512      } = _ref,
17513          style = react_spring_web_esm_objectWithoutPropertiesLoose(_ref, react_spring_web_esm_excluded$1);
17514  
17515      const inputs = [];
17516      const transforms = [];
17517  
17518      if (x || y || z) {
17519        inputs.push([x || 0, y || 0, z || 0]);
17520        transforms.push(xyz => [`translate3d($xyz.map(v => addUnit(v, 'px')).join(',')})`, isValueIdentity(xyz, 0)]);
17521      }
17522  
17523      eachProp(style, (value, key) => {
17524        if (key === 'transform') {
17525          inputs.push([value || '']);
17526          transforms.push(transform => [transform, transform === '']);
17527        } else if (domTransforms.test(key)) {
17528          delete style[key];
17529          if (react_spring_shared_esm_is.und(value)) return;
17530          const unit = pxTransforms.test(key) ? 'px' : degTransforms.test(key) ? 'deg' : '';
17531          inputs.push(react_spring_shared_esm_toArray(value));
17532          transforms.push(key === 'rotate3d' ? ([x, y, z, deg]) => [`rotate3d($x},$y},$z},$addUnit(deg, unit)})`, isValueIdentity(deg, 0)] : input => [`$key}($input.map(v => addUnit(v, unit)).join(',')})`, isValueIdentity(input, key.startsWith('scale') ? 1 : 0)]);
17533        }
17534      });
17535  
17536      if (inputs.length) {
17537        style.transform = new FluidTransform(inputs, transforms);
17538      }
17539  
17540      super(style);
17541    }
17542  
17543  }
17544  
17545  class FluidTransform extends FluidValue {
17546    constructor(inputs, transforms) {
17547      super();
17548      this._value = null;
17549      this.inputs = inputs;
17550      this.transforms = transforms;
17551    }
17552  
17553    get() {
17554      return this._value || (this._value = this._get());
17555    }
17556  
17557    _get() {
17558      let transform = '';
17559      let identity = true;
17560      react_spring_shared_esm_each(this.inputs, (input, i) => {
17561        const arg1 = getFluidValue(input[0]);
17562        const [t, id] = this.transforms[i](react_spring_shared_esm_is.arr(arg1) ? arg1 : input.map(getFluidValue));
17563        transform += ' ' + t;
17564        identity = identity && id;
17565      });
17566      return identity ? 'none' : transform;
17567    }
17568  
17569    observerAdded(count) {
17570      if (count == 1) react_spring_shared_esm_each(this.inputs, input => react_spring_shared_esm_each(input, value => hasFluidValue(value) && addFluidObserver(value, this)));
17571    }
17572  
17573    observerRemoved(count) {
17574      if (count == 0) react_spring_shared_esm_each(this.inputs, input => react_spring_shared_esm_each(input, value => hasFluidValue(value) && removeFluidObserver(value, this)));
17575    }
17576  
17577    eventObserved(event) {
17578      if (event.type == 'change') {
17579        this._value = null;
17580      }
17581  
17582      callFluidObservers(this, event);
17583    }
17584  
17585  }
17586  
17587  const primitives = ['a', 'abbr', 'address', 'area', 'article', 'aside', 'audio', 'b', 'base', 'bdi', 'bdo', 'big', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'cite', 'code', 'col', 'colgroup', 'data', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'div', 'dl', 'dt', 'em', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'iframe', 'img', 'input', 'ins', 'kbd', 'keygen', 'label', 'legend', 'li', 'link', 'main', 'map', 'mark', 'menu', 'menuitem', 'meta', 'meter', 'nav', 'noscript', 'object', 'ol', 'optgroup', 'option', 'output', 'p', 'param', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'script', 'section', 'select', 'small', 'source', 'span', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'track', 'u', 'ul', 'var', 'video', 'wbr', 'circle', 'clipPath', 'defs', 'ellipse', 'foreignObject', 'g', 'image', 'line', 'linearGradient', 'mask', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'stop', 'svg', 'text', 'tspan'];
17588  
17589  const react_spring_web_esm_excluded = ["scrollTop", "scrollLeft"];
17590  globals.assign({
17591    batchedUpdates: external_ReactDOM_namespaceObject.unstable_batchedUpdates,
17592    createStringInterpolator: createStringInterpolator,
17593    colors: colors
17594  });
17595  const host = createHost(primitives, {
17596    applyAnimatedValues,
17597    createAnimatedStyle: style => new AnimatedStyle(style),
17598    getComponentProps: _ref => {
17599      let props = react_spring_web_esm_objectWithoutPropertiesLoose(_ref, react_spring_web_esm_excluded);
17600  
17601      return props;
17602    }
17603  });
17604  const animated = host.animated;
17605  
17606  
17607  
17608  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/use-moving-animation/index.js
17609  /**
17610   * External dependencies
17611   */
17612  
17613  /**
17614   * WordPress dependencies
17615   */
17616  
17617  
17618  
17619  
17620  /**
17621   * Simple reducer used to increment a counter.
17622   *
17623   * @param {number} state Previous counter value.
17624   * @return {number} New state value.
17625   */
17626  
17627  const counterReducer = state => state + 1;
17628  
17629  const getAbsolutePosition = element => {
17630    return {
17631      top: element.offsetTop,
17632      left: element.offsetLeft
17633    };
17634  };
17635  /**
17636   * Hook used to compute the styles required to move a div into a new position.
17637   *
17638   * The way this animation works is the following:
17639   *  - It first renders the element as if there was no animation.
17640   *  - It takes a snapshot of the position of the block to use it
17641   *    as a destination point for the animation.
17642   *  - It restores the element to the previous position using a CSS transform
17643   *  - It uses the "resetAnimation" flag to reset the animation
17644   *    from the beginning in order to animate to the new destination point.
17645   *
17646   * @param {Object}  $1                          Options
17647   * @param {boolean} $1.isSelected               Whether it's the current block or not.
17648   * @param {boolean} $1.adjustScrolling          Adjust the scroll position to the current block.
17649   * @param {boolean} $1.enableAnimation          Enable/Disable animation.
17650   * @param {*}       $1.triggerAnimationOnChange Variable used to trigger the animation if it changes.
17651   */
17652  
17653  
17654  function useMovingAnimation(_ref) {
17655    let {
17656      isSelected,
17657      adjustScrolling,
17658      enableAnimation,
17659      triggerAnimationOnChange
17660    } = _ref;
17661    const ref = (0,external_wp_element_namespaceObject.useRef)();
17662    const prefersReducedMotion = (0,external_wp_compose_namespaceObject.useReducedMotion)() || !enableAnimation;
17663    const [triggeredAnimation, triggerAnimation] = (0,external_wp_element_namespaceObject.useReducer)(counterReducer, 0);
17664    const [finishedAnimation, endAnimation] = (0,external_wp_element_namespaceObject.useReducer)(counterReducer, 0);
17665    const [transform, setTransform] = (0,external_wp_element_namespaceObject.useState)({
17666      x: 0,
17667      y: 0
17668    });
17669    const previous = (0,external_wp_element_namespaceObject.useMemo)(() => ref.current ? getAbsolutePosition(ref.current) : null, [triggerAnimationOnChange]); // Calculate the previous position of the block relative to the viewport and
17670    // return a function to maintain that position by scrolling.
17671  
17672    const preserveScrollPosition = (0,external_wp_element_namespaceObject.useMemo)(() => {
17673      if (!adjustScrolling || !ref.current) {
17674        return () => {};
17675      }
17676  
17677      const scrollContainer = (0,external_wp_dom_namespaceObject.getScrollContainer)(ref.current);
17678  
17679      if (!scrollContainer) {
17680        return () => {};
17681      }
17682  
17683      const prevRect = ref.current.getBoundingClientRect();
17684      return () => {
17685        const blockRect = ref.current.getBoundingClientRect();
17686        const diff = blockRect.top - prevRect.top;
17687  
17688        if (diff) {
17689          scrollContainer.scrollTop += diff;
17690        }
17691      };
17692    }, [triggerAnimationOnChange, adjustScrolling]);
17693    (0,external_wp_element_namespaceObject.useLayoutEffect)(() => {
17694      if (triggeredAnimation) {
17695        endAnimation();
17696      }
17697    }, [triggeredAnimation]);
17698    (0,external_wp_element_namespaceObject.useLayoutEffect)(() => {
17699      if (!previous) {
17700        return;
17701      }
17702  
17703      if (prefersReducedMotion) {
17704        // If the animation is disabled and the scroll needs to be adjusted,
17705        // just move directly to the final scroll position.
17706        preserveScrollPosition();
17707        return;
17708      }
17709  
17710      ref.current.style.transform = '';
17711      const destination = getAbsolutePosition(ref.current);
17712      triggerAnimation();
17713      setTransform({
17714        x: Math.round(previous.left - destination.left),
17715        y: Math.round(previous.top - destination.top)
17716      });
17717    }, [triggerAnimationOnChange]); // Only called when either the x or y value changes.
17718  
17719    function onFrameChange(_ref2) {
17720      let {
17721        x,
17722        y
17723      } = _ref2;
17724  
17725      if (!ref.current) {
17726        return;
17727      }
17728  
17729      const isMoving = x === 0 && y === 0;
17730      ref.current.style.transformOrigin = isMoving ? '' : 'center';
17731      ref.current.style.transform = isMoving ? '' : `translate3d($x}px,$y}px,0)`;
17732      ref.current.style.zIndex = !isSelected || isMoving ? '' : '1';
17733      preserveScrollPosition();
17734    } // Called for every frame computed by useSpring.
17735  
17736  
17737    function onChange(_ref3) {
17738      let {
17739        value
17740      } = _ref3;
17741      let {
17742        x,
17743        y
17744      } = value;
17745      x = Math.round(x);
17746      y = Math.round(y);
17747  
17748      if (x !== onChange.x || y !== onChange.y) {
17749        onFrameChange({
17750          x,
17751          y
17752        });
17753        onChange.x = x;
17754        onChange.y = y;
17755      }
17756    }
17757  
17758    onChange.x = 0;
17759    onChange.y = 0;
17760    useSpring({
17761      from: {
17762        x: transform.x,
17763        y: transform.y
17764      },
17765      to: {
17766        x: 0,
17767        y: 0
17768      },
17769      reset: triggeredAnimation !== finishedAnimation,
17770      config: {
17771        mass: 5,
17772        tension: 2000,
17773        friction: 200
17774      },
17775      immediate: prefersReducedMotion,
17776      onChange
17777    });
17778    return ref;
17779  }
17780  
17781  /* harmony default export */ var use_moving_animation = (useMovingAnimation);
17782  
17783  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/utils/dom.js
17784  const BLOCK_SELECTOR = '.block-editor-block-list__block';
17785  const APPENDER_SELECTOR = '.block-list-appender';
17786  const BLOCK_APPENDER_CLASS = '.block-editor-button-block-appender';
17787  /**
17788   * Returns true if two elements are contained within the same block.
17789   *
17790   * @param {Element} a First element.
17791   * @param {Element} b Second element.
17792   *
17793   * @return {boolean} Whether elements are in the same block.
17794   */
17795  
17796  function isInSameBlock(a, b) {
17797    return a.closest(BLOCK_SELECTOR) === b.closest(BLOCK_SELECTOR);
17798  }
17799  /**
17800   * Returns true if an element is considered part of the block and not its inner
17801   * blocks or appender.
17802   *
17803   * @param {Element} blockElement Block container element.
17804   * @param {Element} element      Element.
17805   *
17806   * @return {boolean} Whether an element is considered part of the block and not
17807   *                   its inner blocks or appender.
17808   */
17809  
17810  function isInsideRootBlock(blockElement, element) {
17811    const parentBlock = element.closest([BLOCK_SELECTOR, APPENDER_SELECTOR, BLOCK_APPENDER_CLASS].join(','));
17812    return parentBlock === blockElement;
17813  }
17814  /**
17815   * Finds the block client ID given any DOM node inside the block.
17816   *
17817   * @param {Node?} node DOM node.
17818   *
17819   * @return {string|undefined} Client ID or undefined if the node is not part of
17820   *                            a block.
17821   */
17822  
17823  function getBlockClientId(node) {
17824    while (node && node.nodeType !== node.ELEMENT_NODE) {
17825      node = node.parentNode;
17826    }
17827  
17828    if (!node) {
17829      return;
17830    }
17831  
17832    const elementNode =
17833    /** @type {Element} */
17834    node;
17835    const blockNode = elementNode.closest(BLOCK_SELECTOR);
17836  
17837    if (!blockNode) {
17838      return;
17839    }
17840  
17841    return blockNode.id.slice('block-'.length);
17842  }
17843  
17844  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-list/use-block-props/use-focus-first-element.js
17845  /**
17846   * External dependencies
17847   */
17848  
17849  /**
17850   * WordPress dependencies
17851   */
17852  
17853  
17854  
17855  
17856  /**
17857   * Internal dependencies
17858   */
17859  
17860  
17861  
17862  /** @typedef {import('@wordpress/element').RefObject} RefObject */
17863  
17864  /**
17865   * Returns the initial position if the block needs to be focussed, `undefined`
17866   * otherwise. The initial position is either 0 (start) or -1 (end).
17867   *
17868   * @param {string} clientId Block client ID.
17869   *
17870   * @return {number} The initial position, either 0 (start) or -1 (end).
17871   */
17872  
17873  function useInitialPosition(clientId) {
17874    return (0,external_wp_data_namespaceObject.useSelect)(select => {
17875      const {
17876        getSelectedBlocksInitialCaretPosition,
17877        isNavigationMode,
17878        isBlockSelected
17879      } = select(store);
17880  
17881      if (!isBlockSelected(clientId)) {
17882        return;
17883      }
17884  
17885      if (isNavigationMode()) {
17886        return;
17887      } // If there's no initial position, return 0 to focus the start.
17888  
17889  
17890      return getSelectedBlocksInitialCaretPosition();
17891    }, [clientId]);
17892  }
17893  /**
17894   * Transitions focus to the block or inner tabbable when the block becomes
17895   * selected and an initial position is set.
17896   *
17897   * @param {string} clientId Block client ID.
17898   *
17899   * @return {RefObject} React ref with the block element.
17900   */
17901  
17902  
17903  function useFocusFirstElement(clientId) {
17904    const ref = (0,external_wp_element_namespaceObject.useRef)();
17905    const initialPosition = useInitialPosition(clientId);
17906    const {
17907      isBlockSelected,
17908      isMultiSelecting
17909    } = (0,external_wp_data_namespaceObject.useSelect)(store);
17910    (0,external_wp_element_namespaceObject.useEffect)(() => {
17911      // Check if the block is still selected at the time this effect runs.
17912      if (!isBlockSelected(clientId) || isMultiSelecting()) {
17913        return;
17914      }
17915  
17916      if (initialPosition === undefined || initialPosition === null) {
17917        return;
17918      }
17919  
17920      if (!ref.current) {
17921        return;
17922      }
17923  
17924      const {
17925        ownerDocument
17926      } = ref.current; // Do not focus the block if it already contains the active element.
17927  
17928      if (ref.current.contains(ownerDocument.activeElement)) {
17929        return;
17930      } // Find all tabbables within node.
17931  
17932  
17933      const textInputs = external_wp_dom_namespaceObject.focus.tabbable.find(ref.current).filter(node => (0,external_wp_dom_namespaceObject.isTextField)(node)); // If reversed (e.g. merge via backspace), use the last in the set of
17934      // tabbables.
17935  
17936      const isReverse = -1 === initialPosition;
17937      const target = (isReverse ? external_lodash_namespaceObject.last : external_lodash_namespaceObject.first)(textInputs) || ref.current;
17938  
17939      if (!isInsideRootBlock(ref.current, target)) {
17940        ref.current.focus();
17941        return;
17942      } // Check to see if element is focussable before a generic caret insert.
17943  
17944  
17945      if (!ref.current.getAttribute('contenteditable')) {
17946        const focusElement = external_wp_dom_namespaceObject.focus.tabbable.findNext(ref.current); // Make sure focusElement is valid, contained in the same block, and a form field.
17947  
17948        if (focusElement && isInsideRootBlock(ref.current, focusElement) && (0,external_wp_dom_namespaceObject.isFormElement)(focusElement)) {
17949          focusElement.focus();
17950          return;
17951        }
17952      }
17953  
17954      (0,external_wp_dom_namespaceObject.placeCaretAtHorizontalEdge)(target, isReverse);
17955    }, [initialPosition, clientId]);
17956    return ref;
17957  }
17958  
17959  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-list/use-block-props/use-is-hovered.js
17960  /**
17961   * WordPress dependencies
17962   */
17963  
17964  
17965  /**
17966   * Internal dependencies
17967   */
17968  
17969  
17970  
17971  function listener(event) {
17972    if (event.defaultPrevented) {
17973      return;
17974    }
17975  
17976    const action = event.type === 'mouseover' ? 'add' : 'remove';
17977    event.preventDefault();
17978    event.currentTarget.classList[action]('is-hovered');
17979  }
17980  /**
17981   * Adds `is-hovered` class when the block is hovered and in navigation or
17982   * outline mode.
17983   */
17984  
17985  
17986  function useIsHovered() {
17987    const isEnabled = (0,external_wp_data_namespaceObject.useSelect)(select => {
17988      const {
17989        isNavigationMode,
17990        getSettings
17991      } = select(store);
17992      return isNavigationMode() || getSettings().outlineMode;
17993    }, []);
17994    return (0,external_wp_compose_namespaceObject.useRefEffect)(node => {
17995      if (isEnabled) {
17996        node.addEventListener('mouseout', listener);
17997        node.addEventListener('mouseover', listener);
17998        return () => {
17999          node.removeEventListener('mouseout', listener);
18000          node.removeEventListener('mouseover', listener); // Remove class in case it lingers.
18001  
18002          node.classList.remove('is-hovered');
18003        };
18004      }
18005    }, [isEnabled]);
18006  }
18007  
18008  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-list/use-block-props/use-block-class-names.js
18009  /**
18010   * External dependencies
18011   */
18012  
18013  /**
18014   * WordPress dependencies
18015   */
18016  
18017  
18018  
18019  /**
18020   * Internal dependencies
18021   */
18022  
18023  
18024  /**
18025   * Returns the class names used for the different states of the block.
18026   *
18027   * @param {string} clientId The block client ID.
18028   *
18029   * @return {string} The class names.
18030   */
18031  
18032  function useBlockClassNames(clientId) {
18033    return (0,external_wp_data_namespaceObject.useSelect)(select => {
18034      const {
18035        isBlockBeingDragged,
18036        isBlockHighlighted,
18037        isBlockSelected,
18038        isBlockMultiSelected,
18039        getBlockName,
18040        getSettings,
18041        hasSelectedInnerBlock,
18042        isTyping,
18043        __experimentalGetActiveBlockIdByBlockNames: getActiveBlockIdByBlockNames
18044      } = select(store);
18045      const {
18046        __experimentalSpotlightEntityBlocks: spotlightEntityBlocks,
18047        outlineMode
18048      } = getSettings();
18049      const isDragging = isBlockBeingDragged(clientId);
18050      const isSelected = isBlockSelected(clientId);
18051      const name = getBlockName(clientId);
18052      const checkDeep = true; // "ancestor" is the more appropriate label due to "deep" check.
18053  
18054      const isAncestorOfSelectedBlock = hasSelectedInnerBlock(clientId, checkDeep);
18055      const activeEntityBlockId = getActiveBlockIdByBlockNames(spotlightEntityBlocks);
18056      return classnames_default()({
18057        'is-selected': isSelected,
18058        'is-highlighted': isBlockHighlighted(clientId),
18059        'is-multi-selected': isBlockMultiSelected(clientId),
18060        'is-reusable': (0,external_wp_blocks_namespaceObject.isReusableBlock)((0,external_wp_blocks_namespaceObject.getBlockType)(name)),
18061        'is-dragging': isDragging,
18062        'has-child-selected': isAncestorOfSelectedBlock,
18063        'has-active-entity': activeEntityBlockId,
18064        // Determine if there is an active entity area to spotlight.
18065        'is-active-entity': activeEntityBlockId === clientId,
18066        'remove-outline': isSelected && outlineMode && isTyping()
18067      });
18068    }, [clientId]);
18069  }
18070  
18071  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-list/use-block-props/use-block-default-class-name.js
18072  /**
18073   * WordPress dependencies
18074   */
18075  
18076  
18077  /**
18078   * Internal dependencies
18079   */
18080  
18081  
18082  /**
18083   * Returns the default class name if the block is a light block and it supports
18084   * `className`.
18085   *
18086   * @param {string} clientId The block client ID.
18087   *
18088   * @return {string} The class name, e.g. `wp-block-paragraph`.
18089   */
18090  
18091  function useBlockDefaultClassName(clientId) {
18092    return (0,external_wp_data_namespaceObject.useSelect)(select => {
18093      const name = select(store).getBlockName(clientId);
18094      const blockType = (0,external_wp_blocks_namespaceObject.getBlockType)(name);
18095      const hasLightBlockWrapper = (blockType === null || blockType === void 0 ? void 0 : blockType.apiVersion) > 1;
18096  
18097      if (!hasLightBlockWrapper) {
18098        return;
18099      }
18100  
18101      return (0,external_wp_blocks_namespaceObject.getBlockDefaultClassName)(name);
18102    }, [clientId]);
18103  }
18104  
18105  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-list/use-block-props/use-block-custom-class-name.js
18106  /**
18107   * WordPress dependencies
18108   */
18109  
18110  
18111  /**
18112   * Internal dependencies
18113   */
18114  
18115  
18116  /**
18117   * Returns the custom class name if the block is a light block.
18118   *
18119   * @param {string} clientId The block client ID.
18120   *
18121   * @return {string} The custom class name.
18122   */
18123  
18124  function useBlockCustomClassName(clientId) {
18125    // It's good for this to be a separate selector because it will be executed
18126    // on every attribute change, while the other selectors are not re-evaluated
18127    // as much.
18128    return (0,external_wp_data_namespaceObject.useSelect)(select => {
18129      const {
18130        getBlockName,
18131        getBlockAttributes
18132      } = select(store);
18133      const attributes = getBlockAttributes(clientId);
18134  
18135      if (!(attributes !== null && attributes !== void 0 && attributes.className)) {
18136        return;
18137      }
18138  
18139      const blockType = (0,external_wp_blocks_namespaceObject.getBlockType)(getBlockName(clientId));
18140      const hasLightBlockWrapper = (blockType === null || blockType === void 0 ? void 0 : blockType.apiVersion) > 1;
18141  
18142      if (!hasLightBlockWrapper) {
18143        return;
18144      }
18145  
18146      return attributes.className;
18147    }, [clientId]);
18148  }
18149  
18150  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-list/use-block-props/use-block-moving-mode-class-names.js
18151  /**
18152   * External dependencies
18153   */
18154  
18155  /**
18156   * WordPress dependencies
18157   */
18158  
18159  
18160  /**
18161   * Internal dependencies
18162   */
18163  
18164  
18165  /**
18166   * Returns the class names used for block moving mode.
18167   *
18168   * @param {string} clientId The block client ID to insert above.
18169   *
18170   * @return {string} The class names.
18171   */
18172  
18173  function useBlockMovingModeClassNames(clientId) {
18174    return (0,external_wp_data_namespaceObject.useSelect)(select => {
18175      const {
18176        hasBlockMovingClientId,
18177        canInsertBlockType,
18178        getBlockName,
18179        getBlockRootClientId,
18180        isBlockSelected
18181      } = select(store); // The classes are only relevant for the selected block. Avoid
18182      // re-rendering all blocks!
18183  
18184      if (!isBlockSelected(clientId)) {
18185        return;
18186      }
18187  
18188      const movingClientId = hasBlockMovingClientId();
18189  
18190      if (!movingClientId) {
18191        return;
18192      }
18193  
18194      return classnames_default()('is-block-moving-mode', {
18195        'can-insert-moving-block': canInsertBlockType(getBlockName(movingClientId), getBlockRootClientId(clientId))
18196      });
18197    }, [clientId]);
18198  }
18199  
18200  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-list/use-block-props/use-focus-handler.js
18201  /**
18202   * WordPress dependencies
18203   */
18204  
18205  
18206  /**
18207   * Internal dependencies
18208   */
18209  
18210  
18211  
18212  /**
18213   * Selects the block if it receives focus.
18214   *
18215   * @param {string} clientId Block client ID.
18216   */
18217  
18218  function useFocusHandler(clientId) {
18219    const {
18220      isBlockSelected
18221    } = (0,external_wp_data_namespaceObject.useSelect)(store);
18222    const {
18223      selectBlock,
18224      selectionChange
18225    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
18226    return (0,external_wp_compose_namespaceObject.useRefEffect)(node => {
18227      /**
18228       * Marks the block as selected when focused and not already
18229       * selected. This specifically handles the case where block does not
18230       * set focus on its own (via `setFocus`), typically if there is no
18231       * focusable input in the block.
18232       *
18233       * @param {FocusEvent} event Focus event.
18234       */
18235      function onFocus(event) {
18236        // When the whole editor is editable, let writing flow handle
18237        // selection.
18238        if (node.parentElement.closest('[contenteditable="true"]')) {
18239          return;
18240        } // Check synchronously because a non-selected block might be
18241        // getting data through `useSelect` asynchronously.
18242  
18243  
18244        if (isBlockSelected(clientId)) {
18245          // Potentially change selection away from rich text.
18246          if (!event.target.isContentEditable) {
18247            selectionChange(clientId);
18248          }
18249  
18250          return;
18251        } // If an inner block is focussed, that block is resposible for
18252        // setting the selected block.
18253  
18254  
18255        if (!isInsideRootBlock(node, event.target)) {
18256          return;
18257        }
18258  
18259        selectBlock(clientId);
18260      }
18261  
18262      node.addEventListener('focusin', onFocus);
18263      return () => {
18264        node.removeEventListener('focusin', onFocus);
18265      };
18266    }, [isBlockSelected, selectBlock]);
18267  }
18268  
18269  ;// CONCATENATED MODULE: external ["wp","keycodes"]
18270  var external_wp_keycodes_namespaceObject = window["wp"]["keycodes"];
18271  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-list/use-block-props/use-selected-block-event-handlers.js
18272  /**
18273   * WordPress dependencies
18274   */
18275  
18276  
18277  
18278  
18279  /**
18280   * Internal dependencies
18281   */
18282  
18283  
18284  /**
18285   * Adds block behaviour:
18286   *   - Removes the block on BACKSPACE.
18287   *   - Inserts a default block on ENTER.
18288   *   - Disables dragging of block contents.
18289   *
18290   * @param {string} clientId Block client ID.
18291   */
18292  
18293  function useEventHandlers(clientId) {
18294    const isSelected = (0,external_wp_data_namespaceObject.useSelect)(select => select(store).isBlockSelected(clientId), [clientId]);
18295    const {
18296      getBlockRootClientId,
18297      getBlockIndex
18298    } = (0,external_wp_data_namespaceObject.useSelect)(store);
18299    const {
18300      insertDefaultBlock,
18301      removeBlock
18302    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
18303    return (0,external_wp_compose_namespaceObject.useRefEffect)(node => {
18304      if (!isSelected) {
18305        return;
18306      }
18307      /**
18308       * Interprets keydown event intent to remove or insert after block if
18309       * key event occurs on wrapper node. This can occur when the block has
18310       * no text fields of its own, particularly after initial insertion, to
18311       * allow for easy deletion and continuous writing flow to add additional
18312       * content.
18313       *
18314       * @param {KeyboardEvent} event Keydown event.
18315       */
18316  
18317  
18318      function onKeyDown(event) {
18319        const {
18320          keyCode,
18321          target
18322        } = event;
18323  
18324        if (keyCode !== external_wp_keycodes_namespaceObject.ENTER && keyCode !== external_wp_keycodes_namespaceObject.BACKSPACE && keyCode !== external_wp_keycodes_namespaceObject.DELETE) {
18325          return;
18326        }
18327  
18328        if (target !== node || (0,external_wp_dom_namespaceObject.isTextField)(target)) {
18329          return;
18330        }
18331  
18332        event.preventDefault();
18333  
18334        if (keyCode === external_wp_keycodes_namespaceObject.ENTER) {
18335          insertDefaultBlock({}, getBlockRootClientId(clientId), getBlockIndex(clientId) + 1);
18336        } else {
18337          removeBlock(clientId);
18338        }
18339      }
18340      /**
18341       * Prevents default dragging behavior within a block. To do: we must
18342       * handle this in the future and clean up the drag target.
18343       *
18344       * @param {DragEvent} event Drag event.
18345       */
18346  
18347  
18348      function onDragStart(event) {
18349        event.preventDefault();
18350      }
18351  
18352      node.addEventListener('keydown', onKeyDown);
18353      node.addEventListener('dragstart', onDragStart);
18354      return () => {
18355        node.removeEventListener('keydown', onKeyDown);
18356        node.removeEventListener('dragstart', onDragStart);
18357      };
18358    }, [clientId, isSelected, getBlockRootClientId, getBlockIndex, insertDefaultBlock, removeBlock]);
18359  }
18360  
18361  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-list/use-block-props/use-nav-mode-exit.js
18362  /**
18363   * WordPress dependencies
18364   */
18365  
18366  
18367  /**
18368   * Internal dependencies
18369   */
18370  
18371  
18372  /**
18373   * Allows navigation mode to be exited by clicking in the selected block.
18374   *
18375   * @param {string} clientId Block client ID.
18376   */
18377  
18378  function useNavModeExit(clientId) {
18379    const {
18380      isNavigationMode,
18381      isBlockSelected
18382    } = (0,external_wp_data_namespaceObject.useSelect)(store);
18383    const {
18384      setNavigationMode,
18385      selectBlock
18386    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
18387    return (0,external_wp_compose_namespaceObject.useRefEffect)(node => {
18388      function onMouseDown(event) {
18389        // Don't select a block if it's already handled by a child
18390        // block.
18391        if (isNavigationMode() && !event.defaultPrevented) {
18392          // Prevent focus from moving to the block.
18393          event.preventDefault(); // When clicking on a selected block, exit navigation mode.
18394  
18395          if (isBlockSelected(clientId)) {
18396            setNavigationMode(false);
18397          } else {
18398            selectBlock(clientId);
18399          }
18400        }
18401      }
18402  
18403      node.addEventListener('mousedown', onMouseDown);
18404      return () => {
18405        node.addEventListener('mousedown', onMouseDown);
18406      };
18407    }, [clientId, isNavigationMode, isBlockSelected, setNavigationMode]);
18408  }
18409  
18410  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-list/use-block-props/use-intersection-observer.js
18411  /**
18412   * WordPress dependencies
18413   */
18414  
18415  
18416  /**
18417   * Internal dependencies
18418   */
18419  
18420  
18421  function useIntersectionObserver() {
18422    const observer = (0,external_wp_element_namespaceObject.useContext)(IntersectionObserver);
18423    return (0,external_wp_compose_namespaceObject.useRefEffect)(node => {
18424      if (observer) {
18425        observer.observe(node);
18426        return () => {
18427          observer.unobserve(node);
18428        };
18429      }
18430    }, [observer]);
18431  }
18432  
18433  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-list/use-block-props/index.js
18434  /**
18435   * External dependencies
18436   */
18437  
18438  /**
18439   * WordPress dependencies
18440   */
18441  
18442  
18443  
18444  
18445  
18446  
18447  
18448  /**
18449   * Internal dependencies
18450   */
18451  
18452  
18453  
18454  
18455  
18456  
18457  
18458  
18459  
18460  
18461  
18462  
18463  
18464  
18465  
18466  
18467  /**
18468   * If the block count exceeds the threshold, we disable the reordering animation
18469   * to avoid laginess.
18470   */
18471  
18472  const BLOCK_ANIMATION_THRESHOLD = 200;
18473  /**
18474   * This hook is used to lightly mark an element as a block element. The element
18475   * should be the outermost element of a block. Call this hook and pass the
18476   * returned props to the element to mark as a block. If you define a ref for the
18477   * element, it is important to pass the ref to this hook, which the hook in turn
18478   * will pass to the component through the props it returns. Optionally, you can
18479   * also pass any other props through this hook, and they will be merged and
18480   * returned.
18481   *
18482   * @param {Object}  props                    Optional. Props to pass to the element. Must contain
18483   *                                           the ref if one is defined.
18484   * @param {Object}  options                  Options for internal use only.
18485   * @param {boolean} options.__unstableIsHtml
18486   *
18487   * @return {Object} Props to pass to the element to mark as a block.
18488   */
18489  
18490  function useBlockProps() {
18491    let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
18492    let {
18493      __unstableIsHtml
18494    } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
18495    const {
18496      clientId,
18497      className,
18498      wrapperProps = {},
18499      isAligned
18500    } = (0,external_wp_element_namespaceObject.useContext)(BlockListBlockContext);
18501    const {
18502      index,
18503      mode,
18504      name,
18505      blockApiVersion,
18506      blockTitle,
18507      isPartOfSelection,
18508      adjustScrolling,
18509      enableAnimation
18510    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
18511      const {
18512        getBlockIndex,
18513        getBlockMode,
18514        getBlockName,
18515        isTyping,
18516        getGlobalBlockCount,
18517        isBlockSelected,
18518        isBlockMultiSelected,
18519        isAncestorMultiSelected,
18520        isFirstMultiSelectedBlock
18521      } = select(store);
18522      const isSelected = isBlockSelected(clientId);
18523      const isPartOfMultiSelection = isBlockMultiSelected(clientId) || isAncestorMultiSelected(clientId);
18524      const blockName = getBlockName(clientId);
18525      const blockType = (0,external_wp_blocks_namespaceObject.getBlockType)(blockName);
18526      return {
18527        index: getBlockIndex(clientId),
18528        mode: getBlockMode(clientId),
18529        name: blockName,
18530        blockApiVersion: (blockType === null || blockType === void 0 ? void 0 : blockType.apiVersion) || 1,
18531        blockTitle: blockType === null || blockType === void 0 ? void 0 : blockType.title,
18532        isPartOfSelection: isSelected || isPartOfMultiSelection,
18533        adjustScrolling: isSelected || isFirstMultiSelectedBlock(clientId),
18534        enableAnimation: !isTyping() && getGlobalBlockCount() <= BLOCK_ANIMATION_THRESHOLD
18535      };
18536    }, [clientId]); // translators: %s: Type of block (i.e. Text, Image etc)
18537  
18538    const blockLabel = (0,external_wp_i18n_namespaceObject.sprintf)((0,external_wp_i18n_namespaceObject.__)('Block: %s'), blockTitle);
18539    const htmlSuffix = mode === 'html' && !__unstableIsHtml ? '-visual' : '';
18540    const mergedRefs = (0,external_wp_compose_namespaceObject.useMergeRefs)([props.ref, useFocusFirstElement(clientId), useBlockRefProvider(clientId), useFocusHandler(clientId), useEventHandlers(clientId), useNavModeExit(clientId), useIsHovered(), useIntersectionObserver(), use_moving_animation({
18541      isSelected: isPartOfSelection,
18542      adjustScrolling,
18543      enableAnimation,
18544      triggerAnimationOnChange: index
18545    })]);
18546    const blockEditContext = useBlockEditContext(); // Ensures it warns only inside the `edit` implementation for the block.
18547  
18548    if (blockApiVersion < 2 && clientId === blockEditContext.clientId) {
18549      typeof process !== "undefined" && process.env && "production" !== "production" ? 0 : void 0;
18550    }
18551  
18552    return { ...wrapperProps,
18553      ...props,
18554      ref: mergedRefs,
18555      id: `block-$clientId}$htmlSuffix}`,
18556      tabIndex: 0,
18557      role: 'document',
18558      'aria-label': blockLabel,
18559      'data-block': clientId,
18560      'data-type': name,
18561      'data-title': blockTitle,
18562      className: classnames_default()( // The wp-block className is important for editor styles.
18563      classnames_default()('block-editor-block-list__block', {
18564        'wp-block': !isAligned
18565      }), className, props.className, wrapperProps.className, useBlockClassNames(clientId), useBlockDefaultClassName(clientId), useBlockCustomClassName(clientId), useBlockMovingModeClassNames(clientId)),
18566      style: { ...wrapperProps.style,
18567        ...props.style
18568      }
18569    };
18570  }
18571  /**
18572   * Call within a save function to get the props for the block wrapper.
18573   *
18574   * @param {Object} props Optional. Props to pass to the element.
18575   */
18576  
18577  useBlockProps.save = external_wp_blocks_namespaceObject.__unstableGetBlockProps;
18578  
18579  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-list/block.js
18580  
18581  
18582  /**
18583   * External dependencies
18584   */
18585  
18586  
18587  /**
18588   * WordPress dependencies
18589   */
18590  
18591  
18592  
18593  
18594  
18595  
18596  
18597  /**
18598   * Internal dependencies
18599   */
18600  
18601  
18602  
18603  
18604  
18605  
18606  
18607  
18608  const BlockListBlockContext = (0,external_wp_element_namespaceObject.createContext)();
18609  /**
18610   * Merges wrapper props with special handling for classNames and styles.
18611   *
18612   * @param {Object} propsA
18613   * @param {Object} propsB
18614   *
18615   * @return {Object} Merged props.
18616   */
18617  
18618  function mergeWrapperProps(propsA, propsB) {
18619    const newProps = { ...propsA,
18620      ...propsB
18621    };
18622  
18623    if (propsA && propsB && propsA.className && propsB.className) {
18624      newProps.className = classnames_default()(propsA.className, propsB.className);
18625    }
18626  
18627    if (propsA && propsB && propsA.style && propsB.style) {
18628      newProps.style = { ...propsA.style,
18629        ...propsB.style
18630      };
18631    }
18632  
18633    return newProps;
18634  }
18635  
18636  function Block(_ref) {
18637    let {
18638      children,
18639      isHtml,
18640      ...props
18641    } = _ref;
18642    return (0,external_wp_element_namespaceObject.createElement)("div", useBlockProps(props, {
18643      __unstableIsHtml: isHtml
18644    }), children);
18645  }
18646  
18647  function BlockListBlock(_ref2) {
18648    var _wrapperProps;
18649  
18650    let {
18651      block: {
18652        __unstableBlockSource
18653      },
18654      mode,
18655      isLocked,
18656      canRemove,
18657      clientId,
18658      isSelected,
18659      isSelectionEnabled,
18660      className,
18661      name,
18662      isValid,
18663      attributes,
18664      wrapperProps,
18665      setAttributes,
18666      onReplace,
18667      onInsertBlocksAfter,
18668      onMerge,
18669      toggleSelection
18670    } = _ref2;
18671    const themeSupportsLayout = (0,external_wp_data_namespaceObject.useSelect)(select => {
18672      const {
18673        getSettings
18674      } = select(store);
18675      return getSettings().supportsLayout;
18676    }, []);
18677    const {
18678      removeBlock
18679    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
18680    const onRemove = (0,external_wp_element_namespaceObject.useCallback)(() => removeBlock(clientId), [clientId]); // We wrap the BlockEdit component in a div that hides it when editing in
18681    // HTML mode. This allows us to render all of the ancillary pieces
18682    // (InspectorControls, etc.) which are inside `BlockEdit` but not
18683    // `BlockHTML`, even in HTML mode.
18684  
18685    let blockEdit = (0,external_wp_element_namespaceObject.createElement)(BlockEdit, {
18686      name: name,
18687      isSelected: isSelected,
18688      attributes: attributes,
18689      setAttributes: setAttributes,
18690      insertBlocksAfter: isLocked ? undefined : onInsertBlocksAfter,
18691      onReplace: canRemove ? onReplace : undefined,
18692      onRemove: canRemove ? onRemove : undefined,
18693      mergeBlocks: canRemove ? onMerge : undefined,
18694      clientId: clientId,
18695      isSelectionEnabled: isSelectionEnabled,
18696      toggleSelection: toggleSelection
18697    });
18698    const blockType = (0,external_wp_blocks_namespaceObject.getBlockType)(name); // Determine whether the block has props to apply to the wrapper.
18699  
18700    if (blockType !== null && blockType !== void 0 && blockType.getEditWrapperProps) {
18701      wrapperProps = mergeWrapperProps(wrapperProps, blockType.getEditWrapperProps(attributes));
18702    }
18703  
18704    const isAligned = wrapperProps && !!wrapperProps['data-align'] && !themeSupportsLayout; // For aligned blocks, provide a wrapper element so the block can be
18705    // positioned relative to the block column.
18706    // This is only kept for classic themes that don't support layout
18707    // Historically we used to rely on extra divs and data-align to
18708    // provide the alignments styles in the editor.
18709    // Due to the differences between frontend and backend, we migrated
18710    // to the layout feature, and we're now aligning the markup of frontend
18711    // and backend.
18712  
18713    if (isAligned) {
18714      blockEdit = (0,external_wp_element_namespaceObject.createElement)("div", {
18715        className: "wp-block",
18716        "data-align": wrapperProps['data-align']
18717      }, blockEdit);
18718    }
18719  
18720    let block;
18721  
18722    if (!isValid) {
18723      const saveContent = __unstableBlockSource ? (0,external_wp_blocks_namespaceObject.serializeRawBlock)(__unstableBlockSource) : (0,external_wp_blocks_namespaceObject.getSaveContent)(blockType, attributes);
18724      block = (0,external_wp_element_namespaceObject.createElement)(Block, {
18725        className: "has-warning"
18726      }, (0,external_wp_element_namespaceObject.createElement)(block_invalid_warning, {
18727        clientId: clientId
18728      }), (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.RawHTML, null, (0,external_wp_dom_namespaceObject.safeHTML)(saveContent)));
18729    } else if (mode === 'html') {
18730      // Render blockEdit so the inspector controls don't disappear.
18731      // See #8969.
18732      block = (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)("div", {
18733        style: {
18734          display: 'none'
18735        }
18736      }, blockEdit), (0,external_wp_element_namespaceObject.createElement)(Block, {
18737        isHtml: true
18738      }, (0,external_wp_element_namespaceObject.createElement)(block_html, {
18739        clientId: clientId
18740      })));
18741    } else if ((blockType === null || blockType === void 0 ? void 0 : blockType.apiVersion) > 1) {
18742      block = blockEdit;
18743    } else {
18744      block = (0,external_wp_element_namespaceObject.createElement)(Block, wrapperProps, blockEdit);
18745    }
18746  
18747    const value = {
18748      clientId,
18749      className: (_wrapperProps = wrapperProps) !== null && _wrapperProps !== void 0 && _wrapperProps['data-align'] && themeSupportsLayout ? classnames_default()(className, `align$wrapperProps['data-align']}`) : className,
18750      wrapperProps: (0,external_lodash_namespaceObject.omit)(wrapperProps, ['data-align']),
18751      isAligned
18752    };
18753    const memoizedValue = (0,external_wp_element_namespaceObject.useMemo)(() => value, Object.values(value));
18754    return (0,external_wp_element_namespaceObject.createElement)(BlockListBlockContext.Provider, {
18755      value: memoizedValue
18756    }, (0,external_wp_element_namespaceObject.createElement)(block_crash_boundary, {
18757      fallback: (0,external_wp_element_namespaceObject.createElement)(Block, {
18758        className: "has-warning"
18759      }, (0,external_wp_element_namespaceObject.createElement)(block_crash_warning, null))
18760    }, block));
18761  }
18762  
18763  const applyWithSelect = (0,external_wp_data_namespaceObject.withSelect)((select, _ref3) => {
18764    let {
18765      clientId,
18766      rootClientId
18767    } = _ref3;
18768    const {
18769      isBlockSelected,
18770      getBlockMode,
18771      isSelectionEnabled,
18772      getTemplateLock,
18773      __unstableGetBlockWithoutInnerBlocks,
18774      canRemoveBlock,
18775      canMoveBlock
18776    } = select(store);
18777  
18778    const block = __unstableGetBlockWithoutInnerBlocks(clientId);
18779  
18780    const isSelected = isBlockSelected(clientId);
18781    const templateLock = getTemplateLock(rootClientId);
18782    const canRemove = canRemoveBlock(clientId, rootClientId);
18783    const canMove = canMoveBlock(clientId, rootClientId); // The fallback to `{}` is a temporary fix.
18784    // This function should never be called when a block is not present in
18785    // the state. It happens now because the order in withSelect rendering
18786    // is not correct.
18787  
18788    const {
18789      name,
18790      attributes,
18791      isValid
18792    } = block || {}; // Do not add new properties here, use `useSelect` instead to avoid
18793    // leaking new props to the public API (editor.BlockListBlock filter).
18794  
18795    return {
18796      mode: getBlockMode(clientId),
18797      isSelectionEnabled: isSelectionEnabled(),
18798      isLocked: !!templateLock,
18799      canRemove,
18800      canMove,
18801      // Users of the editor.BlockListBlock filter used to be able to
18802      // access the block prop.
18803      // Ideally these blocks would rely on the clientId prop only.
18804      // This is kept for backward compatibility reasons.
18805      block,
18806      name,
18807      attributes,
18808      isValid,
18809      isSelected
18810    };
18811  });
18812  const applyWithDispatch = (0,external_wp_data_namespaceObject.withDispatch)((dispatch, ownProps, _ref4) => {
18813    let {
18814      select
18815    } = _ref4;
18816    const {
18817      updateBlockAttributes,
18818      insertBlocks,
18819      mergeBlocks,
18820      replaceBlocks,
18821      toggleSelection,
18822      __unstableMarkLastChangeAsPersistent
18823    } = dispatch(store); // Do not add new properties here, use `useDispatch` instead to avoid
18824    // leaking new props to the public API (editor.BlockListBlock filter).
18825  
18826    return {
18827      setAttributes(newAttributes) {
18828        const {
18829          getMultiSelectedBlockClientIds
18830        } = select(store);
18831        const multiSelectedBlockClientIds = getMultiSelectedBlockClientIds();
18832        const {
18833          clientId
18834        } = ownProps;
18835        const clientIds = multiSelectedBlockClientIds.length ? multiSelectedBlockClientIds : [clientId];
18836        updateBlockAttributes(clientIds, newAttributes);
18837      },
18838  
18839      onInsertBlocks(blocks, index) {
18840        const {
18841          rootClientId
18842        } = ownProps;
18843        insertBlocks(blocks, index, rootClientId);
18844      },
18845  
18846      onInsertBlocksAfter(blocks) {
18847        const {
18848          clientId,
18849          rootClientId
18850        } = ownProps;
18851        const {
18852          getBlockIndex
18853        } = select(store);
18854        const index = getBlockIndex(clientId);
18855        insertBlocks(blocks, index + 1, rootClientId);
18856      },
18857  
18858      onMerge(forward) {
18859        const {
18860          clientId
18861        } = ownProps;
18862        const {
18863          getPreviousBlockClientId,
18864          getNextBlockClientId
18865        } = select(store);
18866  
18867        if (forward) {
18868          const nextBlockClientId = getNextBlockClientId(clientId);
18869  
18870          if (nextBlockClientId) {
18871            mergeBlocks(clientId, nextBlockClientId);
18872          }
18873        } else {
18874          const previousBlockClientId = getPreviousBlockClientId(clientId);
18875  
18876          if (previousBlockClientId) {
18877            mergeBlocks(previousBlockClientId, clientId);
18878          }
18879        }
18880      },
18881  
18882      onReplace(blocks, indexToSelect, initialPosition) {
18883        if (blocks.length && !(0,external_wp_blocks_namespaceObject.isUnmodifiedDefaultBlock)(blocks[blocks.length - 1])) {
18884          __unstableMarkLastChangeAsPersistent();
18885        }
18886  
18887        replaceBlocks([ownProps.clientId], blocks, indexToSelect, initialPosition);
18888      },
18889  
18890      toggleSelection(selectionEnabled) {
18891        toggleSelection(selectionEnabled);
18892      }
18893  
18894    };
18895  });
18896  /* harmony default export */ var block = ((0,external_wp_compose_namespaceObject.compose)(external_wp_compose_namespaceObject.pure, applyWithSelect, applyWithDispatch, // Block is sometimes not mounted at the right time, causing it be undefined
18897  // see issue for more info
18898  // https://github.com/WordPress/gutenberg/issues/17013
18899  (0,external_wp_compose_namespaceObject.ifCondition)(_ref5 => {
18900    let {
18901      block
18902    } = _ref5;
18903    return !!block;
18904  }), (0,external_wp_components_namespaceObject.withFilters)('editor.BlockListBlock'))(BlockListBlock));
18905  
18906  ;// CONCATENATED MODULE: external ["wp","htmlEntities"]
18907  var external_wp_htmlEntities_namespaceObject = window["wp"]["htmlEntities"];
18908  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/plus.js
18909  
18910  
18911  /**
18912   * WordPress dependencies
18913   */
18914  
18915  const plus = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
18916    xmlns: "http://www.w3.org/2000/svg",
18917    viewBox: "0 0 24 24"
18918  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
18919    d: "M18 11.2h-5.2V6h-1.6v5.2H6v1.6h5.2V18h1.6v-5.2H18z"
18920  }));
18921  /* harmony default export */ var library_plus = (plus);
18922  
18923  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/tips.js
18924  
18925  
18926  /**
18927   * WordPress dependencies
18928   */
18929  
18930  
18931  
18932  const globalTips = [(0,external_wp_element_namespaceObject.createInterpolateElement)((0,external_wp_i18n_namespaceObject.__)('While writing, you can press <kbd>/</kbd> to quickly insert new blocks.'), {
18933    kbd: (0,external_wp_element_namespaceObject.createElement)("kbd", null)
18934  }), (0,external_wp_element_namespaceObject.createInterpolateElement)((0,external_wp_i18n_namespaceObject.__)('Indent a list by pressing <kbd>space</kbd> at the beginning of a line.'), {
18935    kbd: (0,external_wp_element_namespaceObject.createElement)("kbd", null)
18936  }), (0,external_wp_element_namespaceObject.createInterpolateElement)((0,external_wp_i18n_namespaceObject.__)('Outdent a list by pressing <kbd>backspace</kbd> at the beginning of a line.'), {
18937    kbd: (0,external_wp_element_namespaceObject.createElement)("kbd", null)
18938  }), (0,external_wp_i18n_namespaceObject.__)('Drag files into the editor to automatically insert media blocks.'), (0,external_wp_i18n_namespaceObject.__)("Change a block's type by pressing the block icon on the toolbar.")];
18939  
18940  function Tips() {
18941    const [randomIndex] = (0,external_wp_element_namespaceObject.useState)( // Disable Reason: I'm not generating an HTML id.
18942    // eslint-disable-next-line no-restricted-syntax
18943    Math.floor(Math.random() * globalTips.length));
18944    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Tip, null, globalTips[randomIndex]);
18945  }
18946  
18947  /* harmony default export */ var tips = (Tips);
18948  
18949  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/block-default.js
18950  
18951  
18952  /**
18953   * WordPress dependencies
18954   */
18955  
18956  const blockDefault = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
18957    xmlns: "http://www.w3.org/2000/svg",
18958    viewBox: "0 0 24 24"
18959  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
18960    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"
18961  }));
18962  /* harmony default export */ var block_default = (blockDefault);
18963  
18964  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-icon/index.js
18965  
18966  
18967  /**
18968   * External dependencies
18969   */
18970  
18971  /**
18972   * WordPress dependencies
18973   */
18974  
18975  
18976  
18977  
18978  
18979  function BlockIcon(_ref) {
18980    var _icon;
18981  
18982    let {
18983      icon,
18984      showColors = false,
18985      className
18986    } = _ref;
18987  
18988    if (((_icon = icon) === null || _icon === void 0 ? void 0 : _icon.src) === 'block-default') {
18989      icon = {
18990        src: block_default
18991      };
18992    }
18993  
18994    const renderedIcon = (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Icon, {
18995      icon: icon && icon.src ? icon.src : icon
18996    });
18997    const style = showColors ? {
18998      backgroundColor: icon && icon.background,
18999      color: icon && icon.foreground
19000    } : {};
19001    return (0,external_wp_element_namespaceObject.createElement)("span", {
19002      style: style,
19003      className: classnames_default()('block-editor-block-icon', className, {
19004        'has-colors': showColors
19005      })
19006    }, renderedIcon);
19007  }
19008  /**
19009   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/block-icon/README.md
19010   */
19011  
19012  
19013  /* harmony default export */ var block_icon = ((0,external_wp_element_namespaceObject.memo)(BlockIcon));
19014  
19015  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-card/index.js
19016  
19017  
19018  /**
19019   * WordPress dependencies
19020   */
19021  
19022  /**
19023   * Internal dependencies
19024   */
19025  
19026  
19027  
19028  function BlockCard(_ref) {
19029    let {
19030      title,
19031      icon,
19032      description,
19033      blockType
19034    } = _ref;
19035  
19036    if (blockType) {
19037      external_wp_deprecated_default()('`blockType` property in `BlockCard component`', {
19038        since: '5.7',
19039        alternative: '`title, icon and description` properties'
19040      });
19041      ({
19042        title,
19043        icon,
19044        description
19045      } = blockType);
19046    }
19047  
19048    return (0,external_wp_element_namespaceObject.createElement)("div", {
19049      className: "block-editor-block-card"
19050    }, (0,external_wp_element_namespaceObject.createElement)(block_icon, {
19051      icon: icon,
19052      showColors: true
19053    }), (0,external_wp_element_namespaceObject.createElement)("div", {
19054      className: "block-editor-block-card__content"
19055    }, (0,external_wp_element_namespaceObject.createElement)("h2", {
19056      className: "block-editor-block-card__title"
19057    }, title), (0,external_wp_element_namespaceObject.createElement)("span", {
19058      className: "block-editor-block-card__description"
19059    }, description)));
19060  }
19061  
19062  /* harmony default export */ var block_card = (BlockCard);
19063  
19064  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/provider/with-registry-provider.js
19065  
19066  
19067  
19068  /**
19069   * WordPress dependencies
19070   */
19071  
19072  
19073  
19074  /**
19075   * Internal dependencies
19076   */
19077  
19078  
19079  
19080  const withRegistryProvider = (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(WrappedComponent => {
19081    return (0,external_wp_data_namespaceObject.withRegistry)(_ref => {
19082      let {
19083        useSubRegistry = true,
19084        registry,
19085        ...props
19086      } = _ref;
19087  
19088      if (!useSubRegistry) {
19089        return (0,external_wp_element_namespaceObject.createElement)(WrappedComponent, _extends({
19090          registry: registry
19091        }, props));
19092      }
19093  
19094      const [subRegistry, setSubRegistry] = (0,external_wp_element_namespaceObject.useState)(null);
19095      (0,external_wp_element_namespaceObject.useEffect)(() => {
19096        const newRegistry = (0,external_wp_data_namespaceObject.createRegistry)({}, registry);
19097        newRegistry.registerStore(STORE_NAME, storeConfig);
19098        setSubRegistry(newRegistry);
19099      }, [registry]);
19100  
19101      if (!subRegistry) {
19102        return null;
19103      }
19104  
19105      return (0,external_wp_element_namespaceObject.createElement)(external_wp_data_namespaceObject.RegistryProvider, {
19106        value: subRegistry
19107      }, (0,external_wp_element_namespaceObject.createElement)(WrappedComponent, _extends({
19108        registry: subRegistry
19109      }, props)));
19110    });
19111  }, 'withRegistryProvider');
19112  /* harmony default export */ var with_registry_provider = (withRegistryProvider);
19113  
19114  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/provider/use-block-sync.js
19115  /**
19116   * External dependencies
19117   */
19118  
19119  /**
19120   * WordPress dependencies
19121   */
19122  
19123  
19124  
19125  
19126  /**
19127   * Internal dependencies
19128   */
19129  
19130  
19131  /**
19132   * A function to call when the block value has been updated in the block-editor
19133   * store.
19134   *
19135   * @callback onBlockUpdate
19136   * @param {Object[]} blocks  The updated blocks.
19137   * @param {Object}   options The updated block options, such as selectionStart
19138   *                           and selectionEnd.
19139   */
19140  
19141  /**
19142   * useBlockSync is a side effect which handles bidirectional sync between the
19143   * block-editor store and a controlling data source which provides blocks. This
19144   * is most commonly used by the BlockEditorProvider to synchronize the contents
19145   * of the block-editor store with the root entity, like a post.
19146   *
19147   * Another example would be the template part block, which provides blocks from
19148   * a separate entity data source than a root entity. This hook syncs edits to
19149   * the template part in the block editor back to the entity and vice-versa.
19150   *
19151   * Here are some of its basic functions:
19152   * - Initalizes the block-editor store for the given clientID to the blocks
19153   *   given via props.
19154   * - Adds incoming changes (like undo) to the block-editor store.
19155   * - Adds outgoing changes (like editing content) to the controlling entity,
19156   *   determining if a change should be considered persistent or not.
19157   * - Handles edge cases and race conditions which occur in those operations.
19158   * - Ignores changes which happen to other entities (like nested inner block
19159   *   controllers.
19160   * - Passes selection state from the block-editor store to the controlling entity.
19161   *
19162   * @param {Object}        props           Props for the block sync hook
19163   * @param {string}        props.clientId  The client ID of the inner block controller.
19164   *                                        If none is passed, then it is assumed to be a
19165   *                                        root controller rather than an inner block
19166   *                                        controller.
19167   * @param {Object[]}      props.value     The control value for the blocks. This value
19168   *                                        is used to initalize the block-editor store
19169   *                                        and for resetting the blocks to incoming
19170   *                                        changes like undo.
19171   * @param {Object}        props.selection The selection state responsible to restore the selection on undo/redo.
19172   * @param {onBlockUpdate} props.onChange  Function to call when a persistent
19173   *                                        change has been made in the block-editor blocks
19174   *                                        for the given clientId. For example, after
19175   *                                        this function is called, an entity is marked
19176   *                                        dirty because it has changes to save.
19177   * @param {onBlockUpdate} props.onInput   Function to call when a non-persistent
19178   *                                        change has been made in the block-editor blocks
19179   *                                        for the given clientId. When this is called,
19180   *                                        controlling sources do not become dirty.
19181   */
19182  
19183  function useBlockSync(_ref) {
19184    let {
19185      clientId = null,
19186      value: controlledBlocks,
19187      selection: controlledSelection,
19188      onChange = external_lodash_namespaceObject.noop,
19189      onInput = external_lodash_namespaceObject.noop
19190    } = _ref;
19191    const registry = (0,external_wp_data_namespaceObject.useRegistry)();
19192    const {
19193      resetBlocks,
19194      resetSelection,
19195      replaceInnerBlocks,
19196      setHasControlledInnerBlocks,
19197      __unstableMarkNextChangeAsNotPersistent
19198    } = registry.dispatch(store);
19199    const {
19200      getBlockName,
19201      getBlocks
19202    } = registry.select(store);
19203    const isControlled = (0,external_wp_data_namespaceObject.useSelect)(select => {
19204      return !clientId || select(store).areInnerBlocksControlled(clientId);
19205    }, [clientId]);
19206    const pendingChanges = (0,external_wp_element_namespaceObject.useRef)({
19207      incoming: null,
19208      outgoing: []
19209    });
19210    const subscribed = (0,external_wp_element_namespaceObject.useRef)(false);
19211  
19212    const setControlledBlocks = () => {
19213      if (!controlledBlocks) {
19214        return;
19215      } // We don't need to persist this change because we only replace
19216      // controlled inner blocks when the change was caused by an entity,
19217      // and so it would already be persisted.
19218  
19219  
19220      __unstableMarkNextChangeAsNotPersistent();
19221  
19222      if (clientId) {
19223        // It is important to batch here because otherwise,
19224        // as soon as `setHasControlledInnerBlocks` is called
19225        // the effect to restore might be triggered
19226        // before the actual blocks get set properly in state.
19227        registry.batch(() => {
19228          setHasControlledInnerBlocks(clientId, true);
19229          const storeBlocks = controlledBlocks.map(block => (0,external_wp_blocks_namespaceObject.cloneBlock)(block));
19230  
19231          if (subscribed.current) {
19232            pendingChanges.current.incoming = storeBlocks;
19233          }
19234  
19235          __unstableMarkNextChangeAsNotPersistent();
19236  
19237          replaceInnerBlocks(clientId, storeBlocks);
19238        });
19239      } else {
19240        if (subscribed.current) {
19241          pendingChanges.current.incoming = controlledBlocks;
19242        }
19243  
19244        resetBlocks(controlledBlocks);
19245      }
19246    }; // Add a subscription to the block-editor registry to detect when changes
19247    // have been made. This lets us inform the data source of changes. This
19248    // is an effect so that the subscriber can run synchronously without
19249    // waiting for React renders for changes.
19250  
19251  
19252    const onInputRef = (0,external_wp_element_namespaceObject.useRef)(onInput);
19253    const onChangeRef = (0,external_wp_element_namespaceObject.useRef)(onChange);
19254    (0,external_wp_element_namespaceObject.useEffect)(() => {
19255      onInputRef.current = onInput;
19256      onChangeRef.current = onChange;
19257    }, [onInput, onChange]); // Determine if blocks need to be reset when they change.
19258  
19259    (0,external_wp_element_namespaceObject.useEffect)(() => {
19260      if (pendingChanges.current.outgoing.includes(controlledBlocks)) {
19261        // Skip block reset if the value matches expected outbound sync
19262        // triggered by this component by a preceding change detection.
19263        // Only skip if the value matches expectation, since a reset should
19264        // still occur if the value is modified (not equal by reference),
19265        // to allow that the consumer may apply modifications to reflect
19266        // back on the editor.
19267        if ((0,external_lodash_namespaceObject.last)(pendingChanges.current.outgoing) === controlledBlocks) {
19268          pendingChanges.current.outgoing = [];
19269        }
19270      } else if (getBlocks(clientId) !== controlledBlocks) {
19271        // Reset changing value in all other cases than the sync described
19272        // above. Since this can be reached in an update following an out-
19273        // bound sync, unset the outbound value to avoid considering it in
19274        // subsequent renders.
19275        pendingChanges.current.outgoing = [];
19276        setControlledBlocks();
19277  
19278        if (controlledSelection) {
19279          resetSelection(controlledSelection.selectionStart, controlledSelection.selectionEnd, controlledSelection.initialPosition);
19280        }
19281      }
19282    }, [controlledBlocks, clientId]);
19283    (0,external_wp_element_namespaceObject.useEffect)(() => {
19284      // When the block becomes uncontrolled, it means its inner state has been reset
19285      // we need to take the blocks again from the external value property.
19286      if (!isControlled) {
19287        pendingChanges.current.outgoing = [];
19288        setControlledBlocks();
19289      }
19290    }, [isControlled]);
19291    (0,external_wp_element_namespaceObject.useEffect)(() => {
19292      const {
19293        getSelectionStart,
19294        getSelectionEnd,
19295        getSelectedBlocksInitialCaretPosition,
19296        isLastBlockChangePersistent,
19297        __unstableIsLastBlockChangeIgnored,
19298        areInnerBlocksControlled
19299      } = registry.select(store);
19300      let blocks = getBlocks(clientId);
19301      let isPersistent = isLastBlockChangePersistent();
19302      let previousAreBlocksDifferent = false;
19303      subscribed.current = true;
19304      const unsubscribe = registry.subscribe(() => {
19305        // Sometimes, when changing block lists, lingering subscriptions
19306        // might trigger before they are cleaned up. If the block for which
19307        // the subscription runs is no longer in the store, this would clear
19308        // its parent entity's block list. To avoid this, we bail out if
19309        // the subscription is triggering for a block (`clientId !== null`)
19310        // and its block name can't be found because it's not on the list.
19311        // (`getBlockName( clientId ) === null`).
19312        if (clientId !== null && getBlockName(clientId) === null) return; // When RESET_BLOCKS on parent blocks get called, the controlled blocks
19313        // can reset to uncontrolled, in these situations, it means we need to populate
19314        // the blocks again from the external blocks (the value property here)
19315        // and we should stop triggering onChange
19316  
19317        const isStillControlled = !clientId || areInnerBlocksControlled(clientId);
19318  
19319        if (!isStillControlled) {
19320          return;
19321        }
19322  
19323        const newIsPersistent = isLastBlockChangePersistent();
19324        const newBlocks = getBlocks(clientId);
19325        const areBlocksDifferent = newBlocks !== blocks;
19326        blocks = newBlocks;
19327  
19328        if (areBlocksDifferent && (pendingChanges.current.incoming || __unstableIsLastBlockChangeIgnored())) {
19329          pendingChanges.current.incoming = null;
19330          isPersistent = newIsPersistent;
19331          return;
19332        } // Since we often dispatch an action to mark the previous action as
19333        // persistent, we need to make sure that the blocks changed on the
19334        // previous action before committing the change.
19335  
19336  
19337        const didPersistenceChange = previousAreBlocksDifferent && !areBlocksDifferent && newIsPersistent && !isPersistent;
19338  
19339        if (areBlocksDifferent || didPersistenceChange) {
19340          isPersistent = newIsPersistent; // We know that onChange/onInput will update controlledBlocks.
19341          // We need to be aware that it was caused by an outgoing change
19342          // so that we do not treat it as an incoming change later on,
19343          // which would cause a block reset.
19344  
19345          pendingChanges.current.outgoing.push(blocks); // Inform the controlling entity that changes have been made to
19346          // the block-editor store they should be aware about.
19347  
19348          const updateParent = isPersistent ? onChangeRef.current : onInputRef.current;
19349          updateParent(blocks, {
19350            selection: {
19351              selectionStart: getSelectionStart(),
19352              selectionEnd: getSelectionEnd(),
19353              initialPosition: getSelectedBlocksInitialCaretPosition()
19354            }
19355          });
19356        }
19357  
19358        previousAreBlocksDifferent = areBlocksDifferent;
19359      });
19360      return () => unsubscribe();
19361    }, [registry, clientId]);
19362  }
19363  
19364  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/provider/index.js
19365  
19366  
19367  /**
19368   * WordPress dependencies
19369   */
19370  
19371  
19372  /**
19373   * Internal dependencies
19374   */
19375  
19376  
19377  
19378  
19379  
19380  /** @typedef {import('@wordpress/data').WPDataRegistry} WPDataRegistry */
19381  
19382  function BlockEditorProvider(props) {
19383    const {
19384      children,
19385      settings
19386    } = props;
19387    const {
19388      updateSettings
19389    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
19390    (0,external_wp_element_namespaceObject.useEffect)(() => {
19391      updateSettings(settings);
19392    }, [settings]); // Syncs the entity provider with changes in the block-editor store.
19393  
19394    useBlockSync(props);
19395    return (0,external_wp_element_namespaceObject.createElement)(BlockRefsProvider, null, children);
19396  }
19397  
19398  /* harmony default export */ var provider = (with_registry_provider(BlockEditorProvider));
19399  
19400  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-preview/live.js
19401  
19402  
19403  /**
19404   * WordPress dependencies
19405   */
19406  
19407  /**
19408   * Internal dependencies
19409   */
19410  
19411  
19412  function LiveBlockPreview(_ref) {
19413    let {
19414      onClick
19415    } = _ref;
19416    return (0,external_wp_element_namespaceObject.createElement)("div", {
19417      tabIndex: 0,
19418      role: "button",
19419      onClick: onClick,
19420      onKeyPress: onClick
19421    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Disabled, null, (0,external_wp_element_namespaceObject.createElement)(BlockList, null)));
19422  }
19423  
19424  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-selection-clearer/index.js
19425  
19426  
19427  
19428  /**
19429   * WordPress dependencies
19430   */
19431  
19432  
19433  /**
19434   * Internal dependencies
19435   */
19436  
19437  
19438  /**
19439   * Pass the returned ref callback to an element that should clear block
19440   * selection. Selection will only be cleared if the element is clicked directly,
19441   * not if a child element is clicked.
19442   *
19443   * @return {import('react').RefCallback} Ref callback.
19444   */
19445  
19446  function useBlockSelectionClearer() {
19447    const {
19448      hasSelectedBlock,
19449      hasMultiSelection
19450    } = (0,external_wp_data_namespaceObject.useSelect)(store);
19451    const {
19452      clearSelectedBlock
19453    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
19454    return (0,external_wp_compose_namespaceObject.useRefEffect)(node => {
19455      function onMouseDown(event) {
19456        if (!hasSelectedBlock() && !hasMultiSelection()) {
19457          return;
19458        } // Only handle clicks on the element, not the children.
19459  
19460  
19461        if (event.target !== node) {
19462          return;
19463        }
19464  
19465        clearSelectedBlock();
19466      }
19467  
19468      node.addEventListener('mousedown', onMouseDown);
19469      return () => {
19470        node.removeEventListener('mousedown', onMouseDown);
19471      };
19472    }, [hasSelectedBlock, hasMultiSelection, clearSelectedBlock]);
19473  }
19474  function BlockSelectionClearer(props) {
19475    return (0,external_wp_element_namespaceObject.createElement)("div", _extends({
19476      ref: useBlockSelectionClearer()
19477    }, props));
19478  }
19479  
19480  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/writing-flow/use-multi-selection.js
19481  /**
19482   * External dependencies
19483   */
19484  
19485  /**
19486   * WordPress dependencies
19487   */
19488  
19489  
19490  
19491  /**
19492   * Internal dependencies
19493   */
19494  
19495  
19496  
19497  
19498  function selector(select) {
19499    const {
19500      isMultiSelecting,
19501      getMultiSelectedBlockClientIds,
19502      hasMultiSelection,
19503      getSelectedBlockClientId,
19504      getSelectedBlocksInitialCaretPosition,
19505      __unstableIsFullySelected
19506    } = select(store);
19507    return {
19508      isMultiSelecting: isMultiSelecting(),
19509      multiSelectedBlockClientIds: getMultiSelectedBlockClientIds(),
19510      hasMultiSelection: hasMultiSelection(),
19511      selectedBlockClientId: getSelectedBlockClientId(),
19512      initialPosition: getSelectedBlocksInitialCaretPosition(),
19513      isFullSelection: __unstableIsFullySelected()
19514    };
19515  }
19516  
19517  function useMultiSelection() {
19518    const {
19519      initialPosition,
19520      isMultiSelecting,
19521      multiSelectedBlockClientIds,
19522      hasMultiSelection,
19523      selectedBlockClientId,
19524      isFullSelection
19525    } = (0,external_wp_data_namespaceObject.useSelect)(selector, []);
19526    const selectedRef = useBlockRef(selectedBlockClientId); // These must be in the right DOM order.
19527  
19528    const startRef = useBlockRef((0,external_lodash_namespaceObject.first)(multiSelectedBlockClientIds));
19529    const endRef = useBlockRef((0,external_lodash_namespaceObject.last)(multiSelectedBlockClientIds));
19530    /**
19531     * When the component updates, and there is multi selection, we need to
19532     * select the entire block contents.
19533     */
19534  
19535    return (0,external_wp_compose_namespaceObject.useRefEffect)(node => {
19536      const {
19537        ownerDocument
19538      } = node;
19539      const {
19540        defaultView
19541      } = ownerDocument; // Allow initialPosition to bypass focus behavior. This is useful
19542      // for the list view or other areas where we don't want to transfer
19543      // focus to the editor canvas.
19544  
19545      if (initialPosition === undefined || initialPosition === null) {
19546        return;
19547      }
19548  
19549      if (!hasMultiSelection || isMultiSelecting) {
19550        if (!selectedBlockClientId || isMultiSelecting) {
19551          return;
19552        }
19553  
19554        const selection = defaultView.getSelection();
19555  
19556        if (selection.rangeCount && !selection.isCollapsed) {
19557          const blockNode = selectedRef.current;
19558          const {
19559            startContainer,
19560            endContainer
19561          } = selection.getRangeAt(0);
19562  
19563          if (!!blockNode && (!blockNode.contains(startContainer) || !blockNode.contains(endContainer))) {
19564            selection.removeAllRanges();
19565          }
19566        }
19567  
19568        return;
19569      }
19570  
19571      const {
19572        length
19573      } = multiSelectedBlockClientIds;
19574  
19575      if (length < 2) {
19576        return;
19577      }
19578  
19579      if (!isFullSelection) {
19580        return;
19581      } // Allow cross contentEditable selection by temporarily making
19582      // all content editable. We can't rely on using the store and
19583      // React because re-rending happens too slowly. We need to be
19584      // able to select across instances immediately.
19585  
19586  
19587      node.contentEditable = true; // For some browsers, like Safari, it is important that focus happens
19588      // BEFORE selection.
19589  
19590      node.focus(); // The block refs might not be immediately available
19591      // when dragging blocks into another block.
19592  
19593      if (!startRef.current || !endRef.current) {
19594        return;
19595      }
19596  
19597      const selection = defaultView.getSelection();
19598      const range = ownerDocument.createRange(); // These must be in the right DOM order.
19599  
19600      range.setStartBefore(startRef.current);
19601      range.setEndAfter(endRef.current);
19602      selection.removeAllRanges();
19603      selection.addRange(range);
19604    }, [hasMultiSelection, isMultiSelecting, multiSelectedBlockClientIds, selectedBlockClientId, initialPosition, isFullSelection]);
19605  }
19606  
19607  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/writing-flow/use-tab-nav.js
19608  
19609  
19610  /**
19611   * WordPress dependencies
19612   */
19613  
19614  
19615  
19616  
19617  
19618  /**
19619   * Internal dependencies
19620   */
19621  
19622  
19623  function useTabNav() {
19624    const container = (0,external_wp_element_namespaceObject.useRef)();
19625    const focusCaptureBeforeRef = (0,external_wp_element_namespaceObject.useRef)();
19626    const focusCaptureAfterRef = (0,external_wp_element_namespaceObject.useRef)();
19627    const lastFocus = (0,external_wp_element_namespaceObject.useRef)();
19628    const {
19629      hasMultiSelection,
19630      getSelectedBlockClientId,
19631      getBlockCount
19632    } = (0,external_wp_data_namespaceObject.useSelect)(store);
19633    const {
19634      setNavigationMode
19635    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
19636    const isNavigationMode = (0,external_wp_data_namespaceObject.useSelect)(select => select(store).isNavigationMode(), []); // Don't allow tabbing to this element in Navigation mode.
19637  
19638    const focusCaptureTabIndex = !isNavigationMode ? '0' : undefined; // Reference that holds the a flag for enabling or disabling
19639    // capturing on the focus capture elements.
19640  
19641    const noCapture = (0,external_wp_element_namespaceObject.useRef)();
19642  
19643    function onFocusCapture(event) {
19644      // Do not capture incoming focus if set by us in WritingFlow.
19645      if (noCapture.current) {
19646        noCapture.current = null;
19647      } else if (hasMultiSelection()) {
19648        container.current.focus();
19649      } else if (getSelectedBlockClientId()) {
19650        lastFocus.current.focus();
19651      } else {
19652        setNavigationMode(true);
19653        const isBefore = // eslint-disable-next-line no-bitwise
19654        event.target.compareDocumentPosition(container.current) & event.target.DOCUMENT_POSITION_FOLLOWING;
19655        const action = isBefore ? 'findNext' : 'findPrevious';
19656        external_wp_dom_namespaceObject.focus.tabbable[action](event.target).focus();
19657      }
19658    }
19659  
19660    const before = (0,external_wp_element_namespaceObject.createElement)("div", {
19661      ref: focusCaptureBeforeRef,
19662      tabIndex: focusCaptureTabIndex,
19663      onFocus: onFocusCapture
19664    });
19665    const after = (0,external_wp_element_namespaceObject.createElement)("div", {
19666      ref: focusCaptureAfterRef,
19667      tabIndex: focusCaptureTabIndex,
19668      onFocus: onFocusCapture
19669    });
19670    const ref = (0,external_wp_compose_namespaceObject.useRefEffect)(node => {
19671      function onKeyDown(event) {
19672        if (event.defaultPrevented) {
19673          return;
19674        }
19675  
19676        if (event.keyCode === external_wp_keycodes_namespaceObject.ESCAPE && !hasMultiSelection()) {
19677          event.preventDefault();
19678          setNavigationMode(true);
19679          return;
19680        } // In Edit mode, Tab should focus the first tabbable element after
19681        // the content, which is normally the sidebar (with block controls)
19682        // and Shift+Tab should focus the first tabbable element before the
19683        // content, which is normally the block toolbar.
19684        // Arrow keys can be used, and Tab and arrow keys can be used in
19685        // Navigation mode (press Esc), to navigate through blocks.
19686  
19687  
19688        if (event.keyCode !== external_wp_keycodes_namespaceObject.TAB) {
19689          return;
19690        }
19691  
19692        const isShift = event.shiftKey;
19693        const direction = isShift ? 'findPrevious' : 'findNext';
19694  
19695        if (!hasMultiSelection() && !getSelectedBlockClientId()) {
19696          // Preserve the behaviour of entering navigation mode when
19697          // tabbing into the content without a block selection.
19698          // `onFocusCapture` already did this previously, but we need to
19699          // do it again here because after clearing block selection,
19700          // focus land on the writing flow container and pressing Tab
19701          // will no longer send focus through the focus capture element.
19702          if (event.target === node) setNavigationMode(true);
19703          return;
19704        } // Allow tabbing from the block wrapper to a form element,
19705        // and between form elements rendered in a block,
19706        // such as inside a placeholder. Form elements are generally
19707        // meant to be UI rather than part of the content. Ideally
19708        // these are not rendered in the content and perhaps in the
19709        // future they can be rendered in an iframe or shadow DOM.
19710  
19711  
19712        if (((0,external_wp_dom_namespaceObject.isFormElement)(event.target) || event.target.getAttribute('data-block') === getSelectedBlockClientId()) && (0,external_wp_dom_namespaceObject.isFormElement)(external_wp_dom_namespaceObject.focus.tabbable[direction](event.target))) {
19713          return;
19714        }
19715  
19716        const next = isShift ? focusCaptureBeforeRef : focusCaptureAfterRef; // Disable focus capturing on the focus capture element, so it
19717        // doesn't refocus this block and so it allows default behaviour
19718        // (moving focus to the next tabbable element).
19719  
19720        noCapture.current = true; // Focusing the focus capture element, which is located above and
19721        // below the editor, should not scroll the page all the way up or
19722        // down.
19723  
19724        next.current.focus({
19725          preventScroll: true
19726        });
19727      }
19728  
19729      function onFocusOut(event) {
19730        lastFocus.current = event.target;
19731        const {
19732          ownerDocument
19733        } = node; // If focus disappears due to there being no blocks, move focus to
19734        // the writing flow wrapper.
19735  
19736        if (!event.relatedTarget && ownerDocument.activeElement === ownerDocument.body && getBlockCount() === 0) {
19737          node.focus();
19738        }
19739      } // When tabbing back to an element in block list, this event handler prevents scrolling if the
19740      // focus capture divs (before/after) are outside of the viewport. (For example shift+tab back to a paragraph
19741      // when focus is on a sidebar element. This prevents the scrollable writing area from jumping either to the
19742      // top or bottom of the document.
19743      //
19744      // Note that it isn't possible to disable scrolling in the onFocus event. We need to intercept this
19745      // earlier in the keypress handler, and call focus( { preventScroll: true } ) instead.
19746      // https://developer.mozilla.org/en-US/docs/Web/API/HTMLOrForeignElement/focus#parameters
19747  
19748  
19749      function preventScrollOnTab(event) {
19750        var _event$target;
19751  
19752        if (event.keyCode !== external_wp_keycodes_namespaceObject.TAB) {
19753          return;
19754        }
19755  
19756        if (((_event$target = event.target) === null || _event$target === void 0 ? void 0 : _event$target.getAttribute('role')) === 'region') {
19757          return;
19758        }
19759  
19760        if (container.current === event.target) {
19761          return;
19762        }
19763  
19764        const isShift = event.shiftKey;
19765        const direction = isShift ? 'findPrevious' : 'findNext';
19766        const target = external_wp_dom_namespaceObject.focus.tabbable[direction](event.target); // Only do something when the next tabbable is a focus capture div (before/after)
19767  
19768        if (target === focusCaptureBeforeRef.current || target === focusCaptureAfterRef.current) {
19769          event.preventDefault();
19770          target.focus({
19771            preventScroll: true
19772          });
19773        }
19774      }
19775  
19776      const {
19777        ownerDocument
19778      } = node;
19779      const {
19780        defaultView
19781      } = ownerDocument;
19782      defaultView.addEventListener('keydown', preventScrollOnTab);
19783      node.addEventListener('keydown', onKeyDown);
19784      node.addEventListener('focusout', onFocusOut);
19785      return () => {
19786        defaultView.removeEventListener('keydown', preventScrollOnTab);
19787        node.removeEventListener('keydown', onKeyDown);
19788        node.removeEventListener('focusout', onFocusOut);
19789      };
19790    }, []);
19791    const mergedRefs = (0,external_wp_compose_namespaceObject.useMergeRefs)([container, ref]);
19792    return [before, mergedRefs, after];
19793  }
19794  
19795  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/writing-flow/use-arrow-nav.js
19796  /**
19797   * External dependencies
19798   */
19799  
19800  /**
19801   * WordPress dependencies
19802   */
19803  
19804  
19805  
19806  
19807  
19808  /**
19809   * Internal dependencies
19810   */
19811  
19812  
19813  
19814  /**
19815   * Returns true if the element should consider edge navigation upon a keyboard
19816   * event of the given directional key code, or false otherwise.
19817   *
19818   * @param {Element} element     HTML element to test.
19819   * @param {number}  keyCode     KeyboardEvent keyCode to test.
19820   * @param {boolean} hasModifier Whether a modifier is pressed.
19821   *
19822   * @return {boolean} Whether element should consider edge navigation.
19823   */
19824  
19825  function isNavigationCandidate(element, keyCode, hasModifier) {
19826    const isVertical = keyCode === external_wp_keycodes_namespaceObject.UP || keyCode === external_wp_keycodes_namespaceObject.DOWN; // Currently, all elements support unmodified vertical navigation.
19827  
19828    if (isVertical && !hasModifier) {
19829      return true;
19830    } // Native inputs should not navigate horizontally.
19831  
19832  
19833    const {
19834      tagName
19835    } = element;
19836    return tagName !== 'INPUT' && tagName !== 'TEXTAREA';
19837  }
19838  /**
19839   * Returns the optimal tab target from the given focused element in the desired
19840   * direction. A preference is made toward text fields, falling back to the block
19841   * focus stop if no other candidates exist for the block.
19842   *
19843   * @param {Element} target           Currently focused text field.
19844   * @param {boolean} isReverse        True if considering as the first field.
19845   * @param {Element} containerElement Element containing all blocks.
19846   * @param {boolean} onlyVertical     Whether to only consider tabbable elements
19847   *                                   that are visually above or under the
19848   *                                   target.
19849   *
19850   * @return {?Element} Optimal tab target, if one exists.
19851   */
19852  
19853  function getClosestTabbable(target, isReverse, containerElement, onlyVertical) {
19854    // Since the current focus target is not guaranteed to be a text field, find
19855    // all focusables. Tabbability is considered later.
19856    let focusableNodes = external_wp_dom_namespaceObject.focus.focusable.find(containerElement);
19857  
19858    if (isReverse) {
19859      focusableNodes = (0,external_lodash_namespaceObject.reverse)(focusableNodes);
19860    } // Consider as candidates those focusables after the current target. It's
19861    // assumed this can only be reached if the target is focusable (on its
19862    // keydown event), so no need to verify it exists in the set.
19863  
19864  
19865    focusableNodes = focusableNodes.slice(focusableNodes.indexOf(target) + 1);
19866    let targetRect;
19867  
19868    if (onlyVertical) {
19869      targetRect = target.getBoundingClientRect();
19870    }
19871  
19872    function isTabCandidate(node) {
19873      // Not a candidate if the node is not tabbable.
19874      if (!external_wp_dom_namespaceObject.focus.tabbable.isTabbableIndex(node)) {
19875        return false;
19876      } // Skip focusable elements such as links within content editable nodes.
19877  
19878  
19879      if (node.isContentEditable && node.contentEditable !== 'true') {
19880        return false;
19881      }
19882  
19883      if (onlyVertical) {
19884        const nodeRect = node.getBoundingClientRect();
19885  
19886        if (nodeRect.left >= targetRect.right || nodeRect.right <= targetRect.left) {
19887          return false;
19888        }
19889      }
19890  
19891      return true;
19892    }
19893  
19894    return (0,external_lodash_namespaceObject.find)(focusableNodes, isTabCandidate);
19895  }
19896  function useArrowNav() {
19897    const {
19898      getSelectedBlockClientId,
19899      getMultiSelectedBlocksEndClientId,
19900      getPreviousBlockClientId,
19901      getNextBlockClientId,
19902      getSettings,
19903      hasMultiSelection
19904    } = (0,external_wp_data_namespaceObject.useSelect)(store);
19905    return (0,external_wp_compose_namespaceObject.useRefEffect)(node => {
19906      // Here a DOMRect is stored while moving the caret vertically so
19907      // vertical position of the start position can be restored. This is to
19908      // recreate browser behaviour across blocks.
19909      let verticalRect;
19910  
19911      function onMouseDown() {
19912        verticalRect = null;
19913      }
19914      /**
19915       * Returns true if the given target field is the last in its block which
19916       * can be considered for tab transition. For example, in a block with
19917       * two text fields, this would return true when reversing from the first
19918       * of the two fields, but false when reversing from the second.
19919       *
19920       * @param {Element} target    Currently focused text field.
19921       * @param {boolean} isReverse True if considering as the first field.
19922       *
19923       * @return {boolean} Whether field is at edge for tab transition.
19924       */
19925  
19926  
19927      function isTabbableEdge(target, isReverse) {
19928        const closestTabbable = getClosestTabbable(target, isReverse, node);
19929        return !closestTabbable || !isInSameBlock(target, closestTabbable);
19930      }
19931  
19932      function onKeyDown(event) {
19933        const {
19934          keyCode,
19935          target
19936        } = event;
19937        const isUp = keyCode === external_wp_keycodes_namespaceObject.UP;
19938        const isDown = keyCode === external_wp_keycodes_namespaceObject.DOWN;
19939        const isLeft = keyCode === external_wp_keycodes_namespaceObject.LEFT;
19940        const isRight = keyCode === external_wp_keycodes_namespaceObject.RIGHT;
19941        const isReverse = isUp || isLeft;
19942        const isHorizontal = isLeft || isRight;
19943        const isVertical = isUp || isDown;
19944        const isNav = isHorizontal || isVertical;
19945        const isShift = event.shiftKey;
19946        const hasModifier = isShift || event.ctrlKey || event.altKey || event.metaKey;
19947        const isNavEdge = isVertical ? external_wp_dom_namespaceObject.isVerticalEdge : external_wp_dom_namespaceObject.isHorizontalEdge;
19948        const {
19949          ownerDocument
19950        } = node;
19951        const {
19952          defaultView
19953        } = ownerDocument;
19954  
19955        if (hasMultiSelection()) {
19956          return;
19957        } // When presing any key other than up or down, the initial vertical
19958        // position must ALWAYS be reset. The vertical position is saved so
19959        // it can be restored as well as possible on sebsequent vertical
19960        // arrow key presses. It may not always be possible to restore the
19961        // exact same position (such as at an empty line), so it wouldn't be
19962        // good to compute the position right before any vertical arrow key
19963        // press.
19964  
19965  
19966        if (!isVertical) {
19967          verticalRect = null;
19968        } else if (!verticalRect) {
19969          verticalRect = (0,external_wp_dom_namespaceObject.computeCaretRect)(defaultView);
19970        } // Abort if navigation has already been handled (e.g. RichText
19971        // inline boundaries).
19972  
19973  
19974        if (event.defaultPrevented) {
19975          return;
19976        }
19977  
19978        if (!isNav) {
19979          return;
19980        } // Abort if our current target is not a candidate for navigation
19981        // (e.g. preserve native input behaviors).
19982  
19983  
19984        if (!isNavigationCandidate(target, keyCode, hasModifier)) {
19985          return;
19986        } // In the case of RTL scripts, right means previous and left means
19987        // next, which is the exact reverse of LTR.
19988  
19989  
19990        const isReverseDir = (0,external_wp_dom_namespaceObject.isRTL)(target) ? !isReverse : isReverse;
19991        const {
19992          keepCaretInsideBlock
19993        } = getSettings();
19994        const selectedBlockClientId = getSelectedBlockClientId();
19995  
19996        if (isShift) {
19997          const selectionEndClientId = getMultiSelectedBlocksEndClientId();
19998          const selectionBeforeEndClientId = getPreviousBlockClientId(selectionEndClientId || selectedBlockClientId);
19999          const selectionAfterEndClientId = getNextBlockClientId(selectionEndClientId || selectedBlockClientId);
20000  
20001          if ( // Ensure that there is a target block.
20002          (isReverse && selectionBeforeEndClientId || !isReverse && selectionAfterEndClientId) && isTabbableEdge(target, isReverse) && isNavEdge(target, isReverse)) {
20003            node.contentEditable = true; // Firefox doesn't automatically move focus.
20004  
20005            node.focus();
20006          }
20007        } else if (isVertical && (0,external_wp_dom_namespaceObject.isVerticalEdge)(target, isReverse) && !keepCaretInsideBlock) {
20008          const closestTabbable = getClosestTabbable(target, isReverse, node, true);
20009  
20010          if (closestTabbable) {
20011            (0,external_wp_dom_namespaceObject.placeCaretAtVerticalEdge)(closestTabbable, isReverse, verticalRect);
20012            event.preventDefault();
20013          }
20014        } else if (isHorizontal && defaultView.getSelection().isCollapsed && (0,external_wp_dom_namespaceObject.isHorizontalEdge)(target, isReverseDir) && !keepCaretInsideBlock) {
20015          const closestTabbable = getClosestTabbable(target, isReverseDir, node);
20016          (0,external_wp_dom_namespaceObject.placeCaretAtHorizontalEdge)(closestTabbable, isReverse);
20017          event.preventDefault();
20018        }
20019      }
20020  
20021      node.addEventListener('mousedown', onMouseDown);
20022      node.addEventListener('keydown', onKeyDown);
20023      return () => {
20024        node.removeEventListener('mousedown', onMouseDown);
20025        node.removeEventListener('keydown', onKeyDown);
20026      };
20027    }, []);
20028  }
20029  
20030  ;// CONCATENATED MODULE: external ["wp","keyboardShortcuts"]
20031  var external_wp_keyboardShortcuts_namespaceObject = window["wp"]["keyboardShortcuts"];
20032  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/writing-flow/use-select-all.js
20033  /**
20034   * External dependencies
20035   */
20036  
20037  /**
20038   * WordPress dependencies
20039   */
20040  
20041  
20042  
20043  
20044  
20045  /**
20046   * Internal dependencies
20047   */
20048  
20049  
20050  function useSelectAll() {
20051    const {
20052      getBlockOrder,
20053      getSelectedBlockClientIds,
20054      getBlockRootClientId
20055    } = (0,external_wp_data_namespaceObject.useSelect)(store);
20056    const {
20057      multiSelect
20058    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
20059    const isMatch = (0,external_wp_keyboardShortcuts_namespaceObject.__unstableUseShortcutEventMatch)();
20060    return (0,external_wp_compose_namespaceObject.useRefEffect)(node => {
20061      function onKeyDown(event) {
20062        if (!isMatch('core/block-editor/select-all', event)) {
20063          return;
20064        }
20065  
20066        const selectedClientIds = getSelectedBlockClientIds();
20067  
20068        if (selectedClientIds.length < 2 && !(0,external_wp_dom_namespaceObject.isEntirelySelected)(event.target)) {
20069          return;
20070        }
20071  
20072        const [firstSelectedClientId] = selectedClientIds;
20073        const rootClientId = getBlockRootClientId(firstSelectedClientId);
20074        let blockClientIds = getBlockOrder(rootClientId); // If we have selected all sibling nested blocks, try selecting up a
20075        // level. See: https://github.com/WordPress/gutenberg/pull/31859/
20076  
20077        if (selectedClientIds.length === blockClientIds.length) {
20078          blockClientIds = getBlockOrder(getBlockRootClientId(rootClientId));
20079        }
20080  
20081        const firstClientId = (0,external_lodash_namespaceObject.first)(blockClientIds);
20082        const lastClientId = (0,external_lodash_namespaceObject.last)(blockClientIds);
20083  
20084        if (firstClientId === lastClientId) {
20085          return;
20086        }
20087  
20088        multiSelect(firstClientId, lastClientId);
20089        event.preventDefault();
20090      }
20091  
20092      node.addEventListener('keydown', onKeyDown);
20093      return () => {
20094        node.removeEventListener('keydown', onKeyDown);
20095      };
20096    }, []);
20097  }
20098  
20099  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/writing-flow/use-drag-selection.js
20100  /**
20101   * WordPress dependencies
20102   */
20103  
20104  
20105  /**
20106   * Internal dependencies
20107   */
20108  
20109  
20110  /**
20111   * Sets the `contenteditable` wrapper element to `value`.
20112   *
20113   * @param {HTMLElement} node  Block element.
20114   * @param {boolean}     value `contentEditable` value (true or false)
20115   */
20116  
20117  function setContentEditableWrapper(node, value) {
20118    node.contentEditable = value; // Firefox doesn't automatically move focus.
20119  
20120    if (value) node.focus();
20121  }
20122  /**
20123   * Sets a multi-selection based on the native selection across blocks.
20124   */
20125  
20126  
20127  function useDragSelection() {
20128    const {
20129      startMultiSelect,
20130      stopMultiSelect
20131    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
20132    const {
20133      isSelectionEnabled,
20134      hasMultiSelection
20135    } = (0,external_wp_data_namespaceObject.useSelect)(store);
20136    return (0,external_wp_compose_namespaceObject.useRefEffect)(node => {
20137      const {
20138        ownerDocument
20139      } = node;
20140      const {
20141        defaultView
20142      } = ownerDocument;
20143      let anchorElement;
20144      let rafId;
20145  
20146      function onMouseUp() {
20147        stopMultiSelect(); // Equivalent to attaching the listener once.
20148  
20149        defaultView.removeEventListener('mouseup', onMouseUp); // The browser selection won't have updated yet at this point,
20150        // so wait until the next animation frame to get the browser
20151        // selection.
20152  
20153        rafId = defaultView.requestAnimationFrame(() => {
20154          if (hasMultiSelection()) {
20155            return;
20156          } // If the selection is complete (on mouse up), and no
20157          // multiple blocks have been selected, set focus back to the
20158          // anchor element. if the anchor element contains the
20159          // selection. Additionally, the contentEditable wrapper can
20160          // now be disabled again.
20161  
20162  
20163          setContentEditableWrapper(node, false);
20164          const selection = defaultView.getSelection();
20165  
20166          if (selection.rangeCount) {
20167            const {
20168              commonAncestorContainer
20169            } = selection.getRangeAt(0);
20170  
20171            if (anchorElement.contains(commonAncestorContainer)) {
20172              anchorElement.focus();
20173            }
20174          }
20175        });
20176      }
20177  
20178      function onMouseLeave(_ref) {
20179        let {
20180          buttons,
20181          target
20182        } = _ref;
20183  
20184        // The primary button must be pressed to initiate selection.
20185        // See https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons
20186        if (buttons !== 1) {
20187          return;
20188        } // Check the attribute, not the contentEditable attribute. All
20189        // child elements of the content editable wrapper are editable
20190        // and return true for this property. We only want to start
20191        // multi selecting when the mouse leaves the wrapper.
20192  
20193  
20194        if (!target.getAttribute('contenteditable')) {
20195          return;
20196        }
20197  
20198        if (!isSelectionEnabled()) {
20199          return;
20200        }
20201  
20202        anchorElement = ownerDocument.activeElement;
20203        startMultiSelect(); // `onSelectionStart` is called after `mousedown` and
20204        // `mouseleave` (from a block). The selection ends when
20205        // `mouseup` happens anywhere in the window.
20206  
20207        defaultView.addEventListener('mouseup', onMouseUp); // Allow cross contentEditable selection by temporarily making
20208        // all content editable. We can't rely on using the store and
20209        // React because re-rending happens too slowly. We need to be
20210        // able to select across instances immediately.
20211  
20212        setContentEditableWrapper(node, true);
20213      }
20214  
20215      node.addEventListener('mouseout', onMouseLeave);
20216      return () => {
20217        node.removeEventListener('mouseout', onMouseLeave);
20218        defaultView.removeEventListener('mouseup', onMouseUp);
20219        defaultView.cancelAnimationFrame(rafId);
20220      };
20221    }, [startMultiSelect, stopMultiSelect, isSelectionEnabled, hasMultiSelection]);
20222  }
20223  
20224  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/writing-flow/use-selection-observer.js
20225  /**
20226   * WordPress dependencies
20227   */
20228  
20229  
20230  /**
20231   * Internal dependencies
20232   */
20233  
20234  
20235  
20236  /**
20237   * Extract the selection start node from the selection. When the anchor node is
20238   * not a text node, the selection offset is the index of a child node.
20239   *
20240   * @param {Selection} selection The selection.
20241   *
20242   * @return {Element} The selection start node.
20243   */
20244  
20245  function extractSelectionStartNode(selection) {
20246    const {
20247      anchorNode,
20248      anchorOffset
20249    } = selection;
20250  
20251    if (anchorNode.nodeType === anchorNode.TEXT_NODE) {
20252      return anchorNode;
20253    }
20254  
20255    return anchorNode.childNodes[anchorOffset];
20256  }
20257  /**
20258   * Extract the selection end node from the selection. When the focus node is not
20259   * a text node, the selection offset is the index of a child node. The selection
20260   * reaches up to but excluding that child node.
20261   *
20262   * @param {Selection} selection The selection.
20263   *
20264   * @return {Element} The selection start node.
20265   */
20266  
20267  
20268  function extractSelectionEndNode(selection) {
20269    const {
20270      focusNode,
20271      focusOffset
20272    } = selection;
20273  
20274    if (focusNode.nodeType === focusNode.TEXT_NODE) {
20275      return focusNode;
20276    }
20277  
20278    return focusNode.childNodes[focusOffset - 1];
20279  }
20280  
20281  function findDepth(a, b) {
20282    let depth = 0;
20283  
20284    while (a[depth] === b[depth]) {
20285      depth++;
20286    }
20287  
20288    return depth;
20289  }
20290  /**
20291   * Sets the `contenteditable` wrapper element to `value`.
20292   *
20293   * @param {HTMLElement} node  Block element.
20294   * @param {boolean}     value `contentEditable` value (true or false)
20295   */
20296  
20297  
20298  function use_selection_observer_setContentEditableWrapper(node, value) {
20299    node.contentEditable = value; // Firefox doesn't automatically move focus.
20300  
20301    if (value) node.focus();
20302  }
20303  /**
20304   * Sets a multi-selection based on the native selection across blocks.
20305   */
20306  
20307  
20308  function useSelectionObserver() {
20309    const {
20310      multiSelect,
20311      selectBlock,
20312      selectionChange
20313    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
20314    const {
20315      getBlockParents,
20316      getBlockSelectionStart
20317    } = (0,external_wp_data_namespaceObject.useSelect)(store);
20318    return (0,external_wp_compose_namespaceObject.useRefEffect)(node => {
20319      const {
20320        ownerDocument
20321      } = node;
20322      const {
20323        defaultView
20324      } = ownerDocument;
20325  
20326      function onSelectionChange(event) {
20327        const selection = defaultView.getSelection(); // If no selection is found, end multi selection and disable the
20328        // contentEditable wrapper.
20329  
20330        if (!selection.rangeCount) {
20331          use_selection_observer_setContentEditableWrapper(node, false);
20332          return;
20333        } // If selection is collapsed and we haven't used `shift+click`,
20334        // end multi selection and disable the contentEditable wrapper.
20335        // We have to check about `shift+click` case because elements
20336        // that don't support text selection might be involved, and we might
20337        // update the clientIds to multi-select blocks.
20338        // For now we check if the event is a `mouse` event.
20339  
20340  
20341        const isClickShift = event.shiftKey && event.type === 'mouseup';
20342  
20343        if (selection.isCollapsed && !isClickShift) {
20344          use_selection_observer_setContentEditableWrapper(node, false);
20345          return;
20346        }
20347  
20348        let startClientId = getBlockClientId(extractSelectionStartNode(selection));
20349        let endClientId = getBlockClientId(extractSelectionEndNode(selection)); // If the selection has changed and we had pressed `shift+click`,
20350        // we need to check if in an element that doesn't support
20351        // text selection has been clicked.
20352  
20353        if (isClickShift) {
20354          const selectedClientId = getBlockSelectionStart();
20355          const clickedClientId = getBlockClientId(event.target); // `endClientId` is not defined if we end the selection by clicking a non-selectable block.
20356          // We need to check if there was already a selection with a non-selectable focusNode.
20357  
20358          const focusNodeIsNonSelectable = clickedClientId !== endClientId;
20359  
20360          if (startClientId === endClientId && selection.isCollapsed || !endClientId || focusNodeIsNonSelectable) {
20361            endClientId = clickedClientId;
20362          } // Handle the case when we have a non-selectable block
20363          // selected and click another one.
20364  
20365  
20366          if (startClientId !== selectedClientId) {
20367            startClientId = selectedClientId;
20368          }
20369        } // If the selection did not involve a block, return.
20370  
20371  
20372        if (startClientId === undefined && endClientId === undefined) {
20373          use_selection_observer_setContentEditableWrapper(node, false);
20374          return;
20375        }
20376  
20377        const isSingularSelection = startClientId === endClientId;
20378  
20379        if (isSingularSelection) {
20380          selectBlock(startClientId);
20381        } else {
20382          const startPath = [...getBlockParents(startClientId), startClientId];
20383          const endPath = [...getBlockParents(endClientId), endClientId];
20384          const depth = findDepth(startPath, endPath);
20385          multiSelect(startPath[depth], endPath[depth]);
20386        }
20387      }
20388  
20389      function addListeners() {
20390        ownerDocument.addEventListener('selectionchange', onSelectionChange);
20391        defaultView.addEventListener('mouseup', onSelectionChange);
20392      }
20393  
20394      function removeListeners() {
20395        ownerDocument.removeEventListener('selectionchange', onSelectionChange);
20396        defaultView.removeEventListener('mouseup', onSelectionChange);
20397      }
20398  
20399      function resetListeners() {
20400        removeListeners();
20401        addListeners();
20402      }
20403  
20404      addListeners(); // We must allow rich text to set selection first. This ensures that
20405      // our `selectionchange` listener is always reset to be called after
20406      // the rich text one.
20407  
20408      node.addEventListener('focusin', resetListeners);
20409      return () => {
20410        removeListeners();
20411        node.removeEventListener('focusin', resetListeners);
20412      };
20413    }, [multiSelect, selectBlock, selectionChange, getBlockParents]);
20414  }
20415  
20416  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/writing-flow/use-click-selection.js
20417  /**
20418   * WordPress dependencies
20419   */
20420  
20421  
20422  /**
20423   * Internal dependencies
20424   */
20425  
20426  
20427  
20428  function useClickSelection() {
20429    const {
20430      selectBlock
20431    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
20432    const {
20433      isSelectionEnabled,
20434      getBlockSelectionStart,
20435      hasMultiSelection
20436    } = (0,external_wp_data_namespaceObject.useSelect)(store);
20437    return (0,external_wp_compose_namespaceObject.useRefEffect)(node => {
20438      function onMouseDown(event) {
20439        // The main button.
20440        // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button
20441        if (!isSelectionEnabled() || event.button !== 0) {
20442          return;
20443        }
20444  
20445        const startClientId = getBlockSelectionStart();
20446        const clickedClientId = getBlockClientId(event.target);
20447  
20448        if (event.shiftKey) {
20449          if (startClientId !== clickedClientId) {
20450            node.contentEditable = true; // Firefox doesn't automatically move focus.
20451  
20452            node.focus();
20453          }
20454        } else if (hasMultiSelection()) {
20455          // Allow user to escape out of a multi-selection to a
20456          // singular selection of a block via click. This is handled
20457          // here since focus handling excludes blocks when there is
20458          // multiselection, as focus can be incurred by starting a
20459          // multiselection (focus moved to first block's multi-
20460          // controls).
20461          selectBlock(clickedClientId);
20462        }
20463      }
20464  
20465      node.addEventListener('mousedown', onMouseDown);
20466      return () => {
20467        node.removeEventListener('mousedown', onMouseDown);
20468      };
20469    }, [selectBlock, isSelectionEnabled, getBlockSelectionStart, hasMultiSelection]);
20470  }
20471  
20472  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/writing-flow/use-input.js
20473  /**
20474   * WordPress dependencies
20475   */
20476  
20477  
20478  
20479  
20480  /**
20481   * Internal dependencies
20482   */
20483  
20484  
20485  /**
20486   * Handles input for selections across blocks.
20487   */
20488  
20489  function useInput() {
20490    const {
20491      __unstableIsFullySelected,
20492      getSelectedBlockClientIds,
20493      __unstableIsSelectionMergeable,
20494      hasMultiSelection
20495    } = (0,external_wp_data_namespaceObject.useSelect)(store);
20496    const {
20497      replaceBlocks,
20498      __unstableSplitSelection,
20499      removeBlocks,
20500      __unstableDeleteSelection,
20501      __unstableExpandSelection
20502    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
20503    return (0,external_wp_compose_namespaceObject.useRefEffect)(node => {
20504      function onKeyDown(event) {
20505        if (event.defaultPrevented) {
20506          return;
20507        }
20508  
20509        if (!hasMultiSelection()) {
20510          return;
20511        }
20512  
20513        if (event.keyCode === external_wp_keycodes_namespaceObject.ENTER) {
20514          node.contentEditable = false;
20515          event.preventDefault();
20516  
20517          if (__unstableIsFullySelected()) {
20518            replaceBlocks(getSelectedBlockClientIds(), (0,external_wp_blocks_namespaceObject.createBlock)((0,external_wp_blocks_namespaceObject.getDefaultBlockName)()));
20519          } else {
20520            __unstableSplitSelection();
20521          }
20522        } else if (event.keyCode === external_wp_keycodes_namespaceObject.BACKSPACE || event.keyCode === external_wp_keycodes_namespaceObject.DELETE) {
20523          node.contentEditable = false;
20524          event.preventDefault();
20525  
20526          if (__unstableIsFullySelected()) {
20527            removeBlocks(getSelectedBlockClientIds());
20528          } else if (__unstableIsSelectionMergeable()) {
20529            __unstableDeleteSelection(event.keyCode === external_wp_keycodes_namespaceObject.DELETE);
20530          } else {
20531            __unstableExpandSelection();
20532          }
20533        } else if ( // If key.length is longer than 1, it's a control key that doesn't
20534        // input anything.
20535        event.key.length === 1 && !(event.metaKey || event.ctrlKey)) {
20536          node.contentEditable = false;
20537  
20538          if (__unstableIsSelectionMergeable()) {
20539            __unstableDeleteSelection(event.keyCode === external_wp_keycodes_namespaceObject.DELETE);
20540          } else {
20541            event.preventDefault(); // Safari does not stop default behaviour with either
20542            // event.preventDefault() or node.contentEditable = false, so
20543            // remove the selection to stop browser manipulation.
20544  
20545            node.ownerDocument.defaultView.getSelection().removeAllRanges();
20546          }
20547        }
20548      }
20549  
20550      function onCompositionStart(event) {
20551        if (!hasMultiSelection()) {
20552          return;
20553        }
20554  
20555        node.contentEditable = false;
20556  
20557        if (__unstableIsSelectionMergeable()) {
20558          __unstableDeleteSelection();
20559        } else {
20560          event.preventDefault(); // Safari does not stop default behaviour with either
20561          // event.preventDefault() or node.contentEditable = false, so
20562          // remove the selection to stop browser manipulation.
20563  
20564          node.ownerDocument.defaultView.getSelection().removeAllRanges();
20565        }
20566      }
20567  
20568      node.addEventListener('keydown', onKeyDown);
20569      node.addEventListener('compositionstart', onCompositionStart);
20570      return () => {
20571        node.removeEventListener('keydown', onKeyDown);
20572        node.removeEventListener('compositionstart', onCompositionStart);
20573      };
20574    }, []);
20575  }
20576  
20577  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/writing-flow/index.js
20578  
20579  
20580  
20581  /**
20582   * External dependencies
20583   */
20584  
20585  /**
20586   * WordPress dependencies
20587   */
20588  
20589  
20590  
20591  
20592  
20593  /**
20594   * Internal dependencies
20595   */
20596  
20597  
20598  
20599  
20600  
20601  
20602  
20603  
20604  
20605  
20606  function useWritingFlow() {
20607    const [before, ref, after] = useTabNav();
20608    const hasMultiSelection = (0,external_wp_data_namespaceObject.useSelect)(select => select(store).hasMultiSelection(), []);
20609    return [before, (0,external_wp_compose_namespaceObject.useMergeRefs)([ref, useInput(), useDragSelection(), useSelectionObserver(), useClickSelection(), useMultiSelection(), useSelectAll(), useArrowNav(), (0,external_wp_compose_namespaceObject.useRefEffect)(node => {
20610      node.tabIndex = -1;
20611      node.contentEditable = hasMultiSelection;
20612  
20613      if (!hasMultiSelection) {
20614        return;
20615      }
20616  
20617      node.setAttribute('aria-label', (0,external_wp_i18n_namespaceObject.__)('Multiple selected blocks'));
20618      return () => {
20619        node.removeAttribute('aria-label');
20620      };
20621    }, [hasMultiSelection])]), after];
20622  }
20623  
20624  function WritingFlow(_ref, forwardedRef) {
20625    let {
20626      children,
20627      ...props
20628    } = _ref;
20629    const [before, ref, after] = useWritingFlow();
20630    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, before, (0,external_wp_element_namespaceObject.createElement)("div", _extends({}, props, {
20631      ref: (0,external_wp_compose_namespaceObject.useMergeRefs)([ref, forwardedRef]),
20632      className: classnames_default()(props.className, 'block-editor-writing-flow')
20633    }), children), after);
20634  }
20635  /**
20636   * Handles selection and navigation across blocks. This component should be
20637   * wrapped around BlockList.
20638   *
20639   * @param {Object}    props          Component properties.
20640   * @param {WPElement} props.children Children to be rendered.
20641   */
20642  
20643  
20644  /* harmony default export */ var writing_flow = ((0,external_wp_element_namespaceObject.forwardRef)(WritingFlow));
20645  
20646  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/iframe/index.js
20647  
20648  
20649  
20650  /**
20651   * External dependencies
20652   */
20653  
20654  /**
20655   * WordPress dependencies
20656   */
20657  
20658  
20659  
20660  
20661  
20662  /**
20663   * Internal dependencies
20664   */
20665  
20666  
20667  
20668  const BODY_CLASS_NAME = 'editor-styles-wrapper';
20669  const BLOCK_PREFIX = 'wp-block';
20670  /**
20671   * Clones stylesheets targetting the editor canvas to the given document. A
20672   * stylesheet is considered targetting the editor a canvas if it contains the
20673   * `editor-styles-wrapper`, `wp-block`, or `wp-block-*` class selectors.
20674   *
20675   * Ideally, this hook should be removed in the future and styles should be added
20676   * explicitly as editor styles.
20677   *
20678   * @param {Document} doc The document to append cloned stylesheets to.
20679   */
20680  
20681  function styleSheetsCompat(doc) {
20682    // Search the document for stylesheets targetting the editor canvas.
20683    Array.from(document.styleSheets).forEach(styleSheet => {
20684      try {
20685        // May fail for external styles.
20686        // eslint-disable-next-line no-unused-expressions
20687        styleSheet.cssRules;
20688      } catch (e) {
20689        return;
20690      }
20691  
20692      const {
20693        ownerNode,
20694        cssRules
20695      } = styleSheet;
20696  
20697      if (!cssRules) {
20698        return;
20699      } // Generally, ignore inline styles. We add inline styles belonging to a
20700      // stylesheet later, which may or may not match the selectors.
20701  
20702  
20703      if (ownerNode.tagName !== 'LINK') {
20704        return;
20705      } // Don't try to add the reset styles, which were removed as a dependency
20706      // from `edit-blocks` for the iframe since we don't need to reset admin
20707      // styles.
20708  
20709  
20710      if (ownerNode.id === 'wp-reset-editor-styles-css') {
20711        return;
20712      }
20713  
20714      const isMatch = Array.from(cssRules).find(_ref => {
20715        let {
20716          selectorText
20717        } = _ref;
20718        return selectorText && (selectorText.includes(`.$BODY_CLASS_NAME}`) || selectorText.includes(`.$BLOCK_PREFIX}`));
20719      });
20720  
20721      if (isMatch && !doc.getElementById(ownerNode.id)) {
20722        // Display warning once we have a way to add style dependencies to the editor.
20723        // See: https://github.com/WordPress/gutenberg/pull/37466.
20724        doc.head.appendChild(ownerNode.cloneNode(true)); // Add inline styles belonging to the stylesheet.
20725  
20726        const inlineCssId = ownerNode.id.replace('-css', '-inline-css');
20727        const inlineCssElement = document.getElementById(inlineCssId);
20728  
20729        if (inlineCssElement) {
20730          doc.head.appendChild(inlineCssElement.cloneNode(true));
20731        }
20732      }
20733    });
20734  }
20735  /**
20736   * Bubbles some event types (keydown, keypress, and dragover) to parent document
20737   * document to ensure that the keyboard shortcuts and drag and drop work.
20738   *
20739   * Ideally, we should remove event bubbling in the future. Keyboard shortcuts
20740   * should be context dependent, e.g. actions on blocks like Cmd+A should not
20741   * work globally outside the block editor.
20742   *
20743   * @param {Document} doc Document to attach listeners to.
20744   */
20745  
20746  
20747  function bubbleEvents(doc) {
20748    const {
20749      defaultView
20750    } = doc;
20751    const {
20752      frameElement
20753    } = defaultView;
20754  
20755    function bubbleEvent(event) {
20756      const prototype = Object.getPrototypeOf(event);
20757      const constructorName = prototype.constructor.name;
20758      const Constructor = window[constructorName];
20759      const init = {};
20760  
20761      for (const key in event) {
20762        init[key] = event[key];
20763      }
20764  
20765      if (event instanceof defaultView.MouseEvent) {
20766        const rect = frameElement.getBoundingClientRect();
20767        init.clientX += rect.left;
20768        init.clientY += rect.top;
20769      }
20770  
20771      const newEvent = new Constructor(event.type, init);
20772      const cancelled = !frameElement.dispatchEvent(newEvent);
20773  
20774      if (cancelled) {
20775        event.preventDefault();
20776      }
20777    }
20778  
20779    const eventTypes = ['dragover'];
20780  
20781    for (const name of eventTypes) {
20782      doc.addEventListener(name, bubbleEvent);
20783    }
20784  }
20785  
20786  function useParsedAssets(html) {
20787    return (0,external_wp_element_namespaceObject.useMemo)(() => {
20788      const doc = document.implementation.createHTMLDocument('');
20789      doc.body.innerHTML = html;
20790      return Array.from(doc.body.children);
20791    }, [html]);
20792  }
20793  
20794  async function loadScript(head, _ref2) {
20795    let {
20796      id,
20797      src
20798    } = _ref2;
20799    return new Promise((resolve, reject) => {
20800      const script = head.ownerDocument.createElement('script');
20801      script.id = id;
20802  
20803      if (src) {
20804        script.src = src;
20805  
20806        script.onload = () => resolve();
20807  
20808        script.onerror = () => reject();
20809      } else {
20810        resolve();
20811      }
20812  
20813      head.appendChild(script);
20814    });
20815  }
20816  
20817  function Iframe(_ref3, ref) {
20818    let {
20819      contentRef,
20820      children,
20821      head,
20822      tabIndex = 0,
20823      assets,
20824      ...props
20825    } = _ref3;
20826    const [, forceRender] = (0,external_wp_element_namespaceObject.useReducer)(() => ({}));
20827    const [iframeDocument, setIframeDocument] = (0,external_wp_element_namespaceObject.useState)();
20828    const [bodyClasses, setBodyClasses] = (0,external_wp_element_namespaceObject.useState)([]);
20829    const styles = useParsedAssets(assets === null || assets === void 0 ? void 0 : assets.styles);
20830    const scripts = useParsedAssets(assets === null || assets === void 0 ? void 0 : assets.scripts);
20831    const clearerRef = useBlockSelectionClearer();
20832    const [before, writingFlowRef, after] = useWritingFlow();
20833    const setRef = (0,external_wp_compose_namespaceObject.useRefEffect)(node => {
20834      function setDocumentIfReady() {
20835        const {
20836          contentDocument,
20837          ownerDocument
20838        } = node;
20839        const {
20840          readyState,
20841          documentElement
20842        } = contentDocument;
20843  
20844        if (readyState !== 'interactive' && readyState !== 'complete') {
20845          return false;
20846        }
20847  
20848        bubbleEvents(contentDocument);
20849        setIframeDocument(contentDocument);
20850        clearerRef(documentElement); // Ideally ALL classes that are added through get_body_class should
20851        // be added in the editor too, which we'll somehow have to get from
20852        // the server in the future (which will run the PHP filters).
20853  
20854        setBodyClasses(Array.from(ownerDocument.body.classList).filter(name => name.startsWith('admin-color-') || name.startsWith('post-type-') || name === 'wp-embed-responsive'));
20855        contentDocument.dir = ownerDocument.dir;
20856        documentElement.removeChild(contentDocument.head);
20857        documentElement.removeChild(contentDocument.body);
20858        return true;
20859      } // Document set with srcDoc is not immediately ready.
20860  
20861  
20862      node.addEventListener('load', setDocumentIfReady);
20863      return () => node.removeEventListener('load', setDocumentIfReady);
20864    }, []);
20865    const headRef = (0,external_wp_compose_namespaceObject.useRefEffect)(element => {
20866      scripts.reduce((promise, script) => promise.then(() => loadScript(element, script)), Promise.resolve()).finally(() => {
20867        // When script are loaded, re-render blocks to allow them
20868        // to initialise.
20869        forceRender();
20870      });
20871    }, []);
20872    const bodyRef = (0,external_wp_compose_namespaceObject.useMergeRefs)([contentRef, clearerRef, writingFlowRef]);
20873    (0,external_wp_element_namespaceObject.useEffect)(() => {
20874      if (iframeDocument) {
20875        styleSheetsCompat(iframeDocument);
20876      }
20877    }, [iframeDocument]);
20878    head = (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)("style", null, 'body{margin:0}'), styles.map(_ref4 => {
20879      let {
20880        tagName,
20881        href,
20882        id,
20883        rel,
20884        media,
20885        textContent
20886      } = _ref4;
20887      const TagName = tagName.toLowerCase();
20888  
20889      if (TagName === 'style') {
20890        return (0,external_wp_element_namespaceObject.createElement)(TagName, {
20891          id,
20892          key: id
20893        }, textContent);
20894      }
20895  
20896      return (0,external_wp_element_namespaceObject.createElement)(TagName, {
20897        href,
20898        id,
20899        rel,
20900        media,
20901        key: id
20902      });
20903    }), head);
20904    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, tabIndex >= 0 && before, (0,external_wp_element_namespaceObject.createElement)("iframe", _extends({}, props, {
20905      ref: (0,external_wp_compose_namespaceObject.useMergeRefs)([ref, setRef]),
20906      tabIndex: tabIndex // Correct doctype is required to enable rendering in standards mode
20907      ,
20908      srcDoc: "<!doctype html>",
20909      title: (0,external_wp_i18n_namespaceObject.__)('Editor canvas')
20910    }), iframeDocument && (0,external_wp_element_namespaceObject.createPortal)((0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)("head", {
20911      ref: headRef
20912    }, head), (0,external_wp_element_namespaceObject.createElement)("body", {
20913      ref: bodyRef,
20914      className: classnames_default()(BODY_CLASS_NAME, ...bodyClasses)
20915    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalStyleProvider, {
20916      document: iframeDocument
20917    }, children))), iframeDocument.documentElement)), tabIndex >= 0 && after);
20918  }
20919  
20920  /* harmony default export */ var iframe = ((0,external_wp_element_namespaceObject.forwardRef)(Iframe));
20921  
20922  ;// CONCATENATED MODULE: ./node_modules/colord/index.mjs
20923  var r={grad:.9,turn:360,rad:360/(2*Math.PI)},t=function(r){return"string"==typeof r?r.length>0:"number"==typeof r},n=function(r,t,n){return void 0===t&&(t=0),void 0===n&&(n=Math.pow(10,t)),Math.round(n*r)/n+0},e=function(r,t,n){return void 0===t&&(t=0),void 0===n&&(n=1),r>n?n:r>t?r:t},u=function(r){return(r=isFinite(r)?r%360:0)>0?r:r+360},a=function(r){return{r:e(r.r,0,255),g:e(r.g,0,255),b:e(r.b,0,255),a:e(r.a)}},o=function(r){return{r:n(r.r),g:n(r.g),b:n(r.b),a:n(r.a,3)}},i=/^#([0-9a-f]{3,8})$/i,s=function(r){var t=r.toString(16);return t.length<2?"0"+t:t},h=function(r){var t=r.r,n=r.g,e=r.b,u=r.a,a=Math.max(t,n,e),o=a-Math.min(t,n,e),i=o?a===t?(n-e)/o:a===n?2+(e-t)/o:4+(t-n)/o:0;return{h:60*(i<0?i+6:i),s:a?o/a*100:0,v:a/255*100,a:u}},b=function(r){var t=r.h,n=r.s,e=r.v,u=r.a;t=t/360*6,n/=100,e/=100;var a=Math.floor(t),o=e*(1-n),i=e*(1-(t-a)*n),s=e*(1-(1-t+a)*n),h=a%6;return{r:255*[e,i,o,o,s,e][h],g:255*[s,e,e,i,o,o][h],b:255*[o,o,s,e,e,i][h],a:u}},g=function(r){return{h:u(r.h),s:e(r.s,0,100),l:e(r.l,0,100),a:e(r.a)}},d=function(r){return{h:n(r.h),s:n(r.s),l:n(r.l),a:n(r.a,3)}},f=function(r){return b((n=(t=r).s,{h:t.h,s:(n*=((e=t.l)<50?e:100-e)/100)>0?2*n/(e+n)*100:0,v:e+n,a:t.a}));var t,n,e},c=function(r){return{h:(t=h(r)).h,s:(u=(200-(n=t.s))*(e=t.v)/100)>0&&u<200?n*e/100/(u<=100?u:200-u)*100:0,l:u/2,a:t.a};var t,n,e,u},l=/^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s*,\s*([+-]?\d*\.?\d+)%\s*,\s*([+-]?\d*\.?\d+)%\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,p=/^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s+([+-]?\d*\.?\d+)%\s+([+-]?\d*\.?\d+)%\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,v=/^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,m=/^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,y={string:[[function(r){var t=i.exec(r);return t?(r=t[1]).length<=4?{r:parseInt(r[0]+r[0],16),g:parseInt(r[1]+r[1],16),b:parseInt(r[2]+r[2],16),a:4===r.length?n(parseInt(r[3]+r[3],16)/255,2):1}:6===r.length||8===r.length?{r:parseInt(r.substr(0,2),16),g:parseInt(r.substr(2,2),16),b:parseInt(r.substr(4,2),16),a:8===r.length?n(parseInt(r.substr(6,2),16)/255,2):1}:null:null},"hex"],[function(r){var t=v.exec(r)||m.exec(r);return t?t[2]!==t[4]||t[4]!==t[6]?null:a({r:Number(t[1])/(t[2]?100/255:1),g:Number(t[3])/(t[4]?100/255:1),b:Number(t[5])/(t[6]?100/255:1),a:void 0===t[7]?1:Number(t[7])/(t[8]?100:1)}):null},"rgb"],[function(t){var n=l.exec(t)||p.exec(t);if(!n)return null;var e,u,a=g({h:(e=n[1],u=n[2],void 0===u&&(u="deg"),Number(e)*(r[u]||1)),s:Number(n[3]),l:Number(n[4]),a:void 0===n[5]?1:Number(n[5])/(n[6]?100:1)});return f(a)},"hsl"]],object:[[function(r){var n=r.r,e=r.g,u=r.b,o=r.a,i=void 0===o?1:o;return t(n)&&t(e)&&t(u)?a({r:Number(n),g:Number(e),b:Number(u),a:Number(i)}):null},"rgb"],[function(r){var n=r.h,e=r.s,u=r.l,a=r.a,o=void 0===a?1:a;if(!t(n)||!t(e)||!t(u))return null;var i=g({h:Number(n),s:Number(e),l:Number(u),a:Number(o)});return f(i)},"hsl"],[function(r){var n=r.h,a=r.s,o=r.v,i=r.a,s=void 0===i?1:i;if(!t(n)||!t(a)||!t(o))return null;var h=function(r){return{h:u(r.h),s:e(r.s,0,100),v:e(r.v,0,100),a:e(r.a)}}({h:Number(n),s:Number(a),v:Number(o),a:Number(s)});return b(h)},"hsv"]]},N=function(r,t){for(var n=0;n<t.length;n++){var e=t[n][0](r);if(e)return[e,t[n][1]]}return[null,void 0]},x=function(r){return"string"==typeof r?N(r.trim(),y.string):"object"==typeof r&&null!==r?N(r,y.object):[null,void 0]},I=function(r){return x(r)[1]},M=function(r,t){var n=c(r);return{h:n.h,s:e(n.s+100*t,0,100),l:n.l,a:n.a}},H=function(r){return(299*r.r+587*r.g+114*r.b)/1e3/255},$=function(r,t){var n=c(r);return{h:n.h,s:n.s,l:e(n.l+100*t,0,100),a:n.a}},j=function(){function r(r){this.parsed=x(r)[0],this.rgba=this.parsed||{r:0,g:0,b:0,a:1}}return r.prototype.isValid=function(){return null!==this.parsed},r.prototype.brightness=function(){return n(H(this.rgba),2)},r.prototype.isDark=function(){return H(this.rgba)<.5},r.prototype.isLight=function(){return H(this.rgba)>=.5},r.prototype.toHex=function(){return r=o(this.rgba),t=r.r,e=r.g,u=r.b,i=(a=r.a)<1?s(n(255*a)):"","#"+s(t)+s(e)+s(u)+i;var r,t,e,u,a,i},r.prototype.toRgb=function(){return o(this.rgba)},r.prototype.toRgbString=function(){return r=o(this.rgba),t=r.r,n=r.g,e=r.b,(u=r.a)<1?"rgba("+t+", "+n+", "+e+", "+u+")":"rgb("+t+", "+n+", "+e+")";var r,t,n,e,u},r.prototype.toHsl=function(){return d(c(this.rgba))},r.prototype.toHslString=function(){return r=d(c(this.rgba)),t=r.h,n=r.s,e=r.l,(u=r.a)<1?"hsla("+t+", "+n+"%, "+e+"%, "+u+")":"hsl("+t+", "+n+"%, "+e+"%)";var r,t,n,e,u},r.prototype.toHsv=function(){return r=h(this.rgba),{h:n(r.h),s:n(r.s),v:n(r.v),a:n(r.a,3)};var r},r.prototype.invert=function(){return w({r:255-(r=this.rgba).r,g:255-r.g,b:255-r.b,a:r.a});var r},r.prototype.saturate=function(r){return void 0===r&&(r=.1),w(M(this.rgba,r))},r.prototype.desaturate=function(r){return void 0===r&&(r=.1),w(M(this.rgba,-r))},r.prototype.grayscale=function(){return w(M(this.rgba,-1))},r.prototype.lighten=function(r){return void 0===r&&(r=.1),w($(this.rgba,r))},r.prototype.darken=function(r){return void 0===r&&(r=.1),w($(this.rgba,-r))},r.prototype.rotate=function(r){return void 0===r&&(r=15),this.hue(this.hue()+r)},r.prototype.alpha=function(r){return"number"==typeof r?w({r:(t=this.rgba).r,g:t.g,b:t.b,a:r}):n(this.rgba.a,3);var t},r.prototype.hue=function(r){var t=c(this.rgba);return"number"==typeof r?w({h:r,s:t.s,l:t.l,a:t.a}):n(t.h)},r.prototype.isEqual=function(r){return this.toHex()===w(r).toHex()},r}(),w=function(r){return r instanceof j?r:new j(r)},S=[],k=function(r){r.forEach(function(r){S.indexOf(r)<0&&(r(j,y),S.push(r))})},E=function(){return new j({r:255*Math.random(),g:255*Math.random(),b:255*Math.random()})};
20924  
20925  ;// CONCATENATED MODULE: ./node_modules/colord/plugins/names.mjs
20926  /* harmony default export */ function names(e,f){var a={white:"#ffffff",bisque:"#ffe4c4",blue:"#0000ff",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",antiquewhite:"#faebd7",aqua:"#00ffff",azure:"#f0ffff",whitesmoke:"#f5f5f5",papayawhip:"#ffefd5",plum:"#dda0dd",blanchedalmond:"#ffebcd",black:"#000000",gold:"#ffd700",goldenrod:"#daa520",gainsboro:"#dcdcdc",cornsilk:"#fff8dc",cornflowerblue:"#6495ed",burlywood:"#deb887",aquamarine:"#7fffd4",beige:"#f5f5dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkkhaki:"#bdb76b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",peachpuff:"#ffdab9",darkmagenta:"#8b008b",darkred:"#8b0000",darkorchid:"#9932cc",darkorange:"#ff8c00",darkslateblue:"#483d8b",gray:"#808080",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",deeppink:"#ff1493",deepskyblue:"#00bfff",wheat:"#f5deb3",firebrick:"#b22222",floralwhite:"#fffaf0",ghostwhite:"#f8f8ff",darkviolet:"#9400d3",magenta:"#ff00ff",green:"#008000",dodgerblue:"#1e90ff",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",blueviolet:"#8a2be2",forestgreen:"#228b22",lawngreen:"#7cfc00",indianred:"#cd5c5c",indigo:"#4b0082",fuchsia:"#ff00ff",brown:"#a52a2a",maroon:"#800000",mediumblue:"#0000cd",lightcoral:"#f08080",darkturquoise:"#00ced1",lightcyan:"#e0ffff",ivory:"#fffff0",lightyellow:"#ffffe0",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",linen:"#faf0e6",mediumaquamarine:"#66cdaa",lemonchiffon:"#fffacd",lime:"#00ff00",khaki:"#f0e68c",mediumseagreen:"#3cb371",limegreen:"#32cd32",mediumspringgreen:"#00fa9a",lightskyblue:"#87cefa",lightblue:"#add8e6",midnightblue:"#191970",lightpink:"#ffb6c1",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",mintcream:"#f5fffa",lightslategray:"#778899",lightslategrey:"#778899",navajowhite:"#ffdead",navy:"#000080",mediumvioletred:"#c71585",powderblue:"#b0e0e6",palegoldenrod:"#eee8aa",oldlace:"#fdf5e6",paleturquoise:"#afeeee",mediumturquoise:"#48d1cc",mediumorchid:"#ba55d3",rebeccapurple:"#663399",lightsteelblue:"#b0c4de",mediumslateblue:"#7b68ee",thistle:"#d8bfd8",tan:"#d2b48c",orchid:"#da70d6",mediumpurple:"#9370db",purple:"#800080",pink:"#ffc0cb",skyblue:"#87ceeb",springgreen:"#00ff7f",palegreen:"#98fb98",red:"#ff0000",yellow:"#ffff00",slateblue:"#6a5acd",lavenderblush:"#fff0f5",peru:"#cd853f",palevioletred:"#db7093",violet:"#ee82ee",teal:"#008080",slategray:"#708090",slategrey:"#708090",aliceblue:"#f0f8ff",darkseagreen:"#8fbc8f",darkolivegreen:"#556b2f",greenyellow:"#adff2f",seagreen:"#2e8b57",seashell:"#fff5ee",tomato:"#ff6347",silver:"#c0c0c0",sienna:"#a0522d",lavender:"#e6e6fa",lightgreen:"#90ee90",orange:"#ffa500",orangered:"#ff4500",steelblue:"#4682b4",royalblue:"#4169e1",turquoise:"#40e0d0",yellowgreen:"#9acd32",salmon:"#fa8072",saddlebrown:"#8b4513",sandybrown:"#f4a460",rosybrown:"#bc8f8f",darksalmon:"#e9967a",lightgoldenrodyellow:"#fafad2",snow:"#fffafa",lightgrey:"#d3d3d3",lightgray:"#d3d3d3",dimgray:"#696969",dimgrey:"#696969",olivedrab:"#6b8e23",olive:"#808000"},r={};for(var d in a)r[a[d]]=d;var l={};e.prototype.toName=function(f){if(!(this.rgba.a||this.rgba.r||this.rgba.g||this.rgba.b))return"transparent";var d,i,n=r[this.toHex()];if(n)return n;if(null==f?void 0:f.closest){var o=this.toRgb(),t=1/0,b="black";if(!l.length)for(var c in a)l[c]=new e(a[c]).toRgb();for(var g in a){var u=(d=o,i=l[g],Math.pow(d.r-i.r,2)+Math.pow(d.g-i.g,2)+Math.pow(d.b-i.b,2));u<t&&(t=u,b=g)}return b}};f.string.push([function(f){var r=f.toLowerCase(),d="transparent"===r?"#0000":a[r];return d?new e(d).toRgb():null},"name"])}
20927  
20928  ;// CONCATENATED MODULE: ./node_modules/colord/plugins/a11y.mjs
20929  var a11y_o=function(o){var t=o/255;return t<.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)},a11y_t=function(t){return.2126*a11y_o(t.r)+.7152*a11y_o(t.g)+.0722*a11y_o(t.b)};/* harmony default export */ function a11y(o){o.prototype.luminance=function(){return o=a11y_t(this.rgba),void 0===(r=2)&&(r=0),void 0===n&&(n=Math.pow(10,r)),Math.round(n*o)/n+0;var o,r,n},o.prototype.contrast=function(r){void 0===r&&(r="#FFF");var n,a,i,e,v,u,d,c=r instanceof o?r:new o(r);return e=this.rgba,v=c.toRgb(),u=a11y_t(e),d=a11y_t(v),n=u>d?(u+.05)/(d+.05):(d+.05)/(u+.05),void 0===(a=2)&&(a=0),void 0===i&&(i=Math.pow(10,a)),Math.floor(i*n)/i+0},o.prototype.isReadable=function(o,t){return void 0===o&&(o="#FFF"),void 0===t&&(t={}),this.contrast(o)>=(e=void 0===(i=(r=t).size)?"normal":i,"AAA"===(a=void 0===(n=r.level)?"AA":n)&&"normal"===e?7:"AA"===a&&"large"===e?3:4.5);var r,n,a,i,e}}
20930  
20931  // EXTERNAL MODULE: ./node_modules/traverse/index.js
20932  var traverse = __webpack_require__(3124);
20933  var traverse_default = /*#__PURE__*/__webpack_require__.n(traverse);
20934  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/utils/transform-styles/ast/parse.js
20935  /* eslint-disable @wordpress/no-unused-vars-before-return */
20936  // Adapted from https://github.com/reworkcss/css
20937  // because we needed to remove source map support.
20938  // http://www.w3.org/TR/CSS21/grammar.htm
20939  // https://github.com/visionmedia/css-parse/pull/49#issuecomment-30088027
20940  const commentre = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//g;
20941  /* harmony default export */ function parse(css, options) {
20942    options = options || {};
20943    /**
20944     * Positional.
20945     */
20946  
20947    let lineno = 1;
20948    let column = 1;
20949    /**
20950     * Update lineno and column based on `str`.
20951     */
20952  
20953    function updatePosition(str) {
20954      const lines = str.match(/\n/g);
20955  
20956      if (lines) {
20957        lineno += lines.length;
20958      }
20959  
20960      const i = str.lastIndexOf('\n'); // eslint-disable-next-line no-bitwise
20961  
20962      column = ~i ? str.length - i : column + str.length;
20963    }
20964    /**
20965     * Mark position and patch `node.position`.
20966     */
20967  
20968  
20969    function position() {
20970      const start = {
20971        line: lineno,
20972        column
20973      };
20974      return function (node) {
20975        node.position = new Position(start);
20976        whitespace();
20977        return node;
20978      };
20979    }
20980    /**
20981     * Store position information for a node
20982     */
20983  
20984  
20985    function Position(start) {
20986      this.start = start;
20987      this.end = {
20988        line: lineno,
20989        column
20990      };
20991      this.source = options.source;
20992    }
20993    /**
20994     * Non-enumerable source string
20995     */
20996  
20997  
20998    Position.prototype.content = css;
20999    /**
21000     * Error `msg`.
21001     */
21002  
21003    const errorsList = [];
21004  
21005    function error(msg) {
21006      const err = new Error(options.source + ':' + lineno + ':' + column + ': ' + msg);
21007      err.reason = msg;
21008      err.filename = options.source;
21009      err.line = lineno;
21010      err.column = column;
21011      err.source = css;
21012  
21013      if (options.silent) {
21014        errorsList.push(err);
21015      } else {
21016        throw err;
21017      }
21018    }
21019    /**
21020     * Parse stylesheet.
21021     */
21022  
21023  
21024    function stylesheet() {
21025      const rulesList = rules();
21026      return {
21027        type: 'stylesheet',
21028        stylesheet: {
21029          source: options.source,
21030          rules: rulesList,
21031          parsingErrors: errorsList
21032        }
21033      };
21034    }
21035    /**
21036     * Opening brace.
21037     */
21038  
21039  
21040    function open() {
21041      return match(/^{\s*/);
21042    }
21043    /**
21044     * Closing brace.
21045     */
21046  
21047  
21048    function close() {
21049      return match(/^}/);
21050    }
21051    /**
21052     * Parse ruleset.
21053     */
21054  
21055  
21056    function rules() {
21057      let node;
21058      const accumulator = [];
21059      whitespace();
21060      comments(accumulator);
21061  
21062      while (css.length && css.charAt(0) !== '}' && (node = atrule() || rule())) {
21063        if (node !== false) {
21064          accumulator.push(node);
21065          comments(accumulator);
21066        }
21067      }
21068  
21069      return accumulator;
21070    }
21071    /**
21072     * Match `re` and return captures.
21073     */
21074  
21075  
21076    function match(re) {
21077      const m = re.exec(css);
21078  
21079      if (!m) {
21080        return;
21081      }
21082  
21083      const str = m[0];
21084      updatePosition(str);
21085      css = css.slice(str.length);
21086      return m;
21087    }
21088    /**
21089     * Parse whitespace.
21090     */
21091  
21092  
21093    function whitespace() {
21094      match(/^\s*/);
21095    }
21096    /**
21097     * Parse comments;
21098     */
21099  
21100  
21101    function comments(accumulator) {
21102      let c;
21103      accumulator = accumulator || []; // eslint-disable-next-line no-cond-assign
21104  
21105      while (c = comment()) {
21106        if (c !== false) {
21107          accumulator.push(c);
21108        }
21109      }
21110  
21111      return accumulator;
21112    }
21113    /**
21114     * Parse comment.
21115     */
21116  
21117  
21118    function comment() {
21119      const pos = position();
21120  
21121      if ('/' !== css.charAt(0) || '*' !== css.charAt(1)) {
21122        return;
21123      }
21124  
21125      let i = 2;
21126  
21127      while ('' !== css.charAt(i) && ('*' !== css.charAt(i) || '/' !== css.charAt(i + 1))) {
21128        ++i;
21129      }
21130  
21131      i += 2;
21132  
21133      if ('' === css.charAt(i - 1)) {
21134        return error('End of comment missing');
21135      }
21136  
21137      const str = css.slice(2, i - 2);
21138      column += 2;
21139      updatePosition(str);
21140      css = css.slice(i);
21141      column += 2;
21142      return pos({
21143        type: 'comment',
21144        comment: str
21145      });
21146    }
21147    /**
21148     * Parse selector.
21149     */
21150  
21151  
21152    function selector() {
21153      const m = match(/^([^{]+)/);
21154  
21155      if (!m) {
21156        return;
21157      } // FIXME: Remove all comments from selectors http://ostermiller.org/findcomment.html
21158  
21159  
21160      return trim(m[0]).replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*\/+/g, '').replace(/"(?:\\"|[^"])*"|'(?:\\'|[^'])*'/g, function (matched) {
21161        return matched.replace(/,/g, '\u200C');
21162      }).split(/\s*(?![^(]*\)),\s*/).map(function (s) {
21163        return s.replace(/\u200C/g, ',');
21164      });
21165    }
21166    /**
21167     * Parse declaration.
21168     */
21169  
21170  
21171    function declaration() {
21172      const pos = position(); // prop.
21173  
21174      let prop = match(/^(\*?[-#\/\*\\\w]+(\[[0-9a-z_-]+\])?)\s*/);
21175  
21176      if (!prop) {
21177        return;
21178      }
21179  
21180      prop = trim(prop[0]); // :
21181  
21182      if (!match(/^:\s*/)) {
21183        return error("property missing ':'");
21184      } // val.
21185  
21186  
21187      const val = match(/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^\)]*?\)|[^};])+)/);
21188      const ret = pos({
21189        type: 'declaration',
21190        property: prop.replace(commentre, ''),
21191        value: val ? trim(val[0]).replace(commentre, '') : ''
21192      }); // ;
21193  
21194      match(/^[;\s]*/);
21195      return ret;
21196    }
21197    /**
21198     * Parse declarations.
21199     */
21200  
21201  
21202    function declarations() {
21203      const decls = [];
21204  
21205      if (!open()) {
21206        return error("missing '{'");
21207      }
21208  
21209      comments(decls); // declarations.
21210  
21211      let decl; // eslint-disable-next-line no-cond-assign
21212  
21213      while (decl = declaration()) {
21214        if (decl !== false) {
21215          decls.push(decl);
21216          comments(decls);
21217        }
21218      }
21219  
21220      if (!close()) {
21221        return error("missing '}'");
21222      }
21223  
21224      return decls;
21225    }
21226    /**
21227     * Parse keyframe.
21228     */
21229  
21230  
21231    function keyframe() {
21232      let m;
21233      const vals = [];
21234      const pos = position(); // eslint-disable-next-line no-cond-assign
21235  
21236      while (m = match(/^((\d+\.\d+|\.\d+|\d+)%?|[a-z]+)\s*/)) {
21237        vals.push(m[1]);
21238        match(/^,\s*/);
21239      }
21240  
21241      if (!vals.length) {
21242        return;
21243      }
21244  
21245      return pos({
21246        type: 'keyframe',
21247        values: vals,
21248        declarations: declarations()
21249      });
21250    }
21251    /**
21252     * Parse keyframes.
21253     */
21254  
21255  
21256    function atkeyframes() {
21257      const pos = position();
21258      let m = match(/^@([-\w]+)?keyframes\s*/);
21259  
21260      if (!m) {
21261        return;
21262      }
21263  
21264      const vendor = m[1]; // identifier
21265  
21266      m = match(/^([-\w]+)\s*/);
21267  
21268      if (!m) {
21269        return error('@keyframes missing name');
21270      }
21271  
21272      const name = m[1];
21273  
21274      if (!open()) {
21275        return error("@keyframes missing '{'");
21276      }
21277  
21278      let frame;
21279      let frames = comments(); // eslint-disable-next-line no-cond-assign
21280  
21281      while (frame = keyframe()) {
21282        frames.push(frame);
21283        frames = frames.concat(comments());
21284      }
21285  
21286      if (!close()) {
21287        return error("@keyframes missing '}'");
21288      }
21289  
21290      return pos({
21291        type: 'keyframes',
21292        name,
21293        vendor,
21294        keyframes: frames
21295      });
21296    }
21297    /**
21298     * Parse supports.
21299     */
21300  
21301  
21302    function atsupports() {
21303      const pos = position();
21304      const m = match(/^@supports *([^{]+)/);
21305  
21306      if (!m) {
21307        return;
21308      }
21309  
21310      const supports = trim(m[1]);
21311  
21312      if (!open()) {
21313        return error("@supports missing '{'");
21314      }
21315  
21316      const style = comments().concat(rules());
21317  
21318      if (!close()) {
21319        return error("@supports missing '}'");
21320      }
21321  
21322      return pos({
21323        type: 'supports',
21324        supports,
21325        rules: style
21326      });
21327    }
21328    /**
21329     * Parse host.
21330     */
21331  
21332  
21333    function athost() {
21334      const pos = position();
21335      const m = match(/^@host\s*/);
21336  
21337      if (!m) {
21338        return;
21339      }
21340  
21341      if (!open()) {
21342        return error("@host missing '{'");
21343      }
21344  
21345      const style = comments().concat(rules());
21346  
21347      if (!close()) {
21348        return error("@host missing '}'");
21349      }
21350  
21351      return pos({
21352        type: 'host',
21353        rules: style
21354      });
21355    }
21356    /**
21357     * Parse media.
21358     */
21359  
21360  
21361    function atmedia() {
21362      const pos = position();
21363      const m = match(/^@media *([^{]+)/);
21364  
21365      if (!m) {
21366        return;
21367      }
21368  
21369      const media = trim(m[1]);
21370  
21371      if (!open()) {
21372        return error("@media missing '{'");
21373      }
21374  
21375      const style = comments().concat(rules());
21376  
21377      if (!close()) {
21378        return error("@media missing '}'");
21379      }
21380  
21381      return pos({
21382        type: 'media',
21383        media,
21384        rules: style
21385      });
21386    }
21387    /**
21388     * Parse custom-media.
21389     */
21390  
21391  
21392    function atcustommedia() {
21393      const pos = position();
21394      const m = match(/^@custom-media\s+(--[^\s]+)\s*([^{;]+);/);
21395  
21396      if (!m) {
21397        return;
21398      }
21399  
21400      return pos({
21401        type: 'custom-media',
21402        name: trim(m[1]),
21403        media: trim(m[2])
21404      });
21405    }
21406    /**
21407     * Parse paged media.
21408     */
21409  
21410  
21411    function atpage() {
21412      const pos = position();
21413      const m = match(/^@page */);
21414  
21415      if (!m) {
21416        return;
21417      }
21418  
21419      const sel = selector() || [];
21420  
21421      if (!open()) {
21422        return error("@page missing '{'");
21423      }
21424  
21425      let decls = comments(); // declarations.
21426  
21427      let decl; // eslint-disable-next-line no-cond-assign
21428  
21429      while (decl = declaration()) {
21430        decls.push(decl);
21431        decls = decls.concat(comments());
21432      }
21433  
21434      if (!close()) {
21435        return error("@page missing '}'");
21436      }
21437  
21438      return pos({
21439        type: 'page',
21440        selectors: sel,
21441        declarations: decls
21442      });
21443    }
21444    /**
21445     * Parse document.
21446     */
21447  
21448  
21449    function atdocument() {
21450      const pos = position();
21451      const m = match(/^@([-\w]+)?document *([^{]+)/);
21452  
21453      if (!m) {
21454        return;
21455      }
21456  
21457      const vendor = trim(m[1]);
21458      const doc = trim(m[2]);
21459  
21460      if (!open()) {
21461        return error("@document missing '{'");
21462      }
21463  
21464      const style = comments().concat(rules());
21465  
21466      if (!close()) {
21467        return error("@document missing '}'");
21468      }
21469  
21470      return pos({
21471        type: 'document',
21472        document: doc,
21473        vendor,
21474        rules: style
21475      });
21476    }
21477    /**
21478     * Parse font-face.
21479     */
21480  
21481  
21482    function atfontface() {
21483      const pos = position();
21484      const m = match(/^@font-face\s*/);
21485  
21486      if (!m) {
21487        return;
21488      }
21489  
21490      if (!open()) {
21491        return error("@font-face missing '{'");
21492      }
21493  
21494      let decls = comments(); // declarations.
21495  
21496      let decl; // eslint-disable-next-line no-cond-assign
21497  
21498      while (decl = declaration()) {
21499        decls.push(decl);
21500        decls = decls.concat(comments());
21501      }
21502  
21503      if (!close()) {
21504        return error("@font-face missing '}'");
21505      }
21506  
21507      return pos({
21508        type: 'font-face',
21509        declarations: decls
21510      });
21511    }
21512    /**
21513     * Parse import
21514     */
21515  
21516  
21517    const atimport = _compileAtrule('import');
21518    /**
21519     * Parse charset
21520     */
21521  
21522  
21523    const atcharset = _compileAtrule('charset');
21524    /**
21525     * Parse namespace
21526     */
21527  
21528  
21529    const atnamespace = _compileAtrule('namespace');
21530    /**
21531     * Parse non-block at-rules
21532     */
21533  
21534  
21535    function _compileAtrule(name) {
21536      const re = new RegExp('^@' + name + '\\s*([^;]+);');
21537      return function () {
21538        const pos = position();
21539        const m = match(re);
21540  
21541        if (!m) {
21542          return;
21543        }
21544  
21545        const ret = {
21546          type: name
21547        };
21548        ret[name] = m[1].trim();
21549        return pos(ret);
21550      };
21551    }
21552    /**
21553     * Parse at rule.
21554     */
21555  
21556  
21557    function atrule() {
21558      if (css[0] !== '@') {
21559        return;
21560      }
21561  
21562      return atkeyframes() || atmedia() || atcustommedia() || atsupports() || atimport() || atcharset() || atnamespace() || atdocument() || atpage() || athost() || atfontface();
21563    }
21564    /**
21565     * Parse rule.
21566     */
21567  
21568  
21569    function rule() {
21570      const pos = position();
21571      const sel = selector();
21572  
21573      if (!sel) {
21574        return error('selector missing');
21575      }
21576  
21577      comments();
21578      return pos({
21579        type: 'rule',
21580        selectors: sel,
21581        declarations: declarations()
21582      });
21583    }
21584  
21585    return addParent(stylesheet());
21586  }
21587  /**
21588   * Trim `str`.
21589   */
21590  
21591  function trim(str) {
21592    return str ? str.replace(/^\s+|\s+$/g, '') : '';
21593  }
21594  /**
21595   * Adds non-enumerable parent node reference to each node.
21596   */
21597  
21598  
21599  function addParent(obj, parent) {
21600    const isNode = obj && typeof obj.type === 'string';
21601    const childParent = isNode ? obj : parent;
21602  
21603    for (const k in obj) {
21604      const value = obj[k];
21605  
21606      if (Array.isArray(value)) {
21607        value.forEach(function (v) {
21608          addParent(v, childParent);
21609        });
21610      } else if (value && typeof value === 'object') {
21611        addParent(value, childParent);
21612      }
21613    }
21614  
21615    if (isNode) {
21616      Object.defineProperty(obj, 'parent', {
21617        configurable: true,
21618        writable: true,
21619        enumerable: false,
21620        value: parent || null
21621      });
21622    }
21623  
21624    return obj;
21625  }
21626  /* eslint-enable @wordpress/no-unused-vars-before-return */
21627  
21628  // EXTERNAL MODULE: ./node_modules/inherits/inherits_browser.js
21629  var inherits_browser = __webpack_require__(8575);
21630  var inherits_browser_default = /*#__PURE__*/__webpack_require__.n(inherits_browser);
21631  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/utils/transform-styles/ast/stringify/compiler.js
21632  // Adapted from https://github.com/reworkcss/css
21633  // because we needed to remove source map support.
21634  
21635  /**
21636   * Expose `Compiler`.
21637   */
21638  /* harmony default export */ var compiler = (Compiler);
21639  /**
21640   * Initialize a compiler.
21641   */
21642  
21643  function Compiler(opts) {
21644    this.options = opts || {};
21645  }
21646  /**
21647   * Emit `str`
21648   */
21649  
21650  
21651  Compiler.prototype.emit = function (str) {
21652    return str;
21653  };
21654  /**
21655   * Visit `node`.
21656   */
21657  
21658  
21659  Compiler.prototype.visit = function (node) {
21660    return this[node.type](node);
21661  };
21662  /**
21663   * Map visit over array of `nodes`, optionally using a `delim`
21664   */
21665  
21666  
21667  Compiler.prototype.mapVisit = function (nodes, delim) {
21668    let buf = '';
21669    delim = delim || '';
21670  
21671    for (let i = 0, length = nodes.length; i < length; i++) {
21672      buf += this.visit(nodes[i]);
21673  
21674      if (delim && i < length - 1) {
21675        buf += this.emit(delim);
21676      }
21677    }
21678  
21679    return buf;
21680  };
21681  
21682  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/utils/transform-styles/ast/stringify/compress.js
21683  // Adapted from https://github.com/reworkcss/css
21684  // because we needed to remove source map support.
21685  
21686  /**
21687   * External dependencies
21688   */
21689  
21690  /**
21691   * Internal dependencies
21692   */
21693  
21694  
21695  /**
21696   * Expose compiler.
21697   */
21698  
21699  /* harmony default export */ var compress = (compress_Compiler);
21700  /**
21701   * Initialize a new `Compiler`.
21702   */
21703  
21704  function compress_Compiler(options) {
21705    compiler.call(this, options);
21706  }
21707  /**
21708   * Inherit from `Base.prototype`.
21709   */
21710  
21711  
21712  inherits_browser_default()(compress_Compiler, compiler);
21713  /**
21714   * Compile `node`.
21715   */
21716  
21717  compress_Compiler.prototype.compile = function (node) {
21718    return node.stylesheet.rules.map(this.visit, this).join('');
21719  };
21720  /**
21721   * Visit comment node.
21722   */
21723  
21724  
21725  compress_Compiler.prototype.comment = function (node) {
21726    return this.emit('', node.position);
21727  };
21728  /**
21729   * Visit import node.
21730   */
21731  
21732  
21733  compress_Compiler.prototype.import = function (node) {
21734    return this.emit('@import ' + node.import + ';', node.position);
21735  };
21736  /**
21737   * Visit media node.
21738   */
21739  
21740  
21741  compress_Compiler.prototype.media = function (node) {
21742    return this.emit('@media ' + node.media, node.position) + this.emit('{') + this.mapVisit(node.rules) + this.emit('}');
21743  };
21744  /**
21745   * Visit document node.
21746   */
21747  
21748  
21749  compress_Compiler.prototype.document = function (node) {
21750    const doc = '@' + (node.vendor || '') + 'document ' + node.document;
21751    return this.emit(doc, node.position) + this.emit('{') + this.mapVisit(node.rules) + this.emit('}');
21752  };
21753  /**
21754   * Visit charset node.
21755   */
21756  
21757  
21758  compress_Compiler.prototype.charset = function (node) {
21759    return this.emit('@charset ' + node.charset + ';', node.position);
21760  };
21761  /**
21762   * Visit namespace node.
21763   */
21764  
21765  
21766  compress_Compiler.prototype.namespace = function (node) {
21767    return this.emit('@namespace ' + node.namespace + ';', node.position);
21768  };
21769  /**
21770   * Visit supports node.
21771   */
21772  
21773  
21774  compress_Compiler.prototype.supports = function (node) {
21775    return this.emit('@supports ' + node.supports, node.position) + this.emit('{') + this.mapVisit(node.rules) + this.emit('}');
21776  };
21777  /**
21778   * Visit keyframes node.
21779   */
21780  
21781  
21782  compress_Compiler.prototype.keyframes = function (node) {
21783    return this.emit('@' + (node.vendor || '') + 'keyframes ' + node.name, node.position) + this.emit('{') + this.mapVisit(node.keyframes) + this.emit('}');
21784  };
21785  /**
21786   * Visit keyframe node.
21787   */
21788  
21789  
21790  compress_Compiler.prototype.keyframe = function (node) {
21791    const decls = node.declarations;
21792    return this.emit(node.values.join(','), node.position) + this.emit('{') + this.mapVisit(decls) + this.emit('}');
21793  };
21794  /**
21795   * Visit page node.
21796   */
21797  
21798  
21799  compress_Compiler.prototype.page = function (node) {
21800    const sel = node.selectors.length ? node.selectors.join(', ') : '';
21801    return this.emit('@page ' + sel, node.position) + this.emit('{') + this.mapVisit(node.declarations) + this.emit('}');
21802  };
21803  /**
21804   * Visit font-face node.
21805   */
21806  
21807  
21808  compress_Compiler.prototype['font-face'] = function (node) {
21809    return this.emit('@font-face', node.position) + this.emit('{') + this.mapVisit(node.declarations) + this.emit('}');
21810  };
21811  /**
21812   * Visit host node.
21813   */
21814  
21815  
21816  compress_Compiler.prototype.host = function (node) {
21817    return this.emit('@host', node.position) + this.emit('{') + this.mapVisit(node.rules) + this.emit('}');
21818  };
21819  /**
21820   * Visit custom-media node.
21821   */
21822  
21823  
21824  compress_Compiler.prototype['custom-media'] = function (node) {
21825    return this.emit('@custom-media ' + node.name + ' ' + node.media + ';', node.position);
21826  };
21827  /**
21828   * Visit rule node.
21829   */
21830  
21831  
21832  compress_Compiler.prototype.rule = function (node) {
21833    const decls = node.declarations;
21834  
21835    if (!decls.length) {
21836      return '';
21837    }
21838  
21839    return this.emit(node.selectors.join(','), node.position) + this.emit('{') + this.mapVisit(decls) + this.emit('}');
21840  };
21841  /**
21842   * Visit declaration node.
21843   */
21844  
21845  
21846  compress_Compiler.prototype.declaration = function (node) {
21847    return this.emit(node.property + ':' + node.value, node.position) + this.emit(';');
21848  };
21849  
21850  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/utils/transform-styles/ast/stringify/identity.js
21851  /* eslint-disable @wordpress/no-unused-vars-before-return */
21852  // Adapted from https://github.com/reworkcss/css
21853  // because we needed to remove source map support.
21854  
21855  /**
21856   * External dependencies
21857   */
21858  
21859  /**
21860   * Internal dependencies
21861   */
21862  
21863  
21864  /**
21865   * Expose compiler.
21866   */
21867  
21868  /* harmony default export */ var identity = (identity_Compiler);
21869  /**
21870   * Initialize a new `Compiler`.
21871   */
21872  
21873  function identity_Compiler(options) {
21874    options = options || {};
21875    compiler.call(this, options);
21876    this.indentation = options.indent;
21877  }
21878  /**
21879   * Inherit from `Base.prototype`.
21880   */
21881  
21882  
21883  inherits_browser_default()(identity_Compiler, compiler);
21884  /**
21885   * Compile `node`.
21886   */
21887  
21888  identity_Compiler.prototype.compile = function (node) {
21889    return this.stylesheet(node);
21890  };
21891  /**
21892   * Visit stylesheet node.
21893   */
21894  
21895  
21896  identity_Compiler.prototype.stylesheet = function (node) {
21897    return this.mapVisit(node.stylesheet.rules, '\n\n');
21898  };
21899  /**
21900   * Visit comment node.
21901   */
21902  
21903  
21904  identity_Compiler.prototype.comment = function (node) {
21905    return this.emit(this.indent() + '/*' + node.comment + '*/', node.position);
21906  };
21907  /**
21908   * Visit import node.
21909   */
21910  
21911  
21912  identity_Compiler.prototype.import = function (node) {
21913    return this.emit('@import ' + node.import + ';', node.position);
21914  };
21915  /**
21916   * Visit media node.
21917   */
21918  
21919  
21920  identity_Compiler.prototype.media = function (node) {
21921    return this.emit('@media ' + node.media, node.position) + this.emit(' {\n' + this.indent(1)) + this.mapVisit(node.rules, '\n\n') + this.emit(this.indent(-1) + '\n}');
21922  };
21923  /**
21924   * Visit document node.
21925   */
21926  
21927  
21928  identity_Compiler.prototype.document = function (node) {
21929    const doc = '@' + (node.vendor || '') + 'document ' + node.document;
21930    return this.emit(doc, node.position) + this.emit(' ' + ' {\n' + this.indent(1)) + this.mapVisit(node.rules, '\n\n') + this.emit(this.indent(-1) + '\n}');
21931  };
21932  /**
21933   * Visit charset node.
21934   */
21935  
21936  
21937  identity_Compiler.prototype.charset = function (node) {
21938    return this.emit('@charset ' + node.charset + ';', node.position);
21939  };
21940  /**
21941   * Visit namespace node.
21942   */
21943  
21944  
21945  identity_Compiler.prototype.namespace = function (node) {
21946    return this.emit('@namespace ' + node.namespace + ';', node.position);
21947  };
21948  /**
21949   * Visit supports node.
21950   */
21951  
21952  
21953  identity_Compiler.prototype.supports = function (node) {
21954    return this.emit('@supports ' + node.supports, node.position) + this.emit(' {\n' + this.indent(1)) + this.mapVisit(node.rules, '\n\n') + this.emit(this.indent(-1) + '\n}');
21955  };
21956  /**
21957   * Visit keyframes node.
21958   */
21959  
21960  
21961  identity_Compiler.prototype.keyframes = function (node) {
21962    return this.emit('@' + (node.vendor || '') + 'keyframes ' + node.name, node.position) + this.emit(' {\n' + this.indent(1)) + this.mapVisit(node.keyframes, '\n') + this.emit(this.indent(-1) + '}');
21963  };
21964  /**
21965   * Visit keyframe node.
21966   */
21967  
21968  
21969  identity_Compiler.prototype.keyframe = function (node) {
21970    const decls = node.declarations;
21971    return this.emit(this.indent()) + this.emit(node.values.join(', '), node.position) + this.emit(' {\n' + this.indent(1)) + this.mapVisit(decls, '\n') + this.emit(this.indent(-1) + '\n' + this.indent() + '}\n');
21972  };
21973  /**
21974   * Visit page node.
21975   */
21976  
21977  
21978  identity_Compiler.prototype.page = function (node) {
21979    const sel = node.selectors.length ? node.selectors.join(', ') + ' ' : '';
21980    return this.emit('@page ' + sel, node.position) + this.emit('{\n') + this.emit(this.indent(1)) + this.mapVisit(node.declarations, '\n') + this.emit(this.indent(-1)) + this.emit('\n}');
21981  };
21982  /**
21983   * Visit font-face node.
21984   */
21985  
21986  
21987  identity_Compiler.prototype['font-face'] = function (node) {
21988    return this.emit('@font-face ', node.position) + this.emit('{\n') + this.emit(this.indent(1)) + this.mapVisit(node.declarations, '\n') + this.emit(this.indent(-1)) + this.emit('\n}');
21989  };
21990  /**
21991   * Visit host node.
21992   */
21993  
21994  
21995  identity_Compiler.prototype.host = function (node) {
21996    return this.emit('@host', node.position) + this.emit(' {\n' + this.indent(1)) + this.mapVisit(node.rules, '\n\n') + this.emit(this.indent(-1) + '\n}');
21997  };
21998  /**
21999   * Visit custom-media node.
22000   */
22001  
22002  
22003  identity_Compiler.prototype['custom-media'] = function (node) {
22004    return this.emit('@custom-media ' + node.name + ' ' + node.media + ';', node.position);
22005  };
22006  /**
22007   * Visit rule node.
22008   */
22009  
22010  
22011  identity_Compiler.prototype.rule = function (node) {
22012    const indent = this.indent();
22013    const decls = node.declarations;
22014  
22015    if (!decls.length) {
22016      return '';
22017    }
22018  
22019    return this.emit(node.selectors.map(function (s) {
22020      return indent + s;
22021    }).join(',\n'), node.position) + this.emit(' {\n') + this.emit(this.indent(1)) + this.mapVisit(decls, '\n') + this.emit(this.indent(-1)) + this.emit('\n' + this.indent() + '}');
22022  };
22023  /**
22024   * Visit declaration node.
22025   */
22026  
22027  
22028  identity_Compiler.prototype.declaration = function (node) {
22029    return this.emit(this.indent()) + this.emit(node.property + ': ' + node.value, node.position) + this.emit(';');
22030  };
22031  /**
22032   * Increase, decrease or return current indentation.
22033   */
22034  
22035  
22036  identity_Compiler.prototype.indent = function (level) {
22037    this.level = this.level || 1;
22038  
22039    if (null !== level) {
22040      this.level += level;
22041      return '';
22042    }
22043  
22044    return Array(this.level).join(this.indentation || '  ');
22045  };
22046  /* eslint-enable @wordpress/no-unused-vars-before-return */
22047  
22048  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/utils/transform-styles/ast/stringify/index.js
22049  // Adapted from https://github.com/reworkcss/css
22050  // because we needed to remove source map support.
22051  
22052  /**
22053   * Internal dependencies
22054   */
22055  
22056  
22057  /**
22058   * Stringfy the given AST `node`.
22059   *
22060   * Options:
22061   *
22062   *  - `compress` space-optimized output
22063   *  - `sourcemap` return an object with `.code` and `.map`
22064   *
22065   * @param {Object} node
22066   * @param {Object} [options]
22067   * @return {string}
22068   */
22069  
22070  /* harmony default export */ function stringify(node, options) {
22071    options = options || {};
22072    const compiler = options.compress ? new compress(options) : new identity(options);
22073    const code = compiler.compile(node);
22074    return code;
22075  }
22076  
22077  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/utils/transform-styles/traverse.js
22078  /**
22079   * External dependencies
22080   */
22081  
22082  /**
22083   * Internal dependencies
22084   */
22085  
22086  
22087  
22088  function traverseCSS(css, callback) {
22089    try {
22090      const parsed = parse(css);
22091      const updated = traverse_default().map(parsed, function (node) {
22092        if (!node) {
22093          return node;
22094        }
22095  
22096        const updatedNode = callback(node);
22097        return this.update(updatedNode);
22098      });
22099      return stringify(updated);
22100    } catch (err) {
22101      // eslint-disable-next-line no-console
22102      console.warn('Error while traversing the CSS: ' + err);
22103      return null;
22104    }
22105  }
22106  
22107  /* harmony default export */ var transform_styles_traverse = (traverseCSS);
22108  
22109  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/utils/transform-styles/transforms/url-rewrite.js
22110  /**
22111   * Return `true` if the given path is http/https.
22112   *
22113   * @param {string} filePath path
22114   *
22115   * @return {boolean} is remote path.
22116   */
22117  function isRemotePath(filePath) {
22118    return /^(?:https?:)?\/\//.test(filePath);
22119  }
22120  /**
22121   * Return `true` if the given filePath is an absolute url.
22122   *
22123   * @param {string} filePath path
22124   *
22125   * @return {boolean} is absolute path.
22126   */
22127  
22128  
22129  function isAbsolutePath(filePath) {
22130    return /^\/(?!\/)/.test(filePath);
22131  }
22132  /**
22133   * Whether or not the url should be inluded.
22134   *
22135   * @param {Object} meta url meta info
22136   *
22137   * @return {boolean} is valid.
22138   */
22139  
22140  
22141  function isValidURL(meta) {
22142    // Ignore hashes or data uris.
22143    if (meta.value.indexOf('data:') === 0 || meta.value.indexOf('#') === 0) {
22144      return false;
22145    }
22146  
22147    if (isAbsolutePath(meta.value)) {
22148      return false;
22149    } // Do not handle the http/https urls if `includeRemote` is false.
22150  
22151  
22152    if (isRemotePath(meta.value)) {
22153      return false;
22154    }
22155  
22156    return true;
22157  }
22158  /**
22159   * Get the absolute path of the url, relative to the basePath
22160   *
22161   * @param {string} str     the url
22162   * @param {string} baseURL base URL
22163   *
22164   * @return {string} the full path to the file
22165   */
22166  
22167  
22168  function getResourcePath(str, baseURL) {
22169    return new URL(str, baseURL).toString();
22170  }
22171  /**
22172   * Process the single `url()` pattern
22173   *
22174   * @param {string} baseURL the base URL for relative URLs.
22175   *
22176   * @return {Promise} the Promise.
22177   */
22178  
22179  
22180  function processURL(baseURL) {
22181    return meta => ({ ...meta,
22182      newUrl: 'url(' + meta.before + meta.quote + getResourcePath(meta.value, baseURL) + meta.quote + meta.after + ')'
22183    });
22184  }
22185  /**
22186   * Get all `url()`s, and return the meta info
22187   *
22188   * @param {string} value decl.value.
22189   *
22190   * @return {Array} the urls.
22191   */
22192  
22193  
22194  function getURLs(value) {
22195    const reg = /url\((\s*)(['"]?)(.+?)\2(\s*)\)/g;
22196    let match;
22197    const URLs = [];
22198  
22199    while ((match = reg.exec(value)) !== null) {
22200      const meta = {
22201        source: match[0],
22202        before: match[1],
22203        quote: match[2],
22204        value: match[3],
22205        after: match[4]
22206      };
22207  
22208      if (isValidURL(meta)) {
22209        URLs.push(meta);
22210      }
22211    }
22212  
22213    return URLs;
22214  }
22215  /**
22216   * Replace the raw value's `url()` segment to the new value
22217   *
22218   * @param {string} raw  the raw value.
22219   * @param {Array}  URLs the URLs to replace.
22220   *
22221   * @return {string} the new value.
22222   */
22223  
22224  
22225  function replaceURLs(raw, URLs) {
22226    URLs.forEach(item => {
22227      raw = raw.replace(item.source, item.newUrl);
22228    });
22229    return raw;
22230  }
22231  
22232  const rewrite = rootURL => node => {
22233    if (node.type === 'declaration') {
22234      const updatedURLs = getURLs(node.value).map(processURL(rootURL));
22235      return { ...node,
22236        value: replaceURLs(node.value, updatedURLs)
22237      };
22238    }
22239  
22240    return node;
22241  };
22242  
22243  /* harmony default export */ var url_rewrite = (rewrite);
22244  
22245  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/utils/transform-styles/transforms/wrap.js
22246  /**
22247   * @constant string IS_ROOT_TAG Regex to check if the selector is a root tag selector.
22248   */
22249  const IS_ROOT_TAG = /^(body|html|:root).*$/;
22250  /**
22251   * Creates a callback to modify selectors so they only apply within a certain
22252   * namespace.
22253   *
22254   * @param {string}   namespace Namespace to prefix selectors with.
22255   * @param {string[]} ignore    Selectors to not prefix.
22256   *
22257   * @return {(node: Object) => Object} Callback to wrap selectors.
22258   */
22259  
22260  const wrap = function (namespace) {
22261    let ignore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
22262    return node => {
22263      /**
22264       * Updates selector if necessary.
22265       *
22266       * @param {string} selector Selector to modify.
22267       *
22268       * @return {string} Updated selector.
22269       */
22270      const updateSelector = selector => {
22271        if (ignore.includes(selector.trim())) {
22272          return selector;
22273        } // Anything other than a root tag is always prefixed.
22274  
22275  
22276        {
22277          if (!selector.match(IS_ROOT_TAG)) {
22278            return namespace + ' ' + selector;
22279          }
22280        } // HTML and Body elements cannot be contained within our container so lets extract their styles.
22281  
22282        return selector.replace(/^(body|html|:root)/, namespace);
22283      };
22284  
22285      if (node.type === 'rule') {
22286        return { ...node,
22287          selectors: node.selectors.map(updateSelector)
22288        };
22289      }
22290  
22291      return node;
22292    };
22293  };
22294  
22295  /* harmony default export */ var transforms_wrap = (wrap);
22296  
22297  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/utils/transform-styles/index.js
22298  /**
22299   * External dependencies
22300   */
22301  
22302  /**
22303   * WordPress dependencies
22304   */
22305  
22306  
22307  /**
22308   * Internal dependencies
22309   */
22310  
22311  
22312  
22313  
22314  /**
22315   * Applies a series of CSS rule transforms to wrap selectors inside a given class and/or rewrite URLs depending on the parameters passed.
22316   *
22317   * @param {Array}  styles           CSS rules.
22318   * @param {string} wrapperClassName Wrapper Class Name.
22319   * @return {Array} converted rules.
22320   */
22321  
22322  const transform_styles_transformStyles = function (styles) {
22323    let wrapperClassName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
22324    return (0,external_lodash_namespaceObject.map)(styles, _ref => {
22325      let {
22326        css,
22327        baseURL
22328      } = _ref;
22329      const transforms = [];
22330  
22331      if (wrapperClassName) {
22332        transforms.push(transforms_wrap(wrapperClassName));
22333      }
22334  
22335      if (baseURL) {
22336        transforms.push(url_rewrite(baseURL));
22337      }
22338  
22339      if (transforms.length) {
22340        return transform_styles_traverse(css, (0,external_wp_compose_namespaceObject.compose)(transforms));
22341      }
22342  
22343      return css;
22344    });
22345  };
22346  
22347  /* harmony default export */ var transform_styles = (transform_styles_transformStyles);
22348  
22349  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/editor-styles/index.js
22350  
22351  
22352  /**
22353   * External dependencies
22354   */
22355  
22356  
22357  
22358  /**
22359   * WordPress dependencies
22360   */
22361  
22362  
22363  /**
22364   * Internal dependencies
22365   */
22366  
22367  
22368  const EDITOR_STYLES_SELECTOR = '.editor-styles-wrapper';
22369  k([names, a11y]);
22370  
22371  function useDarkThemeBodyClassName(styles) {
22372    return (0,external_wp_element_namespaceObject.useCallback)(node => {
22373      if (!node) {
22374        return;
22375      }
22376  
22377      const {
22378        ownerDocument
22379      } = node;
22380      const {
22381        defaultView,
22382        body
22383      } = ownerDocument;
22384      const canvas = ownerDocument.querySelector(EDITOR_STYLES_SELECTOR);
22385      let backgroundColor;
22386  
22387      if (!canvas) {
22388        // The real .editor-styles-wrapper element might not exist in the
22389        // DOM, so calculate the background color by creating a fake
22390        // wrapper.
22391        const tempCanvas = ownerDocument.createElement('div');
22392        tempCanvas.classList.add('editor-styles-wrapper');
22393        body.appendChild(tempCanvas);
22394        backgroundColor = defaultView.getComputedStyle(tempCanvas, null).getPropertyValue('background-color');
22395        body.removeChild(tempCanvas);
22396      } else {
22397        backgroundColor = defaultView.getComputedStyle(canvas, null).getPropertyValue('background-color');
22398      }
22399  
22400      const colordBackgroundColor = w(backgroundColor); // If background is transparent, it should be treated as light color.
22401  
22402      if (colordBackgroundColor.luminance() > 0.5 || colordBackgroundColor.alpha() === 0) {
22403        body.classList.remove('is-dark-theme');
22404      } else {
22405        body.classList.add('is-dark-theme');
22406      }
22407    }, [styles]);
22408  }
22409  
22410  function EditorStyles(_ref) {
22411    let {
22412      styles
22413    } = _ref;
22414    const transformedStyles = (0,external_wp_element_namespaceObject.useMemo)(() => transform_styles(styles, EDITOR_STYLES_SELECTOR), [styles]);
22415    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)("style", {
22416      ref: useDarkThemeBodyClassName(styles)
22417    }), transformedStyles.map((css, index) => (0,external_wp_element_namespaceObject.createElement)("style", {
22418      key: index
22419    }, css)));
22420  }
22421  
22422  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-preview/auto.js
22423  
22424  
22425  /**
22426   * WordPress dependencies
22427   */
22428  
22429  
22430  
22431  
22432  /**
22433   * Internal dependencies
22434   */
22435  
22436  
22437  
22438  
22439   // This is used to avoid rendering the block list if the sizes change.
22440  
22441  let MemoizedBlockList;
22442  const MAX_HEIGHT = 2000;
22443  
22444  function AutoBlockPreview(_ref) {
22445    let {
22446      viewportWidth,
22447      __experimentalPadding,
22448      __experimentalMinHeight
22449    } = _ref;
22450    const [containerResizeListener, {
22451      width: containerWidth
22452    }] = (0,external_wp_compose_namespaceObject.useResizeObserver)();
22453    const [contentResizeListener, {
22454      height: contentHeight
22455    }] = (0,external_wp_compose_namespaceObject.useResizeObserver)();
22456    const {
22457      styles,
22458      assets
22459    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
22460      const settings = select(store).getSettings();
22461      return {
22462        styles: settings.styles,
22463        assets: settings.__unstableResolvedAssets
22464      };
22465    }, []); // Avoid scrollbars for pattern previews.
22466  
22467    const editorStyles = (0,external_wp_element_namespaceObject.useMemo)(() => {
22468      if (styles) {
22469        return [...styles, {
22470          css: 'body{height:auto;overflow:hidden;}',
22471          __unstableType: 'presets'
22472        }];
22473      }
22474  
22475      return styles;
22476    }, [styles]); // Initialize on render instead of module top level, to avoid circular dependency issues.
22477  
22478    MemoizedBlockList = MemoizedBlockList || (0,external_wp_compose_namespaceObject.pure)(BlockList);
22479    const scale = containerWidth / viewportWidth;
22480    return (0,external_wp_element_namespaceObject.createElement)("div", {
22481      className: "block-editor-block-preview__container"
22482    }, containerResizeListener, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Disabled, {
22483      className: "block-editor-block-preview__content",
22484      style: {
22485        transform: `scale($scale})`,
22486        height: contentHeight * scale,
22487        maxHeight: contentHeight > MAX_HEIGHT ? MAX_HEIGHT * scale : undefined,
22488        minHeight: __experimentalMinHeight
22489      }
22490    }, (0,external_wp_element_namespaceObject.createElement)(iframe, {
22491      head: (0,external_wp_element_namespaceObject.createElement)(EditorStyles, {
22492        styles: editorStyles
22493      }),
22494      assets: assets,
22495      contentRef: (0,external_wp_compose_namespaceObject.useRefEffect)(bodyElement => {
22496        const {
22497          ownerDocument: {
22498            documentElement
22499          }
22500        } = bodyElement;
22501        documentElement.classList.add('block-editor-block-preview__content-iframe');
22502        documentElement.style.position = 'absolute';
22503        documentElement.style.width = '100%';
22504        bodyElement.style.padding = __experimentalPadding + 'px'; // necessary for contentResizeListener to work.
22505  
22506        bodyElement.style.position = 'relative';
22507      }, []),
22508      "aria-hidden": true,
22509      tabIndex: -1,
22510      style: {
22511        position: 'absolute',
22512        width: viewportWidth,
22513        height: contentHeight,
22514        pointerEvents: 'none',
22515        // This is a catch-all max-height for patterns.
22516        // See: https://github.com/WordPress/gutenberg/pull/38175.
22517        maxHeight: MAX_HEIGHT,
22518        minHeight: scale < 1 && __experimentalMinHeight ? __experimentalMinHeight / scale : __experimentalMinHeight
22519      }
22520    }, contentResizeListener, (0,external_wp_element_namespaceObject.createElement)(MemoizedBlockList, {
22521      renderAppender: false
22522    }))));
22523  }
22524  
22525  /* harmony default export */ var auto = (AutoBlockPreview);
22526  
22527  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-preview/index.js
22528  
22529  
22530  /**
22531   * External dependencies
22532   */
22533  
22534  
22535  /**
22536   * WordPress dependencies
22537   */
22538  
22539  
22540  
22541  
22542  /**
22543   * Internal dependencies
22544   */
22545  
22546  
22547  
22548  
22549  
22550  
22551  function BlockPreview(_ref) {
22552    let {
22553      blocks,
22554      __experimentalPadding = 0,
22555      viewportWidth = 1200,
22556      __experimentalLive = false,
22557      __experimentalOnClick,
22558      __experimentalMinHeight
22559    } = _ref;
22560    const originalSettings = (0,external_wp_data_namespaceObject.useSelect)(select => select(store).getSettings(), []);
22561    const settings = (0,external_wp_element_namespaceObject.useMemo)(() => {
22562      const _settings = { ...originalSettings
22563      };
22564      _settings.__experimentalBlockPatterns = [];
22565      return _settings;
22566    }, [originalSettings]);
22567    const renderedBlocks = (0,external_wp_element_namespaceObject.useMemo)(() => (0,external_lodash_namespaceObject.castArray)(blocks), [blocks]);
22568  
22569    if (!blocks || blocks.length === 0) {
22570      return null;
22571    }
22572  
22573    return (0,external_wp_element_namespaceObject.createElement)(provider, {
22574      value: renderedBlocks,
22575      settings: settings
22576    }, __experimentalLive ? (0,external_wp_element_namespaceObject.createElement)(LiveBlockPreview, {
22577      onClick: __experimentalOnClick
22578    }) : (0,external_wp_element_namespaceObject.createElement)(auto, {
22579      viewportWidth: viewportWidth,
22580      __experimentalPadding: __experimentalPadding,
22581      __experimentalMinHeight: __experimentalMinHeight
22582    }));
22583  }
22584  /**
22585   * BlockPreview renders a preview of a block or array of blocks.
22586   *
22587   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/block-preview/README.md
22588   *
22589   * @param {Object}       preview               options for how the preview should be shown
22590   * @param {Array|Object} preview.blocks        A block instance (object) or an array of blocks to be previewed.
22591   * @param {number}       preview.viewportWidth Width of the preview container in pixels. Controls at what size the blocks will be rendered inside the preview. Default: 700.
22592   *
22593   * @return {WPComponent} The component to be rendered.
22594   */
22595  
22596  /* harmony default export */ var block_preview = ((0,external_wp_element_namespaceObject.memo)(BlockPreview));
22597  /**
22598   * This hook is used to lightly mark an element as a block preview wrapper
22599   * element. Call this hook and pass the returned props to the element to mark as
22600   * a block preview wrapper, automatically rendering inner blocks as children. If
22601   * you define a ref for the element, it is important to pass the ref to this
22602   * hook, which the hook in turn will pass to the component through the props it
22603   * returns. Optionally, you can also pass any other props through this hook, and
22604   * they will be merged and returned.
22605   *
22606   * @param {Object}    options                      Preview options.
22607   * @param {WPBlock[]} options.blocks               Block objects.
22608   * @param {Object}    options.props                Optional. Props to pass to the element. Must contain
22609   *                                                 the ref if one is defined.
22610   * @param {Object}    options.__experimentalLayout Layout settings to be used in the preview.
22611   *
22612   */
22613  
22614  function useBlockPreview(_ref2) {
22615    let {
22616      blocks,
22617      props = {},
22618      __experimentalLayout
22619    } = _ref2;
22620    const originalSettings = (0,external_wp_data_namespaceObject.useSelect)(select => select(store).getSettings(), []);
22621    const disabledRef = (0,external_wp_compose_namespaceObject.__experimentalUseDisabled)();
22622    const ref = (0,external_wp_compose_namespaceObject.useMergeRefs)([props.ref, disabledRef]);
22623    const settings = (0,external_wp_element_namespaceObject.useMemo)(() => ({ ...originalSettings,
22624      __experimentalBlockPatterns: []
22625    }), [originalSettings]);
22626    const renderedBlocks = (0,external_wp_element_namespaceObject.useMemo)(() => (0,external_lodash_namespaceObject.castArray)(blocks), [blocks]);
22627    const children = (0,external_wp_element_namespaceObject.createElement)(provider, {
22628      value: renderedBlocks,
22629      settings: settings
22630    }, (0,external_wp_element_namespaceObject.createElement)(BlockListItems, {
22631      renderAppender: false,
22632      __experimentalLayout: __experimentalLayout
22633    }));
22634    return { ...props,
22635      ref,
22636      className: classnames_default()(props.className, 'block-editor-block-preview__live-content', 'components-disabled'),
22637      children: blocks !== null && blocks !== void 0 && blocks.length ? children : null
22638    };
22639  }
22640  
22641  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/preview-panel.js
22642  
22643  
22644  /**
22645   * WordPress dependencies
22646   */
22647  
22648  
22649  /**
22650   * Internal dependencies
22651   */
22652  
22653  
22654  
22655  
22656  function InserterPreviewPanel(_ref) {
22657    var _hoveredItemBlockType, _hoveredItemBlockType2;
22658  
22659    let {
22660      item
22661    } = _ref;
22662    const {
22663      name,
22664      title,
22665      icon,
22666      description,
22667      initialAttributes
22668    } = item;
22669    const hoveredItemBlockType = (0,external_wp_blocks_namespaceObject.getBlockType)(name);
22670    const isReusable = (0,external_wp_blocks_namespaceObject.isReusableBlock)(item);
22671    return (0,external_wp_element_namespaceObject.createElement)("div", {
22672      className: "block-editor-inserter__preview-container"
22673    }, (0,external_wp_element_namespaceObject.createElement)("div", {
22674      className: "block-editor-inserter__preview"
22675    }, isReusable || hoveredItemBlockType !== null && hoveredItemBlockType !== void 0 && hoveredItemBlockType.example ? (0,external_wp_element_namespaceObject.createElement)("div", {
22676      className: "block-editor-inserter__preview-content"
22677    }, (0,external_wp_element_namespaceObject.createElement)(block_preview, {
22678      __experimentalPadding: 16,
22679      viewportWidth: (_hoveredItemBlockType = (_hoveredItemBlockType2 = hoveredItemBlockType.example) === null || _hoveredItemBlockType2 === void 0 ? void 0 : _hoveredItemBlockType2.viewportWidth) !== null && _hoveredItemBlockType !== void 0 ? _hoveredItemBlockType : 500,
22680      blocks: hoveredItemBlockType.example ? (0,external_wp_blocks_namespaceObject.getBlockFromExample)(item.name, {
22681        attributes: { ...hoveredItemBlockType.example.attributes,
22682          ...initialAttributes
22683        },
22684        innerBlocks: hoveredItemBlockType.example.innerBlocks
22685      }) : (0,external_wp_blocks_namespaceObject.createBlock)(name, initialAttributes)
22686    })) : (0,external_wp_element_namespaceObject.createElement)("div", {
22687      className: "block-editor-inserter__preview-content-missing"
22688    }, (0,external_wp_i18n_namespaceObject.__)('No Preview Available.'))), !isReusable && (0,external_wp_element_namespaceObject.createElement)(block_card, {
22689      title: title,
22690      icon: icon,
22691      description: description
22692    }));
22693  }
22694  
22695  /* harmony default export */ var preview_panel = (InserterPreviewPanel);
22696  
22697  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter-listbox/context.js
22698  /**
22699   * WordPress dependencies
22700   */
22701  
22702  const InserterListboxContext = (0,external_wp_element_namespaceObject.createContext)();
22703  /* harmony default export */ var context = (InserterListboxContext);
22704  
22705  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter-listbox/item.js
22706  
22707  
22708  
22709  /**
22710   * WordPress dependencies
22711   */
22712  
22713  
22714  /**
22715   * Internal dependencies
22716   */
22717  
22718  
22719  
22720  function InserterListboxItem(_ref, ref) {
22721    let {
22722      isFirst,
22723      as: Component,
22724      children,
22725      ...props
22726    } = _ref;
22727    const state = (0,external_wp_element_namespaceObject.useContext)(context);
22728    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__unstableCompositeItem, _extends({
22729      ref: ref,
22730      state: state,
22731      role: "option" // Use the CompositeItem `focusable` prop over Button's
22732      // isFocusable. The latter was shown to cause an issue
22733      // with tab order in the inserter list.
22734      ,
22735      focusable: true
22736    }, props), htmlProps => {
22737      const propsWithTabIndex = { ...htmlProps,
22738        tabIndex: isFirst ? 0 : htmlProps.tabIndex
22739      };
22740  
22741      if (Component) {
22742        return (0,external_wp_element_namespaceObject.createElement)(Component, propsWithTabIndex, children);
22743      }
22744  
22745      if (typeof children === 'function') {
22746        return children(propsWithTabIndex);
22747      }
22748  
22749      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, propsWithTabIndex, children);
22750    });
22751  }
22752  
22753  /* harmony default export */ var inserter_listbox_item = ((0,external_wp_element_namespaceObject.forwardRef)(InserterListboxItem));
22754  
22755  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/drag-handle.js
22756  
22757  
22758  /**
22759   * WordPress dependencies
22760   */
22761  
22762  const dragHandle = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
22763    width: "24",
22764    height: "24",
22765    xmlns: "http://www.w3.org/2000/svg",
22766    viewBox: "0 0 24 24"
22767  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
22768    d: "M8 7h2V5H8v2zm0 6h2v-2H8v2zm0 6h2v-2H8v2zm6-14v2h2V5h-2zm0 8h2v-2h-2v2zm0 6h2v-2h-2v2z"
22769  }));
22770  /* harmony default export */ var drag_handle = (dragHandle);
22771  
22772  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-draggable/draggable-chip.js
22773  
22774  
22775  /**
22776   * WordPress dependencies
22777   */
22778  
22779  
22780  
22781  /**
22782   * Internal dependencies
22783   */
22784  
22785  
22786  function BlockDraggableChip(_ref) {
22787    let {
22788      count,
22789      icon
22790    } = _ref;
22791    return (0,external_wp_element_namespaceObject.createElement)("div", {
22792      className: "block-editor-block-draggable-chip-wrapper"
22793    }, (0,external_wp_element_namespaceObject.createElement)("div", {
22794      className: "block-editor-block-draggable-chip"
22795    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Flex, {
22796      justify: "center",
22797      className: "block-editor-block-draggable-chip__content"
22798    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.FlexItem, null, icon ? (0,external_wp_element_namespaceObject.createElement)(block_icon, {
22799      icon: icon
22800    }) : (0,external_wp_i18n_namespaceObject.sprintf)(
22801    /* translators: %d: Number of blocks. */
22802    (0,external_wp_i18n_namespaceObject._n)('%d block', '%d blocks', count), count)), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.FlexItem, null, (0,external_wp_element_namespaceObject.createElement)(block_icon, {
22803      icon: drag_handle
22804    })))));
22805  }
22806  
22807  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter-draggable-blocks/index.js
22808  
22809  
22810  /**
22811   * WordPress dependencies
22812   */
22813  
22814  /**
22815   * Internal dependencies
22816   */
22817  
22818  
22819  
22820  const InserterDraggableBlocks = _ref => {
22821    let {
22822      isEnabled,
22823      blocks,
22824      icon,
22825      children
22826    } = _ref;
22827    const transferData = {
22828      type: 'inserter',
22829      blocks
22830    };
22831    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Draggable, {
22832      __experimentalTransferDataType: "wp-blocks",
22833      transferData: transferData,
22834      __experimentalDragComponent: (0,external_wp_element_namespaceObject.createElement)(BlockDraggableChip, {
22835        count: blocks.length,
22836        icon: icon
22837      })
22838    }, _ref2 => {
22839      let {
22840        onDraggableStart,
22841        onDraggableEnd
22842      } = _ref2;
22843      return children({
22844        draggable: isEnabled,
22845        onDragStart: isEnabled ? onDraggableStart : undefined,
22846        onDragEnd: isEnabled ? onDraggableEnd : undefined
22847      });
22848    });
22849  };
22850  
22851  /* harmony default export */ var inserter_draggable_blocks = (InserterDraggableBlocks);
22852  
22853  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter-list-item/index.js
22854  
22855  
22856  
22857  /**
22858   * External dependencies
22859   */
22860  
22861  /**
22862   * WordPress dependencies
22863   */
22864  
22865  
22866  
22867  
22868  /**
22869   * Internal dependencies
22870   */
22871  
22872  
22873  
22874  
22875  /**
22876   * Return true if platform is MacOS.
22877   *
22878   * @param {Object} _window window object by default; used for DI testing.
22879   *
22880   * @return {boolean} True if MacOS; false otherwise.
22881   */
22882  
22883  function isAppleOS() {
22884    let _window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window;
22885  
22886    const {
22887      platform
22888    } = _window.navigator;
22889    return platform.indexOf('Mac') !== -1 || ['iPad', 'iPhone'].includes(platform);
22890  }
22891  
22892  function InserterListItem(_ref) {
22893    let {
22894      className,
22895      isFirst,
22896      item,
22897      onSelect,
22898      onHover,
22899      isDraggable,
22900      ...props
22901    } = _ref;
22902    const isDragging = (0,external_wp_element_namespaceObject.useRef)(false);
22903    const itemIconStyle = item.icon ? {
22904      backgroundColor: item.icon.background,
22905      color: item.icon.foreground
22906    } : {};
22907    const blocks = (0,external_wp_element_namespaceObject.useMemo)(() => {
22908      return [(0,external_wp_blocks_namespaceObject.createBlock)(item.name, item.initialAttributes, (0,external_wp_blocks_namespaceObject.createBlocksFromInnerBlocksTemplate)(item.innerBlocks))];
22909    }, [item.name, item.initialAttributes, item.initialAttributes]);
22910    return (0,external_wp_element_namespaceObject.createElement)(inserter_draggable_blocks, {
22911      isEnabled: isDraggable && !item.disabled,
22912      blocks: blocks,
22913      icon: item.icon
22914    }, _ref2 => {
22915      let {
22916        draggable,
22917        onDragStart,
22918        onDragEnd
22919      } = _ref2;
22920      return (0,external_wp_element_namespaceObject.createElement)("div", {
22921        className: "block-editor-block-types-list__list-item",
22922        draggable: draggable,
22923        onDragStart: event => {
22924          isDragging.current = true;
22925  
22926          if (onDragStart) {
22927            onHover(null);
22928            onDragStart(event);
22929          }
22930        },
22931        onDragEnd: event => {
22932          isDragging.current = false;
22933  
22934          if (onDragEnd) {
22935            onDragEnd(event);
22936          }
22937        }
22938      }, (0,external_wp_element_namespaceObject.createElement)(inserter_listbox_item, _extends({
22939        isFirst: isFirst,
22940        className: classnames_default()('block-editor-block-types-list__item', className),
22941        disabled: item.isDisabled,
22942        onClick: event => {
22943          event.preventDefault();
22944          onSelect(item, isAppleOS() ? event.metaKey : event.ctrlKey);
22945          onHover(null);
22946        },
22947        onKeyDown: event => {
22948          const {
22949            keyCode
22950          } = event;
22951  
22952          if (keyCode === external_wp_keycodes_namespaceObject.ENTER) {
22953            event.preventDefault();
22954            onSelect(item, isAppleOS() ? event.metaKey : event.ctrlKey);
22955            onHover(null);
22956          }
22957        },
22958        onFocus: () => {
22959          if (isDragging.current) {
22960            return;
22961          }
22962  
22963          onHover(item);
22964        },
22965        onMouseEnter: () => {
22966          if (isDragging.current) {
22967            return;
22968          }
22969  
22970          onHover(item);
22971        },
22972        onMouseLeave: () => onHover(null),
22973        onBlur: () => onHover(null)
22974      }, props), (0,external_wp_element_namespaceObject.createElement)("span", {
22975        className: "block-editor-block-types-list__item-icon",
22976        style: itemIconStyle
22977      }, (0,external_wp_element_namespaceObject.createElement)(block_icon, {
22978        icon: item.icon,
22979        showColors: true
22980      })), (0,external_wp_element_namespaceObject.createElement)("span", {
22981        className: "block-editor-block-types-list__item-title"
22982      }, item.title)));
22983    });
22984  }
22985  
22986  /* harmony default export */ var inserter_list_item = ((0,external_wp_element_namespaceObject.memo)(InserterListItem));
22987  
22988  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter-listbox/group.js
22989  
22990  
22991  
22992  /**
22993   * WordPress dependencies
22994   */
22995  
22996  
22997  
22998  
22999  function InserterListboxGroup(props, ref) {
23000    const [shouldSpeak, setShouldSpeak] = (0,external_wp_element_namespaceObject.useState)(false);
23001    (0,external_wp_element_namespaceObject.useEffect)(() => {
23002      if (shouldSpeak) {
23003        (0,external_wp_a11y_namespaceObject.speak)((0,external_wp_i18n_namespaceObject.__)('Use left and right arrow keys to move through blocks'));
23004      }
23005    }, [shouldSpeak]);
23006    return (0,external_wp_element_namespaceObject.createElement)("div", _extends({
23007      ref: ref,
23008      role: "listbox",
23009      "aria-orientation": "horizontal",
23010      onFocus: () => {
23011        setShouldSpeak(true);
23012      },
23013      onBlur: event => {
23014        const focusingOutsideGroup = !event.currentTarget.contains(event.relatedTarget);
23015  
23016        if (focusingOutsideGroup) {
23017          setShouldSpeak(false);
23018        }
23019      }
23020    }, props));
23021  }
23022  
23023  /* harmony default export */ var group = ((0,external_wp_element_namespaceObject.forwardRef)(InserterListboxGroup));
23024  
23025  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter-listbox/row.js
23026  
23027  
23028  
23029  /**
23030   * WordPress dependencies
23031   */
23032  
23033  
23034  /**
23035   * Internal dependencies
23036   */
23037  
23038  
23039  
23040  function InserterListboxRow(props, ref) {
23041    const state = (0,external_wp_element_namespaceObject.useContext)(context);
23042    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__unstableCompositeGroup, _extends({
23043      state: state,
23044      role: "presentation",
23045      ref: ref
23046    }, props));
23047  }
23048  
23049  /* harmony default export */ var inserter_listbox_row = ((0,external_wp_element_namespaceObject.forwardRef)(InserterListboxRow));
23050  
23051  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-types-list/index.js
23052  
23053  
23054  /**
23055   * WordPress dependencies
23056   */
23057  
23058  /**
23059   * Internal dependencies
23060   */
23061  
23062  
23063  
23064  
23065  function chunk(array, size) {
23066    const chunks = [];
23067  
23068    for (let i = 0, j = array.length; i < j; i += size) {
23069      chunks.push(array.slice(i, i + size));
23070    }
23071  
23072    return chunks;
23073  }
23074  
23075  function BlockTypesList(_ref) {
23076    let {
23077      items = [],
23078      onSelect,
23079      onHover = () => {},
23080      children,
23081      label,
23082      isDraggable = true
23083    } = _ref;
23084    return (0,external_wp_element_namespaceObject.createElement)(group, {
23085      className: "block-editor-block-types-list",
23086      "aria-label": label
23087    }, chunk(items, 3).map((row, i) => (0,external_wp_element_namespaceObject.createElement)(inserter_listbox_row, {
23088      key: i
23089    }, row.map((item, j) => (0,external_wp_element_namespaceObject.createElement)(inserter_list_item, {
23090      key: item.id,
23091      item: item,
23092      className: (0,external_wp_blocks_namespaceObject.getBlockMenuDefaultClassName)(item.id),
23093      onSelect: onSelect,
23094      onHover: onHover,
23095      isDraggable: isDraggable,
23096      isFirst: i === 0 && j === 0
23097    })))), children);
23098  }
23099  
23100  /* harmony default export */ var block_types_list = (BlockTypesList);
23101  
23102  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/panel.js
23103  
23104  
23105  /**
23106   * WordPress dependencies
23107   */
23108  
23109  
23110  function InserterPanel(_ref) {
23111    let {
23112      title,
23113      icon,
23114      children
23115    } = _ref;
23116    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)("div", {
23117      className: "block-editor-inserter__panel-header"
23118    }, (0,external_wp_element_namespaceObject.createElement)("h2", {
23119      className: "block-editor-inserter__panel-title"
23120    }, title), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Icon, {
23121      icon: icon
23122    })), (0,external_wp_element_namespaceObject.createElement)("div", {
23123      className: "block-editor-inserter__panel-content"
23124    }, children));
23125  }
23126  
23127  /* harmony default export */ var panel = (InserterPanel);
23128  
23129  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/hooks/use-block-types-state.js
23130  /**
23131   * WordPress dependencies
23132   */
23133  
23134  
23135  
23136  /**
23137   * Internal dependencies
23138   */
23139  
23140  
23141  /**
23142   * Retrieves the block types inserter state.
23143   *
23144   * @param {string=}  rootClientId Insertion's root client ID.
23145   * @param {Function} onInsert     function called when inserter a list of blocks.
23146   * @return {Array} Returns the block types state. (block types, categories, collections, onSelect handler)
23147   */
23148  
23149  const useBlockTypesState = (rootClientId, onInsert) => {
23150    const {
23151      categories,
23152      collections,
23153      items
23154    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
23155      const {
23156        getInserterItems
23157      } = select(store);
23158      const {
23159        getCategories,
23160        getCollections
23161      } = select(external_wp_blocks_namespaceObject.store);
23162      return {
23163        categories: getCategories(),
23164        collections: getCollections(),
23165        items: getInserterItems(rootClientId)
23166      };
23167    }, [rootClientId]);
23168    const onSelectItem = (0,external_wp_element_namespaceObject.useCallback)((_ref, shouldFocusBlock) => {
23169      let {
23170        name,
23171        initialAttributes,
23172        innerBlocks
23173      } = _ref;
23174      const insertedBlock = (0,external_wp_blocks_namespaceObject.createBlock)(name, initialAttributes, (0,external_wp_blocks_namespaceObject.createBlocksFromInnerBlocksTemplate)(innerBlocks));
23175      onInsert(insertedBlock, undefined, shouldFocusBlock);
23176    }, [onInsert]);
23177    return [items, categories, collections, onSelectItem];
23178  };
23179  
23180  /* harmony default export */ var use_block_types_state = (useBlockTypesState);
23181  
23182  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter-listbox/index.js
23183  
23184  
23185  /**
23186   * WordPress dependencies
23187   */
23188  
23189  /**
23190   * Internal dependencies
23191   */
23192  
23193  
23194  
23195  
23196  
23197  
23198  function InserterListbox(_ref) {
23199    let {
23200      children
23201    } = _ref;
23202    const compositeState = (0,external_wp_components_namespaceObject.__unstableUseCompositeState)({
23203      shift: true,
23204      wrap: 'horizontal'
23205    });
23206    return (0,external_wp_element_namespaceObject.createElement)(context.Provider, {
23207      value: compositeState
23208    }, children);
23209  }
23210  
23211  /* harmony default export */ var inserter_listbox = (InserterListbox);
23212  
23213  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/block-types-tab.js
23214  
23215  
23216  /**
23217   * External dependencies
23218   */
23219  
23220  /**
23221   * WordPress dependencies
23222   */
23223  
23224  
23225  
23226  
23227  /**
23228   * Internal dependencies
23229   */
23230  
23231  
23232  
23233  
23234  
23235  
23236  const getBlockNamespace = item => item.name.split('/')[0];
23237  
23238  const MAX_SUGGESTED_ITEMS = 6;
23239  /**
23240   * Shared reference to an empty array for cases where it is important to avoid
23241   * returning a new array reference on every invocation and rerendering the component.
23242   *
23243   * @type {Array}
23244   */
23245  
23246  const block_types_tab_EMPTY_ARRAY = [];
23247  function BlockTypesTab(_ref) {
23248    let {
23249      rootClientId,
23250      onInsert,
23251      onHover,
23252      showMostUsedBlocks
23253    } = _ref;
23254    const [items, categories, collections, onSelectItem] = use_block_types_state(rootClientId, onInsert);
23255    const suggestedItems = (0,external_wp_element_namespaceObject.useMemo)(() => {
23256      return (0,external_lodash_namespaceObject.orderBy)(items, ['frecency'], ['desc']).slice(0, MAX_SUGGESTED_ITEMS);
23257    }, [items]);
23258    const uncategorizedItems = (0,external_wp_element_namespaceObject.useMemo)(() => {
23259      return items.filter(item => !item.category);
23260    }, [items]);
23261    const itemsPerCategory = (0,external_wp_element_namespaceObject.useMemo)(() => {
23262      return (0,external_lodash_namespaceObject.flow)(itemList => itemList.filter(item => item.category && item.category !== 'reusable'), itemList => (0,external_lodash_namespaceObject.groupBy)(itemList, 'category'))(items);
23263    }, [items]);
23264    const itemsPerCollection = (0,external_wp_element_namespaceObject.useMemo)(() => {
23265      // Create a new Object to avoid mutating collection.
23266      const result = { ...collections
23267      };
23268      Object.keys(collections).forEach(namespace => {
23269        result[namespace] = items.filter(item => getBlockNamespace(item) === namespace);
23270  
23271        if (result[namespace].length === 0) {
23272          delete result[namespace];
23273        }
23274      });
23275      return result;
23276    }, [items, collections]); // Hide block preview on unmount.
23277  
23278    (0,external_wp_element_namespaceObject.useEffect)(() => () => onHover(null), []);
23279    /**
23280     * The inserter contains a big number of blocks and opening it is a costful operation.
23281     * The rendering is the most costful part of it, in order to improve the responsiveness
23282     * of the "opening" action, these lazy lists allow us to render the inserter category per category,
23283     * once all the categories are rendered, we start rendering the collections and the uncategorized block types.
23284     */
23285  
23286    const currentlyRenderedCategories = (0,external_wp_compose_namespaceObject.useAsyncList)(categories);
23287    const didRenderAllCategories = categories.length === currentlyRenderedCategories.length; // Async List requires an array.
23288  
23289    const collectionEntries = (0,external_wp_element_namespaceObject.useMemo)(() => {
23290      return Object.entries(collections);
23291    }, [collections]);
23292    const currentlyRenderedCollections = (0,external_wp_compose_namespaceObject.useAsyncList)(didRenderAllCategories ? collectionEntries : block_types_tab_EMPTY_ARRAY);
23293    return (0,external_wp_element_namespaceObject.createElement)(inserter_listbox, null, (0,external_wp_element_namespaceObject.createElement)("div", null, showMostUsedBlocks && !!suggestedItems.length && (0,external_wp_element_namespaceObject.createElement)(panel, {
23294      title: (0,external_wp_i18n_namespaceObject._x)('Most used', 'blocks')
23295    }, (0,external_wp_element_namespaceObject.createElement)(block_types_list, {
23296      items: suggestedItems,
23297      onSelect: onSelectItem,
23298      onHover: onHover,
23299      label: (0,external_wp_i18n_namespaceObject._x)('Most used', 'blocks')
23300    })), (0,external_lodash_namespaceObject.map)(currentlyRenderedCategories, category => {
23301      const categoryItems = itemsPerCategory[category.slug];
23302  
23303      if (!categoryItems || !categoryItems.length) {
23304        return null;
23305      }
23306  
23307      return (0,external_wp_element_namespaceObject.createElement)(panel, {
23308        key: category.slug,
23309        title: category.title,
23310        icon: category.icon
23311      }, (0,external_wp_element_namespaceObject.createElement)(block_types_list, {
23312        items: categoryItems,
23313        onSelect: onSelectItem,
23314        onHover: onHover,
23315        label: category.title
23316      }));
23317    }), didRenderAllCategories && uncategorizedItems.length > 0 && (0,external_wp_element_namespaceObject.createElement)(panel, {
23318      className: "block-editor-inserter__uncategorized-blocks-panel",
23319      title: (0,external_wp_i18n_namespaceObject.__)('Uncategorized')
23320    }, (0,external_wp_element_namespaceObject.createElement)(block_types_list, {
23321      items: uncategorizedItems,
23322      onSelect: onSelectItem,
23323      onHover: onHover,
23324      label: (0,external_wp_i18n_namespaceObject.__)('Uncategorized')
23325    })), (0,external_lodash_namespaceObject.map)(currentlyRenderedCollections, _ref2 => {
23326      let [namespace, collection] = _ref2;
23327      const collectionItems = itemsPerCollection[namespace];
23328  
23329      if (!collectionItems || !collectionItems.length) {
23330        return null;
23331      }
23332  
23333      return (0,external_wp_element_namespaceObject.createElement)(panel, {
23334        key: namespace,
23335        title: collection.title,
23336        icon: collection.icon
23337      }, (0,external_wp_element_namespaceObject.createElement)(block_types_list, {
23338        items: collectionItems,
23339        onSelect: onSelectItem,
23340        onHover: onHover,
23341        label: collection.title
23342      }));
23343    })));
23344  }
23345  /* harmony default export */ var block_types_tab = (BlockTypesTab);
23346  
23347  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/pattern-panel.js
23348  
23349  
23350  /**
23351   * External dependencies
23352   */
23353  
23354  /**
23355   * WordPress dependencies
23356   */
23357  
23358  
23359  
23360  
23361  
23362  function PatternInserterPanel(_ref) {
23363    let {
23364      selectedCategory,
23365      patternCategories,
23366      onClickCategory,
23367      openPatternExplorer
23368    } = _ref;
23369    const isMobile = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium', '<');
23370  
23371    const categoryOptions = () => {
23372      const options = [];
23373      patternCategories.map(patternCategory => {
23374        return options.push({
23375          value: patternCategory.name,
23376          label: patternCategory.label
23377        });
23378      });
23379      return options;
23380    };
23381  
23382    const onChangeSelect = selected => {
23383      onClickCategory(patternCategories.find(patternCategory => selected === patternCategory.name));
23384    };
23385  
23386    const className = classnames_default()('block-editor-inserter__panel-header', 'block-editor-inserter__panel-header-patterns'); // In iOS-based mobile devices, the onBlur will fire when selecting an option
23387    // from a Select element. To prevent closing the useDialog on iOS devices, we
23388    // stop propagating the onBlur event if there is no relatedTarget, which means
23389    // that the user most likely did not click on an element within the editor canvas.
23390  
23391    const onBlur = event => {
23392      if (!(event !== null && event !== void 0 && event.relatedTarget)) {
23393        event.stopPropagation();
23394      }
23395    };
23396  
23397    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Flex, {
23398      justify: "space-between",
23399      align: "start",
23400      gap: "4",
23401      className: className
23402    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.FlexItem, {
23403      isBlock: true
23404    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.SelectControl, {
23405      className: "block-editor-inserter__panel-dropdown",
23406      label: (0,external_wp_i18n_namespaceObject.__)('Filter patterns'),
23407      hideLabelFromVision: true,
23408      value: selectedCategory.name,
23409      onChange: onChangeSelect,
23410      onBlur: onBlur,
23411      options: categoryOptions()
23412    })), !isMobile && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.FlexItem, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
23413      variant: "secondary",
23414      className: "block-editor-inserter__patterns-explorer-expand",
23415      label: (0,external_wp_i18n_namespaceObject.__)('Explore all patterns'),
23416      onClick: () => openPatternExplorer()
23417    }, (0,external_wp_i18n_namespaceObject._x)('Explore', 'Label for showing all block patterns'))));
23418  }
23419  
23420  /* harmony default export */ var pattern_panel = (PatternInserterPanel);
23421  
23422  ;// CONCATENATED MODULE: external ["wp","notices"]
23423  var external_wp_notices_namespaceObject = window["wp"]["notices"];
23424  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/hooks/use-patterns-state.js
23425  /**
23426   * External dependencies
23427   */
23428  
23429  /**
23430   * WordPress dependencies
23431   */
23432  
23433  
23434  
23435  
23436  
23437  
23438  /**
23439   * Internal dependencies
23440   */
23441  
23442  
23443  /**
23444   * Retrieves the block patterns inserter state.
23445   *
23446   * @param {Function} onInsert     function called when inserter a list of blocks.
23447   * @param {string=}  rootClientId Insertion's root client ID.
23448   *
23449   * @return {Array} Returns the patterns state. (patterns, categories, onSelect handler)
23450   */
23451  
23452  const usePatternsState = (onInsert, rootClientId) => {
23453    const {
23454      patternCategories,
23455      patterns
23456    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
23457      const {
23458        __experimentalGetAllowedPatterns,
23459        getSettings
23460      } = select(store);
23461      return {
23462        patterns: __experimentalGetAllowedPatterns(rootClientId),
23463        patternCategories: getSettings().__experimentalBlockPatternCategories
23464      };
23465    }, [rootClientId]);
23466    const {
23467      createSuccessNotice
23468    } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store);
23469    const onClickPattern = (0,external_wp_element_namespaceObject.useCallback)((pattern, blocks) => {
23470      onInsert((0,external_lodash_namespaceObject.map)(blocks, block => (0,external_wp_blocks_namespaceObject.cloneBlock)(block)), pattern.name);
23471      createSuccessNotice((0,external_wp_i18n_namespaceObject.sprintf)(
23472      /* translators: %s: block pattern title. */
23473      (0,external_wp_i18n_namespaceObject.__)('Block pattern "%s" inserted.'), pattern.title), {
23474        type: 'snackbar'
23475      });
23476    }, []);
23477    return [patterns, patternCategories, onClickPattern];
23478  };
23479  
23480  /* harmony default export */ var use_patterns_state = (usePatternsState);
23481  
23482  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-patterns-list/index.js
23483  
23484  
23485  
23486  /**
23487   * WordPress dependencies
23488   */
23489  
23490  
23491  
23492  /**
23493   * Internal dependencies
23494   */
23495  
23496  
23497  
23498  
23499  function BlockPattern(_ref) {
23500    let {
23501      isDraggable,
23502      pattern,
23503      onClick,
23504      composite
23505    } = _ref;
23506    const {
23507      blocks,
23508      viewportWidth
23509    } = pattern;
23510    const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(BlockPattern);
23511    const descriptionId = `block-editor-block-patterns-list__item-description-$instanceId}`;
23512    return (0,external_wp_element_namespaceObject.createElement)(inserter_draggable_blocks, {
23513      isEnabled: isDraggable,
23514      blocks: blocks
23515    }, _ref2 => {
23516      let {
23517        draggable,
23518        onDragStart,
23519        onDragEnd
23520      } = _ref2;
23521      return (0,external_wp_element_namespaceObject.createElement)("div", {
23522        className: "block-editor-block-patterns-list__list-item",
23523        "aria-label": pattern.title,
23524        "aria-describedby": pattern.description ? descriptionId : undefined,
23525        draggable: draggable,
23526        onDragStart: onDragStart,
23527        onDragEnd: onDragEnd
23528      }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__unstableCompositeItem, _extends({
23529        role: "option",
23530        as: "div"
23531      }, composite, {
23532        className: "block-editor-block-patterns-list__item",
23533        onClick: () => onClick(pattern, blocks)
23534      }), (0,external_wp_element_namespaceObject.createElement)(block_preview, {
23535        blocks: blocks,
23536        viewportWidth: viewportWidth
23537      }), (0,external_wp_element_namespaceObject.createElement)("div", {
23538        className: "block-editor-block-patterns-list__item-title"
23539      }, pattern.title), !!pattern.description && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.VisuallyHidden, {
23540        id: descriptionId
23541      }, pattern.description)));
23542    });
23543  }
23544  
23545  function BlockPatternPlaceholder() {
23546    return (0,external_wp_element_namespaceObject.createElement)("div", {
23547      className: "block-editor-block-patterns-list__item is-placeholder"
23548    });
23549  }
23550  
23551  function BlockPatternList(_ref3) {
23552    let {
23553      isDraggable,
23554      blockPatterns,
23555      shownPatterns,
23556      onClickPattern,
23557      orientation,
23558      label = (0,external_wp_i18n_namespaceObject.__)('Block Patterns')
23559    } = _ref3;
23560    const composite = (0,external_wp_components_namespaceObject.__unstableUseCompositeState)({
23561      orientation
23562    });
23563    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__unstableComposite, _extends({}, composite, {
23564      role: "listbox",
23565      className: "block-editor-block-patterns-list",
23566      "aria-label": label
23567    }), blockPatterns.map(pattern => {
23568      const isShown = shownPatterns.includes(pattern);
23569      return isShown ? (0,external_wp_element_namespaceObject.createElement)(BlockPattern, {
23570        key: pattern.name,
23571        pattern: pattern,
23572        onClick: onClickPattern,
23573        isDraggable: isDraggable,
23574        composite: composite
23575      }) : (0,external_wp_element_namespaceObject.createElement)(BlockPatternPlaceholder, {
23576        key: pattern.name
23577      });
23578    }));
23579  }
23580  
23581  /* harmony default export */ var block_patterns_list = (BlockPatternList);
23582  
23583  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/block-patterns-explorer/sidebar.js
23584  
23585  
23586  /**
23587   * WordPress dependencies
23588   */
23589  
23590  
23591  
23592  function PatternCategoriesList(_ref) {
23593    let {
23594      selectedCategory,
23595      patternCategories,
23596      onClickCategory
23597    } = _ref;
23598    const baseClassName = 'block-editor-block-patterns-explorer__sidebar';
23599    return (0,external_wp_element_namespaceObject.createElement)("div", {
23600      className: `$baseClassName}__categories-list`
23601    }, patternCategories.map(_ref2 => {
23602      let {
23603        name,
23604        label
23605      } = _ref2;
23606      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
23607        key: name,
23608        label: label,
23609        className: `$baseClassName}__categories-list__item`,
23610        isPressed: selectedCategory === name,
23611        onClick: () => {
23612          onClickCategory(name);
23613        }
23614      }, label);
23615    }));
23616  }
23617  
23618  function PatternsExplorerSearch(_ref3) {
23619    let {
23620      filterValue,
23621      setFilterValue
23622    } = _ref3;
23623    const baseClassName = 'block-editor-block-patterns-explorer__search';
23624    return (0,external_wp_element_namespaceObject.createElement)("div", {
23625      className: baseClassName
23626    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.SearchControl, {
23627      onChange: setFilterValue,
23628      value: filterValue,
23629      label: (0,external_wp_i18n_namespaceObject.__)('Search for patterns'),
23630      placeholder: (0,external_wp_i18n_namespaceObject.__)('Search')
23631    }));
23632  }
23633  
23634  function PatternExplorerSidebar(_ref4) {
23635    let {
23636      selectedCategory,
23637      patternCategories,
23638      onClickCategory,
23639      filterValue,
23640      setFilterValue
23641    } = _ref4;
23642    const baseClassName = 'block-editor-block-patterns-explorer__sidebar';
23643    return (0,external_wp_element_namespaceObject.createElement)("div", {
23644      className: baseClassName
23645    }, (0,external_wp_element_namespaceObject.createElement)(PatternsExplorerSearch, {
23646      filterValue: filterValue,
23647      setFilterValue: setFilterValue
23648    }), !filterValue && (0,external_wp_element_namespaceObject.createElement)(PatternCategoriesList, {
23649      selectedCategory: selectedCategory,
23650      patternCategories: patternCategories,
23651      onClickCategory: onClickCategory
23652    }));
23653  }
23654  
23655  /* harmony default export */ var sidebar = (PatternExplorerSidebar);
23656  
23657  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/no-results.js
23658  
23659  
23660  /**
23661   * WordPress dependencies
23662   */
23663  
23664  
23665  
23666  function InserterNoResults() {
23667    return (0,external_wp_element_namespaceObject.createElement)("div", {
23668      className: "block-editor-inserter__no-results"
23669    }, (0,external_wp_element_namespaceObject.createElement)(build_module_icon, {
23670      className: "block-editor-inserter__no-results-icon",
23671      icon: block_default
23672    }), (0,external_wp_element_namespaceObject.createElement)("p", null, (0,external_wp_i18n_namespaceObject.__)('No results found.')));
23673  }
23674  
23675  /* harmony default export */ var no_results = (InserterNoResults);
23676  
23677  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/hooks/use-insertion-point.js
23678  /**
23679   * External dependencies
23680   */
23681  
23682  /**
23683   * WordPress dependencies
23684   */
23685  
23686  
23687  
23688  
23689  
23690  
23691  /**
23692   * Internal dependencies
23693   */
23694  
23695  
23696  /**
23697   * @typedef WPInserterConfig
23698   *
23699   * @property {string=}   rootClientId   If set, insertion will be into the
23700   *                                      block with this ID.
23701   * @property {number=}   insertionIndex If set, insertion will be into this
23702   *                                      explicit position.
23703   * @property {string=}   clientId       If set, insertion will be after the
23704   *                                      block with this ID.
23705   * @property {boolean=}  isAppender     Whether the inserter is an appender
23706   *                                      or not.
23707   * @property {Function=} onSelect       Called after insertion.
23708   */
23709  
23710  /**
23711   * Returns the insertion point state given the inserter config.
23712   *
23713   * @param {WPInserterConfig} config Inserter Config.
23714   * @return {Array} Insertion Point State (rootClientID, onInsertBlocks and onToggle).
23715   */
23716  
23717  function useInsertionPoint(_ref) {
23718    let {
23719      rootClientId = '',
23720      insertionIndex,
23721      clientId,
23722      isAppender,
23723      onSelect,
23724      shouldFocusBlock = true
23725    } = _ref;
23726    const {
23727      getSelectedBlock
23728    } = (0,external_wp_data_namespaceObject.useSelect)(store);
23729    const {
23730      destinationRootClientId,
23731      destinationIndex
23732    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
23733      const {
23734        getSelectedBlockClientId,
23735        getBlockRootClientId,
23736        getBlockIndex,
23737        getBlockOrder
23738      } = select(store);
23739      const selectedBlockClientId = getSelectedBlockClientId();
23740      let _destinationRootClientId = rootClientId;
23741  
23742      let _destinationIndex;
23743  
23744      if (insertionIndex !== undefined) {
23745        // Insert into a specific index.
23746        _destinationIndex = insertionIndex;
23747      } else if (clientId) {
23748        // Insert after a specific client ID.
23749        _destinationIndex = getBlockIndex(clientId);
23750      } else if (!isAppender && selectedBlockClientId) {
23751        _destinationRootClientId = getBlockRootClientId(selectedBlockClientId);
23752        _destinationIndex = getBlockIndex(selectedBlockClientId) + 1;
23753      } else {
23754        // Insert at the end of the list.
23755        _destinationIndex = getBlockOrder(_destinationRootClientId).length;
23756      }
23757  
23758      return {
23759        destinationRootClientId: _destinationRootClientId,
23760        destinationIndex: _destinationIndex
23761      };
23762    }, [rootClientId, insertionIndex, clientId, isAppender]);
23763    const {
23764      replaceBlocks,
23765      insertBlocks,
23766      showInsertionPoint,
23767      hideInsertionPoint
23768    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
23769    const onInsertBlocks = (0,external_wp_element_namespaceObject.useCallback)(function (blocks, meta) {
23770      let shouldForceFocusBlock = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
23771      const selectedBlock = getSelectedBlock();
23772  
23773      if (!isAppender && selectedBlock && (0,external_wp_blocks_namespaceObject.isUnmodifiedDefaultBlock)(selectedBlock)) {
23774        replaceBlocks(selectedBlock.clientId, blocks, null, shouldFocusBlock || shouldForceFocusBlock ? 0 : null, meta);
23775      } else {
23776        insertBlocks(blocks, destinationIndex, destinationRootClientId, true, shouldFocusBlock || shouldForceFocusBlock ? 0 : null, meta);
23777      }
23778  
23779      const message = (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %d: the name of the block that has been added
23780      (0,external_wp_i18n_namespaceObject._n)('%d block added.', '%d blocks added.', (0,external_lodash_namespaceObject.castArray)(blocks).length), (0,external_lodash_namespaceObject.castArray)(blocks).length);
23781      (0,external_wp_a11y_namespaceObject.speak)(message);
23782  
23783      if (onSelect) {
23784        onSelect();
23785      }
23786    }, [isAppender, getSelectedBlock, replaceBlocks, insertBlocks, destinationRootClientId, destinationIndex, onSelect, shouldFocusBlock]);
23787    const onToggleInsertionPoint = (0,external_wp_element_namespaceObject.useCallback)(show => {
23788      if (show) {
23789        showInsertionPoint(destinationRootClientId, destinationIndex);
23790      } else {
23791        hideInsertionPoint();
23792      }
23793    }, [showInsertionPoint, hideInsertionPoint, destinationRootClientId, destinationIndex]);
23794    return [destinationRootClientId, onInsertBlocks, onToggleInsertionPoint];
23795  }
23796  
23797  /* harmony default export */ var use_insertion_point = (useInsertionPoint);
23798  
23799  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/search-items.js
23800  /**
23801   * External dependencies
23802   */
23803   // Default search helpers.
23804  
23805  const defaultGetName = item => item.name || '';
23806  
23807  const defaultGetTitle = item => item.title;
23808  
23809  const defaultGetDescription = item => item.description || '';
23810  
23811  const defaultGetKeywords = item => item.keywords || [];
23812  
23813  const defaultGetCategory = item => item.category;
23814  
23815  const defaultGetCollection = () => null;
23816  /**
23817   * Sanitizes the search input string.
23818   *
23819   * @param {string} input The search input to normalize.
23820   *
23821   * @return {string} The normalized search input.
23822   */
23823  
23824  
23825  function normalizeSearchInput() {
23826    let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
23827    // Disregard diacritics.
23828    //  Input: "média"
23829    input = (0,external_lodash_namespaceObject.deburr)(input); // Accommodate leading slash, matching autocomplete expectations.
23830    //  Input: "/media"
23831  
23832    input = input.replace(/^\//, ''); // Lowercase.
23833    //  Input: "MEDIA"
23834  
23835    input = input.toLowerCase();
23836    return input;
23837  }
23838  /**
23839   * Converts the search term into a list of normalized terms.
23840   *
23841   * @param {string} input The search term to normalize.
23842   *
23843   * @return {string[]} The normalized list of search terms.
23844   */
23845  
23846  
23847  const getNormalizedSearchTerms = function () {
23848    let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
23849    // Extract words.
23850    return (0,external_lodash_namespaceObject.words)(normalizeSearchInput(input));
23851  };
23852  
23853  const removeMatchingTerms = (unmatchedTerms, unprocessedTerms) => {
23854    return (0,external_lodash_namespaceObject.differenceWith)(unmatchedTerms, getNormalizedSearchTerms(unprocessedTerms), (unmatchedTerm, unprocessedTerm) => unprocessedTerm.includes(unmatchedTerm));
23855  };
23856  
23857  const searchBlockItems = (items, categories, collections, searchInput) => {
23858    const normalizedSearchTerms = getNormalizedSearchTerms(searchInput);
23859  
23860    if (normalizedSearchTerms.length === 0) {
23861      return items;
23862    }
23863  
23864    const config = {
23865      getCategory: item => {
23866        var _find;
23867  
23868        return (_find = (0,external_lodash_namespaceObject.find)(categories, {
23869          slug: item.category
23870        })) === null || _find === void 0 ? void 0 : _find.title;
23871      },
23872      getCollection: item => {
23873        var _collections$item$nam;
23874  
23875        return (_collections$item$nam = collections[item.name.split('/')[0]]) === null || _collections$item$nam === void 0 ? void 0 : _collections$item$nam.title;
23876      }
23877    };
23878    return searchItems(items, searchInput, config);
23879  };
23880  /**
23881   * Filters an item list given a search term.
23882   *
23883   * @param {Array}  items       Item list
23884   * @param {string} searchInput Search input.
23885   * @param {Object} config      Search Config.
23886   *
23887   * @return {Array} Filtered item list.
23888   */
23889  
23890  const searchItems = function () {
23891    let items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
23892    let searchInput = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
23893    let config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
23894    const normalizedSearchTerms = getNormalizedSearchTerms(searchInput);
23895  
23896    if (normalizedSearchTerms.length === 0) {
23897      return items;
23898    }
23899  
23900    const rankedItems = items.map(item => {
23901      return [item, getItemSearchRank(item, searchInput, config)];
23902    }).filter(_ref => {
23903      let [, rank] = _ref;
23904      return rank > 0;
23905    });
23906    rankedItems.sort((_ref2, _ref3) => {
23907      let [, rank1] = _ref2;
23908      let [, rank2] = _ref3;
23909      return rank2 - rank1;
23910    });
23911    return rankedItems.map(_ref4 => {
23912      let [item] = _ref4;
23913      return item;
23914    });
23915  };
23916  /**
23917   * Get the search rank for a given item and a specific search term.
23918   * The better the match, the higher the rank.
23919   * If the rank equals 0, it should be excluded from the results.
23920   *
23921   * @param {Object} item       Item to filter.
23922   * @param {string} searchTerm Search term.
23923   * @param {Object} config     Search Config.
23924   *
23925   * @return {number} Search Rank.
23926   */
23927  
23928  function getItemSearchRank(item, searchTerm) {
23929    let config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
23930    const {
23931      getName = defaultGetName,
23932      getTitle = defaultGetTitle,
23933      getDescription = defaultGetDescription,
23934      getKeywords = defaultGetKeywords,
23935      getCategory = defaultGetCategory,
23936      getCollection = defaultGetCollection
23937    } = config;
23938    const name = getName(item);
23939    const title = getTitle(item);
23940    const description = getDescription(item);
23941    const keywords = getKeywords(item);
23942    const category = getCategory(item);
23943    const collection = getCollection(item);
23944    const normalizedSearchInput = normalizeSearchInput(searchTerm);
23945    const normalizedTitle = normalizeSearchInput(title);
23946    let rank = 0; // Prefers exact matches
23947    // Then prefers if the beginning of the title matches the search term
23948    // name, keywords, categories, collection, variations match come later.
23949  
23950    if (normalizedSearchInput === normalizedTitle) {
23951      rank += 30;
23952    } else if (normalizedTitle.startsWith(normalizedSearchInput)) {
23953      rank += 20;
23954    } else {
23955      const terms = [name, title, description, ...keywords, category, collection].join(' ');
23956      const normalizedSearchTerms = (0,external_lodash_namespaceObject.words)(normalizedSearchInput);
23957      const unmatchedTerms = removeMatchingTerms(normalizedSearchTerms, terms);
23958  
23959      if (unmatchedTerms.length === 0) {
23960        rank += 10;
23961      }
23962    } // Give a better rank to "core" namespaced items.
23963  
23964  
23965    if (rank !== 0 && name.startsWith('core/')) {
23966      const isCoreBlockVariation = name !== item.id; // Give a bit better rank to "core" blocks over "core" block variations.
23967  
23968      rank += isCoreBlockVariation ? 1 : 2;
23969    }
23970  
23971    return rank;
23972  }
23973  
23974  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/block-patterns-explorer/patterns-list.js
23975  
23976  
23977  /**
23978   * WordPress dependencies
23979   */
23980  
23981  
23982  
23983  
23984  
23985  /**
23986   * Internal dependencies
23987   */
23988  
23989  
23990  
23991  
23992  
23993  
23994  
23995  const INITIAL_INSERTER_RESULTS = 2;
23996  
23997  function PatternsListHeader(_ref) {
23998    let {
23999      filterValue,
24000      filteredBlockPatternsLength
24001    } = _ref;
24002  
24003    if (!filterValue) {
24004      return null;
24005    }
24006  
24007    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalHeading, {
24008      level: 2,
24009      lineHeight: '48px',
24010      className: "block-editor-block-patterns-explorer__search-results-count"
24011    }, (0,external_wp_i18n_namespaceObject.sprintf)(
24012    /* translators: %d: number of patterns. %s: block pattern search query */
24013    (0,external_wp_i18n_namespaceObject._n)('%1$d pattern found for "%2$s"', '%1$d patterns found for "%2$s"', filteredBlockPatternsLength), filteredBlockPatternsLength, filterValue));
24014  }
24015  
24016  function PatternList(_ref2) {
24017    let {
24018      filterValue,
24019      selectedCategory,
24020      patternCategories
24021    } = _ref2;
24022    const debouncedSpeak = (0,external_wp_compose_namespaceObject.useDebounce)(external_wp_a11y_namespaceObject.speak, 500);
24023    const [destinationRootClientId, onInsertBlocks] = use_insertion_point({
24024      shouldFocusBlock: true
24025    });
24026    const [allPatterns,, onSelectBlockPattern] = use_patterns_state(onInsertBlocks, destinationRootClientId);
24027    const registeredPatternCategories = (0,external_wp_element_namespaceObject.useMemo)(() => patternCategories.map(patternCategory => patternCategory.name), [patternCategories]);
24028    const filteredBlockPatterns = (0,external_wp_element_namespaceObject.useMemo)(() => {
24029      if (!filterValue) {
24030        return allPatterns.filter(pattern => {
24031          var _pattern$categories, _pattern$categories2;
24032  
24033          return selectedCategory === 'uncategorized' ? !((_pattern$categories = pattern.categories) !== null && _pattern$categories !== void 0 && _pattern$categories.length) || pattern.categories.every(category => !registeredPatternCategories.includes(category)) : (_pattern$categories2 = pattern.categories) === null || _pattern$categories2 === void 0 ? void 0 : _pattern$categories2.includes(selectedCategory);
24034        });
24035      }
24036  
24037      return searchItems(allPatterns, filterValue);
24038    }, [filterValue, selectedCategory, allPatterns]); // Announce search results on change.
24039  
24040    (0,external_wp_element_namespaceObject.useEffect)(() => {
24041      if (!filterValue) {
24042        return;
24043      }
24044  
24045      const count = filteredBlockPatterns.length;
24046      const resultsFoundMessage = (0,external_wp_i18n_namespaceObject.sprintf)(
24047      /* translators: %d: number of results. */
24048      (0,external_wp_i18n_namespaceObject._n)('%d result found.', '%d results found.', count), count);
24049      debouncedSpeak(resultsFoundMessage);
24050    }, [filterValue, debouncedSpeak]);
24051    const currentShownPatterns = (0,external_wp_compose_namespaceObject.useAsyncList)(filteredBlockPatterns, {
24052      step: INITIAL_INSERTER_RESULTS
24053    });
24054    const hasItems = !!(filteredBlockPatterns !== null && filteredBlockPatterns !== void 0 && filteredBlockPatterns.length);
24055    return (0,external_wp_element_namespaceObject.createElement)("div", {
24056      className: "block-editor-block-patterns-explorer__list"
24057    }, hasItems && (0,external_wp_element_namespaceObject.createElement)(PatternsListHeader, {
24058      filterValue: filterValue,
24059      filteredBlockPatternsLength: filteredBlockPatterns.length
24060    }), (0,external_wp_element_namespaceObject.createElement)(inserter_listbox, null, !hasItems && (0,external_wp_element_namespaceObject.createElement)(no_results, null), hasItems && (0,external_wp_element_namespaceObject.createElement)(block_patterns_list, {
24061      shownPatterns: currentShownPatterns,
24062      blockPatterns: filteredBlockPatterns,
24063      onClickPattern: onSelectBlockPattern,
24064      isDraggable: false
24065    })));
24066  }
24067  
24068  /* harmony default export */ var patterns_list = (PatternList);
24069  
24070  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/block-patterns-explorer/explorer.js
24071  
24072  
24073  /**
24074   * WordPress dependencies
24075   */
24076  
24077  
24078  
24079  /**
24080   * Internal dependencies
24081   */
24082  
24083  
24084  
24085  
24086  function PatternsExplorer(_ref) {
24087    let {
24088      initialCategory,
24089      patternCategories
24090    } = _ref;
24091    const [filterValue, setFilterValue] = (0,external_wp_element_namespaceObject.useState)('');
24092    const [selectedCategory, setSelectedCategory] = (0,external_wp_element_namespaceObject.useState)(initialCategory === null || initialCategory === void 0 ? void 0 : initialCategory.name);
24093    return (0,external_wp_element_namespaceObject.createElement)("div", {
24094      className: "block-editor-block-patterns-explorer"
24095    }, (0,external_wp_element_namespaceObject.createElement)(sidebar, {
24096      selectedCategory: selectedCategory,
24097      patternCategories: patternCategories,
24098      onClickCategory: setSelectedCategory,
24099      filterValue: filterValue,
24100      setFilterValue: setFilterValue
24101    }), (0,external_wp_element_namespaceObject.createElement)(patterns_list, {
24102      filterValue: filterValue,
24103      selectedCategory: selectedCategory,
24104      patternCategories: patternCategories
24105    }));
24106  }
24107  
24108  function PatternsExplorerModal(_ref2) {
24109    let {
24110      onModalClose,
24111      ...restProps
24112    } = _ref2;
24113    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Modal, {
24114      title: (0,external_wp_i18n_namespaceObject.__)('Patterns'),
24115      closeLabel: (0,external_wp_i18n_namespaceObject.__)('Close'),
24116      onRequestClose: onModalClose,
24117      isFullScreen: true
24118    }, (0,external_wp_element_namespaceObject.createElement)(PatternsExplorer, restProps));
24119  }
24120  
24121  /* harmony default export */ var explorer = (PatternsExplorerModal);
24122  
24123  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/block-patterns-tab.js
24124  
24125  
24126  /**
24127   * WordPress dependencies
24128   */
24129  
24130  
24131  
24132  /**
24133   * Internal dependencies
24134   */
24135  
24136  
24137  
24138  
24139  
24140  
24141  function BlockPatternsCategory(_ref) {
24142    let {
24143      rootClientId,
24144      onInsert,
24145      selectedCategory,
24146      populatedCategories
24147    } = _ref;
24148    const [allPatterns,, onClick] = use_patterns_state(onInsert, rootClientId);
24149    const getPatternIndex = (0,external_wp_element_namespaceObject.useCallback)(pattern => {
24150      var _pattern$categories;
24151  
24152      if (!((_pattern$categories = pattern.categories) !== null && _pattern$categories !== void 0 && _pattern$categories.length)) {
24153        return Infinity;
24154      }
24155  
24156      const indexedCategories = populatedCategories.reduce((accumulator, _ref2, index) => {
24157        let {
24158          name
24159        } = _ref2;
24160        accumulator[name] = index;
24161        return accumulator;
24162      }, {});
24163      return Math.min(...pattern.categories.map(cat => indexedCategories[cat] !== undefined ? indexedCategories[cat] : Infinity));
24164    }, [populatedCategories]);
24165    const currentCategoryPatterns = (0,external_wp_element_namespaceObject.useMemo)(() => allPatterns.filter(pattern => {
24166      var _pattern$categories2;
24167  
24168      return selectedCategory.name === 'uncategorized' ? getPatternIndex(pattern) === Infinity : (_pattern$categories2 = pattern.categories) === null || _pattern$categories2 === void 0 ? void 0 : _pattern$categories2.includes(selectedCategory.name);
24169    }), [allPatterns, selectedCategory]); // Ordering the patterns is important for the async rendering.
24170  
24171    const orderedPatterns = (0,external_wp_element_namespaceObject.useMemo)(() => {
24172      return currentCategoryPatterns.sort((a, b) => {
24173        return getPatternIndex(a) - getPatternIndex(b);
24174      });
24175    }, [currentCategoryPatterns, getPatternIndex]);
24176    const currentShownPatterns = (0,external_wp_compose_namespaceObject.useAsyncList)(orderedPatterns);
24177  
24178    if (!currentCategoryPatterns.length) {
24179      return null;
24180    }
24181  
24182    return (0,external_wp_element_namespaceObject.createElement)("div", {
24183      className: "block-editor-inserter__panel-content"
24184    }, (0,external_wp_element_namespaceObject.createElement)(block_patterns_list, {
24185      shownPatterns: currentShownPatterns,
24186      blockPatterns: currentCategoryPatterns,
24187      onClickPattern: onClick,
24188      label: selectedCategory.label,
24189      orientation: "vertical",
24190      isDraggable: true
24191    }));
24192  }
24193  
24194  function BlockPatternsTabs(_ref3) {
24195    let {
24196      rootClientId,
24197      onInsert,
24198      onClickCategory,
24199      selectedCategory
24200    } = _ref3;
24201    const [showPatternsExplorer, setShowPatternsExplorer] = (0,external_wp_element_namespaceObject.useState)(false);
24202    const [allPatterns, allCategories] = use_patterns_state();
24203    const hasRegisteredCategory = (0,external_wp_element_namespaceObject.useCallback)(pattern => {
24204      if (!pattern.categories || !pattern.categories.length) {
24205        return false;
24206      }
24207  
24208      return pattern.categories.some(cat => allCategories.some(category => category.name === cat));
24209    }, [allCategories]); // Remove any empty categories.
24210  
24211    const populatedCategories = (0,external_wp_element_namespaceObject.useMemo)(() => {
24212      const categories = allCategories.filter(category => allPatterns.some(pattern => {
24213        var _pattern$categories3;
24214  
24215        return (_pattern$categories3 = pattern.categories) === null || _pattern$categories3 === void 0 ? void 0 : _pattern$categories3.includes(category.name);
24216      })).sort((_ref4, _ref5) => {
24217        let {
24218          name: currentName
24219        } = _ref4;
24220        let {
24221          name: nextName
24222        } = _ref5;
24223  
24224        if (![currentName, nextName].includes('featured')) {
24225          return 0;
24226        }
24227  
24228        return currentName === 'featured' ? -1 : 1;
24229      });
24230  
24231      if (allPatterns.some(pattern => !hasRegisteredCategory(pattern)) && !categories.find(category => category.name === 'uncategorized')) {
24232        categories.push({
24233          name: 'uncategorized',
24234          label: (0,external_wp_i18n_namespaceObject._x)('Uncategorized')
24235        });
24236      }
24237  
24238      return categories;
24239    }, [allPatterns, allCategories]);
24240    const patternCategory = selectedCategory ? selectedCategory : populatedCategories[0];
24241    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(pattern_panel, {
24242      selectedCategory: patternCategory,
24243      patternCategories: populatedCategories,
24244      onClickCategory: onClickCategory,
24245      openPatternExplorer: () => setShowPatternsExplorer(true)
24246    }), !showPatternsExplorer && (0,external_wp_element_namespaceObject.createElement)(BlockPatternsCategory, {
24247      rootClientId: rootClientId,
24248      onInsert: onInsert,
24249      selectedCategory: patternCategory,
24250      populatedCategories: populatedCategories
24251    }), showPatternsExplorer && (0,external_wp_element_namespaceObject.createElement)(explorer, {
24252      initialCategory: patternCategory,
24253      patternCategories: populatedCategories,
24254      onModalClose: () => setShowPatternsExplorer(false)
24255    }));
24256  }
24257  
24258  /* harmony default export */ var block_patterns_tab = (BlockPatternsTabs);
24259  
24260  ;// CONCATENATED MODULE: external ["wp","url"]
24261  var external_wp_url_namespaceObject = window["wp"]["url"];
24262  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/reusable-blocks-tab.js
24263  
24264  
24265  /**
24266   * WordPress dependencies
24267   */
24268  
24269  
24270  
24271  /**
24272   * Internal dependencies
24273   */
24274  
24275  
24276  
24277  
24278  
24279  
24280  function ReusableBlocksList(_ref) {
24281    let {
24282      onHover,
24283      onInsert,
24284      rootClientId
24285    } = _ref;
24286    const [items,,, onSelectItem] = use_block_types_state(rootClientId, onInsert);
24287    const filteredItems = (0,external_wp_element_namespaceObject.useMemo)(() => {
24288      return items.filter(_ref2 => {
24289        let {
24290          category
24291        } = _ref2;
24292        return category === 'reusable';
24293      });
24294    }, [items]);
24295  
24296    if (filteredItems.length === 0) {
24297      return (0,external_wp_element_namespaceObject.createElement)(no_results, null);
24298    }
24299  
24300    return (0,external_wp_element_namespaceObject.createElement)(panel, {
24301      title: (0,external_wp_i18n_namespaceObject.__)('Reusable blocks')
24302    }, (0,external_wp_element_namespaceObject.createElement)(block_types_list, {
24303      items: filteredItems,
24304      onSelect: onSelectItem,
24305      onHover: onHover,
24306      label: (0,external_wp_i18n_namespaceObject.__)('Reusable blocks')
24307    }));
24308  } // The unwrapped component is only exported for use by unit tests.
24309  
24310  /**
24311   * List of reusable blocks shown in the "Reusable" tab of the inserter.
24312   *
24313   * @param {Object}   props              Component props.
24314   * @param {?string}  props.rootClientId Client id of block to insert into.
24315   * @param {Function} props.onInsert     Callback to run when item is inserted.
24316   * @param {Function} props.onHover      Callback to run when item is hovered.
24317   *
24318   * @return {WPComponent} The component.
24319   */
24320  
24321  
24322  function ReusableBlocksTab(_ref3) {
24323    let {
24324      rootClientId,
24325      onInsert,
24326      onHover
24327    } = _ref3;
24328    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(ReusableBlocksList, {
24329      onHover: onHover,
24330      onInsert: onInsert,
24331      rootClientId: rootClientId
24332    }), (0,external_wp_element_namespaceObject.createElement)("div", {
24333      className: "block-editor-inserter__manage-reusable-blocks-container"
24334    }, (0,external_wp_element_namespaceObject.createElement)("a", {
24335      className: "block-editor-inserter__manage-reusable-blocks",
24336      href: (0,external_wp_url_namespaceObject.addQueryArgs)('edit.php', {
24337        post_type: 'wp_block'
24338      })
24339    }, (0,external_wp_i18n_namespaceObject.__)('Manage Reusable blocks'))));
24340  }
24341  /* harmony default export */ var reusable_blocks_tab = (ReusableBlocksTab);
24342  
24343  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter-menu-extension/index.js
24344  /**
24345   * WordPress dependencies
24346   */
24347  
24348  const {
24349    Fill: __unstableInserterMenuExtension,
24350    Slot
24351  } = (0,external_wp_components_namespaceObject.createSlotFill)('__unstableInserterMenuExtension');
24352  __unstableInserterMenuExtension.Slot = Slot;
24353  /* harmony default export */ var inserter_menu_extension = (__unstableInserterMenuExtension);
24354  
24355  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/search-results.js
24356  
24357  
24358  /**
24359   * External dependencies
24360   */
24361  
24362  /**
24363   * WordPress dependencies
24364   */
24365  
24366  
24367  
24368  
24369  
24370  
24371  /**
24372   * Internal dependencies
24373   */
24374  
24375  
24376  
24377  
24378  
24379  
24380  
24381  
24382  
24383  
24384  
24385  const search_results_INITIAL_INSERTER_RESULTS = 9;
24386  /**
24387   * Shared reference to an empty array for cases where it is important to avoid
24388   * returning a new array reference on every invocation and rerendering the component.
24389   *
24390   * @type {Array}
24391   */
24392  
24393  const search_results_EMPTY_ARRAY = [];
24394  
24395  function InserterSearchResults(_ref) {
24396    let {
24397      filterValue,
24398      onSelect,
24399      onHover,
24400      rootClientId,
24401      clientId,
24402      isAppender,
24403      __experimentalInsertionIndex,
24404      maxBlockPatterns,
24405      maxBlockTypes,
24406      showBlockDirectory = false,
24407      isDraggable = true,
24408      shouldFocusBlock = true,
24409      prioritizePatterns
24410    } = _ref;
24411    const debouncedSpeak = (0,external_wp_compose_namespaceObject.useDebounce)(external_wp_a11y_namespaceObject.speak, 500);
24412    const [destinationRootClientId, onInsertBlocks] = use_insertion_point({
24413      onSelect,
24414      rootClientId,
24415      clientId,
24416      isAppender,
24417      insertionIndex: __experimentalInsertionIndex,
24418      shouldFocusBlock
24419    });
24420    const [blockTypes, blockTypeCategories, blockTypeCollections, onSelectBlockType] = use_block_types_state(destinationRootClientId, onInsertBlocks);
24421    const [patterns,, onSelectBlockPattern] = use_patterns_state(onInsertBlocks, destinationRootClientId);
24422    const filteredBlockPatterns = (0,external_wp_element_namespaceObject.useMemo)(() => {
24423      if (maxBlockPatterns === 0) {
24424        return [];
24425      }
24426  
24427      const results = searchItems(patterns, filterValue);
24428      return maxBlockPatterns !== undefined ? results.slice(0, maxBlockPatterns) : results;
24429    }, [filterValue, patterns, maxBlockPatterns]);
24430    let maxBlockTypesToShow = maxBlockTypes;
24431  
24432    if (prioritizePatterns && filteredBlockPatterns.length > 2) {
24433      maxBlockTypesToShow = 0;
24434    }
24435  
24436    const filteredBlockTypes = (0,external_wp_element_namespaceObject.useMemo)(() => {
24437      if (maxBlockTypesToShow === 0) {
24438        return [];
24439      }
24440  
24441      const results = searchBlockItems((0,external_lodash_namespaceObject.orderBy)(blockTypes, ['frecency'], ['desc']), blockTypeCategories, blockTypeCollections, filterValue);
24442      return maxBlockTypesToShow !== undefined ? results.slice(0, maxBlockTypesToShow) : results;
24443    }, [filterValue, blockTypes, blockTypeCategories, blockTypeCollections, maxBlockTypes]); // Announce search results on change.
24444  
24445    (0,external_wp_element_namespaceObject.useEffect)(() => {
24446      if (!filterValue) {
24447        return;
24448      }
24449  
24450      const count = filteredBlockTypes.length + filteredBlockPatterns.length;
24451      const resultsFoundMessage = (0,external_wp_i18n_namespaceObject.sprintf)(
24452      /* translators: %d: number of results. */
24453      (0,external_wp_i18n_namespaceObject._n)('%d result found.', '%d results found.', count), count);
24454      debouncedSpeak(resultsFoundMessage);
24455    }, [filterValue, debouncedSpeak]);
24456    const currentShownBlockTypes = (0,external_wp_compose_namespaceObject.useAsyncList)(filteredBlockTypes, {
24457      step: search_results_INITIAL_INSERTER_RESULTS
24458    });
24459    const currentShownPatterns = (0,external_wp_compose_namespaceObject.useAsyncList)(currentShownBlockTypes.length === filteredBlockTypes.length ? filteredBlockPatterns : search_results_EMPTY_ARRAY);
24460    const hasItems = !(0,external_lodash_namespaceObject.isEmpty)(filteredBlockTypes) || !(0,external_lodash_namespaceObject.isEmpty)(filteredBlockPatterns);
24461    const blocksUI = !!filteredBlockTypes.length && (0,external_wp_element_namespaceObject.createElement)(panel, {
24462      title: (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.VisuallyHidden, null, (0,external_wp_i18n_namespaceObject.__)('Blocks'))
24463    }, (0,external_wp_element_namespaceObject.createElement)(block_types_list, {
24464      items: currentShownBlockTypes,
24465      onSelect: onSelectBlockType,
24466      onHover: onHover,
24467      label: (0,external_wp_i18n_namespaceObject.__)('Blocks'),
24468      isDraggable: isDraggable
24469    }));
24470    const patternsUI = !!filteredBlockPatterns.length && (0,external_wp_element_namespaceObject.createElement)(panel, {
24471      title: (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.VisuallyHidden, null, (0,external_wp_i18n_namespaceObject.__)('Block Patterns'))
24472    }, (0,external_wp_element_namespaceObject.createElement)("div", {
24473      className: "block-editor-inserter__quick-inserter-patterns"
24474    }, (0,external_wp_element_namespaceObject.createElement)(block_patterns_list, {
24475      shownPatterns: currentShownPatterns,
24476      blockPatterns: filteredBlockPatterns,
24477      onClickPattern: onSelectBlockPattern,
24478      isDraggable: isDraggable
24479    })));
24480    return (0,external_wp_element_namespaceObject.createElement)(inserter_listbox, null, !showBlockDirectory && !hasItems && (0,external_wp_element_namespaceObject.createElement)(no_results, null), prioritizePatterns ? patternsUI : blocksUI, !!filteredBlockTypes.length && !!filteredBlockPatterns.length && (0,external_wp_element_namespaceObject.createElement)("div", {
24481      className: "block-editor-inserter__quick-inserter-separator"
24482    }), prioritizePatterns ? blocksUI : patternsUI, showBlockDirectory && (0,external_wp_element_namespaceObject.createElement)(inserter_menu_extension.Slot, {
24483      fillProps: {
24484        onSelect: onSelectBlockType,
24485        onHover,
24486        filterValue,
24487        hasItems,
24488        rootClientId: destinationRootClientId
24489      }
24490    }, fills => {
24491      if (fills.length) {
24492        return fills;
24493      }
24494  
24495      if (!hasItems) {
24496        return (0,external_wp_element_namespaceObject.createElement)(no_results, null);
24497      }
24498  
24499      return null;
24500    }));
24501  }
24502  
24503  /* harmony default export */ var search_results = (InserterSearchResults);
24504  
24505  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/tabs.js
24506  
24507  
24508  /**
24509   * WordPress dependencies
24510   */
24511  
24512  
24513  
24514  const blocksTab = {
24515    name: 'blocks',
24516  
24517    /* translators: Blocks tab title in the block inserter. */
24518    title: (0,external_wp_i18n_namespaceObject.__)('Blocks')
24519  };
24520  const patternsTab = {
24521    name: 'patterns',
24522  
24523    /* translators: Patterns tab title in the block inserter. */
24524    title: (0,external_wp_i18n_namespaceObject.__)('Patterns')
24525  };
24526  const reusableBlocksTab = {
24527    name: 'reusable',
24528  
24529    /* translators: Reusable blocks tab title in the block inserter. */
24530    title: (0,external_wp_i18n_namespaceObject.__)('Reusable')
24531  };
24532  
24533  function InserterTabs(_ref) {
24534    let {
24535      children,
24536      showPatterns = false,
24537      showReusableBlocks = false,
24538      onSelect
24539    } = _ref;
24540    const tabs = (0,external_wp_element_namespaceObject.useMemo)(() => {
24541      const tempTabs = [blocksTab];
24542  
24543      if (showPatterns) {
24544        tempTabs.push(patternsTab);
24545      }
24546  
24547      if (showReusableBlocks) {
24548        tempTabs.push(reusableBlocksTab);
24549      }
24550  
24551      return tempTabs;
24552    }, [blocksTab, showPatterns, patternsTab, showReusableBlocks, reusableBlocksTab]);
24553    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.TabPanel, {
24554      className: "block-editor-inserter__tabs",
24555      tabs: tabs,
24556      onSelect: onSelect
24557    }, children);
24558  }
24559  
24560  /* harmony default export */ var tabs = (InserterTabs);
24561  
24562  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/menu.js
24563  
24564  
24565  /**
24566   * WordPress dependencies
24567   */
24568  
24569  
24570  
24571  
24572  /**
24573   * Internal dependencies
24574   */
24575  
24576  
24577  
24578  
24579  
24580  
24581  
24582  
24583  
24584  
24585  
24586  function InserterMenu(_ref, ref) {
24587    let {
24588      rootClientId,
24589      clientId,
24590      isAppender,
24591      __experimentalInsertionIndex,
24592      onSelect,
24593      showInserterHelpPanel,
24594      showMostUsedBlocks,
24595      __experimentalFilterValue = '',
24596      shouldFocusBlock = true
24597    } = _ref;
24598    const [filterValue, setFilterValue] = (0,external_wp_element_namespaceObject.useState)(__experimentalFilterValue);
24599    const [hoveredItem, setHoveredItem] = (0,external_wp_element_namespaceObject.useState)(null);
24600    const [selectedPatternCategory, setSelectedPatternCategory] = (0,external_wp_element_namespaceObject.useState)(null);
24601    const [destinationRootClientId, onInsertBlocks, onToggleInsertionPoint] = use_insertion_point({
24602      rootClientId,
24603      clientId,
24604      isAppender,
24605      insertionIndex: __experimentalInsertionIndex,
24606      shouldFocusBlock
24607    });
24608    const {
24609      showPatterns,
24610      hasReusableBlocks
24611    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
24612      var _getSettings$__experi;
24613  
24614      const {
24615        __experimentalGetAllowedPatterns,
24616        getSettings
24617      } = select(store);
24618      return {
24619        showPatterns: !!__experimentalGetAllowedPatterns(destinationRootClientId).length,
24620        hasReusableBlocks: !!((_getSettings$__experi = getSettings().__experimentalReusableBlocks) !== null && _getSettings$__experi !== void 0 && _getSettings$__experi.length)
24621      };
24622    }, [destinationRootClientId]);
24623    const onInsert = (0,external_wp_element_namespaceObject.useCallback)((blocks, meta, shouldForceFocusBlock) => {
24624      onInsertBlocks(blocks, meta, shouldForceFocusBlock);
24625      onSelect();
24626    }, [onInsertBlocks, onSelect]);
24627    const onInsertPattern = (0,external_wp_element_namespaceObject.useCallback)((blocks, patternName) => {
24628      onInsertBlocks(blocks, {
24629        patternName
24630      });
24631      onSelect();
24632    }, [onInsertBlocks, onSelect]);
24633    const onHover = (0,external_wp_element_namespaceObject.useCallback)(item => {
24634      onToggleInsertionPoint(!!item);
24635      setHoveredItem(item);
24636    }, [onToggleInsertionPoint, setHoveredItem]);
24637    const onClickPatternCategory = (0,external_wp_element_namespaceObject.useCallback)(patternCategory => {
24638      setSelectedPatternCategory(patternCategory);
24639    }, [setSelectedPatternCategory]);
24640    const blocksTab = (0,external_wp_element_namespaceObject.useMemo)(() => (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)("div", {
24641      className: "block-editor-inserter__block-list"
24642    }, (0,external_wp_element_namespaceObject.createElement)(block_types_tab, {
24643      rootClientId: destinationRootClientId,
24644      onInsert: onInsert,
24645      onHover: onHover,
24646      showMostUsedBlocks: showMostUsedBlocks
24647    })), showInserterHelpPanel && (0,external_wp_element_namespaceObject.createElement)("div", {
24648      className: "block-editor-inserter__tips"
24649    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.VisuallyHidden, {
24650      as: "h2"
24651    }, (0,external_wp_i18n_namespaceObject.__)('A tip for using the block editor')), (0,external_wp_element_namespaceObject.createElement)(tips, null))), [destinationRootClientId, onInsert, onHover, filterValue, showMostUsedBlocks, showInserterHelpPanel]);
24652    const patternsTab = (0,external_wp_element_namespaceObject.useMemo)(() => (0,external_wp_element_namespaceObject.createElement)(block_patterns_tab, {
24653      rootClientId: destinationRootClientId,
24654      onInsert: onInsertPattern,
24655      onClickCategory: onClickPatternCategory,
24656      selectedCategory: selectedPatternCategory
24657    }), [destinationRootClientId, onInsertPattern, onClickPatternCategory, selectedPatternCategory]);
24658    const reusableBlocksTab = (0,external_wp_element_namespaceObject.useMemo)(() => (0,external_wp_element_namespaceObject.createElement)(reusable_blocks_tab, {
24659      rootClientId: destinationRootClientId,
24660      onInsert: onInsert,
24661      onHover: onHover
24662    }), [destinationRootClientId, onInsert, onHover]);
24663    const getCurrentTab = (0,external_wp_element_namespaceObject.useCallback)(tab => {
24664      if (tab.name === 'blocks') {
24665        return blocksTab;
24666      } else if (tab.name === 'patterns') {
24667        return patternsTab;
24668      }
24669  
24670      return reusableBlocksTab;
24671    }, [blocksTab, patternsTab, reusableBlocksTab]);
24672    const searchRef = (0,external_wp_element_namespaceObject.useRef)();
24673    (0,external_wp_element_namespaceObject.useImperativeHandle)(ref, () => ({
24674      focusSearch: () => {
24675        searchRef.current.focus();
24676      }
24677    }));
24678    return (0,external_wp_element_namespaceObject.createElement)("div", {
24679      className: "block-editor-inserter__menu"
24680    }, (0,external_wp_element_namespaceObject.createElement)("div", {
24681      className: "block-editor-inserter__main-area"
24682    }, (0,external_wp_element_namespaceObject.createElement)("div", {
24683      className: "block-editor-inserter__content"
24684    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.SearchControl, {
24685      className: "block-editor-inserter__search",
24686      onChange: value => {
24687        if (hoveredItem) setHoveredItem(null);
24688        setFilterValue(value);
24689      },
24690      value: filterValue,
24691      label: (0,external_wp_i18n_namespaceObject.__)('Search for blocks and patterns'),
24692      placeholder: (0,external_wp_i18n_namespaceObject.__)('Search'),
24693      ref: searchRef
24694    }), !!filterValue && (0,external_wp_element_namespaceObject.createElement)(search_results, {
24695      filterValue: filterValue,
24696      onSelect: onSelect,
24697      onHover: onHover,
24698      rootClientId: rootClientId,
24699      clientId: clientId,
24700      isAppender: isAppender,
24701      __experimentalInsertionIndex: __experimentalInsertionIndex,
24702      showBlockDirectory: true,
24703      shouldFocusBlock: shouldFocusBlock
24704    }), !filterValue && (showPatterns || hasReusableBlocks) && (0,external_wp_element_namespaceObject.createElement)(tabs, {
24705      showPatterns: showPatterns,
24706      showReusableBlocks: hasReusableBlocks
24707    }, getCurrentTab), !filterValue && !showPatterns && !hasReusableBlocks && blocksTab)), showInserterHelpPanel && hoveredItem && (0,external_wp_element_namespaceObject.createElement)(preview_panel, {
24708      item: hoveredItem
24709    }));
24710  }
24711  
24712  /* harmony default export */ var menu = ((0,external_wp_element_namespaceObject.forwardRef)(InserterMenu));
24713  
24714  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/quick-inserter.js
24715  
24716  
24717  /**
24718   * External dependencies
24719   */
24720  
24721  /**
24722   * WordPress dependencies
24723   */
24724  
24725  
24726  
24727  
24728  
24729  /**
24730   * Internal dependencies
24731   */
24732  
24733  
24734  
24735  
24736  
24737  
24738  const SEARCH_THRESHOLD = 6;
24739  const SHOWN_BLOCK_TYPES = 6;
24740  const SHOWN_BLOCK_PATTERNS = 2;
24741  const SHOWN_BLOCK_PATTERNS_WITH_PRIORITIZATION = 4;
24742  function QuickInserter(_ref) {
24743    let {
24744      onSelect,
24745      rootClientId,
24746      clientId,
24747      isAppender,
24748      prioritizePatterns
24749    } = _ref;
24750    const [filterValue, setFilterValue] = (0,external_wp_element_namespaceObject.useState)('');
24751    const [destinationRootClientId, onInsertBlocks] = use_insertion_point({
24752      onSelect,
24753      rootClientId,
24754      clientId,
24755      isAppender
24756    });
24757    const [blockTypes] = use_block_types_state(destinationRootClientId, onInsertBlocks);
24758    const [patterns] = use_patterns_state(onInsertBlocks, destinationRootClientId);
24759    const {
24760      setInserterIsOpened,
24761      insertionIndex
24762    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
24763      const {
24764        getSettings,
24765        getBlockIndex,
24766        getBlockCount
24767      } = select(store);
24768      const settings = getSettings();
24769      const index = getBlockIndex(clientId);
24770      const blockCount = getBlockCount();
24771      return {
24772        setInserterIsOpened: settings.__experimentalSetIsInserterOpened,
24773        insertionIndex: index === -1 ? blockCount : index
24774      };
24775    }, [clientId]);
24776    const showPatterns = patterns.length && (!!filterValue || prioritizePatterns);
24777    const showSearch = showPatterns && patterns.length > SEARCH_THRESHOLD || blockTypes.length > SEARCH_THRESHOLD;
24778    (0,external_wp_element_namespaceObject.useEffect)(() => {
24779      if (setInserterIsOpened) {
24780        setInserterIsOpened(false);
24781      }
24782    }, [setInserterIsOpened]); // When clicking Browse All select the appropriate block so as
24783    // the insertion point can work as expected.
24784  
24785    const onBrowseAll = () => {
24786      setInserterIsOpened({
24787        rootClientId,
24788        insertionIndex,
24789        filterValue
24790      });
24791    };
24792  
24793    let maxBlockPatterns = 0;
24794  
24795    if (showPatterns) {
24796      maxBlockPatterns = prioritizePatterns ? SHOWN_BLOCK_PATTERNS_WITH_PRIORITIZATION : SHOWN_BLOCK_PATTERNS;
24797    }
24798  
24799    return (0,external_wp_element_namespaceObject.createElement)("div", {
24800      className: classnames_default()('block-editor-inserter__quick-inserter', {
24801        'has-search': showSearch,
24802        'has-expand': setInserterIsOpened
24803      })
24804    }, showSearch && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.SearchControl, {
24805      className: "block-editor-inserter__search",
24806      value: filterValue,
24807      onChange: value => {
24808        setFilterValue(value);
24809      },
24810      label: (0,external_wp_i18n_namespaceObject.__)('Search for blocks and patterns'),
24811      placeholder: (0,external_wp_i18n_namespaceObject.__)('Search')
24812    }), (0,external_wp_element_namespaceObject.createElement)("div", {
24813      className: "block-editor-inserter__quick-inserter-results"
24814    }, (0,external_wp_element_namespaceObject.createElement)(search_results, {
24815      filterValue: filterValue,
24816      onSelect: onSelect,
24817      rootClientId: rootClientId,
24818      clientId: clientId,
24819      isAppender: isAppender,
24820      maxBlockPatterns: maxBlockPatterns,
24821      maxBlockTypes: SHOWN_BLOCK_TYPES,
24822      isDraggable: false,
24823      prioritizePatterns: prioritizePatterns
24824    })), setInserterIsOpened && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
24825      className: "block-editor-inserter__quick-inserter-expand",
24826      onClick: onBrowseAll,
24827      "aria-label": (0,external_wp_i18n_namespaceObject.__)('Browse all. This will open the main inserter panel in the editor toolbar.')
24828    }, (0,external_wp_i18n_namespaceObject.__)('Browse all')));
24829  }
24830  
24831  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/index.js
24832  
24833  
24834  
24835  /**
24836   * External dependencies
24837   */
24838  
24839  
24840  /**
24841   * WordPress dependencies
24842   */
24843  
24844  
24845  
24846  
24847  
24848  
24849  
24850  
24851  
24852  /**
24853   * Internal dependencies
24854   */
24855  
24856  
24857  
24858  
24859  
24860  const defaultRenderToggle = _ref => {
24861    let {
24862      onToggle,
24863      disabled,
24864      isOpen,
24865      blockTitle,
24866      hasSingleBlockType,
24867      toggleProps = {},
24868      prioritizePatterns
24869    } = _ref;
24870    let label;
24871  
24872    if (hasSingleBlockType) {
24873      label = (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %s: the name of the block when there is only one
24874      (0,external_wp_i18n_namespaceObject._x)('Add %s', 'directly add the only allowed block'), blockTitle);
24875    } else if (prioritizePatterns) {
24876      label = (0,external_wp_i18n_namespaceObject.__)('Add pattern');
24877    } else {
24878      label = (0,external_wp_i18n_namespaceObject._x)('Add block', 'Generic label for block inserter button');
24879    }
24880  
24881    const {
24882      onClick,
24883      ...rest
24884    } = toggleProps; // Handle both onClick functions from the toggle and the parent component.
24885  
24886    function handleClick(event) {
24887      if (onToggle) {
24888        onToggle(event);
24889      }
24890  
24891      if (onClick) {
24892        onClick(event);
24893      }
24894    }
24895  
24896    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, _extends({
24897      icon: library_plus,
24898      label: label,
24899      tooltipPosition: "bottom",
24900      onClick: handleClick,
24901      className: "block-editor-inserter__toggle",
24902      "aria-haspopup": !hasSingleBlockType ? 'true' : false,
24903      "aria-expanded": !hasSingleBlockType ? isOpen : false,
24904      disabled: disabled
24905    }, rest));
24906  };
24907  
24908  class Inserter extends external_wp_element_namespaceObject.Component {
24909    constructor() {
24910      super(...arguments);
24911      this.onToggle = this.onToggle.bind(this);
24912      this.renderToggle = this.renderToggle.bind(this);
24913      this.renderContent = this.renderContent.bind(this);
24914    }
24915  
24916    onToggle(isOpen) {
24917      const {
24918        onToggle
24919      } = this.props; // Surface toggle callback to parent component.
24920  
24921      if (onToggle) {
24922        onToggle(isOpen);
24923      }
24924    }
24925    /**
24926     * Render callback to display Dropdown toggle element.
24927     *
24928     * @param {Object}   options
24929     * @param {Function} options.onToggle Callback to invoke when toggle is
24930     *                                    pressed.
24931     * @param {boolean}  options.isOpen   Whether dropdown is currently open.
24932     *
24933     * @return {WPElement} Dropdown toggle element.
24934     */
24935  
24936  
24937    renderToggle(_ref2) {
24938      let {
24939        onToggle,
24940        isOpen
24941      } = _ref2;
24942      const {
24943        disabled,
24944        blockTitle,
24945        hasSingleBlockType,
24946        directInsertBlock,
24947        toggleProps,
24948        hasItems,
24949        renderToggle = defaultRenderToggle,
24950        prioritizePatterns
24951      } = this.props;
24952      return renderToggle({
24953        onToggle,
24954        isOpen,
24955        disabled: disabled || !hasItems,
24956        blockTitle,
24957        hasSingleBlockType,
24958        directInsertBlock,
24959        toggleProps,
24960        prioritizePatterns
24961      });
24962    }
24963    /**
24964     * Render callback to display Dropdown content element.
24965     *
24966     * @param {Object}   options
24967     * @param {Function} options.onClose Callback to invoke when dropdown is
24968     *                                   closed.
24969     *
24970     * @return {WPElement} Dropdown content element.
24971     */
24972  
24973  
24974    renderContent(_ref3) {
24975      let {
24976        onClose
24977      } = _ref3;
24978      const {
24979        rootClientId,
24980        clientId,
24981        isAppender,
24982        showInserterHelpPanel,
24983        // This prop is experimental to give some time for the quick inserter to mature
24984        // Feel free to make them stable after a few releases.
24985        __experimentalIsQuick: isQuick,
24986        prioritizePatterns
24987      } = this.props;
24988  
24989      if (isQuick) {
24990        return (0,external_wp_element_namespaceObject.createElement)(QuickInserter, {
24991          onSelect: () => {
24992            onClose();
24993          },
24994          rootClientId: rootClientId,
24995          clientId: clientId,
24996          isAppender: isAppender,
24997          prioritizePatterns: prioritizePatterns
24998        });
24999      }
25000  
25001      return (0,external_wp_element_namespaceObject.createElement)(menu, {
25002        onSelect: () => {
25003          onClose();
25004        },
25005        rootClientId: rootClientId,
25006        clientId: clientId,
25007        isAppender: isAppender,
25008        showInserterHelpPanel: showInserterHelpPanel
25009      });
25010    }
25011  
25012    render() {
25013      const {
25014        position,
25015        hasSingleBlockType,
25016        directInsertBlock,
25017        insertOnlyAllowedBlock,
25018        __experimentalIsQuick: isQuick,
25019        onSelectOrClose
25020      } = this.props;
25021  
25022      if (hasSingleBlockType || directInsertBlock) {
25023        return this.renderToggle({
25024          onToggle: insertOnlyAllowedBlock
25025        });
25026      }
25027  
25028      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Dropdown, {
25029        className: "block-editor-inserter",
25030        contentClassName: classnames_default()('block-editor-inserter__popover', {
25031          'is-quick': isQuick
25032        }),
25033        position: position,
25034        onToggle: this.onToggle,
25035        expandOnMobile: true,
25036        headerTitle: (0,external_wp_i18n_namespaceObject.__)('Add a block'),
25037        renderToggle: this.renderToggle,
25038        renderContent: this.renderContent,
25039        onClose: onSelectOrClose
25040      });
25041    }
25042  
25043  }
25044  
25045  /* harmony default export */ var inserter = ((0,external_wp_compose_namespaceObject.compose)([(0,external_wp_data_namespaceObject.withSelect)((select, _ref4) => {
25046    let {
25047      clientId,
25048      rootClientId
25049    } = _ref4;
25050    const {
25051      getBlockRootClientId,
25052      hasInserterItems,
25053      __experimentalGetAllowedBlocks,
25054      __experimentalGetDirectInsertBlock,
25055      getBlockIndex,
25056      getBlockCount,
25057      getSettings
25058    } = select(store);
25059    const {
25060      getBlockVariations
25061    } = select(external_wp_blocks_namespaceObject.store);
25062    rootClientId = rootClientId || getBlockRootClientId(clientId) || undefined;
25063  
25064    const allowedBlocks = __experimentalGetAllowedBlocks(rootClientId);
25065  
25066    const directInsertBlock = __experimentalGetDirectInsertBlock(rootClientId);
25067  
25068    const index = getBlockIndex(clientId);
25069    const blockCount = getBlockCount();
25070    const settings = getSettings();
25071    const hasSingleBlockType = (0,external_lodash_namespaceObject.size)(allowedBlocks) === 1 && (0,external_lodash_namespaceObject.size)(getBlockVariations(allowedBlocks[0].name, 'inserter')) === 0;
25072    let allowedBlockType = false;
25073  
25074    if (hasSingleBlockType) {
25075      allowedBlockType = allowedBlocks[0];
25076    }
25077  
25078    return {
25079      hasItems: hasInserterItems(rootClientId),
25080      hasSingleBlockType,
25081      blockTitle: allowedBlockType ? allowedBlockType.title : '',
25082      allowedBlockType,
25083      directInsertBlock,
25084      rootClientId,
25085      prioritizePatterns: settings.__experimentalPreferPatternsOnRoot && !rootClientId && index > 0 && (index < blockCount || blockCount === 0)
25086    };
25087  }), (0,external_wp_data_namespaceObject.withDispatch)((dispatch, ownProps, _ref5) => {
25088    let {
25089      select
25090    } = _ref5;
25091    return {
25092      insertOnlyAllowedBlock() {
25093        const {
25094          rootClientId,
25095          clientId,
25096          isAppender,
25097          hasSingleBlockType,
25098          allowedBlockType,
25099          directInsertBlock,
25100          onSelectOrClose
25101        } = ownProps;
25102  
25103        if (!hasSingleBlockType && !directInsertBlock) {
25104          return;
25105        }
25106  
25107        function getAdjacentBlockAttributes(attributesToCopy) {
25108          const {
25109            getBlock,
25110            getPreviousBlockClientId
25111          } = select(store);
25112  
25113          if (!attributesToCopy || !clientId && !rootClientId) {
25114            return {};
25115          }
25116  
25117          const result = {};
25118          let adjacentAttributes = {}; // If there is no clientId, then attempt to get attributes
25119          // from the last block within innerBlocks of the root block.
25120  
25121          if (!clientId) {
25122            var _parentBlock$innerBlo;
25123  
25124            const parentBlock = getBlock(rootClientId);
25125  
25126            if (parentBlock !== null && parentBlock !== void 0 && (_parentBlock$innerBlo = parentBlock.innerBlocks) !== null && _parentBlock$innerBlo !== void 0 && _parentBlock$innerBlo.length) {
25127              const lastInnerBlock = parentBlock.innerBlocks[parentBlock.innerBlocks.length - 1];
25128  
25129              if (directInsertBlock && (directInsertBlock === null || directInsertBlock === void 0 ? void 0 : directInsertBlock.name) === lastInnerBlock.name) {
25130                adjacentAttributes = lastInnerBlock.attributes;
25131              }
25132            }
25133          } else {
25134            // Otherwise, attempt to get attributes from the
25135            // previous block relative to the current clientId.
25136            const currentBlock = getBlock(clientId);
25137            const previousBlock = getBlock(getPreviousBlockClientId(clientId));
25138  
25139            if ((currentBlock === null || currentBlock === void 0 ? void 0 : currentBlock.name) === (previousBlock === null || previousBlock === void 0 ? void 0 : previousBlock.name)) {
25140              adjacentAttributes = (previousBlock === null || previousBlock === void 0 ? void 0 : previousBlock.attributes) || {};
25141            }
25142          } // Copy over only those attributes flagged to be copied.
25143  
25144  
25145          attributesToCopy.forEach(attribute => {
25146            if (adjacentAttributes.hasOwnProperty(attribute)) {
25147              result[attribute] = adjacentAttributes[attribute];
25148            }
25149          });
25150          return result;
25151        }
25152  
25153        function getInsertionIndex() {
25154          const {
25155            getBlockIndex,
25156            getBlockSelectionEnd,
25157            getBlockOrder,
25158            getBlockRootClientId
25159          } = select(store); // If the clientId is defined, we insert at the position of the block.
25160  
25161          if (clientId) {
25162            return getBlockIndex(clientId);
25163          } // If there a selected block, we insert after the selected block.
25164  
25165  
25166          const end = getBlockSelectionEnd();
25167  
25168          if (!isAppender && end && getBlockRootClientId(end) === rootClientId) {
25169            return getBlockIndex(end) + 1;
25170          } // Otherwise, we insert at the end of the current rootClientId.
25171  
25172  
25173          return getBlockOrder(rootClientId).length;
25174        }
25175  
25176        const {
25177          insertBlock
25178        } = dispatch(store);
25179        let blockToInsert; // Attempt to augment the directInsertBlock with attributes from an adjacent block.
25180        // This ensures styling from nearby blocks is preserved in the newly inserted block.
25181        // See: https://github.com/WordPress/gutenberg/issues/37904
25182  
25183        if (directInsertBlock) {
25184          const newAttributes = getAdjacentBlockAttributes(directInsertBlock.attributesToCopy);
25185          blockToInsert = (0,external_wp_blocks_namespaceObject.createBlock)(directInsertBlock.name, { ...(directInsertBlock.attributes || {}),
25186            ...newAttributes
25187          });
25188        } else {
25189          blockToInsert = (0,external_wp_blocks_namespaceObject.createBlock)(allowedBlockType.name);
25190        }
25191  
25192        insertBlock(blockToInsert, getInsertionIndex(), rootClientId);
25193  
25194        if (onSelectOrClose) {
25195          onSelectOrClose();
25196        }
25197  
25198        const message = (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %s: the name of the block that has been added
25199        (0,external_wp_i18n_namespaceObject.__)('%s block added'), allowedBlockType.title);
25200        (0,external_wp_a11y_namespaceObject.speak)(message);
25201      }
25202  
25203    };
25204  }), // The global inserter should always be visible, we are using ( ! isAppender && ! rootClientId && ! clientId ) as
25205  // a way to detect the global Inserter.
25206  (0,external_wp_compose_namespaceObject.ifCondition)(_ref6 => {
25207    let {
25208      hasItems,
25209      isAppender,
25210      rootClientId,
25211      clientId
25212    } = _ref6;
25213    return hasItems || !isAppender && !rootClientId && !clientId;
25214  })])(Inserter));
25215  
25216  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/default-block-appender/index.js
25217  
25218  
25219  /**
25220   * External dependencies
25221   */
25222  
25223  /**
25224   * WordPress dependencies
25225   */
25226  
25227  
25228  
25229  
25230  
25231  
25232  /**
25233   * Internal dependencies
25234   */
25235  
25236  
25237  
25238  /**
25239   * Zero width non-breaking space, used as padding for the paragraph when it is
25240   * empty.
25241   */
25242  
25243  const ZWNBSP = '\ufeff';
25244  function DefaultBlockAppender(_ref) {
25245    let {
25246      isLocked,
25247      onAppend,
25248      showPrompt,
25249      placeholder,
25250      rootClientId
25251    } = _ref;
25252  
25253    if (isLocked) {
25254      return null;
25255    }
25256  
25257    const value = (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(placeholder) || (0,external_wp_i18n_namespaceObject.__)('Type / to choose a block');
25258  
25259    return (0,external_wp_element_namespaceObject.createElement)("div", {
25260      "data-root-client-id": rootClientId || '',
25261      className: classnames_default()('block-editor-default-block-appender', {
25262        'has-visible-prompt': showPrompt
25263      })
25264    }, (0,external_wp_element_namespaceObject.createElement)("p", {
25265      tabIndex: "0" // We want this element to be styled as a paragraph by themes.
25266      // eslint-disable-next-line jsx-a11y/no-noninteractive-element-to-interactive-role
25267      ,
25268      role: "button",
25269      "aria-label": (0,external_wp_i18n_namespaceObject.__)('Add default block') // A wrapping container for this one already has the wp-block className.
25270      ,
25271      className: "block-editor-default-block-appender__content",
25272      onKeyDown: event => {
25273        if (external_wp_keycodes_namespaceObject.ENTER === event.keyCode || external_wp_keycodes_namespaceObject.SPACE === event.keyCode) {
25274          onAppend();
25275        }
25276      },
25277      onClick: () => onAppend(),
25278      onFocus: () => {
25279        if (showPrompt) {
25280          onAppend();
25281        }
25282      }
25283    }, showPrompt ? value : ZWNBSP), (0,external_wp_element_namespaceObject.createElement)(inserter, {
25284      rootClientId: rootClientId,
25285      position: "bottom right",
25286      isAppender: true,
25287      __experimentalIsQuick: true
25288    }));
25289  }
25290  /* harmony default export */ var default_block_appender = ((0,external_wp_compose_namespaceObject.compose)((0,external_wp_data_namespaceObject.withSelect)((select, ownProps) => {
25291    const {
25292      getBlockCount,
25293      getSettings,
25294      getTemplateLock
25295    } = select(store);
25296    const isEmpty = !getBlockCount(ownProps.rootClientId);
25297    const {
25298      bodyPlaceholder
25299    } = getSettings();
25300    return {
25301      showPrompt: isEmpty,
25302      isLocked: !!getTemplateLock(ownProps.rootClientId),
25303      placeholder: bodyPlaceholder
25304    };
25305  }), (0,external_wp_data_namespaceObject.withDispatch)((dispatch, ownProps) => {
25306    const {
25307      insertDefaultBlock,
25308      startTyping
25309    } = dispatch(store);
25310    return {
25311      onAppend() {
25312        const {
25313          rootClientId
25314        } = ownProps;
25315        insertDefaultBlock(undefined, rootClientId);
25316        startTyping();
25317      }
25318  
25319    };
25320  }))(DefaultBlockAppender));
25321  
25322  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/button-block-appender/index.js
25323  
25324  
25325  /**
25326   * External dependencies
25327   */
25328  
25329  /**
25330   * WordPress dependencies
25331   */
25332  
25333  
25334  
25335  
25336  
25337  
25338  /**
25339   * Internal dependencies
25340   */
25341  
25342  
25343  
25344  function ButtonBlockAppender(_ref, ref) {
25345    let {
25346      rootClientId,
25347      className,
25348      onFocus,
25349      tabIndex
25350    } = _ref;
25351    return (0,external_wp_element_namespaceObject.createElement)(inserter, {
25352      position: "bottom center",
25353      rootClientId: rootClientId,
25354      __experimentalIsQuick: true,
25355      renderToggle: _ref2 => {
25356        let {
25357          onToggle,
25358          disabled,
25359          isOpen,
25360          blockTitle,
25361          hasSingleBlockType
25362        } = _ref2;
25363        let label;
25364  
25365        if (hasSingleBlockType) {
25366          label = (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %s: the name of the block when there is only one
25367          (0,external_wp_i18n_namespaceObject._x)('Add %s', 'directly add the only allowed block'), blockTitle);
25368        } else {
25369          label = (0,external_wp_i18n_namespaceObject._x)('Add block', 'Generic label for block inserter button');
25370        }
25371  
25372        const isToggleButton = !hasSingleBlockType;
25373        let inserterButton = (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
25374          ref: ref,
25375          onFocus: onFocus,
25376          tabIndex: tabIndex,
25377          className: classnames_default()(className, 'block-editor-button-block-appender'),
25378          onClick: onToggle,
25379          "aria-haspopup": isToggleButton ? 'true' : undefined,
25380          "aria-expanded": isToggleButton ? isOpen : undefined,
25381          disabled: disabled,
25382          label: label
25383        }, !hasSingleBlockType && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.VisuallyHidden, {
25384          as: "span"
25385        }, label), (0,external_wp_element_namespaceObject.createElement)(build_module_icon, {
25386          icon: library_plus
25387        }));
25388  
25389        if (isToggleButton || hasSingleBlockType) {
25390          inserterButton = (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Tooltip, {
25391            text: label
25392          }, inserterButton);
25393        }
25394  
25395        return inserterButton;
25396      },
25397      isAppender: true
25398    });
25399  }
25400  /**
25401   * Use `ButtonBlockAppender` instead.
25402   *
25403   * @deprecated
25404   */
25405  
25406  
25407  const ButtonBlockerAppender = (0,external_wp_element_namespaceObject.forwardRef)((props, ref) => {
25408    external_wp_deprecated_default()(`wp.blockEditor.ButtonBlockerAppender`, {
25409      alternative: 'wp.blockEditor.ButtonBlockAppender',
25410      since: '5.9'
25411    });
25412    return ButtonBlockAppender(props, ref);
25413  });
25414  /**
25415   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/button-block-appender/README.md
25416   */
25417  
25418  /* harmony default export */ var button_block_appender = ((0,external_wp_element_namespaceObject.forwardRef)(ButtonBlockAppender));
25419  
25420  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-list-appender/index.js
25421  
25422  
25423  /**
25424   * External dependencies
25425   */
25426  
25427  /**
25428   * WordPress dependencies
25429   */
25430  
25431  
25432  
25433  /**
25434   * Internal dependencies
25435   */
25436  
25437  
25438  
25439  
25440  
25441  function BlockListAppender(_ref) {
25442    let {
25443      rootClientId,
25444      canInsertDefaultBlock,
25445      isLocked,
25446      renderAppender: CustomAppender,
25447      className,
25448      selectedBlockClientId,
25449      tagName: TagName = 'div'
25450    } = _ref;
25451  
25452    if (isLocked || CustomAppender === false) {
25453      return null;
25454    }
25455  
25456    let appender;
25457  
25458    if (CustomAppender) {
25459      // Prefer custom render prop if provided.
25460      appender = (0,external_wp_element_namespaceObject.createElement)(CustomAppender, null);
25461    } else {
25462      const isParentSelected = selectedBlockClientId === rootClientId || !rootClientId && !selectedBlockClientId;
25463  
25464      if (!isParentSelected) {
25465        return null;
25466      }
25467  
25468      if (canInsertDefaultBlock) {
25469        // Render the default block appender when renderAppender has not been
25470        // provided and the context supports use of the default appender.
25471        appender = (0,external_wp_element_namespaceObject.createElement)(default_block_appender, {
25472          rootClientId: rootClientId
25473        });
25474      } else {
25475        // Fallback in the case no renderAppender has been provided and the
25476        // default block can't be inserted.
25477        appender = (0,external_wp_element_namespaceObject.createElement)(button_block_appender, {
25478          rootClientId: rootClientId,
25479          className: "block-list-appender__toggle"
25480        });
25481      }
25482    }
25483  
25484    return (0,external_wp_element_namespaceObject.createElement)(TagName // A `tabIndex` is used on the wrapping `div` element in order to
25485    // force a focus event to occur when an appender `button` element
25486    // is clicked. In some browsers (Firefox, Safari), button clicks do
25487    // not emit a focus event, which could cause this event to propagate
25488    // unexpectedly. The `tabIndex` ensures that the interaction is
25489    // captured as a focus, without also adding an extra tab stop.
25490    //
25491    // See: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#Clicking_and_focus
25492    , {
25493      tabIndex: -1,
25494      className: classnames_default()('block-list-appender wp-block', className) // Needed in case the whole editor is content editable (for multi
25495      // selection). It fixes an edge case where ArrowDown and ArrowRight
25496      // should collapse the selection to the end of that selection and
25497      // not into the appender.
25498      ,
25499      contentEditable: false // The appender exists to let you add the first Paragraph before
25500      // any is inserted. To that end, this appender should visually be
25501      // presented as a block. That means theme CSS should style it as if
25502      // it were an empty paragraph block. That means a `wp-block` class to
25503      // ensure the width is correct, and a [data-block] attribute to ensure
25504      // the correct margin is applied, especially for classic themes which
25505      // have commonly targeted that attribute for margins.
25506      ,
25507      "data-block": true
25508    }, appender);
25509  }
25510  
25511  /* harmony default export */ var block_list_appender = ((0,external_wp_data_namespaceObject.withSelect)((select, _ref2) => {
25512    let {
25513      rootClientId
25514    } = _ref2;
25515    const {
25516      canInsertBlockType,
25517      getTemplateLock,
25518      getSelectedBlockClientId
25519    } = select(store);
25520    return {
25521      isLocked: !!getTemplateLock(rootClientId),
25522      canInsertDefaultBlock: canInsertBlockType((0,external_wp_blocks_namespaceObject.getDefaultBlockName)(), rootClientId),
25523      selectedBlockClientId: getSelectedBlockClientId()
25524    };
25525  })(BlockListAppender));
25526  
25527  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-tools/use-popover-scroll.js
25528  /**
25529   * WordPress dependencies
25530   */
25531  
25532  /**
25533   * Allow scrolling "through" popovers over the canvas. This is only called for
25534   * as long as the pointer is over a popover. Do not use React events because it
25535   * will bubble through portals.
25536   *
25537   * @param {Object} scrollableRef
25538   */
25539  
25540  function usePopoverScroll(scrollableRef) {
25541    return (0,external_wp_compose_namespaceObject.useRefEffect)(node => {
25542      if (!scrollableRef) {
25543        return;
25544      }
25545  
25546      function onWheel(event) {
25547        const {
25548          deltaX,
25549          deltaY
25550        } = event;
25551        scrollableRef.current.scrollBy(deltaX, deltaY);
25552      } // Tell the browser that we do not call event.preventDefault
25553      // See https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#improving_scrolling_performance_with_passive_listeners
25554  
25555  
25556      const options = {
25557        passive: true
25558      };
25559      node.addEventListener('wheel', onWheel, options);
25560      return () => {
25561        node.removeEventListener('wheel', onWheel, options);
25562      };
25563    }, [scrollableRef]);
25564  }
25565  
25566  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-tools/insertion-point.js
25567  
25568  
25569  /**
25570   * External dependencies
25571   */
25572  
25573  /**
25574   * WordPress dependencies
25575   */
25576  
25577  
25578  
25579  
25580  
25581  
25582  /**
25583   * Internal dependencies
25584   */
25585  
25586  
25587  
25588  
25589  
25590  const InsertionPointOpenRef = (0,external_wp_element_namespaceObject.createContext)();
25591  
25592  function InsertionPointPopover(_ref) {
25593    let {
25594      __unstablePopoverSlot,
25595      __unstableContentRef
25596    } = _ref;
25597    const {
25598      selectBlock,
25599      hideInsertionPoint
25600    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
25601    const openRef = (0,external_wp_element_namespaceObject.useContext)(InsertionPointOpenRef);
25602    const ref = (0,external_wp_element_namespaceObject.useRef)();
25603    const {
25604      orientation,
25605      previousClientId,
25606      nextClientId,
25607      rootClientId,
25608      isInserterShown
25609    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
25610      var _getBlockListSettings;
25611  
25612      const {
25613        getBlockOrder,
25614        getBlockListSettings,
25615        getBlockInsertionPoint,
25616        isBlockBeingDragged,
25617        getPreviousBlockClientId,
25618        getNextBlockClientId
25619      } = select(store);
25620      const insertionPoint = getBlockInsertionPoint();
25621      const order = getBlockOrder(insertionPoint.rootClientId);
25622  
25623      if (!order.length) {
25624        return {};
25625      }
25626  
25627      let _previousClientId = order[insertionPoint.index - 1];
25628      let _nextClientId = order[insertionPoint.index];
25629  
25630      while (isBlockBeingDragged(_previousClientId)) {
25631        _previousClientId = getPreviousBlockClientId(_previousClientId);
25632      }
25633  
25634      while (isBlockBeingDragged(_nextClientId)) {
25635        _nextClientId = getNextBlockClientId(_nextClientId);
25636      }
25637  
25638      return {
25639        previousClientId: _previousClientId,
25640        nextClientId: _nextClientId,
25641        orientation: ((_getBlockListSettings = getBlockListSettings(insertionPoint.rootClientId)) === null || _getBlockListSettings === void 0 ? void 0 : _getBlockListSettings.orientation) || 'vertical',
25642        rootClientId: insertionPoint.rootClientId,
25643        isInserterShown: insertionPoint === null || insertionPoint === void 0 ? void 0 : insertionPoint.__unstableWithInserter
25644      };
25645    }, []);
25646    const previousElement = useBlockElement(previousClientId);
25647    const nextElement = useBlockElement(nextClientId);
25648    const isVertical = orientation === 'vertical';
25649    const style = (0,external_wp_element_namespaceObject.useMemo)(() => {
25650      if (!previousElement && !nextElement) {
25651        return {};
25652      }
25653  
25654      const previousRect = previousElement ? previousElement.getBoundingClientRect() : null;
25655      const nextRect = nextElement ? nextElement.getBoundingClientRect() : null;
25656  
25657      if (isVertical) {
25658        return {
25659          width: previousElement ? previousElement.offsetWidth : nextElement.offsetWidth,
25660          height: nextRect && previousRect ? nextRect.top - previousRect.bottom : 0
25661        };
25662      }
25663  
25664      let width = 0;
25665  
25666      if (previousRect && nextRect) {
25667        width = (0,external_wp_i18n_namespaceObject.isRTL)() ? previousRect.left - nextRect.right : nextRect.left - previousRect.right;
25668      }
25669  
25670      return {
25671        width,
25672        height: previousElement ? previousElement.offsetHeight : nextElement.offsetHeight
25673      };
25674    }, [previousElement, nextElement]);
25675    const getAnchorRect = (0,external_wp_element_namespaceObject.useCallback)(() => {
25676      if (!previousElement && !nextElement) {
25677        return {};
25678      }
25679  
25680      const {
25681        ownerDocument
25682      } = previousElement || nextElement;
25683      const previousRect = previousElement ? previousElement.getBoundingClientRect() : null;
25684      const nextRect = nextElement ? nextElement.getBoundingClientRect() : null;
25685  
25686      if (isVertical) {
25687        if ((0,external_wp_i18n_namespaceObject.isRTL)()) {
25688          return {
25689            top: previousRect ? previousRect.bottom : nextRect.top,
25690            left: previousRect ? previousRect.right : nextRect.right,
25691            right: previousRect ? previousRect.left : nextRect.left,
25692            bottom: nextRect ? nextRect.top : previousRect.bottom,
25693            ownerDocument
25694          };
25695        }
25696  
25697        return {
25698          top: previousRect ? previousRect.bottom : nextRect.top,
25699          left: previousRect ? previousRect.left : nextRect.left,
25700          right: previousRect ? previousRect.right : nextRect.right,
25701          bottom: nextRect ? nextRect.top : previousRect.bottom,
25702          ownerDocument
25703        };
25704      }
25705  
25706      if ((0,external_wp_i18n_namespaceObject.isRTL)()) {
25707        return {
25708          top: previousRect ? previousRect.top : nextRect.top,
25709          left: previousRect ? previousRect.left : nextRect.right,
25710          right: nextRect ? nextRect.right : previousRect.left,
25711          bottom: previousRect ? previousRect.bottom : nextRect.bottom,
25712          ownerDocument
25713        };
25714      }
25715  
25716      return {
25717        top: previousRect ? previousRect.top : nextRect.top,
25718        left: previousRect ? previousRect.right : nextRect.left,
25719        right: nextRect ? nextRect.left : previousRect.right,
25720        bottom: previousRect ? previousRect.bottom : nextRect.bottom,
25721        ownerDocument
25722      };
25723    }, [previousElement, nextElement]);
25724    const popoverScrollRef = usePopoverScroll(__unstableContentRef);
25725    const disableMotion = (0,external_wp_compose_namespaceObject.useReducedMotion)();
25726    const className = classnames_default()('block-editor-block-list__insertion-point', 'is-' + orientation);
25727  
25728    function onClick(event) {
25729      if (event.target === ref.current && nextClientId) {
25730        selectBlock(nextClientId, -1);
25731      }
25732    }
25733  
25734    function onFocus(event) {
25735      // Only handle click on the wrapper specifically, and not an event
25736      // bubbled from the inserter itself.
25737      if (event.target !== ref.current) {
25738        openRef.current = true;
25739      }
25740    }
25741  
25742    function maybeHideInserterPoint(event) {
25743      // Only hide the inserter if it's triggered on the wrapper,
25744      // and the inserter is not open.
25745      if (event.target === ref.current && !openRef.current) {
25746        hideInsertionPoint();
25747      }
25748    } // Only show the in-between inserter between blocks, so when there's a
25749    // previous and a next element.
25750  
25751  
25752    const showInsertionPointInserter = previousElement && nextElement && isInserterShown; // Define animation variants for the line element.
25753  
25754    const horizontalLine = {
25755      start: {
25756        width: 0,
25757        top: '50%',
25758        bottom: '50%',
25759        x: 0
25760      },
25761      rest: {
25762        width: 4,
25763        top: 0,
25764        bottom: 0,
25765        x: -2
25766      },
25767      hover: {
25768        width: 4,
25769        top: 0,
25770        bottom: 0,
25771        x: -2
25772      }
25773    };
25774    const verticalLine = {
25775      start: {
25776        height: 0,
25777        left: '50%',
25778        right: '50%',
25779        y: 0
25780      },
25781      rest: {
25782        height: 4,
25783        left: 0,
25784        right: 0,
25785        y: -2
25786      },
25787      hover: {
25788        height: 4,
25789        left: 0,
25790        right: 0,
25791        y: -2
25792      }
25793    };
25794    const lineVariants = {
25795      // Initial position starts from the center and invisible.
25796      start: { ...(!isVertical ? horizontalLine.start : verticalLine.start),
25797        opacity: 0
25798      },
25799      // The line expands to fill the container. If the inserter is visible it
25800      // is delayed so it appears orchestrated.
25801      rest: { ...(!isVertical ? horizontalLine.rest : verticalLine.rest),
25802        opacity: 1,
25803        borderRadius: '2px',
25804        transition: {
25805          delay: showInsertionPointInserter ? 0.4 : 0
25806        }
25807      },
25808      hover: { ...(!isVertical ? horizontalLine.hover : verticalLine.hover),
25809        opacity: 1,
25810        borderRadius: '2px',
25811        transition: {
25812          delay: 0.4
25813        }
25814      }
25815    };
25816    const inserterVariants = {
25817      start: {
25818        scale: disableMotion ? 1 : 0
25819      },
25820      rest: {
25821        scale: 1,
25822        transition: {
25823          delay: 0.2
25824        }
25825      }
25826    };
25827    /* eslint-disable jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events */
25828    // While ideally it would be enough to capture the
25829    // bubbling focus event from the Inserter, due to the
25830    // characteristics of click focusing of `button`s in
25831    // Firefox and Safari, it is not reliable.
25832    //
25833    // See: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#Clicking_and_focus
25834  
25835    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Popover, {
25836      ref: popoverScrollRef,
25837      noArrow: true,
25838      animate: false,
25839      getAnchorRect: getAnchorRect,
25840      focusOnMount: false,
25841      className: "block-editor-block-list__insertion-point-popover" // Render in the old slot if needed for backward compatibility,
25842      // otherwise render in place (not in the the default popover slot).
25843      ,
25844      __unstableSlotName: __unstablePopoverSlot || null // Forces a remount of the popover when its position changes
25845      // This makes sure the popover doesn't animate from its previous position.
25846      ,
25847      key: nextClientId + '--' + rootClientId
25848    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__unstableMotion.div, {
25849      layout: !disableMotion,
25850      initial: disableMotion ? 'rest' : 'start',
25851      animate: "rest",
25852      whileHover: "hover",
25853      whileTap: "pressed",
25854      exit: "start",
25855      ref: ref,
25856      tabIndex: -1,
25857      onClick: onClick,
25858      onFocus: onFocus,
25859      className: classnames_default()(className, {
25860        'is-with-inserter': showInsertionPointInserter
25861      }),
25862      onHoverEnd: maybeHideInserterPoint,
25863      style: style
25864    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__unstableMotion.div, {
25865      variants: lineVariants,
25866      className: "block-editor-block-list__insertion-point-indicator"
25867    }), showInsertionPointInserter && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__unstableMotion.div, {
25868      variants: inserterVariants,
25869      className: classnames_default()('block-editor-block-list__insertion-point-inserter')
25870    }, (0,external_wp_element_namespaceObject.createElement)(inserter, {
25871      position: "bottom center",
25872      clientId: nextClientId,
25873      rootClientId: rootClientId,
25874      __experimentalIsQuick: true,
25875      onToggle: isOpen => {
25876        openRef.current = isOpen;
25877      },
25878      onSelectOrClose: () => {
25879        openRef.current = false;
25880      }
25881    }))));
25882    /* eslint-enable jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events */
25883  }
25884  
25885  function InsertionPoint(_ref2) {
25886    let {
25887      children,
25888      __unstablePopoverSlot,
25889      __unstableContentRef
25890    } = _ref2;
25891    const isVisible = (0,external_wp_data_namespaceObject.useSelect)(select => {
25892      return select(store).isBlockInsertionPointVisible();
25893    }, []);
25894    return (0,external_wp_element_namespaceObject.createElement)(InsertionPointOpenRef.Provider, {
25895      value: (0,external_wp_element_namespaceObject.useRef)(false)
25896    }, isVisible && (0,external_wp_element_namespaceObject.createElement)(InsertionPointPopover, {
25897      __unstablePopoverSlot: __unstablePopoverSlot,
25898      __unstableContentRef: __unstableContentRef
25899    }), children);
25900  }
25901  
25902  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-list/use-in-between-inserter.js
25903  /**
25904   * WordPress dependencies
25905   */
25906  
25907  
25908  
25909  /**
25910   * Internal dependencies
25911   */
25912  
25913  
25914  
25915  function useInBetweenInserter() {
25916    const openRef = (0,external_wp_element_namespaceObject.useContext)(InsertionPointOpenRef);
25917    const hasReducedUI = (0,external_wp_data_namespaceObject.useSelect)(select => select(store).getSettings().hasReducedUI, []);
25918    const {
25919      getBlockListSettings,
25920      getBlockRootClientId,
25921      getBlockIndex,
25922      isBlockInsertionPointVisible,
25923      isMultiSelecting,
25924      getSelectedBlockClientIds,
25925      getTemplateLock
25926    } = (0,external_wp_data_namespaceObject.useSelect)(store);
25927    const {
25928      showInsertionPoint,
25929      hideInsertionPoint
25930    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
25931    return (0,external_wp_compose_namespaceObject.useRefEffect)(node => {
25932      if (hasReducedUI) {
25933        return;
25934      }
25935  
25936      function onMouseMove(event) {
25937        var _getBlockListSettings, _element$parentElemen;
25938  
25939        if (openRef.current) {
25940          return;
25941        }
25942  
25943        if (isMultiSelecting()) {
25944          return;
25945        }
25946  
25947        if (!event.target.classList.contains('block-editor-block-list__layout')) {
25948          if (isBlockInsertionPointVisible()) {
25949            hideInsertionPoint();
25950          }
25951  
25952          return;
25953        }
25954  
25955        let rootClientId;
25956  
25957        if (!event.target.classList.contains('is-root-container')) {
25958          const blockElement = !!event.target.getAttribute('data-block') ? event.target : event.target.closest('[data-block]');
25959          rootClientId = blockElement.getAttribute('data-block');
25960        } // Don't set the insertion point if the template is locked.
25961  
25962  
25963        if (getTemplateLock(rootClientId)) {
25964          return;
25965        }
25966  
25967        const orientation = ((_getBlockListSettings = getBlockListSettings(rootClientId)) === null || _getBlockListSettings === void 0 ? void 0 : _getBlockListSettings.orientation) || 'vertical';
25968        const rect = event.target.getBoundingClientRect();
25969        const offsetTop = event.clientY - rect.top;
25970        const offsetLeft = event.clientX - rect.left;
25971        const children = Array.from(event.target.children);
25972        let element = children.find(blockEl => {
25973          return blockEl.classList.contains('wp-block') && orientation === 'vertical' && blockEl.offsetTop > offsetTop || blockEl.classList.contains('wp-block') && orientation === 'horizontal' && blockEl.offsetLeft > offsetLeft;
25974        });
25975  
25976        if (!element) {
25977          return;
25978        } // The block may be in an alignment wrapper, so check the first direct
25979        // child if the element has no ID.
25980  
25981  
25982        if (!element.id) {
25983          element = element.firstElementChild;
25984  
25985          if (!element) {
25986            return;
25987          }
25988        } // Don't show the insertion point if a parent block has an "overlay"
25989        // See https://github.com/WordPress/gutenberg/pull/34012#pullrequestreview-727762337
25990  
25991  
25992        const parentOverlay = (_element$parentElemen = element.parentElement) === null || _element$parentElemen === void 0 ? void 0 : _element$parentElemen.closest('.block-editor-block-content-overlay.overlay-active');
25993  
25994        if (parentOverlay) {
25995          return;
25996        }
25997  
25998        const clientId = element.id.slice('block-'.length);
25999  
26000        if (!clientId) {
26001          return;
26002        } // Don't show the inserter when hovering above (conflicts with
26003        // block toolbar) or inside selected block(s).
26004  
26005  
26006        if (getSelectedBlockClientIds().includes(clientId)) {
26007          return;
26008        }
26009  
26010        const elementRect = element.getBoundingClientRect();
26011  
26012        if (orientation === 'horizontal' && (event.clientY > elementRect.bottom || event.clientY < elementRect.top) || orientation === 'vertical' && (event.clientX > elementRect.right || event.clientX < elementRect.left)) {
26013          if (isBlockInsertionPointVisible()) {
26014            hideInsertionPoint();
26015          }
26016  
26017          return;
26018        }
26019  
26020        const index = getBlockIndex(clientId); // Don't show the in-between inserter before the first block in
26021        // the list (preserves the original behaviour).
26022  
26023        if (index === 0) {
26024          if (isBlockInsertionPointVisible()) {
26025            hideInsertionPoint();
26026          }
26027  
26028          return;
26029        }
26030  
26031        showInsertionPoint(rootClientId, index, {
26032          __unstableWithInserter: true
26033        });
26034      }
26035  
26036      node.addEventListener('mousemove', onMouseMove);
26037      return () => {
26038        node.removeEventListener('mousemove', onMouseMove);
26039      };
26040    }, [openRef, getBlockListSettings, getBlockRootClientId, getBlockIndex, isBlockInsertionPointVisible, isMultiSelecting, showInsertionPoint, hideInsertionPoint, getSelectedBlockClientIds]);
26041  }
26042  
26043  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/utils/pre-parse-patterns.js
26044  /**
26045   * WordPress dependencies
26046   */
26047  
26048  
26049  /**
26050   * Internal dependencies
26051   */
26052  
26053  
26054  
26055  const requestIdleCallback = (() => {
26056    if (typeof window === 'undefined') {
26057      return callback => {
26058        setTimeout(() => callback(Date.now()), 0);
26059      };
26060    }
26061  
26062    return window.requestIdleCallback || window.requestAnimationFrame;
26063  })();
26064  
26065  const cancelIdleCallback = (() => {
26066    if (typeof window === 'undefined') {
26067      return clearTimeout;
26068    }
26069  
26070    return window.cancelIdleCallback || window.cancelAnimationFrame;
26071  })();
26072  
26073  function usePreParsePatterns() {
26074    const patterns = (0,external_wp_data_namespaceObject.useSelect)(_select => _select(store).getSettings().__experimentalBlockPatterns, []);
26075    (0,external_wp_element_namespaceObject.useEffect)(() => {
26076      if (!(patterns !== null && patterns !== void 0 && patterns.length)) {
26077        return;
26078      }
26079  
26080      let handle;
26081      let index = -1;
26082  
26083      const callback = () => {
26084        index++;
26085  
26086        if (index >= patterns.length) {
26087          return;
26088        }
26089  
26090        (0,external_wp_data_namespaceObject.select)(store).__experimentalGetParsedPattern(patterns[index].name);
26091  
26092        handle = requestIdleCallback(callback);
26093      };
26094  
26095      handle = requestIdleCallback(callback);
26096      return () => cancelIdleCallback(handle);
26097    }, [patterns]);
26098    return null;
26099  }
26100  
26101  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/use-block-display-information/index.js
26102  /**
26103   * WordPress dependencies
26104   */
26105  
26106  
26107  /**
26108   * Internal dependencies
26109   */
26110  
26111  
26112  /** @typedef {import('@wordpress/blocks').WPIcon} WPIcon */
26113  
26114  /**
26115   * Contains basic block's information for display reasons.
26116   *
26117   * @typedef {Object} WPBlockDisplayInformation
26118   *
26119   * @property {string} title       Human-readable block type label.
26120   * @property {WPIcon} icon        Block type icon.
26121   * @property {string} description A detailed block type description.
26122   */
26123  
26124  /**
26125   * Hook used to try to find a matching block variation and return
26126   * the appropriate information for display reasons. In order to
26127   * to try to find a match we need to things:
26128   * 1. Block's client id to extract it's current attributes.
26129   * 2. A block variation should have set `isActive` prop to a proper function.
26130   *
26131   * If for any reason a block variaton match cannot be found,
26132   * the returned information come from the Block Type.
26133   * If no blockType is found with the provided clientId, returns null.
26134   *
26135   * @param {string} clientId Block's client id.
26136   * @return {?WPBlockDisplayInformation} Block's display information, or `null` when the block or its type not found.
26137   */
26138  
26139  function useBlockDisplayInformation(clientId) {
26140    return (0,external_wp_data_namespaceObject.useSelect)(select => {
26141      if (!clientId) return null;
26142      const {
26143        getBlockName,
26144        getBlockAttributes
26145      } = select(store);
26146      const {
26147        getBlockType,
26148        getActiveBlockVariation
26149      } = select(external_wp_blocks_namespaceObject.store);
26150      const blockName = getBlockName(clientId);
26151      const blockType = getBlockType(blockName);
26152      if (!blockType) return null;
26153      const attributes = getBlockAttributes(clientId);
26154      const match = getActiveBlockVariation(blockName, attributes);
26155      const blockTypeInfo = {
26156        title: blockType.title,
26157        icon: blockType.icon,
26158        description: blockType.description,
26159        anchor: attributes === null || attributes === void 0 ? void 0 : attributes.anchor
26160      };
26161      if (!match) return blockTypeInfo;
26162      return {
26163        title: match.title || blockType.title,
26164        icon: match.icon || blockType.icon,
26165        description: match.description || blockType.description
26166      };
26167    }, [clientId]);
26168  }
26169  
26170  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-title/use-block-display-title.js
26171  /**
26172   * External dependencies
26173   */
26174  
26175  /**
26176   * WordPress dependencies
26177   */
26178  
26179  
26180  
26181  /**
26182   * Internal dependencies
26183   */
26184  
26185  
26186  
26187  /**
26188   * Returns the block's configured title as a string, or empty if the title
26189   * cannot be determined.
26190   *
26191   * @example
26192   *
26193   * ```js
26194   * useBlockDisplayTitle( 'afd1cb17-2c08-4e7a-91be-007ba7ddc3a1', 17 );
26195   * ```
26196   *
26197   * @param {string}           clientId      Client ID of block.
26198   * @param {number|undefined} maximumLength The maximum length that the block title string may be before truncated.
26199   * @return {?string} Block title.
26200   */
26201  
26202  function useBlockDisplayTitle(clientId, maximumLength) {
26203    const {
26204      attributes,
26205      name,
26206      reusableBlockTitle
26207    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
26208      if (!clientId) {
26209        return {};
26210      }
26211  
26212      const {
26213        getBlockName,
26214        getBlockAttributes,
26215        __experimentalGetReusableBlockTitle
26216      } = select(store);
26217      const blockName = getBlockName(clientId);
26218  
26219      if (!blockName) {
26220        return {};
26221      }
26222  
26223      const isReusable = (0,external_wp_blocks_namespaceObject.isReusableBlock)((0,external_wp_blocks_namespaceObject.getBlockType)(blockName));
26224      return {
26225        attributes: getBlockAttributes(clientId),
26226        name: blockName,
26227        reusableBlockTitle: isReusable && __experimentalGetReusableBlockTitle(getBlockAttributes(clientId).ref)
26228      };
26229    }, [clientId]);
26230    const blockInformation = useBlockDisplayInformation(clientId);
26231  
26232    if (!name || !blockInformation) {
26233      return null;
26234    }
26235  
26236    const blockType = (0,external_wp_blocks_namespaceObject.getBlockType)(name);
26237    const blockLabel = blockType ? (0,external_wp_blocks_namespaceObject.__experimentalGetBlockLabel)(blockType, attributes) : null;
26238    const label = reusableBlockTitle || blockLabel; // Label will fallback to the title if no label is defined for the current
26239    // label context. If the label is defined we prioritize it over a
26240    // possible block variation title match.
26241  
26242    const blockTitle = label && label !== blockType.title ? label : blockInformation.title;
26243  
26244    if (maximumLength && maximumLength > 0) {
26245      return (0,external_lodash_namespaceObject.truncate)(blockTitle, {
26246        length: maximumLength
26247      });
26248    }
26249  
26250    return blockTitle;
26251  }
26252  
26253  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-title/index.js
26254  /**
26255   * Internal dependencies
26256   */
26257  
26258  /**
26259   * Renders the block's configured title as a string, or empty if the title
26260   * cannot be determined.
26261   *
26262   * @example
26263   *
26264   * ```jsx
26265   * <BlockTitle clientId="afd1cb17-2c08-4e7a-91be-007ba7ddc3a1" maximumLength={ 17 }/>
26266   * ```
26267   *
26268   * @param {Object}           props
26269   * @param {string}           props.clientId      Client ID of block.
26270   * @param {number|undefined} props.maximumLength The maximum length that the block title string may be before truncated.
26271   *
26272   * @return {JSX.Element} Block title.
26273   */
26274  
26275  function BlockTitle(_ref) {
26276    let {
26277      clientId,
26278      maximumLength
26279    } = _ref;
26280    return useBlockDisplayTitle(clientId, maximumLength);
26281  }
26282  
26283  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-draggable/use-scroll-when-dragging.js
26284  /**
26285   * WordPress dependencies
26286   */
26287  
26288  
26289  const SCROLL_INACTIVE_DISTANCE_PX = 50;
26290  const SCROLL_INTERVAL_MS = 25;
26291  const PIXELS_PER_SECOND_PER_PERCENTAGE = 1000;
26292  const VELOCITY_MULTIPLIER = PIXELS_PER_SECOND_PER_PERCENTAGE * (SCROLL_INTERVAL_MS / 1000);
26293  /**
26294   * React hook that scrolls the scroll container when a block is being dragged.
26295   *
26296   * @return {Function[]} `startScrolling`, `scrollOnDragOver`, `stopScrolling`
26297   *                      functions to be called in `onDragStart`, `onDragOver`
26298   *                      and `onDragEnd` events respectively.
26299   */
26300  
26301  function useScrollWhenDragging() {
26302    const dragStartY = (0,external_wp_element_namespaceObject.useRef)(null);
26303    const velocityY = (0,external_wp_element_namespaceObject.useRef)(null);
26304    const scrollParentY = (0,external_wp_element_namespaceObject.useRef)(null);
26305    const scrollEditorInterval = (0,external_wp_element_namespaceObject.useRef)(null); // Clear interval when unmounting.
26306  
26307    (0,external_wp_element_namespaceObject.useEffect)(() => () => {
26308      if (scrollEditorInterval.current) {
26309        clearInterval(scrollEditorInterval.current);
26310        scrollEditorInterval.current = null;
26311      }
26312    }, []);
26313    const startScrolling = (0,external_wp_element_namespaceObject.useCallback)(event => {
26314      dragStartY.current = event.clientY; // Find nearest parent(s) to scroll.
26315  
26316      scrollParentY.current = (0,external_wp_dom_namespaceObject.getScrollContainer)(event.target);
26317      scrollEditorInterval.current = setInterval(() => {
26318        if (scrollParentY.current && velocityY.current) {
26319          const newTop = scrollParentY.current.scrollTop + velocityY.current; // Setting `behavior: 'smooth'` as a scroll property seems to hurt performance.
26320          // Better to use a small scroll interval.
26321  
26322          scrollParentY.current.scroll({
26323            top: newTop
26324          });
26325        }
26326      }, SCROLL_INTERVAL_MS);
26327    }, []);
26328    const scrollOnDragOver = (0,external_wp_element_namespaceObject.useCallback)(event => {
26329      if (!scrollParentY.current) {
26330        return;
26331      }
26332  
26333      const scrollParentHeight = scrollParentY.current.offsetHeight;
26334      const offsetDragStartPosition = dragStartY.current - scrollParentY.current.offsetTop;
26335      const offsetDragPosition = event.clientY - scrollParentY.current.offsetTop;
26336  
26337      if (event.clientY > offsetDragStartPosition) {
26338        // User is dragging downwards.
26339        const moveableDistance = Math.max(scrollParentHeight - offsetDragStartPosition - SCROLL_INACTIVE_DISTANCE_PX, 0);
26340        const dragDistance = Math.max(offsetDragPosition - offsetDragStartPosition - SCROLL_INACTIVE_DISTANCE_PX, 0);
26341        const distancePercentage = dragDistance / moveableDistance;
26342        velocityY.current = VELOCITY_MULTIPLIER * distancePercentage;
26343      } else if (event.clientY < offsetDragStartPosition) {
26344        // User is dragging upwards.
26345        const moveableDistance = Math.max(offsetDragStartPosition - SCROLL_INACTIVE_DISTANCE_PX, 0);
26346        const dragDistance = Math.max(offsetDragStartPosition - offsetDragPosition - SCROLL_INACTIVE_DISTANCE_PX, 0);
26347        const distancePercentage = dragDistance / moveableDistance;
26348        velocityY.current = -VELOCITY_MULTIPLIER * distancePercentage;
26349      } else {
26350        velocityY.current = 0;
26351      }
26352    }, []);
26353  
26354    const stopScrolling = () => {
26355      dragStartY.current = null;
26356      scrollParentY.current = null;
26357  
26358      if (scrollEditorInterval.current) {
26359        clearInterval(scrollEditorInterval.current);
26360        scrollEditorInterval.current = null;
26361      }
26362    };
26363  
26364    return [startScrolling, scrollOnDragOver, stopScrolling];
26365  }
26366  
26367  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-draggable/index.js
26368  
26369  
26370  /**
26371   * WordPress dependencies
26372   */
26373  
26374  
26375  
26376  
26377  /**
26378   * Internal dependencies
26379   */
26380  
26381  
26382  
26383  
26384  
26385  const BlockDraggable = _ref => {
26386    let {
26387      children,
26388      clientIds,
26389      cloneClassname,
26390      onDragStart,
26391      onDragEnd
26392    } = _ref;
26393    const {
26394      srcRootClientId,
26395      isDraggable,
26396      icon
26397    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
26398      var _getBlockType;
26399  
26400      const {
26401        canMoveBlocks,
26402        getBlockRootClientId,
26403        getBlockName
26404      } = select(store);
26405      const rootClientId = getBlockRootClientId(clientIds[0]);
26406      const blockName = getBlockName(clientIds[0]);
26407      return {
26408        srcRootClientId: rootClientId,
26409        isDraggable: canMoveBlocks(clientIds, rootClientId),
26410        icon: (_getBlockType = (0,external_wp_blocks_namespaceObject.getBlockType)(blockName)) === null || _getBlockType === void 0 ? void 0 : _getBlockType.icon
26411      };
26412    }, [clientIds]);
26413    const isDragging = (0,external_wp_element_namespaceObject.useRef)(false);
26414    const [startScrolling, scrollOnDragOver, stopScrolling] = useScrollWhenDragging();
26415    const {
26416      startDraggingBlocks,
26417      stopDraggingBlocks
26418    } = (0,external_wp_data_namespaceObject.useDispatch)(store); // Stop dragging blocks if the block draggable is unmounted.
26419  
26420    (0,external_wp_element_namespaceObject.useEffect)(() => {
26421      return () => {
26422        if (isDragging.current) {
26423          stopDraggingBlocks();
26424        }
26425      };
26426    }, []);
26427  
26428    if (!isDraggable) {
26429      return children({
26430        isDraggable: false
26431      });
26432    }
26433  
26434    const transferData = {
26435      type: 'block',
26436      srcClientIds: clientIds,
26437      srcRootClientId
26438    };
26439    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Draggable, {
26440      cloneClassname: cloneClassname,
26441      __experimentalTransferDataType: "wp-blocks",
26442      transferData: transferData,
26443      onDragStart: event => {
26444        startDraggingBlocks(clientIds);
26445        isDragging.current = true;
26446        startScrolling(event);
26447  
26448        if (onDragStart) {
26449          onDragStart();
26450        }
26451      },
26452      onDragOver: scrollOnDragOver,
26453      onDragEnd: () => {
26454        stopDraggingBlocks();
26455        isDragging.current = false;
26456        stopScrolling();
26457  
26458        if (onDragEnd) {
26459          onDragEnd();
26460        }
26461      },
26462      __experimentalDragComponent: (0,external_wp_element_namespaceObject.createElement)(BlockDraggableChip, {
26463        count: clientIds.length,
26464        icon: icon
26465      })
26466    }, _ref2 => {
26467      let {
26468        onDraggableStart,
26469        onDraggableEnd
26470      } = _ref2;
26471      return children({
26472        draggable: true,
26473        onDragStart: onDraggableStart,
26474        onDragEnd: onDraggableEnd
26475      });
26476    });
26477  };
26478  
26479  /* harmony default export */ var block_draggable = (BlockDraggable);
26480  
26481  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-tools/block-selection-button.js
26482  
26483  
26484  
26485  /**
26486   * External dependencies
26487   */
26488  
26489  /**
26490   * WordPress dependencies
26491   */
26492  
26493  
26494  
26495  
26496  
26497  
26498  
26499  
26500  
26501  
26502  /**
26503   * Internal dependencies
26504   */
26505  
26506  
26507  
26508  
26509  
26510  
26511  /**
26512   * Block selection button component, displaying the label of the block. If the block
26513   * descends from a root block, a button is displayed enabling the user to select
26514   * the root block.
26515   *
26516   * @param {string} props          Component props.
26517   * @param {string} props.clientId Client ID of block.
26518   *
26519   * @return {WPComponent} The component to be rendered.
26520   */
26521  
26522  function BlockSelectionButton(_ref) {
26523    let {
26524      clientId,
26525      rootClientId,
26526      blockElement
26527    } = _ref;
26528    const blockInformation = useBlockDisplayInformation(clientId);
26529    const selected = (0,external_wp_data_namespaceObject.useSelect)(select => {
26530      var _getBlockListSettings;
26531  
26532      const {
26533        getBlock,
26534        getBlockIndex,
26535        hasBlockMovingClientId,
26536        getBlockListSettings
26537      } = select(store);
26538      const index = getBlockIndex(clientId);
26539      const {
26540        name,
26541        attributes
26542      } = getBlock(clientId);
26543      const blockMovingMode = hasBlockMovingClientId();
26544      return {
26545        index,
26546        name,
26547        attributes,
26548        blockMovingMode,
26549        orientation: (_getBlockListSettings = getBlockListSettings(rootClientId)) === null || _getBlockListSettings === void 0 ? void 0 : _getBlockListSettings.orientation
26550      };
26551    }, [clientId, rootClientId]);
26552    const {
26553      index,
26554      name,
26555      attributes,
26556      blockMovingMode,
26557      orientation
26558    } = selected;
26559    const {
26560      setNavigationMode,
26561      removeBlock
26562    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
26563    const ref = (0,external_wp_element_namespaceObject.useRef)();
26564    const blockType = (0,external_wp_blocks_namespaceObject.getBlockType)(name);
26565    const label = (0,external_wp_blocks_namespaceObject.__experimentalGetAccessibleBlockLabel)(blockType, attributes, index + 1, orientation); // Focus the breadcrumb in navigation mode.
26566  
26567    (0,external_wp_element_namespaceObject.useEffect)(() => {
26568      ref.current.focus();
26569      (0,external_wp_a11y_namespaceObject.speak)(label);
26570    }, [label]);
26571    const {
26572      hasBlockMovingClientId,
26573      getBlockIndex,
26574      getBlockRootClientId,
26575      getClientIdsOfDescendants,
26576      getSelectedBlockClientId,
26577      getMultiSelectedBlocksEndClientId,
26578      getPreviousBlockClientId,
26579      getNextBlockClientId,
26580      isNavigationMode
26581    } = (0,external_wp_data_namespaceObject.useSelect)(store);
26582    const {
26583      selectBlock,
26584      clearSelectedBlock,
26585      setBlockMovingClientId,
26586      moveBlockToPosition
26587    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
26588  
26589    function onKeyDown(event) {
26590      const {
26591        keyCode
26592      } = event;
26593      const isUp = keyCode === external_wp_keycodes_namespaceObject.UP;
26594      const isDown = keyCode === external_wp_keycodes_namespaceObject.DOWN;
26595      const isLeft = keyCode === external_wp_keycodes_namespaceObject.LEFT;
26596      const isRight = keyCode === external_wp_keycodes_namespaceObject.RIGHT;
26597      const isTab = keyCode === external_wp_keycodes_namespaceObject.TAB;
26598      const isEscape = keyCode === external_wp_keycodes_namespaceObject.ESCAPE;
26599      const isEnter = keyCode === external_wp_keycodes_namespaceObject.ENTER;
26600      const isSpace = keyCode === external_wp_keycodes_namespaceObject.SPACE;
26601      const isShift = event.shiftKey;
26602  
26603      if (keyCode === external_wp_keycodes_namespaceObject.BACKSPACE || keyCode === external_wp_keycodes_namespaceObject.DELETE) {
26604        removeBlock(clientId);
26605        event.preventDefault();
26606        return;
26607      }
26608  
26609      const selectedBlockClientId = getSelectedBlockClientId();
26610      const selectionEndClientId = getMultiSelectedBlocksEndClientId();
26611      const selectionBeforeEndClientId = getPreviousBlockClientId(selectionEndClientId || selectedBlockClientId);
26612      const selectionAfterEndClientId = getNextBlockClientId(selectionEndClientId || selectedBlockClientId);
26613      const navigateUp = isTab && isShift || isUp;
26614      const navigateDown = isTab && !isShift || isDown; // Move out of current nesting level (no effect if at root level).
26615  
26616      const navigateOut = isLeft; // Move into next nesting level (no effect if the current block has no innerBlocks).
26617  
26618      const navigateIn = isRight;
26619      let focusedBlockUid;
26620  
26621      if (navigateUp) {
26622        focusedBlockUid = selectionBeforeEndClientId;
26623      } else if (navigateDown) {
26624        focusedBlockUid = selectionAfterEndClientId;
26625      } else if (navigateOut) {
26626        var _getBlockRootClientId;
26627  
26628        focusedBlockUid = (_getBlockRootClientId = getBlockRootClientId(selectedBlockClientId)) !== null && _getBlockRootClientId !== void 0 ? _getBlockRootClientId : selectedBlockClientId;
26629      } else if (navigateIn) {
26630        var _getClientIdsOfDescen;
26631  
26632        focusedBlockUid = (_getClientIdsOfDescen = getClientIdsOfDescendants([selectedBlockClientId])[0]) !== null && _getClientIdsOfDescen !== void 0 ? _getClientIdsOfDescen : selectedBlockClientId;
26633      }
26634  
26635      const startingBlockClientId = hasBlockMovingClientId();
26636  
26637      if (isEscape && isNavigationMode()) {
26638        clearSelectedBlock();
26639        event.preventDefault();
26640      }
26641  
26642      if (isEscape && startingBlockClientId && !event.defaultPrevented) {
26643        setBlockMovingClientId(null);
26644        event.preventDefault();
26645      }
26646  
26647      if ((isEnter || isSpace) && startingBlockClientId) {
26648        const sourceRoot = getBlockRootClientId(startingBlockClientId);
26649        const destRoot = getBlockRootClientId(selectedBlockClientId);
26650        const sourceBlockIndex = getBlockIndex(startingBlockClientId);
26651        let destinationBlockIndex = getBlockIndex(selectedBlockClientId);
26652  
26653        if (sourceBlockIndex < destinationBlockIndex && sourceRoot === destRoot) {
26654          destinationBlockIndex -= 1;
26655        }
26656  
26657        moveBlockToPosition(startingBlockClientId, sourceRoot, destRoot, destinationBlockIndex);
26658        selectBlock(startingBlockClientId);
26659        setBlockMovingClientId(null);
26660      }
26661  
26662      if (navigateDown || navigateUp || navigateOut || navigateIn) {
26663        if (focusedBlockUid) {
26664          event.preventDefault();
26665          selectBlock(focusedBlockUid);
26666        } else if (isTab && selectedBlockClientId) {
26667          let nextTabbable;
26668  
26669          if (navigateDown) {
26670            nextTabbable = blockElement;
26671  
26672            do {
26673              nextTabbable = external_wp_dom_namespaceObject.focus.tabbable.findNext(nextTabbable);
26674            } while (nextTabbable && blockElement.contains(nextTabbable));
26675  
26676            if (!nextTabbable) {
26677              nextTabbable = blockElement.ownerDocument.defaultView.frameElement;
26678              nextTabbable = external_wp_dom_namespaceObject.focus.tabbable.findNext(nextTabbable);
26679            }
26680          } else {
26681            nextTabbable = external_wp_dom_namespaceObject.focus.tabbable.findPrevious(blockElement);
26682          }
26683  
26684          if (nextTabbable) {
26685            event.preventDefault();
26686            nextTabbable.focus();
26687            clearSelectedBlock();
26688          }
26689        }
26690      }
26691    }
26692  
26693    const classNames = classnames_default()('block-editor-block-list__block-selection-button', {
26694      'is-block-moving-mode': !!blockMovingMode
26695    });
26696  
26697    const dragHandleLabel = (0,external_wp_i18n_namespaceObject.__)('Drag');
26698  
26699    return (0,external_wp_element_namespaceObject.createElement)("div", {
26700      className: classNames
26701    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Flex, {
26702      justify: "center",
26703      className: "block-editor-block-list__block-selection-button__content"
26704    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.FlexItem, null, (0,external_wp_element_namespaceObject.createElement)(block_icon, {
26705      icon: blockInformation === null || blockInformation === void 0 ? void 0 : blockInformation.icon,
26706      showColors: true
26707    })), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.FlexItem, null, (0,external_wp_element_namespaceObject.createElement)(block_draggable, {
26708      clientIds: [clientId]
26709    }, draggableProps => (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, _extends({
26710      icon: drag_handle,
26711      className: "block-selection-button_drag-handle",
26712      "aria-hidden": "true",
26713      label: dragHandleLabel // Should not be able to tab to drag handle as this
26714      // button can only be used with a pointer device.
26715      ,
26716      tabIndex: "-1"
26717    }, draggableProps)))), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.FlexItem, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
26718      ref: ref,
26719      onClick: () => setNavigationMode(false),
26720      onKeyDown: onKeyDown,
26721      label: label,
26722      className: "block-selection-button_select-button"
26723    }, (0,external_wp_element_namespaceObject.createElement)(BlockTitle, {
26724      clientId: clientId,
26725      maximumLength: 35
26726    })))));
26727  }
26728  
26729  /* harmony default export */ var block_selection_button = (BlockSelectionButton);
26730  
26731  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/navigable-toolbar/index.js
26732  
26733  
26734  
26735  /**
26736   * WordPress dependencies
26737   */
26738  
26739  
26740  
26741  
26742  
26743  
26744  function hasOnlyToolbarItem(elements) {
26745    const dataProp = 'toolbarItem';
26746    return !elements.some(element => !(dataProp in element.dataset));
26747  }
26748  
26749  function getAllToolbarItemsIn(container) {
26750    return Array.from(container.querySelectorAll('[data-toolbar-item]'));
26751  }
26752  
26753  function hasFocusWithin(container) {
26754    return container.contains(container.ownerDocument.activeElement);
26755  }
26756  
26757  function focusFirstTabbableIn(container) {
26758    const [firstTabbable] = external_wp_dom_namespaceObject.focus.tabbable.find(container);
26759  
26760    if (firstTabbable) {
26761      firstTabbable.focus();
26762    }
26763  }
26764  
26765  function useIsAccessibleToolbar(ref) {
26766    /*
26767     * By default, we'll assume the starting accessible state of the Toolbar
26768     * is true, as it seems to be the most common case.
26769     *
26770     * Transitioning from an (initial) false to true state causes the
26771     * <Toolbar /> component to mount twice, which is causing undesired
26772     * side-effects. These side-effects appear to only affect certain
26773     * E2E tests.
26774     *
26775     * This was initial discovered in this pull-request:
26776     * https://github.com/WordPress/gutenberg/pull/23425
26777     */
26778    const initialAccessibleToolbarState = true; // By default, it's gonna render NavigableMenu. If all the tabbable elements
26779    // inside the toolbar are ToolbarItem components (or derived components like
26780    // ToolbarButton), then we can wrap them with the accessible Toolbar
26781    // component.
26782  
26783    const [isAccessibleToolbar, setIsAccessibleToolbar] = (0,external_wp_element_namespaceObject.useState)(initialAccessibleToolbarState);
26784    const determineIsAccessibleToolbar = (0,external_wp_element_namespaceObject.useCallback)(() => {
26785      const tabbables = external_wp_dom_namespaceObject.focus.tabbable.find(ref.current);
26786      const onlyToolbarItem = hasOnlyToolbarItem(tabbables);
26787  
26788      if (!onlyToolbarItem) {
26789        external_wp_deprecated_default()('Using custom components as toolbar controls', {
26790          since: '5.6',
26791          alternative: 'ToolbarItem, ToolbarButton or ToolbarDropdownMenu components',
26792          link: 'https://developer.wordpress.org/block-editor/components/toolbar-button/#inside-blockcontrols'
26793        });
26794      }
26795  
26796      setIsAccessibleToolbar(onlyToolbarItem);
26797    }, []);
26798    (0,external_wp_element_namespaceObject.useLayoutEffect)(() => {
26799      // Toolbar buttons may be rendered asynchronously, so we use
26800      // MutationObserver to check if the toolbar subtree has been modified.
26801      const observer = new window.MutationObserver(determineIsAccessibleToolbar);
26802      observer.observe(ref.current, {
26803        childList: true,
26804        subtree: true
26805      });
26806      return () => observer.disconnect();
26807    }, [isAccessibleToolbar]);
26808    return isAccessibleToolbar;
26809  }
26810  
26811  function useToolbarFocus(ref, focusOnMount, isAccessibleToolbar, defaultIndex, onIndexChange) {
26812    // Make sure we don't use modified versions of this prop.
26813    const [initialFocusOnMount] = (0,external_wp_element_namespaceObject.useState)(focusOnMount);
26814    const [initialIndex] = (0,external_wp_element_namespaceObject.useState)(defaultIndex);
26815    const focusToolbar = (0,external_wp_element_namespaceObject.useCallback)(() => {
26816      focusFirstTabbableIn(ref.current);
26817    }, []); // Focus on toolbar when pressing alt+F10 when the toolbar is visible.
26818  
26819    (0,external_wp_keyboardShortcuts_namespaceObject.useShortcut)('core/block-editor/focus-toolbar', focusToolbar);
26820    (0,external_wp_element_namespaceObject.useEffect)(() => {
26821      if (initialFocusOnMount) {
26822        focusToolbar();
26823      }
26824    }, [isAccessibleToolbar, initialFocusOnMount, focusToolbar]);
26825    (0,external_wp_element_namespaceObject.useEffect)(() => {
26826      // If initialIndex is passed, we focus on that toolbar item when the
26827      // toolbar gets mounted and initial focus is not forced.
26828      // We have to wait for the next browser paint because block controls aren't
26829      // rendered right away when the toolbar gets mounted.
26830      let raf = 0;
26831  
26832      if (initialIndex && !initialFocusOnMount) {
26833        raf = window.requestAnimationFrame(() => {
26834          const items = getAllToolbarItemsIn(ref.current);
26835          const index = initialIndex || 0;
26836  
26837          if (items[index] && hasFocusWithin(ref.current)) {
26838            items[index].focus();
26839          }
26840        });
26841      }
26842  
26843      return () => {
26844        window.cancelAnimationFrame(raf);
26845        if (!onIndexChange || !ref.current) return; // When the toolbar element is unmounted and onIndexChange is passed, we
26846        // pass the focused toolbar item index so it can be hydrated later.
26847  
26848        const items = getAllToolbarItemsIn(ref.current);
26849        const index = items.findIndex(item => item.tabIndex === 0);
26850        onIndexChange(index);
26851      };
26852    }, [initialIndex, initialFocusOnMount]);
26853  }
26854  
26855  function NavigableToolbar(_ref) {
26856    let {
26857      children,
26858      focusOnMount,
26859      __experimentalInitialIndex: initialIndex,
26860      __experimentalOnIndexChange: onIndexChange,
26861      ...props
26862    } = _ref;
26863    const ref = (0,external_wp_element_namespaceObject.useRef)();
26864    const isAccessibleToolbar = useIsAccessibleToolbar(ref);
26865    useToolbarFocus(ref, focusOnMount, isAccessibleToolbar, initialIndex, onIndexChange);
26866  
26867    if (isAccessibleToolbar) {
26868      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Toolbar, _extends({
26869        label: props['aria-label'],
26870        ref: ref
26871      }, props), children);
26872    }
26873  
26874    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.NavigableMenu, _extends({
26875      orientation: "horizontal",
26876      role: "toolbar",
26877      ref: ref
26878    }, props), children);
26879  }
26880  
26881  /* harmony default export */ var navigable_toolbar = (NavigableToolbar);
26882  
26883  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/chevron-right.js
26884  
26885  
26886  /**
26887   * WordPress dependencies
26888   */
26889  
26890  const chevronRight = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
26891    xmlns: "http://www.w3.org/2000/svg",
26892    viewBox: "0 0 24 24"
26893  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
26894    d: "M10.6 6L9.4 7l4.6 5-4.6 5 1.2 1 5.4-6z"
26895  }));
26896  /* harmony default export */ var chevron_right = (chevronRight);
26897  
26898  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/chevron-left.js
26899  
26900  
26901  /**
26902   * WordPress dependencies
26903   */
26904  
26905  const chevronLeft = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
26906    xmlns: "http://www.w3.org/2000/svg",
26907    viewBox: "0 0 24 24"
26908  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
26909    d: "M14.6 7l-1.2-1L8 12l5.4 6 1.2-1-4.6-5z"
26910  }));
26911  /* harmony default export */ var chevron_left = (chevronLeft);
26912  
26913  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/chevron-up.js
26914  
26915  
26916  /**
26917   * WordPress dependencies
26918   */
26919  
26920  const chevronUp = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
26921    viewBox: "0 0 24 24",
26922    xmlns: "http://www.w3.org/2000/svg"
26923  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
26924    d: "M6.5 12.4L12 8l5.5 4.4-.9 1.2L12 10l-4.5 3.6-1-1.2z"
26925  }));
26926  /* harmony default export */ var chevron_up = (chevronUp);
26927  
26928  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/chevron-down.js
26929  
26930  
26931  /**
26932   * WordPress dependencies
26933   */
26934  
26935  const chevronDown = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
26936    viewBox: "0 0 24 24",
26937    xmlns: "http://www.w3.org/2000/svg"
26938  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
26939    d: "M17.5 11.6L12 16l-5.5-4.4.9-1.2L12 14l4.5-3.6 1 1.2z"
26940  }));
26941  /* harmony default export */ var chevron_down = (chevronDown);
26942  
26943  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-mover/mover-description.js
26944  /**
26945   * WordPress dependencies
26946   */
26947  
26948  /**
26949   * Return a label for the block movement controls depending on block position.
26950   *
26951   * @param {number}  selectedCount Number of blocks selected.
26952   * @param {string}  type          Block type - in the case of a single block, should
26953   *                                define its 'type'. I.e. 'Text', 'Heading', 'Image' etc.
26954   * @param {number}  firstIndex    The index (position - 1) of the first block selected.
26955   * @param {boolean} isFirst       This is the first block.
26956   * @param {boolean} isLast        This is the last block.
26957   * @param {number}  dir           Direction of movement (> 0 is considered to be going
26958   *                                down, < 0 is up).
26959   * @param {string}  orientation   The orientation of the block movers, vertical or
26960   *                                horizontal.
26961   *
26962   * @return {string} Label for the block movement controls.
26963   */
26964  
26965  function getBlockMoverDescription(selectedCount, type, firstIndex, isFirst, isLast, dir, orientation) {
26966    const position = firstIndex + 1;
26967  
26968    const getMovementDirection = moveDirection => {
26969      if (moveDirection === 'up') {
26970        if (orientation === 'horizontal') {
26971          return (0,external_wp_i18n_namespaceObject.isRTL)() ? 'right' : 'left';
26972        }
26973  
26974        return 'up';
26975      } else if (moveDirection === 'down') {
26976        if (orientation === 'horizontal') {
26977          return (0,external_wp_i18n_namespaceObject.isRTL)() ? 'left' : 'right';
26978        }
26979  
26980        return 'down';
26981      }
26982  
26983      return null;
26984    };
26985  
26986    if (selectedCount > 1) {
26987      return getMultiBlockMoverDescription(selectedCount, firstIndex, isFirst, isLast, dir);
26988    }
26989  
26990    if (isFirst && isLast) {
26991      return (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %s: Type of block (i.e. Text, Image etc)
26992      (0,external_wp_i18n_namespaceObject.__)('Block %s is the only block, and cannot be moved'), type);
26993    }
26994  
26995    if (dir > 0 && !isLast) {
26996      // Moving down.
26997      const movementDirection = getMovementDirection('down');
26998  
26999      if (movementDirection === 'down') {
27000        return (0,external_wp_i18n_namespaceObject.sprintf)( // translators: 1: Type of block (i.e. Text, Image etc), 2: Position of selected block, 3: New position
27001        (0,external_wp_i18n_namespaceObject.__)('Move %1$s block from position %2$d down to position %3$d'), type, position, position + 1);
27002      }
27003  
27004      if (movementDirection === 'left') {
27005        return (0,external_wp_i18n_namespaceObject.sprintf)( // translators: 1: Type of block (i.e. Text, Image etc), 2: Position of selected block, 3: New position
27006        (0,external_wp_i18n_namespaceObject.__)('Move %1$s block from position %2$d left to position %3$d'), type, position, position + 1);
27007      }
27008  
27009      if (movementDirection === 'right') {
27010        return (0,external_wp_i18n_namespaceObject.sprintf)( // translators: 1: Type of block (i.e. Text, Image etc), 2: Position of selected block, 3: New position
27011        (0,external_wp_i18n_namespaceObject.__)('Move %1$s block from position %2$d right to position %3$d'), type, position, position + 1);
27012      }
27013    }
27014  
27015    if (dir > 0 && isLast) {
27016      // Moving down, and is the last item.
27017      const movementDirection = getMovementDirection('down');
27018  
27019      if (movementDirection === 'down') {
27020        return (0,external_wp_i18n_namespaceObject.sprintf)( // translators: 1: Type of block (i.e. Text, Image etc)
27021        (0,external_wp_i18n_namespaceObject.__)('Block %1$s is at the end of the content and can’t be moved down'), type);
27022      }
27023  
27024      if (movementDirection === 'left') {
27025        return (0,external_wp_i18n_namespaceObject.sprintf)( // translators: 1: Type of block (i.e. Text, Image etc)
27026        (0,external_wp_i18n_namespaceObject.__)('Block %1$s is at the end of the content and can’t be moved left'), type);
27027      }
27028  
27029      if (movementDirection === 'right') {
27030        return (0,external_wp_i18n_namespaceObject.sprintf)( // translators: 1: Type of block (i.e. Text, Image etc)
27031        (0,external_wp_i18n_namespaceObject.__)('Block %1$s is at the end of the content and can’t be moved right'), type);
27032      }
27033    }
27034  
27035    if (dir < 0 && !isFirst) {
27036      // Moving up.
27037      const movementDirection = getMovementDirection('up');
27038  
27039      if (movementDirection === 'up') {
27040        return (0,external_wp_i18n_namespaceObject.sprintf)( // translators: 1: Type of block (i.e. Text, Image etc), 2: Position of selected block, 3: New position
27041        (0,external_wp_i18n_namespaceObject.__)('Move %1$s block from position %2$d up to position %3$d'), type, position, position - 1);
27042      }
27043  
27044      if (movementDirection === 'left') {
27045        return (0,external_wp_i18n_namespaceObject.sprintf)( // translators: 1: Type of block (i.e. Text, Image etc), 2: Position of selected block, 3: New position
27046        (0,external_wp_i18n_namespaceObject.__)('Move %1$s block from position %2$d left to position %3$d'), type, position, position - 1);
27047      }
27048  
27049      if (movementDirection === 'right') {
27050        return (0,external_wp_i18n_namespaceObject.sprintf)( // translators: 1: Type of block (i.e. Text, Image etc), 2: Position of selected block, 3: New position
27051        (0,external_wp_i18n_namespaceObject.__)('Move %1$s block from position %2$d right to position %3$d'), type, position, position - 1);
27052      }
27053    }
27054  
27055    if (dir < 0 && isFirst) {
27056      // Moving up, and is the first item.
27057      const movementDirection = getMovementDirection('up');
27058  
27059      if (movementDirection === 'up') {
27060        return (0,external_wp_i18n_namespaceObject.sprintf)( // translators: 1: Type of block (i.e. Text, Image etc)
27061        (0,external_wp_i18n_namespaceObject.__)('Block %1$s is at the beginning of the content and can’t be moved up'), type);
27062      }
27063  
27064      if (movementDirection === 'left') {
27065        return (0,external_wp_i18n_namespaceObject.sprintf)( // translators: 1: Type of block (i.e. Text, Image etc)
27066        (0,external_wp_i18n_namespaceObject.__)('Block %1$s is at the beginning of the content and can’t be moved left'), type);
27067      }
27068  
27069      if (movementDirection === 'right') {
27070        return (0,external_wp_i18n_namespaceObject.sprintf)( // translators: 1: Type of block (i.e. Text, Image etc)
27071        (0,external_wp_i18n_namespaceObject.__)('Block %1$s is at the beginning of the content and can’t be moved right'), type);
27072      }
27073    }
27074  }
27075  /**
27076   * Return a label for the block movement controls depending on block position.
27077   *
27078   * @param {number}  selectedCount Number of blocks selected.
27079   * @param {number}  firstIndex    The index (position - 1) of the first block selected.
27080   * @param {boolean} isFirst       This is the first block.
27081   * @param {boolean} isLast        This is the last block.
27082   * @param {number}  dir           Direction of movement (> 0 is considered to be going
27083   *                                down, < 0 is up).
27084   *
27085   * @return {string} Label for the block movement controls.
27086   */
27087  
27088  function getMultiBlockMoverDescription(selectedCount, firstIndex, isFirst, isLast, dir) {
27089    const position = firstIndex + 1;
27090  
27091    if (dir < 0 && isFirst) {
27092      return (0,external_wp_i18n_namespaceObject.__)('Blocks cannot be moved up as they are already at the top');
27093    }
27094  
27095    if (dir > 0 && isLast) {
27096      return (0,external_wp_i18n_namespaceObject.__)('Blocks cannot be moved down as they are already at the bottom');
27097    }
27098  
27099    if (dir < 0 && !isFirst) {
27100      return (0,external_wp_i18n_namespaceObject.sprintf)( // translators: 1: Number of selected blocks, 2: Position of selected blocks
27101      (0,external_wp_i18n_namespaceObject._n)('Move %1$d block from position %2$d up by one place', 'Move %1$d blocks from position %2$d up by one place', selectedCount), selectedCount, position);
27102    }
27103  
27104    if (dir > 0 && !isLast) {
27105      return (0,external_wp_i18n_namespaceObject.sprintf)( // translators: 1: Number of selected blocks, 2: Position of selected blocks
27106      (0,external_wp_i18n_namespaceObject._n)('Move %1$d block from position %2$d down by one place', 'Move %1$d blocks from position %2$d down by one place', selectedCount), selectedCount, position);
27107    }
27108  }
27109  
27110  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-mover/button.js
27111  
27112  
27113  
27114  /**
27115   * External dependencies
27116   */
27117  
27118  
27119  /**
27120   * WordPress dependencies
27121   */
27122  
27123  
27124  
27125  
27126  
27127  
27128  
27129  /**
27130   * Internal dependencies
27131   */
27132  
27133  
27134  
27135  
27136  
27137  const getArrowIcon = (direction, orientation) => {
27138    if (direction === 'up') {
27139      if (orientation === 'horizontal') {
27140        return (0,external_wp_i18n_namespaceObject.isRTL)() ? chevron_right : chevron_left;
27141      }
27142  
27143      return chevron_up;
27144    } else if (direction === 'down') {
27145      if (orientation === 'horizontal') {
27146        return (0,external_wp_i18n_namespaceObject.isRTL)() ? chevron_left : chevron_right;
27147      }
27148  
27149      return chevron_down;
27150    }
27151  
27152    return null;
27153  };
27154  
27155  const getMovementDirectionLabel = (moveDirection, orientation) => {
27156    if (moveDirection === 'up') {
27157      if (orientation === 'horizontal') {
27158        return (0,external_wp_i18n_namespaceObject.isRTL)() ? (0,external_wp_i18n_namespaceObject.__)('Move right') : (0,external_wp_i18n_namespaceObject.__)('Move left');
27159      }
27160  
27161      return (0,external_wp_i18n_namespaceObject.__)('Move up');
27162    } else if (moveDirection === 'down') {
27163      if (orientation === 'horizontal') {
27164        return (0,external_wp_i18n_namespaceObject.isRTL)() ? (0,external_wp_i18n_namespaceObject.__)('Move left') : (0,external_wp_i18n_namespaceObject.__)('Move right');
27165      }
27166  
27167      return (0,external_wp_i18n_namespaceObject.__)('Move down');
27168    }
27169  
27170    return null;
27171  };
27172  
27173  const BlockMoverButton = (0,external_wp_element_namespaceObject.forwardRef)((_ref, ref) => {
27174    let {
27175      clientIds,
27176      direction,
27177      orientation: moverOrientation,
27178      ...props
27179    } = _ref;
27180    const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(BlockMoverButton);
27181    const blocksCount = (0,external_lodash_namespaceObject.castArray)(clientIds).length;
27182    const {
27183      blockType,
27184      isDisabled,
27185      rootClientId,
27186      isFirst,
27187      isLast,
27188      firstIndex,
27189      orientation = 'vertical'
27190    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
27191      const {
27192        getBlockIndex,
27193        getBlockRootClientId,
27194        getBlockOrder,
27195        getBlock,
27196        getBlockListSettings
27197      } = select(store);
27198      const normalizedClientIds = (0,external_lodash_namespaceObject.castArray)(clientIds);
27199      const firstClientId = (0,external_lodash_namespaceObject.first)(normalizedClientIds);
27200      const blockRootClientId = getBlockRootClientId(firstClientId);
27201      const firstBlockIndex = getBlockIndex(firstClientId);
27202      const lastBlockIndex = getBlockIndex((0,external_lodash_namespaceObject.last)(normalizedClientIds));
27203      const blockOrder = getBlockOrder(blockRootClientId);
27204      const block = getBlock(firstClientId);
27205      const isFirstBlock = firstBlockIndex === 0;
27206      const isLastBlock = lastBlockIndex === blockOrder.length - 1;
27207      const {
27208        orientation: blockListOrientation
27209      } = getBlockListSettings(blockRootClientId) || {};
27210      return {
27211        blockType: block ? (0,external_wp_blocks_namespaceObject.getBlockType)(block.name) : null,
27212        isDisabled: direction === 'up' ? isFirstBlock : isLastBlock,
27213        rootClientId: blockRootClientId,
27214        firstIndex: firstBlockIndex,
27215        isFirst: isFirstBlock,
27216        isLast: isLastBlock,
27217        orientation: moverOrientation || blockListOrientation
27218      };
27219    }, [clientIds, direction]);
27220    const {
27221      moveBlocksDown,
27222      moveBlocksUp
27223    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
27224    const moverFunction = direction === 'up' ? moveBlocksUp : moveBlocksDown;
27225  
27226    const onClick = event => {
27227      moverFunction(clientIds, rootClientId);
27228  
27229      if (props.onClick) {
27230        props.onClick(event);
27231      }
27232    };
27233  
27234    const descriptionId = `block-editor-block-mover-button__description-$instanceId}`;
27235    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, _extends({
27236      ref: ref,
27237      className: classnames_default()('block-editor-block-mover-button', `is-$direction}-button`),
27238      icon: getArrowIcon(direction, orientation),
27239      label: getMovementDirectionLabel(direction, orientation),
27240      "aria-describedby": descriptionId
27241    }, props, {
27242      onClick: isDisabled ? null : onClick,
27243      "aria-disabled": isDisabled
27244    })), (0,external_wp_element_namespaceObject.createElement)("span", {
27245      id: descriptionId,
27246      className: "block-editor-block-mover-button__description"
27247    }, getBlockMoverDescription(blocksCount, blockType && blockType.title, firstIndex, isFirst, isLast, direction === 'up' ? -1 : 1, orientation)));
27248  });
27249  const BlockMoverUpButton = (0,external_wp_element_namespaceObject.forwardRef)((props, ref) => {
27250    return (0,external_wp_element_namespaceObject.createElement)(BlockMoverButton, _extends({
27251      direction: "up",
27252      ref: ref
27253    }, props));
27254  });
27255  const BlockMoverDownButton = (0,external_wp_element_namespaceObject.forwardRef)((props, ref) => {
27256    return (0,external_wp_element_namespaceObject.createElement)(BlockMoverButton, _extends({
27257      direction: "down",
27258      ref: ref
27259    }, props));
27260  });
27261  
27262  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-mover/index.js
27263  
27264  
27265  
27266  /**
27267   * External dependencies
27268   */
27269  
27270  
27271  /**
27272   * WordPress dependencies
27273   */
27274  
27275  
27276  
27277  
27278  
27279  
27280  
27281  /**
27282   * Internal dependencies
27283   */
27284  
27285  
27286  
27287  
27288  
27289  function BlockMover(_ref) {
27290    let {
27291      isFirst,
27292      isLast,
27293      clientIds,
27294      canMove,
27295      isHidden,
27296      rootClientId,
27297      orientation,
27298      hideDragHandle
27299    } = _ref;
27300    const [isFocused, setIsFocused] = (0,external_wp_element_namespaceObject.useState)(false);
27301  
27302    const onFocus = () => setIsFocused(true);
27303  
27304    const onBlur = () => setIsFocused(false);
27305  
27306    if (!canMove || isFirst && isLast && !rootClientId) {
27307      return null;
27308    }
27309  
27310    const dragHandleLabel = (0,external_wp_i18n_namespaceObject.__)('Drag'); // We emulate a disabled state because forcefully applying the `disabled`
27311    // attribute on the buttons while it has focus causes the screen to change
27312    // to an unfocused state (body as active element) without firing blur on,
27313    // the rendering parent, leaving it unable to react to focus out.
27314  
27315  
27316    return (0,external_wp_element_namespaceObject.createElement)("div", {
27317      className: classnames_default()('block-editor-block-mover', {
27318        'is-visible': isFocused || !isHidden,
27319        'is-horizontal': orientation === 'horizontal'
27320      })
27321    }, !hideDragHandle && (0,external_wp_element_namespaceObject.createElement)(block_draggable, {
27322      clientIds: clientIds,
27323      cloneClassname: "block-editor-block-mover__drag-clone"
27324    }, draggableProps => (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, _extends({
27325      icon: drag_handle,
27326      className: "block-editor-block-mover__drag-handle",
27327      "aria-hidden": "true",
27328      label: dragHandleLabel // Should not be able to tab to drag handle as this
27329      // button can only be used with a pointer device.
27330      ,
27331      tabIndex: "-1"
27332    }, draggableProps))), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarGroup, {
27333      className: "block-editor-block-mover__move-button-container"
27334    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarItem, {
27335      onFocus: onFocus,
27336      onBlur: onBlur
27337    }, itemProps => (0,external_wp_element_namespaceObject.createElement)(BlockMoverUpButton, _extends({
27338      clientIds: clientIds
27339    }, itemProps))), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarItem, {
27340      onFocus: onFocus,
27341      onBlur: onBlur
27342    }, itemProps => (0,external_wp_element_namespaceObject.createElement)(BlockMoverDownButton, _extends({
27343      clientIds: clientIds
27344    }, itemProps)))));
27345  }
27346  /**
27347   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/block-mover/README.md
27348   */
27349  
27350  
27351  /* harmony default export */ var block_mover = ((0,external_wp_data_namespaceObject.withSelect)((select, _ref2) => {
27352    var _getBlockListSettings;
27353  
27354    let {
27355      clientIds
27356    } = _ref2;
27357    const {
27358      getBlock,
27359      getBlockIndex,
27360      getBlockListSettings,
27361      canMoveBlocks,
27362      getBlockOrder,
27363      getBlockRootClientId
27364    } = select(store);
27365    const normalizedClientIds = (0,external_lodash_namespaceObject.castArray)(clientIds);
27366    const firstClientId = (0,external_lodash_namespaceObject.first)(normalizedClientIds);
27367    const block = getBlock(firstClientId);
27368    const rootClientId = getBlockRootClientId((0,external_lodash_namespaceObject.first)(normalizedClientIds));
27369    const firstIndex = getBlockIndex(firstClientId);
27370    const lastIndex = getBlockIndex((0,external_lodash_namespaceObject.last)(normalizedClientIds));
27371    const blockOrder = getBlockOrder(rootClientId);
27372    const isFirst = firstIndex === 0;
27373    const isLast = lastIndex === blockOrder.length - 1;
27374    return {
27375      blockType: block ? (0,external_wp_blocks_namespaceObject.getBlockType)(block.name) : null,
27376      canMove: canMoveBlocks(clientIds, rootClientId),
27377      rootClientId,
27378      firstIndex,
27379      isFirst,
27380      isLast,
27381      orientation: (_getBlockListSettings = getBlockListSettings(rootClientId)) === null || _getBlockListSettings === void 0 ? void 0 : _getBlockListSettings.orientation
27382    };
27383  })(BlockMover));
27384  
27385  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-toolbar/utils.js
27386  /**
27387   * External dependencies
27388   */
27389  
27390  /**
27391   * WordPress dependencies
27392   */
27393  
27394  
27395  const {
27396    clearTimeout: utils_clearTimeout,
27397    setTimeout: utils_setTimeout
27398  } = window;
27399  const DEBOUNCE_TIMEOUT = 200;
27400  /**
27401   * Hook that creates a showMover state, as well as debounced show/hide callbacks.
27402   *
27403   * @param {Object}   props                       Component props.
27404   * @param {Object}   props.ref                   Element reference.
27405   * @param {boolean}  props.isFocused             Whether the component has current focus.
27406   * @param {number}   [props.debounceTimeout=250] Debounce timeout in milliseconds.
27407   * @param {Function} [props.onChange=noop]       Callback function.
27408   */
27409  
27410  function useDebouncedShowMovers(_ref) {
27411    let {
27412      ref,
27413      isFocused,
27414      debounceTimeout = DEBOUNCE_TIMEOUT,
27415      onChange = external_lodash_namespaceObject.noop
27416    } = _ref;
27417    const [showMovers, setShowMovers] = (0,external_wp_element_namespaceObject.useState)(false);
27418    const timeoutRef = (0,external_wp_element_namespaceObject.useRef)();
27419  
27420    const handleOnChange = nextIsFocused => {
27421      if (ref !== null && ref !== void 0 && ref.current) {
27422        setShowMovers(nextIsFocused);
27423      }
27424  
27425      onChange(nextIsFocused);
27426    };
27427  
27428    const getIsHovered = () => {
27429      return (ref === null || ref === void 0 ? void 0 : ref.current) && ref.current.matches(':hover');
27430    };
27431  
27432    const shouldHideMovers = () => {
27433      const isHovered = getIsHovered();
27434      return !isFocused && !isHovered;
27435    };
27436  
27437    const clearTimeoutRef = () => {
27438      const timeout = timeoutRef.current;
27439  
27440      if (timeout && utils_clearTimeout) {
27441        utils_clearTimeout(timeout);
27442      }
27443    };
27444  
27445    const debouncedShowMovers = event => {
27446      if (event) {
27447        event.stopPropagation();
27448      }
27449  
27450      clearTimeoutRef();
27451  
27452      if (!showMovers) {
27453        handleOnChange(true);
27454      }
27455    };
27456  
27457    const debouncedHideMovers = event => {
27458      if (event) {
27459        event.stopPropagation();
27460      }
27461  
27462      clearTimeoutRef();
27463      timeoutRef.current = utils_setTimeout(() => {
27464        if (shouldHideMovers()) {
27465          handleOnChange(false);
27466        }
27467      }, debounceTimeout);
27468    };
27469  
27470    (0,external_wp_element_namespaceObject.useEffect)(() => () => {
27471      /**
27472       * We need to call the change handler with `isFocused`
27473       * set to false on unmount because we also clear the
27474       * timeout that would handle that.
27475       */
27476      handleOnChange(false);
27477      clearTimeoutRef();
27478    }, []);
27479    return {
27480      showMovers,
27481      debouncedShowMovers,
27482      debouncedHideMovers
27483    };
27484  }
27485  /**
27486   * Hook that provides a showMovers state and gesture events for DOM elements
27487   * that interact with the showMovers state.
27488   *
27489   * @param {Object}   props                       Component props.
27490   * @param {Object}   props.ref                   Element reference.
27491   * @param {number}   [props.debounceTimeout=250] Debounce timeout in milliseconds.
27492   * @param {Function} [props.onChange=noop]       Callback function.
27493   */
27494  
27495  function useShowMoversGestures(_ref2) {
27496    let {
27497      ref,
27498      debounceTimeout = DEBOUNCE_TIMEOUT,
27499      onChange = external_lodash_namespaceObject.noop
27500    } = _ref2;
27501    const [isFocused, setIsFocused] = (0,external_wp_element_namespaceObject.useState)(false);
27502    const {
27503      showMovers,
27504      debouncedShowMovers,
27505      debouncedHideMovers
27506    } = useDebouncedShowMovers({
27507      ref,
27508      debounceTimeout,
27509      isFocused,
27510      onChange
27511    });
27512    const registerRef = (0,external_wp_element_namespaceObject.useRef)(false);
27513  
27514    const isFocusedWithin = () => {
27515      return (ref === null || ref === void 0 ? void 0 : ref.current) && ref.current.contains(ref.current.ownerDocument.activeElement);
27516    };
27517  
27518    (0,external_wp_element_namespaceObject.useEffect)(() => {
27519      const node = ref.current;
27520  
27521      const handleOnFocus = () => {
27522        if (isFocusedWithin()) {
27523          setIsFocused(true);
27524          debouncedShowMovers();
27525        }
27526      };
27527  
27528      const handleOnBlur = () => {
27529        if (!isFocusedWithin()) {
27530          setIsFocused(false);
27531          debouncedHideMovers();
27532        }
27533      };
27534      /**
27535       * Events are added via DOM events (vs. React synthetic events),
27536       * as the child React components swallow mouse events.
27537       */
27538  
27539  
27540      if (node && !registerRef.current) {
27541        node.addEventListener('focus', handleOnFocus, true);
27542        node.addEventListener('blur', handleOnBlur, true);
27543        registerRef.current = true;
27544      }
27545  
27546      return () => {
27547        if (node) {
27548          node.removeEventListener('focus', handleOnFocus);
27549          node.removeEventListener('blur', handleOnBlur);
27550        }
27551      };
27552    }, [ref, registerRef, setIsFocused, debouncedShowMovers, debouncedHideMovers]);
27553    return {
27554      showMovers,
27555      gestures: {
27556        onMouseMove: debouncedShowMovers,
27557        onMouseLeave: debouncedHideMovers
27558      }
27559    };
27560  }
27561  
27562  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-parent-selector/index.js
27563  
27564  
27565  
27566  /**
27567   * WordPress dependencies
27568   */
27569  
27570  
27571  
27572  
27573  
27574  /**
27575   * Internal dependencies
27576   */
27577  
27578  
27579  
27580  
27581  
27582  /**
27583   * Block parent selector component, displaying the hierarchy of the
27584   * current block selection as a single icon to "go up" a level.
27585   *
27586   * @return {WPComponent} Parent block selector.
27587   */
27588  
27589  function BlockParentSelector() {
27590    const {
27591      selectBlock,
27592      toggleBlockHighlight
27593    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
27594    const {
27595      firstParentClientId,
27596      shouldHide,
27597      hasReducedUI
27598    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
27599      const {
27600        getBlockName,
27601        getBlockParents,
27602        getSelectedBlockClientId,
27603        getSettings
27604      } = select(store);
27605      const {
27606        hasBlockSupport
27607      } = select(external_wp_blocks_namespaceObject.store);
27608      const selectedBlockClientId = getSelectedBlockClientId();
27609      const parents = getBlockParents(selectedBlockClientId);
27610      const _firstParentClientId = parents[parents.length - 1];
27611      const parentBlockName = getBlockName(_firstParentClientId);
27612  
27613      const _parentBlockType = (0,external_wp_blocks_namespaceObject.getBlockType)(parentBlockName);
27614  
27615      const settings = getSettings();
27616      return {
27617        firstParentClientId: _firstParentClientId,
27618        shouldHide: !hasBlockSupport(_parentBlockType, '__experimentalParentSelector', true),
27619        hasReducedUI: settings.hasReducedUI
27620      };
27621    }, []);
27622    const blockInformation = useBlockDisplayInformation(firstParentClientId); // Allows highlighting the parent block outline when focusing or hovering
27623    // the parent block selector within the child.
27624  
27625    const nodeRef = (0,external_wp_element_namespaceObject.useRef)();
27626    const {
27627      gestures: showMoversGestures
27628    } = useShowMoversGestures({
27629      ref: nodeRef,
27630  
27631      onChange(isFocused) {
27632        if (isFocused && hasReducedUI) {
27633          return;
27634        }
27635  
27636        toggleBlockHighlight(firstParentClientId, isFocused);
27637      }
27638  
27639    });
27640  
27641    if (shouldHide || firstParentClientId === undefined) {
27642      return null;
27643    }
27644  
27645    return (0,external_wp_element_namespaceObject.createElement)("div", _extends({
27646      className: "block-editor-block-parent-selector",
27647      key: firstParentClientId,
27648      ref: nodeRef
27649    }, showMoversGestures), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarButton, {
27650      className: "block-editor-block-parent-selector__button",
27651      onClick: () => selectBlock(firstParentClientId),
27652      label: (0,external_wp_i18n_namespaceObject.sprintf)(
27653      /* translators: %s: Name of the block's parent. */
27654      (0,external_wp_i18n_namespaceObject.__)('Select %s'), blockInformation.title),
27655      showTooltip: true,
27656      icon: (0,external_wp_element_namespaceObject.createElement)(block_icon, {
27657        icon: blockInformation.icon
27658      })
27659    }));
27660  }
27661  
27662  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/copy.js
27663  
27664  
27665  /**
27666   * WordPress dependencies
27667   */
27668  
27669  const copy = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
27670    xmlns: "http://www.w3.org/2000/svg",
27671    viewBox: "0 0 24 24"
27672  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
27673    d: "M20.2 8v11c0 .7-.6 1.2-1.2 1.2H6v1.5h13c1.5 0 2.7-1.2 2.7-2.8V8zM18 16.4V4.6c0-.9-.7-1.6-1.6-1.6H4.6C3.7 3 3 3.7 3 4.6v11.8c0 .9.7 1.6 1.6 1.6h11.8c.9 0 1.6-.7 1.6-1.6zm-13.5 0V4.6c0-.1.1-.1.1-.1h11.8c.1 0 .1.1.1.1v11.8c0 .1-.1.1-.1.1H4.6l-.1-.1z"
27674  }));
27675  /* harmony default export */ var library_copy = (copy);
27676  
27677  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-switcher/preview-block-popover.js
27678  
27679  
27680  /**
27681   * WordPress dependencies
27682   */
27683  
27684  
27685  /**
27686   * Internal dependencies
27687   */
27688  
27689  
27690  function PreviewBlockPopover(_ref) {
27691    let {
27692      blocks
27693    } = _ref;
27694    return (0,external_wp_element_namespaceObject.createElement)("div", {
27695      className: "block-editor-block-switcher__popover__preview__parent"
27696    }, (0,external_wp_element_namespaceObject.createElement)("div", {
27697      className: "block-editor-block-switcher__popover__preview__container"
27698    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Popover, {
27699      className: "block-editor-block-switcher__preview__popover",
27700      position: "bottom right",
27701      focusOnMount: false
27702    }, (0,external_wp_element_namespaceObject.createElement)("div", {
27703      className: "block-editor-block-switcher__preview"
27704    }, (0,external_wp_element_namespaceObject.createElement)("div", {
27705      className: "block-editor-block-switcher__preview-title"
27706    }, (0,external_wp_i18n_namespaceObject.__)('Preview')), (0,external_wp_element_namespaceObject.createElement)(block_preview, {
27707      viewportWidth: 500,
27708      blocks: blocks
27709    })))));
27710  }
27711  
27712  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-switcher/block-transformations-menu.js
27713  
27714  
27715  /**
27716   * WordPress dependencies
27717   */
27718  
27719  
27720  
27721  
27722  /**
27723   * Internal dependencies
27724   */
27725  
27726  
27727  
27728  
27729  const BlockTransformationsMenu = _ref => {
27730    let {
27731      className,
27732      possibleBlockTransformations,
27733      onSelect,
27734      blocks
27735    } = _ref;
27736    const [hoveredTransformItemName, setHoveredTransformItemName] = (0,external_wp_element_namespaceObject.useState)();
27737    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuGroup, {
27738      label: (0,external_wp_i18n_namespaceObject.__)('Transform to'),
27739      className: className
27740    }, hoveredTransformItemName && (0,external_wp_element_namespaceObject.createElement)(PreviewBlockPopover, {
27741      blocks: (0,external_wp_blocks_namespaceObject.switchToBlockType)(blocks, hoveredTransformItemName)
27742    }), possibleBlockTransformations.map(item => {
27743      const {
27744        name,
27745        icon,
27746        title,
27747        isDisabled
27748      } = item;
27749      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
27750        key: name,
27751        className: (0,external_wp_blocks_namespaceObject.getBlockMenuDefaultClassName)(name),
27752        onClick: event => {
27753          event.preventDefault();
27754          onSelect(name);
27755        },
27756        disabled: isDisabled,
27757        onMouseLeave: () => setHoveredTransformItemName(null),
27758        onMouseEnter: () => setHoveredTransformItemName(name)
27759      }, (0,external_wp_element_namespaceObject.createElement)(block_icon, {
27760        icon: icon,
27761        showColors: true
27762      }), title);
27763    }));
27764  };
27765  
27766  /* harmony default export */ var block_transformations_menu = (BlockTransformationsMenu);
27767  
27768  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/check.js
27769  
27770  
27771  /**
27772   * WordPress dependencies
27773   */
27774  
27775  const check = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
27776    xmlns: "http://www.w3.org/2000/svg",
27777    viewBox: "0 0 24 24"
27778  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
27779    d: "M16.7 7.1l-6.3 8.5-3.3-2.5-.9 1.2 4.5 3.4L17.9 8z"
27780  }));
27781  /* harmony default export */ var library_check = (check);
27782  
27783  ;// CONCATENATED MODULE: external ["wp","tokenList"]
27784  var external_wp_tokenList_namespaceObject = window["wp"]["tokenList"];
27785  var external_wp_tokenList_default = /*#__PURE__*/__webpack_require__.n(external_wp_tokenList_namespaceObject);
27786  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-styles/utils.js
27787  /**
27788   * External dependencies
27789   */
27790  
27791  /**
27792   * WordPress dependencies
27793   */
27794  
27795  
27796  
27797  /**
27798   * Returns the active style from the given className.
27799   *
27800   * @param {Array}  styles    Block style variations.
27801   * @param {string} className Class name
27802   *
27803   * @return {Object?} The active style.
27804   */
27805  
27806  function getActiveStyle(styles, className) {
27807    for (const style of new (external_wp_tokenList_default())(className).values()) {
27808      if (style.indexOf('is-style-') === -1) {
27809        continue;
27810      }
27811  
27812      const potentialStyleName = style.substring(9);
27813      const activeStyle = (0,external_lodash_namespaceObject.find)(styles, {
27814        name: potentialStyleName
27815      });
27816  
27817      if (activeStyle) {
27818        return activeStyle;
27819      }
27820    }
27821  
27822    return (0,external_lodash_namespaceObject.find)(styles, 'isDefault');
27823  }
27824  /**
27825   * Replaces the active style in the block's className.
27826   *
27827   * @param {string}  className   Class name.
27828   * @param {Object?} activeStyle The replaced style.
27829   * @param {Object}  newStyle    The replacing style.
27830   *
27831   * @return {string} The updated className.
27832   */
27833  
27834  function replaceActiveStyle(className, activeStyle, newStyle) {
27835    const list = new (external_wp_tokenList_default())(className);
27836  
27837    if (activeStyle) {
27838      list.remove('is-style-' + activeStyle.name);
27839    }
27840  
27841    list.add('is-style-' + newStyle.name);
27842    return list.value;
27843  }
27844  /**
27845   * Returns a collection of styles that can be represented on the frontend.
27846   * The function checks a style collection for a default style. If none is found, it adds one to
27847   * act as a fallback for when there is no active style applied to a block. The default item also serves
27848   * as a switch on the frontend to deactivate non-default styles.
27849   *
27850   * @param {Array} styles Block style variations.
27851   *
27852   * @return {Array<Object?>}        The style collection.
27853   */
27854  
27855  function getRenderedStyles(styles) {
27856    if (!styles || styles.length === 0) {
27857      return [];
27858    }
27859  
27860    return getDefaultStyle(styles) ? styles : [{
27861      name: 'default',
27862      label: (0,external_wp_i18n_namespaceObject._x)('Default', 'block style'),
27863      isDefault: true
27864    }, ...styles];
27865  }
27866  /**
27867   * Returns a style object from a collection of styles where that style object is the default block style.
27868   *
27869   * @param {Array} styles Block style variations.
27870   *
27871   * @return {Object?}        The default style object, if found.
27872   */
27873  
27874  function getDefaultStyle(styles) {
27875    return (0,external_lodash_namespaceObject.find)(styles, 'isDefault');
27876  }
27877  
27878  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-styles/use-styles-for-block.js
27879  /**
27880   * WordPress dependencies
27881   */
27882  
27883  
27884  
27885  /**
27886   * Internal dependencies
27887   */
27888  
27889  
27890  
27891  /**
27892   *
27893   * @param {WPBlock}     block Block object.
27894   * @param {WPBlockType} type  Block type settings.
27895   * @return {WPBlock}          A generic block ready for styles preview.
27896   */
27897  
27898  function useGenericPreviewBlock(block, type) {
27899    return (0,external_wp_element_namespaceObject.useMemo)(() => {
27900      const example = type === null || type === void 0 ? void 0 : type.example;
27901      const blockName = type === null || type === void 0 ? void 0 : type.name;
27902  
27903      if (example && blockName) {
27904        return (0,external_wp_blocks_namespaceObject.getBlockFromExample)(blockName, {
27905          attributes: example.attributes,
27906          innerBlocks: example.innerBlocks
27907        });
27908      }
27909  
27910      if (block) {
27911        return (0,external_wp_blocks_namespaceObject.cloneBlock)(block);
27912      }
27913    }, [type !== null && type !== void 0 && type.example ? block === null || block === void 0 ? void 0 : block.name : block, type]);
27914  }
27915  /**
27916   * @typedef useStylesForBlocksArguments
27917   * @property {string}     clientId Block client ID.
27918   * @property {() => void} onSwitch Block style switch callback function.
27919   */
27920  
27921  /**
27922   *
27923   * @param {useStylesForBlocksArguments} useStylesForBlocks arguments.
27924   * @return {Object}                                         Results of the select methods.
27925   */
27926  
27927  
27928  function useStylesForBlocks(_ref) {
27929    let {
27930      clientId,
27931      onSwitch
27932    } = _ref;
27933  
27934    const selector = select => {
27935      const {
27936        getBlock
27937      } = select(store);
27938      const block = getBlock(clientId);
27939  
27940      if (!block) {
27941        return {};
27942      }
27943  
27944      const blockType = (0,external_wp_blocks_namespaceObject.getBlockType)(block.name);
27945      const {
27946        getBlockStyles
27947      } = select(external_wp_blocks_namespaceObject.store);
27948      return {
27949        block,
27950        blockType,
27951        styles: getBlockStyles(block.name),
27952        className: block.attributes.className || ''
27953      };
27954    };
27955  
27956    const {
27957      styles,
27958      block,
27959      blockType,
27960      className
27961    } = (0,external_wp_data_namespaceObject.useSelect)(selector, [clientId]);
27962    const {
27963      updateBlockAttributes
27964    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
27965    const stylesToRender = getRenderedStyles(styles);
27966    const activeStyle = getActiveStyle(stylesToRender, className);
27967    const genericPreviewBlock = useGenericPreviewBlock(block, blockType);
27968  
27969    const onSelect = style => {
27970      const styleClassName = replaceActiveStyle(className, activeStyle, style);
27971      updateBlockAttributes(clientId, {
27972        className: styleClassName
27973      });
27974      onSwitch();
27975    };
27976  
27977    return {
27978      onSelect,
27979      stylesToRender,
27980      activeStyle,
27981      genericPreviewBlock,
27982      className
27983    };
27984  }
27985  
27986  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-styles/menu-items.js
27987  
27988  
27989  /**
27990   * External dependencies
27991   */
27992  
27993  /**
27994   * WordPress dependencies
27995   */
27996  
27997  
27998  
27999  /**
28000   * Internal dependencies
28001   */
28002  
28003  
28004  function BlockStylesMenuItems(_ref) {
28005    let {
28006      clientId,
28007      onSwitch = external_lodash_namespaceObject.noop
28008    } = _ref;
28009    const {
28010      onSelect,
28011      stylesToRender,
28012      activeStyle
28013    } = useStylesForBlocks({
28014      clientId,
28015      onSwitch
28016    });
28017  
28018    if (!stylesToRender || stylesToRender.length === 0) {
28019      return null;
28020    }
28021  
28022    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, stylesToRender.map(style => {
28023      const menuItemText = style.label || style.name;
28024      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
28025        key: style.name,
28026        icon: activeStyle.name === style.name ? library_check : null,
28027        onClick: () => onSelect(style)
28028      }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalText, {
28029        as: "span",
28030        limit: 18,
28031        ellipsizeMode: "tail",
28032        truncate: true
28033      }, menuItemText));
28034    }));
28035  }
28036  
28037  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-switcher/block-styles-menu.js
28038  
28039  
28040  /**
28041   * WordPress dependencies
28042   */
28043  
28044  
28045  /**
28046   * Internal dependencies
28047   */
28048  
28049  
28050  function BlockStylesMenu(_ref) {
28051    let {
28052      hoveredBlock,
28053      onSwitch
28054    } = _ref;
28055    const {
28056      clientId
28057    } = hoveredBlock;
28058    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuGroup, {
28059      label: (0,external_wp_i18n_namespaceObject.__)('Styles'),
28060      className: "block-editor-block-switcher__styles__menugroup"
28061    }, (0,external_wp_element_namespaceObject.createElement)(BlockStylesMenuItems, {
28062      clientId: clientId,
28063      onSwitch: onSwitch
28064    }));
28065  }
28066  
28067  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-switcher/utils.js
28068  /**
28069   * WordPress dependencies
28070   */
28071  
28072  /**
28073   * Try to find a matching block by a block's name in a provided
28074   * block. We recurse through InnerBlocks and return the reference
28075   * of the matched block (it could be an InnerBlock).
28076   * If no match is found return nothing.
28077   *
28078   * @param {WPBlock} block             The block to try to find a match.
28079   * @param {string}  selectedBlockName The block's name to use for matching condition.
28080   * @param {Set}     consumedBlocks    A set holding the previously matched/consumed blocks.
28081   *
28082   * @return {WPBlock?} The matched block if found or nothing(`undefined`).
28083   */
28084  
28085  const getMatchingBlockByName = function (block, selectedBlockName) {
28086    let consumedBlocks = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Set();
28087    const {
28088      clientId,
28089      name,
28090      innerBlocks = []
28091    } = block; // Check if block has been consumed already.
28092  
28093    if (consumedBlocks.has(clientId)) return;
28094    if (name === selectedBlockName) return block; // Try to find a matching block from InnerBlocks recursively.
28095  
28096    for (const innerBlock of innerBlocks) {
28097      const match = getMatchingBlockByName(innerBlock, selectedBlockName, consumedBlocks);
28098      if (match) return match;
28099    }
28100  };
28101  /**
28102   * Find and return the block attributes to retain through
28103   * the transformation, based on Block Type's `role:content`
28104   * attributes. If no `role:content` attributes exist,
28105   * return selected block's attributes.
28106   *
28107   * @param {string} name       Block type's namespaced name.
28108   * @param {Object} attributes Selected block's attributes.
28109   * @return {Object} The block's attributes to retain.
28110   */
28111  
28112  const getRetainedBlockAttributes = (name, attributes) => {
28113    const contentAttributes = (0,external_wp_blocks_namespaceObject.__experimentalGetBlockAttributesNamesByRole)(name, 'content');
28114    if (!(contentAttributes !== null && contentAttributes !== void 0 && contentAttributes.length)) return attributes;
28115    return contentAttributes.reduce((_accumulator, attribute) => {
28116      if (attributes[attribute]) _accumulator[attribute] = attributes[attribute];
28117      return _accumulator;
28118    }, {});
28119  };
28120  
28121  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-switcher/use-transformed-patterns.js
28122  /**
28123   * WordPress dependencies
28124   */
28125  
28126  
28127  /**
28128   * Internal dependencies
28129   */
28130  
28131  
28132  /**
28133   * Mutate the matched block's attributes by getting
28134   * which block type's attributes to retain and prioritize
28135   * them in the merging of the attributes.
28136   *
28137   * @param {WPBlock} match         The matched block.
28138   * @param {WPBlock} selectedBlock The selected block.
28139   * @return {void}
28140   */
28141  
28142  const transformMatchingBlock = (match, selectedBlock) => {
28143    // Get the block attributes to retain through the transformation.
28144    const retainedBlockAttributes = getRetainedBlockAttributes(selectedBlock.name, selectedBlock.attributes);
28145    match.attributes = { ...match.attributes,
28146      ...retainedBlockAttributes
28147    };
28148  };
28149  /**
28150   * By providing the selected blocks and pattern's blocks
28151   * find the matching blocks, transform them and return them.
28152   * If not all selected blocks are matched, return nothing.
28153   *
28154   * @param {WPBlock[]} selectedBlocks The selected blocks.
28155   * @param {WPBlock[]} patternBlocks  The pattern's blocks.
28156   * @return {WPBlock[]|void} The transformed pattern's blocks or undefined if not all selected blocks have been matched.
28157   */
28158  
28159  const getPatternTransformedBlocks = (selectedBlocks, patternBlocks) => {
28160    // Clone Pattern's blocks to produce new clientIds and be able to mutate the matches.
28161    const _patternBlocks = patternBlocks.map(block => (0,external_wp_blocks_namespaceObject.cloneBlock)(block));
28162    /**
28163     * Keep track of the consumed pattern blocks.
28164     * This is needed because we loop the selected blocks
28165     * and for example we may have selected two paragraphs and
28166     * the pattern's blocks could have more `paragraphs`.
28167     */
28168  
28169  
28170    const consumedBlocks = new Set();
28171  
28172    for (const selectedBlock of selectedBlocks) {
28173      let isMatch = false;
28174  
28175      for (const patternBlock of _patternBlocks) {
28176        const match = getMatchingBlockByName(patternBlock, selectedBlock.name, consumedBlocks);
28177        if (!match) continue;
28178        isMatch = true;
28179        consumedBlocks.add(match.clientId); // We update (mutate) the matching pattern block.
28180  
28181        transformMatchingBlock(match, selectedBlock); // No need to loop through other pattern's blocks.
28182  
28183        break;
28184      } // Bail eary if a selected block has not been matched.
28185  
28186  
28187      if (!isMatch) return;
28188    }
28189  
28190    return _patternBlocks;
28191  };
28192  /**
28193   * @typedef {WPBlockPattern & {transformedBlocks: WPBlock[]}} TransformedBlockPattern
28194   */
28195  
28196  /**
28197   * Custom hook that accepts patterns from state and the selected
28198   * blocks and tries to match these with the pattern's blocks.
28199   * If all selected blocks are matched with a Pattern's block,
28200   * we transform them by retaining block's attributes with `role:content`.
28201   * The transformed pattern's blocks are set to a new pattern
28202   * property `transformedBlocks`.
28203   *
28204   * @param {WPBlockPattern[]} patterns       Patterns from state.
28205   * @param {WPBlock[]}        selectedBlocks The currently selected blocks.
28206   * @return {TransformedBlockPattern[]} Returns the eligible matched patterns with all the selected blocks.
28207   */
28208  
28209  const useTransformedPatterns = (patterns, selectedBlocks) => {
28210    return (0,external_wp_element_namespaceObject.useMemo)(() => patterns.reduce((accumulator, _pattern) => {
28211      const transformedBlocks = getPatternTransformedBlocks(selectedBlocks, _pattern.blocks);
28212  
28213      if (transformedBlocks) {
28214        accumulator.push({ ..._pattern,
28215          transformedBlocks
28216        });
28217      }
28218  
28219      return accumulator;
28220    }, []), [patterns, selectedBlocks]);
28221  };
28222  
28223  /* harmony default export */ var use_transformed_patterns = (useTransformedPatterns);
28224  
28225  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-switcher/pattern-transformations-menu.js
28226  
28227  
28228  
28229  /**
28230   * WordPress dependencies
28231   */
28232  
28233  
28234  
28235  
28236  
28237  /**
28238   * Internal dependencies
28239   */
28240  
28241  
28242  
28243  
28244  function PatternTransformationsMenu(_ref) {
28245    let {
28246      blocks,
28247      patterns: statePatterns,
28248      onSelect
28249    } = _ref;
28250    const [showTransforms, setShowTransforms] = (0,external_wp_element_namespaceObject.useState)(false);
28251    const patterns = use_transformed_patterns(statePatterns, blocks);
28252    if (!patterns.length) return null;
28253    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuGroup, {
28254      className: "block-editor-block-switcher__pattern__transforms__menugroup"
28255    }, showTransforms && (0,external_wp_element_namespaceObject.createElement)(PreviewPatternsPopover, {
28256      patterns: patterns,
28257      onSelect: onSelect
28258    }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
28259      onClick: event => {
28260        event.preventDefault();
28261        setShowTransforms(!showTransforms);
28262      },
28263      icon: chevron_right
28264    }, (0,external_wp_i18n_namespaceObject.__)('Patterns')));
28265  }
28266  
28267  function PreviewPatternsPopover(_ref2) {
28268    let {
28269      patterns,
28270      onSelect
28271    } = _ref2;
28272    return (0,external_wp_element_namespaceObject.createElement)("div", {
28273      className: "block-editor-block-switcher__popover__preview__parent"
28274    }, (0,external_wp_element_namespaceObject.createElement)("div", {
28275      className: "block-editor-block-switcher__popover__preview__container"
28276    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Popover, {
28277      className: "block-editor-block-switcher__preview__popover",
28278      position: "bottom right"
28279    }, (0,external_wp_element_namespaceObject.createElement)("div", {
28280      className: "block-editor-block-switcher__preview"
28281    }, (0,external_wp_element_namespaceObject.createElement)("div", {
28282      className: "block-editor-block-switcher__preview-title"
28283    }, (0,external_wp_i18n_namespaceObject.__)('Preview')), (0,external_wp_element_namespaceObject.createElement)(BlockPatternsList, {
28284      patterns: patterns,
28285      onSelect: onSelect
28286    })))));
28287  }
28288  
28289  function BlockPatternsList(_ref3) {
28290    let {
28291      patterns,
28292      onSelect
28293    } = _ref3;
28294    const composite = (0,external_wp_components_namespaceObject.__unstableUseCompositeState)();
28295    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__unstableComposite, _extends({}, composite, {
28296      role: "listbox",
28297      className: "block-editor-block-switcher__preview-patterns-container",
28298      "aria-label": (0,external_wp_i18n_namespaceObject.__)('Patterns list')
28299    }), patterns.map(pattern => (0,external_wp_element_namespaceObject.createElement)(pattern_transformations_menu_BlockPattern, {
28300      key: pattern.name,
28301      pattern: pattern,
28302      onSelect: onSelect,
28303      composite: composite
28304    })));
28305  }
28306  
28307  function pattern_transformations_menu_BlockPattern(_ref4) {
28308    let {
28309      pattern,
28310      onSelect,
28311      composite
28312    } = _ref4;
28313    // TODO check pattern/preview width...
28314    const baseClassName = 'block-editor-block-switcher__preview-patterns-container';
28315    const descriptionId = (0,external_wp_compose_namespaceObject.useInstanceId)(pattern_transformations_menu_BlockPattern, `$baseClassName}-list__item-description`);
28316    return (0,external_wp_element_namespaceObject.createElement)("div", {
28317      className: `$baseClassName}-list__list-item`,
28318      "aria-label": pattern.title,
28319      "aria-describedby": pattern.description ? descriptionId : undefined
28320    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__unstableCompositeItem, _extends({
28321      role: "option",
28322      as: "div"
28323    }, composite, {
28324      className: `$baseClassName}-list__item`,
28325      onClick: () => onSelect(pattern.transformedBlocks)
28326    }), (0,external_wp_element_namespaceObject.createElement)(block_preview, {
28327      blocks: pattern.transformedBlocks,
28328      viewportWidth: pattern.viewportWidth || 500
28329    }), (0,external_wp_element_namespaceObject.createElement)("div", {
28330      className: `$baseClassName}-list__item-title`
28331    }, pattern.title)), !!pattern.description && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.VisuallyHidden, {
28332      id: descriptionId
28333    }, pattern.description));
28334  }
28335  
28336  /* harmony default export */ var pattern_transformations_menu = (PatternTransformationsMenu);
28337  
28338  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-switcher/index.js
28339  
28340  
28341  /**
28342   * External dependencies
28343   */
28344  
28345  /**
28346   * WordPress dependencies
28347   */
28348  
28349  
28350  
28351  
28352  
28353  
28354  /**
28355   * Internal dependencies
28356   */
28357  
28358  
28359  
28360  
28361  
28362  
28363  
28364  
28365  const BlockSwitcherDropdownMenu = _ref => {
28366    let {
28367      clientIds,
28368      blocks
28369    } = _ref;
28370    const {
28371      replaceBlocks
28372    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
28373    const blockInformation = useBlockDisplayInformation(blocks[0].clientId);
28374    const {
28375      possibleBlockTransformations,
28376      canRemove,
28377      hasBlockStyles,
28378      icon,
28379      blockTitle,
28380      patterns
28381    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
28382      var _getBlockType2;
28383  
28384      const {
28385        getBlockRootClientId,
28386        getBlockTransformItems,
28387        __experimentalGetPatternTransformItems
28388      } = select(store);
28389      const {
28390        getBlockStyles,
28391        getBlockType
28392      } = select(external_wp_blocks_namespaceObject.store);
28393      const {
28394        canRemoveBlocks
28395      } = select(store);
28396      const rootClientId = getBlockRootClientId((0,external_lodash_namespaceObject.castArray)(clientIds)[0]);
28397      const [{
28398        name: firstBlockName
28399      }] = blocks;
28400  
28401      const _isSingleBlockSelected = blocks.length === 1;
28402  
28403      const styles = _isSingleBlockSelected && getBlockStyles(firstBlockName);
28404  
28405      let _icon;
28406  
28407      if (_isSingleBlockSelected) {
28408        _icon = blockInformation === null || blockInformation === void 0 ? void 0 : blockInformation.icon; // Take into account active block variations.
28409      } else {
28410        var _getBlockType;
28411  
28412        const isSelectionOfSameType = (0,external_lodash_namespaceObject.uniq)(blocks.map(_ref2 => {
28413          let {
28414            name
28415          } = _ref2;
28416          return name;
28417        })).length === 1; // When selection consists of blocks of multiple types, display an
28418        // appropriate icon to communicate the non-uniformity.
28419  
28420        _icon = isSelectionOfSameType ? (_getBlockType = getBlockType(firstBlockName)) === null || _getBlockType === void 0 ? void 0 : _getBlockType.icon : library_copy;
28421      }
28422  
28423      return {
28424        possibleBlockTransformations: getBlockTransformItems(blocks, rootClientId),
28425        canRemove: canRemoveBlocks(clientIds, rootClientId),
28426        hasBlockStyles: !!(styles !== null && styles !== void 0 && styles.length),
28427        icon: _icon,
28428        blockTitle: (_getBlockType2 = getBlockType(firstBlockName)) === null || _getBlockType2 === void 0 ? void 0 : _getBlockType2.title,
28429        patterns: __experimentalGetPatternTransformItems(blocks, rootClientId)
28430      };
28431    }, [clientIds, blocks, blockInformation === null || blockInformation === void 0 ? void 0 : blockInformation.icon]);
28432    const isReusable = blocks.length === 1 && (0,external_wp_blocks_namespaceObject.isReusableBlock)(blocks[0]);
28433    const isTemplate = blocks.length === 1 && (0,external_wp_blocks_namespaceObject.isTemplatePart)(blocks[0]); // Simple block tranformation based on the `Block Transforms` API.
28434  
28435    const onBlockTransform = name => replaceBlocks(clientIds, (0,external_wp_blocks_namespaceObject.switchToBlockType)(blocks, name)); // Pattern transformation through the `Patterns` API.
28436  
28437  
28438    const onPatternTransform = transformedBlocks => replaceBlocks(clientIds, transformedBlocks);
28439  
28440    const hasPossibleBlockTransformations = !!possibleBlockTransformations.length && canRemove;
28441    const hasPatternTransformation = !!(patterns !== null && patterns !== void 0 && patterns.length) && canRemove;
28442  
28443    if (!hasBlockStyles && !hasPossibleBlockTransformations) {
28444      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarGroup, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarButton, {
28445        disabled: true,
28446        className: "block-editor-block-switcher__no-switcher-icon",
28447        title: blockTitle,
28448        icon: (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(block_icon, {
28449          icon: icon,
28450          showColors: true
28451        }), (isReusable || isTemplate) && (0,external_wp_element_namespaceObject.createElement)("span", {
28452          className: "block-editor-block-switcher__toggle-text"
28453        }, (0,external_wp_element_namespaceObject.createElement)(BlockTitle, {
28454          clientId: clientIds,
28455          maximumLength: 35
28456        })))
28457      }));
28458    }
28459  
28460    const blockSwitcherLabel = blockTitle;
28461    const blockSwitcherDescription = 1 === blocks.length ? (0,external_wp_i18n_namespaceObject.sprintf)(
28462    /* translators: %s: block title. */
28463    (0,external_wp_i18n_namespaceObject.__)('%s: Change block type or style'), blockTitle) : (0,external_wp_i18n_namespaceObject.sprintf)(
28464    /* translators: %d: number of blocks. */
28465    (0,external_wp_i18n_namespaceObject._n)('Change type of %d block', 'Change type of %d blocks', blocks.length), blocks.length);
28466    const showDropDown = hasBlockStyles || hasPossibleBlockTransformations || hasPatternTransformation;
28467    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarGroup, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarItem, null, toggleProps => (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.DropdownMenu, {
28468      className: "block-editor-block-switcher",
28469      label: blockSwitcherLabel,
28470      popoverProps: {
28471        position: 'bottom right',
28472        isAlternate: true,
28473        className: 'block-editor-block-switcher__popover'
28474      },
28475      icon: (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(block_icon, {
28476        icon: icon,
28477        className: "block-editor-block-switcher__toggle",
28478        showColors: true
28479      }), (isReusable || isTemplate) && (0,external_wp_element_namespaceObject.createElement)("span", {
28480        className: "block-editor-block-switcher__toggle-text"
28481      }, (0,external_wp_element_namespaceObject.createElement)(BlockTitle, {
28482        clientId: clientIds,
28483        maximumLength: 35
28484      }))),
28485      toggleProps: {
28486        describedBy: blockSwitcherDescription,
28487        ...toggleProps
28488      },
28489      menuProps: {
28490        orientation: 'both'
28491      }
28492    }, _ref3 => {
28493      let {
28494        onClose
28495      } = _ref3;
28496      return showDropDown && (0,external_wp_element_namespaceObject.createElement)("div", {
28497        className: "block-editor-block-switcher__container"
28498      }, hasPatternTransformation && (0,external_wp_element_namespaceObject.createElement)(pattern_transformations_menu, {
28499        blocks: blocks,
28500        patterns: patterns,
28501        onSelect: transformedBlocks => {
28502          onPatternTransform(transformedBlocks);
28503          onClose();
28504        }
28505      }), hasPossibleBlockTransformations && (0,external_wp_element_namespaceObject.createElement)(block_transformations_menu, {
28506        className: "block-editor-block-switcher__transforms__menugroup",
28507        possibleBlockTransformations: possibleBlockTransformations,
28508        blocks: blocks,
28509        onSelect: name => {
28510          onBlockTransform(name);
28511          onClose();
28512        }
28513      }), hasBlockStyles && (0,external_wp_element_namespaceObject.createElement)(BlockStylesMenu, {
28514        hoveredBlock: blocks[0],
28515        onSwitch: onClose
28516      }));
28517    })));
28518  };
28519  const BlockSwitcher = _ref4 => {
28520    let {
28521      clientIds
28522    } = _ref4;
28523    const blocks = (0,external_wp_data_namespaceObject.useSelect)(select => select(store).getBlocksByClientId(clientIds), [clientIds]);
28524  
28525    if (!blocks.length || blocks.some(block => !block)) {
28526      return null;
28527    }
28528  
28529    return (0,external_wp_element_namespaceObject.createElement)(BlockSwitcherDropdownMenu, {
28530      clientIds: clientIds,
28531      blocks: blocks
28532    });
28533  };
28534  /* harmony default export */ var block_switcher = (BlockSwitcher);
28535  
28536  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-toolbar/block-toolbar-last-item.js
28537  /**
28538   * WordPress dependencies
28539   */
28540  
28541  const {
28542    Fill: __unstableBlockToolbarLastItem,
28543    Slot: block_toolbar_last_item_Slot
28544  } = (0,external_wp_components_namespaceObject.createSlotFill)('__unstableBlockToolbarLastItem');
28545  __unstableBlockToolbarLastItem.Slot = block_toolbar_last_item_Slot;
28546  /* harmony default export */ var block_toolbar_last_item = (__unstableBlockToolbarLastItem);
28547  
28548  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/more-vertical.js
28549  
28550  
28551  /**
28552   * WordPress dependencies
28553   */
28554  
28555  const moreVertical = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
28556    xmlns: "http://www.w3.org/2000/svg",
28557    viewBox: "0 0 24 24"
28558  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
28559    d: "M13 19h-2v-2h2v2zm0-6h-2v-2h2v2zm0-6h-2V5h2v2z"
28560  }));
28561  /* harmony default export */ var more_vertical = (moreVertical);
28562  
28563  ;// CONCATENATED MODULE: external ["wp","blob"]
28564  var external_wp_blob_namespaceObject = window["wp"]["blob"];
28565  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/utils/pasting.js
28566  /**
28567   * WordPress dependencies
28568   */
28569  
28570  
28571  function getPasteEventData(_ref) {
28572    let {
28573      clipboardData
28574    } = _ref;
28575    let plainText = '';
28576    let html = ''; // IE11 only supports `Text` as an argument for `getData` and will
28577    // otherwise throw an invalid argument error, so we try the standard
28578    // arguments first, then fallback to `Text` if they fail.
28579  
28580    try {
28581      plainText = clipboardData.getData('text/plain');
28582      html = clipboardData.getData('text/html');
28583    } catch (error1) {
28584      try {
28585        html = clipboardData.getData('Text');
28586      } catch (error2) {
28587        // Some browsers like UC Browser paste plain text by default and
28588        // don't support clipboardData at all, so allow default
28589        // behaviour.
28590        return;
28591      }
28592    }
28593  
28594    const files = (0,external_wp_dom_namespaceObject.getFilesFromDataTransfer)(clipboardData).filter(_ref2 => {
28595      let {
28596        type
28597      } = _ref2;
28598      return /^image\/(?:jpe?g|png|gif|webp)$/.test(type);
28599    });
28600  
28601    if (files.length && !shouldDismissPastedFiles(files, html, plainText)) {
28602      html = files.map(file => `<img src="${(0,external_wp_blob_namespaceObject.createBlobURL)(file)}">`).join('');
28603      plainText = '';
28604    }
28605  
28606    return {
28607      html,
28608      plainText
28609    };
28610  }
28611  /**
28612   * Given a collection of DataTransfer files and HTML and plain text strings,
28613   * determine whether the files are to be dismissed in favor of the HTML.
28614   *
28615   * Certain office-type programs, like Microsoft Word or Apple Numbers,
28616   * will, upon copy, generate a screenshot of the content being copied and
28617   * attach it to the clipboard alongside the actual rich text that the user
28618   * sought to copy. In those cases, we should let Gutenberg handle the rich text
28619   * content and not the screenshot, since this allows Gutenberg to insert
28620   * meaningful blocks, like paragraphs, lists or even tables.
28621   *
28622   * @param {File[]} files File objects obtained from a paste event
28623   * @param {string} html  HTML content obtained from a paste event
28624   * @return {boolean}     True if the files should be dismissed
28625   */
28626  
28627  function shouldDismissPastedFiles(files, html
28628  /*, plainText */
28629  ) {
28630    // The question is only relevant when there is actual HTML content and when
28631    // there is exactly one image file.
28632    if (html && (files === null || files === void 0 ? void 0 : files.length) === 1 && files[0].type.indexOf('image/') === 0) {
28633      var _html$match;
28634  
28635      // A single <img> tag found in the HTML source suggests that the
28636      // content being pasted revolves around an image. Sometimes there are
28637      // other elements found, like <figure>, but we assume that the user's
28638      // intention is to paste the actual image file.
28639      const IMAGE_TAG = /<\s*img\b/gi;
28640      return ((_html$match = html.match(IMAGE_TAG)) === null || _html$match === void 0 ? void 0 : _html$match.length) !== 1;
28641    }
28642  
28643    return false;
28644  }
28645  
28646  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/copy-handler/index.js
28647  
28648  
28649  /**
28650   * WordPress dependencies
28651   */
28652  
28653  
28654  
28655  
28656  
28657  
28658  
28659  /**
28660   * Internal dependencies
28661   */
28662  
28663  
28664  
28665  function useNotifyCopy() {
28666    const {
28667      getBlockName
28668    } = (0,external_wp_data_namespaceObject.useSelect)(store);
28669    const {
28670      getBlockType
28671    } = (0,external_wp_data_namespaceObject.useSelect)(external_wp_blocks_namespaceObject.store);
28672    const {
28673      createSuccessNotice
28674    } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store);
28675    return (0,external_wp_element_namespaceObject.useCallback)((eventType, selectedBlockClientIds) => {
28676      let notice = '';
28677  
28678      if (selectedBlockClientIds.length === 1) {
28679        var _getBlockType;
28680  
28681        const clientId = selectedBlockClientIds[0];
28682        const title = (_getBlockType = getBlockType(getBlockName(clientId))) === null || _getBlockType === void 0 ? void 0 : _getBlockType.title;
28683        notice = eventType === 'copy' ? (0,external_wp_i18n_namespaceObject.sprintf)( // Translators: Name of the block being copied, e.g. "Paragraph".
28684        (0,external_wp_i18n_namespaceObject.__)('Copied "%s" to clipboard.'), title) : (0,external_wp_i18n_namespaceObject.sprintf)( // Translators: Name of the block being cut, e.g. "Paragraph".
28685        (0,external_wp_i18n_namespaceObject.__)('Moved "%s" to clipboard.'), title);
28686      } else {
28687        notice = eventType === 'copy' ? (0,external_wp_i18n_namespaceObject.sprintf)( // Translators: %d: Number of blocks being copied.
28688        (0,external_wp_i18n_namespaceObject._n)('Copied %d block to clipboard.', 'Copied %d blocks to clipboard.', selectedBlockClientIds.length), selectedBlockClientIds.length) : (0,external_wp_i18n_namespaceObject.sprintf)( // Translators: %d: Number of blocks being cut.
28689        (0,external_wp_i18n_namespaceObject._n)('Moved %d block to clipboard.', 'Moved %d blocks to clipboard.', selectedBlockClientIds.length), selectedBlockClientIds.length);
28690      }
28691  
28692      createSuccessNotice(notice, {
28693        type: 'snackbar'
28694      });
28695    }, []);
28696  }
28697  function useClipboardHandler() {
28698    const {
28699      getBlocksByClientId,
28700      getSelectedBlockClientIds,
28701      hasMultiSelection,
28702      getSettings,
28703      __unstableIsFullySelected,
28704      __unstableIsSelectionCollapsed,
28705      __unstableIsSelectionMergeable,
28706      __unstableGetSelectedBlocksWithPartialSelection
28707    } = (0,external_wp_data_namespaceObject.useSelect)(store);
28708    const {
28709      flashBlock,
28710      removeBlocks,
28711      replaceBlocks,
28712      __unstableDeleteSelection,
28713      __unstableExpandSelection
28714    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
28715    const notifyCopy = useNotifyCopy();
28716    return (0,external_wp_compose_namespaceObject.useRefEffect)(node => {
28717      function handler(event) {
28718        const selectedBlockClientIds = getSelectedBlockClientIds();
28719  
28720        if (selectedBlockClientIds.length === 0) {
28721          return;
28722        } // Always handle multiple selected blocks.
28723  
28724  
28725        if (!hasMultiSelection()) {
28726          const {
28727            target
28728          } = event;
28729          const {
28730            ownerDocument
28731          } = target; // If copying, only consider actual text selection as selection.
28732          // Otherwise, any focus on an input field is considered.
28733  
28734          const hasSelection = event.type === 'copy' || event.type === 'cut' ? (0,external_wp_dom_namespaceObject.documentHasUncollapsedSelection)(ownerDocument) : (0,external_wp_dom_namespaceObject.documentHasSelection)(ownerDocument); // Let native copy behaviour take over in input fields.
28735  
28736          if (hasSelection) {
28737            return;
28738          }
28739        }
28740  
28741        if (!node.contains(event.target.ownerDocument.activeElement)) {
28742          return;
28743        }
28744  
28745        const eventDefaultPrevented = event.defaultPrevented;
28746        event.preventDefault();
28747  
28748        const isSelectionMergeable = __unstableIsSelectionMergeable();
28749  
28750        const shouldHandleWholeBlocks = __unstableIsSelectionCollapsed() || __unstableIsFullySelected();
28751  
28752        const expandSelectionIsNeeded = !shouldHandleWholeBlocks && !isSelectionMergeable;
28753  
28754        if (event.type === 'copy' || event.type === 'cut') {
28755          if (selectedBlockClientIds.length === 1) {
28756            flashBlock(selectedBlockClientIds[0]);
28757          } // If we have a partial selection that is not mergeable, just
28758          // expand the selection to the whole blocks.
28759  
28760  
28761          if (expandSelectionIsNeeded) {
28762            __unstableExpandSelection();
28763          } else {
28764            notifyCopy(event.type, selectedBlockClientIds);
28765            let blocks; // Check if we have partial selection.
28766  
28767            if (shouldHandleWholeBlocks) {
28768              blocks = getBlocksByClientId(selectedBlockClientIds);
28769            } else {
28770              const [head, tail] = __unstableGetSelectedBlocksWithPartialSelection();
28771  
28772              const inBetweenBlocks = getBlocksByClientId(selectedBlockClientIds.slice(1, selectedBlockClientIds.length - 1));
28773              blocks = [head, ...inBetweenBlocks, tail];
28774            }
28775  
28776            const serialized = (0,external_wp_blocks_namespaceObject.serialize)(blocks);
28777            event.clipboardData.setData('text/plain', serialized);
28778            event.clipboardData.setData('text/html', serialized);
28779          }
28780        }
28781  
28782        if (event.type === 'cut') {
28783          // We need to also check if at the start we needed to
28784          // expand the selection, as in this point we might have
28785          // programmatically fully selected the blocks above.
28786          if (shouldHandleWholeBlocks && !expandSelectionIsNeeded) {
28787            removeBlocks(selectedBlockClientIds);
28788          } else {
28789            __unstableDeleteSelection();
28790          }
28791        } else if (event.type === 'paste') {
28792          if (eventDefaultPrevented) {
28793            // This was likely already handled in rich-text/use-paste-handler.js.
28794            return;
28795          }
28796  
28797          const {
28798            __experimentalCanUserUseUnfilteredHTML: canUserUseUnfilteredHTML
28799          } = getSettings();
28800          const {
28801            plainText,
28802            html
28803          } = getPasteEventData(event);
28804          const blocks = (0,external_wp_blocks_namespaceObject.pasteHandler)({
28805            HTML: html,
28806            plainText,
28807            mode: 'BLOCKS',
28808            canUserUseUnfilteredHTML
28809          });
28810          replaceBlocks(selectedBlockClientIds, blocks, blocks.length - 1, -1);
28811        }
28812      }
28813  
28814      node.ownerDocument.addEventListener('copy', handler);
28815      node.ownerDocument.addEventListener('cut', handler);
28816      node.ownerDocument.addEventListener('paste', handler);
28817      return () => {
28818        node.ownerDocument.removeEventListener('copy', handler);
28819        node.ownerDocument.removeEventListener('cut', handler);
28820        node.ownerDocument.removeEventListener('paste', handler);
28821      };
28822    }, []);
28823  }
28824  
28825  function CopyHandler(_ref) {
28826    let {
28827      children
28828    } = _ref;
28829    return (0,external_wp_element_namespaceObject.createElement)("div", {
28830      ref: useClipboardHandler()
28831    }, children);
28832  }
28833  /**
28834   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/copy-handler/README.md
28835   */
28836  
28837  
28838  /* harmony default export */ var copy_handler = (CopyHandler);
28839  
28840  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-actions/index.js
28841  /**
28842   * External dependencies
28843   */
28844  
28845  /**
28846   * WordPress dependencies
28847   */
28848  
28849  
28850  
28851  /**
28852   * Internal dependencies
28853   */
28854  
28855  
28856  
28857  function BlockActions(_ref) {
28858    let {
28859      clientIds,
28860      children,
28861      __experimentalUpdateSelection: updateSelection
28862    } = _ref;
28863    const {
28864      canInsertBlockType,
28865      getBlockRootClientId,
28866      getBlocksByClientId,
28867      canMoveBlocks,
28868      canRemoveBlocks
28869    } = (0,external_wp_data_namespaceObject.useSelect)(store);
28870    const {
28871      getDefaultBlockName,
28872      getGroupingBlockName
28873    } = (0,external_wp_data_namespaceObject.useSelect)(external_wp_blocks_namespaceObject.store);
28874    const blocks = getBlocksByClientId(clientIds);
28875    const rootClientId = getBlockRootClientId(clientIds[0]);
28876    const canDuplicate = (0,external_lodash_namespaceObject.every)(blocks, block => {
28877      return !!block && (0,external_wp_blocks_namespaceObject.hasBlockSupport)(block.name, 'multiple', true) && canInsertBlockType(block.name, rootClientId);
28878    });
28879    const canInsertDefaultBlock = canInsertBlockType(getDefaultBlockName(), rootClientId);
28880    const canMove = canMoveBlocks(clientIds, rootClientId);
28881    const canRemove = canRemoveBlocks(clientIds, rootClientId);
28882    const {
28883      removeBlocks,
28884      replaceBlocks,
28885      duplicateBlocks,
28886      insertAfterBlock,
28887      insertBeforeBlock,
28888      flashBlock,
28889      setBlockMovingClientId,
28890      setNavigationMode,
28891      selectBlock
28892    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
28893    const notifyCopy = useNotifyCopy();
28894    return children({
28895      canDuplicate,
28896      canInsertDefaultBlock,
28897      canMove,
28898      canRemove,
28899      rootClientId,
28900      blocks,
28901  
28902      onDuplicate() {
28903        return duplicateBlocks(clientIds, updateSelection);
28904      },
28905  
28906      onRemove() {
28907        return removeBlocks(clientIds, updateSelection);
28908      },
28909  
28910      onInsertBefore() {
28911        insertBeforeBlock((0,external_lodash_namespaceObject.first)((0,external_lodash_namespaceObject.castArray)(clientIds)));
28912      },
28913  
28914      onInsertAfter() {
28915        insertAfterBlock((0,external_lodash_namespaceObject.last)((0,external_lodash_namespaceObject.castArray)(clientIds)));
28916      },
28917  
28918      onMoveTo() {
28919        setNavigationMode(true);
28920        selectBlock(clientIds[0]);
28921        setBlockMovingClientId(clientIds[0]);
28922      },
28923  
28924      onGroup() {
28925        if (!blocks.length) {
28926          return;
28927        }
28928  
28929        const groupingBlockName = getGroupingBlockName(); // Activate the `transform` on `core/group` which does the conversion.
28930  
28931        const newBlocks = (0,external_wp_blocks_namespaceObject.switchToBlockType)(blocks, groupingBlockName);
28932  
28933        if (!newBlocks) {
28934          return;
28935        }
28936  
28937        replaceBlocks(clientIds, newBlocks);
28938      },
28939  
28940      onUngroup() {
28941        if (!blocks.length) {
28942          return;
28943        }
28944  
28945        const innerBlocks = blocks[0].innerBlocks;
28946  
28947        if (!innerBlocks.length) {
28948          return;
28949        }
28950  
28951        replaceBlocks(clientIds, innerBlocks);
28952      },
28953  
28954      onCopy() {
28955        const selectedBlockClientIds = blocks.map(_ref2 => {
28956          let {
28957            clientId
28958          } = _ref2;
28959          return clientId;
28960        });
28961  
28962        if (blocks.length === 1) {
28963          flashBlock(selectedBlockClientIds[0]);
28964        }
28965  
28966        notifyCopy('copy', selectedBlockClientIds);
28967      }
28968  
28969    });
28970  }
28971  
28972  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-settings-menu/block-mode-toggle.js
28973  
28974  
28975  /**
28976   * External dependencies
28977   */
28978  
28979  /**
28980   * WordPress dependencies
28981   */
28982  
28983  
28984  
28985  
28986  
28987  
28988  /**
28989   * Internal dependencies
28990   */
28991  
28992  
28993  function BlockModeToggle(_ref) {
28994    let {
28995      blockType,
28996      mode,
28997      onToggleMode,
28998      small = false,
28999      isCodeEditingEnabled = true
29000    } = _ref;
29001  
29002    if (!(0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockType, 'html', true) || !isCodeEditingEnabled) {
29003      return null;
29004    }
29005  
29006    const label = mode === 'visual' ? (0,external_wp_i18n_namespaceObject.__)('Edit as HTML') : (0,external_wp_i18n_namespaceObject.__)('Edit visually');
29007    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
29008      onClick: onToggleMode
29009    }, !small && label);
29010  }
29011  /* harmony default export */ var block_mode_toggle = ((0,external_wp_compose_namespaceObject.compose)([(0,external_wp_data_namespaceObject.withSelect)((select, _ref2) => {
29012    let {
29013      clientId
29014    } = _ref2;
29015    const {
29016      getBlock,
29017      getBlockMode,
29018      getSettings
29019    } = select(store);
29020    const block = getBlock(clientId);
29021    const isCodeEditingEnabled = getSettings().codeEditingEnabled;
29022    return {
29023      mode: getBlockMode(clientId),
29024      blockType: block ? (0,external_wp_blocks_namespaceObject.getBlockType)(block.name) : null,
29025      isCodeEditingEnabled
29026    };
29027  }), (0,external_wp_data_namespaceObject.withDispatch)((dispatch, _ref3) => {
29028    let {
29029      onToggle = external_lodash_namespaceObject.noop,
29030      clientId
29031    } = _ref3;
29032    return {
29033      onToggleMode() {
29034        dispatch(store).toggleBlockMode(clientId);
29035        onToggle();
29036      }
29037  
29038    };
29039  })])(BlockModeToggle));
29040  
29041  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-settings-menu/block-convert-button.js
29042  
29043  
29044  /**
29045   * WordPress dependencies
29046   */
29047  
29048  
29049  function BlockConvertButton(_ref) {
29050    let {
29051      shouldRender,
29052      onClick,
29053      small
29054    } = _ref;
29055  
29056    if (!shouldRender) {
29057      return null;
29058    }
29059  
29060    const label = (0,external_wp_i18n_namespaceObject.__)('Convert to Blocks');
29061  
29062    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
29063      onClick: onClick
29064    }, !small && label);
29065  }
29066  
29067  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-settings-menu/block-html-convert-button.js
29068  /**
29069   * WordPress dependencies
29070   */
29071  
29072  
29073  
29074  /**
29075   * Internal dependencies
29076   */
29077  
29078  
29079  
29080  /* harmony default export */ var block_html_convert_button = ((0,external_wp_compose_namespaceObject.compose)((0,external_wp_data_namespaceObject.withSelect)((select, _ref) => {
29081    let {
29082      clientId
29083    } = _ref;
29084    const block = select(store).getBlock(clientId);
29085    return {
29086      block,
29087      shouldRender: block && block.name === 'core/html'
29088    };
29089  }), (0,external_wp_data_namespaceObject.withDispatch)((dispatch, _ref2) => {
29090    let {
29091      block
29092    } = _ref2;
29093    return {
29094      onClick: () => dispatch(store).replaceBlocks(block.clientId, (0,external_wp_blocks_namespaceObject.rawHandler)({
29095        HTML: (0,external_wp_blocks_namespaceObject.getBlockContent)(block)
29096      }))
29097    };
29098  }))(BlockConvertButton));
29099  
29100  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-settings-menu/block-settings-menu-first-item.js
29101  /**
29102   * WordPress dependencies
29103   */
29104  
29105  const {
29106    Fill: __unstableBlockSettingsMenuFirstItem,
29107    Slot: block_settings_menu_first_item_Slot
29108  } = (0,external_wp_components_namespaceObject.createSlotFill)('__unstableBlockSettingsMenuFirstItem');
29109  __unstableBlockSettingsMenuFirstItem.Slot = block_settings_menu_first_item_Slot;
29110  /* harmony default export */ var block_settings_menu_first_item = (__unstableBlockSettingsMenuFirstItem);
29111  
29112  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/convert-to-group-buttons/index.js
29113  
29114  
29115  /**
29116   * WordPress dependencies
29117   */
29118  
29119  
29120  
29121  
29122  /**
29123   * Internal dependencies
29124   */
29125  
29126  
29127  
29128  
29129  
29130  function ConvertToGroupButton(_ref) {
29131    let {
29132      clientIds,
29133      isGroupable,
29134      isUngroupable,
29135      blocksSelection,
29136      groupingBlockName,
29137      onClose = () => {}
29138    } = _ref;
29139    const {
29140      replaceBlocks
29141    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
29142  
29143    const onConvertToGroup = () => {
29144      // Activate the `transform` on the Grouping Block which does the conversion.
29145      const newBlocks = (0,external_wp_blocks_namespaceObject.switchToBlockType)(blocksSelection, groupingBlockName);
29146  
29147      if (newBlocks) {
29148        replaceBlocks(clientIds, newBlocks);
29149      }
29150    };
29151  
29152    const onConvertFromGroup = () => {
29153      const innerBlocks = blocksSelection[0].innerBlocks;
29154  
29155      if (!innerBlocks.length) {
29156        return;
29157      }
29158  
29159      replaceBlocks(clientIds, innerBlocks);
29160    };
29161  
29162    if (!isGroupable && !isUngroupable) {
29163      return null;
29164    }
29165  
29166    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, isGroupable && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
29167      onClick: () => {
29168        onConvertToGroup();
29169        onClose();
29170      }
29171    }, (0,external_wp_i18n_namespaceObject._x)('Group', 'verb')), isUngroupable && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
29172      onClick: () => {
29173        onConvertFromGroup();
29174        onClose();
29175      }
29176    }, (0,external_wp_i18n_namespaceObject._x)('Ungroup', 'Ungrouping blocks from within a Group block back into individual blocks within the Editor ')));
29177  }
29178  
29179  
29180  
29181  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/convert-to-group-buttons/use-convert-to-group-button-props.js
29182  /**
29183   * WordPress dependencies
29184   */
29185  
29186  
29187  /**
29188   * Internal dependencies
29189   */
29190  
29191  
29192  /**
29193   * Contains the properties `ConvertToGroupButton` component needs.
29194   *
29195   * @typedef {Object} ConvertToGroupButtonProps
29196   * @property {string[]}  clientIds         An array of the selected client ids.
29197   * @property {boolean}   isGroupable       Indicates if the selected blocks can be grouped.
29198   * @property {boolean}   isUngroupable     Indicates if the selected blocks can be ungrouped.
29199   * @property {WPBlock[]} blocksSelection   An array of the selected blocks.
29200   * @property {string}    groupingBlockName The name of block used for handling grouping interactions.
29201   */
29202  
29203  /**
29204   * Returns the properties `ConvertToGroupButton` component needs to work properly.
29205   * It is used in `BlockSettingsMenuControls` to know if `ConvertToGroupButton`
29206   * should be rendered, to avoid ending up with an empty MenuGroup.
29207   *
29208   * @return {ConvertToGroupButtonProps} Returns the properties needed by `ConvertToGroupButton`.
29209   */
29210  
29211  function useConvertToGroupButtonProps() {
29212    const {
29213      clientIds,
29214      isGroupable,
29215      isUngroupable,
29216      blocksSelection,
29217      groupingBlockName
29218    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
29219      var _blocksSelection$;
29220  
29221      const {
29222        getBlockRootClientId,
29223        getBlocksByClientId,
29224        canInsertBlockType,
29225        getSelectedBlockClientIds
29226      } = select(store);
29227      const {
29228        getGroupingBlockName
29229      } = select(external_wp_blocks_namespaceObject.store);
29230  
29231      const _clientIds = getSelectedBlockClientIds();
29232  
29233      const _groupingBlockName = getGroupingBlockName();
29234  
29235      const rootClientId = !!(_clientIds !== null && _clientIds !== void 0 && _clientIds.length) ? getBlockRootClientId(_clientIds[0]) : undefined;
29236      const groupingBlockAvailable = canInsertBlockType(_groupingBlockName, rootClientId);
29237  
29238      const _blocksSelection = getBlocksByClientId(_clientIds);
29239  
29240      const isSingleGroupingBlock = _blocksSelection.length === 1 && ((_blocksSelection$ = _blocksSelection[0]) === null || _blocksSelection$ === void 0 ? void 0 : _blocksSelection$.name) === _groupingBlockName; // Do we have
29241      // 1. Grouping block available to be inserted?
29242      // 2. One or more blocks selected
29243  
29244      const _isGroupable = groupingBlockAvailable && _blocksSelection.length; // Do we have a single Group Block selected and does that group have inner blocks?
29245  
29246  
29247      const _isUngroupable = isSingleGroupingBlock && !!_blocksSelection[0].innerBlocks.length;
29248  
29249      return {
29250        clientIds: _clientIds,
29251        isGroupable: _isGroupable,
29252        isUngroupable: _isUngroupable,
29253        blocksSelection: _blocksSelection,
29254        groupingBlockName: _groupingBlockName
29255      };
29256    }, []);
29257    return {
29258      clientIds,
29259      isGroupable,
29260      isUngroupable,
29261      blocksSelection,
29262      groupingBlockName
29263    };
29264  }
29265  
29266  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/unlock.js
29267  
29268  
29269  /**
29270   * WordPress dependencies
29271   */
29272  
29273  const unlock = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
29274    viewBox: "0 0 24 24",
29275    xmlns: "http://www.w3.org/2000/svg"
29276  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
29277    d: "M17 10h-1.2V7c0-2.1-1.7-3.8-3.8-3.8-2.1 0-3.8 1.7-3.8 3.8h1.5c0-1.2 1-2.2 2.2-2.2s2.2 1 2.2 2.2v3H7c-.6 0-1 .4-1 1v8c0 .6.4 1 1 1h10c.6 0 1-.4 1-1v-8c0-.6-.4-1-1-1z"
29278  }));
29279  /* harmony default export */ var library_unlock = (unlock);
29280  
29281  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/lock.js
29282  
29283  
29284  /**
29285   * WordPress dependencies
29286   */
29287  
29288  const lock = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
29289    viewBox: "0 0 24 24",
29290    xmlns: "http://www.w3.org/2000/svg"
29291  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
29292    d: "M17 10h-1.2V7c0-2.1-1.7-3.8-3.8-3.8-2.1 0-3.8 1.7-3.8 3.8v3H7c-.6 0-1 .4-1 1v8c0 .6.4 1 1 1h10c.6 0 1-.4 1-1v-8c0-.6-.4-1-1-1zm-2.8 0H9.8V7c0-1.2 1-2.2 2.2-2.2s2.2 1 2.2 2.2v3z"
29293  }));
29294  /* harmony default export */ var library_lock = (lock);
29295  
29296  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-lock/use-block-lock.js
29297  /**
29298   * WordPress dependencies
29299   */
29300  
29301  /**
29302   * Internal dependencies
29303   */
29304  
29305  
29306  /**
29307   * Return details about the block lock status.
29308   *
29309   * @param {string} clientId The block client Id.
29310   *
29311   * @return {Object} Block lock status
29312   */
29313  
29314  function useBlockLock(clientId) {
29315    return (0,external_wp_data_namespaceObject.useSelect)(select => {
29316      const {
29317        canMoveBlock,
29318        canRemoveBlock,
29319        canLockBlockType,
29320        getBlockName,
29321        getBlockRootClientId
29322      } = select(store);
29323      const rootClientId = getBlockRootClientId(clientId);
29324      const canMove = canMoveBlock(clientId, rootClientId);
29325      const canRemove = canRemoveBlock(clientId, rootClientId);
29326      return {
29327        canMove,
29328        canRemove,
29329        canLock: canLockBlockType(getBlockName(clientId)),
29330        isLocked: !canMove || !canRemove
29331      };
29332    }, [clientId]);
29333  }
29334  
29335  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-lock/modal.js
29336  
29337  
29338  /**
29339   * WordPress dependencies
29340   */
29341  
29342  
29343  
29344  
29345  
29346  
29347  /**
29348   * Internal dependencies
29349   */
29350  
29351  
29352  
29353  
29354  function BlockLockModal(_ref) {
29355    let {
29356      clientId,
29357      onClose
29358    } = _ref;
29359    const [lock, setLock] = (0,external_wp_element_namespaceObject.useState)({
29360      move: false,
29361      remove: false
29362    });
29363    const {
29364      canMove,
29365      canRemove
29366    } = useBlockLock(clientId);
29367    const {
29368      updateBlockAttributes
29369    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
29370    const blockInformation = useBlockDisplayInformation(clientId);
29371    const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(BlockLockModal, 'block-editor-block-lock-modal__options-title');
29372    (0,external_wp_element_namespaceObject.useEffect)(() => {
29373      setLock({
29374        move: !canMove,
29375        remove: !canRemove
29376      });
29377    }, [canMove, canRemove]);
29378    const isAllChecked = Object.values(lock).every(Boolean);
29379    const isMixed = Object.values(lock).some(Boolean) && !isAllChecked;
29380    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Modal, {
29381      title: (0,external_wp_i18n_namespaceObject.sprintf)(
29382      /* translators: %s: Name of the block. */
29383      (0,external_wp_i18n_namespaceObject.__)('Lock %s'), blockInformation.title),
29384      overlayClassName: "block-editor-block-lock-modal",
29385      closeLabel: (0,external_wp_i18n_namespaceObject.__)('Close'),
29386      onRequestClose: onClose
29387    }, (0,external_wp_element_namespaceObject.createElement)("form", {
29388      onSubmit: event => {
29389        event.preventDefault();
29390        updateBlockAttributes([clientId], {
29391          lock
29392        });
29393        onClose();
29394      }
29395    }, (0,external_wp_element_namespaceObject.createElement)("p", null, (0,external_wp_i18n_namespaceObject.__)('Choose specific attributes to restrict or lock all available options.')), (0,external_wp_element_namespaceObject.createElement)("div", {
29396      role: "group",
29397      "aria-labelledby": instanceId,
29398      className: "block-editor-block-lock-modal__options"
29399    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.CheckboxControl, {
29400      className: "block-editor-block-lock-modal__options-title",
29401      label: (0,external_wp_element_namespaceObject.createElement)("span", {
29402        id: instanceId
29403      }, (0,external_wp_i18n_namespaceObject.__)('Lock all')),
29404      checked: isAllChecked,
29405      indeterminate: isMixed,
29406      onChange: newValue => setLock({
29407        move: newValue,
29408        remove: newValue
29409      })
29410    }), (0,external_wp_element_namespaceObject.createElement)("ul", {
29411      className: "block-editor-block-lock-modal__checklist"
29412    }, (0,external_wp_element_namespaceObject.createElement)("li", {
29413      className: "block-editor-block-lock-modal__checklist-item"
29414    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.CheckboxControl, {
29415      label: (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_i18n_namespaceObject.__)('Disable movement'), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Icon, {
29416        icon: lock.move ? library_lock : library_unlock
29417      })),
29418      checked: lock.move,
29419      onChange: move => setLock(prevLock => ({ ...prevLock,
29420        move
29421      }))
29422    })), (0,external_wp_element_namespaceObject.createElement)("li", {
29423      className: "block-editor-block-lock-modal__checklist-item"
29424    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.CheckboxControl, {
29425      label: (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_i18n_namespaceObject.__)('Prevent removal'), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Icon, {
29426        icon: lock.remove ? library_lock : library_unlock
29427      })),
29428      checked: lock.remove,
29429      onChange: remove => setLock(prevLock => ({ ...prevLock,
29430        remove
29431      }))
29432    })))), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Flex, {
29433      className: "block-editor-block-lock-modal__actions",
29434      justify: "flex-end",
29435      expanded: false
29436    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.FlexItem, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
29437      variant: "tertiary",
29438      onClick: onClose
29439    }, (0,external_wp_i18n_namespaceObject.__)('Cancel'))), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.FlexItem, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
29440      variant: "primary",
29441      type: "submit"
29442    }, (0,external_wp_i18n_namespaceObject.__)('Apply'))))));
29443  }
29444  
29445  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-lock/menu-item.js
29446  
29447  
29448  /**
29449   * WordPress dependencies
29450   */
29451  
29452  
29453  
29454  
29455  /**
29456   * Internal dependencies
29457   */
29458  
29459  
29460  
29461  function BlockLockMenuItem(_ref) {
29462    let {
29463      clientId
29464    } = _ref;
29465    const {
29466      canLock,
29467      isLocked
29468    } = useBlockLock(clientId);
29469    const [isModalOpen, toggleModal] = (0,external_wp_element_namespaceObject.useReducer)(isActive => !isActive, false);
29470  
29471    if (!canLock) {
29472      return null;
29473    }
29474  
29475    const label = isLocked ? (0,external_wp_i18n_namespaceObject.__)('Unlock') : (0,external_wp_i18n_namespaceObject.__)('Lock');
29476    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
29477      icon: isLocked ? library_unlock : library_lock,
29478      onClick: toggleModal
29479    }, label), isModalOpen && (0,external_wp_element_namespaceObject.createElement)(BlockLockModal, {
29480      clientId: clientId,
29481      onClose: toggleModal
29482    }));
29483  }
29484  
29485  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-settings-menu-controls/index.js
29486  
29487  
29488  
29489  /**
29490   * External dependencies
29491   */
29492  
29493  /**
29494   * WordPress dependencies
29495   */
29496  
29497  
29498  
29499  /**
29500   * Internal dependencies
29501   */
29502  
29503  
29504  
29505  
29506  const {
29507    Fill,
29508    Slot: block_settings_menu_controls_Slot
29509  } = (0,external_wp_components_namespaceObject.createSlotFill)('BlockSettingsMenuControls');
29510  
29511  const BlockSettingsMenuControlsSlot = _ref => {
29512    let {
29513      fillProps,
29514      clientIds = null
29515    } = _ref;
29516    const {
29517      selectedBlocks,
29518      selectedClientIds,
29519      canRemove
29520    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
29521      const {
29522        getBlocksByClientId,
29523        getSelectedBlockClientIds,
29524        canRemoveBlocks
29525      } = select(store);
29526      const ids = clientIds !== null ? clientIds : getSelectedBlockClientIds();
29527      return {
29528        selectedBlocks: (0,external_lodash_namespaceObject.map)((0,external_lodash_namespaceObject.compact)(getBlocksByClientId(ids)), block => block.name),
29529        selectedClientIds: ids,
29530        canRemove: canRemoveBlocks(ids)
29531      };
29532    }, [clientIds]);
29533    const showLockButton = selectedClientIds.length === 1; // Check if current selection of blocks is Groupable or Ungroupable
29534    // and pass this props down to ConvertToGroupButton.
29535  
29536    const convertToGroupButtonProps = useConvertToGroupButtonProps();
29537    const {
29538      isGroupable,
29539      isUngroupable
29540    } = convertToGroupButtonProps;
29541    const showConvertToGroupButton = (isGroupable || isUngroupable) && canRemove;
29542    return (0,external_wp_element_namespaceObject.createElement)(block_settings_menu_controls_Slot, {
29543      fillProps: { ...fillProps,
29544        selectedBlocks,
29545        selectedClientIds
29546      }
29547    }, fills => {
29548      if (!(fills !== null && fills !== void 0 && fills.length) > 0 && !showConvertToGroupButton && !showLockButton) {
29549        return null;
29550      }
29551  
29552      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuGroup, null, showLockButton && (0,external_wp_element_namespaceObject.createElement)(BlockLockMenuItem, {
29553        clientId: selectedClientIds[0]
29554      }), fills, showConvertToGroupButton && (0,external_wp_element_namespaceObject.createElement)(ConvertToGroupButton, _extends({}, convertToGroupButtonProps, {
29555        onClose: fillProps === null || fillProps === void 0 ? void 0 : fillProps.onClose
29556      })));
29557    });
29558  };
29559  /**
29560   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/block-settings-menu-controls/README.md
29561   *
29562   * @param {Object} props Fill props.
29563   * @return {WPElement} Element.
29564   */
29565  
29566  
29567  function BlockSettingsMenuControls(_ref2) {
29568    let { ...props
29569    } = _ref2;
29570    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalStyleProvider, {
29571      document: document
29572    }, (0,external_wp_element_namespaceObject.createElement)(Fill, props));
29573  }
29574  
29575  BlockSettingsMenuControls.Slot = BlockSettingsMenuControlsSlot;
29576  /* harmony default export */ var block_settings_menu_controls = (BlockSettingsMenuControls);
29577  
29578  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-settings-menu/block-settings-dropdown.js
29579  
29580  
29581  
29582  /**
29583   * External dependencies
29584   */
29585  
29586  /**
29587   * WordPress dependencies
29588   */
29589  
29590  
29591  
29592  
29593  
29594  
29595  
29596  
29597  
29598  /**
29599   * Internal dependencies
29600   */
29601  
29602  
29603  
29604  
29605  
29606  
29607  
29608  
29609  
29610  
29611  const block_settings_dropdown_POPOVER_PROPS = {
29612    className: 'block-editor-block-settings-menu__popover',
29613    position: 'bottom right',
29614    isAlternate: true
29615  };
29616  
29617  function CopyMenuItem(_ref) {
29618    let {
29619      blocks,
29620      onCopy
29621    } = _ref;
29622    const ref = (0,external_wp_compose_namespaceObject.useCopyToClipboard)(() => (0,external_wp_blocks_namespaceObject.serialize)(blocks), onCopy);
29623    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
29624      ref: ref
29625    }, (0,external_wp_i18n_namespaceObject.__)('Copy'));
29626  }
29627  
29628  function BlockSettingsDropdown(_ref2) {
29629    let {
29630      clientIds,
29631      __experimentalSelectBlock,
29632      children,
29633      ...props
29634    } = _ref2;
29635    const blockClientIds = (0,external_lodash_namespaceObject.castArray)(clientIds);
29636    const count = blockClientIds.length;
29637    const firstBlockClientId = blockClientIds[0];
29638    const {
29639      firstParentClientId,
29640      hasReducedUI,
29641      onlyBlock,
29642      parentBlockType,
29643      previousBlockClientId,
29644      nextBlockClientId,
29645      selectedBlockClientIds
29646    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
29647      const {
29648        getBlockCount,
29649        getBlockName,
29650        getBlockParents,
29651        getPreviousBlockClientId,
29652        getNextBlockClientId,
29653        getSelectedBlockClientIds,
29654        getSettings
29655      } = select(store);
29656      const parents = getBlockParents(firstBlockClientId);
29657      const _firstParentClientId = parents[parents.length - 1];
29658      const parentBlockName = getBlockName(_firstParentClientId);
29659      return {
29660        firstParentClientId: _firstParentClientId,
29661        hasReducedUI: getSettings().hasReducedUI,
29662        onlyBlock: 1 === getBlockCount(),
29663        parentBlockType: (0,external_wp_blocks_namespaceObject.getBlockType)(parentBlockName),
29664        previousBlockClientId: getPreviousBlockClientId(firstBlockClientId),
29665        nextBlockClientId: getNextBlockClientId(firstBlockClientId),
29666        selectedBlockClientIds: getSelectedBlockClientIds()
29667      };
29668    }, [firstBlockClientId]);
29669    const shortcuts = (0,external_wp_data_namespaceObject.useSelect)(select => {
29670      const {
29671        getShortcutRepresentation
29672      } = select(external_wp_keyboardShortcuts_namespaceObject.store);
29673      return {
29674        duplicate: getShortcutRepresentation('core/block-editor/duplicate'),
29675        remove: getShortcutRepresentation('core/block-editor/remove'),
29676        insertAfter: getShortcutRepresentation('core/block-editor/insert-after'),
29677        insertBefore: getShortcutRepresentation('core/block-editor/insert-before')
29678      };
29679    }, []);
29680    const {
29681      selectBlock,
29682      toggleBlockHighlight
29683    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
29684    const updateSelectionAfterDuplicate = (0,external_wp_element_namespaceObject.useCallback)(__experimentalSelectBlock ? async clientIdsPromise => {
29685      const ids = await clientIdsPromise;
29686  
29687      if (ids && ids[0]) {
29688        __experimentalSelectBlock(ids[0]);
29689      }
29690    } : external_lodash_namespaceObject.noop, [__experimentalSelectBlock]);
29691    const blockTitle = useBlockDisplayTitle(firstBlockClientId, 25);
29692    const updateSelectionAfterRemove = (0,external_wp_element_namespaceObject.useCallback)(__experimentalSelectBlock ? () => {
29693      const blockToSelect = previousBlockClientId || nextBlockClientId;
29694  
29695      if (blockToSelect && // From the block options dropdown, it's possible to remove a block that is not selected,
29696      // in this case, it's not necessary to update the selection since the selected block wasn't removed.
29697      selectedBlockClientIds.includes(firstBlockClientId) && // Don't update selection when next/prev block also is in the selection ( and gets removed ),
29698      // In case someone selects all blocks and removes them at once.
29699      !selectedBlockClientIds.includes(blockToSelect)) {
29700        __experimentalSelectBlock(blockToSelect);
29701      }
29702    } : external_lodash_namespaceObject.noop, [__experimentalSelectBlock, previousBlockClientId, nextBlockClientId, selectedBlockClientIds]);
29703    const label = (0,external_wp_i18n_namespaceObject.sprintf)(
29704    /* translators: %s: block name */
29705    (0,external_wp_i18n_namespaceObject.__)('Remove %s'), blockTitle);
29706    const removeBlockLabel = count === 1 ? label : (0,external_wp_i18n_namespaceObject.__)('Remove blocks'); // Allows highlighting the parent block outline when focusing or hovering
29707    // the parent block selector within the child.
29708  
29709    const selectParentButtonRef = (0,external_wp_element_namespaceObject.useRef)();
29710    const {
29711      gestures: showParentOutlineGestures
29712    } = useShowMoversGestures({
29713      ref: selectParentButtonRef,
29714  
29715      onChange(isFocused) {
29716        if (isFocused && hasReducedUI) {
29717          return;
29718        }
29719  
29720        toggleBlockHighlight(firstParentClientId, isFocused);
29721      }
29722  
29723    });
29724    return (0,external_wp_element_namespaceObject.createElement)(BlockActions, {
29725      clientIds: clientIds,
29726      __experimentalUpdateSelection: !__experimentalSelectBlock
29727    }, _ref3 => {
29728      let {
29729        canDuplicate,
29730        canInsertDefaultBlock,
29731        canMove,
29732        canRemove,
29733        onDuplicate,
29734        onInsertAfter,
29735        onInsertBefore,
29736        onRemove,
29737        onCopy,
29738        onMoveTo,
29739        blocks
29740      } = _ref3;
29741      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.DropdownMenu, _extends({
29742        icon: more_vertical,
29743        label: (0,external_wp_i18n_namespaceObject.__)('Options'),
29744        className: "block-editor-block-settings-menu",
29745        popoverProps: block_settings_dropdown_POPOVER_PROPS,
29746        noIcons: true
29747      }, props), _ref4 => {
29748        let {
29749          onClose
29750        } = _ref4;
29751        return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuGroup, null, (0,external_wp_element_namespaceObject.createElement)(block_settings_menu_first_item.Slot, {
29752          fillProps: {
29753            onClose
29754          }
29755        }), firstParentClientId !== undefined && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, _extends({}, showParentOutlineGestures, {
29756          ref: selectParentButtonRef,
29757          icon: (0,external_wp_element_namespaceObject.createElement)(block_icon, {
29758            icon: parentBlockType.icon
29759          }),
29760          onClick: () => selectBlock(firstParentClientId)
29761        }), (0,external_wp_i18n_namespaceObject.sprintf)(
29762        /* translators: %s: Name of the block's parent. */
29763        (0,external_wp_i18n_namespaceObject.__)('Select parent block (%s)'), parentBlockType.title)), count === 1 && (0,external_wp_element_namespaceObject.createElement)(block_html_convert_button, {
29764          clientId: firstBlockClientId
29765        }), (0,external_wp_element_namespaceObject.createElement)(CopyMenuItem, {
29766          blocks: blocks,
29767          onCopy: onCopy
29768        }), canDuplicate && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
29769          onClick: (0,external_lodash_namespaceObject.flow)(onClose, onDuplicate, updateSelectionAfterDuplicate),
29770          shortcut: shortcuts.duplicate
29771        }, (0,external_wp_i18n_namespaceObject.__)('Duplicate')), canInsertDefaultBlock && (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
29772          onClick: (0,external_lodash_namespaceObject.flow)(onClose, onInsertBefore),
29773          shortcut: shortcuts.insertBefore
29774        }, (0,external_wp_i18n_namespaceObject.__)('Insert before')), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
29775          onClick: (0,external_lodash_namespaceObject.flow)(onClose, onInsertAfter),
29776          shortcut: shortcuts.insertAfter
29777        }, (0,external_wp_i18n_namespaceObject.__)('Insert after'))), canMove && !onlyBlock && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
29778          onClick: (0,external_lodash_namespaceObject.flow)(onClose, onMoveTo)
29779        }, (0,external_wp_i18n_namespaceObject.__)('Move to')), count === 1 && (0,external_wp_element_namespaceObject.createElement)(block_mode_toggle, {
29780          clientId: firstBlockClientId,
29781          onToggle: onClose
29782        })), (0,external_wp_element_namespaceObject.createElement)(block_settings_menu_controls.Slot, {
29783          fillProps: {
29784            onClose
29785          },
29786          clientIds: clientIds
29787        }), typeof children === 'function' ? children({
29788          onClose
29789        }) : external_wp_element_namespaceObject.Children.map(child => (0,external_wp_element_namespaceObject.cloneElement)(child, {
29790          onClose
29791        })), canRemove && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuGroup, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
29792          onClick: (0,external_lodash_namespaceObject.flow)(onClose, onRemove, updateSelectionAfterRemove),
29793          shortcut: shortcuts.remove
29794        }, removeBlockLabel)));
29795      });
29796    });
29797  }
29798  /* harmony default export */ var block_settings_dropdown = (BlockSettingsDropdown);
29799  
29800  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-settings-menu/index.js
29801  
29802  
29803  
29804  /**
29805   * WordPress dependencies
29806   */
29807  
29808  /**
29809   * Internal dependencies
29810   */
29811  
29812  
29813  function BlockSettingsMenu(_ref) {
29814    let {
29815      clientIds,
29816      ...props
29817    } = _ref;
29818    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarGroup, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarItem, null, toggleProps => (0,external_wp_element_namespaceObject.createElement)(block_settings_dropdown, _extends({
29819      clientIds: clientIds,
29820      toggleProps: toggleProps
29821    }, props))));
29822  }
29823  /* harmony default export */ var block_settings_menu = (BlockSettingsMenu);
29824  
29825  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-lock/toolbar.js
29826  
29827  
29828  /**
29829   * WordPress dependencies
29830   */
29831  
29832  
29833  
29834  
29835  /**
29836   * Internal dependencies
29837   */
29838  
29839  
29840  
29841  
29842  function BlockLockToolbar(_ref) {
29843    let {
29844      clientId
29845    } = _ref;
29846    const blockInformation = useBlockDisplayInformation(clientId);
29847    const {
29848      canMove,
29849      canRemove,
29850      canLock
29851    } = useBlockLock(clientId);
29852    const [isModalOpen, toggleModal] = (0,external_wp_element_namespaceObject.useReducer)(isActive => !isActive, false);
29853  
29854    if (!canLock) {
29855      return null;
29856    }
29857  
29858    if (canMove && canRemove) {
29859      return null;
29860    }
29861  
29862    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarGroup, {
29863      className: "block-editor-block-lock-toolbar"
29864    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarButton, {
29865      icon: library_lock,
29866      label: (0,external_wp_i18n_namespaceObject.sprintf)(
29867      /* translators: %s: block name */
29868      (0,external_wp_i18n_namespaceObject.__)('Unlock %s'), blockInformation.title),
29869      onClick: toggleModal
29870    })), isModalOpen && (0,external_wp_element_namespaceObject.createElement)(BlockLockModal, {
29871      clientId: clientId,
29872      onClose: toggleModal
29873    }));
29874  }
29875  
29876  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/group.js
29877  
29878  
29879  /**
29880   * WordPress dependencies
29881   */
29882  
29883  const group_group = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
29884    viewBox: "0 0 24 24",
29885    xmlns: "http://www.w3.org/2000/svg"
29886  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
29887    d: "M18 4h-7c-1.1 0-2 .9-2 2v3H6c-1.1 0-2 .9-2 2v7c0 1.1.9 2 2 2h7c1.1 0 2-.9 2-2v-3h3c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-4.5 14c0 .3-.2.5-.5.5H6c-.3 0-.5-.2-.5-.5v-7c0-.3.2-.5.5-.5h3V13c0 1.1.9 2 2 2h2.5v3zm0-4.5H11c-.3 0-.5-.2-.5-.5v-2.5H13c.3 0 .5.2.5.5v2.5zm5-.5c0 .3-.2.5-.5.5h-3V11c0-1.1-.9-2-2-2h-2.5V6c0-.3.2-.5.5-.5h7c.3 0 .5.2.5.5v7z"
29888  }));
29889  /* harmony default export */ var library_group = (group_group);
29890  
29891  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/row.js
29892  
29893  
29894  /**
29895   * WordPress dependencies
29896   */
29897  
29898  const row = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
29899    xmlns: "http://www.w3.org/2000/svg",
29900    viewBox: "0 0 24 24"
29901  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
29902    d: "M9.2 6.5H4V8h5.2c.3 0 .5.2.5.5v7c0 .3-.2.5-.5.5H4v1.5h5.2c1.1 0 2-.9 2-2v-7c0-1.1-.8-2-2-2zM14.8 8H20V6.5h-5.2c-1.1 0-2 .9-2 2v7c0 1.1.9 2 2 2H20V16h-5.2c-.3 0-.5-.2-.5-.5v-7c-.1-.3.2-.5.5-.5z"
29903  }));
29904  /* harmony default export */ var library_row = (row);
29905  
29906  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/stack.js
29907  
29908  
29909  /**
29910   * WordPress dependencies
29911   */
29912  
29913  const stack = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
29914    xmlns: "http://www.w3.org/2000/svg",
29915    viewBox: "0 0 24 24"
29916  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
29917    d: "M16 4v5.2c0 .3-.2.5-.5.5h-7c-.3.1-.5-.2-.5-.5V4H6.5v5.2c0 1.1.9 2 2 2h7c1.1 0 2-.9 2-2V4H16zm-.5 8.8h-7c-1.1 0-2 .9-2 2V20H8v-5.2c0-.3.2-.5.5-.5h7c.3 0 .5.2.5.5V20h1.5v-5.2c0-1.2-.9-2-2-2z"
29918  }));
29919  /* harmony default export */ var library_stack = (stack);
29920  
29921  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/convert-to-group-buttons/toolbar.js
29922  
29923  
29924  /**
29925   * WordPress dependencies
29926   */
29927  
29928  
29929  
29930  
29931  
29932  /**
29933   * Internal dependencies
29934   */
29935  
29936  
29937  
29938  const layouts = {
29939    group: undefined,
29940    row: {
29941      type: 'flex',
29942      flexWrap: 'nowrap'
29943    },
29944    stack: {
29945      type: 'flex',
29946      orientation: 'vertical'
29947    }
29948  };
29949  
29950  function BlockGroupToolbar() {
29951    const {
29952      blocksSelection,
29953      clientIds,
29954      groupingBlockName,
29955      isGroupable
29956    } = useConvertToGroupButtonProps();
29957    const {
29958      replaceBlocks
29959    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
29960    const {
29961      canRemove
29962    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
29963      const {
29964        canRemoveBlocks
29965      } = select(store);
29966      return {
29967        canRemove: canRemoveBlocks(clientIds)
29968      };
29969    }, [clientIds]);
29970  
29971    const onConvertToGroup = function () {
29972      let layout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'group';
29973      const newBlocks = (0,external_wp_blocks_namespaceObject.switchToBlockType)(blocksSelection, groupingBlockName);
29974  
29975      if (newBlocks && newBlocks.length > 0) {
29976        // Because the block is not in the store yet we can't use
29977        // updateBlockAttributes so need to manually update attributes.
29978        newBlocks[0].attributes.layout = layouts[layout];
29979        replaceBlocks(clientIds, newBlocks);
29980      }
29981    };
29982  
29983    const onConvertToRow = () => onConvertToGroup('row');
29984  
29985    const onConvertToStack = () => onConvertToGroup('stack'); // Don't render the button if the current selection cannot be grouped.
29986    // A good example is selecting multiple button blocks within a Buttons block:
29987    // The group block is not a valid child of Buttons, so we should not show the button.
29988    // Any blocks that are locked against removal also cannot be grouped.
29989  
29990  
29991    if (!isGroupable || !canRemove) {
29992      return null;
29993    }
29994  
29995    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarGroup, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarButton, {
29996      icon: library_group,
29997      label: (0,external_wp_i18n_namespaceObject._x)('Group', 'verb'),
29998      onClick: onConvertToGroup
29999    }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarButton, {
30000      icon: library_row,
30001      label: (0,external_wp_i18n_namespaceObject._x)('Row', 'single horizontal line'),
30002      onClick: onConvertToRow
30003    }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarButton, {
30004      icon: library_stack,
30005      label: (0,external_wp_i18n_namespaceObject._x)('Stack', 'verb'),
30006      onClick: onConvertToStack
30007    }));
30008  }
30009  
30010  /* harmony default export */ var toolbar = (BlockGroupToolbar);
30011  
30012  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-toolbar/block-name-context.js
30013  /**
30014   * WordPress dependencies
30015   */
30016  
30017  
30018  const __unstableBlockNameContext = (0,external_wp_element_namespaceObject.createContext)('');
30019  
30020  /* harmony default export */ var block_name_context = (__unstableBlockNameContext);
30021  
30022  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-toolbar/index.js
30023  
30024  
30025  
30026  /**
30027   * External dependencies
30028   */
30029  
30030  /**
30031   * WordPress dependencies
30032   */
30033  
30034  
30035  
30036  
30037  
30038  
30039  /**
30040   * Internal dependencies
30041   */
30042  
30043  
30044  
30045  
30046  
30047  
30048  
30049  
30050  
30051  
30052  
30053  
30054  
30055  const BlockToolbar = _ref => {
30056    let {
30057      hideDragHandle
30058    } = _ref;
30059    const {
30060      blockClientIds,
30061      blockClientId,
30062      blockType,
30063      hasFixedToolbar,
30064      hasReducedUI,
30065      isValid,
30066      isVisual
30067    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
30068      const {
30069        getBlockName,
30070        getBlockMode,
30071        getSelectedBlockClientIds,
30072        isBlockValid,
30073        getBlockRootClientId,
30074        getSettings
30075      } = select(store);
30076      const selectedBlockClientIds = getSelectedBlockClientIds();
30077      const selectedBlockClientId = selectedBlockClientIds[0];
30078      const blockRootClientId = getBlockRootClientId(selectedBlockClientId);
30079      const settings = getSettings();
30080      return {
30081        blockClientIds: selectedBlockClientIds,
30082        blockClientId: selectedBlockClientId,
30083        blockType: selectedBlockClientId && (0,external_wp_blocks_namespaceObject.getBlockType)(getBlockName(selectedBlockClientId)),
30084        hasFixedToolbar: settings.hasFixedToolbar,
30085        hasReducedUI: settings.hasReducedUI,
30086        rootClientId: blockRootClientId,
30087        isValid: selectedBlockClientIds.every(id => isBlockValid(id)),
30088        isVisual: selectedBlockClientIds.every(id => getBlockMode(id) === 'visual')
30089      };
30090    }, []); // Handles highlighting the current block outline on hover or focus of the
30091    // block type toolbar area.
30092  
30093    const {
30094      toggleBlockHighlight
30095    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
30096    const nodeRef = (0,external_wp_element_namespaceObject.useRef)();
30097    const {
30098      showMovers,
30099      gestures: showMoversGestures
30100    } = useShowMoversGestures({
30101      ref: nodeRef,
30102  
30103      onChange(isFocused) {
30104        if (isFocused && hasReducedUI) {
30105          return;
30106        }
30107  
30108        toggleBlockHighlight(blockClientId, isFocused);
30109      }
30110  
30111    }); // Account for the cases where the block toolbar is rendered within the
30112    // header area and not contextually to the block.
30113  
30114    const displayHeaderToolbar = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium', '<') || hasFixedToolbar;
30115  
30116    if (blockType) {
30117      if (!(0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockType, '__experimentalToolbar', true)) {
30118        return null;
30119      }
30120    }
30121  
30122    const shouldShowMovers = displayHeaderToolbar || showMovers;
30123  
30124    if (blockClientIds.length === 0) {
30125      return null;
30126    }
30127  
30128    const shouldShowVisualToolbar = isValid && isVisual;
30129    const isMultiToolbar = blockClientIds.length > 1;
30130    const classes = classnames_default()('block-editor-block-toolbar', shouldShowMovers && 'is-showing-movers');
30131    return (0,external_wp_element_namespaceObject.createElement)("div", {
30132      className: classes
30133    }, !isMultiToolbar && !displayHeaderToolbar && (0,external_wp_element_namespaceObject.createElement)(BlockParentSelector, {
30134      clientIds: blockClientIds
30135    }), (0,external_wp_element_namespaceObject.createElement)("div", _extends({
30136      ref: nodeRef
30137    }, showMoversGestures), (shouldShowVisualToolbar || isMultiToolbar) && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarGroup, {
30138      className: "block-editor-block-toolbar__block-controls"
30139    }, (0,external_wp_element_namespaceObject.createElement)(block_switcher, {
30140      clientIds: blockClientIds
30141    }), !isMultiToolbar && (0,external_wp_element_namespaceObject.createElement)(BlockLockToolbar, {
30142      clientId: blockClientIds[0]
30143    }), (0,external_wp_element_namespaceObject.createElement)(block_mover, {
30144      clientIds: blockClientIds,
30145      hideDragHandle: hideDragHandle || hasReducedUI
30146    }))), shouldShowVisualToolbar && isMultiToolbar && (0,external_wp_element_namespaceObject.createElement)(toolbar, null), shouldShowVisualToolbar && (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(block_controls.Slot, {
30147      group: "parent",
30148      className: "block-editor-block-toolbar__slot"
30149    }), (0,external_wp_element_namespaceObject.createElement)(block_controls.Slot, {
30150      group: "block",
30151      className: "block-editor-block-toolbar__slot"
30152    }), (0,external_wp_element_namespaceObject.createElement)(block_controls.Slot, {
30153      className: "block-editor-block-toolbar__slot"
30154    }), (0,external_wp_element_namespaceObject.createElement)(block_controls.Slot, {
30155      group: "inline",
30156      className: "block-editor-block-toolbar__slot"
30157    }), (0,external_wp_element_namespaceObject.createElement)(block_controls.Slot, {
30158      group: "other",
30159      className: "block-editor-block-toolbar__slot"
30160    }), (0,external_wp_element_namespaceObject.createElement)(block_name_context.Provider, {
30161      value: blockType === null || blockType === void 0 ? void 0 : blockType.name
30162    }, (0,external_wp_element_namespaceObject.createElement)(block_toolbar_last_item.Slot, null))), (0,external_wp_element_namespaceObject.createElement)(block_settings_menu, {
30163      clientIds: blockClientIds
30164    }));
30165  };
30166  /**
30167   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/block-toolbar/README.md
30168   */
30169  
30170  
30171  /* harmony default export */ var block_toolbar = (BlockToolbar);
30172  
30173  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-tools/block-contextual-toolbar.js
30174  
30175  
30176  
30177  /**
30178   * External dependencies
30179   */
30180  
30181  /**
30182   * WordPress dependencies
30183   */
30184  
30185  
30186  
30187  
30188  /**
30189   * Internal dependencies
30190   */
30191  
30192  
30193  
30194  
30195  
30196  function BlockContextualToolbar(_ref) {
30197    let {
30198      focusOnMount,
30199      isFixed,
30200      ...props
30201    } = _ref;
30202    const {
30203      blockType,
30204      hasParents,
30205      showParentSelector
30206    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
30207      const {
30208        getBlockName,
30209        getBlockParents,
30210        getSelectedBlockClientIds
30211      } = select(store);
30212      const {
30213        getBlockType
30214      } = select(external_wp_blocks_namespaceObject.store);
30215      const selectedBlockClientIds = getSelectedBlockClientIds();
30216      const selectedBlockClientId = selectedBlockClientIds[0];
30217      const parents = getBlockParents(selectedBlockClientId);
30218      const firstParentClientId = parents[parents.length - 1];
30219      const parentBlockName = getBlockName(firstParentClientId);
30220      const parentBlockType = getBlockType(parentBlockName);
30221      return {
30222        blockType: selectedBlockClientId && getBlockType(getBlockName(selectedBlockClientId)),
30223        hasParents: parents.length,
30224        showParentSelector: (0,external_wp_blocks_namespaceObject.hasBlockSupport)(parentBlockType, '__experimentalParentSelector', true) && selectedBlockClientIds.length <= 1
30225      };
30226    }, []);
30227  
30228    if (blockType) {
30229      if (!(0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockType, '__experimentalToolbar', true)) {
30230        return null;
30231      }
30232    } // Shifts the toolbar to make room for the parent block selector.
30233  
30234  
30235    const classes = classnames_default()('block-editor-block-contextual-toolbar', {
30236      'has-parent': hasParents && showParentSelector,
30237      'is-fixed': isFixed
30238    });
30239    return (0,external_wp_element_namespaceObject.createElement)(navigable_toolbar, _extends({
30240      focusOnMount: focusOnMount,
30241      className: classes
30242      /* translators: accessibility text for the block toolbar */
30243      ,
30244      "aria-label": (0,external_wp_i18n_namespaceObject.__)('Block tools')
30245    }, props), (0,external_wp_element_namespaceObject.createElement)(block_toolbar, {
30246      hideDragHandle: isFixed
30247    }));
30248  }
30249  
30250  /* harmony default export */ var block_contextual_toolbar = (BlockContextualToolbar);
30251  
30252  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-tools/block-popover.js
30253  
30254  
30255  /**
30256   * External dependencies
30257   */
30258  
30259  
30260  /**
30261   * WordPress dependencies
30262   */
30263  
30264  
30265  
30266  
30267  
30268  
30269  
30270  
30271  /**
30272   * Internal dependencies
30273   */
30274  
30275  
30276  
30277  
30278  
30279  
30280  
30281  
30282  function block_popover_selector(select) {
30283    const {
30284      isNavigationMode,
30285      isMultiSelecting,
30286      hasMultiSelection,
30287      isTyping,
30288      isCaretWithinFormattedText,
30289      getSettings,
30290      getLastMultiSelectedBlockClientId
30291    } = select(store);
30292    return {
30293      isNavigationMode: isNavigationMode(),
30294      isMultiSelecting: isMultiSelecting(),
30295      isTyping: isTyping(),
30296      isCaretWithinFormattedText: isCaretWithinFormattedText(),
30297      hasMultiSelection: hasMultiSelection(),
30298      hasFixedToolbar: getSettings().hasFixedToolbar,
30299      lastClientId: getLastMultiSelectedBlockClientId()
30300    };
30301  }
30302  
30303  function BlockPopover(_ref) {
30304    let {
30305      clientId,
30306      rootClientId,
30307      isValid,
30308      isEmptyDefaultBlock,
30309      capturingClientId,
30310      __unstablePopoverSlot,
30311      __unstableContentRef
30312    } = _ref;
30313    const {
30314      isNavigationMode,
30315      isMultiSelecting,
30316      isTyping,
30317      isCaretWithinFormattedText,
30318      hasMultiSelection,
30319      hasFixedToolbar,
30320      lastClientId
30321    } = (0,external_wp_data_namespaceObject.useSelect)(block_popover_selector, []);
30322    const isInsertionPointVisible = (0,external_wp_data_namespaceObject.useSelect)(select => {
30323      const {
30324        isBlockInsertionPointVisible,
30325        getBlockInsertionPoint,
30326        getBlockOrder
30327      } = select(store);
30328  
30329      if (!isBlockInsertionPointVisible()) {
30330        return false;
30331      }
30332  
30333      const insertionPoint = getBlockInsertionPoint();
30334      const order = getBlockOrder(insertionPoint.rootClientId);
30335      return order[insertionPoint.index] === clientId;
30336    }, [clientId]);
30337    const isLargeViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium');
30338    const [isToolbarForced, setIsToolbarForced] = (0,external_wp_element_namespaceObject.useState)(false);
30339    const [isInserterShown, setIsInserterShown] = (0,external_wp_element_namespaceObject.useState)(false);
30340    const {
30341      stopTyping
30342    } = (0,external_wp_data_namespaceObject.useDispatch)(store); // Controls when the side inserter on empty lines should
30343    // be shown, including writing and selection modes.
30344  
30345    const showEmptyBlockSideInserter = !isTyping && !isNavigationMode && isEmptyDefaultBlock && isValid;
30346    const shouldShowBreadcrumb = isNavigationMode;
30347    const shouldShowContextualToolbar = !isNavigationMode && !hasFixedToolbar && isLargeViewport && !showEmptyBlockSideInserter && !isMultiSelecting && (!isTyping || isCaretWithinFormattedText);
30348    const canFocusHiddenToolbar = !isNavigationMode && !shouldShowContextualToolbar && !hasFixedToolbar && !isEmptyDefaultBlock;
30349    (0,external_wp_keyboardShortcuts_namespaceObject.useShortcut)('core/block-editor/focus-toolbar', () => {
30350      setIsToolbarForced(true);
30351      stopTyping(true);
30352    }, {
30353      isDisabled: !canFocusHiddenToolbar
30354    });
30355    (0,external_wp_element_namespaceObject.useEffect)(() => {
30356      if (!shouldShowContextualToolbar) {
30357        setIsToolbarForced(false);
30358      }
30359    }, [shouldShowContextualToolbar]); // Stores the active toolbar item index so the block toolbar can return focus
30360    // to it when re-mounting.
30361  
30362    const initialToolbarItemIndexRef = (0,external_wp_element_namespaceObject.useRef)();
30363    const selectedElement = useBlockElement(clientId);
30364    const lastSelectedElement = useBlockElement(lastClientId);
30365    const capturingElement = useBlockElement(capturingClientId);
30366    const popoverScrollRef = usePopoverScroll(__unstableContentRef);
30367  
30368    if (!shouldShowBreadcrumb && !shouldShowContextualToolbar && !isToolbarForced && !showEmptyBlockSideInserter) {
30369      return null;
30370    }
30371  
30372    let node = selectedElement;
30373  
30374    if (!node) {
30375      return null;
30376    }
30377  
30378    if (capturingClientId) {
30379      node = capturingElement;
30380    }
30381  
30382    let anchorRef = node;
30383  
30384    if (hasMultiSelection) {
30385      // Wait to render the popover until the bottom reference is available
30386      // as well.
30387      if (!lastSelectedElement) {
30388        return null;
30389      }
30390  
30391      anchorRef = {
30392        top: node,
30393        bottom: lastSelectedElement
30394      };
30395    }
30396  
30397    function onFocus() {
30398      setIsInserterShown(true);
30399    }
30400  
30401    function onBlur() {
30402      setIsInserterShown(false);
30403    } // Position above the anchor, pop out towards the right, and position in the
30404    // left corner. For the side inserter, pop out towards the left, and
30405    // position in the right corner.
30406    // To do: refactor `Popover` to make this prop clearer.
30407  
30408  
30409    const popoverPosition = showEmptyBlockSideInserter ? 'top left right' : 'top right left';
30410    const {
30411      ownerDocument
30412    } = node;
30413    const stickyBoundaryElement = showEmptyBlockSideInserter ? undefined : // The sticky boundary element should be the boundary at which the
30414    // the block toolbar becomes sticky when the block scolls out of view.
30415    // In case of an iframe, this should be the iframe boundary, otherwise
30416    // the scroll container.
30417    ownerDocument.defaultView.frameElement || (0,external_wp_dom_namespaceObject.getScrollContainer)(node) || ownerDocument.body;
30418    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Popover, {
30419      ref: popoverScrollRef,
30420      noArrow: true,
30421      animate: false,
30422      position: popoverPosition,
30423      focusOnMount: false,
30424      anchorRef: anchorRef,
30425      className: classnames_default()('block-editor-block-list__block-popover', {
30426        'is-insertion-point-visible': isInsertionPointVisible
30427      }),
30428      __unstableStickyBoundaryElement: stickyBoundaryElement // Render in the old slot if needed for backward compatibility,
30429      // otherwise render in place (not in the the default popover slot).
30430      ,
30431      __unstableSlotName: __unstablePopoverSlot || null,
30432      __unstableBoundaryParent: true // Observe movement for block animations (especially horizontal).
30433      ,
30434      __unstableObserveElement: node,
30435      shouldAnchorIncludePadding: true // Used to safeguard sticky position behavior against cases where it would permanently
30436      // obscure specific sections of a block.
30437      ,
30438      __unstableEditorCanvasWrapper: __unstableContentRef === null || __unstableContentRef === void 0 ? void 0 : __unstableContentRef.current
30439    }, (shouldShowContextualToolbar || isToolbarForced) && (0,external_wp_element_namespaceObject.createElement)("div", {
30440      onFocus: onFocus,
30441      onBlur: onBlur // While ideally it would be enough to capture the
30442      // bubbling focus event from the Inserter, due to the
30443      // characteristics of click focusing of `button`s in
30444      // Firefox and Safari, it is not reliable.
30445      //
30446      // See: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#Clicking_and_focus
30447      ,
30448      tabIndex: -1,
30449      className: classnames_default()('block-editor-block-list__block-popover-inserter', {
30450        'is-visible': isInserterShown
30451      })
30452    }, (0,external_wp_element_namespaceObject.createElement)(inserter, {
30453      clientId: clientId,
30454      rootClientId: rootClientId,
30455      __experimentalIsQuick: true
30456    })), (shouldShowContextualToolbar || isToolbarForced) && (0,external_wp_element_namespaceObject.createElement)(block_contextual_toolbar // If the toolbar is being shown because of being forced
30457    // it should focus the toolbar right after the mount.
30458    , {
30459      focusOnMount: isToolbarForced,
30460      __experimentalInitialIndex: initialToolbarItemIndexRef.current,
30461      __experimentalOnIndexChange: index => {
30462        initialToolbarItemIndexRef.current = index;
30463      } // Resets the index whenever the active block changes so
30464      // this is not persisted. See https://github.com/WordPress/gutenberg/pull/25760#issuecomment-717906169
30465      ,
30466      key: clientId
30467    }), shouldShowBreadcrumb && (0,external_wp_element_namespaceObject.createElement)(block_selection_button, {
30468      clientId: clientId,
30469      rootClientId: rootClientId,
30470      blockElement: node
30471    }), showEmptyBlockSideInserter && (0,external_wp_element_namespaceObject.createElement)("div", {
30472      className: "block-editor-block-list__empty-block-inserter"
30473    }, (0,external_wp_element_namespaceObject.createElement)(inserter, {
30474      position: "bottom right",
30475      rootClientId: rootClientId,
30476      clientId: clientId,
30477      __experimentalIsQuick: true
30478    })));
30479  }
30480  
30481  function wrapperSelector(select) {
30482    const {
30483      getSelectedBlockClientId,
30484      getFirstMultiSelectedBlockClientId,
30485      getBlockRootClientId,
30486      getBlock,
30487      getBlockParents,
30488      __experimentalGetBlockListSettingsForBlocks
30489    } = select(store);
30490    const clientId = getSelectedBlockClientId() || getFirstMultiSelectedBlockClientId();
30491  
30492    if (!clientId) {
30493      return;
30494    }
30495  
30496    const {
30497      name,
30498      attributes = {},
30499      isValid
30500    } = getBlock(clientId) || {};
30501    const blockParentsClientIds = getBlockParents(clientId); // Get Block List Settings for all ancestors of the current Block clientId.
30502  
30503    const parentBlockListSettings = __experimentalGetBlockListSettingsForBlocks(blockParentsClientIds); // Get the clientId of the topmost parent with the capture toolbars setting.
30504  
30505  
30506    const capturingClientId = (0,external_lodash_namespaceObject.find)(blockParentsClientIds, parentClientId => {
30507      var _parentBlockListSetti;
30508  
30509      return (_parentBlockListSetti = parentBlockListSettings[parentClientId]) === null || _parentBlockListSetti === void 0 ? void 0 : _parentBlockListSetti.__experimentalCaptureToolbars;
30510    });
30511    return {
30512      clientId,
30513      rootClientId: getBlockRootClientId(clientId),
30514      name,
30515      isValid,
30516      isEmptyDefaultBlock: name && (0,external_wp_blocks_namespaceObject.isUnmodifiedDefaultBlock)({
30517        name,
30518        attributes
30519      }),
30520      capturingClientId
30521    };
30522  }
30523  
30524  function WrappedBlockPopover(_ref2) {
30525    let {
30526      __unstablePopoverSlot,
30527      __unstableContentRef
30528    } = _ref2;
30529    const selected = (0,external_wp_data_namespaceObject.useSelect)(wrapperSelector, []);
30530  
30531    if (!selected) {
30532      return null;
30533    }
30534  
30535    const {
30536      clientId,
30537      rootClientId,
30538      name,
30539      isValid,
30540      isEmptyDefaultBlock,
30541      capturingClientId
30542    } = selected;
30543  
30544    if (!name) {
30545      return null;
30546    }
30547  
30548    return (0,external_wp_element_namespaceObject.createElement)(BlockPopover, {
30549      clientId: clientId,
30550      rootClientId: rootClientId,
30551      isValid: isValid,
30552      isEmptyDefaultBlock: isEmptyDefaultBlock,
30553      capturingClientId: capturingClientId,
30554      __unstablePopoverSlot: __unstablePopoverSlot,
30555      __unstableContentRef: __unstableContentRef
30556    });
30557  }
30558  
30559  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-tools/back-compat.js
30560  
30561  
30562  /**
30563   * WordPress dependencies
30564   */
30565  
30566  
30567  
30568  /**
30569   * Internal dependencies
30570   */
30571  
30572  
30573  
30574  function BlockToolsBackCompat(_ref) {
30575    let {
30576      children
30577    } = _ref;
30578    const openRef = (0,external_wp_element_namespaceObject.useContext)(InsertionPointOpenRef);
30579    const isDisabled = (0,external_wp_element_namespaceObject.useContext)(external_wp_components_namespaceObject.Disabled.Context); // If context is set, `BlockTools` is a parent component.
30580  
30581    if (openRef || isDisabled) {
30582      return children;
30583    }
30584  
30585    external_wp_deprecated_default()('wp.components.Popover.Slot name="block-toolbar"', {
30586      alternative: 'wp.blockEditor.BlockTools',
30587      since: '5.8'
30588    });
30589    return (0,external_wp_element_namespaceObject.createElement)(InsertionPoint, {
30590      __unstablePopoverSlot: "block-toolbar"
30591    }, (0,external_wp_element_namespaceObject.createElement)(WrappedBlockPopover, {
30592      __unstablePopoverSlot: "block-toolbar"
30593    }), children);
30594  }
30595  
30596  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inner-blocks/with-client-id.js
30597  
30598  
30599  
30600  /**
30601   * WordPress dependencies
30602   */
30603  
30604  /**
30605   * Internal dependencies
30606   */
30607  
30608  
30609  const withClientId = (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(WrappedComponent => props => {
30610    const {
30611      clientId
30612    } = useBlockEditContext();
30613    return (0,external_wp_element_namespaceObject.createElement)(WrappedComponent, _extends({}, props, {
30614      clientId: clientId
30615    }));
30616  }, 'withClientId');
30617  /* harmony default export */ var with_client_id = (withClientId);
30618  
30619  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inner-blocks/button-block-appender.js
30620  
30621  
30622  /**
30623   * External dependencies
30624   */
30625  
30626  /**
30627   * Internal dependencies
30628   */
30629  
30630  
30631  
30632  const button_block_appender_ButtonBlockAppender = _ref => {
30633    let {
30634      clientId,
30635      showSeparator,
30636      isFloating,
30637      onAddBlock,
30638      isToggle
30639    } = _ref;
30640    return (0,external_wp_element_namespaceObject.createElement)(button_block_appender, {
30641      className: classnames_default()({
30642        'block-list-appender__toggle': isToggle
30643      }),
30644      rootClientId: clientId,
30645      showSeparator: showSeparator,
30646      isFloating: isFloating,
30647      onAddBlock: onAddBlock
30648    });
30649  };
30650  /* harmony default export */ var inner_blocks_button_block_appender = (with_client_id(button_block_appender_ButtonBlockAppender));
30651  
30652  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inner-blocks/default-block-appender.js
30653  
30654  
30655  /**
30656   * External dependencies
30657   */
30658  
30659  /**
30660   * WordPress dependencies
30661   */
30662  
30663  
30664  
30665  /**
30666   * Internal dependencies
30667   */
30668  
30669  
30670  
30671  
30672  const default_block_appender_DefaultBlockAppender = _ref => {
30673    let {
30674      clientId
30675    } = _ref;
30676    return (0,external_wp_element_namespaceObject.createElement)(default_block_appender, {
30677      rootClientId: clientId
30678    });
30679  };
30680  /* harmony default export */ var inner_blocks_default_block_appender = ((0,external_wp_compose_namespaceObject.compose)([with_client_id, (0,external_wp_data_namespaceObject.withSelect)((select, _ref2) => {
30681    let {
30682      clientId
30683    } = _ref2;
30684    const {
30685      getBlockOrder
30686    } = select(store);
30687    const blockClientIds = getBlockOrder(clientId);
30688    return {
30689      lastBlockClientId: (0,external_lodash_namespaceObject.last)(blockClientIds)
30690    };
30691  })])(default_block_appender_DefaultBlockAppender));
30692  
30693  ;// CONCATENATED MODULE: external ["wp","isShallowEqual"]
30694  var external_wp_isShallowEqual_namespaceObject = window["wp"]["isShallowEqual"];
30695  var external_wp_isShallowEqual_default = /*#__PURE__*/__webpack_require__.n(external_wp_isShallowEqual_namespaceObject);
30696  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inner-blocks/use-nested-settings-update.js
30697  /**
30698   * WordPress dependencies
30699   */
30700  
30701  
30702  
30703  /**
30704   * Internal dependencies
30705   */
30706  
30707  
30708  
30709  /** @typedef {import('../../selectors').WPDirectInsertBlock } WPDirectInsertBlock */
30710  
30711  /**
30712   * This hook is a side effect which updates the block-editor store when changes
30713   * happen to inner block settings. The given props are transformed into a
30714   * settings object, and if that is different from the current settings object in
30715   * the block-editor store, then the store is updated with the new settings which
30716   * came from props.
30717   *
30718   * @param {string}               clientId                   The client ID of the block to update.
30719   * @param {string[]}             allowedBlocks              An array of block names which are permitted
30720   *                                                          in inner blocks.
30721   * @param {?WPDirectInsertBlock} __experimentalDefaultBlock The default block to insert: [ blockName, { blockAttributes } ].
30722   * @param {?Function|boolean}    __experimentalDirectInsert If a default block should be inserted directly by the
30723   *                                                          appender.
30724   * @param {string}               [templateLock]             The template lock specified for the inner
30725   *                                                          blocks component. (e.g. "all")
30726   * @param {boolean}              captureToolbars            Whether or children toolbars should be shown
30727   *                                                          in the inner blocks component rather than on
30728   *                                                          the child block.
30729   * @param {string}               orientation                The direction in which the block
30730   *                                                          should face.
30731   * @param {Object}               layout                     The layout object for the block container.
30732   */
30733  
30734  function useNestedSettingsUpdate(clientId, allowedBlocks, __experimentalDefaultBlock, __experimentalDirectInsert, templateLock, captureToolbars, orientation, layout) {
30735    const {
30736      updateBlockListSettings
30737    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
30738    const {
30739      blockListSettings,
30740      parentLock
30741    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
30742      const rootClientId = select(store).getBlockRootClientId(clientId);
30743      return {
30744        blockListSettings: select(store).getBlockListSettings(clientId),
30745        parentLock: select(store).getTemplateLock(rootClientId)
30746      };
30747    }, [clientId]); // Memoize as inner blocks implementors often pass a new array on every
30748    // render.
30749  
30750    const _allowedBlocks = (0,external_wp_element_namespaceObject.useMemo)(() => allowedBlocks, allowedBlocks);
30751  
30752    (0,external_wp_element_namespaceObject.useLayoutEffect)(() => {
30753      const newSettings = {
30754        allowedBlocks: _allowedBlocks,
30755        templateLock: templateLock === undefined ? parentLock : templateLock
30756      }; // These values are not defined for RN, so only include them if they
30757      // are defined.
30758  
30759      if (captureToolbars !== undefined) {
30760        newSettings.__experimentalCaptureToolbars = captureToolbars;
30761      } // Orientation depends on layout,
30762      // ideally the separate orientation prop should be deprecated.
30763  
30764  
30765      if (orientation !== undefined) {
30766        newSettings.orientation = orientation;
30767      } else {
30768        const layoutType = getLayoutType(layout === null || layout === void 0 ? void 0 : layout.type);
30769        newSettings.orientation = layoutType.getOrientation(layout);
30770      }
30771  
30772      if (__experimentalDefaultBlock !== undefined) {
30773        newSettings.__experimentalDefaultBlock = __experimentalDefaultBlock;
30774      }
30775  
30776      if (__experimentalDirectInsert !== undefined) {
30777        newSettings.__experimentalDirectInsert = __experimentalDirectInsert;
30778      }
30779  
30780      if (!external_wp_isShallowEqual_default()(blockListSettings, newSettings)) {
30781        updateBlockListSettings(clientId, newSettings);
30782      }
30783    }, [clientId, blockListSettings, _allowedBlocks, __experimentalDefaultBlock, __experimentalDirectInsert, templateLock, parentLock, captureToolbars, orientation, updateBlockListSettings, layout]);
30784  }
30785  
30786  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inner-blocks/use-inner-block-template-sync.js
30787  /**
30788   * External dependencies
30789   */
30790  
30791  /**
30792   * WordPress dependencies
30793   */
30794  
30795  
30796  
30797  
30798  /**
30799   * Internal dependencies
30800   */
30801  
30802  
30803  /**
30804   * This hook makes sure that a block's inner blocks stay in sync with the given
30805   * block "template". The template is a block hierarchy to which inner blocks must
30806   * conform. If the blocks get "out of sync" with the template and the template
30807   * is meant to be locked (e.g. templateLock = "all"), then we replace the inner
30808   * blocks with the correct value after synchronizing it with the template.
30809   *
30810   * @param {string}  clientId                       The block client ID.
30811   * @param {Object}  template                       The template to match.
30812   * @param {string}  templateLock                   The template lock state for the inner blocks. For
30813   *                                                 example, if the template lock is set to "all",
30814   *                                                 then the inner blocks will stay in sync with the
30815   *                                                 template. If not defined or set to false, then
30816   *                                                 the inner blocks will not be synchronized with
30817   *                                                 the given template.
30818   * @param {boolean} templateInsertUpdatesSelection Whether or not to update the
30819   *                                                 block-editor selection state when inner blocks
30820   *                                                 are replaced after template synchronization.
30821   */
30822  
30823  function useInnerBlockTemplateSync(clientId, template, templateLock, templateInsertUpdatesSelection) {
30824    const {
30825      getSelectedBlocksInitialCaretPosition
30826    } = (0,external_wp_data_namespaceObject.useSelect)(store);
30827    const {
30828      replaceInnerBlocks
30829    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
30830    const innerBlocks = (0,external_wp_data_namespaceObject.useSelect)(select => select(store).getBlocks(clientId), [clientId]); // Maintain a reference to the previous value so we can do a deep equality check.
30831  
30832    const existingTemplate = (0,external_wp_element_namespaceObject.useRef)(null);
30833    (0,external_wp_element_namespaceObject.useLayoutEffect)(() => {
30834      // Only synchronize innerBlocks with template if innerBlocks are empty or
30835      // a locking all exists directly on the block.
30836      if (innerBlocks.length === 0 || templateLock === 'all') {
30837        const hasTemplateChanged = !(0,external_lodash_namespaceObject.isEqual)(template, existingTemplate.current);
30838  
30839        if (hasTemplateChanged) {
30840          existingTemplate.current = template;
30841          const nextBlocks = (0,external_wp_blocks_namespaceObject.synchronizeBlocksWithTemplate)(innerBlocks, template);
30842  
30843          if (!(0,external_lodash_namespaceObject.isEqual)(nextBlocks, innerBlocks)) {
30844            replaceInnerBlocks(clientId, nextBlocks, innerBlocks.length === 0 && templateInsertUpdatesSelection && nextBlocks.length !== 0, // This ensures the "initialPosition" doesn't change when applying the template
30845            // If we're supposed to focus the block, we'll focus the first inner block
30846            // otherwise, we won't apply any auto-focus.
30847            // This ensures for instance that the focus stays in the inserter when inserting the "buttons" block.
30848            getSelectedBlocksInitialCaretPosition());
30849          }
30850        }
30851      }
30852    }, [innerBlocks, template, templateLock, clientId]);
30853  }
30854  
30855  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inner-blocks/get-block-context.js
30856  /**
30857   * External dependencies
30858   */
30859  
30860  /**
30861   * Block context cache, implemented as a WeakMap mapping block types to a
30862   * WeakMap mapping attributes object to context value.
30863   *
30864   * @type {WeakMap<string,WeakMap<string,*>>}
30865   */
30866  
30867  const BLOCK_CONTEXT_CACHE = new WeakMap();
30868  /**
30869   * Returns a cached context object value for a given set of attributes for the
30870   * block type.
30871   *
30872   * @param {Record<string,*>} attributes Block attributes object.
30873   * @param {WPBlockType}      blockType  Block type settings.
30874   *
30875   * @return {Record<string,*>} Context value.
30876   */
30877  
30878  function getBlockContext(attributes, blockType) {
30879    if (!BLOCK_CONTEXT_CACHE.has(blockType)) {
30880      BLOCK_CONTEXT_CACHE.set(blockType, new WeakMap());
30881    }
30882  
30883    const blockTypeCache = BLOCK_CONTEXT_CACHE.get(blockType);
30884  
30885    if (!blockTypeCache.has(attributes)) {
30886      const context = (0,external_lodash_namespaceObject.mapValues)(blockType.providesContext, attributeName => attributes[attributeName]);
30887      blockTypeCache.set(attributes, context);
30888    }
30889  
30890    return blockTypeCache.get(attributes);
30891  }
30892  
30893  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/use-on-block-drop/index.js
30894  /**
30895   * WordPress dependencies
30896   */
30897  
30898  
30899  
30900  /**
30901   * Internal dependencies
30902   */
30903  
30904  
30905  /** @typedef {import('@wordpress/element').WPSyntheticEvent} WPSyntheticEvent */
30906  
30907  /**
30908   * Retrieve the data for a block drop event.
30909   *
30910   * @param {WPSyntheticEvent} event The drop event.
30911   *
30912   * @return {Object} An object with block drag and drop data.
30913   */
30914  
30915  function parseDropEvent(event) {
30916    let result = {
30917      srcRootClientId: null,
30918      srcClientIds: null,
30919      srcIndex: null,
30920      type: null,
30921      blocks: null
30922    };
30923  
30924    if (!event.dataTransfer) {
30925      return result;
30926    }
30927  
30928    try {
30929      result = Object.assign(result, JSON.parse(event.dataTransfer.getData('wp-blocks')));
30930    } catch (err) {
30931      return result;
30932    }
30933  
30934    return result;
30935  }
30936  /**
30937   * A function that returns an event handler function for block drop events.
30938   *
30939   * @param {string}   targetRootClientId        The root client id where the block(s) will be inserted.
30940   * @param {number}   targetBlockIndex          The index where the block(s) will be inserted.
30941   * @param {Function} getBlockIndex             A function that gets the index of a block.
30942   * @param {Function} getClientIdsOfDescendants A function that gets the client ids of descendant blocks.
30943   * @param {Function} moveBlocksToPosition      A function that moves blocks.
30944   * @param {Function} insertBlocks              A function that inserts blocks.
30945   * @param {Function} clearSelectedBlock        A function that clears block selection.
30946   * @return {Function} The event handler for a block drop event.
30947   */
30948  
30949  function onBlockDrop(targetRootClientId, targetBlockIndex, getBlockIndex, getClientIdsOfDescendants, moveBlocksToPosition, insertBlocks, clearSelectedBlock) {
30950    return event => {
30951      const {
30952        srcRootClientId: sourceRootClientId,
30953        srcClientIds: sourceClientIds,
30954        type: dropType,
30955        blocks
30956      } = parseDropEvent(event); // If the user is inserting a block.
30957  
30958      if (dropType === 'inserter') {
30959        clearSelectedBlock();
30960        const blocksToInsert = blocks.map(block => (0,external_wp_blocks_namespaceObject.cloneBlock)(block));
30961        insertBlocks(blocksToInsert, targetBlockIndex, targetRootClientId, true, null);
30962      } // If the user is moving a block.
30963  
30964  
30965      if (dropType === 'block') {
30966        const sourceBlockIndex = getBlockIndex(sourceClientIds[0]); // If the user is dropping to the same position, return early.
30967  
30968        if (sourceRootClientId === targetRootClientId && sourceBlockIndex === targetBlockIndex) {
30969          return;
30970        } // If the user is attempting to drop a block within its own
30971        // nested blocks, return early as this would create infinite
30972        // recursion.
30973  
30974  
30975        if (sourceClientIds.includes(targetRootClientId) || getClientIdsOfDescendants(sourceClientIds).some(id => id === targetRootClientId)) {
30976          return;
30977        }
30978  
30979        const isAtSameLevel = sourceRootClientId === targetRootClientId;
30980        const draggedBlockCount = sourceClientIds.length; // If the block is kept at the same level and moved downwards,
30981        // subtract to take into account that the blocks being dragged
30982        // were removed from the block list above the insertion point.
30983  
30984        const insertIndex = isAtSameLevel && sourceBlockIndex < targetBlockIndex ? targetBlockIndex - draggedBlockCount : targetBlockIndex;
30985        moveBlocksToPosition(sourceClientIds, sourceRootClientId, targetRootClientId, insertIndex);
30986      }
30987    };
30988  }
30989  /**
30990   * A function that returns an event handler function for block-related file drop events.
30991   *
30992   * @param {string}   targetRootClientId    The root client id where the block(s) will be inserted.
30993   * @param {number}   targetBlockIndex      The index where the block(s) will be inserted.
30994   * @param {boolean}  hasUploadPermissions  Whether the user has upload permissions.
30995   * @param {Function} updateBlockAttributes A function that updates a block's attributes.
30996   * @param {Function} canInsertBlockType    A function that returns checks whether a block type can be inserted.
30997   * @param {Function} insertBlocks          A function that inserts blocks.
30998   *
30999   * @return {Function} The event handler for a block-related file drop event.
31000   */
31001  
31002  function onFilesDrop(targetRootClientId, targetBlockIndex, hasUploadPermissions, updateBlockAttributes, canInsertBlockType, insertBlocks) {
31003    return files => {
31004      if (!hasUploadPermissions) {
31005        return;
31006      }
31007  
31008      const transformation = (0,external_wp_blocks_namespaceObject.findTransform)((0,external_wp_blocks_namespaceObject.getBlockTransforms)('from'), transform => transform.type === 'files' && canInsertBlockType(transform.blockName, targetRootClientId) && transform.isMatch(files));
31009  
31010      if (transformation) {
31011        const blocks = transformation.transform(files, updateBlockAttributes);
31012        insertBlocks(blocks, targetBlockIndex, targetRootClientId);
31013      }
31014    };
31015  }
31016  /**
31017   * A function that returns an event handler function for block-related HTML drop events.
31018   *
31019   * @param {string}   targetRootClientId The root client id where the block(s) will be inserted.
31020   * @param {number}   targetBlockIndex   The index where the block(s) will be inserted.
31021   * @param {Function} insertBlocks       A function that inserts blocks.
31022   *
31023   * @return {Function} The event handler for a block-related HTML drop event.
31024   */
31025  
31026  function onHTMLDrop(targetRootClientId, targetBlockIndex, insertBlocks) {
31027    return HTML => {
31028      const blocks = (0,external_wp_blocks_namespaceObject.pasteHandler)({
31029        HTML,
31030        mode: 'BLOCKS'
31031      });
31032  
31033      if (blocks.length) {
31034        insertBlocks(blocks, targetBlockIndex, targetRootClientId);
31035      }
31036    };
31037  }
31038  /**
31039   * A React hook for handling block drop events.
31040   *
31041   * @param {string} targetRootClientId The root client id where the block(s) will be inserted.
31042   * @param {number} targetBlockIndex   The index where the block(s) will be inserted.
31043   *
31044   * @return {Object} An object that contains the event handlers `onDrop`, `onFilesDrop` and `onHTMLDrop`.
31045   */
31046  
31047  function useOnBlockDrop(targetRootClientId, targetBlockIndex) {
31048    const hasUploadPermissions = (0,external_wp_data_namespaceObject.useSelect)(select => select(store).getSettings().mediaUpload, []);
31049    const {
31050      canInsertBlockType,
31051      getBlockIndex,
31052      getClientIdsOfDescendants
31053    } = (0,external_wp_data_namespaceObject.useSelect)(store);
31054    const {
31055      insertBlocks,
31056      moveBlocksToPosition,
31057      updateBlockAttributes,
31058      clearSelectedBlock
31059    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
31060  
31061    const _onDrop = onBlockDrop(targetRootClientId, targetBlockIndex, getBlockIndex, getClientIdsOfDescendants, moveBlocksToPosition, insertBlocks, clearSelectedBlock);
31062  
31063    const _onFilesDrop = onFilesDrop(targetRootClientId, targetBlockIndex, hasUploadPermissions, updateBlockAttributes, canInsertBlockType, insertBlocks);
31064  
31065    const _onHTMLDrop = onHTMLDrop(targetRootClientId, targetBlockIndex, insertBlocks);
31066  
31067    return event => {
31068      const files = (0,external_wp_dom_namespaceObject.getFilesFromDataTransfer)(event.dataTransfer);
31069      const html = event.dataTransfer.getData('text/html');
31070      /**
31071       * From Windows Chrome 96, the `event.dataTransfer` returns both file object and HTML.
31072       * The order of the checks is important to recognise the HTML drop.
31073       */
31074  
31075      if (html) {
31076        _onHTMLDrop(html);
31077      } else if (files.length) {
31078        _onFilesDrop(files);
31079      } else {
31080        _onDrop(event);
31081      }
31082    };
31083  }
31084  
31085  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/utils/math.js
31086  /**
31087   * A string representing the name of an edge.
31088   *
31089   * @typedef {'top'|'right'|'bottom'|'left'} WPEdgeName
31090   */
31091  
31092  /**
31093   * @typedef  {Object} WPPoint
31094   * @property {number} x The horizontal position.
31095   * @property {number} y The vertical position.
31096   */
31097  
31098  /**
31099   * Given a point, a DOMRect and the name of an edge, returns the distance to
31100   * that edge of the rect.
31101   *
31102   * This function works for edges that are horizontal or vertical (e.g. not
31103   * rotated), the following terms are used so that the function works in both
31104   * orientations:
31105   *
31106   * - Forward, meaning the axis running horizontally when an edge is vertical
31107   *   and vertically when an edge is horizontal.
31108   * - Lateral, meaning the axis running vertically when an edge is vertical
31109   *   and horizontally when an edge is horizontal.
31110   *
31111   * @param {WPPoint}    point The point to measure distance from.
31112   * @param {DOMRect}    rect  A DOM Rect containing edge positions.
31113   * @param {WPEdgeName} edge  The edge to measure to.
31114   */
31115  function getDistanceFromPointToEdge(point, rect, edge) {
31116    const isHorizontal = edge === 'top' || edge === 'bottom';
31117    const {
31118      x,
31119      y
31120    } = point;
31121    const pointLateralPosition = isHorizontal ? x : y;
31122    const pointForwardPosition = isHorizontal ? y : x;
31123    const edgeStart = isHorizontal ? rect.left : rect.top;
31124    const edgeEnd = isHorizontal ? rect.right : rect.bottom;
31125    const edgeForwardPosition = rect[edge]; // Measure the straight line distance to the edge of the rect, when the
31126    // point is adjacent to the edge.
31127    // Else, if the point is positioned diagonally to the edge of the rect,
31128    // measure diagonally to the nearest corner that the edge meets.
31129  
31130    let edgeLateralPosition;
31131  
31132    if (pointLateralPosition >= edgeStart && pointLateralPosition <= edgeEnd) {
31133      edgeLateralPosition = pointLateralPosition;
31134    } else if (pointLateralPosition < edgeEnd) {
31135      edgeLateralPosition = edgeStart;
31136    } else {
31137      edgeLateralPosition = edgeEnd;
31138    }
31139  
31140    return Math.sqrt((pointLateralPosition - edgeLateralPosition) ** 2 + (pointForwardPosition - edgeForwardPosition) ** 2);
31141  }
31142  /**
31143   * Given a point, a DOMRect and a list of allowed edges returns the name of and
31144   * distance to the nearest edge.
31145   *
31146   * @param {WPPoint}      point        The point to measure distance from.
31147   * @param {DOMRect}      rect         A DOM Rect containing edge positions.
31148   * @param {WPEdgeName[]} allowedEdges A list of the edges included in the
31149   *                                    calculation. Defaults to all edges.
31150   *
31151   * @return {[number, string]} An array where the first value is the distance
31152   *                              and a second is the edge name.
31153   */
31154  
31155  function getDistanceToNearestEdge(point, rect) {
31156    let allowedEdges = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ['top', 'bottom', 'left', 'right'];
31157    let candidateDistance;
31158    let candidateEdge;
31159    allowedEdges.forEach(edge => {
31160      const distance = getDistanceFromPointToEdge(point, rect, edge);
31161  
31162      if (candidateDistance === undefined || distance < candidateDistance) {
31163        candidateDistance = distance;
31164        candidateEdge = edge;
31165      }
31166    });
31167    return [candidateDistance, candidateEdge];
31168  }
31169  
31170  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/use-block-drop-zone/index.js
31171  /**
31172   * WordPress dependencies
31173   */
31174  
31175  
31176  
31177  
31178  /**
31179   * Internal dependencies
31180   */
31181  
31182  
31183  
31184  
31185  /** @typedef {import('../../utils/math').WPPoint} WPPoint */
31186  
31187  /**
31188   * The orientation of a block list.
31189   *
31190   * @typedef {'horizontal'|'vertical'|undefined} WPBlockListOrientation
31191   */
31192  
31193  /**
31194   * Given a list of block DOM elements finds the index that a block should be dropped
31195   * at.
31196   *
31197   * @param {Element[]}              elements    Array of DOM elements that represent each block in a block list.
31198   * @param {WPPoint}                position    The position of the item being dragged.
31199   * @param {WPBlockListOrientation} orientation The orientation of a block list.
31200   *
31201   * @return {number|undefined} The block index that's closest to the drag position.
31202   */
31203  
31204  function getNearestBlockIndex(elements, position, orientation) {
31205    const allowedEdges = orientation === 'horizontal' ? ['left', 'right'] : ['top', 'bottom'];
31206    const isRightToLeft = (0,external_wp_i18n_namespaceObject.isRTL)();
31207    let candidateIndex;
31208    let candidateDistance;
31209    elements.forEach((element, index) => {
31210      const rect = element.getBoundingClientRect();
31211      const [distance, edge] = getDistanceToNearestEdge(position, rect, allowedEdges);
31212  
31213      if (candidateDistance === undefined || distance < candidateDistance) {
31214        // If the user is dropping to the trailing edge of the block
31215        // add 1 to the index to represent dragging after.
31216        // Take RTL languages into account where the left edge is
31217        // the trailing edge.
31218        const isTrailingEdge = edge === 'bottom' || !isRightToLeft && edge === 'right' || isRightToLeft && edge === 'left';
31219        const offset = isTrailingEdge ? 1 : 0; // Update the currently known best candidate.
31220  
31221        candidateDistance = distance;
31222        candidateIndex = index + offset;
31223      }
31224    });
31225    return candidateIndex;
31226  }
31227  /**
31228   * @typedef  {Object} WPBlockDropZoneConfig
31229   * @property {string} rootClientId The root client id for the block list.
31230   */
31231  
31232  /**
31233   * A React hook that can be used to make a block list handle drag and drop.
31234   *
31235   * @param {WPBlockDropZoneConfig} dropZoneConfig configuration data for the drop zone.
31236   */
31237  
31238  function useBlockDropZone() {
31239    let {
31240      // An undefined value represents a top-level block. Default to an empty
31241      // string for this so that `targetRootClientId` can be easily compared to
31242      // values returned by the `getRootBlockClientId` selector, which also uses
31243      // an empty string to represent top-level blocks.
31244      rootClientId: targetRootClientId = ''
31245    } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
31246    const [targetBlockIndex, setTargetBlockIndex] = (0,external_wp_element_namespaceObject.useState)(null);
31247    const isLockedAll = (0,external_wp_data_namespaceObject.useSelect)(select => {
31248      const {
31249        getTemplateLock
31250      } = select(store);
31251      return getTemplateLock(targetRootClientId) === 'all';
31252    }, [targetRootClientId]);
31253    const {
31254      getBlockListSettings
31255    } = (0,external_wp_data_namespaceObject.useSelect)(store);
31256    const {
31257      showInsertionPoint,
31258      hideInsertionPoint
31259    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
31260    const onBlockDrop = useOnBlockDrop(targetRootClientId, targetBlockIndex);
31261    const throttled = (0,external_wp_compose_namespaceObject.useThrottle)((0,external_wp_element_namespaceObject.useCallback)((event, currentTarget) => {
31262      var _getBlockListSettings;
31263  
31264      const blockElements = Array.from(currentTarget.children).filter( // Ensure the element is a block. It should have the `wp-block` class.
31265      element => element.classList.contains('wp-block'));
31266      const targetIndex = getNearestBlockIndex(blockElements, {
31267        x: event.clientX,
31268        y: event.clientY
31269      }, (_getBlockListSettings = getBlockListSettings(targetRootClientId)) === null || _getBlockListSettings === void 0 ? void 0 : _getBlockListSettings.orientation);
31270      setTargetBlockIndex(targetIndex === undefined ? 0 : targetIndex);
31271  
31272      if (targetIndex !== null) {
31273        showInsertionPoint(targetRootClientId, targetIndex);
31274      }
31275    }, []), 200);
31276    return (0,external_wp_compose_namespaceObject.__experimentalUseDropZone)({
31277      isDisabled: isLockedAll,
31278      onDrop: onBlockDrop,
31279  
31280      onDragOver(event) {
31281        // `currentTarget` is only available while the event is being
31282        // handled, so get it now and pass it to the thottled function.
31283        // https://developer.mozilla.org/en-US/docs/Web/API/Event/currentTarget
31284        throttled(event, event.currentTarget);
31285      },
31286  
31287      onDragLeave() {
31288        throttled.cancel();
31289        hideInsertionPoint();
31290        setTargetBlockIndex(null);
31291      },
31292  
31293      onDragEnd() {
31294        throttled.cancel();
31295        hideInsertionPoint();
31296        setTargetBlockIndex(null);
31297      }
31298  
31299    });
31300  }
31301  
31302  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inner-blocks/index.js
31303  
31304  
31305  
31306  /**
31307   * External dependencies
31308   */
31309  
31310  /**
31311   * WordPress dependencies
31312   */
31313  
31314  
31315  
31316  
31317  
31318  /**
31319   * Internal dependencies
31320   */
31321  
31322  
31323  
31324  
31325  
31326  
31327  
31328  
31329  
31330  
31331  
31332  
31333  /**
31334   * InnerBlocks is a component which allows a single block to have multiple blocks
31335   * as children. The UncontrolledInnerBlocks component is used whenever the inner
31336   * blocks are not controlled by another entity. In other words, it is normally
31337   * used for inner blocks in the post editor
31338   *
31339   * @param {Object} props The component props.
31340   */
31341  
31342  function UncontrolledInnerBlocks(props) {
31343    const {
31344      clientId,
31345      allowedBlocks,
31346      __experimentalDefaultBlock,
31347      __experimentalDirectInsert,
31348      template,
31349      templateLock,
31350      wrapperRef,
31351      templateInsertUpdatesSelection,
31352      __experimentalCaptureToolbars: captureToolbars,
31353      __experimentalAppenderTagName,
31354      renderAppender,
31355      orientation,
31356      placeholder,
31357      __experimentalLayout
31358    } = props;
31359    useNestedSettingsUpdate(clientId, allowedBlocks, __experimentalDefaultBlock, __experimentalDirectInsert, templateLock, captureToolbars, orientation, __experimentalLayout);
31360    useInnerBlockTemplateSync(clientId, template, templateLock, templateInsertUpdatesSelection);
31361    const context = (0,external_wp_data_namespaceObject.useSelect)(select => {
31362      const block = select(store).getBlock(clientId);
31363      const blockType = (0,external_wp_blocks_namespaceObject.getBlockType)(block.name);
31364  
31365      if (!blockType || !blockType.providesContext) {
31366        return;
31367      }
31368  
31369      return getBlockContext(block.attributes, blockType);
31370    }, [clientId]); // This component needs to always be synchronous as it's the one changing
31371    // the async mode depending on the block selection.
31372  
31373    return (0,external_wp_element_namespaceObject.createElement)(BlockContextProvider, {
31374      value: context
31375    }, (0,external_wp_element_namespaceObject.createElement)(BlockListItems, {
31376      rootClientId: clientId,
31377      renderAppender: renderAppender,
31378      __experimentalAppenderTagName: __experimentalAppenderTagName,
31379      __experimentalLayout: __experimentalLayout,
31380      wrapperRef: wrapperRef,
31381      placeholder: placeholder
31382    }));
31383  }
31384  /**
31385   * The controlled inner blocks component wraps the uncontrolled inner blocks
31386   * component with the blockSync hook. This keeps the innerBlocks of the block in
31387   * the block-editor store in sync with the blocks of the controlling entity. An
31388   * example of an inner block controller is a template part block, which provides
31389   * its own blocks from the template part entity data source.
31390   *
31391   * @param {Object} props The component props.
31392   */
31393  
31394  
31395  function ControlledInnerBlocks(props) {
31396    useBlockSync(props);
31397    return (0,external_wp_element_namespaceObject.createElement)(UncontrolledInnerBlocks, props);
31398  }
31399  
31400  const ForwardedInnerBlocks = (0,external_wp_element_namespaceObject.forwardRef)((props, ref) => {
31401    const innerBlocksProps = useInnerBlocksProps({
31402      ref
31403    }, props);
31404    return (0,external_wp_element_namespaceObject.createElement)("div", {
31405      className: "block-editor-inner-blocks"
31406    }, (0,external_wp_element_namespaceObject.createElement)("div", innerBlocksProps));
31407  });
31408  /**
31409   * This hook is used to lightly mark an element as an inner blocks wrapper
31410   * element. Call this hook and pass the returned props to the element to mark as
31411   * an inner blocks wrapper, automatically rendering inner blocks as children. If
31412   * you define a ref for the element, it is important to pass the ref to this
31413   * hook, which the hook in turn will pass to the component through the props it
31414   * returns. Optionally, you can also pass any other props through this hook, and
31415   * they will be merged and returned.
31416   *
31417   * @param {Object} props   Optional. Props to pass to the element. Must contain
31418   *                         the ref if one is defined.
31419   * @param {Object} options Optional. Inner blocks options.
31420   *
31421   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/inner-blocks/README.md
31422   */
31423  
31424  function useInnerBlocksProps() {
31425    let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
31426    let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
31427    const {
31428      clientId
31429    } = useBlockEditContext();
31430    const isSmallScreen = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium', '<');
31431    const {
31432      __experimentalCaptureToolbars,
31433      hasOverlay
31434    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
31435      if (!clientId) {
31436        return {};
31437      }
31438  
31439      const {
31440        getBlockName,
31441        isBlockSelected,
31442        hasSelectedInnerBlock,
31443        isNavigationMode
31444      } = select(store);
31445      const blockName = getBlockName(clientId);
31446      const enableClickThrough = isNavigationMode() || isSmallScreen;
31447      return {
31448        __experimentalCaptureToolbars: select(external_wp_blocks_namespaceObject.store).hasBlockSupport(blockName, '__experimentalExposeControlsToChildren', false),
31449        hasOverlay: blockName !== 'core/template' && !isBlockSelected(clientId) && !hasSelectedInnerBlock(clientId, true) && enableClickThrough
31450      };
31451    }, [clientId, isSmallScreen]);
31452    const ref = (0,external_wp_compose_namespaceObject.useMergeRefs)([props.ref, useBlockDropZone({
31453      rootClientId: clientId
31454    })]);
31455    const innerBlocksProps = {
31456      __experimentalCaptureToolbars,
31457      ...options
31458    };
31459    const InnerBlocks = innerBlocksProps.value && innerBlocksProps.onChange ? ControlledInnerBlocks : UncontrolledInnerBlocks;
31460    return { ...props,
31461      ref,
31462      className: classnames_default()(props.className, 'block-editor-block-list__layout', {
31463        'has-overlay': hasOverlay
31464      }),
31465      children: clientId ? (0,external_wp_element_namespaceObject.createElement)(InnerBlocks, _extends({}, innerBlocksProps, {
31466        clientId: clientId
31467      })) : (0,external_wp_element_namespaceObject.createElement)(BlockListItems, options)
31468    };
31469  }
31470  useInnerBlocksProps.save = external_wp_blocks_namespaceObject.__unstableGetInnerBlocksProps; // Expose default appender placeholders as components.
31471  
31472  ForwardedInnerBlocks.DefaultBlockAppender = inner_blocks_default_block_appender;
31473  ForwardedInnerBlocks.ButtonBlockAppender = inner_blocks_button_block_appender;
31474  
31475  ForwardedInnerBlocks.Content = () => useInnerBlocksProps.save().children;
31476  /**
31477   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/inner-blocks/README.md
31478   */
31479  
31480  
31481  /* harmony default export */ var inner_blocks = (ForwardedInnerBlocks);
31482  
31483  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-list/index.js
31484  
31485  
31486  /**
31487   * External dependencies
31488   */
31489  
31490  /**
31491   * WordPress dependencies
31492   */
31493  
31494  
31495  
31496  
31497  /**
31498   * Internal dependencies
31499   */
31500  
31501  
31502  
31503  
31504  
31505  
31506  
31507  
31508  
31509  
31510  
31511  const elementContext = (0,external_wp_element_namespaceObject.createContext)();
31512  const IntersectionObserver = (0,external_wp_element_namespaceObject.createContext)();
31513  
31514  function Root(_ref) {
31515    let {
31516      className,
31517      ...settings
31518    } = _ref;
31519    const [element, setElement] = (0,external_wp_element_namespaceObject.useState)();
31520    const isLargeViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium');
31521    const {
31522      isOutlineMode,
31523      isFocusMode,
31524      isNavigationMode
31525    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
31526      const {
31527        getSettings,
31528        isNavigationMode: _isNavigationMode
31529      } = select(store);
31530      const {
31531        outlineMode,
31532        focusMode
31533      } = getSettings();
31534      return {
31535        isOutlineMode: outlineMode,
31536        isFocusMode: focusMode,
31537        isNavigationMode: _isNavigationMode()
31538      };
31539    }, []);
31540    const innerBlocksProps = useInnerBlocksProps({
31541      ref: (0,external_wp_compose_namespaceObject.useMergeRefs)([useBlockSelectionClearer(), useInBetweenInserter(), setElement]),
31542      className: classnames_default()('is-root-container', className, {
31543        'is-outline-mode': isOutlineMode,
31544        'is-focus-mode': isFocusMode && isLargeViewport,
31545        'is-navigate-mode': isNavigationMode
31546      })
31547    }, settings);
31548    return (0,external_wp_element_namespaceObject.createElement)(elementContext.Provider, {
31549      value: element
31550    }, (0,external_wp_element_namespaceObject.createElement)("div", innerBlocksProps));
31551  }
31552  
31553  function BlockList(settings) {
31554    usePreParsePatterns();
31555    return (0,external_wp_element_namespaceObject.createElement)(BlockToolsBackCompat, null, (0,external_wp_element_namespaceObject.createElement)(Provider, {
31556      value: DEFAULT_BLOCK_EDIT_CONTEXT
31557    }, (0,external_wp_element_namespaceObject.createElement)(Root, settings)));
31558  }
31559  BlockList.__unstableElementContext = elementContext;
31560  
31561  function Items(_ref2) {
31562    let {
31563      placeholder,
31564      rootClientId,
31565      renderAppender,
31566      __experimentalAppenderTagName,
31567      __experimentalLayout: layout = defaultLayout
31568    } = _ref2;
31569    const [intersectingBlocks, setIntersectingBlocks] = (0,external_wp_element_namespaceObject.useState)(new Set());
31570    const intersectionObserver = (0,external_wp_element_namespaceObject.useMemo)(() => {
31571      const {
31572        IntersectionObserver: Observer
31573      } = window;
31574  
31575      if (!Observer) {
31576        return;
31577      }
31578  
31579      return new Observer(entries => {
31580        setIntersectingBlocks(oldIntersectingBlocks => {
31581          const newIntersectingBlocks = new Set(oldIntersectingBlocks);
31582  
31583          for (const entry of entries) {
31584            const clientId = entry.target.getAttribute('data-block');
31585            const action = entry.isIntersecting ? 'add' : 'delete';
31586            newIntersectingBlocks[action](clientId);
31587          }
31588  
31589          return newIntersectingBlocks;
31590        });
31591      });
31592    }, [setIntersectingBlocks]);
31593    const {
31594      order,
31595      selectedBlocks
31596    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
31597      const {
31598        getBlockOrder,
31599        getSelectedBlockClientIds
31600      } = select(store);
31601      return {
31602        order: getBlockOrder(rootClientId),
31603        selectedBlocks: getSelectedBlockClientIds()
31604      };
31605    }, [rootClientId]);
31606    return (0,external_wp_element_namespaceObject.createElement)(LayoutProvider, {
31607      value: layout
31608    }, (0,external_wp_element_namespaceObject.createElement)(IntersectionObserver.Provider, {
31609      value: intersectionObserver
31610    }, order.map(clientId => (0,external_wp_element_namespaceObject.createElement)(external_wp_data_namespaceObject.AsyncModeProvider, {
31611      key: clientId,
31612      value: // Only provide data asynchronously if the block is
31613      // not visible and not selected.
31614      !intersectingBlocks.has(clientId) && !selectedBlocks.includes(clientId)
31615    }, (0,external_wp_element_namespaceObject.createElement)(block, {
31616      rootClientId: rootClientId,
31617      clientId: clientId
31618    })))), order.length < 1 && placeholder, (0,external_wp_element_namespaceObject.createElement)(block_list_appender, {
31619      tagName: __experimentalAppenderTagName,
31620      rootClientId: rootClientId,
31621      renderAppender: renderAppender
31622    }));
31623  }
31624  
31625  function BlockListItems(props) {
31626    // This component needs to always be synchronous as it's the one changing
31627    // the async mode depending on the block selection.
31628    return (0,external_wp_element_namespaceObject.createElement)(external_wp_data_namespaceObject.AsyncModeProvider, {
31629      value: false
31630    }, (0,external_wp_element_namespaceObject.createElement)(Items, props));
31631  }
31632  
31633  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/colors-gradients/control.js
31634  
31635  
31636  
31637  /**
31638   * External dependencies
31639   */
31640  
31641  
31642  /**
31643   * WordPress dependencies
31644   */
31645  
31646  
31647  
31648  
31649  /**
31650   * Internal dependencies
31651   */
31652  
31653  
31654  const colorsAndGradientKeys = ['colors', 'disableCustomColors', 'gradients', 'disableCustomGradients'];
31655  
31656  function ColorGradientControlInner(_ref) {
31657    let {
31658      colors,
31659      gradients,
31660      disableCustomColors,
31661      disableCustomGradients,
31662      __experimentalHasMultipleOrigins,
31663      __experimentalIsRenderedInSidebar,
31664      className,
31665      label,
31666      onColorChange,
31667      onGradientChange,
31668      colorValue,
31669      gradientValue,
31670      clearable,
31671      showTitle = true,
31672      enableAlpha
31673    } = _ref;
31674    const canChooseAColor = onColorChange && (!(0,external_lodash_namespaceObject.isEmpty)(colors) || !disableCustomColors);
31675    const canChooseAGradient = onGradientChange && (!(0,external_lodash_namespaceObject.isEmpty)(gradients) || !disableCustomGradients);
31676    const [currentTab, setCurrentTab] = (0,external_wp_element_namespaceObject.useState)(gradientValue ? 'gradient' : !!canChooseAColor && 'color');
31677  
31678    if (!canChooseAColor && !canChooseAGradient) {
31679      return null;
31680    }
31681  
31682    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.BaseControl, {
31683      className: classnames_default()('block-editor-color-gradient-control', className)
31684    }, (0,external_wp_element_namespaceObject.createElement)("fieldset", {
31685      className: "block-editor-color-gradient-control__fieldset"
31686    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalVStack, {
31687      spacing: 1
31688    }, showTitle && (0,external_wp_element_namespaceObject.createElement)("legend", null, (0,external_wp_element_namespaceObject.createElement)("div", {
31689      className: "block-editor-color-gradient-control__color-indicator"
31690    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.BaseControl.VisualLabel, null, label))), canChooseAColor && canChooseAGradient && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalToggleGroupControl, {
31691      value: currentTab,
31692      onChange: setCurrentTab,
31693      label: (0,external_wp_i18n_namespaceObject.__)('Select color type'),
31694      hideLabelFromVision: true,
31695      isBlock: true
31696    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalToggleGroupControlOption, {
31697      value: "color",
31698      label: (0,external_wp_i18n_namespaceObject.__)('Solid')
31699    }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalToggleGroupControlOption, {
31700      value: "gradient",
31701      label: (0,external_wp_i18n_namespaceObject.__)('Gradient')
31702    })), (currentTab === 'color' || !canChooseAGradient) && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ColorPalette, {
31703      value: colorValue,
31704      onChange: canChooseAGradient ? newColor => {
31705        onColorChange(newColor);
31706        onGradientChange();
31707      } : onColorChange,
31708      colors,
31709      disableCustomColors,
31710      __experimentalHasMultipleOrigins: __experimentalHasMultipleOrigins,
31711      __experimentalIsRenderedInSidebar: __experimentalIsRenderedInSidebar,
31712      clearable: clearable,
31713      enableAlpha: enableAlpha
31714    }), (currentTab === 'gradient' || !canChooseAColor) && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.GradientPicker, {
31715      value: gradientValue,
31716      onChange: canChooseAColor ? newGradient => {
31717        onGradientChange(newGradient);
31718        onColorChange();
31719      } : onGradientChange,
31720      gradients,
31721      disableCustomGradients,
31722      __experimentalHasMultipleOrigins: __experimentalHasMultipleOrigins,
31723      __experimentalIsRenderedInSidebar: __experimentalIsRenderedInSidebar,
31724      clearable: clearable
31725    }))));
31726  }
31727  
31728  function ColorGradientControlSelect(props) {
31729    const colorGradientSettings = {};
31730    colorGradientSettings.colors = useSetting('color.palette');
31731    colorGradientSettings.gradients = useSetting('color.gradients');
31732    colorGradientSettings.disableCustomColors = !useSetting('color.custom');
31733    colorGradientSettings.disableCustomGradients = !useSetting('color.customGradient');
31734    return (0,external_wp_element_namespaceObject.createElement)(ColorGradientControlInner, _extends({}, colorGradientSettings, props));
31735  }
31736  
31737  function ColorGradientControl(props) {
31738    if ((0,external_lodash_namespaceObject.every)(colorsAndGradientKeys, key => props.hasOwnProperty(key))) {
31739      return (0,external_wp_element_namespaceObject.createElement)(ColorGradientControlInner, props);
31740    }
31741  
31742    return (0,external_wp_element_namespaceObject.createElement)(ColorGradientControlSelect, props);
31743  }
31744  
31745  /* harmony default export */ var control = (ColorGradientControl);
31746  
31747  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/colors-gradients/dropdown.js
31748  
31749  
31750  
31751  /**
31752   * External dependencies
31753   */
31754  
31755  /**
31756   * WordPress dependencies
31757   */
31758  
31759  
31760  /**
31761   * Internal dependencies
31762   */
31763  
31764  
31765  function ColorGradientSettingsDropdown(_ref) {
31766    let {
31767      colors,
31768      gradients,
31769      disableCustomColors,
31770      disableCustomGradients,
31771      __experimentalHasMultipleOrigins,
31772      __experimentalIsRenderedInSidebar,
31773      enableAlpha,
31774      settings
31775    } = _ref;
31776    let dropdownPosition;
31777  
31778    if (__experimentalIsRenderedInSidebar) {
31779      dropdownPosition = 'bottom left';
31780    }
31781  
31782    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalItemGroup, {
31783      isBordered: true,
31784      isSeparated: true,
31785      className: "block-editor-panel-color-gradient-settings__item-group"
31786    }, settings.map((setting, index) => setting && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Dropdown, {
31787      key: index,
31788      position: dropdownPosition,
31789      className: "block-editor-panel-color-gradient-settings__dropdown",
31790      contentClassName: "block-editor-panel-color-gradient-settings__dropdown-content",
31791      renderToggle: _ref2 => {
31792        var _setting$gradientValu;
31793  
31794        let {
31795          isOpen,
31796          onToggle
31797        } = _ref2;
31798        return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalItem, {
31799          onClick: onToggle,
31800          className: classnames_default()('block-editor-panel-color-gradient-settings__item', {
31801            'is-open': isOpen
31802          })
31803        }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalHStack, {
31804          justify: "flex-start"
31805        }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ColorIndicator, {
31806          className: "block-editor-panel-color-gradient-settings__color-indicator",
31807          colorValue: (_setting$gradientValu = setting.gradientValue) !== null && _setting$gradientValu !== void 0 ? _setting$gradientValu : setting.colorValue
31808        }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.FlexItem, null, setting.label)));
31809      },
31810      renderContent: () => (0,external_wp_element_namespaceObject.createElement)(control, _extends({
31811        showTitle: false,
31812        colors,
31813        gradients,
31814        disableCustomColors,
31815        disableCustomGradients,
31816        __experimentalHasMultipleOrigins,
31817        __experimentalIsRenderedInSidebar,
31818        enableAlpha
31819      }, setting))
31820    })));
31821  }
31822  
31823  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/colors-gradients/use-common-single-multiple-selects.js
31824  /**
31825   * Internal dependencies
31826   */
31827  
31828  function useCommonSingleMultipleSelects() {
31829    return {
31830      disableCustomColors: !useSetting('color.custom'),
31831      disableCustomGradients: !useSetting('color.customGradient')
31832    };
31833  }
31834  
31835  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/colors-gradients/use-multiple-origin-colors-and-gradients.js
31836  /**
31837   * WordPress dependencies
31838   */
31839  
31840  
31841  /**
31842   * Internal dependencies
31843   */
31844  
31845  
31846  
31847  /**
31848   * Retrieves color and gradient related settings.
31849   *
31850   * The arrays for colors and gradients are made up of color palettes from each
31851   * origin i.e. "Core", "Theme", and "User".
31852   *
31853   * @return {Object} Color and gradient related settings.
31854   */
31855  
31856  function useMultipleOriginColorsAndGradients() {
31857    const colorGradientSettings = useCommonSingleMultipleSelects();
31858    const customColors = useSetting('color.palette.custom');
31859    const themeColors = useSetting('color.palette.theme');
31860    const defaultColors = useSetting('color.palette.default');
31861    const shouldDisplayDefaultColors = useSetting('color.defaultPalette');
31862    colorGradientSettings.colors = (0,external_wp_element_namespaceObject.useMemo)(() => {
31863      const result = [];
31864  
31865      if (themeColors && themeColors.length) {
31866        result.push({
31867          name: (0,external_wp_i18n_namespaceObject._x)('Theme', 'Indicates this palette comes from the theme.'),
31868          colors: themeColors
31869        });
31870      }
31871  
31872      if (shouldDisplayDefaultColors && defaultColors && defaultColors.length) {
31873        result.push({
31874          name: (0,external_wp_i18n_namespaceObject._x)('Default', 'Indicates this palette comes from WordPress.'),
31875          colors: defaultColors
31876        });
31877      }
31878  
31879      if (customColors && customColors.length) {
31880        result.push({
31881          name: (0,external_wp_i18n_namespaceObject._x)('Custom', 'Indicates this palette comes from the theme.'),
31882          colors: customColors
31883        });
31884      }
31885  
31886      return result;
31887    }, [defaultColors, themeColors, customColors]);
31888    const customGradients = useSetting('color.gradients.custom');
31889    const themeGradients = useSetting('color.gradients.theme');
31890    const defaultGradients = useSetting('color.gradients.default');
31891    const shouldDisplayDefaultGradients = useSetting('color.defaultGradients');
31892    colorGradientSettings.gradients = (0,external_wp_element_namespaceObject.useMemo)(() => {
31893      const result = [];
31894  
31895      if (themeGradients && themeGradients.length) {
31896        result.push({
31897          name: (0,external_wp_i18n_namespaceObject._x)('Theme', 'Indicates this palette comes from the theme.'),
31898          gradients: themeGradients
31899        });
31900      }
31901  
31902      if (shouldDisplayDefaultGradients && defaultGradients && defaultGradients.length) {
31903        result.push({
31904          name: (0,external_wp_i18n_namespaceObject._x)('Default', 'Indicates this palette comes from WordPress.'),
31905          gradients: defaultGradients
31906        });
31907      }
31908  
31909      if (customGradients && customGradients.length) {
31910        result.push({
31911          name: (0,external_wp_i18n_namespaceObject._x)('Custom', 'Indicates this palette is created by the user.'),
31912          gradients: customGradients
31913        });
31914      }
31915  
31916      return result;
31917    }, [customGradients, themeGradients, defaultGradients]);
31918    return colorGradientSettings;
31919  }
31920  
31921  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/colors/utils.js
31922  /**
31923   * External dependencies
31924   */
31925  
31926  
31927  
31928  
31929  k([names, a11y]);
31930  /**
31931   * Provided an array of color objects as set by the theme or by the editor defaults,
31932   * and the values of the defined color or custom color returns a color object describing the color.
31933   *
31934   * @param {Array}   colors       Array of color objects as set by the theme or by the editor defaults.
31935   * @param {?string} definedColor A string containing the color slug.
31936   * @param {?string} customColor  A string containing the customColor value.
31937   *
31938   * @return {?Object} If definedColor is passed and the name is found in colors,
31939   *                   the color object exactly as set by the theme or editor defaults is returned.
31940   *                   Otherwise, an object that just sets the color is defined.
31941   */
31942  
31943  const getColorObjectByAttributeValues = (colors, definedColor, customColor) => {
31944    if (definedColor) {
31945      const colorObj = (0,external_lodash_namespaceObject.find)(colors, {
31946        slug: definedColor
31947      });
31948  
31949      if (colorObj) {
31950        return colorObj;
31951      }
31952    }
31953  
31954    return {
31955      color: customColor
31956    };
31957  };
31958  /**
31959   * Provided an array of color objects as set by the theme or by the editor defaults, and a color value returns the color object matching that value or undefined.
31960   *
31961   * @param {Array}   colors     Array of color objects as set by the theme or by the editor defaults.
31962   * @param {?string} colorValue A string containing the color value.
31963   *
31964   * @return {?Object} Color object included in the colors array whose color property equals colorValue.
31965   *                   Returns undefined if no color object matches this requirement.
31966   */
31967  
31968  const getColorObjectByColorValue = (colors, colorValue) => {
31969    return (0,external_lodash_namespaceObject.find)(colors, {
31970      color: colorValue
31971    });
31972  };
31973  /**
31974   * Returns a class based on the context a color is being used and its slug.
31975   *
31976   * @param {string} colorContextName Context/place where color is being used e.g: background, text etc...
31977   * @param {string} colorSlug        Slug of the color.
31978   *
31979   * @return {?string} String with the class corresponding to the color in the provided context.
31980   *                   Returns undefined if either colorContextName or colorSlug are not provided.
31981   */
31982  
31983  function getColorClassName(colorContextName, colorSlug) {
31984    if (!colorContextName || !colorSlug) {
31985      return undefined;
31986    }
31987  
31988    return `has-${(0,external_lodash_namespaceObject.kebabCase)(colorSlug)}-$colorContextName}`;
31989  }
31990  /**
31991   * Given an array of color objects and a color value returns the color value of the most readable color in the array.
31992   *
31993   * @param {Array}   colors     Array of color objects as set by the theme or by the editor defaults.
31994   * @param {?string} colorValue A string containing the color value.
31995   *
31996   * @return {string} String with the color value of the most readable color.
31997   */
31998  
31999  function getMostReadableColor(colors, colorValue) {
32000    const colordColor = w(colorValue);
32001    return (0,external_lodash_namespaceObject.maxBy)(colors, _ref => {
32002      let {
32003        color
32004      } = _ref;
32005      return colordColor.contrast(color);
32006    }).color;
32007  }
32008  
32009  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/border-color.js
32010  
32011  
32012  
32013  /**
32014   * External dependencies
32015   */
32016  
32017  /**
32018   * WordPress dependencies
32019   */
32020  
32021  
32022  
32023  
32024  
32025  /**
32026   * Internal dependencies
32027   */
32028  
32029  
32030  
32031  
32032  
32033  
32034   // Defining empty array here instead of inline avoids unnecessary re-renders of
32035  // color control.
32036  
32037  const border_color_EMPTY_ARRAY = [];
32038  /**
32039   * Inspector control panel containing the border color related configuration.
32040   *
32041   * There is deliberate overlap between the colors and borders block supports
32042   * relating to border color. It can be argued the border color controls could
32043   * be included within either, or both, the colors and borders panels in the
32044   * inspector controls. If they share the same block attributes it should not
32045   * matter.
32046   *
32047   * @param {Object} props Block properties.
32048   *
32049   * @return {WPElement} Border color edit element.
32050   */
32051  
32052  function BorderColorEdit(props) {
32053    const {
32054      attributes: {
32055        borderColor,
32056        style
32057      },
32058      setAttributes
32059    } = props;
32060    const colorGradientSettings = useMultipleOriginColorsAndGradients();
32061    const availableColors = colorGradientSettings.colors.reduce((colors, origin) => colors.concat(origin.colors), []);
32062    const {
32063      color: customBorderColor
32064    } = (style === null || style === void 0 ? void 0 : style.border) || {};
32065    const [colorValue, setColorValue] = (0,external_wp_element_namespaceObject.useState)(() => {
32066      var _getColorObjectByAttr;
32067  
32068      return (_getColorObjectByAttr = getColorObjectByAttributeValues(availableColors, borderColor, customBorderColor)) === null || _getColorObjectByAttr === void 0 ? void 0 : _getColorObjectByAttr.color;
32069    }); // Detect changes in the color attributes and update the colorValue to keep the
32070    // UI in sync. This is necessary for situations when border controls interact with
32071    // each other: eg, setting the border width to zero causes the color and style
32072    // selections to be cleared.
32073  
32074    (0,external_wp_element_namespaceObject.useEffect)(() => {
32075      var _getColorObjectByAttr2;
32076  
32077      setColorValue((_getColorObjectByAttr2 = getColorObjectByAttributeValues(availableColors, borderColor, customBorderColor)) === null || _getColorObjectByAttr2 === void 0 ? void 0 : _getColorObjectByAttr2.color);
32078    }, [borderColor, customBorderColor, availableColors]);
32079  
32080    const onChangeColor = value => {
32081      setColorValue(value);
32082      const colorObject = getColorObjectByColorValue(availableColors, value);
32083      const newStyle = { ...style,
32084        border: { ...(style === null || style === void 0 ? void 0 : style.border),
32085          color: colorObject !== null && colorObject !== void 0 && colorObject.slug ? undefined : value
32086        }
32087      }; // If empty slug, ensure undefined to remove attribute.
32088  
32089      const newNamedColor = colorObject !== null && colorObject !== void 0 && colorObject.slug ? colorObject.slug : undefined;
32090      setAttributes({
32091        style: cleanEmptyObject(newStyle),
32092        borderColor: newNamedColor
32093      });
32094    };
32095  
32096    const settings = [{
32097      label: (0,external_wp_i18n_namespaceObject.__)('Color'),
32098      onColorChange: onChangeColor,
32099      colorValue,
32100      clearable: false
32101    }];
32102    return (0,external_wp_element_namespaceObject.createElement)(ColorGradientSettingsDropdown, _extends({
32103      settings: settings,
32104      disableCustomColors: true,
32105      disableCustomGradients: true,
32106      __experimentalHasMultipleOrigins: true,
32107      __experimentalIsRenderedInSidebar: true,
32108      enableAlpha: true
32109    }, colorGradientSettings));
32110  }
32111  /**
32112   * Checks if there is a current value in the border color block support
32113   * attributes.
32114   *
32115   * @param {Object} props Block props.
32116   * @return {boolean}     Whether or not the block has a border color value set.
32117   */
32118  
32119  function hasBorderColorValue(props) {
32120    var _style$border;
32121  
32122    const {
32123      attributes: {
32124        borderColor,
32125        style
32126      }
32127    } = props;
32128    return !!borderColor || !!(style !== null && style !== void 0 && (_style$border = style.border) !== null && _style$border !== void 0 && _style$border.color);
32129  }
32130  /**
32131   * Resets the border color block support attributes. This can be used when
32132   * disabling the border color support controls for a block via a progressive
32133   * discovery panel.
32134   *
32135   * @param {Object} props               Block props.
32136   * @param {Object} props.attributes    Block's attributes.
32137   * @param {Object} props.setAttributes Function to set block's attributes.
32138   */
32139  
32140  function resetBorderColor(_ref) {
32141    let {
32142      attributes = {},
32143      setAttributes
32144    } = _ref;
32145    const {
32146      style
32147    } = attributes;
32148    setAttributes({
32149      borderColor: undefined,
32150      style: removeBorderAttribute(style, 'color')
32151    });
32152  }
32153  /**
32154   * Filters registered block settings, extending attributes to include
32155   * `borderColor` if needed.
32156   *
32157   * @param {Object} settings Original block settings.
32158   *
32159   * @return {Object} Updated block settings.
32160   */
32161  
32162  function addAttributes(settings) {
32163    if (!hasBorderSupport(settings, 'color')) {
32164      return settings;
32165    } // Allow blocks to specify default value if needed.
32166  
32167  
32168    if (settings.attributes.borderColor) {
32169      return settings;
32170    } // Add new borderColor attribute to block settings.
32171  
32172  
32173    return { ...settings,
32174      attributes: { ...settings.attributes,
32175        borderColor: {
32176          type: 'string'
32177        }
32178      }
32179    };
32180  }
32181  /**
32182   * Override props assigned to save component to inject border color.
32183   *
32184   * @param {Object} props      Additional props applied to save element.
32185   * @param {Object} blockType  Block type definition.
32186   * @param {Object} attributes Block's attributes.
32187   *
32188   * @return {Object} Filtered props to apply to save element.
32189   */
32190  
32191  
32192  function border_color_addSaveProps(props, blockType, attributes) {
32193    var _style$border2;
32194  
32195    if (!hasBorderSupport(blockType, 'color') || shouldSkipSerialization(blockType, BORDER_SUPPORT_KEY, 'color')) {
32196      return props;
32197    }
32198  
32199    const {
32200      borderColor,
32201      style
32202    } = attributes;
32203    const borderColorClass = getColorClassName('border-color', borderColor);
32204    const newClassName = classnames_default()(props.className, {
32205      'has-border-color': borderColor || (style === null || style === void 0 ? void 0 : (_style$border2 = style.border) === null || _style$border2 === void 0 ? void 0 : _style$border2.color),
32206      [borderColorClass]: !!borderColorClass
32207    }); // If we are clearing the last of the previous classes in `className`
32208    // set it to `undefined` to avoid rendering empty DOM attributes.
32209  
32210    props.className = newClassName ? newClassName : undefined;
32211    return props;
32212  }
32213  /**
32214   * Filters the registered block settings to apply border color styles and
32215   * classnames to the block edit wrapper.
32216   *
32217   * @param {Object} settings Original block settings.
32218   *
32219   * @return {Object} Filtered block settings.
32220   */
32221  
32222  
32223  function addEditProps(settings) {
32224    if (!hasBorderSupport(settings, 'color') || shouldSkipSerialization(settings, BORDER_SUPPORT_KEY, 'color')) {
32225      return settings;
32226    }
32227  
32228    const existingGetEditWrapperProps = settings.getEditWrapperProps;
32229  
32230    settings.getEditWrapperProps = attributes => {
32231      let props = {};
32232  
32233      if (existingGetEditWrapperProps) {
32234        props = existingGetEditWrapperProps(attributes);
32235      }
32236  
32237      return border_color_addSaveProps(props, settings, attributes);
32238    };
32239  
32240    return settings;
32241  }
32242  /**
32243   * This adds inline styles for color palette colors.
32244   * Ideally, this is not needed and themes should load their palettes on the editor.
32245   *
32246   * @param {Function} BlockListBlock Original component.
32247   *
32248   * @return {Function} Wrapped component.
32249   */
32250  
32251  
32252  const withBorderColorPaletteStyles = (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(BlockListBlock => props => {
32253    var _getColorObjectByAttr3, _props$wrapperProps;
32254  
32255    const {
32256      name,
32257      attributes
32258    } = props;
32259    const {
32260      borderColor
32261    } = attributes;
32262    const colors = useSetting('color.palette') || border_color_EMPTY_ARRAY;
32263  
32264    if (!hasBorderSupport(name, 'color') || shouldSkipSerialization(name, BORDER_SUPPORT_KEY, 'color')) {
32265      return (0,external_wp_element_namespaceObject.createElement)(BlockListBlock, props);
32266    }
32267  
32268    const extraStyles = {
32269      borderColor: borderColor ? (_getColorObjectByAttr3 = getColorObjectByAttributeValues(colors, borderColor)) === null || _getColorObjectByAttr3 === void 0 ? void 0 : _getColorObjectByAttr3.color : undefined
32270    };
32271    let wrapperProps = props.wrapperProps;
32272    wrapperProps = { ...props.wrapperProps,
32273      style: { ...extraStyles,
32274        ...((_props$wrapperProps = props.wrapperProps) === null || _props$wrapperProps === void 0 ? void 0 : _props$wrapperProps.style)
32275      }
32276    };
32277    return (0,external_wp_element_namespaceObject.createElement)(BlockListBlock, _extends({}, props, {
32278      wrapperProps: wrapperProps
32279    }));
32280  });
32281  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.registerBlockType', 'core/border/addAttributes', addAttributes);
32282  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.getSaveContent.extraProps', 'core/border/addSaveProps', border_color_addSaveProps);
32283  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.registerBlockType', 'core/border/addEditProps', addEditProps);
32284  (0,external_wp_hooks_namespaceObject.addFilter)('editor.BlockListBlock', 'core/border/with-border-color-palette-styles', withBorderColorPaletteStyles);
32285  
32286  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/border-radius-control/utils.js
32287  /**
32288   * WordPress dependencies
32289   */
32290  
32291  /**
32292   * Gets the (non-undefined) item with the highest occurrence within an array
32293   * Based in part on: https://stackoverflow.com/a/20762713
32294   *
32295   * Undefined values are always sorted to the end by `sort`, so this function
32296   * returns the first element, to always prioritize real values over undefined
32297   * values.
32298   *
32299   * See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#description
32300   *
32301   * @param {Array<any>} inputArray Array of items to check.
32302   * @return {any}                  The item with the most occurrences.
32303   */
32304  
32305  function mode(inputArray) {
32306    const arr = [...inputArray];
32307    return arr.sort((a, b) => inputArray.filter(v => v === b).length - inputArray.filter(v => v === a).length).shift();
32308  }
32309  /**
32310   * Returns the most common CSS unit in the radius values.
32311   * Falls back to `px` as a default unit.
32312   *
32313   * @param {Object|string} values Radius values.
32314   * @return {string}              Most common CSS unit in values. Default: `px`.
32315   */
32316  
32317  function getAllUnit() {
32318    let values = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
32319  
32320    if (typeof values === 'string') {
32321      const [, unit] = (0,external_wp_components_namespaceObject.__experimentalParseQuantityAndUnitFromRawValue)(values);
32322      return unit || 'px';
32323    }
32324  
32325    const allUnits = Object.values(values).map(value => {
32326      const [, unit] = (0,external_wp_components_namespaceObject.__experimentalParseQuantityAndUnitFromRawValue)(value);
32327      return unit;
32328    });
32329    return mode(allUnits) || 'px';
32330  }
32331  /**
32332   * Gets the 'all' input value and unit from values data.
32333   *
32334   * @param {Object|string} values Radius values.
32335   * @return {string}              A value + unit for the 'all' input.
32336   */
32337  
32338  function getAllValue() {
32339    let values = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
32340  
32341    /**
32342     * Border radius support was originally a single pixel value.
32343     *
32344     * To maintain backwards compatibility treat this case as the all value.
32345     */
32346    if (typeof values === 'string') {
32347      return values;
32348    }
32349  
32350    const parsedQuantitiesAndUnits = Object.values(values).map(value => (0,external_wp_components_namespaceObject.__experimentalParseQuantityAndUnitFromRawValue)(value));
32351    const allValues = parsedQuantitiesAndUnits.map(value => {
32352      var _value$;
32353  
32354      return (_value$ = value[0]) !== null && _value$ !== void 0 ? _value$ : '';
32355    });
32356    const allUnits = parsedQuantitiesAndUnits.map(value => value[1]);
32357    const value = allValues.every(v => v === allValues[0]) ? allValues[0] : '';
32358    const unit = mode(allUnits);
32359    const allValue = value === 0 || value ? `$value}$unit}` : undefined;
32360    return allValue;
32361  }
32362  /**
32363   * Checks to determine if values are mixed.
32364   *
32365   * @param {Object} values Radius values.
32366   * @return {boolean}      Whether values are mixed.
32367   */
32368  
32369  function hasMixedValues() {
32370    let values = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
32371    const allValue = getAllValue(values);
32372    const isMixed = typeof values === 'string' ? false : isNaN(parseFloat(allValue));
32373    return isMixed;
32374  }
32375  /**
32376   * Checks to determine if values are defined.
32377   *
32378   * @param {Object} values Radius values.
32379   * @return {boolean}      Whether values are mixed.
32380   */
32381  
32382  function hasDefinedValues(values) {
32383    if (!values) {
32384      return false;
32385    } // A string value represents a shorthand value.
32386  
32387  
32388    if (typeof values === 'string') {
32389      return true;
32390    } // An object represents longhand border radius values, if any are set
32391    // flag values as being defined.
32392  
32393  
32394    const filteredValues = Object.values(values).filter(value => {
32395      return !!value || value === 0;
32396    });
32397    return !!filteredValues.length;
32398  }
32399  
32400  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/border-radius-control/all-input-control.js
32401  
32402  
32403  
32404  /**
32405   * WordPress dependencies
32406   */
32407  
32408  
32409  /**
32410   * Internal dependencies
32411   */
32412  
32413  
32414  function AllInputControl(_ref) {
32415    let {
32416      onChange,
32417      values,
32418      ...props
32419    } = _ref;
32420    const allValue = getAllValue(values);
32421    const hasValues = hasDefinedValues(values);
32422    const isMixed = hasValues && hasMixedValues(values);
32423    const allPlaceholder = isMixed ? (0,external_wp_i18n_namespaceObject.__)('Mixed') : null;
32424    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalUnitControl, _extends({}, props, {
32425      "aria-label": (0,external_wp_i18n_namespaceObject.__)('Border radius'),
32426      disableUnits: isMixed,
32427      isOnly: true,
32428      value: allValue,
32429      onChange: onChange,
32430      placeholder: allPlaceholder
32431    }));
32432  }
32433  
32434  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/border-radius-control/input-controls.js
32435  
32436  
32437  
32438  /**
32439   * WordPress dependencies
32440   */
32441  
32442  
32443  const CORNERS = {
32444    topLeft: (0,external_wp_i18n_namespaceObject.__)('Top left'),
32445    topRight: (0,external_wp_i18n_namespaceObject.__)('Top right'),
32446    bottomLeft: (0,external_wp_i18n_namespaceObject.__)('Bottom left'),
32447    bottomRight: (0,external_wp_i18n_namespaceObject.__)('Bottom right')
32448  };
32449  function BoxInputControls(_ref) {
32450    let {
32451      onChange,
32452      values: valuesProp,
32453      ...props
32454    } = _ref;
32455  
32456    const createHandleOnChange = corner => next => {
32457      if (!onChange) {
32458        return;
32459      }
32460  
32461      onChange({ ...values,
32462        [corner]: next ? next : undefined
32463      });
32464    }; // For shorthand style & backwards compatibility, handle flat string value.
32465  
32466  
32467    const values = typeof valuesProp !== 'string' ? valuesProp : {
32468      topLeft: valuesProp,
32469      topRight: valuesProp,
32470      bottomLeft: valuesProp,
32471      bottomRight: valuesProp
32472    }; // Controls are wrapped in tooltips as visible labels aren't desired here.
32473  
32474    return (0,external_wp_element_namespaceObject.createElement)("div", {
32475      className: "components-border-radius-control__input-controls-wrapper"
32476    }, Object.entries(CORNERS).map(_ref2 => {
32477      let [key, label] = _ref2;
32478      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalUnitControl, _extends({}, props, {
32479        key: key,
32480        "aria-label": label,
32481        value: values[key],
32482        onChange: createHandleOnChange(key)
32483      }));
32484    }));
32485  }
32486  
32487  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/link.js
32488  
32489  
32490  /**
32491   * WordPress dependencies
32492   */
32493  
32494  const link_link = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
32495    xmlns: "http://www.w3.org/2000/svg",
32496    viewBox: "0 0 24 24"
32497  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
32498    d: "M15.6 7.2H14v1.5h1.6c2 0 3.7 1.7 3.7 3.7s-1.7 3.7-3.7 3.7H14v1.5h1.6c2.8 0 5.2-2.3 5.2-5.2 0-2.9-2.3-5.2-5.2-5.2zM4.7 12.4c0-2 1.7-3.7 3.7-3.7H10V7.2H8.4c-2.9 0-5.2 2.3-5.2 5.2 0 2.9 2.3 5.2 5.2 5.2H10v-1.5H8.4c-2 0-3.7-1.7-3.7-3.7zm4.6.9h5.3v-1.5H9.3v1.5z"
32499  }));
32500  /* harmony default export */ var library_link = (link_link);
32501  
32502  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/link-off.js
32503  
32504  
32505  /**
32506   * WordPress dependencies
32507   */
32508  
32509  const linkOff = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
32510    xmlns: "http://www.w3.org/2000/svg",
32511    viewBox: "0 0 24 24"
32512  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
32513    d: "M15.6 7.3h-.7l1.6-3.5-.9-.4-3.9 8.5H9v1.5h2l-1.3 2.8H8.4c-2 0-3.7-1.7-3.7-3.7s1.7-3.7 3.7-3.7H10V7.3H8.4c-2.9 0-5.2 2.3-5.2 5.2 0 2.9 2.3 5.2 5.2 5.2H9l-1.4 3.2.9.4 5.7-12.5h1.4c2 0 3.7 1.7 3.7 3.7s-1.7 3.7-3.7 3.7H14v1.5h1.6c2.9 0 5.2-2.3 5.2-5.2 0-2.9-2.4-5.2-5.2-5.2z"
32514  }));
32515  /* harmony default export */ var link_off = (linkOff);
32516  
32517  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/border-radius-control/linked-button.js
32518  
32519  
32520  
32521  /**
32522   * WordPress dependencies
32523   */
32524  
32525  
32526  
32527  function LinkedButton(_ref) {
32528    let {
32529      isLinked,
32530      ...props
32531    } = _ref;
32532    const label = isLinked ? (0,external_wp_i18n_namespaceObject.__)('Unlink Radii') : (0,external_wp_i18n_namespaceObject.__)('Link Radii');
32533    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Tooltip, {
32534      text: label
32535    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, _extends({}, props, {
32536      className: "component-border-radius-control__linked-button",
32537      isPrimary: isLinked,
32538      isSecondary: !isLinked,
32539      isSmall: true,
32540      icon: isLinked ? library_link : link_off,
32541      iconSize: 16,
32542      "aria-label": label
32543    })));
32544  }
32545  
32546  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/border-radius-control/index.js
32547  
32548  
32549  /**
32550   * WordPress dependencies
32551   */
32552  
32553  
32554  
32555  /**
32556   * Internal dependencies
32557   */
32558  
32559  
32560  
32561  
32562  
32563  
32564  const DEFAULT_VALUES = {
32565    topLeft: null,
32566    topRight: null,
32567    bottomLeft: null,
32568    bottomRight: null
32569  };
32570  const MIN_BORDER_RADIUS_VALUE = 0;
32571  const MAX_BORDER_RADIUS_VALUES = {
32572    px: 100,
32573    em: 20,
32574    rem: 20
32575  };
32576  /**
32577   * Control to display border radius options.
32578   *
32579   * @param {Object}   props          Component props.
32580   * @param {Function} props.onChange Callback to handle onChange.
32581   * @param {Object}   props.values   Border radius values.
32582   *
32583   * @return {WPElement}              Custom border radius control.
32584   */
32585  
32586  function BorderRadiusControl(_ref) {
32587    let {
32588      onChange,
32589      values
32590    } = _ref;
32591    const [isLinked, setIsLinked] = (0,external_wp_element_namespaceObject.useState)(!hasDefinedValues(values) || !hasMixedValues(values));
32592    const units = (0,external_wp_components_namespaceObject.__experimentalUseCustomUnits)({
32593      availableUnits: useSetting('spacing.units') || ['px', 'em', 'rem']
32594    });
32595    const unit = getAllUnit(values);
32596    const unitConfig = units && units.find(item => item.value === unit);
32597    const step = (unitConfig === null || unitConfig === void 0 ? void 0 : unitConfig.step) || 1;
32598    const [allValue] = (0,external_wp_components_namespaceObject.__experimentalParseQuantityAndUnitFromRawValue)(getAllValue(values));
32599  
32600    const toggleLinked = () => setIsLinked(!isLinked);
32601  
32602    const handleSliderChange = next => {
32603      onChange(next !== undefined ? `$next}$unit}` : undefined);
32604    };
32605  
32606    return (0,external_wp_element_namespaceObject.createElement)("fieldset", {
32607      className: "components-border-radius-control"
32608    }, (0,external_wp_element_namespaceObject.createElement)("legend", null, (0,external_wp_i18n_namespaceObject.__)('Radius')), (0,external_wp_element_namespaceObject.createElement)("div", {
32609      className: "components-border-radius-control__wrapper"
32610    }, isLinked ? (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(AllInputControl, {
32611      className: "components-border-radius-control__unit-control",
32612      values: values,
32613      min: MIN_BORDER_RADIUS_VALUE,
32614      onChange: onChange,
32615      units: units
32616    }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.RangeControl, {
32617      className: "components-border-radius-control__range-control",
32618      value: allValue !== null && allValue !== void 0 ? allValue : '',
32619      min: MIN_BORDER_RADIUS_VALUE,
32620      max: MAX_BORDER_RADIUS_VALUES[unit],
32621      initialPosition: 0,
32622      withInputField: false,
32623      onChange: handleSliderChange,
32624      step: step
32625    })) : (0,external_wp_element_namespaceObject.createElement)(BoxInputControls, {
32626      min: MIN_BORDER_RADIUS_VALUE,
32627      onChange: onChange,
32628      values: values || DEFAULT_VALUES,
32629      units: units
32630    }), (0,external_wp_element_namespaceObject.createElement)(LinkedButton, {
32631      onClick: toggleLinked,
32632      isLinked: isLinked
32633    })));
32634  }
32635  
32636  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/border-radius.js
32637  
32638  
32639  /**
32640   * Internal dependencies
32641   */
32642  
32643  
32644  
32645  /**
32646   * Inspector control panel containing the border radius related configuration.
32647   *
32648   * @param {Object} props Block properties.
32649   *
32650   * @return {WPElement} Border radius edit element.
32651   */
32652  
32653  function BorderRadiusEdit(props) {
32654    var _style$border;
32655  
32656    const {
32657      attributes: {
32658        style
32659      },
32660      setAttributes
32661    } = props;
32662  
32663    const onChange = newRadius => {
32664      let newStyle = { ...style,
32665        border: { ...(style === null || style === void 0 ? void 0 : style.border),
32666          radius: newRadius
32667        }
32668      };
32669  
32670      if (newRadius === undefined || newRadius === '') {
32671        newStyle = cleanEmptyObject(newStyle);
32672      }
32673  
32674      setAttributes({
32675        style: newStyle
32676      });
32677    };
32678  
32679    return (0,external_wp_element_namespaceObject.createElement)(BorderRadiusControl, {
32680      values: style === null || style === void 0 ? void 0 : (_style$border = style.border) === null || _style$border === void 0 ? void 0 : _style$border.radius,
32681      onChange: onChange
32682    });
32683  }
32684  /**
32685   * Checks if there is a current value in the border radius block support
32686   * attributes.
32687   *
32688   * @param {Object} props Block props.
32689   * @return {boolean}     Whether or not the block has a border radius value set.
32690   */
32691  
32692  function hasBorderRadiusValue(props) {
32693    var _props$attributes$sty, _props$attributes$sty2;
32694  
32695    const borderRadius = (_props$attributes$sty = props.attributes.style) === null || _props$attributes$sty === void 0 ? void 0 : (_props$attributes$sty2 = _props$attributes$sty.border) === null || _props$attributes$sty2 === void 0 ? void 0 : _props$attributes$sty2.radius;
32696  
32697    if (typeof borderRadius === 'object') {
32698      return Object.entries(borderRadius).some(Boolean);
32699    }
32700  
32701    return !!borderRadius;
32702  }
32703  /**
32704   * Resets the border radius block support attributes. This can be used when
32705   * disabling the border radius support controls for a block via a progressive
32706   * discovery panel.
32707   *
32708   * @param {Object} props               Block props.
32709   * @param {Object} props.attributes    Block's attributes.
32710   * @param {Object} props.setAttributes Function to set block's attributes.
32711   */
32712  
32713  function resetBorderRadius(_ref) {
32714    let {
32715      attributes = {},
32716      setAttributes
32717    } = _ref;
32718    const {
32719      style
32720    } = attributes;
32721    setAttributes({
32722      style: removeBorderAttribute(style, 'radius')
32723    });
32724  }
32725  
32726  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/line-solid.js
32727  
32728  
32729  /**
32730   * WordPress dependencies
32731   */
32732  
32733  const lineSolid = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
32734    xmlns: "http://www.w3.org/2000/svg",
32735    width: "24",
32736    height: "24",
32737    fill: "none"
32738  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
32739    d: "M5 11.25h14v1.5H5z"
32740  }));
32741  /* harmony default export */ var line_solid = (lineSolid);
32742  
32743  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/line-dashed.js
32744  
32745  
32746  /**
32747   * WordPress dependencies
32748   */
32749  
32750  const lineDashed = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
32751    xmlns: "http://www.w3.org/2000/svg",
32752    width: "24",
32753    height: "24",
32754    fill: "none"
32755  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
32756    fillRule: "evenodd",
32757    d: "M5 11.25h3v1.5H5v-1.5zm5.5 0h3v1.5h-3v-1.5zm8.5 0h-3v1.5h3v-1.5z",
32758    clipRule: "evenodd"
32759  }));
32760  /* harmony default export */ var line_dashed = (lineDashed);
32761  
32762  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/line-dotted.js
32763  
32764  
32765  /**
32766   * WordPress dependencies
32767   */
32768  
32769  const lineDotted = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
32770    xmlns: "http://www.w3.org/2000/svg",
32771    width: "24",
32772    height: "24",
32773    fill: "none"
32774  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
32775    fillRule: "evenodd",
32776    d: "M5.25 11.25h1.5v1.5h-1.5v-1.5zm3 0h1.5v1.5h-1.5v-1.5zm4.5 0h-1.5v1.5h1.5v-1.5zm1.5 0h1.5v1.5h-1.5v-1.5zm4.5 0h-1.5v1.5h1.5v-1.5z",
32777    clipRule: "evenodd"
32778  }));
32779  /* harmony default export */ var line_dotted = (lineDotted);
32780  
32781  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/border-style-control/index.js
32782  
32783  
32784  /**
32785   * WordPress dependencies
32786   */
32787  
32788  
32789  
32790  const BORDER_STYLES = [{
32791    label: (0,external_wp_i18n_namespaceObject.__)('Solid'),
32792    icon: line_solid,
32793    value: 'solid'
32794  }, {
32795    label: (0,external_wp_i18n_namespaceObject.__)('Dashed'),
32796    icon: line_dashed,
32797    value: 'dashed'
32798  }, {
32799    label: (0,external_wp_i18n_namespaceObject.__)('Dotted'),
32800    icon: line_dotted,
32801    value: 'dotted'
32802  }];
32803  /**
32804   * Control to display border style options.
32805   *
32806   * @param {Object}   props          Component props.
32807   * @param {Function} props.onChange Handler for changing border style selection.
32808   * @param {string}   props.value    Currently selected border style value.
32809   *
32810   * @return {WPElement} Custom border style segmented control.
32811   */
32812  
32813  function BorderStyleControl(_ref) {
32814    let {
32815      onChange,
32816      value
32817    } = _ref;
32818    return (0,external_wp_element_namespaceObject.createElement)("fieldset", {
32819      className: "components-border-style-control"
32820    }, (0,external_wp_element_namespaceObject.createElement)("legend", null, (0,external_wp_i18n_namespaceObject.__)('Style')), (0,external_wp_element_namespaceObject.createElement)("div", {
32821      className: "components-border-style-control__buttons"
32822    }, BORDER_STYLES.map(borderStyle => (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
32823      key: borderStyle.value,
32824      icon: borderStyle.icon,
32825      isSmall: true,
32826      isPressed: borderStyle.value === value,
32827      onClick: () => onChange(borderStyle.value === value ? undefined : borderStyle.value),
32828      "aria-label": borderStyle.label
32829    }))));
32830  }
32831  
32832  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/border-style.js
32833  
32834  
32835  /**
32836   * Internal dependencies
32837   */
32838  
32839  
32840  
32841  /**
32842   * Inspector control for configuring border style property.
32843   *
32844   * @param {Object} props Block properties.
32845   *
32846   * @return {WPElement} Border style edit element.
32847   */
32848  
32849  const BorderStyleEdit = props => {
32850    var _style$border;
32851  
32852    const {
32853      attributes: {
32854        style
32855      },
32856      setAttributes
32857    } = props;
32858  
32859    const onChange = newBorderStyle => {
32860      const newStyleAttributes = { ...style,
32861        border: { ...(style === null || style === void 0 ? void 0 : style.border),
32862          style: newBorderStyle
32863        }
32864      };
32865      setAttributes({
32866        style: cleanEmptyObject(newStyleAttributes)
32867      });
32868    };
32869  
32870    return (0,external_wp_element_namespaceObject.createElement)(BorderStyleControl, {
32871      value: style === null || style === void 0 ? void 0 : (_style$border = style.border) === null || _style$border === void 0 ? void 0 : _style$border.style,
32872      onChange: onChange
32873    });
32874  };
32875  /**
32876   * Checks if there is a current value in the border style block support
32877   * attributes.
32878   *
32879   * @param {Object} props Block props.
32880   * @return {boolean}     Whether or not the block has a border style value set.
32881   */
32882  
32883  function hasBorderStyleValue(props) {
32884    var _props$attributes$sty, _props$attributes$sty2;
32885  
32886    return !!((_props$attributes$sty = props.attributes.style) !== null && _props$attributes$sty !== void 0 && (_props$attributes$sty2 = _props$attributes$sty.border) !== null && _props$attributes$sty2 !== void 0 && _props$attributes$sty2.style);
32887  }
32888  /**
32889   * Resets the border style block support attribute. This can be used when
32890   * disabling the border style support control for a block via a progressive
32891   * discovery panel.
32892   *
32893   * @param {Object} props               Block props.
32894   * @param {Object} props.attributes    Block's attributes.
32895   * @param {Object} props.setAttributes Function to set block's attributes.
32896   */
32897  
32898  function resetBorderStyle(_ref) {
32899    let {
32900      attributes = {},
32901      setAttributes
32902    } = _ref;
32903    const {
32904      style
32905    } = attributes;
32906    setAttributes({
32907      style: removeBorderAttribute(style, 'style')
32908    });
32909  }
32910  
32911  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/border-width.js
32912  
32913  
32914  /**
32915   * WordPress dependencies
32916   */
32917  
32918  
32919  
32920  /**
32921   * Internal dependencies
32922   */
32923  
32924  
32925  
32926  
32927  const MIN_BORDER_WIDTH = 0;
32928  /**
32929   * Inspector control for configuring border width property.
32930   *
32931   * @param {Object} props Block properties.
32932   *
32933   * @return {WPElement} Border width edit element.
32934   */
32935  
32936  const BorderWidthEdit = props => {
32937    const {
32938      attributes: {
32939        borderColor,
32940        style
32941      },
32942      setAttributes
32943    } = props;
32944    const {
32945      width,
32946      color: customBorderColor,
32947      style: borderStyle
32948    } = (style === null || style === void 0 ? void 0 : style.border) || {}; // Used to temporarily track previous border color & style selections to be
32949    // able to restore them when border width changes from zero value.
32950  
32951    const [styleSelection, setStyleSelection] = (0,external_wp_element_namespaceObject.useState)();
32952    const [colorSelection, setColorSelection] = (0,external_wp_element_namespaceObject.useState)();
32953    const [customColorSelection, setCustomColorSelection] = (0,external_wp_element_namespaceObject.useState)();
32954  
32955    const onChange = newWidth => {
32956      let newStyle = { ...style,
32957        border: { ...(style === null || style === void 0 ? void 0 : style.border),
32958          width: newWidth
32959        }
32960      }; // Used to clear named border color attribute.
32961  
32962      let borderPaletteColor = borderColor;
32963      const hasZeroWidth = parseFloat(newWidth) === 0;
32964      const hadPreviousZeroWidth = parseFloat(width) === 0; // Setting the border width explicitly to zero will also set the
32965      // border style to `none` and clear border color attributes.
32966  
32967      if (hasZeroWidth && !hadPreviousZeroWidth) {
32968        // Before clearing color and style selections, keep track of
32969        // the current selections so they can be restored when the width
32970        // changes to a non-zero value.
32971        setColorSelection(borderColor);
32972        setCustomColorSelection(customBorderColor);
32973        setStyleSelection(borderStyle); // Clear style and color attributes.
32974  
32975        borderPaletteColor = undefined;
32976        newStyle.border.color = undefined;
32977        newStyle.border.style = 'none';
32978      }
32979  
32980      if (!hasZeroWidth && hadPreviousZeroWidth) {
32981        // Restore previous border style selection if width is now not zero and
32982        // border style was 'none'. This is to support changes to the UI which
32983        // change the border style UI to a segmented control without a "none"
32984        // option.
32985        if (borderStyle === 'none') {
32986          newStyle.border.style = styleSelection;
32987        } // Restore previous border color selection if width is no longer zero
32988        // and current border color is undefined.
32989  
32990  
32991        if (borderColor === undefined) {
32992          borderPaletteColor = colorSelection;
32993          newStyle.border.color = customColorSelection;
32994        }
32995      } // If width was reset, clean out undefined styles.
32996  
32997  
32998      if (newWidth === undefined || newWidth === '') {
32999        newStyle = cleanEmptyObject(newStyle);
33000      }
33001  
33002      setAttributes({
33003        borderColor: borderPaletteColor,
33004        style: newStyle
33005      });
33006    };
33007  
33008    const units = (0,external_wp_components_namespaceObject.__experimentalUseCustomUnits)({
33009      availableUnits: useSetting('spacing.units') || ['px', 'em', 'rem']
33010    });
33011    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalUnitControl, {
33012      value: width,
33013      label: (0,external_wp_i18n_namespaceObject.__)('Width'),
33014      min: MIN_BORDER_WIDTH,
33015      onChange: onChange,
33016      units: units
33017    });
33018  };
33019  /**
33020   * Checks if there is a current value in the border width block support
33021   * attributes.
33022   *
33023   * @param {Object} props Block props.
33024   * @return {boolean}     Whether or not the block has a border width value set.
33025   */
33026  
33027  function hasBorderWidthValue(props) {
33028    var _props$attributes$sty, _props$attributes$sty2;
33029  
33030    return !!((_props$attributes$sty = props.attributes.style) !== null && _props$attributes$sty !== void 0 && (_props$attributes$sty2 = _props$attributes$sty.border) !== null && _props$attributes$sty2 !== void 0 && _props$attributes$sty2.width);
33031  }
33032  /**
33033   * Resets the border width block support attribute. This can be used when
33034   * disabling the border width support control for a block via a progressive
33035   * discovery panel.
33036   *
33037   * @param {Object} props               Block props.
33038   * @param {Object} props.attributes    Block's attributes.
33039   * @param {Object} props.setAttributes Function to set block's attributes.
33040   */
33041  
33042  function resetBorderWidth(_ref) {
33043    let {
33044      attributes = {},
33045      setAttributes
33046    } = _ref;
33047    const {
33048      style
33049    } = attributes;
33050    setAttributes({
33051      style: removeBorderAttribute(style, 'width')
33052    });
33053  }
33054  
33055  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/border.js
33056  
33057  
33058  /**
33059   * WordPress dependencies
33060   */
33061  
33062  
33063  
33064  
33065  /**
33066   * Internal dependencies
33067   */
33068  
33069  
33070  
33071  
33072  
33073  
33074  
33075  
33076  const BORDER_SUPPORT_KEY = '__experimentalBorder';
33077  function BorderPanel(props) {
33078    const {
33079      clientId
33080    } = props;
33081    const isColorSupported = useSetting('border.color') && hasBorderSupport(props.name, 'color');
33082    const isRadiusSupported = useSetting('border.radius') && hasBorderSupport(props.name, 'radius');
33083    const isStyleSupported = useSetting('border.style') && hasBorderSupport(props.name, 'style');
33084    const isWidthSupported = useSetting('border.width') && hasBorderSupport(props.name, 'width');
33085    const isDisabled = [!isColorSupported, !isRadiusSupported, !isStyleSupported, !isWidthSupported].every(Boolean);
33086  
33087    if (isDisabled) {
33088      return null;
33089    }
33090  
33091    const defaultBorderControls = (0,external_wp_blocks_namespaceObject.getBlockSupport)(props.name, [BORDER_SUPPORT_KEY, '__experimentalDefaultControls']);
33092  
33093    const createResetAllFilter = function (borderAttribute) {
33094      let topLevelAttributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
33095      return newAttributes => {
33096        var _newAttributes$style;
33097  
33098        return { ...newAttributes,
33099          ...topLevelAttributes,
33100          style: { ...newAttributes.style,
33101            border: { ...((_newAttributes$style = newAttributes.style) === null || _newAttributes$style === void 0 ? void 0 : _newAttributes$style.border),
33102              [borderAttribute]: undefined
33103            }
33104          }
33105        };
33106      };
33107    };
33108  
33109    return (0,external_wp_element_namespaceObject.createElement)(inspector_controls, {
33110      __experimentalGroup: "border"
33111    }, isWidthSupported && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalToolsPanelItem, {
33112      className: "single-column",
33113      hasValue: () => hasBorderWidthValue(props),
33114      label: (0,external_wp_i18n_namespaceObject.__)('Width'),
33115      onDeselect: () => resetBorderWidth(props),
33116      isShownByDefault: defaultBorderControls === null || defaultBorderControls === void 0 ? void 0 : defaultBorderControls.width,
33117      resetAllFilter: createResetAllFilter('width'),
33118      panelId: clientId
33119    }, (0,external_wp_element_namespaceObject.createElement)(BorderWidthEdit, props)), isStyleSupported && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalToolsPanelItem, {
33120      className: "single-column",
33121      hasValue: () => hasBorderStyleValue(props),
33122      label: (0,external_wp_i18n_namespaceObject.__)('Style'),
33123      onDeselect: () => resetBorderStyle(props),
33124      isShownByDefault: defaultBorderControls === null || defaultBorderControls === void 0 ? void 0 : defaultBorderControls.style,
33125      resetAllFilter: createResetAllFilter('style'),
33126      panelId: clientId
33127    }, (0,external_wp_element_namespaceObject.createElement)(BorderStyleEdit, props)), isColorSupported && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalToolsPanelItem, {
33128      hasValue: () => hasBorderColorValue(props),
33129      label: (0,external_wp_i18n_namespaceObject.__)('Color'),
33130      onDeselect: () => resetBorderColor(props),
33131      isShownByDefault: defaultBorderControls === null || defaultBorderControls === void 0 ? void 0 : defaultBorderControls.color,
33132      resetAllFilter: createResetAllFilter('color', {
33133        borderColor: undefined
33134      }),
33135      panelId: clientId
33136    }, (0,external_wp_element_namespaceObject.createElement)(BorderColorEdit, props)), isRadiusSupported && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalToolsPanelItem, {
33137      hasValue: () => hasBorderRadiusValue(props),
33138      label: (0,external_wp_i18n_namespaceObject.__)('Radius'),
33139      onDeselect: () => resetBorderRadius(props),
33140      isShownByDefault: defaultBorderControls === null || defaultBorderControls === void 0 ? void 0 : defaultBorderControls.radius,
33141      resetAllFilter: createResetAllFilter('radius'),
33142      panelId: clientId
33143    }, (0,external_wp_element_namespaceObject.createElement)(BorderRadiusEdit, props)));
33144  }
33145  /**
33146   * Determine whether there is block support for border properties.
33147   *
33148   * @param {string} blockName Block name.
33149   * @param {string} feature   Border feature to check support for.
33150   *
33151   * @return {boolean} Whether there is support.
33152   */
33153  
33154  function hasBorderSupport(blockName) {
33155    let feature = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'any';
33156  
33157    if (external_wp_element_namespaceObject.Platform.OS !== 'web') {
33158      return false;
33159    }
33160  
33161    const support = (0,external_wp_blocks_namespaceObject.getBlockSupport)(blockName, BORDER_SUPPORT_KEY);
33162  
33163    if (support === true) {
33164      return true;
33165    }
33166  
33167    if (feature === 'any') {
33168      return !!(support !== null && support !== void 0 && support.color || support !== null && support !== void 0 && support.radius || support !== null && support !== void 0 && support.width || support !== null && support !== void 0 && support.style);
33169    }
33170  
33171    return !!(support !== null && support !== void 0 && support[feature]);
33172  }
33173  /**
33174   * Returns a new style object where the specified border attribute has been
33175   * removed.
33176   *
33177   * @param {Object} style     Styles from block attributes.
33178   * @param {string} attribute The border style attribute to clear.
33179   *
33180   * @return {Object} Style object with the specified attribute removed.
33181   */
33182  
33183  function removeBorderAttribute(style, attribute) {
33184    return cleanEmptyObject({ ...style,
33185      border: { ...(style === null || style === void 0 ? void 0 : style.border),
33186        [attribute]: undefined
33187      }
33188    });
33189  }
33190  
33191  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/gradients/use-gradient.js
33192  /**
33193   * External dependencies
33194   */
33195  
33196  /**
33197   * WordPress dependencies
33198   */
33199  
33200  
33201  
33202  /**
33203   * Internal dependencies
33204   */
33205  
33206  
33207  
33208  
33209  function __experimentalGetGradientClass(gradientSlug) {
33210    if (!gradientSlug) {
33211      return undefined;
33212    }
33213  
33214    return `has-$gradientSlug}-gradient-background`;
33215  }
33216  /**
33217   * Retrieves the gradient value per slug.
33218   *
33219   * @param {Array}  gradients Gradient Palette
33220   * @param {string} slug      Gradient slug
33221   *
33222   * @return {string} Gradient value.
33223   */
33224  
33225  function getGradientValueBySlug(gradients, slug) {
33226    const gradient = (0,external_lodash_namespaceObject.find)(gradients, ['slug', slug]);
33227    return gradient && gradient.gradient;
33228  }
33229  function __experimentalGetGradientObjectByGradientValue(gradients, value) {
33230    const gradient = (0,external_lodash_namespaceObject.find)(gradients, ['gradient', value]);
33231    return gradient;
33232  }
33233  /**
33234   * Retrieves the gradient slug per slug.
33235   *
33236   * @param {Array}  gradients Gradient Palette
33237   * @param {string} value     Gradient value
33238   * @return {string} Gradient slug.
33239   */
33240  
33241  function getGradientSlugByValue(gradients, value) {
33242    const gradient = __experimentalGetGradientObjectByGradientValue(gradients, value);
33243  
33244    return gradient && gradient.slug;
33245  }
33246  function __experimentalUseGradient() {
33247    let {
33248      gradientAttribute = 'gradient',
33249      customGradientAttribute = 'customGradient'
33250    } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
33251    const {
33252      clientId
33253    } = useBlockEditContext();
33254    const userGradientPalette = useSetting('color.gradients.custom');
33255    const themeGradientPalette = useSetting('color.gradients.theme');
33256    const defaultGradientPalette = useSetting('color.gradients.default');
33257    const allGradients = (0,external_wp_element_namespaceObject.useMemo)(() => [...(userGradientPalette || []), ...(themeGradientPalette || []), ...(defaultGradientPalette || [])], [userGradientPalette, themeGradientPalette, defaultGradientPalette]);
33258    const {
33259      gradient,
33260      customGradient
33261    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
33262      const {
33263        getBlockAttributes
33264      } = select(store);
33265      const attributes = getBlockAttributes(clientId) || {};
33266      return {
33267        customGradient: attributes[customGradientAttribute],
33268        gradient: attributes[gradientAttribute]
33269      };
33270    }, [clientId, gradientAttribute, customGradientAttribute]);
33271    const {
33272      updateBlockAttributes
33273    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
33274    const setGradient = (0,external_wp_element_namespaceObject.useCallback)(newGradientValue => {
33275      const slug = getGradientSlugByValue(allGradients, newGradientValue);
33276  
33277      if (slug) {
33278        updateBlockAttributes(clientId, {
33279          [gradientAttribute]: slug,
33280          [customGradientAttribute]: undefined
33281        });
33282        return;
33283      }
33284  
33285      updateBlockAttributes(clientId, {
33286        [gradientAttribute]: undefined,
33287        [customGradientAttribute]: newGradientValue
33288      });
33289    }, [allGradients, clientId, updateBlockAttributes]);
33290  
33291    const gradientClass = __experimentalGetGradientClass(gradient);
33292  
33293    let gradientValue;
33294  
33295    if (gradient) {
33296      gradientValue = getGradientValueBySlug(allGradients, gradient);
33297    } else {
33298      gradientValue = customGradient;
33299    }
33300  
33301    return {
33302      gradientClass,
33303      gradientValue,
33304      setGradient
33305    };
33306  }
33307  
33308  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/contrast-checker/index.js
33309  
33310  
33311  /**
33312   * External dependencies
33313   */
33314  
33315  
33316  
33317  /**
33318   * WordPress dependencies
33319   */
33320  
33321  
33322  
33323  
33324  k([names, a11y]);
33325  
33326  function ContrastChecker(_ref) {
33327    let {
33328      backgroundColor,
33329      fallbackBackgroundColor,
33330      fallbackTextColor,
33331      fallbackLinkColor,
33332      fontSize,
33333      // Font size value in pixels.
33334      isLargeText,
33335      textColor,
33336      linkColor,
33337      enableAlphaChecker = false
33338    } = _ref;
33339    const currentBackgroundColor = backgroundColor || fallbackBackgroundColor; // Must have a background color.
33340  
33341    if (!currentBackgroundColor) {
33342      return null;
33343    }
33344  
33345    const currentTextColor = textColor || fallbackTextColor;
33346    const currentLinkColor = linkColor || fallbackLinkColor; // Must have at least one text color.
33347  
33348    if (!currentTextColor && !currentLinkColor) {
33349      return null;
33350    }
33351  
33352    const textColors = [{
33353      color: currentTextColor,
33354      description: (0,external_wp_i18n_namespaceObject.__)('text color')
33355    }, {
33356      color: currentLinkColor,
33357      description: (0,external_wp_i18n_namespaceObject.__)('link color')
33358    }];
33359    const colordBackgroundColor = w(currentBackgroundColor);
33360    const backgroundColorHasTransparency = colordBackgroundColor.alpha() < 1;
33361    const backgroundColorBrightness = colordBackgroundColor.brightness();
33362    const isReadableOptions = {
33363      level: 'AA',
33364      size: isLargeText || isLargeText !== false && fontSize >= 24 ? 'large' : 'small'
33365    };
33366    let message = '';
33367    let speakMessage = '';
33368  
33369    for (const item of textColors) {
33370      // If there is no color, go no further.
33371      if (!item.color) {
33372        continue;
33373      }
33374  
33375      const colordTextColor = w(item.color);
33376      const isColordTextReadable = colordTextColor.isReadable(colordBackgroundColor, isReadableOptions);
33377      const textHasTransparency = colordTextColor.alpha() < 1; // If the contrast is not readable.
33378  
33379      if (!isColordTextReadable) {
33380        // Don't show the message if the background or text is transparent.
33381        if (backgroundColorHasTransparency || textHasTransparency) {
33382          continue;
33383        }
33384  
33385        message = backgroundColorBrightness < colordTextColor.brightness() ? (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %s is a type of text color, e.g., "text color" or "link color".
33386        (0,external_wp_i18n_namespaceObject.__)('This color combination may be hard for people to read. Try using a darker background color and/or a brighter %s.'), item.description) : (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %s is a type of text color, e.g., "text color" or "link color".
33387        (0,external_wp_i18n_namespaceObject.__)('This color combination may be hard for people to read. Try using a brighter background color and/or a darker %s.'), item.description);
33388        speakMessage = (0,external_wp_i18n_namespaceObject.__)('This color combination may be hard for people to read.'); // Break from the loop when we have a contrast warning.
33389        // These messages take priority over the transparency warning.
33390  
33391        break;
33392      } // If there is no contrast warning and the text is transparent,
33393      // show the transparent warning if alpha check is enabled.
33394  
33395  
33396      if (textHasTransparency && enableAlphaChecker) {
33397        message = (0,external_wp_i18n_namespaceObject.__)('Transparent text may be hard for people to read.');
33398        speakMessage = (0,external_wp_i18n_namespaceObject.__)('Transparent text may be hard for people to read.');
33399      }
33400    }
33401  
33402    if (!message) {
33403      return null;
33404    } // Note: The `Notice` component can speak messages via its `spokenMessage`
33405    // prop, but the contrast checker requires granular control over when the
33406    // announcements are made. Notably, the message will be re-announced if a
33407    // new color combination is selected and the contrast is still insufficient.
33408  
33409  
33410    (0,external_wp_a11y_namespaceObject.speak)(speakMessage);
33411    return (0,external_wp_element_namespaceObject.createElement)("div", {
33412      className: "block-editor-contrast-checker"
33413    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Notice, {
33414      spokenMessage: null,
33415      status: "warning",
33416      isDismissible: false
33417    }, message));
33418  }
33419  /**
33420   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/contrast-checker/README.md
33421   */
33422  
33423  
33424  /* harmony default export */ var contrast_checker = (ContrastChecker);
33425  
33426  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/colors-gradients/tools-panel-color-dropdown.js
33427  
33428  
33429  
33430  /**
33431   * External dependencies
33432   */
33433  
33434  /**
33435   * WordPress dependencies
33436   */
33437  
33438  
33439  /**
33440   * Internal dependencies
33441   */
33442  
33443  
33444  
33445  function ToolsPanelColorDropdown(_ref) {
33446    var _settings$gradientVal;
33447  
33448    let {
33449      settings,
33450      enableAlpha,
33451      ...otherProps
33452    } = _ref;
33453    const colorGradientSettings = useMultipleOriginColorsAndGradients();
33454    const controlSettings = { ...colorGradientSettings,
33455      clearable: false,
33456      enableAlpha,
33457      label: settings.label,
33458      onColorChange: settings.onColorChange,
33459      onGradientChange: settings.onGradientChange,
33460      colorValue: settings.colorValue,
33461      gradientValue: settings.gradientValue
33462    };
33463    const selectedColor = (_settings$gradientVal = settings.gradientValue) !== null && _settings$gradientVal !== void 0 ? _settings$gradientVal : settings.colorValue;
33464    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalToolsPanelItem, _extends({
33465      hasValue: settings.hasValue,
33466      label: settings.label,
33467      onDeselect: settings.onDeselect,
33468      isShownByDefault: settings.isShownByDefault,
33469      resetAllFilter: settings.resetAllFilter
33470    }, otherProps, {
33471      className: "block-editor-tools-panel-color-gradient-settings__item"
33472    }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Dropdown, {
33473      className: "block-editor-tools-panel-color-dropdown",
33474      contentClassName: "block-editor-panel-color-gradient-settings__dropdown-content",
33475      renderToggle: _ref2 => {
33476        let {
33477          isOpen,
33478          onToggle
33479        } = _ref2;
33480        return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
33481          onClick: onToggle,
33482          "aria-expanded": isOpen,
33483          className: classnames_default()('block-editor-panel-color-gradient-settings__dropdown', {
33484            'is-open': isOpen
33485          })
33486        }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalHStack, {
33487          justify: "flex-start"
33488        }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ColorIndicator, {
33489          className: "block-editor-panel-color-gradient-settings__color-indicator",
33490          colorValue: selectedColor
33491        }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.FlexItem, null, settings.label)));
33492      },
33493      renderContent: () => (0,external_wp_element_namespaceObject.createElement)(control, _extends({
33494        showTitle: false,
33495        __experimentalHasMultipleOrigins: true,
33496        __experimentalIsRenderedInSidebar: true,
33497        enableAlpha: true
33498      }, controlSettings))
33499    }));
33500  }
33501  
33502  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/color-panel.js
33503  
33504  
33505  /**
33506   * WordPress dependencies
33507   */
33508  
33509  /**
33510   * Internal dependencies
33511   */
33512  
33513  
33514  
33515  
33516  
33517  
33518  function getComputedStyle(node) {
33519    return node.ownerDocument.defaultView.getComputedStyle(node);
33520  }
33521  
33522  function ColorPanel(_ref) {
33523    let {
33524      enableAlpha = false,
33525      settings,
33526      clientId,
33527      enableContrastChecking = true
33528    } = _ref;
33529    const [detectedBackgroundColor, setDetectedBackgroundColor] = (0,external_wp_element_namespaceObject.useState)();
33530    const [detectedColor, setDetectedColor] = (0,external_wp_element_namespaceObject.useState)();
33531    const [detectedLinkColor, setDetectedLinkColor] = (0,external_wp_element_namespaceObject.useState)();
33532    const ref = useBlockRef(clientId);
33533    (0,external_wp_element_namespaceObject.useEffect)(() => {
33534      var _ref$current;
33535  
33536      if (!enableContrastChecking) {
33537        return;
33538      }
33539  
33540      if (!ref.current) {
33541        return;
33542      }
33543  
33544      setDetectedColor(getComputedStyle(ref.current).color);
33545      const firstLinkElement = (_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.querySelector('a');
33546  
33547      if (firstLinkElement && !!firstLinkElement.innerText) {
33548        setDetectedLinkColor(getComputedStyle(firstLinkElement).color);
33549      }
33550  
33551      let backgroundColorNode = ref.current;
33552      let backgroundColor = getComputedStyle(backgroundColorNode).backgroundColor;
33553  
33554      while (backgroundColor === 'rgba(0, 0, 0, 0)' && backgroundColorNode.parentNode && backgroundColorNode.parentNode.nodeType === backgroundColorNode.parentNode.ELEMENT_NODE) {
33555        backgroundColorNode = backgroundColorNode.parentNode;
33556        backgroundColor = getComputedStyle(backgroundColorNode).backgroundColor;
33557      }
33558  
33559      setDetectedBackgroundColor(backgroundColor);
33560    });
33561    return (0,external_wp_element_namespaceObject.createElement)(inspector_controls, {
33562      __experimentalGroup: "color"
33563    }, settings.map((setting, index) => (0,external_wp_element_namespaceObject.createElement)(ToolsPanelColorDropdown, {
33564      key: index,
33565      settings: setting,
33566      panelId: clientId,
33567      enableAlpha: enableAlpha
33568    })), enableContrastChecking && (0,external_wp_element_namespaceObject.createElement)(contrast_checker, {
33569      backgroundColor: detectedBackgroundColor,
33570      textColor: detectedColor,
33571      enableAlphaChecker: enableAlpha,
33572      linkColor: detectedLinkColor
33573    }));
33574  }
33575  
33576  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/color.js
33577  
33578  
33579  
33580  /**
33581   * External dependencies
33582   */
33583  
33584  
33585  /**
33586   * WordPress dependencies
33587   */
33588  
33589  
33590  
33591  
33592  
33593  
33594  /**
33595   * Internal dependencies
33596   */
33597  
33598  
33599  
33600  
33601  
33602  
33603  const COLOR_SUPPORT_KEY = 'color';
33604  
33605  const hasColorSupport = blockType => {
33606    const colorSupport = (0,external_wp_blocks_namespaceObject.getBlockSupport)(blockType, COLOR_SUPPORT_KEY);
33607    return colorSupport && (colorSupport.link === true || colorSupport.gradient === true || colorSupport.background !== false || colorSupport.text !== false);
33608  };
33609  
33610  const hasLinkColorSupport = blockType => {
33611    if (external_wp_element_namespaceObject.Platform.OS !== 'web') {
33612      return false;
33613    }
33614  
33615    const colorSupport = (0,external_wp_blocks_namespaceObject.getBlockSupport)(blockType, COLOR_SUPPORT_KEY);
33616    return (0,external_lodash_namespaceObject.isObject)(colorSupport) && !!colorSupport.link;
33617  };
33618  
33619  const hasGradientSupport = blockType => {
33620    const colorSupport = (0,external_wp_blocks_namespaceObject.getBlockSupport)(blockType, COLOR_SUPPORT_KEY);
33621    return (0,external_lodash_namespaceObject.isObject)(colorSupport) && !!colorSupport.gradients;
33622  };
33623  
33624  const hasBackgroundColorSupport = blockType => {
33625    const colorSupport = (0,external_wp_blocks_namespaceObject.getBlockSupport)(blockType, COLOR_SUPPORT_KEY);
33626    return colorSupport && colorSupport.background !== false;
33627  };
33628  
33629  const hasTextColorSupport = blockType => {
33630    const colorSupport = (0,external_wp_blocks_namespaceObject.getBlockSupport)(blockType, COLOR_SUPPORT_KEY);
33631    return colorSupport && colorSupport.text !== false;
33632  };
33633  /**
33634   * Checks whether a color has been set either with a named preset color in
33635   * a top level block attribute or as a custom value within the style attribute
33636   * object.
33637   *
33638   * @param {string} name Name of the color to check.
33639   * @return {boolean} Whether or not a color has a value.
33640   */
33641  
33642  
33643  const hasColor = name => props => {
33644    var _props$attributes$sty9, _props$attributes$sty10;
33645  
33646    if (name === 'background') {
33647      var _props$attributes$sty, _props$attributes$sty2, _props$attributes$sty3, _props$attributes$sty4;
33648  
33649      return !!props.attributes.backgroundColor || !!((_props$attributes$sty = props.attributes.style) !== null && _props$attributes$sty !== void 0 && (_props$attributes$sty2 = _props$attributes$sty.color) !== null && _props$attributes$sty2 !== void 0 && _props$attributes$sty2.background) || !!props.attributes.gradient || !!((_props$attributes$sty3 = props.attributes.style) !== null && _props$attributes$sty3 !== void 0 && (_props$attributes$sty4 = _props$attributes$sty3.color) !== null && _props$attributes$sty4 !== void 0 && _props$attributes$sty4.gradient);
33650    }
33651  
33652    if (name === 'link') {
33653      var _props$attributes$sty5, _props$attributes$sty6, _props$attributes$sty7, _props$attributes$sty8;
33654  
33655      return !!((_props$attributes$sty5 = props.attributes.style) !== null && _props$attributes$sty5 !== void 0 && (_props$attributes$sty6 = _props$attributes$sty5.elements) !== null && _props$attributes$sty6 !== void 0 && (_props$attributes$sty7 = _props$attributes$sty6.link) !== null && _props$attributes$sty7 !== void 0 && (_props$attributes$sty8 = _props$attributes$sty7.color) !== null && _props$attributes$sty8 !== void 0 && _props$attributes$sty8.text);
33656    }
33657  
33658    return !!props.attributes[`$name}Color`] || !!((_props$attributes$sty9 = props.attributes.style) !== null && _props$attributes$sty9 !== void 0 && (_props$attributes$sty10 = _props$attributes$sty9.color) !== null && _props$attributes$sty10 !== void 0 && _props$attributes$sty10[name]);
33659  };
33660  /**
33661   * Clears a single color property from a style object.
33662   *
33663   * @param {Array}  path  Path to color property to clear within styles object.
33664   * @param {Object} style Block attributes style object.
33665   * @return {Object} Styles with the color property omitted.
33666   */
33667  
33668  
33669  const clearColorFromStyles = (path, style) => cleanEmptyObject(immutableSet(style, path, undefined));
33670  /**
33671   * Resets the block attributes for text color.
33672   *
33673   * @param {Object}   props               Current block props.
33674   * @param {Object}   props.attributes    Block attributes.
33675   * @param {Function} props.setAttributes Block's setAttributes prop used to apply reset.
33676   */
33677  
33678  
33679  const resetTextColor = _ref => {
33680    let {
33681      attributes,
33682      setAttributes
33683    } = _ref;
33684    setAttributes({
33685      textColor: undefined,
33686      style: clearColorFromStyles(['color', 'text'], attributes.style)
33687    });
33688  };
33689  /**
33690   * Clears text color related properties from supplied attributes.
33691   *
33692   * @param {Object} attributes Block attributes.
33693   * @return {Object} Update block attributes with text color properties omitted.
33694   */
33695  
33696  
33697  const resetAllTextFilter = attributes => ({
33698    textColor: undefined,
33699    style: clearColorFromStyles(['color', 'text'], attributes.style)
33700  });
33701  /**
33702   * Resets the block attributes for link color.
33703   *
33704   * @param {Object}   props               Current block props.
33705   * @param {Object}   props.attributes    Block attributes.
33706   * @param {Function} props.setAttributes Block's setAttributes prop used to apply reset.
33707   */
33708  
33709  
33710  const resetLinkColor = _ref2 => {
33711    let {
33712      attributes,
33713      setAttributes
33714    } = _ref2;
33715    const path = ['elements', 'link', 'color', 'text'];
33716    setAttributes({
33717      style: clearColorFromStyles(path, attributes.style)
33718    });
33719  };
33720  /**
33721   * Clears link color related properties from supplied attributes.
33722   *
33723   * @param {Object} attributes Block attributes.
33724   * @return {Object} Update block attributes with link color properties omitted.
33725   */
33726  
33727  
33728  const resetAllLinkFilter = attributes => ({
33729    style: clearColorFromStyles(['elements', 'link', 'color', 'text'], attributes.style)
33730  });
33731  /**
33732   * Clears all background color related properties including gradients from
33733   * supplied block attributes.
33734   *
33735   * @param {Object} attributes Block attributes.
33736   * @return {Object} Block attributes with background and gradient omitted.
33737   */
33738  
33739  
33740  const clearBackgroundAndGradient = attributes => {
33741    var _attributes$style;
33742  
33743    return {
33744      backgroundColor: undefined,
33745      gradient: undefined,
33746      style: { ...attributes.style,
33747        color: { ...((_attributes$style = attributes.style) === null || _attributes$style === void 0 ? void 0 : _attributes$style.color),
33748          background: undefined,
33749          gradient: undefined
33750        }
33751      }
33752    };
33753  };
33754  /**
33755   * Resets the block attributes for both background color and gradient.
33756   *
33757   * @param {Object}   props               Current block props.
33758   * @param {Object}   props.attributes    Block attributes.
33759   * @param {Function} props.setAttributes Block's setAttributes prop used to apply reset.
33760   */
33761  
33762  
33763  const resetBackgroundAndGradient = _ref3 => {
33764    let {
33765      attributes,
33766      setAttributes
33767    } = _ref3;
33768    setAttributes(clearBackgroundAndGradient(attributes));
33769  };
33770  /**
33771   * Filters registered block settings, extending attributes to include
33772   * `backgroundColor` and `textColor` attribute.
33773   *
33774   * @param {Object} settings Original block settings.
33775   *
33776   * @return {Object} Filtered block settings.
33777   */
33778  
33779  
33780  function color_addAttributes(settings) {
33781    if (!hasColorSupport(settings)) {
33782      return settings;
33783    } // Allow blocks to specify their own attribute definition with default values if needed.
33784  
33785  
33786    if (!settings.attributes.backgroundColor) {
33787      Object.assign(settings.attributes, {
33788        backgroundColor: {
33789          type: 'string'
33790        }
33791      });
33792    }
33793  
33794    if (!settings.attributes.textColor) {
33795      Object.assign(settings.attributes, {
33796        textColor: {
33797          type: 'string'
33798        }
33799      });
33800    }
33801  
33802    if (hasGradientSupport(settings) && !settings.attributes.gradient) {
33803      Object.assign(settings.attributes, {
33804        gradient: {
33805          type: 'string'
33806        }
33807      });
33808    }
33809  
33810    return settings;
33811  }
33812  /**
33813   * Override props assigned to save component to inject colors classnames.
33814   *
33815   * @param {Object} props      Additional props applied to save element.
33816   * @param {Object} blockType  Block type.
33817   * @param {Object} attributes Block attributes.
33818   *
33819   * @return {Object} Filtered props applied to save element.
33820   */
33821  
33822  
33823  function color_addSaveProps(props, blockType, attributes) {
33824    var _style$color, _style$color2, _style$color3, _style$color4, _style$elements, _style$elements$link;
33825  
33826    if (!hasColorSupport(blockType) || shouldSkipSerialization(blockType, COLOR_SUPPORT_KEY)) {
33827      return props;
33828    }
33829  
33830    const hasGradient = hasGradientSupport(blockType); // I'd have preferred to avoid the "style" attribute usage here
33831  
33832    const {
33833      backgroundColor,
33834      textColor,
33835      gradient,
33836      style
33837    } = attributes;
33838  
33839    const shouldSerialize = feature => !shouldSkipSerialization(blockType, COLOR_SUPPORT_KEY, feature); // Primary color classes must come before the `has-text-color`,
33840    // `has-background` and `has-link-color` classes to maintain backwards
33841    // compatibility and avoid block invalidations.
33842  
33843  
33844    const textClass = shouldSerialize('text') ? getColorClassName('color', textColor) : undefined;
33845    const gradientClass = shouldSerialize('gradients') ? __experimentalGetGradientClass(gradient) : undefined;
33846    const backgroundClass = shouldSerialize('background') ? getColorClassName('background-color', backgroundColor) : undefined;
33847    const serializeHasBackground = shouldSerialize('background') || shouldSerialize('gradients');
33848    const hasBackground = backgroundColor || (style === null || style === void 0 ? void 0 : (_style$color = style.color) === null || _style$color === void 0 ? void 0 : _style$color.background) || hasGradient && (gradient || (style === null || style === void 0 ? void 0 : (_style$color2 = style.color) === null || _style$color2 === void 0 ? void 0 : _style$color2.gradient));
33849    const newClassName = classnames_default()(props.className, textClass, gradientClass, {
33850      // Don't apply the background class if there's a custom gradient.
33851      [backgroundClass]: (!hasGradient || !(style !== null && style !== void 0 && (_style$color3 = style.color) !== null && _style$color3 !== void 0 && _style$color3.gradient)) && !!backgroundClass,
33852      'has-text-color': shouldSerialize('text') && (textColor || (style === null || style === void 0 ? void 0 : (_style$color4 = style.color) === null || _style$color4 === void 0 ? void 0 : _style$color4.text)),
33853      'has-background': serializeHasBackground && hasBackground,
33854      'has-link-color': shouldSerialize('link') && (style === null || style === void 0 ? void 0 : (_style$elements = style.elements) === null || _style$elements === void 0 ? void 0 : (_style$elements$link = _style$elements.link) === null || _style$elements$link === void 0 ? void 0 : _style$elements$link.color)
33855    });
33856    props.className = newClassName ? newClassName : undefined;
33857    return props;
33858  }
33859  /**
33860   * Filters registered block settings to extend the block edit wrapper
33861   * to apply the desired styles and classnames properly.
33862   *
33863   * @param {Object} settings Original block settings.
33864   *
33865   * @return {Object} Filtered block settings.
33866   */
33867  
33868  function color_addEditProps(settings) {
33869    if (!hasColorSupport(settings) || shouldSkipSerialization(settings, COLOR_SUPPORT_KEY)) {
33870      return settings;
33871    }
33872  
33873    const existingGetEditWrapperProps = settings.getEditWrapperProps;
33874  
33875    settings.getEditWrapperProps = attributes => {
33876      let props = {};
33877  
33878      if (existingGetEditWrapperProps) {
33879        props = existingGetEditWrapperProps(attributes);
33880      }
33881  
33882      return color_addSaveProps(props, settings, attributes);
33883    };
33884  
33885    return settings;
33886  }
33887  
33888  const getLinkColorFromAttributeValue = (colors, value) => {
33889    const attributeParsed = /var:preset\|color\|(.+)/.exec(value);
33890  
33891    if (attributeParsed && attributeParsed[1]) {
33892      return getColorObjectByAttributeValues(colors, attributeParsed[1]).color;
33893    }
33894  
33895    return value;
33896  };
33897  /**
33898   * Inspector control panel containing the color related configuration
33899   *
33900   * @param {Object} props
33901   *
33902   * @return {WPElement} Color edit element.
33903   */
33904  
33905  
33906  function ColorEdit(props) {
33907    var _style$color6, _style$color7, _style$color8, _style$elements2, _style$elements2$link, _style$elements2$link2, _style$elements3, _style$elements3$link, _style$elements3$link2;
33908  
33909    const {
33910      name: blockName,
33911      attributes
33912    } = props; // Some color settings have a special handling for deprecated flags in `useSetting`,
33913    // so we can't unwrap them by doing const { ... } = useSetting('color')
33914    // until https://github.com/WordPress/gutenberg/issues/37094 is fixed.
33915  
33916    const userPalette = useSetting('color.palette.custom');
33917    const themePalette = useSetting('color.palette.theme');
33918    const defaultPalette = useSetting('color.palette.default');
33919    const allSolids = (0,external_wp_element_namespaceObject.useMemo)(() => [...(userPalette || []), ...(themePalette || []), ...(defaultPalette || [])], [userPalette, themePalette, defaultPalette]);
33920    const userGradientPalette = useSetting('color.gradients.custom');
33921    const themeGradientPalette = useSetting('color.gradients.theme');
33922    const defaultGradientPalette = useSetting('color.gradients.default');
33923    const allGradients = (0,external_wp_element_namespaceObject.useMemo)(() => [...(userGradientPalette || []), ...(themeGradientPalette || []), ...(defaultGradientPalette || [])], [userGradientPalette, themeGradientPalette, defaultGradientPalette]);
33924    const areCustomSolidsEnabled = useSetting('color.custom');
33925    const areCustomGradientsEnabled = useSetting('color.customGradient');
33926    const isBackgroundEnabled = useSetting('color.background');
33927    const isLinkEnabled = useSetting('color.link');
33928    const isTextEnabled = useSetting('color.text');
33929    const solidsEnabled = areCustomSolidsEnabled || !themePalette || (themePalette === null || themePalette === void 0 ? void 0 : themePalette.length) > 0;
33930    const gradientsEnabled = areCustomGradientsEnabled || !themeGradientPalette || (themeGradientPalette === null || themeGradientPalette === void 0 ? void 0 : themeGradientPalette.length) > 0; // Shouldn't be needed but right now the ColorGradientsPanel
33931    // can trigger both onChangeColor and onChangeBackground
33932    // synchronously causing our two callbacks to override changes
33933    // from each other.
33934  
33935    const localAttributes = (0,external_wp_element_namespaceObject.useRef)(attributes);
33936    (0,external_wp_element_namespaceObject.useEffect)(() => {
33937      localAttributes.current = attributes;
33938    }, [attributes]);
33939  
33940    if (!hasColorSupport(blockName)) {
33941      return null;
33942    }
33943  
33944    const hasLinkColor = hasLinkColorSupport(blockName) && isLinkEnabled && solidsEnabled;
33945    const hasTextColor = hasTextColorSupport(blockName) && isTextEnabled && solidsEnabled;
33946    const hasBackgroundColor = hasBackgroundColorSupport(blockName) && isBackgroundEnabled && solidsEnabled;
33947    const hasGradientColor = hasGradientSupport(blockName) && gradientsEnabled;
33948  
33949    if (!hasLinkColor && !hasTextColor && !hasBackgroundColor && !hasGradientColor) {
33950      return null;
33951    }
33952  
33953    const {
33954      style,
33955      textColor,
33956      backgroundColor,
33957      gradient
33958    } = attributes;
33959    let gradientValue;
33960  
33961    if (hasGradientColor && gradient) {
33962      gradientValue = getGradientValueBySlug(allGradients, gradient);
33963    } else if (hasGradientColor) {
33964      var _style$color5;
33965  
33966      gradientValue = style === null || style === void 0 ? void 0 : (_style$color5 = style.color) === null || _style$color5 === void 0 ? void 0 : _style$color5.gradient;
33967    }
33968  
33969    const onChangeColor = name => value => {
33970      var _localAttributes$curr, _localAttributes$curr2;
33971  
33972      const colorObject = getColorObjectByColorValue(allSolids, value);
33973      const attributeName = name + 'Color';
33974      const newStyle = { ...localAttributes.current.style,
33975        color: { ...((_localAttributes$curr = localAttributes.current) === null || _localAttributes$curr === void 0 ? void 0 : (_localAttributes$curr2 = _localAttributes$curr.style) === null || _localAttributes$curr2 === void 0 ? void 0 : _localAttributes$curr2.color),
33976          [name]: colorObject !== null && colorObject !== void 0 && colorObject.slug ? undefined : value
33977        }
33978      };
33979      const newNamedColor = colorObject !== null && colorObject !== void 0 && colorObject.slug ? colorObject.slug : undefined;
33980      const newAttributes = {
33981        style: cleanEmptyObject(newStyle),
33982        [attributeName]: newNamedColor
33983      };
33984      props.setAttributes(newAttributes);
33985      localAttributes.current = { ...localAttributes.current,
33986        ...newAttributes
33987      };
33988    };
33989  
33990    const onChangeGradient = value => {
33991      const slug = getGradientSlugByValue(allGradients, value);
33992      let newAttributes;
33993  
33994      if (slug) {
33995        var _localAttributes$curr3, _localAttributes$curr4, _localAttributes$curr5;
33996  
33997        const newStyle = { ...((_localAttributes$curr3 = localAttributes.current) === null || _localAttributes$curr3 === void 0 ? void 0 : _localAttributes$curr3.style),
33998          color: { ...((_localAttributes$curr4 = localAttributes.current) === null || _localAttributes$curr4 === void 0 ? void 0 : (_localAttributes$curr5 = _localAttributes$curr4.style) === null || _localAttributes$curr5 === void 0 ? void 0 : _localAttributes$curr5.color),
33999            gradient: undefined
34000          }
34001        };
34002        newAttributes = {
34003          style: cleanEmptyObject(newStyle),
34004          gradient: slug
34005        };
34006      } else {
34007        var _localAttributes$curr6, _localAttributes$curr7, _localAttributes$curr8;
34008  
34009        const newStyle = { ...((_localAttributes$curr6 = localAttributes.current) === null || _localAttributes$curr6 === void 0 ? void 0 : _localAttributes$curr6.style),
34010          color: { ...((_localAttributes$curr7 = localAttributes.current) === null || _localAttributes$curr7 === void 0 ? void 0 : (_localAttributes$curr8 = _localAttributes$curr7.style) === null || _localAttributes$curr8 === void 0 ? void 0 : _localAttributes$curr8.color),
34011            gradient: value
34012          }
34013        };
34014        newAttributes = {
34015          style: cleanEmptyObject(newStyle),
34016          gradient: undefined
34017        };
34018      }
34019  
34020      props.setAttributes(newAttributes);
34021      localAttributes.current = { ...localAttributes.current,
34022        ...newAttributes
34023      };
34024    };
34025  
34026    const onChangeLinkColor = value => {
34027      const colorObject = getColorObjectByColorValue(allSolids, value);
34028      const newLinkColorValue = colorObject !== null && colorObject !== void 0 && colorObject.slug ? `var:preset|color|$colorObject.slug}` : value;
34029      const newStyle = cleanEmptyObject(immutableSet(style, ['elements', 'link', 'color', 'text'], newLinkColorValue));
34030      props.setAttributes({
34031        style: newStyle
34032      });
34033    };
34034  
34035    const enableContrastChecking = external_wp_element_namespaceObject.Platform.OS === 'web' && !gradient && !(style !== null && style !== void 0 && (_style$color6 = style.color) !== null && _style$color6 !== void 0 && _style$color6.gradient);
34036    const defaultColorControls = (0,external_wp_blocks_namespaceObject.getBlockSupport)(props.name, [COLOR_SUPPORT_KEY, '__experimentalDefaultControls']);
34037    return (0,external_wp_element_namespaceObject.createElement)(ColorPanel, {
34038      enableContrastChecking: enableContrastChecking,
34039      clientId: props.clientId,
34040      enableAlpha: true,
34041      settings: [...(hasTextColor ? [{
34042        label: (0,external_wp_i18n_namespaceObject.__)('Text'),
34043        onColorChange: onChangeColor('text'),
34044        colorValue: getColorObjectByAttributeValues(allSolids, textColor, style === null || style === void 0 ? void 0 : (_style$color7 = style.color) === null || _style$color7 === void 0 ? void 0 : _style$color7.text).color,
34045        isShownByDefault: defaultColorControls === null || defaultColorControls === void 0 ? void 0 : defaultColorControls.text,
34046        hasValue: () => hasColor('text')(props),
34047        onDeselect: () => resetTextColor(props),
34048        resetAllFilter: resetAllTextFilter
34049      }] : []), ...(hasBackgroundColor || hasGradientColor ? [{
34050        label: (0,external_wp_i18n_namespaceObject.__)('Background'),
34051        onColorChange: hasBackgroundColor ? onChangeColor('background') : undefined,
34052        colorValue: getColorObjectByAttributeValues(allSolids, backgroundColor, style === null || style === void 0 ? void 0 : (_style$color8 = style.color) === null || _style$color8 === void 0 ? void 0 : _style$color8.background).color,
34053        gradientValue,
34054        onGradientChange: hasGradientColor ? onChangeGradient : undefined,
34055        isShownByDefault: defaultColorControls === null || defaultColorControls === void 0 ? void 0 : defaultColorControls.background,
34056        hasValue: () => hasColor('background')(props),
34057        onDeselect: () => resetBackgroundAndGradient(props),
34058        resetAllFilter: clearBackgroundAndGradient
34059      }] : []), ...(hasLinkColor ? [{
34060        label: (0,external_wp_i18n_namespaceObject.__)('Link'),
34061        onColorChange: onChangeLinkColor,
34062        colorValue: getLinkColorFromAttributeValue(allSolids, style === null || style === void 0 ? void 0 : (_style$elements2 = style.elements) === null || _style$elements2 === void 0 ? void 0 : (_style$elements2$link = _style$elements2.link) === null || _style$elements2$link === void 0 ? void 0 : (_style$elements2$link2 = _style$elements2$link.color) === null || _style$elements2$link2 === void 0 ? void 0 : _style$elements2$link2.text),
34063        clearable: !!(style !== null && style !== void 0 && (_style$elements3 = style.elements) !== null && _style$elements3 !== void 0 && (_style$elements3$link = _style$elements3.link) !== null && _style$elements3$link !== void 0 && (_style$elements3$link2 = _style$elements3$link.color) !== null && _style$elements3$link2 !== void 0 && _style$elements3$link2.text),
34064        isShownByDefault: defaultColorControls === null || defaultColorControls === void 0 ? void 0 : defaultColorControls.link,
34065        hasValue: () => hasColor('link')(props),
34066        onDeselect: () => resetLinkColor(props),
34067        resetAllFilter: resetAllLinkFilter
34068      }] : [])]
34069    });
34070  }
34071  /**
34072   * This adds inline styles for color palette colors.
34073   * Ideally, this is not needed and themes should load their palettes on the editor.
34074   *
34075   * @param {Function} BlockListBlock Original component.
34076   *
34077   * @return {Function} Wrapped component.
34078   */
34079  
34080  const withColorPaletteStyles = (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(BlockListBlock => props => {
34081    var _props$wrapperProps;
34082  
34083    const {
34084      name,
34085      attributes
34086    } = props;
34087    const {
34088      backgroundColor,
34089      textColor
34090    } = attributes;
34091    const userPalette = useSetting('color.palette.custom') || [];
34092    const themePalette = useSetting('color.palette.theme') || [];
34093    const defaultPalette = useSetting('color.palette.default') || [];
34094    const colors = (0,external_wp_element_namespaceObject.useMemo)(() => [...(userPalette || []), ...(themePalette || []), ...(defaultPalette || [])], [userPalette, themePalette, defaultPalette]);
34095  
34096    if (!hasColorSupport(name) || shouldSkipSerialization(name, COLOR_SUPPORT_KEY)) {
34097      return (0,external_wp_element_namespaceObject.createElement)(BlockListBlock, props);
34098    }
34099  
34100    const extraStyles = {};
34101  
34102    if (textColor && !shouldSkipSerialization(name, COLOR_SUPPORT_KEY, 'text')) {
34103      var _getColorObjectByAttr;
34104  
34105      extraStyles.color = (_getColorObjectByAttr = getColorObjectByAttributeValues(colors, textColor)) === null || _getColorObjectByAttr === void 0 ? void 0 : _getColorObjectByAttr.color;
34106    }
34107  
34108    if (backgroundColor && !shouldSkipSerialization(name, COLOR_SUPPORT_KEY, 'background')) {
34109      var _getColorObjectByAttr2;
34110  
34111      extraStyles.backgroundColor = (_getColorObjectByAttr2 = getColorObjectByAttributeValues(colors, backgroundColor)) === null || _getColorObjectByAttr2 === void 0 ? void 0 : _getColorObjectByAttr2.color;
34112    }
34113  
34114    let wrapperProps = props.wrapperProps;
34115    wrapperProps = { ...props.wrapperProps,
34116      style: { ...extraStyles,
34117        ...((_props$wrapperProps = props.wrapperProps) === null || _props$wrapperProps === void 0 ? void 0 : _props$wrapperProps.style)
34118      }
34119    };
34120    return (0,external_wp_element_namespaceObject.createElement)(BlockListBlock, _extends({}, props, {
34121      wrapperProps: wrapperProps
34122    }));
34123  });
34124  const MIGRATION_PATHS = {
34125    linkColor: [['style', 'elements', 'link', 'color', 'text']],
34126    textColor: [['textColor'], ['style', 'color', 'text']],
34127    backgroundColor: [['backgroundColor'], ['style', 'color', 'background']],
34128    gradient: [['gradient'], ['style', 'color', 'gradient']]
34129  };
34130  function color_addTransforms(result, source, index, results) {
34131    const destinationBlockType = result.name;
34132    const activeSupports = {
34133      linkColor: hasLinkColorSupport(destinationBlockType),
34134      textColor: hasTextColorSupport(destinationBlockType),
34135      backgroundColor: hasBackgroundColorSupport(destinationBlockType),
34136      gradient: hasGradientSupport(destinationBlockType)
34137    };
34138    return transformStyles(activeSupports, MIGRATION_PATHS, result, source, index, results);
34139  }
34140  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.registerBlockType', 'core/color/addAttribute', color_addAttributes);
34141  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.getSaveContent.extraProps', 'core/color/addSaveProps', color_addSaveProps);
34142  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.registerBlockType', 'core/color/addEditProps', color_addEditProps);
34143  (0,external_wp_hooks_namespaceObject.addFilter)('editor.BlockListBlock', 'core/color/with-color-palette-styles', withColorPaletteStyles);
34144  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.switchToBlockType.transformedBlock', 'core/color/addTransforms', color_addTransforms);
34145  
34146  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/font-appearance-control/index.js
34147  
34148  
34149  /**
34150   * WordPress dependencies
34151   */
34152  
34153  
34154  
34155  const FONT_STYLES = [{
34156    name: (0,external_wp_i18n_namespaceObject._x)('Regular', 'font style'),
34157    value: 'normal'
34158  }, {
34159    name: (0,external_wp_i18n_namespaceObject._x)('Italic', 'font style'),
34160    value: 'italic'
34161  }];
34162  const FONT_WEIGHTS = [{
34163    name: (0,external_wp_i18n_namespaceObject._x)('Thin', 'font weight'),
34164    value: '100'
34165  }, {
34166    name: (0,external_wp_i18n_namespaceObject._x)('Extra Light', 'font weight'),
34167    value: '200'
34168  }, {
34169    name: (0,external_wp_i18n_namespaceObject._x)('Light', 'font weight'),
34170    value: '300'
34171  }, {
34172    name: (0,external_wp_i18n_namespaceObject._x)('Regular', 'font weight'),
34173    value: '400'
34174  }, {
34175    name: (0,external_wp_i18n_namespaceObject._x)('Medium', 'font weight'),
34176    value: '500'
34177  }, {
34178    name: (0,external_wp_i18n_namespaceObject._x)('Semi Bold', 'font weight'),
34179    value: '600'
34180  }, {
34181    name: (0,external_wp_i18n_namespaceObject._x)('Bold', 'font weight'),
34182    value: '700'
34183  }, {
34184    name: (0,external_wp_i18n_namespaceObject._x)('Extra Bold', 'font weight'),
34185    value: '800'
34186  }, {
34187    name: (0,external_wp_i18n_namespaceObject._x)('Black', 'font weight'),
34188    value: '900'
34189  }];
34190  /**
34191   * Adjusts font appearance field label in case either font styles or weights
34192   * are disabled.
34193   *
34194   * @param {boolean} hasFontStyles  Whether font styles are enabled and present.
34195   * @param {boolean} hasFontWeights Whether font weights are enabled and present.
34196   * @return {string} A label representing what font appearance is being edited.
34197   */
34198  
34199  const getFontAppearanceLabel = (hasFontStyles, hasFontWeights) => {
34200    if (!hasFontStyles) {
34201      return (0,external_wp_i18n_namespaceObject.__)('Font weight');
34202    }
34203  
34204    if (!hasFontWeights) {
34205      return (0,external_wp_i18n_namespaceObject.__)('Font style');
34206    }
34207  
34208    return (0,external_wp_i18n_namespaceObject.__)('Appearance');
34209  };
34210  /**
34211   * Control to display unified font style and weight options.
34212   *
34213   * @param {Object} props Component props.
34214   *
34215   * @return {WPElement} Font appearance control.
34216   */
34217  
34218  function FontAppearanceControl(props) {
34219    const {
34220      onChange,
34221      hasFontStyles = true,
34222      hasFontWeights = true,
34223      value: {
34224        fontStyle,
34225        fontWeight
34226      }
34227    } = props;
34228    const hasStylesOrWeights = hasFontStyles || hasFontWeights;
34229    const label = getFontAppearanceLabel(hasFontStyles, hasFontWeights);
34230    const defaultOption = {
34231      key: 'default',
34232      name: (0,external_wp_i18n_namespaceObject.__)('Default'),
34233      style: {
34234        fontStyle: undefined,
34235        fontWeight: undefined
34236      }
34237    }; // Combines both font style and weight options into a single dropdown.
34238  
34239    const combineOptions = () => {
34240      const combinedOptions = [defaultOption];
34241      FONT_STYLES.forEach(_ref => {
34242        let {
34243          name: styleName,
34244          value: styleValue
34245        } = _ref;
34246        FONT_WEIGHTS.forEach(_ref2 => {
34247          let {
34248            name: weightName,
34249            value: weightValue
34250          } = _ref2;
34251          const optionName = styleValue === 'normal' ? weightName : (0,external_wp_i18n_namespaceObject.sprintf)(
34252          /* translators: 1: Font weight name. 2: Font style name. */
34253          (0,external_wp_i18n_namespaceObject.__)('%1$s %2$s'), weightName, styleName);
34254          combinedOptions.push({
34255            key: `$styleValue}-$weightValue}`,
34256            name: optionName,
34257            style: {
34258              fontStyle: styleValue,
34259              fontWeight: weightValue
34260            }
34261          });
34262        });
34263      });
34264      return combinedOptions;
34265    }; // Generates select options for font styles only.
34266  
34267  
34268    const styleOptions = () => {
34269      const combinedOptions = [defaultOption];
34270      FONT_STYLES.forEach(_ref3 => {
34271        let {
34272          name,
34273          value
34274        } = _ref3;
34275        combinedOptions.push({
34276          key: value,
34277          name,
34278          style: {
34279            fontStyle: value,
34280            fontWeight: undefined
34281          }
34282        });
34283      });
34284      return combinedOptions;
34285    }; // Generates select options for font weights only.
34286  
34287  
34288    const weightOptions = () => {
34289      const combinedOptions = [defaultOption];
34290      FONT_WEIGHTS.forEach(_ref4 => {
34291        let {
34292          name,
34293          value
34294        } = _ref4;
34295        combinedOptions.push({
34296          key: value,
34297          name,
34298          style: {
34299            fontStyle: undefined,
34300            fontWeight: value
34301          }
34302        });
34303      });
34304      return combinedOptions;
34305    }; // Map font styles and weights to select options.
34306  
34307  
34308    const selectOptions = (0,external_wp_element_namespaceObject.useMemo)(() => {
34309      if (hasFontStyles && hasFontWeights) {
34310        return combineOptions();
34311      }
34312  
34313      return hasFontStyles ? styleOptions() : weightOptions();
34314    }, [props.options]); // Find current selection by comparing font style & weight against options,
34315    // and fall back to the Default option if there is no matching option.
34316  
34317    const currentSelection = selectOptions.find(option => option.style.fontStyle === fontStyle && option.style.fontWeight === fontWeight) || selectOptions[0]; // Adjusts screen reader description based on styles or weights.
34318  
34319    const getDescribedBy = () => {
34320      if (!currentSelection) {
34321        return (0,external_wp_i18n_namespaceObject.__)('No selected font appearance');
34322      }
34323  
34324      if (!hasFontStyles) {
34325        return (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %s: Currently selected font weight.
34326        (0,external_wp_i18n_namespaceObject.__)('Currently selected font weight: %s'), currentSelection.name);
34327      }
34328  
34329      if (!hasFontWeights) {
34330        return (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %s: Currently selected font style.
34331        (0,external_wp_i18n_namespaceObject.__)('Currently selected font style: %s'), currentSelection.name);
34332      }
34333  
34334      return (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %s: Currently selected font appearance.
34335      (0,external_wp_i18n_namespaceObject.__)('Currently selected font appearance: %s'), currentSelection.name);
34336    };
34337  
34338    return hasStylesOrWeights && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.CustomSelectControl, {
34339      className: "components-font-appearance-control",
34340      label: label,
34341      describedBy: getDescribedBy(),
34342      options: selectOptions,
34343      value: currentSelection,
34344      onChange: _ref5 => {
34345        let {
34346          selectedItem
34347        } = _ref5;
34348        return onChange(selectedItem.style);
34349      }
34350    });
34351  }
34352  
34353  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/line-height-control/utils.js
34354  const BASE_DEFAULT_VALUE = 1.5;
34355  const STEP = 0.1;
34356  /**
34357   * There are varying value types within LineHeightControl:
34358   *
34359   * {undefined} Initial value. No changes from the user.
34360   * {string} Input value. Value consumed/outputted by the input. Empty would be ''.
34361   * {number} Block attribute type. Input value needs to be converted for attribute setting.
34362   *
34363   * Note: If the value is undefined, the input requires it to be an empty string ('')
34364   * in order to be considered "controlled" by props (rather than internal state).
34365   */
34366  
34367  const RESET_VALUE = '';
34368  /**
34369   * Determines if the lineHeight attribute has been properly defined.
34370   *
34371   * @param {any} lineHeight The value to check.
34372   *
34373   * @return {boolean} Whether the lineHeight attribute is valid.
34374   */
34375  
34376  function isLineHeightDefined(lineHeight) {
34377    return lineHeight !== undefined && lineHeight !== RESET_VALUE;
34378  }
34379  
34380  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/line-height-control/index.js
34381  
34382  
34383  /**
34384   * WordPress dependencies
34385   */
34386  
34387  
34388  
34389  /**
34390   * Internal dependencies
34391   */
34392  
34393  
34394  
34395  const LineHeightControl = _ref => {
34396    let {
34397      value: lineHeight,
34398      onChange,
34399  
34400      /** Start opting into the new margin-free styles that will become the default in a future version. */
34401      __nextHasNoMarginBottom = false,
34402      __unstableInputWidth = '60px'
34403    } = _ref;
34404    const isDefined = isLineHeightDefined(lineHeight);
34405  
34406    const adjustNextValue = (nextValue, wasTypedOrPasted) => {
34407      // Set the next value without modification if lineHeight has been defined.
34408      if (isDefined) return nextValue;
34409      /**
34410       * The following logic handles the initial step up/down action
34411       * (from an undefined value state) so that the next values are better suited for
34412       * line-height rendering. For example, the first step up should immediately
34413       * go to 1.6, rather than the normally expected 0.1.
34414       *
34415       * Step up/down actions can be triggered by keydowns of the up/down arrow keys,
34416       * or by clicking the spin buttons.
34417       */
34418  
34419      switch (`$nextValue}`) {
34420        case `$STEP}`:
34421          // Increment by step value.
34422          return BASE_DEFAULT_VALUE + STEP;
34423  
34424        case '0':
34425          {
34426            // This means the user explicitly input '0', rather than stepped down
34427            // from an undefined value state.
34428            if (wasTypedOrPasted) return nextValue; // Decrement by step value.
34429  
34430            return BASE_DEFAULT_VALUE - STEP;
34431          }
34432  
34433        case '':
34434          return BASE_DEFAULT_VALUE;
34435  
34436        default:
34437          return nextValue;
34438      }
34439    };
34440  
34441    const stateReducer = (state, action) => {
34442      var _action$payload$event;
34443  
34444      // Be careful when changing this — cross-browser behavior of the
34445      // `inputType` field in `input` events are inconsistent.
34446      // For example, Firefox emits an input event with inputType="insertReplacementText"
34447      // on spin button clicks, while other browsers do not even emit an input event.
34448      const wasTypedOrPasted = ['insertText', 'insertFromPaste'].includes((_action$payload$event = action.payload.event.nativeEvent) === null || _action$payload$event === void 0 ? void 0 : _action$payload$event.inputType);
34449      const value = adjustNextValue(state.value, wasTypedOrPasted);
34450      return { ...state,
34451        value
34452      };
34453    };
34454  
34455    const value = isDefined ? lineHeight : RESET_VALUE;
34456  
34457    if (!__nextHasNoMarginBottom) {
34458      external_wp_deprecated_default()('Bottom margin styles for wp.blockEditor.LineHeightControl', {
34459        since: '6.0',
34460        version: '6.4',
34461        hint: 'Set the `__nextHasNoMarginBottom` prop to true to start opting into the new styles, which will become the default in a future version'
34462      });
34463    }
34464  
34465    const deprecatedStyles = __nextHasNoMarginBottom ? undefined : {
34466      marginBottom: 24
34467    };
34468    return (0,external_wp_element_namespaceObject.createElement)("div", {
34469      className: "block-editor-line-height-control",
34470      style: deprecatedStyles
34471    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalNumberControl, {
34472      __unstableInputWidth: __unstableInputWidth,
34473      __unstableStateReducer: stateReducer,
34474      onChange: onChange,
34475      label: (0,external_wp_i18n_namespaceObject.__)('Line height'),
34476      placeholder: BASE_DEFAULT_VALUE,
34477      step: STEP,
34478      value: value,
34479      min: 0
34480    }));
34481  };
34482  /**
34483   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/line-height-control/README.md
34484   */
34485  
34486  
34487  /* harmony default export */ var line_height_control = (LineHeightControl);
34488  
34489  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/line-height.js
34490  
34491  
34492  /**
34493   * WordPress dependencies
34494   */
34495  
34496  /**
34497   * Internal dependencies
34498   */
34499  
34500  
34501  
34502  
34503  const LINE_HEIGHT_SUPPORT_KEY = 'typography.lineHeight';
34504  /**
34505   * Inspector control panel containing the line height related configuration
34506   *
34507   * @param {Object} props
34508   *
34509   * @return {WPElement} Line height edit element.
34510   */
34511  
34512  function LineHeightEdit(props) {
34513    var _style$typography;
34514  
34515    const {
34516      attributes: {
34517        style
34518      },
34519      setAttributes
34520    } = props;
34521  
34522    const onChange = newLineHeightValue => {
34523      const newStyle = { ...style,
34524        typography: { ...(style === null || style === void 0 ? void 0 : style.typography),
34525          lineHeight: newLineHeightValue
34526        }
34527      };
34528      setAttributes({
34529        style: cleanEmptyObject(newStyle)
34530      });
34531    };
34532  
34533    return (0,external_wp_element_namespaceObject.createElement)(line_height_control, {
34534      __unstableInputWidth: "100%",
34535      __nextHasNoMarginBottom: true,
34536      value: style === null || style === void 0 ? void 0 : (_style$typography = style.typography) === null || _style$typography === void 0 ? void 0 : _style$typography.lineHeight,
34537      onChange: onChange
34538    });
34539  }
34540  /**
34541   * Custom hook that checks if line-height settings have been disabled.
34542   *
34543   * @param {string} name The name of the block.
34544   * @return {boolean} Whether setting is disabled.
34545   */
34546  
34547  function useIsLineHeightDisabled() {
34548    let {
34549      name: blockName
34550    } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
34551    const isDisabled = !useSetting('typography.lineHeight');
34552    return !(0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockName, LINE_HEIGHT_SUPPORT_KEY) || isDisabled;
34553  }
34554  /**
34555   * Checks if there is a current value set for the line height block support.
34556   *
34557   * @param {Object} props Block props.
34558   * @return {boolean}     Whether or not the block has a line height value set.
34559   */
34560  
34561  function hasLineHeightValue(props) {
34562    var _props$attributes$sty, _props$attributes$sty2;
34563  
34564    return !!((_props$attributes$sty = props.attributes.style) !== null && _props$attributes$sty !== void 0 && (_props$attributes$sty2 = _props$attributes$sty.typography) !== null && _props$attributes$sty2 !== void 0 && _props$attributes$sty2.lineHeight);
34565  }
34566  /**
34567   * Resets the line height block support attribute. This can be used when
34568   * disabling the line height support controls for a block via a progressive
34569   * discovery panel.
34570   *
34571   * @param {Object} props               Block props.
34572   * @param {Object} props.attributes    Block's attributes.
34573   * @param {Object} props.setAttributes Function to set block's attributes.
34574   */
34575  
34576  function resetLineHeight(_ref) {
34577    let {
34578      attributes = {},
34579      setAttributes
34580    } = _ref;
34581    const {
34582      style
34583    } = attributes;
34584    setAttributes({
34585      style: cleanEmptyObject({ ...style,
34586        typography: { ...(style === null || style === void 0 ? void 0 : style.typography),
34587          lineHeight: undefined
34588        }
34589      })
34590    });
34591  }
34592  
34593  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/font-appearance.js
34594  
34595  
34596  /**
34597   * WordPress dependencies
34598   */
34599  
34600  /**
34601   * Internal dependencies
34602   */
34603  
34604  
34605  
34606  
34607  /**
34608   * Key within block settings' support array indicating support for font style.
34609   */
34610  
34611  const FONT_STYLE_SUPPORT_KEY = 'typography.__experimentalFontStyle';
34612  /**
34613   * Key within block settings' support array indicating support for font weight.
34614   */
34615  
34616  const FONT_WEIGHT_SUPPORT_KEY = 'typography.__experimentalFontWeight';
34617  /**
34618   * Inspector control panel containing the font appearance options.
34619   *
34620   * @param {Object} props Block properties.
34621   *
34622   * @return {WPElement} Font appearance edit element.
34623   */
34624  
34625  function FontAppearanceEdit(props) {
34626    var _style$typography, _style$typography2;
34627  
34628    const {
34629      attributes: {
34630        style
34631      },
34632      setAttributes
34633    } = props;
34634    const hasFontStyles = !useIsFontStyleDisabled(props);
34635    const hasFontWeights = !useIsFontWeightDisabled(props);
34636  
34637    const onChange = newStyles => {
34638      setAttributes({
34639        style: cleanEmptyObject({ ...style,
34640          typography: { ...(style === null || style === void 0 ? void 0 : style.typography),
34641            fontStyle: newStyles.fontStyle,
34642            fontWeight: newStyles.fontWeight
34643          }
34644        })
34645      });
34646    };
34647  
34648    const fontStyle = style === null || style === void 0 ? void 0 : (_style$typography = style.typography) === null || _style$typography === void 0 ? void 0 : _style$typography.fontStyle;
34649    const fontWeight = style === null || style === void 0 ? void 0 : (_style$typography2 = style.typography) === null || _style$typography2 === void 0 ? void 0 : _style$typography2.fontWeight;
34650    return (0,external_wp_element_namespaceObject.createElement)(FontAppearanceControl, {
34651      onChange: onChange,
34652      hasFontStyles: hasFontStyles,
34653      hasFontWeights: hasFontWeights,
34654      value: {
34655        fontStyle,
34656        fontWeight
34657      }
34658    });
34659  }
34660  /**
34661   * Checks if font style support has been disabled either by not opting in for
34662   * support or by failing to provide preset styles.
34663   *
34664   * @param {Object} props      Block properties.
34665   * @param {string} props.name Name for the block type.
34666   *
34667   * @return {boolean} Whether font style support has been disabled.
34668   */
34669  
34670  function useIsFontStyleDisabled() {
34671    let {
34672      name: blockName
34673    } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
34674    const styleSupport = (0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockName, FONT_STYLE_SUPPORT_KEY);
34675    const hasFontStyles = useSetting('typography.fontStyle');
34676    return !styleSupport || !hasFontStyles;
34677  }
34678  /**
34679   * Checks if font weight support has been disabled either by not opting in for
34680   * support or by failing to provide preset weights.
34681   *
34682   * @param {Object} props      Block properties.
34683   * @param {string} props.name Name for the block type.
34684   *
34685   * @return {boolean} Whether font weight support has been disabled.
34686   */
34687  
34688  function useIsFontWeightDisabled() {
34689    let {
34690      name: blockName
34691    } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
34692    const weightSupport = (0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockName, FONT_WEIGHT_SUPPORT_KEY);
34693    const hasFontWeights = useSetting('typography.fontWeight');
34694    return !weightSupport || !hasFontWeights;
34695  }
34696  /**
34697   * Checks if font appearance support has been disabled.
34698   *
34699   * @param {Object} props Block properties.
34700   *
34701   * @return {boolean} Whether font appearance support has been disabled.
34702   */
34703  
34704  function useIsFontAppearanceDisabled(props) {
34705    const stylesDisabled = useIsFontStyleDisabled(props);
34706    const weightsDisabled = useIsFontWeightDisabled(props);
34707    return stylesDisabled && weightsDisabled;
34708  }
34709  /**
34710   * Checks if there is either a font style or weight value set within the
34711   * typography styles.
34712   *
34713   * @param {Object} props Block props.
34714   * @return {boolean}     Whether or not the block has a font style or weight.
34715   */
34716  
34717  function hasFontAppearanceValue(props) {
34718    var _props$attributes$sty;
34719  
34720    const {
34721      fontStyle,
34722      fontWeight
34723    } = ((_props$attributes$sty = props.attributes.style) === null || _props$attributes$sty === void 0 ? void 0 : _props$attributes$sty.typography) || {};
34724    return !!fontStyle || !!fontWeight;
34725  }
34726  /**
34727   * Resets the font style and weight block support attributes. This can be used
34728   * when disabling the font appearance support controls for a block via a
34729   * progressive discovery panel.
34730   *
34731   * @param {Object} props               Block props.
34732   * @param {Object} props.attributes    Block's attributes.
34733   * @param {Object} props.setAttributes Function to set block's attributes.
34734   */
34735  
34736  function resetFontAppearance(_ref) {
34737    let {
34738      attributes = {},
34739      setAttributes
34740    } = _ref;
34741    const {
34742      style
34743    } = attributes;
34744    setAttributes({
34745      style: cleanEmptyObject({ ...style,
34746        typography: { ...(style === null || style === void 0 ? void 0 : style.typography),
34747          fontStyle: undefined,
34748          fontWeight: undefined
34749        }
34750      })
34751    });
34752  }
34753  
34754  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/font-family/index.js
34755  
34756  
34757  
34758  /**
34759   * External dependencies
34760   */
34761  
34762  /**
34763   * WordPress dependencies
34764   */
34765  
34766  
34767  
34768  /**
34769   * Internal dependencies
34770   */
34771  
34772  
34773  function FontFamilyControl(_ref) {
34774    let {
34775      value = '',
34776      onChange,
34777      fontFamilies,
34778      ...props
34779    } = _ref;
34780    const blockLevelFontFamilies = useSetting('typography.fontFamilies');
34781  
34782    if (!fontFamilies) {
34783      fontFamilies = blockLevelFontFamilies;
34784    }
34785  
34786    if ((0,external_lodash_namespaceObject.isEmpty)(fontFamilies)) {
34787      return null;
34788    }
34789  
34790    const options = [{
34791      value: '',
34792      label: (0,external_wp_i18n_namespaceObject.__)('Default')
34793    }, ...fontFamilies.map(_ref2 => {
34794      let {
34795        fontFamily,
34796        name
34797      } = _ref2;
34798      return {
34799        value: fontFamily,
34800        label: name || fontFamily
34801      };
34802    })];
34803    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.SelectControl, _extends({
34804      label: (0,external_wp_i18n_namespaceObject.__)('Font family'),
34805      options: options,
34806      value: value,
34807      onChange: onChange,
34808      labelPosition: "top"
34809    }, props));
34810  }
34811  
34812  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/font-family.js
34813  
34814  
34815  /**
34816   * External dependencies
34817   */
34818  
34819  /**
34820   * WordPress dependencies
34821   */
34822  
34823  
34824  
34825  
34826  /**
34827   * Internal dependencies
34828   */
34829  
34830  
34831  
34832  
34833  
34834  const FONT_FAMILY_SUPPORT_KEY = 'typography.__experimentalFontFamily';
34835  /**
34836   * Filters registered block settings, extending attributes to include
34837   * the `fontFamily` attribute.
34838   *
34839   * @param {Object} settings Original block settings
34840   * @return {Object}         Filtered block settings
34841   */
34842  
34843  function font_family_addAttributes(settings) {
34844    if (!(0,external_wp_blocks_namespaceObject.hasBlockSupport)(settings, FONT_FAMILY_SUPPORT_KEY)) {
34845      return settings;
34846    } // Allow blocks to specify a default value if needed.
34847  
34848  
34849    if (!settings.attributes.fontFamily) {
34850      Object.assign(settings.attributes, {
34851        fontFamily: {
34852          type: 'string'
34853        }
34854      });
34855    }
34856  
34857    return settings;
34858  }
34859  /**
34860   * Override props assigned to save component to inject font family.
34861   *
34862   * @param {Object} props      Additional props applied to save element
34863   * @param {Object} blockType  Block type
34864   * @param {Object} attributes Block attributes
34865   * @return {Object}           Filtered props applied to save element
34866   */
34867  
34868  
34869  function font_family_addSaveProps(props, blockType, attributes) {
34870    if (!(0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockType, FONT_FAMILY_SUPPORT_KEY)) {
34871      return props;
34872    }
34873  
34874    if (shouldSkipSerialization(blockType, TYPOGRAPHY_SUPPORT_KEY, 'fontFamily')) {
34875      return props;
34876    }
34877  
34878    if (!(attributes !== null && attributes !== void 0 && attributes.fontFamily)) {
34879      return props;
34880    } // Use TokenList to dedupe classes.
34881  
34882  
34883    const classes = new (external_wp_tokenList_default())(props.className);
34884    classes.add(`has-${(0,external_lodash_namespaceObject.kebabCase)(attributes === null || attributes === void 0 ? void 0 : attributes.fontFamily)}-font-family`);
34885    const newClassName = classes.value;
34886    props.className = newClassName ? newClassName : undefined;
34887    return props;
34888  }
34889  /**
34890   * Filters registered block settings to expand the block edit wrapper
34891   * by applying the desired styles and classnames.
34892   *
34893   * @param {Object} settings Original block settings.
34894   *
34895   * @return {Object} Filtered block settings.
34896   */
34897  
34898  
34899  function font_family_addEditProps(settings) {
34900    if (!(0,external_wp_blocks_namespaceObject.hasBlockSupport)(settings, FONT_FAMILY_SUPPORT_KEY)) {
34901      return settings;
34902    }
34903  
34904    const existingGetEditWrapperProps = settings.getEditWrapperProps;
34905  
34906    settings.getEditWrapperProps = attributes => {
34907      let props = {};
34908  
34909      if (existingGetEditWrapperProps) {
34910        props = existingGetEditWrapperProps(attributes);
34911      }
34912  
34913      return font_family_addSaveProps(props, settings, attributes);
34914    };
34915  
34916    return settings;
34917  }
34918  
34919  function FontFamilyEdit(_ref) {
34920    var _find;
34921  
34922    let {
34923      setAttributes,
34924      attributes: {
34925        fontFamily
34926      }
34927    } = _ref;
34928    const fontFamilies = useSetting('typography.fontFamilies');
34929    const value = (_find = (0,external_lodash_namespaceObject.find)(fontFamilies, _ref2 => {
34930      let {
34931        slug
34932      } = _ref2;
34933      return fontFamily === slug;
34934    })) === null || _find === void 0 ? void 0 : _find.fontFamily;
34935  
34936    function onChange(newValue) {
34937      const predefinedFontFamily = (0,external_lodash_namespaceObject.find)(fontFamilies, _ref3 => {
34938        let {
34939          fontFamily: f
34940        } = _ref3;
34941        return f === newValue;
34942      });
34943      setAttributes({
34944        fontFamily: predefinedFontFamily === null || predefinedFontFamily === void 0 ? void 0 : predefinedFontFamily.slug
34945      });
34946    }
34947  
34948    return (0,external_wp_element_namespaceObject.createElement)(FontFamilyControl, {
34949      className: "block-editor-hooks-font-family-control",
34950      fontFamilies: fontFamilies,
34951      value: value,
34952      onChange: onChange
34953    });
34954  }
34955  /**
34956   * Custom hook that checks if font-family functionality is disabled.
34957   *
34958   * @param {string} name The name of the block.
34959   * @return {boolean} Whether setting is disabled.
34960   */
34961  
34962  function useIsFontFamilyDisabled(_ref4) {
34963    let {
34964      name
34965    } = _ref4;
34966    const fontFamilies = useSetting('typography.fontFamilies');
34967    return !fontFamilies || fontFamilies.length === 0 || !(0,external_wp_blocks_namespaceObject.hasBlockSupport)(name, FONT_FAMILY_SUPPORT_KEY);
34968  }
34969  /**
34970   * Checks if there is a current value set for the font family block support.
34971   *
34972   * @param {Object} props Block props.
34973   * @return {boolean}     Whether or not the block has a font family value set.
34974   */
34975  
34976  function hasFontFamilyValue(props) {
34977    return !!props.attributes.fontFamily;
34978  }
34979  /**
34980   * Resets the font family block support attribute. This can be used when
34981   * disabling the font family support controls for a block via a progressive
34982   * discovery panel.
34983   *
34984   * @param {Object} props               Block props.
34985   * @param {Object} props.setAttributes Function to set block's attributes.
34986   */
34987  
34988  function resetFontFamily(_ref5) {
34989    let {
34990      setAttributes
34991    } = _ref5;
34992    setAttributes({
34993      fontFamily: undefined
34994    });
34995  }
34996  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.registerBlockType', 'core/fontFamily/addAttribute', font_family_addAttributes);
34997  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.getSaveContent.extraProps', 'core/fontFamily/addSaveProps', font_family_addSaveProps);
34998  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.registerBlockType', 'core/fontFamily/addEditProps', font_family_addEditProps);
34999  
35000  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/font-sizes/utils.js
35001  /**
35002   * External dependencies
35003   */
35004  
35005  /**
35006   *  Returns the font size object based on an array of named font sizes and the namedFontSize and customFontSize values.
35007   *     If namedFontSize is undefined or not found in fontSizes an object with just the size value based on customFontSize is returned.
35008   *
35009   * @param {Array}   fontSizes               Array of font size objects containing at least the "name" and "size" values as properties.
35010   * @param {?string} fontSizeAttribute       Content of the font size attribute (slug).
35011   * @param {?number} customFontSizeAttribute Contents of the custom font size attribute (value).
35012   *
35013   * @return {?Object} If fontSizeAttribute is set and an equal slug is found in fontSizes it returns the font size object for that slug.
35014   *                      Otherwise, an object with just the size value based on customFontSize is returned.
35015   */
35016  
35017  const getFontSize = (fontSizes, fontSizeAttribute, customFontSizeAttribute) => {
35018    if (fontSizeAttribute) {
35019      const fontSizeObject = (0,external_lodash_namespaceObject.find)(fontSizes, {
35020        slug: fontSizeAttribute
35021      });
35022  
35023      if (fontSizeObject) {
35024        return fontSizeObject;
35025      }
35026    }
35027  
35028    return {
35029      size: customFontSizeAttribute
35030    };
35031  };
35032  /**
35033   * Returns the corresponding font size object for a given value.
35034   *
35035   * @param {Array}  fontSizes Array of font size objects.
35036   * @param {number} value     Font size value.
35037   *
35038   * @return {Object} Font size object.
35039   */
35040  
35041  function getFontSizeObjectByValue(fontSizes, value) {
35042    const fontSizeObject = (0,external_lodash_namespaceObject.find)(fontSizes, {
35043      size: value
35044    });
35045  
35046    if (fontSizeObject) {
35047      return fontSizeObject;
35048    }
35049  
35050    return {
35051      size: value
35052    };
35053  }
35054  /**
35055   * Returns a class based on fontSizeName.
35056   *
35057   * @param {string} fontSizeSlug Slug of the fontSize.
35058   *
35059   * @return {string} String with the class corresponding to the fontSize passed.
35060   *                  The class is generated by appending 'has-' followed by fontSizeSlug in kebabCase and ending with '-font-size'.
35061   */
35062  
35063  function getFontSizeClass(fontSizeSlug) {
35064    if (!fontSizeSlug) {
35065      return;
35066    }
35067  
35068    return `has-${(0,external_lodash_namespaceObject.kebabCase)(fontSizeSlug)}-font-size`;
35069  }
35070  
35071  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/font-sizes/font-size-picker.js
35072  
35073  
35074  
35075  /**
35076   * WordPress dependencies
35077   */
35078  
35079  /**
35080   * Internal dependencies
35081   */
35082  
35083  
35084  
35085  function FontSizePicker(props) {
35086    const fontSizes = useSetting('typography.fontSizes');
35087    const disableCustomFontSizes = !useSetting('typography.customFontSize');
35088    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.FontSizePicker, _extends({}, props, {
35089      fontSizes: fontSizes,
35090      disableCustomFontSizes: disableCustomFontSizes
35091    }));
35092  }
35093  /**
35094   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/font-sizes/README.md
35095   */
35096  
35097  
35098  /* harmony default export */ var font_size_picker = (FontSizePicker);
35099  
35100  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/font-size.js
35101  
35102  
35103  /**
35104   * WordPress dependencies
35105   */
35106  
35107  
35108  
35109  
35110  /**
35111   * Internal dependencies
35112   */
35113  
35114  
35115  
35116  
35117  
35118  const FONT_SIZE_SUPPORT_KEY = 'typography.fontSize';
35119  /**
35120   * Filters registered block settings, extending attributes to include
35121   * `fontSize` and `fontWeight` attributes.
35122   *
35123   * @param {Object} settings Original block settings.
35124   *
35125   * @return {Object} Filtered block settings.
35126   */
35127  
35128  function font_size_addAttributes(settings) {
35129    if (!(0,external_wp_blocks_namespaceObject.hasBlockSupport)(settings, FONT_SIZE_SUPPORT_KEY)) {
35130      return settings;
35131    } // Allow blocks to specify a default value if needed.
35132  
35133  
35134    if (!settings.attributes.fontSize) {
35135      Object.assign(settings.attributes, {
35136        fontSize: {
35137          type: 'string'
35138        }
35139      });
35140    }
35141  
35142    return settings;
35143  }
35144  /**
35145   * Override props assigned to save component to inject font size.
35146   *
35147   * @param {Object} props      Additional props applied to save element.
35148   * @param {Object} blockType  Block type.
35149   * @param {Object} attributes Block attributes.
35150   *
35151   * @return {Object} Filtered props applied to save element.
35152   */
35153  
35154  
35155  function font_size_addSaveProps(props, blockType, attributes) {
35156    if (!(0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockType, FONT_SIZE_SUPPORT_KEY)) {
35157      return props;
35158    }
35159  
35160    if (shouldSkipSerialization(blockType, TYPOGRAPHY_SUPPORT_KEY, 'fontSize')) {
35161      return props;
35162    } // Use TokenList to dedupe classes.
35163  
35164  
35165    const classes = new (external_wp_tokenList_default())(props.className);
35166    classes.add(getFontSizeClass(attributes.fontSize));
35167    const newClassName = classes.value;
35168    props.className = newClassName ? newClassName : undefined;
35169    return props;
35170  }
35171  /**
35172   * Filters registered block settings to expand the block edit wrapper
35173   * by applying the desired styles and classnames.
35174   *
35175   * @param {Object} settings Original block settings.
35176   *
35177   * @return {Object} Filtered block settings.
35178   */
35179  
35180  
35181  function font_size_addEditProps(settings) {
35182    if (!(0,external_wp_blocks_namespaceObject.hasBlockSupport)(settings, FONT_SIZE_SUPPORT_KEY)) {
35183      return settings;
35184    }
35185  
35186    const existingGetEditWrapperProps = settings.getEditWrapperProps;
35187  
35188    settings.getEditWrapperProps = attributes => {
35189      let props = {};
35190  
35191      if (existingGetEditWrapperProps) {
35192        props = existingGetEditWrapperProps(attributes);
35193      }
35194  
35195      return font_size_addSaveProps(props, settings, attributes);
35196    };
35197  
35198    return settings;
35199  }
35200  /**
35201   * Inspector control panel containing the font size related configuration
35202   *
35203   * @param {Object} props
35204   *
35205   * @return {WPElement} Font size edit element.
35206   */
35207  
35208  
35209  function FontSizeEdit(props) {
35210    var _style$typography, _style$typography2;
35211  
35212    const {
35213      attributes: {
35214        fontSize,
35215        style
35216      },
35217      setAttributes
35218    } = props;
35219    const fontSizes = useSetting('typography.fontSizes');
35220  
35221    const onChange = value => {
35222      const fontSizeSlug = getFontSizeObjectByValue(fontSizes, value).slug;
35223      setAttributes({
35224        style: cleanEmptyObject({ ...style,
35225          typography: { ...(style === null || style === void 0 ? void 0 : style.typography),
35226            fontSize: fontSizeSlug ? undefined : value
35227          }
35228        }),
35229        fontSize: fontSizeSlug
35230      });
35231    };
35232  
35233    const fontSizeObject = getFontSize(fontSizes, fontSize, style === null || style === void 0 ? void 0 : (_style$typography = style.typography) === null || _style$typography === void 0 ? void 0 : _style$typography.fontSize);
35234    const fontSizeValue = (fontSizeObject === null || fontSizeObject === void 0 ? void 0 : fontSizeObject.size) || (style === null || style === void 0 ? void 0 : (_style$typography2 = style.typography) === null || _style$typography2 === void 0 ? void 0 : _style$typography2.fontSize) || fontSize;
35235    return (0,external_wp_element_namespaceObject.createElement)(font_size_picker, {
35236      onChange: onChange,
35237      value: fontSizeValue,
35238      withReset: false
35239    });
35240  }
35241  /**
35242   * Checks if there is a current value set for the font size block support.
35243   *
35244   * @param {Object} props Block props.
35245   * @return {boolean}     Whether or not the block has a font size value set.
35246   */
35247  
35248  function hasFontSizeValue(props) {
35249    var _style$typography3;
35250  
35251    const {
35252      fontSize,
35253      style
35254    } = props.attributes;
35255    return !!fontSize || !!(style !== null && style !== void 0 && (_style$typography3 = style.typography) !== null && _style$typography3 !== void 0 && _style$typography3.fontSize);
35256  }
35257  /**
35258   * Resets the font size block support attribute. This can be used when
35259   * disabling the font size support controls for a block via a progressive
35260   * discovery panel.
35261   *
35262   * @param {Object} props               Block props.
35263   * @param {Object} props.attributes    Block's attributes.
35264   * @param {Object} props.setAttributes Function to set block's attributes.
35265   */
35266  
35267  function resetFontSize(_ref) {
35268    let {
35269      attributes = {},
35270      setAttributes
35271    } = _ref;
35272    const {
35273      style
35274    } = attributes;
35275    setAttributes({
35276      fontSize: undefined,
35277      style: cleanEmptyObject({ ...style,
35278        typography: { ...(style === null || style === void 0 ? void 0 : style.typography),
35279          fontSize: undefined
35280        }
35281      })
35282    });
35283  }
35284  /**
35285   * Custom hook that checks if font-size settings have been disabled.
35286   *
35287   * @param {string} name The name of the block.
35288   * @return {boolean} Whether setting is disabled.
35289   */
35290  
35291  function useIsFontSizeDisabled() {
35292    let {
35293      name: blockName
35294    } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
35295    const fontSizes = useSetting('typography.fontSizes');
35296    const hasFontSizes = !!(fontSizes !== null && fontSizes !== void 0 && fontSizes.length);
35297    return !(0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockName, FONT_SIZE_SUPPORT_KEY) || !hasFontSizes;
35298  }
35299  /**
35300   * Add inline styles for font sizes.
35301   * Ideally, this is not needed and themes load the font-size classes on the
35302   * editor.
35303   *
35304   * @param {Function} BlockListBlock Original component.
35305   *
35306   * @return {Function} Wrapped component.
35307   */
35308  
35309  const withFontSizeInlineStyles = (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(BlockListBlock => props => {
35310    var _style$typography4, _style$typography5;
35311  
35312    const fontSizes = useSetting('typography.fontSizes');
35313    const {
35314      name: blockName,
35315      attributes: {
35316        fontSize,
35317        style
35318      },
35319      wrapperProps
35320    } = props; // Only add inline styles if the block supports font sizes,
35321    // doesn't skip serialization of font sizes,
35322    // doesn't already have an inline font size,
35323    // and does have a class to extract the font size from.
35324  
35325    if (!(0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockName, FONT_SIZE_SUPPORT_KEY) || shouldSkipSerialization(blockName, TYPOGRAPHY_SUPPORT_KEY, 'fontSize') || !fontSize || style !== null && style !== void 0 && (_style$typography4 = style.typography) !== null && _style$typography4 !== void 0 && _style$typography4.fontSize) {
35326      return (0,external_wp_element_namespaceObject.createElement)(BlockListBlock, props);
35327    }
35328  
35329    const fontSizeValue = getFontSize(fontSizes, fontSize, style === null || style === void 0 ? void 0 : (_style$typography5 = style.typography) === null || _style$typography5 === void 0 ? void 0 : _style$typography5.fontSize).size;
35330    const newProps = { ...props,
35331      wrapperProps: { ...wrapperProps,
35332        style: {
35333          fontSize: fontSizeValue,
35334          ...(wrapperProps === null || wrapperProps === void 0 ? void 0 : wrapperProps.style)
35335        }
35336      }
35337    };
35338    return (0,external_wp_element_namespaceObject.createElement)(BlockListBlock, newProps);
35339  }, 'withFontSizeInlineStyles');
35340  const font_size_MIGRATION_PATHS = {
35341    fontSize: [['fontSize'], ['style', 'typography', 'fontSize']]
35342  };
35343  function font_size_addTransforms(result, source, index, results) {
35344    const destinationBlockType = result.name;
35345    const activeSupports = {
35346      fontSize: (0,external_wp_blocks_namespaceObject.hasBlockSupport)(destinationBlockType, FONT_SIZE_SUPPORT_KEY)
35347    };
35348    return transformStyles(activeSupports, font_size_MIGRATION_PATHS, result, source, index, results);
35349  }
35350  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.registerBlockType', 'core/font/addAttribute', font_size_addAttributes);
35351  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.getSaveContent.extraProps', 'core/font/addSaveProps', font_size_addSaveProps);
35352  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.registerBlockType', 'core/font/addEditProps', font_size_addEditProps);
35353  (0,external_wp_hooks_namespaceObject.addFilter)('editor.BlockListBlock', 'core/font-size/with-font-size-inline-styles', withFontSizeInlineStyles);
35354  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.switchToBlockType.transformedBlock', 'core/font-size/addTransforms', font_size_addTransforms);
35355  
35356  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/format-underline.js
35357  
35358  
35359  /**
35360   * WordPress dependencies
35361   */
35362  
35363  const formatUnderline = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
35364    xmlns: "http://www.w3.org/2000/svg",
35365    viewBox: "0 0 24 24"
35366  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
35367    d: "M7 18v1h10v-1H7zm5-2c1.5 0 2.6-.4 3.4-1.2.8-.8 1.1-2 1.1-3.5V5H15v5.8c0 1.2-.2 2.1-.6 2.8-.4.7-1.2 1-2.4 1s-2-.3-2.4-1c-.4-.7-.6-1.6-.6-2.8V5H7.5v6.2c0 1.5.4 2.7 1.1 3.5.8.9 1.9 1.3 3.4 1.3z"
35368  }));
35369  /* harmony default export */ var format_underline = (formatUnderline);
35370  
35371  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/format-strikethrough.js
35372  
35373  
35374  /**
35375   * WordPress dependencies
35376   */
35377  
35378  const formatStrikethrough = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
35379    xmlns: "http://www.w3.org/2000/svg",
35380    viewBox: "0 0 24 24"
35381  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
35382    d: "M9.1 9v-.5c0-.6.2-1.1.7-1.4.5-.3 1.2-.5 2-.5.7 0 1.4.1 2.1.3.7.2 1.4.5 2.1.9l.2-1.9c-.6-.3-1.2-.5-1.9-.7-.8-.1-1.6-.2-2.4-.2-1.5 0-2.7.3-3.6 1-.8.7-1.2 1.5-1.2 2.6V9h2zM20 12H4v1h8.3c.3.1.6.2.8.3.5.2.9.5 1.1.8.3.3.4.7.4 1.2 0 .7-.2 1.1-.8 1.5-.5.3-1.2.5-2.1.5-.8 0-1.6-.1-2.4-.3-.8-.2-1.5-.5-2.2-.8L7 18.1c.5.2 1.2.4 2 .6.8.2 1.6.3 2.4.3 1.7 0 3-.3 3.9-1 .9-.7 1.3-1.6 1.3-2.8 0-.9-.2-1.7-.7-2.2H20v-1z"
35383  }));
35384  /* harmony default export */ var format_strikethrough = (formatStrikethrough);
35385  
35386  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/text-decoration-control/index.js
35387  
35388  
35389  /**
35390   * WordPress dependencies
35391   */
35392  
35393  
35394  
35395  const TEXT_DECORATIONS = [{
35396    name: (0,external_wp_i18n_namespaceObject.__)('Underline'),
35397    value: 'underline',
35398    icon: format_underline
35399  }, {
35400    name: (0,external_wp_i18n_namespaceObject.__)('Strikethrough'),
35401    value: 'line-through',
35402    icon: format_strikethrough
35403  }];
35404  /**
35405   * Control to facilitate text decoration selections.
35406   *
35407   * @param {Object}   props          Component props.
35408   * @param {string}   props.value    Currently selected text decoration.
35409   * @param {Function} props.onChange Handles change in text decoration selection.
35410   *
35411   * @return {WPElement} Text decoration control.
35412   */
35413  
35414  function TextDecorationControl(_ref) {
35415    let {
35416      value,
35417      onChange
35418    } = _ref;
35419    return (0,external_wp_element_namespaceObject.createElement)("fieldset", {
35420      className: "block-editor-text-decoration-control"
35421    }, (0,external_wp_element_namespaceObject.createElement)("legend", null, (0,external_wp_i18n_namespaceObject.__)('Decoration')), (0,external_wp_element_namespaceObject.createElement)("div", {
35422      className: "block-editor-text-decoration-control__buttons"
35423    }, TEXT_DECORATIONS.map(textDecoration => {
35424      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
35425        key: textDecoration.value,
35426        icon: textDecoration.icon,
35427        isSmall: true,
35428        isPressed: textDecoration.value === value,
35429        onClick: () => onChange(textDecoration.value === value ? undefined : textDecoration.value),
35430        "aria-label": textDecoration.name
35431      });
35432    })));
35433  }
35434  
35435  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/text-decoration.js
35436  
35437  
35438  /**
35439   * WordPress dependencies
35440   */
35441  
35442  /**
35443   * Internal dependencies
35444   */
35445  
35446  
35447  
35448  
35449  /**
35450   * Key within block settings' supports array indicating support for text
35451   * decorations e.g. settings found in `block.json`.
35452   */
35453  
35454  const TEXT_DECORATION_SUPPORT_KEY = 'typography.__experimentalTextDecoration';
35455  /**
35456   * Inspector control panel containing the text decoration options.
35457   *
35458   * @param {Object} props Block properties.
35459   *
35460   * @return {WPElement} Text decoration edit element.
35461   */
35462  
35463  function TextDecorationEdit(props) {
35464    var _style$typography;
35465  
35466    const {
35467      attributes: {
35468        style
35469      },
35470      setAttributes
35471    } = props;
35472  
35473    function onChange(newDecoration) {
35474      setAttributes({
35475        style: cleanEmptyObject({ ...style,
35476          typography: { ...(style === null || style === void 0 ? void 0 : style.typography),
35477            textDecoration: newDecoration
35478          }
35479        })
35480      });
35481    }
35482  
35483    return (0,external_wp_element_namespaceObject.createElement)(TextDecorationControl, {
35484      value: style === null || style === void 0 ? void 0 : (_style$typography = style.typography) === null || _style$typography === void 0 ? void 0 : _style$typography.textDecoration,
35485      onChange: onChange
35486    });
35487  }
35488  /**
35489   * Checks if text-decoration settings have been disabled.
35490   *
35491   * @param {string} name Name of the block.
35492   *
35493   * @return {boolean} Whether or not the setting is disabled.
35494   */
35495  
35496  function useIsTextDecorationDisabled() {
35497    let {
35498      name: blockName
35499    } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
35500    const notSupported = !(0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockName, TEXT_DECORATION_SUPPORT_KEY);
35501    const hasTextDecoration = useSetting('typography.textDecoration');
35502    return notSupported || !hasTextDecoration;
35503  }
35504  /**
35505   * Checks if there is a current value set for the text decoration block support.
35506   *
35507   * @param {Object} props Block props.
35508   * @return {boolean}     Whether or not the block has a text decoration set.
35509   */
35510  
35511  function hasTextDecorationValue(props) {
35512    var _props$attributes$sty, _props$attributes$sty2;
35513  
35514    return !!((_props$attributes$sty = props.attributes.style) !== null && _props$attributes$sty !== void 0 && (_props$attributes$sty2 = _props$attributes$sty.typography) !== null && _props$attributes$sty2 !== void 0 && _props$attributes$sty2.textDecoration);
35515  }
35516  /**
35517   * Resets the text decoration block support attribute. This can be used when
35518   * disabling the text decoration support controls for a block via a progressive
35519   * discovery panel.
35520   *
35521   * @param {Object} props               Block props.
35522   * @param {Object} props.attributes    Block's attributes.
35523   * @param {Object} props.setAttributes Function to set block's attributes.
35524   */
35525  
35526  function resetTextDecoration(_ref) {
35527    let {
35528      attributes = {},
35529      setAttributes
35530    } = _ref;
35531    const {
35532      style
35533    } = attributes;
35534    setAttributes({
35535      style: cleanEmptyObject({ ...style,
35536        typography: { ...(style === null || style === void 0 ? void 0 : style.typography),
35537          textDecoration: undefined
35538        }
35539      })
35540    });
35541  }
35542  
35543  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/format-uppercase.js
35544  
35545  
35546  /**
35547   * WordPress dependencies
35548   */
35549  
35550  const formatUppercase = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
35551    xmlns: "http://www.w3.org/2000/svg",
35552    viewBox: "0 0 24 24"
35553  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
35554    d: "M6.1 6.8L2.1 18h1.6l1.1-3h4.3l1.1 3h1.6l-4-11.2H6.1zm-.8 6.8L7 8.9l1.7 4.7H5.3zm15.1-.7c-.4-.5-.9-.8-1.6-1 .4-.2.7-.5.8-.9.2-.4.3-.9.3-1.4 0-.9-.3-1.6-.8-2-.6-.5-1.3-.7-2.4-.7h-3.5V18h4.2c1.1 0 2-.3 2.6-.8.6-.6 1-1.4 1-2.4-.1-.8-.3-1.4-.6-1.9zm-5.7-4.7h1.8c.6 0 1.1.1 1.4.4.3.2.5.7.5 1.3 0 .6-.2 1.1-.5 1.3-.3.2-.8.4-1.4.4h-1.8V8.2zm4 8c-.4.3-.9.5-1.5.5h-2.6v-3.8h2.6c1.4 0 2 .6 2 1.9.1.6-.1 1-.5 1.4z"
35555  }));
35556  /* harmony default export */ var format_uppercase = (formatUppercase);
35557  
35558  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/format-lowercase.js
35559  
35560  
35561  /**
35562   * WordPress dependencies
35563   */
35564  
35565  const formatLowercase = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
35566    xmlns: "http://www.w3.org/2000/svg",
35567    viewBox: "0 0 24 24"
35568  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
35569    d: "M11 16.8c-.1-.1-.2-.3-.3-.5v-2.6c0-.9-.1-1.7-.3-2.2-.2-.5-.5-.9-.9-1.2-.4-.2-.9-.3-1.6-.3-.5 0-1 .1-1.5.2s-.9.3-1.2.6l.2 1.2c.4-.3.7-.4 1.1-.5.3-.1.7-.2 1-.2.6 0 1 .1 1.3.4.3.2.4.7.4 1.4-1.2 0-2.3.2-3.3.7s-1.4 1.1-1.4 2.1c0 .7.2 1.2.7 1.6.4.4 1 .6 1.8.6.9 0 1.7-.4 2.4-1.2.1.3.2.5.4.7.1.2.3.3.6.4.3.1.6.1 1.1.1h.1l.2-1.2h-.1c-.4.1-.6 0-.7-.1zM9.2 16c-.2.3-.5.6-.9.8-.3.1-.7.2-1.1.2-.4 0-.7-.1-.9-.3-.2-.2-.3-.5-.3-.9 0-.6.2-1 .7-1.3.5-.3 1.3-.4 2.5-.5v2zm10.6-3.9c-.3-.6-.7-1.1-1.2-1.5-.6-.4-1.2-.6-1.9-.6-.5 0-.9.1-1.4.3-.4.2-.8.5-1.1.8V6h-1.4v12h1.3l.2-1c.2.4.6.6 1 .8.4.2.9.3 1.4.3.7 0 1.2-.2 1.8-.5.5-.4 1-.9 1.3-1.5.3-.6.5-1.3.5-2.1-.1-.6-.2-1.3-.5-1.9zm-1.7 4c-.4.5-.9.8-1.6.8s-1.2-.2-1.7-.7c-.4-.5-.7-1.2-.7-2.1 0-.9.2-1.6.7-2.1.4-.5 1-.7 1.7-.7s1.2.3 1.6.8c.4.5.6 1.2.6 2s-.2 1.4-.6 2z"
35570  }));
35571  /* harmony default export */ var format_lowercase = (formatLowercase);
35572  
35573  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/format-capitalize.js
35574  
35575  
35576  /**
35577   * WordPress dependencies
35578   */
35579  
35580  const formatCapitalize = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
35581    xmlns: "http://www.w3.org/2000/svg",
35582    viewBox: "0 0 24 24"
35583  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
35584    d: "M7.1 6.8L3.1 18h1.6l1.1-3h4.3l1.1 3h1.6l-4-11.2H7.1zm-.8 6.8L8 8.9l1.7 4.7H6.3zm14.5-1.5c-.3-.6-.7-1.1-1.2-1.5-.6-.4-1.2-.6-1.9-.6-.5 0-.9.1-1.4.3-.4.2-.8.5-1.1.8V6h-1.4v12h1.3l.2-1c.2.4.6.6 1 .8.4.2.9.3 1.4.3.7 0 1.2-.2 1.8-.5.5-.4 1-.9 1.3-1.5.3-.6.5-1.3.5-2.1-.1-.6-.2-1.3-.5-1.9zm-1.7 4c-.4.5-.9.8-1.6.8s-1.2-.2-1.7-.7c-.4-.5-.7-1.2-.7-2.1 0-.9.2-1.6.7-2.1.4-.5 1-.7 1.7-.7s1.2.3 1.6.8c.4.5.6 1.2.6 2 .1.8-.2 1.4-.6 2z"
35585  }));
35586  /* harmony default export */ var format_capitalize = (formatCapitalize);
35587  
35588  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/text-transform-control/index.js
35589  
35590  
35591  /**
35592   * WordPress dependencies
35593   */
35594  
35595  
35596  
35597  const TEXT_TRANSFORMS = [{
35598    name: (0,external_wp_i18n_namespaceObject.__)('Uppercase'),
35599    value: 'uppercase',
35600    icon: format_uppercase
35601  }, {
35602    name: (0,external_wp_i18n_namespaceObject.__)('Lowercase'),
35603    value: 'lowercase',
35604    icon: format_lowercase
35605  }, {
35606    name: (0,external_wp_i18n_namespaceObject.__)('Capitalize'),
35607    value: 'capitalize',
35608    icon: format_capitalize
35609  }];
35610  /**
35611   * Control to facilitate text transform selections.
35612   *
35613   * @param {Object}   props          Component props.
35614   * @param {string}   props.value    Currently selected text transform.
35615   * @param {Function} props.onChange Handles change in text transform selection.
35616   *
35617   * @return {WPElement} Text transform control.
35618   */
35619  
35620  function TextTransformControl(_ref) {
35621    let {
35622      value,
35623      onChange
35624    } = _ref;
35625    return (0,external_wp_element_namespaceObject.createElement)("fieldset", {
35626      className: "block-editor-text-transform-control"
35627    }, (0,external_wp_element_namespaceObject.createElement)("legend", null, (0,external_wp_i18n_namespaceObject.__)('Letter case')), (0,external_wp_element_namespaceObject.createElement)("div", {
35628      className: "block-editor-text-transform-control__buttons"
35629    }, TEXT_TRANSFORMS.map(textTransform => {
35630      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
35631        key: textTransform.value,
35632        icon: textTransform.icon,
35633        isSmall: true,
35634        isPressed: value === textTransform.value,
35635        "aria-label": textTransform.name,
35636        onClick: () => onChange(value === textTransform.value ? undefined : textTransform.value)
35637      });
35638    })));
35639  }
35640  
35641  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/text-transform.js
35642  
35643  
35644  /**
35645   * WordPress dependencies
35646   */
35647  
35648  /**
35649   * Internal dependencies
35650   */
35651  
35652  
35653  
35654  
35655  /**
35656   * Key within block settings' supports array indicating support for text
35657   * transforms e.g. settings found in `block.json`.
35658   */
35659  
35660  const TEXT_TRANSFORM_SUPPORT_KEY = 'typography.__experimentalTextTransform';
35661  /**
35662   * Inspector control panel containing the text transform options.
35663   *
35664   * @param {Object} props Block properties.
35665   *
35666   * @return {WPElement} Text transform edit element.
35667   */
35668  
35669  function TextTransformEdit(props) {
35670    var _style$typography;
35671  
35672    const {
35673      attributes: {
35674        style
35675      },
35676      setAttributes
35677    } = props;
35678  
35679    function onChange(newTransform) {
35680      setAttributes({
35681        style: cleanEmptyObject({ ...style,
35682          typography: { ...(style === null || style === void 0 ? void 0 : style.typography),
35683            textTransform: newTransform
35684          }
35685        })
35686      });
35687    }
35688  
35689    return (0,external_wp_element_namespaceObject.createElement)(TextTransformControl, {
35690      value: style === null || style === void 0 ? void 0 : (_style$typography = style.typography) === null || _style$typography === void 0 ? void 0 : _style$typography.textTransform,
35691      onChange: onChange
35692    });
35693  }
35694  /**
35695   * Checks if text-transform settings have been disabled.
35696   *
35697   * @param {string} name Name of the block.
35698   *
35699   * @return {boolean} Whether or not the setting is disabled.
35700   */
35701  
35702  function useIsTextTransformDisabled() {
35703    let {
35704      name: blockName
35705    } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
35706    const notSupported = !(0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockName, TEXT_TRANSFORM_SUPPORT_KEY);
35707    const hasTextTransforms = useSetting('typography.textTransform');
35708    return notSupported || !hasTextTransforms;
35709  }
35710  /**
35711   * Checks if there is a current value set for the text transform block support.
35712   *
35713   * @param {Object} props Block props.
35714   * @return {boolean}     Whether or not the block has a text transform set.
35715   */
35716  
35717  function hasTextTransformValue(props) {
35718    var _props$attributes$sty, _props$attributes$sty2;
35719  
35720    return !!((_props$attributes$sty = props.attributes.style) !== null && _props$attributes$sty !== void 0 && (_props$attributes$sty2 = _props$attributes$sty.typography) !== null && _props$attributes$sty2 !== void 0 && _props$attributes$sty2.textTransform);
35721  }
35722  /**
35723   * Resets the text transform block support attribute. This can be used when
35724   * disabling the text transform support controls for a block via a progressive
35725   * discovery panel.
35726   *
35727   * @param {Object} props               Block props.
35728   * @param {Object} props.attributes    Block's attributes.
35729   * @param {Object} props.setAttributes Function to set block's attributes.
35730   */
35731  
35732  function resetTextTransform(_ref) {
35733    let {
35734      attributes = {},
35735      setAttributes
35736    } = _ref;
35737    const {
35738      style
35739    } = attributes;
35740    setAttributes({
35741      style: cleanEmptyObject({ ...style,
35742        typography: { ...(style === null || style === void 0 ? void 0 : style.typography),
35743          textTransform: undefined
35744        }
35745      })
35746    });
35747  }
35748  
35749  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/letter-spacing-control/index.js
35750  
35751  
35752  /**
35753   * WordPress dependencies
35754   */
35755  
35756  
35757  /**
35758   * Internal dependencies
35759   */
35760  
35761  
35762  /**
35763   * Control for letter-spacing.
35764   *
35765   * @param {Object}                  props                      Component props.
35766   * @param {string}                  props.value                Currently selected letter-spacing.
35767   * @param {Function}                props.onChange             Handles change in letter-spacing selection.
35768   * @param {string|number|undefined} props.__unstableInputWidth Input width to pass through to inner UnitControl. Should be a valid CSS value.
35769   *
35770   * @return {WPElement} Letter-spacing control.
35771   */
35772  
35773  function LetterSpacingControl(_ref) {
35774    let {
35775      value,
35776      onChange,
35777      __unstableInputWidth = '60px'
35778    } = _ref;
35779    const units = (0,external_wp_components_namespaceObject.__experimentalUseCustomUnits)({
35780      availableUnits: useSetting('spacing.units') || ['px', 'em', 'rem'],
35781      defaultValues: {
35782        px: 2,
35783        em: 0.2,
35784        rem: 0.2
35785      }
35786    });
35787    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalUnitControl, {
35788      label: (0,external_wp_i18n_namespaceObject.__)('Letter spacing'),
35789      value: value,
35790      __unstableInputWidth: __unstableInputWidth,
35791      units: units,
35792      onChange: onChange
35793    });
35794  }
35795  
35796  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/letter-spacing.js
35797  
35798  
35799  /**
35800   * WordPress dependencies
35801   */
35802  
35803  /**
35804   * Internal dependencies
35805   */
35806  
35807  
35808  
35809  
35810  /**
35811   * Key within block settings' supports array indicating support for letter-spacing
35812   * e.g. settings found in `block.json`.
35813   */
35814  
35815  const LETTER_SPACING_SUPPORT_KEY = 'typography.__experimentalLetterSpacing';
35816  /**
35817   * Inspector control panel containing the letter-spacing options.
35818   *
35819   * @param {Object} props Block properties.
35820   * @return {WPElement}    Letter-spacing edit element.
35821   */
35822  
35823  function LetterSpacingEdit(props) {
35824    var _style$typography;
35825  
35826    const {
35827      attributes: {
35828        style
35829      },
35830      setAttributes
35831    } = props;
35832  
35833    function onChange(newSpacing) {
35834      setAttributes({
35835        style: cleanEmptyObject({ ...style,
35836          typography: { ...(style === null || style === void 0 ? void 0 : style.typography),
35837            letterSpacing: newSpacing
35838          }
35839        })
35840      });
35841    }
35842  
35843    return (0,external_wp_element_namespaceObject.createElement)(LetterSpacingControl, {
35844      value: style === null || style === void 0 ? void 0 : (_style$typography = style.typography) === null || _style$typography === void 0 ? void 0 : _style$typography.letterSpacing,
35845      onChange: onChange,
35846      __unstableInputWidth: '100%'
35847    });
35848  }
35849  /**
35850   * Checks if letter-spacing settings have been disabled.
35851   *
35852   * @param {string} name Name of the block.
35853   * @return {boolean}     Whether or not the setting is disabled.
35854   */
35855  
35856  function useIsLetterSpacingDisabled() {
35857    let {
35858      name: blockName
35859    } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
35860    const notSupported = !(0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockName, LETTER_SPACING_SUPPORT_KEY);
35861    const hasLetterSpacing = useSetting('typography.letterSpacing');
35862    return notSupported || !hasLetterSpacing;
35863  }
35864  /**
35865   * Checks if there is a current value set for the letter spacing block support.
35866   *
35867   * @param {Object} props Block props.
35868   * @return {boolean}     Whether or not the block has a letter spacing set.
35869   */
35870  
35871  function hasLetterSpacingValue(props) {
35872    var _props$attributes$sty, _props$attributes$sty2;
35873  
35874    return !!((_props$attributes$sty = props.attributes.style) !== null && _props$attributes$sty !== void 0 && (_props$attributes$sty2 = _props$attributes$sty.typography) !== null && _props$attributes$sty2 !== void 0 && _props$attributes$sty2.letterSpacing);
35875  }
35876  /**
35877   * Resets the letter spacing block support attribute. This can be used when
35878   * disabling the letter spacing support controls for a block via a progressive
35879   * discovery panel.
35880   *
35881   * @param {Object} props               Block props.
35882   * @param {Object} props.attributes    Block's attributes.
35883   * @param {Object} props.setAttributes Function to set block's attributes.
35884   */
35885  
35886  function resetLetterSpacing(_ref) {
35887    let {
35888      attributes = {},
35889      setAttributes
35890    } = _ref;
35891    const {
35892      style
35893    } = attributes;
35894    setAttributes({
35895      style: cleanEmptyObject({ ...style,
35896        typography: { ...(style === null || style === void 0 ? void 0 : style.typography),
35897          letterSpacing: undefined
35898        }
35899      })
35900    });
35901  }
35902  
35903  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/typography.js
35904  
35905  
35906  /**
35907   * WordPress dependencies
35908   */
35909  
35910  
35911  
35912  /**
35913   * Internal dependencies
35914   */
35915  
35916  
35917  
35918  
35919  
35920  
35921  
35922  
35923  
35924  
35925  const TYPOGRAPHY_SUPPORT_KEY = 'typography';
35926  const TYPOGRAPHY_SUPPORT_KEYS = [LINE_HEIGHT_SUPPORT_KEY, FONT_SIZE_SUPPORT_KEY, FONT_STYLE_SUPPORT_KEY, FONT_WEIGHT_SUPPORT_KEY, FONT_FAMILY_SUPPORT_KEY, TEXT_DECORATION_SUPPORT_KEY, TEXT_TRANSFORM_SUPPORT_KEY, LETTER_SPACING_SUPPORT_KEY];
35927  function TypographyPanel(props) {
35928    const {
35929      clientId
35930    } = props;
35931    const isFontFamilyDisabled = useIsFontFamilyDisabled(props);
35932    const isFontSizeDisabled = useIsFontSizeDisabled(props);
35933    const isFontAppearanceDisabled = useIsFontAppearanceDisabled(props);
35934    const isLineHeightDisabled = useIsLineHeightDisabled(props);
35935    const isTextDecorationDisabled = useIsTextDecorationDisabled(props);
35936    const isTextTransformDisabled = useIsTextTransformDisabled(props);
35937    const isLetterSpacingDisabled = useIsLetterSpacingDisabled(props);
35938    const hasFontStyles = !useIsFontStyleDisabled(props);
35939    const hasFontWeights = !useIsFontWeightDisabled(props);
35940    const isDisabled = useIsTypographyDisabled(props);
35941    const isSupported = hasTypographySupport(props.name);
35942    if (isDisabled || !isSupported) return null;
35943    const defaultControls = (0,external_wp_blocks_namespaceObject.getBlockSupport)(props.name, [TYPOGRAPHY_SUPPORT_KEY, '__experimentalDefaultControls']);
35944  
35945    const createResetAllFilter = attribute => newAttributes => {
35946      var _newAttributes$style;
35947  
35948      return { ...newAttributes,
35949        style: { ...newAttributes.style,
35950          typography: { ...((_newAttributes$style = newAttributes.style) === null || _newAttributes$style === void 0 ? void 0 : _newAttributes$style.typography),
35951            [attribute]: undefined
35952          }
35953        }
35954      };
35955    };
35956  
35957    return (0,external_wp_element_namespaceObject.createElement)(inspector_controls, {
35958      __experimentalGroup: "typography"
35959    }, !isFontFamilyDisabled && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalToolsPanelItem, {
35960      hasValue: () => hasFontFamilyValue(props),
35961      label: (0,external_wp_i18n_namespaceObject.__)('Font family'),
35962      onDeselect: () => resetFontFamily(props),
35963      isShownByDefault: defaultControls === null || defaultControls === void 0 ? void 0 : defaultControls.fontFamily,
35964      resetAllFilter: newAttributes => ({ ...newAttributes,
35965        fontFamily: undefined
35966      }),
35967      panelId: clientId
35968    }, (0,external_wp_element_namespaceObject.createElement)(FontFamilyEdit, props)), !isFontSizeDisabled && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalToolsPanelItem, {
35969      hasValue: () => hasFontSizeValue(props),
35970      label: (0,external_wp_i18n_namespaceObject.__)('Font size'),
35971      onDeselect: () => resetFontSize(props),
35972      isShownByDefault: defaultControls === null || defaultControls === void 0 ? void 0 : defaultControls.fontSize,
35973      resetAllFilter: newAttributes => {
35974        var _newAttributes$style2;
35975  
35976        return { ...newAttributes,
35977          fontSize: undefined,
35978          style: { ...newAttributes.style,
35979            typography: { ...((_newAttributes$style2 = newAttributes.style) === null || _newAttributes$style2 === void 0 ? void 0 : _newAttributes$style2.typography),
35980              fontSize: undefined
35981            }
35982          }
35983        };
35984      },
35985      panelId: clientId
35986    }, (0,external_wp_element_namespaceObject.createElement)(FontSizeEdit, props)), !isFontAppearanceDisabled && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalToolsPanelItem, {
35987      className: "single-column",
35988      hasValue: () => hasFontAppearanceValue(props),
35989      label: getFontAppearanceLabel(hasFontStyles, hasFontWeights),
35990      onDeselect: () => resetFontAppearance(props),
35991      isShownByDefault: defaultControls === null || defaultControls === void 0 ? void 0 : defaultControls.fontAppearance,
35992      resetAllFilter: newAttributes => {
35993        var _newAttributes$style3;
35994  
35995        return { ...newAttributes,
35996          style: { ...newAttributes.style,
35997            typography: { ...((_newAttributes$style3 = newAttributes.style) === null || _newAttributes$style3 === void 0 ? void 0 : _newAttributes$style3.typography),
35998              fontStyle: undefined,
35999              fontWeight: undefined
36000            }
36001          }
36002        };
36003      },
36004      panelId: clientId
36005    }, (0,external_wp_element_namespaceObject.createElement)(FontAppearanceEdit, props)), !isLineHeightDisabled && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalToolsPanelItem, {
36006      className: "single-column",
36007      hasValue: () => hasLineHeightValue(props),
36008      label: (0,external_wp_i18n_namespaceObject.__)('Line height'),
36009      onDeselect: () => resetLineHeight(props),
36010      isShownByDefault: defaultControls === null || defaultControls === void 0 ? void 0 : defaultControls.lineHeight,
36011      resetAllFilter: createResetAllFilter('lineHeight'),
36012      panelId: clientId
36013    }, (0,external_wp_element_namespaceObject.createElement)(LineHeightEdit, props)), !isTextDecorationDisabled && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalToolsPanelItem, {
36014      className: "single-column",
36015      hasValue: () => hasTextDecorationValue(props),
36016      label: (0,external_wp_i18n_namespaceObject.__)('Decoration'),
36017      onDeselect: () => resetTextDecoration(props),
36018      isShownByDefault: defaultControls === null || defaultControls === void 0 ? void 0 : defaultControls.textDecoration,
36019      resetAllFilter: createResetAllFilter('textDecoration'),
36020      panelId: clientId
36021    }, (0,external_wp_element_namespaceObject.createElement)(TextDecorationEdit, props)), !isTextTransformDisabled && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalToolsPanelItem, {
36022      className: "single-column",
36023      hasValue: () => hasTextTransformValue(props),
36024      label: (0,external_wp_i18n_namespaceObject.__)('Letter case'),
36025      onDeselect: () => resetTextTransform(props),
36026      isShownByDefault: defaultControls === null || defaultControls === void 0 ? void 0 : defaultControls.textTransform,
36027      resetAllFilter: createResetAllFilter('textTransform'),
36028      panelId: clientId
36029    }, (0,external_wp_element_namespaceObject.createElement)(TextTransformEdit, props)), !isLetterSpacingDisabled && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalToolsPanelItem, {
36030      className: "single-column",
36031      hasValue: () => hasLetterSpacingValue(props),
36032      label: (0,external_wp_i18n_namespaceObject.__)('Letter spacing'),
36033      onDeselect: () => resetLetterSpacing(props),
36034      isShownByDefault: defaultControls === null || defaultControls === void 0 ? void 0 : defaultControls.letterSpacing,
36035      resetAllFilter: createResetAllFilter('letterSpacing'),
36036      panelId: clientId
36037    }, (0,external_wp_element_namespaceObject.createElement)(LetterSpacingEdit, props)));
36038  }
36039  const hasTypographySupport = blockName => {
36040    return TYPOGRAPHY_SUPPORT_KEYS.some(key => (0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockName, key));
36041  };
36042  
36043  function useIsTypographyDisabled() {
36044    let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
36045    const configs = [useIsFontAppearanceDisabled(props), useIsFontSizeDisabled(props), useIsLineHeightDisabled(props), useIsFontFamilyDisabled(props), useIsTextDecorationDisabled(props), useIsTextTransformDisabled(props), useIsLetterSpacingDisabled(props)];
36046    return configs.filter(Boolean).length === configs.length;
36047  }
36048  
36049  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/style.js
36050  
36051  
36052  
36053  /**
36054   * External dependencies
36055   */
36056  
36057  
36058  /**
36059   * WordPress dependencies
36060   */
36061  
36062  
36063  
36064  
36065  
36066  
36067  /**
36068   * Internal dependencies
36069   */
36070  
36071  
36072  
36073  
36074  
36075  
36076  
36077  
36078  const styleSupportKeys = [...TYPOGRAPHY_SUPPORT_KEYS, BORDER_SUPPORT_KEY, COLOR_SUPPORT_KEY, SPACING_SUPPORT_KEY];
36079  
36080  const hasStyleSupport = blockType => styleSupportKeys.some(key => (0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockType, key));
36081  
36082  const VARIABLE_REFERENCE_PREFIX = 'var:';
36083  const VARIABLE_PATH_SEPARATOR_TOKEN_ATTRIBUTE = '|';
36084  const VARIABLE_PATH_SEPARATOR_TOKEN_STYLE = '--';
36085  
36086  function compileStyleValue(uncompiledValue) {
36087    if ((0,external_lodash_namespaceObject.startsWith)(uncompiledValue, VARIABLE_REFERENCE_PREFIX)) {
36088      const variable = uncompiledValue.slice(VARIABLE_REFERENCE_PREFIX.length).split(VARIABLE_PATH_SEPARATOR_TOKEN_ATTRIBUTE).join(VARIABLE_PATH_SEPARATOR_TOKEN_STYLE);
36089      return `var(--wp--$variable})`;
36090    }
36091  
36092    return uncompiledValue;
36093  }
36094  /**
36095   * Returns the inline styles to add depending on the style object
36096   *
36097   * @param {Object} styles Styles configuration.
36098   *
36099   * @return {Object} Flattened CSS variables declaration.
36100   */
36101  
36102  
36103  function getInlineStyles() {
36104    let styles = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
36105    const ignoredStyles = ['spacing.blockGap'];
36106    const output = {};
36107    Object.keys(external_wp_blocks_namespaceObject.__EXPERIMENTAL_STYLE_PROPERTY).forEach(propKey => {
36108      const path = external_wp_blocks_namespaceObject.__EXPERIMENTAL_STYLE_PROPERTY[propKey].value;
36109      const subPaths = external_wp_blocks_namespaceObject.__EXPERIMENTAL_STYLE_PROPERTY[propKey].properties; // Ignore styles on elements because they are handled on the server.
36110  
36111      if ((0,external_lodash_namespaceObject.has)(styles, path) && 'elements' !== (0,external_lodash_namespaceObject.first)(path)) {
36112        // Checking if style value is a string allows for shorthand css
36113        // option and backwards compatibility for border radius support.
36114        const styleValue = (0,external_lodash_namespaceObject.get)(styles, path);
36115  
36116        if (!external_wp_blocks_namespaceObject.__EXPERIMENTAL_STYLE_PROPERTY[propKey].useEngine) {
36117          if (!!subPaths && !(0,external_lodash_namespaceObject.isString)(styleValue)) {
36118            Object.entries(subPaths).forEach(entry => {
36119              const [name, subPath] = entry;
36120              const value = (0,external_lodash_namespaceObject.get)(styleValue, [subPath]);
36121  
36122              if (value) {
36123                output[name] = compileStyleValue(value);
36124              }
36125            });
36126          } else if (!ignoredStyles.includes(path.join('.'))) {
36127            output[propKey] = compileStyleValue((0,external_lodash_namespaceObject.get)(styles, path));
36128          }
36129        }
36130      }
36131    }); // The goal is to move everything to server side generated engine styles
36132    // This is temporary as we absorb more and more styles into the engine.
36133  
36134    const extraRules = getCSSRules(styles, {
36135      selector: 'self'
36136    });
36137    extraRules.forEach(rule => {
36138      if (rule.selector !== 'self') {
36139        throw "This style can't be added as inline style";
36140      }
36141  
36142      output[rule.key] = rule.value;
36143    });
36144    return output;
36145  }
36146  
36147  function compileElementsStyles(selector) {
36148    let elements = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
36149    return (0,external_lodash_namespaceObject.map)(elements, (styles, element) => {
36150      const elementStyles = getInlineStyles(styles);
36151  
36152      if (!(0,external_lodash_namespaceObject.isEmpty)(elementStyles)) {
36153        // The .editor-styles-wrapper selector is required on elements styles. As it is
36154        // added to all other editor styles, not providing it causes reset and global
36155        // styles to override element styles because of higher specificity.
36156        return [`.editor-styles-wrapper .$selector} $external_wp_blocks_namespaceObject.__EXPERIMENTAL_ELEMENTS[element]}{`, ...(0,external_lodash_namespaceObject.map)(elementStyles, (value, property) => `\t${(0,external_lodash_namespaceObject.kebabCase)(property)}: $value};`), '}'].join('\n');
36157      }
36158  
36159      return '';
36160    }).join('\n');
36161  }
36162  /**
36163   * Filters registered block settings, extending attributes to include `style` attribute.
36164   *
36165   * @param {Object} settings Original block settings.
36166   *
36167   * @return {Object} Filtered block settings.
36168   */
36169  
36170  
36171  function style_addAttribute(settings) {
36172    if (!hasStyleSupport(settings)) {
36173      return settings;
36174    } // Allow blocks to specify their own attribute definition with default values if needed.
36175  
36176  
36177    if (!settings.attributes.style) {
36178      Object.assign(settings.attributes, {
36179        style: {
36180          type: 'object'
36181        }
36182      });
36183    }
36184  
36185    return settings;
36186  }
36187  /**
36188   * A dictionary of paths to flag skipping block support serialization as the key,
36189   * with values providing the style paths to be omitted from serialization.
36190   *
36191   * @constant
36192   * @type {Record<string, string[]>}
36193   */
36194  
36195  
36196  const skipSerializationPathsEdit = {
36197    [`$BORDER_SUPPORT_KEY}.__experimentalSkipSerialization`]: ['border'],
36198    [`$COLOR_SUPPORT_KEY}.__experimentalSkipSerialization`]: [COLOR_SUPPORT_KEY],
36199    [`$TYPOGRAPHY_SUPPORT_KEY}.__experimentalSkipSerialization`]: [TYPOGRAPHY_SUPPORT_KEY],
36200    [`$SPACING_SUPPORT_KEY}.__experimentalSkipSerialization`]: ['spacing']
36201  };
36202  /**
36203   * A dictionary of paths to flag skipping block support serialization as the key,
36204   * with values providing the style paths to be omitted from serialization.
36205   *
36206   * Extends the Edit skip paths to enable skipping additional paths in just
36207   * the Save component. This allows a block support to be serialized within the
36208   * editor, while using an alternate approach, such as server-side rendering, when
36209   * the support is saved.
36210   *
36211   * @constant
36212   * @type {Record<string, string[]>}
36213   */
36214  
36215  const skipSerializationPathsSave = { ...skipSerializationPathsEdit,
36216    [`$SPACING_SUPPORT_KEY}`]: ['spacing.blockGap']
36217  };
36218  /**
36219   * A dictionary used to normalize feature names between support flags, style
36220   * object properties and __experimentSkipSerialization configuration arrays.
36221   *
36222   * This allows not having to provide a migration for a support flag and possible
36223   * backwards compatibility bridges, while still achieving consistency between
36224   * the support flag and the skip serialization array.
36225   *
36226   * @constant
36227   * @type {Record<string, string>}
36228   */
36229  
36230  const renamedFeatures = {
36231    gradients: 'gradient'
36232  };
36233  /**
36234   * Override props assigned to save component to inject the CSS variables definition.
36235   *
36236   * @param {Object}                    props      Additional props applied to save element.
36237   * @param {Object}                    blockType  Block type.
36238   * @param {Object}                    attributes Block attributes.
36239   * @param {?Record<string, string[]>} skipPaths  An object of keys and paths to skip serialization.
36240   *
36241   * @return {Object} Filtered props applied to save element.
36242   */
36243  
36244  function style_addSaveProps(props, blockType, attributes) {
36245    let skipPaths = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : skipSerializationPathsSave;
36246  
36247    if (!hasStyleSupport(blockType)) {
36248      return props;
36249    }
36250  
36251    let {
36252      style
36253    } = attributes;
36254    (0,external_lodash_namespaceObject.forEach)(skipPaths, (path, indicator) => {
36255      const skipSerialization = (0,external_wp_blocks_namespaceObject.getBlockSupport)(blockType, indicator);
36256  
36257      if (skipSerialization === true) {
36258        style = (0,external_lodash_namespaceObject.omit)(style, path);
36259      }
36260  
36261      if (Array.isArray(skipSerialization)) {
36262        skipSerialization.forEach(featureName => {
36263          const feature = renamedFeatures[featureName] || featureName;
36264          style = (0,external_lodash_namespaceObject.omit)(style, [[...path, feature]]);
36265        });
36266      }
36267    });
36268    props.style = { ...getInlineStyles(style),
36269      ...props.style
36270    };
36271    return props;
36272  }
36273  /**
36274   * Filters registered block settings to extend the block edit wrapper
36275   * to apply the desired styles and classnames properly.
36276   *
36277   * @param {Object} settings Original block settings.
36278   *
36279   * @return {Object}.Filtered block settings.
36280   */
36281  
36282  function style_addEditProps(settings) {
36283    if (!hasStyleSupport(settings)) {
36284      return settings;
36285    }
36286  
36287    const existingGetEditWrapperProps = settings.getEditWrapperProps;
36288  
36289    settings.getEditWrapperProps = attributes => {
36290      let props = {};
36291  
36292      if (existingGetEditWrapperProps) {
36293        props = existingGetEditWrapperProps(attributes);
36294      }
36295  
36296      return style_addSaveProps(props, settings, attributes, skipSerializationPathsEdit);
36297    };
36298  
36299    return settings;
36300  }
36301  /**
36302   * Override the default edit UI to include new inspector controls for
36303   * all the custom styles configs.
36304   *
36305   * @param {Function} BlockEdit Original component.
36306   *
36307   * @return {Function} Wrapped component.
36308   */
36309  
36310  const withBlockControls = (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(BlockEdit => props => {
36311    const shouldDisplayControls = useDisplayBlockControls();
36312    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, shouldDisplayControls && (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(ColorEdit, props), (0,external_wp_element_namespaceObject.createElement)(TypographyPanel, props), (0,external_wp_element_namespaceObject.createElement)(BorderPanel, props), (0,external_wp_element_namespaceObject.createElement)(DimensionsPanel, props)), (0,external_wp_element_namespaceObject.createElement)(BlockEdit, props));
36313  }, 'withToolbarControls');
36314  /**
36315   * Override the default block element to include duotone styles.
36316   *
36317   * @param {Function} BlockListBlock Original component
36318   * @return {Function}                Wrapped component
36319   */
36320  
36321  const withElementsStyles = (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(BlockListBlock => props => {
36322    var _props$attributes$sty, _props$attributes$sty2;
36323  
36324    const blockElementsContainerIdentifier = `wp-elements-${(0,external_wp_compose_namespaceObject.useInstanceId)(BlockListBlock)}`;
36325    const skipLinkColorSerialization = shouldSkipSerialization(props.name, COLOR_SUPPORT_KEY, 'link'); // The Elements API only supports link colors for now,
36326    // hence the specific omission of `link` in the elements styles.
36327    // This might need to be refactored or removed if the Elements API
36328    // changes or `link` supports styles beyond `color`.
36329  
36330    const elements = skipLinkColorSerialization ? (0,external_lodash_namespaceObject.omit)((_props$attributes$sty = props.attributes.style) === null || _props$attributes$sty === void 0 ? void 0 : _props$attributes$sty.elements, ['link']) : (_props$attributes$sty2 = props.attributes.style) === null || _props$attributes$sty2 === void 0 ? void 0 : _props$attributes$sty2.elements;
36331    const styles = compileElementsStyles(blockElementsContainerIdentifier, elements);
36332    const element = (0,external_wp_element_namespaceObject.useContext)(BlockList.__unstableElementContext);
36333    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, elements && element && (0,external_wp_element_namespaceObject.createPortal)((0,external_wp_element_namespaceObject.createElement)("style", {
36334      dangerouslySetInnerHTML: {
36335        __html: styles
36336      }
36337    }), element), (0,external_wp_element_namespaceObject.createElement)(BlockListBlock, _extends({}, props, {
36338      className: elements ? classnames_default()(props.className, blockElementsContainerIdentifier) : props.className
36339    })));
36340  });
36341  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.registerBlockType', 'core/style/addAttribute', style_addAttribute);
36342  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.getSaveContent.extraProps', 'core/style/addSaveProps', style_addSaveProps);
36343  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.registerBlockType', 'core/style/addEditProps', style_addEditProps);
36344  (0,external_wp_hooks_namespaceObject.addFilter)('editor.BlockEdit', 'core/style/with-block-controls', withBlockControls);
36345  (0,external_wp_hooks_namespaceObject.addFilter)('editor.BlockListBlock', 'core/editor/with-elements-styles', withElementsStyles);
36346  
36347  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/duotone-control/index.js
36348  
36349  
36350  /**
36351   * WordPress dependencies
36352   */
36353  
36354  
36355  
36356  
36357  function DuotoneControl(_ref) {
36358    let {
36359      colorPalette,
36360      duotonePalette,
36361      disableCustomColors,
36362      disableCustomDuotone,
36363      value,
36364      onChange
36365    } = _ref;
36366    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Dropdown, {
36367      popoverProps: {
36368        className: 'block-editor-duotone-control__popover',
36369        headerTitle: (0,external_wp_i18n_namespaceObject.__)('Duotone'),
36370        isAlternate: true
36371      },
36372      renderToggle: _ref2 => {
36373        let {
36374          isOpen,
36375          onToggle
36376        } = _ref2;
36377  
36378        const openOnArrowDown = event => {
36379          if (!isOpen && event.keyCode === external_wp_keycodes_namespaceObject.DOWN) {
36380            event.preventDefault();
36381            onToggle();
36382          }
36383        };
36384  
36385        return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarButton, {
36386          showTooltip: true,
36387          onClick: onToggle,
36388          "aria-haspopup": "true",
36389          "aria-expanded": isOpen,
36390          onKeyDown: openOnArrowDown,
36391          label: (0,external_wp_i18n_namespaceObject.__)('Apply duotone filter'),
36392          icon: (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.DuotoneSwatch, {
36393            values: value
36394          })
36395        });
36396      },
36397      renderContent: () => (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuGroup, {
36398        label: (0,external_wp_i18n_namespaceObject.__)('Duotone')
36399      }, (0,external_wp_element_namespaceObject.createElement)("div", {
36400        className: "block-editor-duotone-control__description"
36401      }, (0,external_wp_i18n_namespaceObject.__)('Create a two-tone color effect without losing your original image.')), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.DuotonePicker, {
36402        colorPalette: colorPalette,
36403        duotonePalette: duotonePalette,
36404        disableCustomColors: disableCustomColors,
36405        disableCustomDuotone: disableCustomDuotone,
36406        value: value,
36407        onChange: onChange
36408      }))
36409    });
36410  }
36411  
36412  /* harmony default export */ var duotone_control = (DuotoneControl);
36413  
36414  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/duotone.js
36415  
36416  
36417  
36418  /**
36419   * External dependencies
36420   */
36421  
36422  
36423  
36424  /**
36425   * WordPress dependencies
36426   */
36427  
36428  
36429  
36430  
36431  
36432  
36433  /**
36434   * Internal dependencies
36435   */
36436  
36437  
36438  
36439  const duotone_EMPTY_ARRAY = [];
36440  k([names]);
36441  /**
36442   * Convert a list of colors to an object of R, G, and B values.
36443   *
36444   * @param {string[]} colors Array of RBG color strings.
36445   *
36446   * @return {Object} R, G, and B values.
36447   */
36448  
36449  function getValuesFromColors() {
36450    let colors = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
36451    const values = {
36452      r: [],
36453      g: [],
36454      b: [],
36455      a: []
36456    };
36457    colors.forEach(color => {
36458      const rgbColor = w(color).toRgb();
36459      values.r.push(rgbColor.r / 255);
36460      values.g.push(rgbColor.g / 255);
36461      values.b.push(rgbColor.b / 255);
36462      values.a.push(rgbColor.a);
36463    });
36464    return values;
36465  }
36466  /**
36467   * Values for the SVG `feComponentTransfer`.
36468   *
36469   * @typedef Values {Object}
36470   * @property {number[]} r Red values.
36471   * @property {number[]} g Green values.
36472   * @property {number[]} b Blue values.
36473   * @property {number[]} a Alpha values.
36474   */
36475  
36476  /**
36477   * Stylesheet for rendering the duotone filter.
36478   *
36479   * @param {Object} props          Duotone props.
36480   * @param {string} props.selector Selector to apply the filter to.
36481   * @param {string} props.id       Unique id for this duotone filter.
36482   *
36483   * @return {WPElement} Duotone element.
36484   */
36485  
36486  function DuotoneStylesheet(_ref) {
36487    let {
36488      selector,
36489      id
36490    } = _ref;
36491    const css = `
36492  $selector} {
36493      filter: url( #$id} );
36494  }
36495  `;
36496    return (0,external_wp_element_namespaceObject.createElement)("style", null, css);
36497  }
36498  /**
36499   * SVG for rendering the duotone filter.
36500   *
36501   * @param {Object} props        Duotone props.
36502   * @param {string} props.id     Unique id for this duotone filter.
36503   * @param {Values} props.values R, G, B, and A values to filter with.
36504   *
36505   * @return {WPElement} Duotone element.
36506   */
36507  
36508  
36509  function DuotoneFilter(_ref2) {
36510    let {
36511      id,
36512      values
36513    } = _ref2;
36514    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.SVG, {
36515      xmlnsXlink: "http://www.w3.org/1999/xlink",
36516      viewBox: "0 0 0 0",
36517      width: "0",
36518      height: "0",
36519      focusable: "false",
36520      role: "none",
36521      style: {
36522        visibility: 'hidden',
36523        position: 'absolute',
36524        left: '-9999px',
36525        overflow: 'hidden'
36526      }
36527    }, (0,external_wp_element_namespaceObject.createElement)("defs", null, (0,external_wp_element_namespaceObject.createElement)("filter", {
36528      id: id
36529    }, (0,external_wp_element_namespaceObject.createElement)("feColorMatrix", {
36530      // Use sRGB instead of linearRGB so transparency looks correct.
36531      colorInterpolationFilters: "sRGB",
36532      type: "matrix" // Use perceptual brightness to convert to grayscale.
36533      ,
36534      values: " .299 .587 .114 0 0 .299 .587 .114 0 0 .299 .587 .114 0 0 .299 .587 .114 0 0 "
36535    }), (0,external_wp_element_namespaceObject.createElement)("feComponentTransfer", {
36536      // Use sRGB instead of linearRGB to be consistent with how CSS gradients work.
36537      colorInterpolationFilters: "sRGB"
36538    }, (0,external_wp_element_namespaceObject.createElement)("feFuncR", {
36539      type: "table",
36540      tableValues: values.r.join(' ')
36541    }), (0,external_wp_element_namespaceObject.createElement)("feFuncG", {
36542      type: "table",
36543      tableValues: values.g.join(' ')
36544    }), (0,external_wp_element_namespaceObject.createElement)("feFuncB", {
36545      type: "table",
36546      tableValues: values.b.join(' ')
36547    }), (0,external_wp_element_namespaceObject.createElement)("feFuncA", {
36548      type: "table",
36549      tableValues: values.a.join(' ')
36550    })), (0,external_wp_element_namespaceObject.createElement)("feComposite", {
36551      // Re-mask the image with the original transparency since the feColorMatrix above loses that information.
36552      in2: "SourceGraphic",
36553      operator: "in"
36554    }))));
36555  }
36556  /**
36557   * SVG and stylesheet needed for rendering the duotone filter.
36558   *
36559   * @param {Object} props          Duotone props.
36560   * @param {string} props.selector Selector to apply the filter to.
36561   * @param {string} props.id       Unique id for this duotone filter.
36562   * @param {Values} props.values   R, G, B, and A values to filter with.
36563   *
36564   * @return {WPElement} Duotone element.
36565   */
36566  
36567  
36568  function InlineDuotone(_ref3) {
36569    let {
36570      selector,
36571      id,
36572      values
36573    } = _ref3;
36574    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(DuotoneFilter, {
36575      id: id,
36576      values: values
36577    }), (0,external_wp_element_namespaceObject.createElement)(DuotoneStylesheet, {
36578      id: id,
36579      selector: selector
36580    }));
36581  }
36582  
36583  function useMultiOriginPresets(_ref4) {
36584    let {
36585      presetSetting,
36586      defaultSetting
36587    } = _ref4;
36588    const disableDefault = !useSetting(defaultSetting);
36589    const userPresets = useSetting(`$presetSetting}.custom`) || duotone_EMPTY_ARRAY;
36590    const themePresets = useSetting(`$presetSetting}.theme`) || duotone_EMPTY_ARRAY;
36591    const defaultPresets = useSetting(`$presetSetting}.default`) || duotone_EMPTY_ARRAY;
36592    return (0,external_wp_element_namespaceObject.useMemo)(() => [...userPresets, ...themePresets, ...(disableDefault ? duotone_EMPTY_ARRAY : defaultPresets)], [disableDefault, userPresets, themePresets, defaultPresets]);
36593  }
36594  
36595  function DuotonePanel(_ref5) {
36596    var _style$color;
36597  
36598    let {
36599      attributes,
36600      setAttributes
36601    } = _ref5;
36602    const style = attributes === null || attributes === void 0 ? void 0 : attributes.style;
36603    const duotone = style === null || style === void 0 ? void 0 : (_style$color = style.color) === null || _style$color === void 0 ? void 0 : _style$color.duotone;
36604    const duotonePalette = useMultiOriginPresets({
36605      presetSetting: 'color.duotone',
36606      defaultSetting: 'color.defaultDuotone'
36607    });
36608    const colorPalette = useMultiOriginPresets({
36609      presetSetting: 'color.palette',
36610      defaultSetting: 'color.defaultPalette'
36611    });
36612    const disableCustomColors = !useSetting('color.custom');
36613    const disableCustomDuotone = !useSetting('color.customDuotone') || (colorPalette === null || colorPalette === void 0 ? void 0 : colorPalette.length) === 0 && disableCustomColors;
36614  
36615    if ((duotonePalette === null || duotonePalette === void 0 ? void 0 : duotonePalette.length) === 0 && disableCustomDuotone) {
36616      return null;
36617    }
36618  
36619    return (0,external_wp_element_namespaceObject.createElement)(block_controls, {
36620      group: "block",
36621      __experimentalShareWithChildBlocks: true
36622    }, (0,external_wp_element_namespaceObject.createElement)(duotone_control, {
36623      duotonePalette: duotonePalette,
36624      colorPalette: colorPalette,
36625      disableCustomDuotone: disableCustomDuotone,
36626      disableCustomColors: disableCustomColors,
36627      value: duotone,
36628      onChange: newDuotone => {
36629        const newStyle = { ...style,
36630          color: { ...(style === null || style === void 0 ? void 0 : style.color),
36631            duotone: newDuotone
36632          }
36633        };
36634        setAttributes({
36635          style: newStyle
36636        });
36637      }
36638    }));
36639  }
36640  /**
36641   * Filters registered block settings, extending attributes to include
36642   * the `duotone` attribute.
36643   *
36644   * @param {Object} settings Original block settings.
36645   *
36646   * @return {Object} Filtered block settings.
36647   */
36648  
36649  
36650  function addDuotoneAttributes(settings) {
36651    if (!(0,external_wp_blocks_namespaceObject.hasBlockSupport)(settings, 'color.__experimentalDuotone')) {
36652      return settings;
36653    } // Allow blocks to specify their own attribute definition with default
36654    // values if needed.
36655  
36656  
36657    if (!settings.attributes.style) {
36658      Object.assign(settings.attributes, {
36659        style: {
36660          type: 'object'
36661        }
36662      });
36663    }
36664  
36665    return settings;
36666  }
36667  /**
36668   * Override the default edit UI to include toolbar controls for duotone if the
36669   * block supports duotone.
36670   *
36671   * @param {Function} BlockEdit Original component.
36672   *
36673   * @return {Function} Wrapped component.
36674   */
36675  
36676  
36677  const withDuotoneControls = (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(BlockEdit => props => {
36678    const hasDuotoneSupport = (0,external_wp_blocks_namespaceObject.hasBlockSupport)(props.name, 'color.__experimentalDuotone');
36679    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(BlockEdit, props), hasDuotoneSupport && (0,external_wp_element_namespaceObject.createElement)(DuotonePanel, props));
36680  }, 'withDuotoneControls');
36681  /**
36682   * Function that scopes a selector with another one. This works a bit like
36683   * SCSS nesting except the `&` operator isn't supported.
36684   *
36685   * @example
36686   * ```js
36687   * const scope = '.a, .b .c';
36688   * const selector = '> .x, .y';
36689   * const merged = scopeSelector( scope, selector );
36690   * // merged is '.a > .x, .a .y, .b .c > .x, .b .c .y'
36691   * ```
36692   *
36693   * @param {string} scope    Selector to scope to.
36694   * @param {string} selector Original selector.
36695   *
36696   * @return {string} Scoped selector.
36697   */
36698  
36699  function scopeSelector(scope, selector) {
36700    const scopes = scope.split(',');
36701    const selectors = selector.split(',');
36702    const selectorsScoped = [];
36703    scopes.forEach(outer => {
36704      selectors.forEach(inner => {
36705        selectorsScoped.push(`$outer.trim()} $inner.trim()}`);
36706      });
36707    });
36708    return selectorsScoped.join(', ');
36709  }
36710  /**
36711   * Override the default block element to include duotone styles.
36712   *
36713   * @param {Function} BlockListBlock Original component.
36714   *
36715   * @return {Function} Wrapped component.
36716   */
36717  
36718  
36719  const withDuotoneStyles = (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(BlockListBlock => props => {
36720    var _props$attributes, _props$attributes$sty, _props$attributes$sty2;
36721  
36722    const duotoneSupport = (0,external_wp_blocks_namespaceObject.getBlockSupport)(props.name, 'color.__experimentalDuotone');
36723    const values = props === null || props === void 0 ? void 0 : (_props$attributes = props.attributes) === null || _props$attributes === void 0 ? void 0 : (_props$attributes$sty = _props$attributes.style) === null || _props$attributes$sty === void 0 ? void 0 : (_props$attributes$sty2 = _props$attributes$sty.color) === null || _props$attributes$sty2 === void 0 ? void 0 : _props$attributes$sty2.duotone;
36724  
36725    if (!duotoneSupport || !values) {
36726      return (0,external_wp_element_namespaceObject.createElement)(BlockListBlock, props);
36727    }
36728  
36729    const id = `wp-duotone-${(0,external_wp_compose_namespaceObject.useInstanceId)(BlockListBlock)}`; // Extra .editor-styles-wrapper specificity is needed in the editor
36730    // since we're not using inline styles to apply the filter. We need to
36731    // override duotone applied by global styles and theme.json.
36732  
36733    const selectorsGroup = scopeSelector(`.editor-styles-wrapper .$id}`, duotoneSupport);
36734    const className = classnames_default()(props === null || props === void 0 ? void 0 : props.className, id);
36735    const element = (0,external_wp_element_namespaceObject.useContext)(BlockList.__unstableElementContext);
36736    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, element && (0,external_wp_element_namespaceObject.createPortal)((0,external_wp_element_namespaceObject.createElement)(InlineDuotone, {
36737      selector: selectorsGroup,
36738      id: id,
36739      values: getValuesFromColors(values)
36740    }), element), (0,external_wp_element_namespaceObject.createElement)(BlockListBlock, _extends({}, props, {
36741      className: className
36742    })));
36743  }, 'withDuotoneStyles');
36744  function PresetDuotoneFilter(_ref6) {
36745    let {
36746      preset
36747    } = _ref6;
36748    return (0,external_wp_element_namespaceObject.createElement)(DuotoneFilter, {
36749      id: `wp-duotone-$preset.slug}`,
36750      values: getValuesFromColors(preset.colors)
36751    });
36752  }
36753  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.registerBlockType', 'core/editor/duotone/add-attributes', addDuotoneAttributes);
36754  (0,external_wp_hooks_namespaceObject.addFilter)('editor.BlockEdit', 'core/editor/duotone/with-editor-controls', withDuotoneControls);
36755  (0,external_wp_hooks_namespaceObject.addFilter)('editor.BlockListBlock', 'core/editor/duotone/with-styles', withDuotoneStyles);
36756  
36757  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/layout.js
36758  
36759  
36760  
36761  /**
36762   * External dependencies
36763   */
36764  
36765  
36766  /**
36767   * WordPress dependencies
36768   */
36769  
36770  
36771  
36772  
36773  
36774  
36775  
36776  
36777  /**
36778   * Internal dependencies
36779   */
36780  
36781  
36782  
36783  
36784  
36785  
36786  
36787  const layoutBlockSupportKey = '__experimentalLayout';
36788  
36789  function LayoutPanel(_ref) {
36790    let {
36791      setAttributes,
36792      attributes,
36793      name: blockName
36794    } = _ref;
36795    const {
36796      layout
36797    } = attributes;
36798    const defaultThemeLayout = useSetting('layout');
36799    const themeSupportsLayout = (0,external_wp_data_namespaceObject.useSelect)(select => {
36800      const {
36801        getSettings
36802      } = select(store);
36803      return getSettings().supportsLayout;
36804    }, []);
36805    const layoutBlockSupport = (0,external_wp_blocks_namespaceObject.getBlockSupport)(blockName, layoutBlockSupportKey, {});
36806    const {
36807      allowSwitching,
36808      allowEditing = true,
36809      allowInheriting = true,
36810      default: defaultBlockLayout
36811    } = layoutBlockSupport;
36812  
36813    if (!allowEditing) {
36814      return null;
36815    } // Only show the inherit toggle if it's supported,
36816    // a default theme layout is set (e.g. one that provides `contentSize` and/or `wideSize` values),
36817    // and that the default / flow layout type is in use, as this is the only one that supports inheritance.
36818  
36819  
36820    const showInheritToggle = !!(allowInheriting && !!defaultThemeLayout && (!(layout !== null && layout !== void 0 && layout.type) || (layout === null || layout === void 0 ? void 0 : layout.type) === 'default' || layout !== null && layout !== void 0 && layout.inherit));
36821    const usedLayout = layout || defaultBlockLayout || {};
36822    const {
36823      inherit = false,
36824      type = 'default'
36825    } = usedLayout;
36826    /**
36827     * `themeSupportsLayout` is only relevant to the `default/flow`
36828     * layout and it should not be taken into account when other
36829     * `layout` types are used.
36830     */
36831  
36832    if (type === 'default' && !themeSupportsLayout) {
36833      return null;
36834    }
36835  
36836    const layoutType = getLayoutType(type);
36837  
36838    const onChangeType = newType => setAttributes({
36839      layout: {
36840        type: newType
36841      }
36842    });
36843  
36844    const onChangeLayout = newLayout => setAttributes({
36845      layout: newLayout
36846    });
36847  
36848    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(inspector_controls, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.PanelBody, {
36849      title: (0,external_wp_i18n_namespaceObject.__)('Layout')
36850    }, showInheritToggle && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToggleControl, {
36851      label: (0,external_wp_i18n_namespaceObject.__)('Inherit default layout'),
36852      checked: !!inherit,
36853      onChange: () => setAttributes({
36854        layout: {
36855          inherit: !inherit
36856        }
36857      })
36858    }), !inherit && allowSwitching && (0,external_wp_element_namespaceObject.createElement)(LayoutTypeSwitcher, {
36859      type: type,
36860      onChange: onChangeType
36861    }), !inherit && layoutType && (0,external_wp_element_namespaceObject.createElement)(layoutType.inspectorControls, {
36862      layout: usedLayout,
36863      onChange: onChangeLayout,
36864      layoutBlockSupport: layoutBlockSupport
36865    }))), !inherit && layoutType && (0,external_wp_element_namespaceObject.createElement)(layoutType.toolBarControls, {
36866      layout: usedLayout,
36867      onChange: onChangeLayout,
36868      layoutBlockSupport: layoutBlockSupport
36869    }));
36870  }
36871  
36872  function LayoutTypeSwitcher(_ref2) {
36873    let {
36874      type,
36875      onChange
36876    } = _ref2;
36877    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ButtonGroup, null, getLayoutTypes().map(_ref3 => {
36878      let {
36879        name,
36880        label
36881      } = _ref3;
36882      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
36883        key: name,
36884        isPressed: type === name,
36885        onClick: () => onChange(name)
36886      }, label);
36887    }));
36888  }
36889  /**
36890   * Filters registered block settings, extending attributes to include `layout`.
36891   *
36892   * @param {Object} settings Original block settings.
36893   *
36894   * @return {Object} Filtered block settings.
36895   */
36896  
36897  
36898  function layout_addAttribute(settings) {
36899    if ((0,external_lodash_namespaceObject.has)(settings.attributes, ['layout', 'type'])) {
36900      return settings;
36901    }
36902  
36903    if ((0,external_wp_blocks_namespaceObject.hasBlockSupport)(settings, layoutBlockSupportKey)) {
36904      settings.attributes = { ...settings.attributes,
36905        layout: {
36906          type: 'object'
36907        }
36908      };
36909    }
36910  
36911    return settings;
36912  }
36913  /**
36914   * Override the default edit UI to include layout controls
36915   *
36916   * @param {Function} BlockEdit Original component.
36917   *
36918   * @return {Function} Wrapped component.
36919   */
36920  
36921  const withInspectorControls = (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(BlockEdit => props => {
36922    const {
36923      name: blockName
36924    } = props;
36925    const supportLayout = (0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockName, layoutBlockSupportKey);
36926    return [supportLayout && (0,external_wp_element_namespaceObject.createElement)(LayoutPanel, _extends({
36927      key: "layout"
36928    }, props)), (0,external_wp_element_namespaceObject.createElement)(BlockEdit, _extends({
36929      key: "edit"
36930    }, props))];
36931  }, 'withInspectorControls');
36932  /**
36933   * Override the default block element to add the layout styles.
36934   *
36935   * @param {Function} BlockListBlock Original component.
36936   *
36937   * @return {Function} Wrapped component.
36938   */
36939  
36940  const withLayoutStyles = (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(BlockListBlock => props => {
36941    const {
36942      name,
36943      attributes
36944    } = props;
36945    const shouldRenderLayoutStyles = (0,external_wp_blocks_namespaceObject.hasBlockSupport)(name, layoutBlockSupportKey);
36946    const id = (0,external_wp_compose_namespaceObject.useInstanceId)(BlockListBlock);
36947    const defaultThemeLayout = useSetting('layout') || {};
36948    const element = (0,external_wp_element_namespaceObject.useContext)(BlockList.__unstableElementContext);
36949    const {
36950      layout
36951    } = attributes;
36952    const {
36953      default: defaultBlockLayout
36954    } = (0,external_wp_blocks_namespaceObject.getBlockSupport)(name, layoutBlockSupportKey) || {};
36955    const usedLayout = layout !== null && layout !== void 0 && layout.inherit ? defaultThemeLayout : layout || defaultBlockLayout || {};
36956    const className = classnames_default()(props === null || props === void 0 ? void 0 : props.className, {
36957      [`wp-container-$id}`]: shouldRenderLayoutStyles
36958    });
36959    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, shouldRenderLayoutStyles && element && (0,external_wp_element_namespaceObject.createPortal)((0,external_wp_element_namespaceObject.createElement)(LayoutStyle, {
36960      blockName: name,
36961      selector: `.wp-container-$id}`,
36962      layout: usedLayout,
36963      style: attributes === null || attributes === void 0 ? void 0 : attributes.style
36964    }), element), (0,external_wp_element_namespaceObject.createElement)(BlockListBlock, _extends({}, props, {
36965      className: className
36966    })));
36967  });
36968  (0,external_wp_hooks_namespaceObject.addFilter)('blocks.registerBlockType', 'core/layout/addAttribute', layout_addAttribute);
36969  (0,external_wp_hooks_namespaceObject.addFilter)('editor.BlockListBlock', 'core/editor/layout/with-layout-styles', withLayoutStyles);
36970  (0,external_wp_hooks_namespaceObject.addFilter)('editor.BlockEdit', 'core/editor/layout/with-inspector-controls', withInspectorControls);
36971  
36972  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/use-border-props.js
36973  /**
36974   * External dependencies
36975   */
36976  
36977  /**
36978   * Internal dependencies
36979   */
36980  
36981  
36982  
36983   // This utility is intended to assist where the serialization of the border
36984  // block support is being skipped for a block but the border related CSS classes
36985  // & styles still need to be generated so they can be applied to inner elements.
36986  
36987  const use_border_props_EMPTY_ARRAY = [];
36988  /**
36989   * Provides the CSS class names and inline styles for a block's border support
36990   * attributes.
36991   *
36992   * @param {Object} attributes             Block attributes.
36993   * @param {string} attributes.borderColor Selected named border color.
36994   * @param {Object} attributes.style       Block's styles attribute.
36995   *
36996   * @return {Object} Border block support derived CSS classes & styles.
36997   */
36998  
36999  function getBorderClassesAndStyles(_ref) {
37000    var _style$border;
37001  
37002    let {
37003      borderColor,
37004      style
37005    } = _ref;
37006    const borderStyles = (style === null || style === void 0 ? void 0 : style.border) || {};
37007    const borderClass = getColorClassName('border-color', borderColor);
37008    const className = classnames_default()({
37009      [borderClass]: !!borderClass,
37010      'has-border-color': borderColor || (style === null || style === void 0 ? void 0 : (_style$border = style.border) === null || _style$border === void 0 ? void 0 : _style$border.color)
37011    });
37012    return {
37013      className: className || undefined,
37014      style: getInlineStyles({
37015        border: borderStyles
37016      })
37017    };
37018  }
37019  /**
37020   * Derives the border related props for a block from its border block support
37021   * attributes.
37022   *
37023   * Inline styles are forced for named colors to ensure these selections are
37024   * reflected when themes do not load their color stylesheets in the editor.
37025   *
37026   * @param {Object} attributes Block attributes.
37027   *
37028   * @return {Object} ClassName & style props from border block support.
37029   */
37030  
37031  function useBorderProps(attributes) {
37032    const colors = useSetting('color.palette') || use_border_props_EMPTY_ARRAY;
37033    const borderProps = getBorderClassesAndStyles(attributes); // Force inline style to apply border color when themes do not load their
37034    // color stylesheets in the editor.
37035  
37036    if (attributes.borderColor) {
37037      const borderColorObject = getColorObjectByAttributeValues(colors, attributes.borderColor);
37038      borderProps.style.borderColor = borderColorObject.color;
37039    }
37040  
37041    return borderProps;
37042  }
37043  
37044  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/use-color-props.js
37045  /**
37046   * External dependencies
37047   */
37048  
37049  /**
37050   * WordPress dependencies
37051   */
37052  
37053  
37054  /**
37055   * Internal dependencies
37056   */
37057  
37058  
37059  
37060  
37061   // The code in this file has largely been lifted from the color block support
37062  // hook.
37063  //
37064  // This utility is intended to assist where the serialization of the colors
37065  // block support is being skipped for a block but the color related CSS classes
37066  // & styles still need to be generated so they can be applied to inner elements.
37067  
37068  /**
37069   * Provides the CSS class names and inline styles for a block's color support
37070   * attributes.
37071   *
37072   * @param {Object} attributes Block attributes.
37073   *
37074   * @return {Object} Color block support derived CSS classes & styles.
37075   */
37076  
37077  function getColorClassesAndStyles(attributes) {
37078    var _style$color, _style$color2, _style$color3, _style$color4, _style$elements, _style$elements$link;
37079  
37080    const {
37081      backgroundColor,
37082      textColor,
37083      gradient,
37084      style
37085    } = attributes; // Collect color CSS classes.
37086  
37087    const backgroundClass = getColorClassName('background-color', backgroundColor);
37088    const textClass = getColorClassName('color', textColor);
37089  
37090    const gradientClass = __experimentalGetGradientClass(gradient);
37091  
37092    const hasGradient = gradientClass || (style === null || style === void 0 ? void 0 : (_style$color = style.color) === null || _style$color === void 0 ? void 0 : _style$color.gradient); // Determine color CSS class name list.
37093  
37094    const className = classnames_default()(textClass, gradientClass, {
37095      // Don't apply the background class if there's a gradient.
37096      [backgroundClass]: !hasGradient && !!backgroundClass,
37097      'has-text-color': textColor || (style === null || style === void 0 ? void 0 : (_style$color2 = style.color) === null || _style$color2 === void 0 ? void 0 : _style$color2.text),
37098      'has-background': backgroundColor || (style === null || style === void 0 ? void 0 : (_style$color3 = style.color) === null || _style$color3 === void 0 ? void 0 : _style$color3.background) || gradient || (style === null || style === void 0 ? void 0 : (_style$color4 = style.color) === null || _style$color4 === void 0 ? void 0 : _style$color4.gradient),
37099      'has-link-color': style === null || style === void 0 ? void 0 : (_style$elements = style.elements) === null || _style$elements === void 0 ? void 0 : (_style$elements$link = _style$elements.link) === null || _style$elements$link === void 0 ? void 0 : _style$elements$link.color
37100    }); // Collect inline styles for colors.
37101  
37102    const colorStyles = (style === null || style === void 0 ? void 0 : style.color) || {};
37103    const styleProp = getInlineStyles({
37104      color: colorStyles
37105    });
37106    return {
37107      className: className || undefined,
37108      style: styleProp
37109    };
37110  }
37111  const EMPTY_OBJECT = {};
37112  /**
37113   * Determines the color related props for a block derived from its color block
37114   * support attributes.
37115   *
37116   * Inline styles are forced for named colors to ensure these selections are
37117   * reflected when themes do not load their color stylesheets in the editor.
37118   *
37119   * @param {Object} attributes Block attributes.
37120   *
37121   * @return {Object} ClassName & style props from colors block support.
37122   */
37123  
37124  function useColorProps(attributes) {
37125    const {
37126      backgroundColor,
37127      textColor,
37128      gradient
37129    } = attributes; // Some color settings have a special handling for deprecated flags in `useSetting`,
37130    // so we can't unwrap them by doing const { ... } = useSetting('color')
37131    // until https://github.com/WordPress/gutenberg/issues/37094 is fixed.
37132  
37133    const userPalette = useSetting('color.palette.custom') || [];
37134    const themePalette = useSetting('color.palette.theme') || [];
37135    const defaultPalette = useSetting('color.palette.default') || [];
37136    const gradientsPerOrigin = useSetting('color.gradients') || EMPTY_OBJECT;
37137    const colors = (0,external_wp_element_namespaceObject.useMemo)(() => [...(userPalette || []), ...(themePalette || []), ...(defaultPalette || [])], [userPalette, themePalette, defaultPalette]);
37138    const gradients = (0,external_wp_element_namespaceObject.useMemo)(() => [...((gradientsPerOrigin === null || gradientsPerOrigin === void 0 ? void 0 : gradientsPerOrigin.custom) || []), ...((gradientsPerOrigin === null || gradientsPerOrigin === void 0 ? void 0 : gradientsPerOrigin.theme) || []), ...((gradientsPerOrigin === null || gradientsPerOrigin === void 0 ? void 0 : gradientsPerOrigin.default) || [])], [gradientsPerOrigin]);
37139    const colorProps = getColorClassesAndStyles(attributes); // Force inline styles to apply colors when themes do not load their color
37140    // stylesheets in the editor.
37141  
37142    if (backgroundColor) {
37143      const backgroundColorObject = getColorObjectByAttributeValues(colors, backgroundColor);
37144      colorProps.style.backgroundColor = backgroundColorObject.color;
37145    }
37146  
37147    if (gradient) {
37148      colorProps.style.background = getGradientValueBySlug(gradients, gradient);
37149    }
37150  
37151    if (textColor) {
37152      const textColorObject = getColorObjectByAttributeValues(colors, textColor);
37153      colorProps.style.color = textColorObject.color;
37154    }
37155  
37156    return colorProps;
37157  }
37158  
37159  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/use-spacing-props.js
37160  /**
37161   * Internal dependencies
37162   */
37163   // This utility is intended to assist where the serialization of the spacing
37164  // block support is being skipped for a block but the spacing related CSS
37165  // styles still need to be generated so they can be applied to inner elements.
37166  
37167  /**
37168   * Provides the CSS class names and inline styles for a block's spacing support
37169   * attributes.
37170   *
37171   * @param {Object} attributes Block attributes.
37172   *
37173   * @return {Object} Spacing block support derived CSS classes & styles.
37174   */
37175  
37176  function getSpacingClassesAndStyles(attributes) {
37177    const {
37178      style
37179    } = attributes; // Collect inline styles for spacing.
37180  
37181    const spacingStyles = (style === null || style === void 0 ? void 0 : style.spacing) || {};
37182    const styleProp = getInlineStyles({
37183      spacing: spacingStyles
37184    });
37185    return {
37186      style: styleProp
37187    };
37188  }
37189  
37190  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/use-cached-truthy.js
37191  /**
37192   * WordPress dependencies
37193   */
37194  
37195  /**
37196   * Keeps an up-to-date copy of the passed value and returns it. If value becomes falsy, it will return the last truthy copy.
37197   *
37198   * @param {any} value
37199   * @return {any} value
37200   */
37201  
37202  function useCachedTruthy(value) {
37203    const [cachedValue, setCachedValue] = (0,external_wp_element_namespaceObject.useState)(value);
37204    (0,external_wp_element_namespaceObject.useEffect)(() => {
37205      if (value) {
37206        setCachedValue(value);
37207      }
37208    }, [value]);
37209    return cachedValue;
37210  }
37211  
37212  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/index.js
37213  /**
37214   * Internal dependencies
37215   */
37216  
37217  
37218  
37219  
37220  
37221  
37222  
37223  
37224  
37225  
37226  
37227  
37228  
37229  
37230  
37231  
37232  
37233  
37234  
37235  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/colors/with-colors.js
37236  
37237  
37238  
37239  /**
37240   * External dependencies
37241   */
37242  
37243  /**
37244   * WordPress dependencies
37245   */
37246  
37247  
37248  
37249  /**
37250   * Internal dependencies
37251   */
37252  
37253  
37254  
37255  /**
37256   * Higher order component factory for injecting the `colorsArray` argument as
37257   * the colors prop in the `withCustomColors` HOC.
37258   *
37259   * @param {Array} colorsArray An array of color objects.
37260   *
37261   * @return {Function} The higher order component.
37262   */
37263  
37264  const withCustomColorPalette = colorsArray => (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(WrappedComponent => props => (0,external_wp_element_namespaceObject.createElement)(WrappedComponent, _extends({}, props, {
37265    colors: colorsArray
37266  })), 'withCustomColorPalette');
37267  /**
37268   * Higher order component factory for injecting the editor colors as the
37269   * `colors` prop in the `withColors` HOC.
37270   *
37271   * @return {Function} The higher order component.
37272   */
37273  
37274  
37275  const withEditorColorPalette = () => (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(WrappedComponent => props => {
37276    // Some color settings have a special handling for deprecated flags in `useSetting`,
37277    // so we can't unwrap them by doing const { ... } = useSetting('color')
37278    // until https://github.com/WordPress/gutenberg/issues/37094 is fixed.
37279    const userPalette = useSetting('color.palette.custom');
37280    const themePalette = useSetting('color.palette.theme');
37281    const defaultPalette = useSetting('color.palette.default');
37282    const allColors = (0,external_wp_element_namespaceObject.useMemo)(() => [...(userPalette || []), ...(themePalette || []), ...(defaultPalette || [])], [userPalette, themePalette, defaultPalette]);
37283    return (0,external_wp_element_namespaceObject.createElement)(WrappedComponent, _extends({}, props, {
37284      colors: allColors
37285    }));
37286  }, 'withEditorColorPalette');
37287  /**
37288   * Helper function used with `createHigherOrderComponent` to create
37289   * higher order components for managing color logic.
37290   *
37291   * @param {Array}    colorTypes       An array of color types (e.g. 'backgroundColor, borderColor).
37292   * @param {Function} withColorPalette A HOC for injecting the 'colors' prop into the WrappedComponent.
37293   *
37294   * @return {WPComponent} The component that can be used as a HOC.
37295   */
37296  
37297  
37298  function createColorHOC(colorTypes, withColorPalette) {
37299    const colorMap = (0,external_lodash_namespaceObject.reduce)(colorTypes, (colorObject, colorType) => {
37300      return { ...colorObject,
37301        ...((0,external_lodash_namespaceObject.isString)(colorType) ? {
37302          [colorType]: (0,external_lodash_namespaceObject.kebabCase)(colorType)
37303        } : colorType)
37304      };
37305    }, {});
37306    return (0,external_wp_compose_namespaceObject.compose)([withColorPalette, WrappedComponent => {
37307      return class extends external_wp_element_namespaceObject.Component {
37308        constructor(props) {
37309          super(props);
37310          this.setters = this.createSetters();
37311          this.colorUtils = {
37312            getMostReadableColor: this.getMostReadableColor.bind(this)
37313          };
37314          this.state = {};
37315        }
37316  
37317        getMostReadableColor(colorValue) {
37318          const {
37319            colors
37320          } = this.props;
37321          return getMostReadableColor(colors, colorValue);
37322        }
37323  
37324        createSetters() {
37325          return (0,external_lodash_namespaceObject.reduce)(colorMap, (settersAccumulator, colorContext, colorAttributeName) => {
37326            const upperFirstColorAttributeName = (0,external_lodash_namespaceObject.upperFirst)(colorAttributeName);
37327            const customColorAttributeName = `custom$upperFirstColorAttributeName}`;
37328            settersAccumulator[`set$upperFirstColorAttributeName}`] = this.createSetColor(colorAttributeName, customColorAttributeName);
37329            return settersAccumulator;
37330          }, {});
37331        }
37332  
37333        createSetColor(colorAttributeName, customColorAttributeName) {
37334          return colorValue => {
37335            const colorObject = getColorObjectByColorValue(this.props.colors, colorValue);
37336            this.props.setAttributes({
37337              [colorAttributeName]: colorObject && colorObject.slug ? colorObject.slug : undefined,
37338              [customColorAttributeName]: colorObject && colorObject.slug ? undefined : colorValue
37339            });
37340          };
37341        }
37342  
37343        static getDerivedStateFromProps(_ref, previousState) {
37344          let {
37345            attributes,
37346            colors
37347          } = _ref;
37348          return (0,external_lodash_namespaceObject.reduce)(colorMap, (newState, colorContext, colorAttributeName) => {
37349            const colorObject = getColorObjectByAttributeValues(colors, attributes[colorAttributeName], attributes[`custom${(0,external_lodash_namespaceObject.upperFirst)(colorAttributeName)}`]);
37350            const previousColorObject = previousState[colorAttributeName];
37351            const previousColor = previousColorObject === null || previousColorObject === void 0 ? void 0 : previousColorObject.color;
37352            /**
37353             * The "and previousColorObject" condition checks that a previous color object was already computed.
37354             * At the start previousColorObject and colorValue are both equal to undefined
37355             * bus as previousColorObject does not exist we should compute the object.
37356             */
37357  
37358            if (previousColor === colorObject.color && previousColorObject) {
37359              newState[colorAttributeName] = previousColorObject;
37360            } else {
37361              newState[colorAttributeName] = { ...colorObject,
37362                class: getColorClassName(colorContext, colorObject.slug)
37363              };
37364            }
37365  
37366            return newState;
37367          }, {});
37368        }
37369  
37370        render() {
37371          return (0,external_wp_element_namespaceObject.createElement)(WrappedComponent, _extends({}, this.props, {
37372            colors: undefined
37373          }, this.state, this.setters, {
37374            colorUtils: this.colorUtils
37375          }));
37376        }
37377  
37378      };
37379    }]);
37380  }
37381  /**
37382   * A higher-order component factory for creating a 'withCustomColors' HOC, which handles color logic
37383   * for class generation color value, retrieval and color attribute setting.
37384   *
37385   * Use this higher-order component to work with a custom set of colors.
37386   *
37387   * @example
37388   *
37389   * ```jsx
37390   * const CUSTOM_COLORS = [ { name: 'Red', slug: 'red', color: '#ff0000' }, { name: 'Blue', slug: 'blue', color: '#0000ff' } ];
37391   * const withCustomColors = createCustomColorsHOC( CUSTOM_COLORS );
37392   * // ...
37393   * export default compose(
37394   *     withCustomColors( 'backgroundColor', 'borderColor' ),
37395   *     MyColorfulComponent,
37396   * );
37397   * ```
37398   *
37399   * @param {Array} colorsArray The array of color objects (name, slug, color, etc... ).
37400   *
37401   * @return {Function} Higher-order component.
37402   */
37403  
37404  
37405  function createCustomColorsHOC(colorsArray) {
37406    return function () {
37407      const withColorPalette = withCustomColorPalette(colorsArray);
37408  
37409      for (var _len = arguments.length, colorTypes = new Array(_len), _key = 0; _key < _len; _key++) {
37410        colorTypes[_key] = arguments[_key];
37411      }
37412  
37413      return (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(createColorHOC(colorTypes, withColorPalette), 'withCustomColors');
37414    };
37415  }
37416  /**
37417   * A higher-order component, which handles color logic for class generation color value, retrieval and color attribute setting.
37418   *
37419   * For use with the default editor/theme color palette.
37420   *
37421   * @example
37422   *
37423   * ```jsx
37424   * export default compose(
37425   *     withColors( 'backgroundColor', { textColor: 'color' } ),
37426   *     MyColorfulComponent,
37427   * );
37428   * ```
37429   *
37430   * @param {...(Object|string)} colorTypes The arguments can be strings or objects. If the argument is an object,
37431   *                                        it should contain the color attribute name as key and the color context as value.
37432   *                                        If the argument is a string the value should be the color attribute name,
37433   *                                        the color context is computed by applying a kebab case transform to the value.
37434   *                                        Color context represents the context/place where the color is going to be used.
37435   *                                        The class name of the color is generated using 'has' followed by the color name
37436   *                                        and ending with the color context all in kebab case e.g: has-green-background-color.
37437   *
37438   * @return {Function} Higher-order component.
37439   */
37440  
37441  function withColors() {
37442    const withColorPalette = withEditorColorPalette();
37443  
37444    for (var _len2 = arguments.length, colorTypes = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
37445      colorTypes[_key2] = arguments[_key2];
37446    }
37447  
37448    return (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(createColorHOC(colorTypes, withColorPalette), 'withColors');
37449  }
37450  
37451  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/colors/index.js
37452  
37453  
37454  
37455  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/gradients/index.js
37456  
37457  
37458  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/font-sizes/with-font-sizes.js
37459  
37460  
37461  
37462  /**
37463   * External dependencies
37464   */
37465  
37466  /**
37467   * WordPress dependencies
37468   */
37469  
37470  
37471  
37472  /**
37473   * Internal dependencies
37474   */
37475  
37476  
37477  
37478  const DEFAULT_FONT_SIZES = [];
37479  /**
37480   * Higher-order component, which handles font size logic for class generation,
37481   * font size value retrieval, and font size change handling.
37482   *
37483   * @param {...(Object|string)} fontSizeNames The arguments should all be strings.
37484   *                                           Each string contains the font size
37485   *                                           attribute name e.g: 'fontSize'.
37486   *
37487   * @return {Function} Higher-order component.
37488   */
37489  
37490  /* harmony default export */ var with_font_sizes = (function () {
37491    for (var _len = arguments.length, fontSizeNames = new Array(_len), _key = 0; _key < _len; _key++) {
37492      fontSizeNames[_key] = arguments[_key];
37493    }
37494  
37495    /*
37496     * Computes an object whose key is the font size attribute name as passed in the array,
37497     * and the value is the custom font size attribute name.
37498     * Custom font size is automatically compted by appending custom followed by the font size attribute name in with the first letter capitalized.
37499     */
37500    const fontSizeAttributeNames = (0,external_lodash_namespaceObject.reduce)(fontSizeNames, (fontSizeAttributeNamesAccumulator, fontSizeAttributeName) => {
37501      fontSizeAttributeNamesAccumulator[fontSizeAttributeName] = `custom${(0,external_lodash_namespaceObject.upperFirst)(fontSizeAttributeName)}`;
37502      return fontSizeAttributeNamesAccumulator;
37503    }, {});
37504    return (0,external_wp_compose_namespaceObject.createHigherOrderComponent)((0,external_wp_compose_namespaceObject.compose)([(0,external_wp_compose_namespaceObject.createHigherOrderComponent)(WrappedComponent => props => {
37505      const fontSizes = useSetting('typography.fontSizes') || DEFAULT_FONT_SIZES;
37506      return (0,external_wp_element_namespaceObject.createElement)(WrappedComponent, _extends({}, props, {
37507        fontSizes: fontSizes
37508      }));
37509    }, 'withFontSizes'), WrappedComponent => {
37510      return class extends external_wp_element_namespaceObject.Component {
37511        constructor(props) {
37512          super(props);
37513          this.setters = this.createSetters();
37514          this.state = {};
37515        }
37516  
37517        createSetters() {
37518          return (0,external_lodash_namespaceObject.reduce)(fontSizeAttributeNames, (settersAccumulator, customFontSizeAttributeName, fontSizeAttributeName) => {
37519            const upperFirstFontSizeAttributeName = (0,external_lodash_namespaceObject.upperFirst)(fontSizeAttributeName);
37520            settersAccumulator[`set$upperFirstFontSizeAttributeName}`] = this.createSetFontSize(fontSizeAttributeName, customFontSizeAttributeName);
37521            return settersAccumulator;
37522          }, {});
37523        }
37524  
37525        createSetFontSize(fontSizeAttributeName, customFontSizeAttributeName) {
37526          return fontSizeValue => {
37527            const fontSizeObject = (0,external_lodash_namespaceObject.find)(this.props.fontSizes, {
37528              size: Number(fontSizeValue)
37529            });
37530            this.props.setAttributes({
37531              [fontSizeAttributeName]: fontSizeObject && fontSizeObject.slug ? fontSizeObject.slug : undefined,
37532              [customFontSizeAttributeName]: fontSizeObject && fontSizeObject.slug ? undefined : fontSizeValue
37533            });
37534          };
37535        }
37536  
37537        static getDerivedStateFromProps(_ref, previousState) {
37538          let {
37539            attributes,
37540            fontSizes
37541          } = _ref;
37542  
37543          const didAttributesChange = (customFontSizeAttributeName, fontSizeAttributeName) => {
37544            if (previousState[fontSizeAttributeName]) {
37545              // If new font size is name compare with the previous slug.
37546              if (attributes[fontSizeAttributeName]) {
37547                return attributes[fontSizeAttributeName] !== previousState[fontSizeAttributeName].slug;
37548              } // If font size is not named, update when the font size value changes.
37549  
37550  
37551              return previousState[fontSizeAttributeName].size !== attributes[customFontSizeAttributeName];
37552            } // In this case we need to build the font size object.
37553  
37554  
37555            return true;
37556          };
37557  
37558          if (!(0,external_lodash_namespaceObject.some)(fontSizeAttributeNames, didAttributesChange)) {
37559            return null;
37560          }
37561  
37562          const newState = (0,external_lodash_namespaceObject.reduce)((0,external_lodash_namespaceObject.pickBy)(fontSizeAttributeNames, didAttributesChange), (newStateAccumulator, customFontSizeAttributeName, fontSizeAttributeName) => {
37563            const fontSizeAttributeValue = attributes[fontSizeAttributeName];
37564            const fontSizeObject = getFontSize(fontSizes, fontSizeAttributeValue, attributes[customFontSizeAttributeName]);
37565            newStateAccumulator[fontSizeAttributeName] = { ...fontSizeObject,
37566              class: getFontSizeClass(fontSizeAttributeValue)
37567            };
37568            return newStateAccumulator;
37569          }, {});
37570          return { ...previousState,
37571            ...newState
37572          };
37573        }
37574  
37575        render() {
37576          return (0,external_wp_element_namespaceObject.createElement)(WrappedComponent, _extends({}, this.props, {
37577            fontSizes: undefined
37578          }, this.state, this.setters));
37579        }
37580  
37581      };
37582    }]), 'withFontSizes');
37583  });
37584  
37585  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/font-sizes/index.js
37586  
37587  
37588  
37589  
37590  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/align-left.js
37591  
37592  
37593  /**
37594   * WordPress dependencies
37595   */
37596  
37597  const alignLeft = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
37598    xmlns: "http://www.w3.org/2000/svg",
37599    viewBox: "0 0 24 24"
37600  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
37601    d: "M4 19.8h8.9v-1.5H4v1.5zm8.9-15.6H4v1.5h8.9V4.2zm-8.9 7v1.5h16v-1.5H4z"
37602  }));
37603  /* harmony default export */ var align_left = (alignLeft);
37604  
37605  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/align-center.js
37606  
37607  
37608  /**
37609   * WordPress dependencies
37610   */
37611  
37612  const align_center_alignCenter = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
37613    xmlns: "http://www.w3.org/2000/svg",
37614    viewBox: "0 0 24 24"
37615  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
37616    d: "M16.4 4.2H7.6v1.5h8.9V4.2zM4 11.2v1.5h16v-1.5H4zm3.6 8.6h8.9v-1.5H7.6v1.5z"
37617  }));
37618  /* harmony default export */ var align_center = (align_center_alignCenter);
37619  
37620  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/align-right.js
37621  
37622  
37623  /**
37624   * WordPress dependencies
37625   */
37626  
37627  const alignRight = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
37628    xmlns: "http://www.w3.org/2000/svg",
37629    viewBox: "0 0 24 24"
37630  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
37631    d: "M11.1 19.8H20v-1.5h-8.9v1.5zm0-15.6v1.5H20V4.2h-8.9zM4 12.8h16v-1.5H4v1.5z"
37632  }));
37633  /* harmony default export */ var align_right = (alignRight);
37634  
37635  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/alignment-control/ui.js
37636  
37637  
37638  
37639  /**
37640   * External dependencies
37641   */
37642  
37643  /**
37644   * WordPress dependencies
37645   */
37646  
37647  
37648  
37649  
37650  const DEFAULT_ALIGNMENT_CONTROLS = [{
37651    icon: align_left,
37652    title: (0,external_wp_i18n_namespaceObject.__)('Align text left'),
37653    align: 'left'
37654  }, {
37655    icon: align_center,
37656    title: (0,external_wp_i18n_namespaceObject.__)('Align text center'),
37657    align: 'center'
37658  }, {
37659    icon: align_right,
37660    title: (0,external_wp_i18n_namespaceObject.__)('Align text right'),
37661    align: 'right'
37662  }];
37663  const alignment_control_ui_POPOVER_PROPS = {
37664    position: 'bottom right',
37665    isAlternate: true
37666  };
37667  
37668  function AlignmentUI(_ref) {
37669    let {
37670      value,
37671      onChange,
37672      alignmentControls = DEFAULT_ALIGNMENT_CONTROLS,
37673      label = (0,external_wp_i18n_namespaceObject.__)('Align'),
37674      describedBy = (0,external_wp_i18n_namespaceObject.__)('Change text alignment'),
37675      isCollapsed = true,
37676      isToolbar
37677    } = _ref;
37678  
37679    function applyOrUnset(align) {
37680      return () => onChange(value === align ? undefined : align);
37681    }
37682  
37683    const activeAlignment = (0,external_lodash_namespaceObject.find)(alignmentControls, control => control.align === value);
37684  
37685    function setIcon() {
37686      if (activeAlignment) return activeAlignment.icon;
37687      return (0,external_wp_i18n_namespaceObject.isRTL)() ? align_right : align_left;
37688    }
37689  
37690    const UIComponent = isToolbar ? external_wp_components_namespaceObject.ToolbarGroup : external_wp_components_namespaceObject.ToolbarDropdownMenu;
37691    const extraProps = isToolbar ? {
37692      isCollapsed
37693    } : {};
37694    return (0,external_wp_element_namespaceObject.createElement)(UIComponent, _extends({
37695      icon: setIcon(),
37696      label: label,
37697      toggleProps: {
37698        describedBy
37699      },
37700      popoverProps: alignment_control_ui_POPOVER_PROPS,
37701      controls: alignmentControls.map(control => {
37702        const {
37703          align
37704        } = control;
37705        const isActive = value === align;
37706        return { ...control,
37707          isActive,
37708          role: isCollapsed ? 'menuitemradio' : undefined,
37709          onClick: applyOrUnset(align)
37710        };
37711      })
37712    }, extraProps));
37713  }
37714  
37715  /* harmony default export */ var alignment_control_ui = (AlignmentUI);
37716  
37717  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/alignment-control/index.js
37718  
37719  
37720  
37721  /**
37722   * Internal dependencies
37723   */
37724  
37725  
37726  const AlignmentControl = props => {
37727    return (0,external_wp_element_namespaceObject.createElement)(alignment_control_ui, _extends({}, props, {
37728      isToolbar: false
37729    }));
37730  };
37731  
37732  const AlignmentToolbar = props => {
37733    return (0,external_wp_element_namespaceObject.createElement)(alignment_control_ui, _extends({}, props, {
37734      isToolbar: true
37735    }));
37736  };
37737  /**
37738   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/alignment-control/README.md
37739   */
37740  
37741  
37742  
37743  
37744  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/autocompleters/block.js
37745  
37746  
37747  /**
37748   * External dependencies
37749   */
37750  
37751  /**
37752   * WordPress dependencies
37753   */
37754  
37755  
37756  
37757  
37758  /**
37759   * Internal dependencies
37760   */
37761  
37762  
37763  
37764  
37765  
37766  const block_SHOWN_BLOCK_TYPES = 9;
37767  /** @typedef {import('@wordpress/components').WPCompleter} WPCompleter */
37768  
37769  /**
37770   * Creates a blocks repeater for replacing the current block with a selected block type.
37771   *
37772   * @return {WPCompleter} A blocks completer.
37773   */
37774  
37775  function createBlockCompleter() {
37776    return {
37777      name: 'blocks',
37778      className: 'block-editor-autocompleters__block',
37779      triggerPrefix: '/',
37780  
37781      useItems(filterValue) {
37782        const {
37783          rootClientId,
37784          selectedBlockName
37785        } = (0,external_wp_data_namespaceObject.useSelect)(select => {
37786          const {
37787            getSelectedBlockClientId,
37788            getBlockName,
37789            getBlockInsertionPoint
37790          } = select(store);
37791          const selectedBlockClientId = getSelectedBlockClientId();
37792          return {
37793            selectedBlockName: selectedBlockClientId ? getBlockName(selectedBlockClientId) : null,
37794            rootClientId: getBlockInsertionPoint().rootClientId
37795          };
37796        }, []);
37797        const [items, categories, collections] = use_block_types_state(rootClientId, external_lodash_namespaceObject.noop);
37798        const filteredItems = (0,external_wp_element_namespaceObject.useMemo)(() => {
37799          const initialFilteredItems = !!filterValue.trim() ? searchBlockItems(items, categories, collections, filterValue) : (0,external_lodash_namespaceObject.orderBy)(items, ['frecency'], ['desc']);
37800          return initialFilteredItems.filter(item => item.name !== selectedBlockName).slice(0, block_SHOWN_BLOCK_TYPES);
37801        }, [filterValue, selectedBlockName, items, categories, collections]);
37802        const options = (0,external_wp_element_namespaceObject.useMemo)(() => filteredItems.map(blockItem => {
37803          const {
37804            title,
37805            icon,
37806            isDisabled
37807          } = blockItem;
37808          return {
37809            key: `block-$blockItem.id}`,
37810            value: blockItem,
37811            label: (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(block_icon, {
37812              key: "icon",
37813              icon: icon,
37814              showColors: true
37815            }), title),
37816            isDisabled
37817          };
37818        }), [filteredItems]);
37819        return [options];
37820      },
37821  
37822      allowContext(before, after) {
37823        return !(/\S/.test(before) || /\S/.test(after));
37824      },
37825  
37826      getOptionCompletion(inserterItem) {
37827        const {
37828          name,
37829          initialAttributes,
37830          innerBlocks
37831        } = inserterItem;
37832        return {
37833          action: 'replace',
37834          value: (0,external_wp_blocks_namespaceObject.createBlock)(name, initialAttributes, (0,external_wp_blocks_namespaceObject.createBlocksFromInnerBlocksTemplate)(innerBlocks))
37835        };
37836      }
37837  
37838    };
37839  }
37840  /**
37841   * Creates a blocks repeater for replacing the current block with a selected block type.
37842   *
37843   * @return {WPCompleter} A blocks completer.
37844   */
37845  
37846  
37847  /* harmony default export */ var autocompleters_block = (createBlockCompleter());
37848  
37849  ;// CONCATENATED MODULE: external ["wp","apiFetch"]
37850  var external_wp_apiFetch_namespaceObject = window["wp"]["apiFetch"];
37851  var external_wp_apiFetch_default = /*#__PURE__*/__webpack_require__.n(external_wp_apiFetch_namespaceObject);
37852  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/page.js
37853  
37854  
37855  /**
37856   * WordPress dependencies
37857   */
37858  
37859  const page = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
37860    xmlns: "http://www.w3.org/2000/svg",
37861    viewBox: "0 0 24 24"
37862  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
37863    d: "M7 5.5h10a.5.5 0 01.5.5v12a.5.5 0 01-.5.5H7a.5.5 0 01-.5-.5V6a.5.5 0 01.5-.5zM17 4H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V6a2 2 0 00-2-2zm-1 3.75H8v1.5h8v-1.5zM8 11h8v1.5H8V11zm6 3.25H8v1.5h6v-1.5z"
37864  }));
37865  /* harmony default export */ var library_page = (page);
37866  
37867  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/post.js
37868  
37869  
37870  /**
37871   * WordPress dependencies
37872   */
37873  
37874  const post = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
37875    xmlns: "http://www.w3.org/2000/svg",
37876    viewBox: "0 0 24 24"
37877  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
37878    d: "m7.3 9.7 1.4 1.4c.2-.2.3-.3.4-.5 0 0 0-.1.1-.1.3-.5.4-1.1.3-1.6L12 7 9 4 7.2 6.5c-.6-.1-1.1 0-1.6.3 0 0-.1 0-.1.1-.3.1-.4.2-.6.4l1.4 1.4L4 11v1h1l2.3-2.3zM4 20h9v-1.5H4V20zm0-5.5V16h16v-1.5H4z"
37879  }));
37880  /* harmony default export */ var library_post = (post);
37881  
37882  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/autocompleters/link.js
37883  
37884  
37885  /**
37886   * WordPress dependencies
37887   */
37888  
37889  
37890  
37891  const SHOWN_SUGGESTIONS = 10;
37892  /** @typedef {import('@wordpress/components').WPCompleter} WPCompleter */
37893  
37894  /**
37895   * Creates a suggestion list for links to posts or pages.
37896   *
37897   * @return {WPCompleter} A links completer.
37898   */
37899  
37900  function createLinkCompleter() {
37901    return {
37902      name: 'links',
37903      className: 'block-editor-autocompleters__link',
37904      triggerPrefix: '[[',
37905      options: async letters => {
37906        let options = await external_wp_apiFetch_default()({
37907          path: (0,external_wp_url_namespaceObject.addQueryArgs)('/wp/v2/search', {
37908            per_page: SHOWN_SUGGESTIONS,
37909            search: letters,
37910            type: 'post',
37911            order_by: 'menu_order'
37912          })
37913        });
37914        options = options.filter(option => option.title !== '');
37915        return options;
37916      },
37917  
37918      getOptionKeywords(item) {
37919        const expansionWords = item.title.split(/\s+/);
37920        return [...expansionWords];
37921      },
37922  
37923      getOptionLabel(item) {
37924        return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(build_module_icon, {
37925          key: "icon",
37926          icon: item.subtype === 'page' ? library_page : library_post
37927        }), item.title);
37928      },
37929  
37930      getOptionCompletion(item) {
37931        return (0,external_wp_element_namespaceObject.createElement)("a", {
37932          href: item.url
37933        }, item.title);
37934      }
37935  
37936    };
37937  }
37938  /**
37939   * Creates a suggestion list for links to posts or pages..
37940   *
37941   * @return {WPCompleter} A link completer.
37942   */
37943  
37944  
37945  /* harmony default export */ var autocompleters_link = (createLinkCompleter());
37946  
37947  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/autocomplete/index.js
37948  
37949  
37950  
37951  /**
37952   * External dependencies
37953   */
37954  
37955  /**
37956   * WordPress dependencies
37957   */
37958  
37959  
37960  
37961  
37962  
37963  /**
37964   * Internal dependencies
37965   */
37966  
37967  
37968  
37969  
37970  /**
37971   * Shared reference to an empty array for cases where it is important to avoid
37972   * returning a new array reference on every invocation.
37973   *
37974   * @type {Array}
37975   */
37976  
37977  const autocomplete_EMPTY_ARRAY = [];
37978  
37979  function useCompleters(_ref) {
37980    let {
37981      completers = autocomplete_EMPTY_ARRAY
37982    } = _ref;
37983    const {
37984      name
37985    } = useBlockEditContext();
37986    return (0,external_wp_element_namespaceObject.useMemo)(() => {
37987      let filteredCompleters = completers;
37988  
37989      if (name === (0,external_wp_blocks_namespaceObject.getDefaultBlockName)() || (0,external_wp_blocks_namespaceObject.getBlockSupport)(name, '__experimentalSlashInserter', false)) {
37990        filteredCompleters = filteredCompleters.concat([autocompleters_block, autocompleters_link]);
37991      }
37992  
37993      if ((0,external_wp_hooks_namespaceObject.hasFilter)('editor.Autocomplete.completers')) {
37994        // Provide copies so filters may directly modify them.
37995        if (filteredCompleters === completers) {
37996          filteredCompleters = filteredCompleters.map(external_lodash_namespaceObject.clone);
37997        }
37998  
37999        filteredCompleters = (0,external_wp_hooks_namespaceObject.applyFilters)('editor.Autocomplete.completers', filteredCompleters, name);
38000      }
38001  
38002      return filteredCompleters;
38003    }, [completers, name]);
38004  }
38005  
38006  function useBlockEditorAutocompleteProps(props) {
38007    return (0,external_wp_components_namespaceObject.__unstableUseAutocompleteProps)({ ...props,
38008      completers: useCompleters(props)
38009    });
38010  }
38011  /**
38012   * Wrap the default Autocomplete component with one that supports a filter hook
38013   * for customizing its list of autocompleters.
38014   *
38015   * @type {import('react').FC}
38016   */
38017  
38018  function BlockEditorAutocomplete(props) {
38019    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Autocomplete, _extends({}, props, {
38020      completers: useCompleters(props)
38021    }));
38022  }
38023  /**
38024   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/autocomplete/README.md
38025   */
38026  
38027  
38028  /* harmony default export */ var autocomplete = (BlockEditorAutocomplete);
38029  
38030  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/fullscreen.js
38031  
38032  
38033  /**
38034   * WordPress dependencies
38035   */
38036  
38037  const fullscreen = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
38038    xmlns: "http://www.w3.org/2000/svg",
38039    viewBox: "0 0 24 24"
38040  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
38041    d: "M4.2 9h1.5V5.8H9V4.2H4.2V9zm14 9.2H15v1.5h4.8V15h-1.5v3.2zM15 4.2v1.5h3.2V9h1.5V4.2H15zM5.8 15H4.2v4.8H9v-1.5H5.8V15z"
38042  }));
38043  /* harmony default export */ var library_fullscreen = (fullscreen);
38044  
38045  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-full-height-alignment-control/index.js
38046  
38047  
38048  /**
38049   * WordPress dependencies
38050   */
38051  
38052  
38053  
38054  
38055  function BlockFullHeightAlignmentControl(_ref) {
38056    let {
38057      isActive,
38058      label = (0,external_wp_i18n_namespaceObject.__)('Toggle full height'),
38059      onToggle,
38060      isDisabled
38061    } = _ref;
38062    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarButton, {
38063      isActive: isActive,
38064      icon: library_fullscreen,
38065      label: label,
38066      onClick: () => onToggle(!isActive),
38067      disabled: isDisabled
38068    });
38069  }
38070  
38071  /* harmony default export */ var block_full_height_alignment_control = (BlockFullHeightAlignmentControl);
38072  
38073  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-alignment-matrix-control/index.js
38074  
38075  
38076  /**
38077   * External dependencies
38078   */
38079  
38080  /**
38081   * WordPress dependencies
38082   */
38083  
38084  
38085  
38086  
38087  
38088  function BlockAlignmentMatrixControl(props) {
38089    const {
38090      label = (0,external_wp_i18n_namespaceObject.__)('Change matrix alignment'),
38091      onChange = external_lodash_namespaceObject.noop,
38092      value = 'center',
38093      isDisabled
38094    } = props;
38095    const icon = (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalAlignmentMatrixControl.Icon, {
38096      value: value
38097    });
38098    const className = 'block-editor-block-alignment-matrix-control';
38099    const popoverClassName = `$className}__popover`;
38100    const isAlternate = true;
38101    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Dropdown, {
38102      position: "bottom right",
38103      className: className,
38104      popoverProps: {
38105        className: popoverClassName,
38106        isAlternate
38107      },
38108      renderToggle: _ref => {
38109        let {
38110          onToggle,
38111          isOpen
38112        } = _ref;
38113  
38114        const openOnArrowDown = event => {
38115          if (!isOpen && event.keyCode === external_wp_keycodes_namespaceObject.DOWN) {
38116            event.preventDefault();
38117            onToggle();
38118          }
38119        };
38120  
38121        return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarButton, {
38122          onClick: onToggle,
38123          "aria-haspopup": "true",
38124          "aria-expanded": isOpen,
38125          onKeyDown: openOnArrowDown,
38126          label: label,
38127          icon: icon,
38128          showTooltip: true,
38129          disabled: isDisabled
38130        });
38131      },
38132      renderContent: () => (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalAlignmentMatrixControl, {
38133        hasFocusBorder: false,
38134        onChange: onChange,
38135        value: value
38136      })
38137    });
38138  }
38139  
38140  /* harmony default export */ var block_alignment_matrix_control = (BlockAlignmentMatrixControl);
38141  
38142  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/chevron-right-small.js
38143  
38144  
38145  /**
38146   * WordPress dependencies
38147   */
38148  
38149  const chevronRightSmall = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
38150    xmlns: "http://www.w3.org/2000/svg",
38151    viewBox: "0 0 24 24"
38152  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
38153    d: "M10.8622 8.04053L14.2805 12.0286L10.8622 16.0167L9.72327 15.0405L12.3049 12.0286L9.72327 9.01672L10.8622 8.04053Z"
38154  }));
38155  /* harmony default export */ var chevron_right_small = (chevronRightSmall);
38156  
38157  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-breadcrumb/index.js
38158  
38159  
38160  /**
38161   * WordPress dependencies
38162   */
38163  
38164  
38165  
38166  
38167  /**
38168   * Internal dependencies
38169   */
38170  
38171  
38172  
38173  /**
38174   * Block breadcrumb component, displaying the hierarchy of the current block selection as a breadcrumb.
38175   *
38176   * @param {Object} props               Component props.
38177   * @param {string} props.rootLabelText Translated label for the root element of the breadcrumb trail.
38178   * @return {WPElement}                 Block Breadcrumb.
38179   */
38180  
38181  function BlockBreadcrumb(_ref) {
38182    let {
38183      rootLabelText
38184    } = _ref;
38185    const {
38186      selectBlock,
38187      clearSelectedBlock
38188    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
38189    const {
38190      clientId,
38191      parents,
38192      hasSelection
38193    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
38194      const {
38195        getSelectionStart,
38196        getSelectedBlockClientId,
38197        getBlockParents
38198      } = select(store);
38199      const selectedBlockClientId = getSelectedBlockClientId();
38200      return {
38201        parents: getBlockParents(selectedBlockClientId),
38202        clientId: selectedBlockClientId,
38203        hasSelection: !!getSelectionStart().clientId
38204      };
38205    }, []);
38206  
38207    const rootLabel = rootLabelText || (0,external_wp_i18n_namespaceObject.__)('Document');
38208    /*
38209     * Disable reason: The `list` ARIA role is redundant but
38210     * Safari+VoiceOver won't announce the list otherwise.
38211     */
38212  
38213    /* eslint-disable jsx-a11y/no-redundant-roles */
38214  
38215  
38216    return (0,external_wp_element_namespaceObject.createElement)("ul", {
38217      className: "block-editor-block-breadcrumb",
38218      role: "list",
38219      "aria-label": (0,external_wp_i18n_namespaceObject.__)('Block breadcrumb')
38220    }, (0,external_wp_element_namespaceObject.createElement)("li", {
38221      className: !hasSelection ? 'block-editor-block-breadcrumb__current' : undefined,
38222      "aria-current": !hasSelection ? 'true' : undefined
38223    }, hasSelection && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
38224      className: "block-editor-block-breadcrumb__button",
38225      variant: "tertiary",
38226      onClick: clearSelectedBlock
38227    }, rootLabel), !hasSelection && rootLabel, !!clientId && (0,external_wp_element_namespaceObject.createElement)(build_module_icon, {
38228      icon: chevron_right_small,
38229      className: "block-editor-block-breadcrumb__separator"
38230    })), parents.map(parentClientId => (0,external_wp_element_namespaceObject.createElement)("li", {
38231      key: parentClientId
38232    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
38233      className: "block-editor-block-breadcrumb__button",
38234      variant: "tertiary",
38235      onClick: () => selectBlock(parentClientId)
38236    }, (0,external_wp_element_namespaceObject.createElement)(BlockTitle, {
38237      clientId: parentClientId,
38238      maximumLength: 35
38239    })), (0,external_wp_element_namespaceObject.createElement)(build_module_icon, {
38240      icon: chevron_right_small,
38241      className: "block-editor-block-breadcrumb__separator"
38242    }))), !!clientId && (0,external_wp_element_namespaceObject.createElement)("li", {
38243      className: "block-editor-block-breadcrumb__current",
38244      "aria-current": "true"
38245    }, (0,external_wp_element_namespaceObject.createElement)(BlockTitle, {
38246      clientId: clientId,
38247      maximumLength: 35
38248    })))
38249    /* eslint-enable jsx-a11y/no-redundant-roles */
38250    ;
38251  }
38252  
38253  /* harmony default export */ var block_breadcrumb = (BlockBreadcrumb);
38254  
38255  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-content-overlay/index.js
38256  
38257  
38258  
38259  /**
38260   * WordPress dependencies
38261   */
38262  
38263  
38264  /**
38265   * Internal dependencies
38266   */
38267  
38268  
38269  /**
38270   * External dependencies
38271   */
38272  
38273  
38274  function BlockContentOverlay(_ref) {
38275    let {
38276      clientId,
38277      tagName: TagName = 'div',
38278      wrapperProps,
38279      className
38280    } = _ref;
38281    const baseClassName = 'block-editor-block-content-overlay';
38282    const [isOverlayActive, setIsOverlayActive] = (0,external_wp_element_namespaceObject.useState)(true);
38283    const [isHovered, setIsHovered] = (0,external_wp_element_namespaceObject.useState)(false);
38284    const {
38285      isParentSelected,
38286      hasChildSelected,
38287      isDraggingBlocks,
38288      isParentHighlighted
38289    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
38290      const {
38291        isBlockSelected,
38292        hasSelectedInnerBlock,
38293        isDraggingBlocks: _isDraggingBlocks,
38294        isBlockHighlighted
38295      } = select(store);
38296      return {
38297        isParentSelected: isBlockSelected(clientId),
38298        hasChildSelected: hasSelectedInnerBlock(clientId, true),
38299        isDraggingBlocks: _isDraggingBlocks(),
38300        isParentHighlighted: isBlockHighlighted(clientId)
38301      };
38302    }, [clientId]);
38303    const classes = classnames_default()(baseClassName, wrapperProps === null || wrapperProps === void 0 ? void 0 : wrapperProps.className, className, {
38304      'overlay-active': isOverlayActive,
38305      'parent-highlighted': isParentHighlighted,
38306      'is-dragging-blocks': isDraggingBlocks
38307    });
38308    (0,external_wp_element_namespaceObject.useEffect)(() => {
38309      // Reenable when blocks are not in use.
38310      if (!isParentSelected && !hasChildSelected && !isOverlayActive) {
38311        setIsOverlayActive(true);
38312      } // Disable if parent selected by another means (such as list view).
38313      // We check hover to ensure the overlay click interaction is not taking place.
38314      // Trying to click the overlay will select the parent block via its 'focusin'
38315      // listener on the wrapper, so if the block is selected while hovered we will
38316      // let the mouseup disable the overlay instead.
38317  
38318  
38319      if (isParentSelected && !isHovered && isOverlayActive) {
38320        setIsOverlayActive(false);
38321      } // Ensure overlay is disabled if a child block is selected.
38322  
38323  
38324      if (hasChildSelected && isOverlayActive) {
38325        setIsOverlayActive(false);
38326      }
38327    }, [isParentSelected, hasChildSelected, isOverlayActive, isHovered]); // Disabled because the overlay div doesn't actually have a role or functionality
38328    // as far as the a11y is concerned. We're just catching the first click so that
38329    // the block can be selected without interacting with its contents.
38330  
38331    /* eslint-disable jsx-a11y/no-static-element-interactions */
38332  
38333    return (0,external_wp_element_namespaceObject.createElement)(TagName, _extends({}, wrapperProps, {
38334      className: classes,
38335      onMouseEnter: () => setIsHovered(true),
38336      onMouseLeave: () => setIsHovered(false),
38337      onMouseUp: isOverlayActive ? () => setIsOverlayActive(false) : undefined
38338    }), wrapperProps === null || wrapperProps === void 0 ? void 0 : wrapperProps.children);
38339  }
38340  /* eslint-enable jsx-a11y/no-static-element-interactions */
38341  
38342  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/color-style-selector/index.js
38343  
38344  
38345  /**
38346   * WordPress dependencies
38347   */
38348  
38349  
38350  
38351  
38352  const ColorSelectorSVGIcon = () => (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.SVG, {
38353    xmlns: "https://www.w3.org/2000/svg",
38354    viewBox: "0 0 20 20"
38355  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Path, {
38356    d: "M7.434 5l3.18 9.16H8.538l-.692-2.184H4.628l-.705 2.184H2L5.18 5h2.254zm-1.13 1.904h-.115l-1.148 3.593H7.44L6.304 6.904zM14.348 7.006c1.853 0 2.9.876 2.9 2.374v4.78h-1.79v-.914h-.114c-.362.64-1.123 1.022-2.031 1.022-1.346 0-2.292-.826-2.292-2.108 0-1.27.972-2.006 2.71-2.107l1.696-.102V9.38c0-.584-.42-.914-1.18-.914-.667 0-1.112.228-1.264.647h-1.701c.12-1.295 1.307-2.107 3.066-2.107zm1.079 4.1l-1.416.09c-.793.056-1.18.342-1.18.844 0 .52.45.837 1.091.837.857 0 1.505-.545 1.505-1.256v-.515z"
38357  }));
38358  /**
38359   * Color Selector Icon component.
38360   *
38361   * @param {Object} props           Component properties.
38362   * @param {Object} props.style     Style object.
38363   * @param {string} props.className Class name for component.
38364   *
38365   * @return {*} React Icon component.
38366   */
38367  
38368  
38369  const ColorSelectorIcon = _ref => {
38370    let {
38371      style,
38372      className
38373    } = _ref;
38374    return (0,external_wp_element_namespaceObject.createElement)("div", {
38375      className: "block-library-colors-selector__icon-container"
38376    }, (0,external_wp_element_namespaceObject.createElement)("div", {
38377      className: `$className} block-library-colors-selector__state-selection`,
38378      style: style
38379    }, (0,external_wp_element_namespaceObject.createElement)(ColorSelectorSVGIcon, null)));
38380  };
38381  /**
38382   * Renders the Colors Selector Toolbar with the icon button.
38383   *
38384   * @param {Object} props                 Component properties.
38385   * @param {Object} props.TextColor       Text color component that wraps icon.
38386   * @param {Object} props.BackgroundColor Background color component that wraps icon.
38387   *
38388   * @return {*} React toggle button component.
38389   */
38390  
38391  
38392  const renderToggleComponent = _ref2 => {
38393    let {
38394      TextColor,
38395      BackgroundColor
38396    } = _ref2;
38397    return _ref3 => {
38398      let {
38399        onToggle,
38400        isOpen
38401      } = _ref3;
38402  
38403      const openOnArrowDown = event => {
38404        if (!isOpen && event.keyCode === external_wp_keycodes_namespaceObject.DOWN) {
38405          event.preventDefault();
38406          onToggle();
38407        }
38408      };
38409  
38410      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarGroup, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarButton, {
38411        className: "components-toolbar__control block-library-colors-selector__toggle",
38412        label: (0,external_wp_i18n_namespaceObject.__)('Open Colors Selector'),
38413        onClick: onToggle,
38414        onKeyDown: openOnArrowDown,
38415        icon: (0,external_wp_element_namespaceObject.createElement)(BackgroundColor, null, (0,external_wp_element_namespaceObject.createElement)(TextColor, null, (0,external_wp_element_namespaceObject.createElement)(ColorSelectorIcon, null)))
38416      }));
38417    };
38418  };
38419  
38420  const BlockColorsStyleSelector = _ref4 => {
38421    let {
38422      children,
38423      ...other
38424    } = _ref4;
38425    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Dropdown, {
38426      position: "bottom right",
38427      className: "block-library-colors-selector",
38428      contentClassName: "block-library-colors-selector__popover",
38429      renderToggle: renderToggleComponent(other),
38430      renderContent: () => children
38431    });
38432  };
38433  
38434  /* harmony default export */ var color_style_selector = (BlockColorsStyleSelector);
38435  
38436  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/list-view.js
38437  
38438  
38439  /**
38440   * WordPress dependencies
38441   */
38442  
38443  const listView = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
38444    viewBox: "0 0 24 24",
38445    xmlns: "http://www.w3.org/2000/svg"
38446  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
38447    d: "M13.8 5.2H3v1.5h10.8V5.2zm-3.6 12v1.5H21v-1.5H10.2zm7.2-6H6.6v1.5h10.8v-1.5z"
38448  }));
38449  /* harmony default export */ var list_view = (listView);
38450  
38451  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/list-view/leaf.js
38452  
38453  
38454  
38455  /**
38456   * External dependencies
38457   */
38458  
38459  
38460  /**
38461   * WordPress dependencies
38462   */
38463  
38464  
38465  /**
38466   * Internal dependencies
38467   */
38468  
38469  
38470  const AnimatedTreeGridRow = animated(external_wp_components_namespaceObject.__experimentalTreeGridRow);
38471  function ListViewLeaf(_ref) {
38472    let {
38473      isSelected,
38474      position,
38475      level,
38476      rowCount,
38477      children,
38478      className,
38479      path,
38480      ...props
38481    } = _ref;
38482    const ref = use_moving_animation({
38483      isSelected,
38484      adjustScrolling: false,
38485      enableAnimation: true,
38486      triggerAnimationOnChange: path
38487    });
38488    return (0,external_wp_element_namespaceObject.createElement)(AnimatedTreeGridRow, _extends({
38489      ref: ref,
38490      className: classnames_default()('block-editor-list-view-leaf', className),
38491      level: level,
38492      positionInSet: position,
38493      setSize: rowCount
38494    }, props), children);
38495  }
38496  
38497  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/list-view/expander.js
38498  
38499  
38500  /**
38501   * WordPress dependencies
38502   */
38503  
38504  function ListViewExpander(_ref) {
38505    let {
38506      onClick
38507    } = _ref;
38508    return (// Keyboard events are handled by TreeGrid see: components/src/tree-grid/index.js
38509      //
38510      // The expander component is implemented as a pseudo element in the w3 example
38511      // https://www.w3.org/TR/wai-aria-practices/examples/treegrid/treegrid-1.html
38512      //
38513      // We've mimicked this by adding an icon with aria-hidden set to true to hide this from the accessibility tree.
38514      // For the current tree grid implementation, please do not try to make this a button.
38515      //
38516      // eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions
38517      (0,external_wp_element_namespaceObject.createElement)("span", {
38518        className: "block-editor-list-view__expander",
38519        onClick: event => onClick(event, {
38520          forceToggle: true
38521        }),
38522        "aria-hidden": "true"
38523      }, (0,external_wp_element_namespaceObject.createElement)(build_module_icon, {
38524        icon: chevron_right_small
38525      }))
38526    );
38527  }
38528  
38529  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/list-view/block-select-button.js
38530  
38531  
38532  /**
38533   * External dependencies
38534   */
38535  
38536  /**
38537   * WordPress dependencies
38538   */
38539  
38540  
38541  
38542  
38543  
38544  /**
38545   * Internal dependencies
38546   */
38547  
38548  
38549  
38550  
38551  
38552  
38553  
38554  function ListViewBlockSelectButton(_ref, ref) {
38555    let {
38556      className,
38557      block: {
38558        clientId
38559      },
38560      onClick,
38561      onToggleExpanded,
38562      tabIndex,
38563      onFocus,
38564      onDragStart,
38565      onDragEnd,
38566      draggable
38567    } = _ref;
38568    const blockInformation = useBlockDisplayInformation(clientId);
38569    const {
38570      isLocked
38571    } = useBlockLock(clientId); // The `href` attribute triggers the browser's native HTML drag operations.
38572    // When the link is dragged, the element's outerHTML is set in DataTransfer object as text/html.
38573    // We need to clear any HTML drag data to prevent `pasteHandler` from firing
38574    // inside the `useOnBlockDrop` hook.
38575  
38576    const onDragStartHandler = event => {
38577      event.dataTransfer.clearData();
38578      onDragStart === null || onDragStart === void 0 ? void 0 : onDragStart(event);
38579    };
38580  
38581    function onKeyDownHandler(event) {
38582      if (event.keyCode === external_wp_keycodes_namespaceObject.ENTER || event.keyCode === external_wp_keycodes_namespaceObject.SPACE) {
38583        onClick(event);
38584      }
38585    }
38586  
38587    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
38588      className: classnames_default()('block-editor-list-view-block-select-button', className),
38589      onClick: onClick,
38590      onKeyDown: onKeyDownHandler,
38591      ref: ref,
38592      tabIndex: tabIndex,
38593      onFocus: onFocus,
38594      onDragStart: onDragStartHandler,
38595      onDragEnd: onDragEnd,
38596      draggable: draggable,
38597      href: `#block-$clientId}`,
38598      "aria-hidden": true
38599    }, (0,external_wp_element_namespaceObject.createElement)(ListViewExpander, {
38600      onClick: onToggleExpanded
38601    }), (0,external_wp_element_namespaceObject.createElement)(block_icon, {
38602      icon: blockInformation === null || blockInformation === void 0 ? void 0 : blockInformation.icon,
38603      showColors: true
38604    }), (0,external_wp_element_namespaceObject.createElement)("span", {
38605      className: "block-editor-list-view-block-select-button__title"
38606    }, (0,external_wp_element_namespaceObject.createElement)(BlockTitle, {
38607      clientId: clientId,
38608      maximumLength: 35
38609    })), (blockInformation === null || blockInformation === void 0 ? void 0 : blockInformation.anchor) && (0,external_wp_element_namespaceObject.createElement)("span", {
38610      className: "block-editor-list-view-block-select-button__anchor"
38611    }, blockInformation.anchor), isLocked && (0,external_wp_element_namespaceObject.createElement)("span", {
38612      className: "block-editor-list-view-block-select-button__lock"
38613    }, (0,external_wp_element_namespaceObject.createElement)(build_module_icon, {
38614      icon: library_lock
38615    }))));
38616  }
38617  
38618  /* harmony default export */ var block_select_button = ((0,external_wp_element_namespaceObject.forwardRef)(ListViewBlockSelectButton));
38619  
38620  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/list-view/block-contents.js
38621  
38622  
38623  
38624  /**
38625   * External dependencies
38626   */
38627  
38628  /**
38629   * WordPress dependencies
38630   */
38631  
38632  
38633  
38634  /**
38635   * Internal dependencies
38636   */
38637  
38638  
38639  
38640  
38641  const ListViewBlockContents = (0,external_wp_element_namespaceObject.forwardRef)((_ref, ref) => {
38642    let {
38643      onClick,
38644      onToggleExpanded,
38645      block,
38646      isSelected,
38647      position,
38648      siblingBlockCount,
38649      level,
38650      isExpanded,
38651      selectedClientIds,
38652      ...props
38653    } = _ref;
38654    const {
38655      clientId
38656    } = block;
38657    const {
38658      blockMovingClientId,
38659      selectedBlockInBlockEditor
38660    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
38661      const {
38662        hasBlockMovingClientId,
38663        getSelectedBlockClientId
38664      } = select(store);
38665      return {
38666        blockMovingClientId: hasBlockMovingClientId(),
38667        selectedBlockInBlockEditor: getSelectedBlockClientId()
38668      };
38669    }, [clientId]);
38670    const isBlockMoveTarget = blockMovingClientId && selectedBlockInBlockEditor === clientId;
38671    const className = classnames_default()('block-editor-list-view-block-contents', {
38672      'is-dropping-before': isBlockMoveTarget
38673    }); // Only include all selected blocks if the currently clicked on block
38674    // is one of the selected blocks. This ensures that if a user attempts
38675    // to drag a block that isn't part of the selection, they're still able
38676    // to drag it and rearrange its position.
38677  
38678    const draggableClientIds = selectedClientIds.includes(clientId) ? selectedClientIds : [clientId];
38679    return (0,external_wp_element_namespaceObject.createElement)(block_draggable, {
38680      clientIds: draggableClientIds
38681    }, _ref2 => {
38682      let {
38683        draggable,
38684        onDragStart,
38685        onDragEnd
38686      } = _ref2;
38687      return (0,external_wp_element_namespaceObject.createElement)(block_select_button, _extends({
38688        ref: ref,
38689        className: className,
38690        block: block,
38691        onClick: onClick,
38692        onToggleExpanded: onToggleExpanded,
38693        isSelected: isSelected,
38694        position: position,
38695        siblingBlockCount: siblingBlockCount,
38696        level: level,
38697        draggable: draggable,
38698        onDragStart: onDragStart,
38699        onDragEnd: onDragEnd,
38700        isExpanded: isExpanded
38701      }, props));
38702    });
38703  });
38704  /* harmony default export */ var block_contents = (ListViewBlockContents);
38705  
38706  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/list-view/context.js
38707  /**
38708   * WordPress dependencies
38709   */
38710  
38711  const ListViewContext = (0,external_wp_element_namespaceObject.createContext)({
38712    __experimentalFeatures: false,
38713    __experimentalPersistentListViewFeatures: false
38714  });
38715  const useListViewContext = () => (0,external_wp_element_namespaceObject.useContext)(ListViewContext);
38716  
38717  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/list-view/utils.js
38718  /**
38719   * External dependencies
38720   */
38721  
38722  /**
38723   * WordPress dependencies
38724   */
38725  
38726  
38727  const getBlockPositionDescription = (position, siblingCount, level) => (0,external_wp_i18n_namespaceObject.sprintf)(
38728  /* translators: 1: The numerical position of the block. 2: The total number of blocks. 3. The level of nesting for the block. */
38729  (0,external_wp_i18n_namespaceObject.__)('Block %1$d of %2$d, Level %3$d'), position, siblingCount, level);
38730  /**
38731   * Returns true if the client ID occurs within the block selection or multi-selection,
38732   * or false otherwise.
38733   *
38734   * @param {string}          clientId               Block client ID.
38735   * @param {string|string[]} selectedBlockClientIds Selected block client ID, or an array of multi-selected blocks client IDs.
38736   *
38737   * @return {boolean} Whether the block is in multi-selection set.
38738   */
38739  
38740  const isClientIdSelected = (clientId, selectedBlockClientIds) => (0,external_lodash_namespaceObject.isArray)(selectedBlockClientIds) && selectedBlockClientIds.length ? selectedBlockClientIds.indexOf(clientId) !== -1 : selectedBlockClientIds === clientId;
38741  /**
38742   * From a start and end clientId of potentially different nesting levels,
38743   * return the nearest-depth ids that have a common level of depth in the
38744   * nesting hierarchy. For multiple block selection, this ensure that the
38745   * selection is always at the same nesting level, and not split across
38746   * separate levels.
38747   *
38748   * @param {string}   startId      The first id of a selection.
38749   * @param {string}   endId        The end id of a selection, usually one that has been clicked on.
38750   * @param {string[]} startParents An array of ancestor ids for the start id, in descending order.
38751   * @param {string[]} endParents   An array of ancestor ids for the end id, in descending order.
38752   * @return {Object} An object containing the start and end ids.
38753   */
38754  
38755  function getCommonDepthClientIds(startId, endId, startParents, endParents) {
38756    const startPath = [...startParents, startId];
38757    const endPath = [...endParents, endId];
38758    const depth = Math.min(startPath.length, endPath.length) - 1;
38759    const start = startPath[depth];
38760    const end = endPath[depth];
38761    return {
38762      start,
38763      end
38764    };
38765  }
38766  
38767  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/list-view/block.js
38768  
38769  
38770  /**
38771   * External dependencies
38772   */
38773  
38774  /**
38775   * WordPress dependencies
38776   */
38777  
38778  
38779  
38780  
38781  
38782  
38783  
38784  /**
38785   * Internal dependencies
38786   */
38787  
38788  
38789  
38790  
38791  
38792  
38793  
38794  
38795  
38796  
38797  
38798  function ListViewBlock(_ref) {
38799    let {
38800      block,
38801      isDragged,
38802      isSelected,
38803      isBranchSelected,
38804      selectBlock,
38805      position,
38806      level,
38807      rowCount,
38808      siblingBlockCount,
38809      showBlockMovers,
38810      path,
38811      isExpanded,
38812      selectedClientIds,
38813      preventAnnouncement
38814    } = _ref;
38815    const cellRef = (0,external_wp_element_namespaceObject.useRef)(null);
38816    const [isHovered, setIsHovered] = (0,external_wp_element_namespaceObject.useState)(false);
38817    const {
38818      clientId
38819    } = block;
38820    const isFirstSelectedBlock = isSelected && selectedClientIds[0] === clientId;
38821    const isLastSelectedBlock = isSelected && selectedClientIds[selectedClientIds.length - 1] === clientId;
38822    const {
38823      toggleBlockHighlight
38824    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
38825    const blockInformation = useBlockDisplayInformation(clientId);
38826    const {
38827      isLocked
38828    } = useBlockLock(clientId);
38829    const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(ListViewBlock);
38830    const descriptionId = `list-view-block-select-button__$instanceId}`;
38831    const blockPositionDescription = getBlockPositionDescription(position, siblingBlockCount, level);
38832  
38833    let blockAriaLabel = (0,external_wp_i18n_namespaceObject.__)('Link');
38834  
38835    if (blockInformation) {
38836      blockAriaLabel = isLocked ? (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %s: The title of the block. This string indicates a link to select the locked block.
38837      (0,external_wp_i18n_namespaceObject.__)('%s link (locked)'), blockInformation.title) : (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %s: The title of the block. This string indicates a link to select the block.
38838      (0,external_wp_i18n_namespaceObject.__)('%s link'), blockInformation.title);
38839    }
38840  
38841    const settingsAriaLabel = blockInformation ? (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %s: The title of the block.
38842    (0,external_wp_i18n_namespaceObject.__)('Options for %s block'), blockInformation.title) : (0,external_wp_i18n_namespaceObject.__)('Options');
38843    const {
38844      __experimentalFeatures: withExperimentalFeatures,
38845      __experimentalPersistentListViewFeatures: withExperimentalPersistentListViewFeatures,
38846      __experimentalHideContainerBlockActions: hideContainerBlockActions,
38847      isTreeGridMounted,
38848      expand,
38849      collapse
38850    } = useListViewContext();
38851    const hasSiblings = siblingBlockCount > 0;
38852    const hasRenderedMovers = showBlockMovers && hasSiblings;
38853    const moverCellClassName = classnames_default()('block-editor-list-view-block__mover-cell', {
38854      'is-visible': isHovered || isSelected
38855    });
38856    const listViewBlockSettingsClassName = classnames_default()('block-editor-list-view-block__menu-cell', {
38857      'is-visible': isHovered || isFirstSelectedBlock
38858    }); // If ListView has experimental features related to the Persistent List View,
38859    // only focus the selected list item on mount; otherwise the list would always
38860    // try to steal the focus from the editor canvas.
38861  
38862    (0,external_wp_element_namespaceObject.useEffect)(() => {
38863      if (withExperimentalPersistentListViewFeatures && !isTreeGridMounted && isSelected) {
38864        cellRef.current.focus();
38865      }
38866    }, []);
38867    const highlightBlock = withExperimentalPersistentListViewFeatures ? toggleBlockHighlight : () => {};
38868    const onMouseEnter = (0,external_wp_element_namespaceObject.useCallback)(() => {
38869      setIsHovered(true);
38870      highlightBlock(clientId, true);
38871    }, [clientId, setIsHovered, highlightBlock]);
38872    const onMouseLeave = (0,external_wp_element_namespaceObject.useCallback)(() => {
38873      setIsHovered(false);
38874      highlightBlock(clientId, false);
38875    }, [clientId, setIsHovered, highlightBlock]);
38876    const selectEditorBlock = (0,external_wp_element_namespaceObject.useCallback)(event => {
38877      selectBlock(event, clientId);
38878      event.preventDefault();
38879    }, [clientId, selectBlock]);
38880    const updateSelection = (0,external_wp_element_namespaceObject.useCallback)(newClientId => {
38881      selectBlock(undefined, newClientId);
38882    }, [selectBlock]);
38883    const toggleExpanded = (0,external_wp_element_namespaceObject.useCallback)(event => {
38884      // Prevent shift+click from opening link in a new window when toggling.
38885      event.preventDefault();
38886      event.stopPropagation();
38887  
38888      if (isExpanded === true) {
38889        collapse(clientId);
38890      } else if (isExpanded === false) {
38891        expand(clientId);
38892      }
38893    }, [clientId, expand, collapse, isExpanded]);
38894    const showBlockActions = withExperimentalFeatures && ( // hide actions for blocks like core/widget-areas
38895    !hideContainerBlockActions || hideContainerBlockActions && level > 1);
38896    const hideBlockActions = withExperimentalFeatures && !showBlockActions;
38897    let colSpan;
38898  
38899    if (hasRenderedMovers) {
38900      colSpan = 2;
38901    } else if (hideBlockActions) {
38902      colSpan = 3;
38903    }
38904  
38905    const classes = classnames_default()({
38906      'is-selected': isSelected,
38907      'is-first-selected': isFirstSelectedBlock,
38908      'is-last-selected': isLastSelectedBlock,
38909      'is-branch-selected': withExperimentalPersistentListViewFeatures && isBranchSelected,
38910      'is-dragging': isDragged,
38911      'has-single-cell': hideBlockActions
38912    }); // Only include all selected blocks if the currently clicked on block
38913    // is one of the selected blocks. This ensures that if a user attempts
38914    // to alter a block that isn't part of the selection, they're still able
38915    // to do so.
38916  
38917    const dropdownClientIds = selectedClientIds.includes(clientId) ? selectedClientIds : [clientId];
38918    return (0,external_wp_element_namespaceObject.createElement)(ListViewLeaf, {
38919      className: classes,
38920      onMouseEnter: onMouseEnter,
38921      onMouseLeave: onMouseLeave,
38922      onFocus: onMouseEnter,
38923      onBlur: onMouseLeave,
38924      level: level,
38925      position: position,
38926      rowCount: rowCount,
38927      path: path,
38928      id: `list-view-block-$clientId}`,
38929      "data-block": clientId,
38930      isExpanded: isExpanded,
38931      "aria-selected": !!isSelected
38932    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalTreeGridCell, {
38933      className: "block-editor-list-view-block__contents-cell",
38934      colSpan: colSpan,
38935      ref: cellRef,
38936      "aria-label": blockAriaLabel,
38937      "aria-selected": !!isSelected,
38938      "aria-expanded": isExpanded,
38939      "aria-describedby": descriptionId
38940    }, _ref2 => {
38941      let {
38942        ref,
38943        tabIndex,
38944        onFocus
38945      } = _ref2;
38946      return (0,external_wp_element_namespaceObject.createElement)("div", {
38947        className: "block-editor-list-view-block__contents-container"
38948      }, (0,external_wp_element_namespaceObject.createElement)(block_contents, {
38949        block: block,
38950        onClick: selectEditorBlock,
38951        onToggleExpanded: toggleExpanded,
38952        isSelected: isSelected,
38953        position: position,
38954        siblingBlockCount: siblingBlockCount,
38955        level: level,
38956        ref: ref,
38957        tabIndex: tabIndex,
38958        onFocus: onFocus,
38959        isExpanded: isExpanded,
38960        selectedClientIds: selectedClientIds,
38961        preventAnnouncement: preventAnnouncement
38962      }), (0,external_wp_element_namespaceObject.createElement)("div", {
38963        className: "block-editor-list-view-block-select-button__description",
38964        id: descriptionId
38965      }, blockPositionDescription));
38966    }), hasRenderedMovers && (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalTreeGridCell, {
38967      className: moverCellClassName,
38968      withoutGridItem: true
38969    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalTreeGridItem, null, _ref3 => {
38970      let {
38971        ref,
38972        tabIndex,
38973        onFocus
38974      } = _ref3;
38975      return (0,external_wp_element_namespaceObject.createElement)(BlockMoverUpButton, {
38976        orientation: "vertical",
38977        clientIds: [clientId],
38978        ref: ref,
38979        tabIndex: tabIndex,
38980        onFocus: onFocus
38981      });
38982    }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalTreeGridItem, null, _ref4 => {
38983      let {
38984        ref,
38985        tabIndex,
38986        onFocus
38987      } = _ref4;
38988      return (0,external_wp_element_namespaceObject.createElement)(BlockMoverDownButton, {
38989        orientation: "vertical",
38990        clientIds: [clientId],
38991        ref: ref,
38992        tabIndex: tabIndex,
38993        onFocus: onFocus
38994      });
38995    }))), showBlockActions && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalTreeGridCell, {
38996      className: listViewBlockSettingsClassName,
38997      "aria-selected": !!isSelected
38998    }, _ref5 => {
38999      let {
39000        ref,
39001        tabIndex,
39002        onFocus
39003      } = _ref5;
39004      return (0,external_wp_element_namespaceObject.createElement)(block_settings_dropdown, {
39005        clientIds: dropdownClientIds,
39006        icon: more_vertical,
39007        label: settingsAriaLabel,
39008        toggleProps: {
39009          ref,
39010          className: 'block-editor-list-view-block__menu',
39011          tabIndex,
39012          onFocus
39013        },
39014        disableOpenOnArrowDown: true,
39015        __experimentalSelectBlock: updateSelection
39016      });
39017    }));
39018  }
39019  
39020  /* harmony default export */ var list_view_block = ((0,external_wp_element_namespaceObject.memo)(ListViewBlock));
39021  
39022  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/list-view/branch.js
39023  
39024  
39025  /**
39026   * External dependencies
39027   */
39028  
39029  /**
39030   * WordPress dependencies
39031   */
39032  
39033  
39034  
39035  /**
39036   * Internal dependencies
39037   */
39038  
39039  
39040  
39041  
39042  /**
39043   * Given a block, returns the total number of blocks in that subtree. This is used to help determine
39044   * the list position of a block.
39045   *
39046   * When a block is collapsed, we do not count their children as part of that total. In the current drag
39047   * implementation dragged blocks and their children are not counted.
39048   *
39049   * @param {Object}  block               block tree
39050   * @param {Object}  expandedState       state that notes which branches are collapsed
39051   * @param {Array}   draggedClientIds    a list of dragged client ids
39052   * @param {boolean} isExpandedByDefault flag to determine the default fallback expanded state.
39053   * @return {number} block count
39054   */
39055  
39056  function countBlocks(block, expandedState, draggedClientIds, isExpandedByDefault) {
39057    var _expandedState$block$;
39058  
39059    const isDragged = draggedClientIds === null || draggedClientIds === void 0 ? void 0 : draggedClientIds.includes(block.clientId);
39060  
39061    if (isDragged) {
39062      return 0;
39063    }
39064  
39065    const isExpanded = (_expandedState$block$ = expandedState[block.clientId]) !== null && _expandedState$block$ !== void 0 ? _expandedState$block$ : isExpandedByDefault;
39066  
39067    if (isExpanded) {
39068      return 1 + block.innerBlocks.reduce(countReducer(expandedState, draggedClientIds, isExpandedByDefault), 0);
39069    }
39070  
39071    return 1;
39072  }
39073  
39074  const countReducer = (expandedState, draggedClientIds, isExpandedByDefault) => (count, block) => {
39075    var _expandedState$block$2;
39076  
39077    const isDragged = draggedClientIds === null || draggedClientIds === void 0 ? void 0 : draggedClientIds.includes(block.clientId);
39078  
39079    if (isDragged) {
39080      return count;
39081    }
39082  
39083    const isExpanded = (_expandedState$block$2 = expandedState[block.clientId]) !== null && _expandedState$block$2 !== void 0 ? _expandedState$block$2 : isExpandedByDefault;
39084  
39085    if (isExpanded && block.innerBlocks.length > 0) {
39086      return count + countBlocks(block, expandedState, draggedClientIds, isExpandedByDefault);
39087    }
39088  
39089    return count + 1;
39090  };
39091  
39092  function ListViewBranch(props) {
39093    const {
39094      blocks,
39095      selectBlock,
39096      showBlockMovers,
39097      showNestedBlocks,
39098      selectedClientIds,
39099      level = 1,
39100      path = '',
39101      isBranchSelected = false,
39102      listPosition = 0,
39103      fixedListWindow,
39104      expandNested
39105    } = props;
39106    const {
39107      expandedState,
39108      draggedClientIds,
39109      __experimentalPersistentListViewFeatures
39110    } = useListViewContext();
39111    const filteredBlocks = (0,external_lodash_namespaceObject.compact)(blocks);
39112    const blockCount = filteredBlocks.length;
39113    let nextPosition = listPosition;
39114    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, filteredBlocks.map((block, index) => {
39115      var _expandedState$client;
39116  
39117      const {
39118        clientId,
39119        innerBlocks
39120      } = block;
39121  
39122      if (index > 0) {
39123        nextPosition += countBlocks(filteredBlocks[index - 1], expandedState, draggedClientIds, expandNested);
39124      }
39125  
39126      const usesWindowing = __experimentalPersistentListViewFeatures;
39127      const {
39128        itemInView
39129      } = fixedListWindow;
39130      const blockInView = !usesWindowing || itemInView(nextPosition);
39131      const position = index + 1;
39132      const updatedPath = path.length > 0 ? `$path}_$position}` : `$position}`;
39133      const hasNestedBlocks = showNestedBlocks && !!innerBlocks && !!innerBlocks.length;
39134      const isExpanded = hasNestedBlocks ? (_expandedState$client = expandedState[clientId]) !== null && _expandedState$client !== void 0 ? _expandedState$client : expandNested : undefined;
39135      const isDragged = !!(draggedClientIds !== null && draggedClientIds !== void 0 && draggedClientIds.includes(clientId));
39136      const showBlock = isDragged || blockInView; // Make updates to the selected or dragged blocks synchronous,
39137      // but asynchronous for any other block.
39138  
39139      const isSelected = isClientIdSelected(clientId, selectedClientIds);
39140      const isSelectedBranch = isBranchSelected || isSelected && hasNestedBlocks;
39141      return (0,external_wp_element_namespaceObject.createElement)(external_wp_data_namespaceObject.AsyncModeProvider, {
39142        key: clientId,
39143        value: !isSelected
39144      }, showBlock && (0,external_wp_element_namespaceObject.createElement)(list_view_block, {
39145        block: block,
39146        selectBlock: selectBlock,
39147        isSelected: isSelected,
39148        isBranchSelected: isSelectedBranch,
39149        isDragged: isDragged,
39150        level: level,
39151        position: position,
39152        rowCount: blockCount,
39153        siblingBlockCount: blockCount,
39154        showBlockMovers: showBlockMovers,
39155        path: updatedPath,
39156        isExpanded: isExpanded,
39157        listPosition: nextPosition,
39158        selectedClientIds: selectedClientIds
39159      }), !showBlock && (0,external_wp_element_namespaceObject.createElement)("tr", null, (0,external_wp_element_namespaceObject.createElement)("td", {
39160        className: "block-editor-list-view-placeholder"
39161      })), hasNestedBlocks && isExpanded && !isDragged && (0,external_wp_element_namespaceObject.createElement)(ListViewBranch, {
39162        blocks: innerBlocks,
39163        selectBlock: selectBlock,
39164        showBlockMovers: showBlockMovers,
39165        showNestedBlocks: showNestedBlocks,
39166        level: level + 1,
39167        path: updatedPath,
39168        listPosition: nextPosition + 1,
39169        fixedListWindow: fixedListWindow,
39170        isBranchSelected: isSelectedBranch,
39171        selectedClientIds: selectedClientIds,
39172        expandNested: expandNested
39173      }));
39174    }));
39175  }
39176  
39177  ListViewBranch.defaultProps = {
39178    selectBlock: () => {}
39179  };
39180  /* harmony default export */ var branch = ((0,external_wp_element_namespaceObject.memo)(ListViewBranch));
39181  
39182  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/list-view/drop-indicator.js
39183  
39184  
39185  /**
39186   * WordPress dependencies
39187   */
39188  
39189  
39190  function ListViewDropIndicator(_ref) {
39191    let {
39192      listViewRef,
39193      blockDropTarget
39194    } = _ref;
39195    const {
39196      rootClientId,
39197      clientId,
39198      dropPosition
39199    } = blockDropTarget || {};
39200    const [rootBlockElement, blockElement] = (0,external_wp_element_namespaceObject.useMemo)(() => {
39201      if (!listViewRef.current) {
39202        return [];
39203      } // The rootClientId will be defined whenever dropping into inner
39204      // block lists, but is undefined when dropping at the root level.
39205  
39206  
39207      const _rootBlockElement = rootClientId ? listViewRef.current.querySelector(`[data-block="$rootClientId}"]`) : undefined; // The clientId represents the sibling block, the dragged block will
39208      // usually be inserted adjacent to it. It will be undefined when
39209      // dropping a block into an empty block list.
39210  
39211  
39212      const _blockElement = clientId ? listViewRef.current.querySelector(`[data-block="$clientId}"]`) : undefined;
39213  
39214      return [_rootBlockElement, _blockElement];
39215    }, [rootClientId, clientId]); // The targetElement is the element that the drop indicator will appear
39216    // before or after. When dropping into an empty block list, blockElement
39217    // is undefined, so the indicator will appear after the rootBlockElement.
39218  
39219    const targetElement = blockElement || rootBlockElement;
39220    const getDropIndicatorIndent = (0,external_wp_element_namespaceObject.useCallback)(() => {
39221      if (!rootBlockElement) {
39222        return 0;
39223      } // Calculate the indent using the block icon of the root block.
39224      // Using a classname selector here might be flaky and could be
39225      // improved.
39226  
39227  
39228      const targetElementRect = targetElement.getBoundingClientRect();
39229      const rootBlockIconElement = rootBlockElement.querySelector('.block-editor-block-icon');
39230      const rootBlockIconRect = rootBlockIconElement.getBoundingClientRect();
39231      return rootBlockIconRect.right - targetElementRect.left;
39232    }, [rootBlockElement, targetElement]);
39233    const style = (0,external_wp_element_namespaceObject.useMemo)(() => {
39234      if (!targetElement) {
39235        return {};
39236      }
39237  
39238      const indent = getDropIndicatorIndent();
39239      return {
39240        width: targetElement.offsetWidth - indent
39241      };
39242    }, [getDropIndicatorIndent, targetElement]);
39243    const getAnchorRect = (0,external_wp_element_namespaceObject.useCallback)(() => {
39244      if (!targetElement) {
39245        return {};
39246      }
39247  
39248      const ownerDocument = targetElement.ownerDocument;
39249      const rect = targetElement.getBoundingClientRect();
39250      const indent = getDropIndicatorIndent();
39251      const anchorRect = {
39252        left: rect.left + indent,
39253        right: rect.right,
39254        width: 0,
39255        height: rect.height,
39256        ownerDocument
39257      };
39258  
39259      if (dropPosition === 'top') {
39260        return { ...anchorRect,
39261          top: rect.top,
39262          bottom: rect.top
39263        };
39264      }
39265  
39266      if (dropPosition === 'bottom' || dropPosition === 'inside') {
39267        return { ...anchorRect,
39268          top: rect.bottom,
39269          bottom: rect.bottom
39270        };
39271      }
39272  
39273      return {};
39274    }, [targetElement, dropPosition, getDropIndicatorIndent]);
39275  
39276    if (!targetElement) {
39277      return null;
39278    }
39279  
39280    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Popover, {
39281      noArrow: true,
39282      animate: false,
39283      getAnchorRect: getAnchorRect,
39284      focusOnMount: false,
39285      className: "block-editor-list-view-drop-indicator"
39286    }, (0,external_wp_element_namespaceObject.createElement)("div", {
39287      style: style,
39288      className: "block-editor-list-view-drop-indicator__line"
39289    }));
39290  }
39291  
39292  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/list-view/use-block-selection.js
39293  /**
39294   * External dependencies
39295   */
39296  
39297  /**
39298   * WordPress dependencies
39299   */
39300  
39301  
39302  
39303  
39304  
39305  
39306  
39307  /**
39308   * Internal dependencies
39309   */
39310  
39311  
39312  
39313  function useBlockSelection() {
39314    const {
39315      clearSelectedBlock,
39316      multiSelect,
39317      selectBlock
39318    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
39319    const {
39320      getBlockName,
39321      getBlockParents,
39322      getBlockSelectionStart,
39323      getBlockSelectionEnd,
39324      getSelectedBlockClientIds,
39325      hasMultiSelection,
39326      hasSelectedBlock
39327    } = (0,external_wp_data_namespaceObject.useSelect)(store);
39328    const {
39329      getBlockType
39330    } = (0,external_wp_data_namespaceObject.useSelect)(external_wp_blocks_namespaceObject.store);
39331    const updateBlockSelection = (0,external_wp_element_namespaceObject.useCallback)(async (event, clientId, destinationClientId) => {
39332      if (!(event !== null && event !== void 0 && event.shiftKey)) {
39333        await clearSelectedBlock();
39334        selectBlock(clientId);
39335        return;
39336      } // To handle multiple block selection via the `SHIFT` key, prevent
39337      // the browser default behavior of opening the link in a new window.
39338  
39339  
39340      event.preventDefault();
39341      const isKeyPress = event.type === 'keydown' && (event.keyCode === external_wp_keycodes_namespaceObject.UP || event.keyCode === external_wp_keycodes_namespaceObject.DOWN || event.keyCode === external_wp_keycodes_namespaceObject.HOME || event.keyCode === external_wp_keycodes_namespaceObject.END); // Handle clicking on a block when no blocks are selected, and return early.
39342  
39343      if (!isKeyPress && !hasSelectedBlock() && !hasMultiSelection()) {
39344        selectBlock(clientId, null);
39345        return;
39346      }
39347  
39348      const selectedBlocks = getSelectedBlockClientIds();
39349      const clientIdWithParents = [...getBlockParents(clientId), clientId];
39350  
39351      if (isKeyPress && !selectedBlocks.some(blockId => clientIdWithParents.includes(blockId))) {
39352        // Ensure that shift-selecting blocks via the keyboard only
39353        // expands the current selection if focusing over already
39354        // selected blocks. Otherwise, clear the selection so that
39355        // a user can create a new selection entirely by keyboard.
39356        await clearSelectedBlock();
39357      }
39358  
39359      let startTarget = getBlockSelectionStart();
39360      let endTarget = clientId; // Handle keyboard behavior for selecting multiple blocks.
39361  
39362      if (isKeyPress) {
39363        if (!hasSelectedBlock() && !hasMultiSelection()) {
39364          // Set the starting point of the selection to the currently
39365          // focused block, if there are no blocks currently selected.
39366          // This ensures that as the selection is expanded or contracted,
39367          // the starting point of the selection is anchored to that block.
39368          startTarget = clientId;
39369        }
39370  
39371        if (destinationClientId) {
39372          // If the user presses UP or DOWN, we want to ensure that the block they're
39373          // moving to is the target for selection, and not the currently focused one.
39374          endTarget = destinationClientId;
39375        }
39376      }
39377  
39378      const startParents = getBlockParents(startTarget);
39379      const endParents = getBlockParents(endTarget);
39380      const {
39381        start,
39382        end
39383      } = getCommonDepthClientIds(startTarget, endTarget, startParents, endParents);
39384      await multiSelect(start, end, null); // Announce deselected block, or number of deselected blocks if
39385      // the total number of blocks deselected is greater than one.
39386  
39387      const updatedSelectedBlocks = getSelectedBlockClientIds(); // If the selection is greater than 1 and the Home or End keys
39388      // were used to generate the selection, then skip announcing the
39389      // deselected blocks.
39390  
39391      if ((event.keyCode === external_wp_keycodes_namespaceObject.HOME || event.keyCode === external_wp_keycodes_namespaceObject.END) && updatedSelectedBlocks.length > 1) {
39392        return;
39393      }
39394  
39395      const selectionDiff = (0,external_lodash_namespaceObject.difference)(selectedBlocks, updatedSelectedBlocks);
39396      let label;
39397  
39398      if (selectionDiff.length === 1) {
39399        var _getBlockType;
39400  
39401        const title = (_getBlockType = getBlockType(getBlockName(selectionDiff[0]))) === null || _getBlockType === void 0 ? void 0 : _getBlockType.title;
39402  
39403        if (title) {
39404          label = (0,external_wp_i18n_namespaceObject.sprintf)(
39405          /* translators: %s: block name */
39406          (0,external_wp_i18n_namespaceObject.__)('%s deselected.'), title);
39407        }
39408      } else if (selectionDiff.length > 1) {
39409        label = (0,external_wp_i18n_namespaceObject.sprintf)(
39410        /* translators: %s: number of deselected blocks */
39411        (0,external_wp_i18n_namespaceObject.__)('%s blocks deselected.'), selectionDiff.length);
39412      }
39413  
39414      if (label) {
39415        (0,external_wp_a11y_namespaceObject.speak)(label);
39416      }
39417    }, [clearSelectedBlock, getBlockName, getBlockType, getBlockParents, getBlockSelectionStart, getBlockSelectionEnd, getSelectedBlockClientIds, hasMultiSelection, hasSelectedBlock, multiSelect, selectBlock]);
39418    return {
39419      updateBlockSelection
39420    };
39421  }
39422  
39423  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/list-view/use-list-view-client-ids.js
39424  /**
39425   * WordPress dependencies
39426   */
39427  
39428  /**
39429   * Internal dependencies
39430   */
39431  
39432  
39433  function useListViewClientIds(blocks) {
39434    return (0,external_wp_data_namespaceObject.useSelect)(select => {
39435      const {
39436        getDraggedBlockClientIds,
39437        getSelectedBlockClientIds,
39438        __unstableGetClientIdsTree
39439      } = select(store);
39440      return {
39441        selectedClientIds: getSelectedBlockClientIds(),
39442        draggedClientIds: getDraggedBlockClientIds(),
39443        clientIdsTree: blocks ? blocks : __unstableGetClientIdsTree()
39444      };
39445    }, [blocks]);
39446  }
39447  
39448  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/list-view/use-list-view-drop-zone.js
39449  /**
39450   * WordPress dependencies
39451   */
39452  
39453  
39454  
39455  /**
39456   * Internal dependencies
39457   */
39458  
39459  
39460  
39461  
39462  /** @typedef {import('../../utils/math').WPPoint} WPPoint */
39463  
39464  /**
39465   * The type of a drag event.
39466   *
39467   * @typedef {'default'|'file'|'html'} WPDragEventType
39468   */
39469  
39470  /**
39471   * An array representing data for blocks in the DOM used by drag and drop.
39472   *
39473   * @typedef {Object} WPListViewDropZoneBlocks
39474   * @property {string}  clientId                        The client id for the block.
39475   * @property {string}  rootClientId                    The root client id for the block.
39476   * @property {number}  blockIndex                      The block's index.
39477   * @property {Element} element                         The DOM element representing the block.
39478   * @property {number}  innerBlockCount                 The number of inner blocks the block has.
39479   * @property {boolean} isDraggedBlock                  Whether the block is currently being dragged.
39480   * @property {boolean} canInsertDraggedBlocksAsSibling Whether the dragged block can be a sibling of this block.
39481   * @property {boolean} canInsertDraggedBlocksAsChild   Whether the dragged block can be a child of this block.
39482   */
39483  
39484  /**
39485   * An object containing details of a drop target.
39486   *
39487   * @typedef {Object} WPListViewDropZoneTarget
39488   * @property {string}                  blockIndex   The insertion index.
39489   * @property {string}                  rootClientId The root client id for the block.
39490   * @property {string|undefined}        clientId     The client id for the block.
39491   * @property {'top'|'bottom'|'inside'} dropPosition The position relative to the block that the user is dropping to.
39492   *                                                  'inside' refers to nesting as an inner block.
39493   */
39494  
39495  /**
39496   * Is the point contained by the rectangle.
39497   *
39498   * @param {WPPoint} point The point.
39499   * @param {DOMRect} rect  The rectangle.
39500   *
39501   * @return {boolean} True if the point is contained by the rectangle, false otherwise.
39502   */
39503  
39504  function isPointContainedByRect(point, rect) {
39505    return rect.left <= point.x && rect.right >= point.x && rect.top <= point.y && rect.bottom >= point.y;
39506  }
39507  /**
39508   * Determines whether the user positioning the dragged block to nest as an
39509   * inner block.
39510   *
39511   * Presently this is determined by whether the cursor is on the right hand side
39512   * of the block.
39513   *
39514   * @param {WPPoint} point The point representing the cursor position when dragging.
39515   * @param {DOMRect} rect  The rectangle.
39516   */
39517  
39518  
39519  function isNestingGesture(point, rect) {
39520    const blockCenterX = rect.left + rect.width / 2;
39521    return point.x > blockCenterX;
39522  } // Block navigation is always a vertical list, so only allow dropping
39523  // to the above or below a block.
39524  
39525  
39526  const ALLOWED_DROP_EDGES = ['top', 'bottom'];
39527  /**
39528   * Given blocks data and the cursor position, compute the drop target.
39529   *
39530   * @param {WPListViewDropZoneBlocks} blocksData Data about the blocks in list view.
39531   * @param {WPPoint}                  position   The point representing the cursor position when dragging.
39532   *
39533   * @return {WPListViewDropZoneTarget} An object containing data about the drop target.
39534   */
39535  
39536  function getListViewDropTarget(blocksData, position) {
39537    let candidateEdge;
39538    let candidateBlockData;
39539    let candidateDistance;
39540    let candidateRect;
39541  
39542    for (const blockData of blocksData) {
39543      if (blockData.isDraggedBlock) {
39544        continue;
39545      }
39546  
39547      const rect = blockData.element.getBoundingClientRect();
39548      const [distance, edge] = getDistanceToNearestEdge(position, rect, ALLOWED_DROP_EDGES);
39549      const isCursorWithinBlock = isPointContainedByRect(position, rect);
39550  
39551      if (candidateDistance === undefined || distance < candidateDistance || isCursorWithinBlock) {
39552        candidateDistance = distance;
39553        const index = blocksData.indexOf(blockData);
39554        const previousBlockData = blocksData[index - 1]; // If dragging near the top of a block and the preceding block
39555        // is at the same level, use the preceding block as the candidate
39556        // instead, as later it makes determining a nesting drop easier.
39557  
39558        if (edge === 'top' && previousBlockData && previousBlockData.rootClientId === blockData.rootClientId && !previousBlockData.isDraggedBlock) {
39559          candidateBlockData = previousBlockData;
39560          candidateEdge = 'bottom';
39561          candidateRect = previousBlockData.element.getBoundingClientRect();
39562        } else {
39563          candidateBlockData = blockData;
39564          candidateEdge = edge;
39565          candidateRect = rect;
39566        } // If the mouse position is within the block, break early
39567        // as the user would intend to drop either before or after
39568        // this block.
39569        //
39570        // This solves an issue where some rows in the list view
39571        // tree overlap slightly due to sub-pixel rendering.
39572  
39573  
39574        if (isCursorWithinBlock) {
39575          break;
39576        }
39577      }
39578    }
39579  
39580    if (!candidateBlockData) {
39581      return;
39582    }
39583  
39584    const isDraggingBelow = candidateEdge === 'bottom'; // If the user is dragging towards the bottom of the block check whether
39585    // they might be trying to nest the block as a child.
39586    // If the block already has inner blocks, this should always be treated
39587    // as nesting since the next block in the tree will be the first child.
39588  
39589    if (isDraggingBelow && candidateBlockData.canInsertDraggedBlocksAsChild && (candidateBlockData.innerBlockCount > 0 || isNestingGesture(position, candidateRect))) {
39590      return {
39591        rootClientId: candidateBlockData.clientId,
39592        blockIndex: 0,
39593        dropPosition: 'inside'
39594      };
39595    } // If dropping as a sibling, but block cannot be inserted in
39596    // this context, return early.
39597  
39598  
39599    if (!candidateBlockData.canInsertDraggedBlocksAsSibling) {
39600      return;
39601    }
39602  
39603    const offset = isDraggingBelow ? 1 : 0;
39604    return {
39605      rootClientId: candidateBlockData.rootClientId,
39606      clientId: candidateBlockData.clientId,
39607      blockIndex: candidateBlockData.blockIndex + offset,
39608      dropPosition: candidateEdge
39609    };
39610  }
39611  /**
39612   * A react hook for implementing a drop zone in list view.
39613   *
39614   * @return {WPListViewDropZoneTarget} The drop target.
39615   */
39616  
39617  
39618  function useListViewDropZone() {
39619    const {
39620      getBlockRootClientId,
39621      getBlockIndex,
39622      getBlockCount,
39623      getDraggedBlockClientIds,
39624      canInsertBlocks
39625    } = (0,external_wp_data_namespaceObject.useSelect)(store);
39626    const [target, setTarget] = (0,external_wp_element_namespaceObject.useState)();
39627    const {
39628      rootClientId: targetRootClientId,
39629      blockIndex: targetBlockIndex
39630    } = target || {};
39631    const onBlockDrop = useOnBlockDrop(targetRootClientId, targetBlockIndex);
39632    const draggedBlockClientIds = getDraggedBlockClientIds();
39633    const throttled = (0,external_wp_compose_namespaceObject.useThrottle)((0,external_wp_element_namespaceObject.useCallback)((event, currentTarget) => {
39634      const position = {
39635        x: event.clientX,
39636        y: event.clientY
39637      };
39638      const isBlockDrag = !!(draggedBlockClientIds !== null && draggedBlockClientIds !== void 0 && draggedBlockClientIds.length);
39639      const blockElements = Array.from(currentTarget.querySelectorAll('[data-block]'));
39640      const blocksData = blockElements.map(blockElement => {
39641        const clientId = blockElement.dataset.block;
39642        const rootClientId = getBlockRootClientId(clientId);
39643        return {
39644          clientId,
39645          rootClientId,
39646          blockIndex: getBlockIndex(clientId),
39647          element: blockElement,
39648          isDraggedBlock: isBlockDrag ? draggedBlockClientIds.includes(clientId) : false,
39649          innerBlockCount: getBlockCount(clientId),
39650          canInsertDraggedBlocksAsSibling: isBlockDrag ? canInsertBlocks(draggedBlockClientIds, rootClientId) : true,
39651          canInsertDraggedBlocksAsChild: isBlockDrag ? canInsertBlocks(draggedBlockClientIds, clientId) : true
39652        };
39653      });
39654      const newTarget = getListViewDropTarget(blocksData, position);
39655  
39656      if (newTarget) {
39657        setTarget(newTarget);
39658      }
39659    }, [draggedBlockClientIds]), 200);
39660    const ref = (0,external_wp_compose_namespaceObject.__experimentalUseDropZone)({
39661      onDrop: onBlockDrop,
39662  
39663      onDragOver(event) {
39664        // `currentTarget` is only available while the event is being
39665        // handled, so get it now and pass it to the thottled function.
39666        // https://developer.mozilla.org/en-US/docs/Web/API/Event/currentTarget
39667        throttled(event, event.currentTarget);
39668      },
39669  
39670      onDragEnd() {
39671        throttled.cancel();
39672        setTarget(null);
39673      }
39674  
39675    });
39676    return {
39677      ref,
39678      target
39679    };
39680  }
39681  
39682  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/list-view/use-list-view-expand-selected-item.js
39683  /**
39684   * WordPress dependencies
39685   */
39686  
39687  
39688  /**
39689   * Internal dependencies
39690   */
39691  
39692  
39693  function useListViewExpandSelectedItem(_ref) {
39694    let {
39695      firstSelectedBlockClientId,
39696      setExpandedState
39697    } = _ref;
39698    const [selectedTreeId, setSelectedTreeId] = (0,external_wp_element_namespaceObject.useState)(null);
39699    const {
39700      selectedBlockParentClientIds
39701    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
39702      const {
39703        getBlockParents
39704      } = select(store);
39705      return {
39706        selectedBlockParentClientIds: getBlockParents(firstSelectedBlockClientId, false)
39707      };
39708    }, [firstSelectedBlockClientId]);
39709    const parentClientIds = Array.isArray(selectedBlockParentClientIds) && selectedBlockParentClientIds.length ? selectedBlockParentClientIds : null; // Expand tree when a block is selected.
39710  
39711    (0,external_wp_element_namespaceObject.useEffect)(() => {
39712      // If the selectedTreeId is the same as the selected block,
39713      // it means that the block was selected using the block list tree.
39714      if (selectedTreeId === firstSelectedBlockClientId) {
39715        return;
39716      } // If the selected block has parents, get the top-level parent.
39717  
39718  
39719      if (parentClientIds) {
39720        // If the selected block has parents,
39721        // expand the tree branch.
39722        setExpandedState({
39723          type: 'expand',
39724          clientIds: selectedBlockParentClientIds
39725        });
39726      }
39727    }, [firstSelectedBlockClientId]);
39728    return {
39729      setSelectedTreeId
39730    };
39731  }
39732  
39733  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/list-view/index.js
39734  
39735  
39736  
39737  /**
39738   * WordPress dependencies
39739   */
39740  
39741  
39742  
39743  
39744  
39745  /**
39746   * Internal dependencies
39747   */
39748  
39749  
39750  
39751  
39752  
39753  
39754  
39755  
39756  
39757  
39758  const expanded = (state, action) => {
39759    if (Array.isArray(action.clientIds)) {
39760      return { ...state,
39761        ...action.clientIds.reduce((newState, id) => ({ ...newState,
39762          [id]: action.type === 'expand'
39763        }), {})
39764      };
39765    }
39766  
39767    return state;
39768  };
39769  
39770  const BLOCK_LIST_ITEM_HEIGHT = 36;
39771  /**
39772   * Wrap `ListViewRows` with `TreeGrid`. ListViewRows is a
39773   * recursive component (it renders itself), so this ensures TreeGrid is only
39774   * present at the very top of the navigation grid.
39775   *
39776   * @param {Object}  props                                          Components props.
39777   * @param {Array}   props.blocks                                   Custom subset of block client IDs to be used instead of the default hierarchy.
39778   * @param {boolean} props.showNestedBlocks                         Flag to enable displaying nested blocks.
39779   * @param {boolean} props.showBlockMovers                          Flag to enable block movers
39780   * @param {boolean} props.__experimentalFeatures                   Flag to enable experimental features.
39781   * @param {boolean} props.__experimentalPersistentListViewFeatures Flag to enable features for the Persistent List View experiment.
39782   * @param {boolean} props.__experimentalHideContainerBlockActions  Flag to hide actions of top level blocks (like core/widget-area)
39783   * @param {string}  props.id                                       Unique identifier for the root list element (primarily for a11y purposes).
39784   * @param {boolean} props.expandNested                             Flag to determine whether nested levels are expanded by default.
39785   * @param {Object}  ref                                            Forwarded ref
39786   */
39787  
39788  function ListView(_ref, ref) {
39789    let {
39790      blocks,
39791      __experimentalFeatures,
39792      __experimentalPersistentListViewFeatures,
39793      __experimentalHideContainerBlockActions,
39794      showNestedBlocks,
39795      showBlockMovers,
39796      id,
39797      expandNested = false,
39798      ...props
39799    } = _ref;
39800    const {
39801      clientIdsTree,
39802      draggedClientIds,
39803      selectedClientIds
39804    } = useListViewClientIds(blocks);
39805    const {
39806      visibleBlockCount
39807    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
39808      const {
39809        getGlobalBlockCount,
39810        getClientIdsOfDescendants
39811      } = select(store);
39812      const draggedBlockCount = (draggedClientIds === null || draggedClientIds === void 0 ? void 0 : draggedClientIds.length) > 0 ? getClientIdsOfDescendants(draggedClientIds).length + 1 : 0;
39813      return {
39814        visibleBlockCount: getGlobalBlockCount() - draggedBlockCount
39815      };
39816    }, [draggedClientIds]);
39817    const {
39818      updateBlockSelection
39819    } = useBlockSelection();
39820    const [expandedState, setExpandedState] = (0,external_wp_element_namespaceObject.useReducer)(expanded, {});
39821    const {
39822      ref: dropZoneRef,
39823      target: blockDropTarget
39824    } = useListViewDropZone();
39825    const elementRef = (0,external_wp_element_namespaceObject.useRef)();
39826    const treeGridRef = (0,external_wp_compose_namespaceObject.useMergeRefs)([elementRef, dropZoneRef, ref]);
39827    const isMounted = (0,external_wp_element_namespaceObject.useRef)(false);
39828    const {
39829      setSelectedTreeId
39830    } = useListViewExpandSelectedItem({
39831      firstSelectedBlockClientId: selectedClientIds[0],
39832      setExpandedState
39833    });
39834    const selectEditorBlock = (0,external_wp_element_namespaceObject.useCallback)((event, clientId) => {
39835      updateBlockSelection(event, clientId);
39836      setSelectedTreeId(clientId);
39837    }, [setSelectedTreeId, updateBlockSelection]);
39838    (0,external_wp_element_namespaceObject.useEffect)(() => {
39839      isMounted.current = true;
39840    }, []); // List View renders a fixed number of items and relies on each having a fixed item height of 36px.
39841    // If this value changes, we should also change the itemHeight value set in useFixedWindowList.
39842    // See: https://github.com/WordPress/gutenberg/pull/35230 for additional context.
39843  
39844    const [fixedListWindow] = (0,external_wp_compose_namespaceObject.__experimentalUseFixedWindowList)(elementRef, BLOCK_LIST_ITEM_HEIGHT, visibleBlockCount, {
39845      useWindowing: __experimentalPersistentListViewFeatures,
39846      windowOverscan: 40
39847    });
39848    const expand = (0,external_wp_element_namespaceObject.useCallback)(clientId => {
39849      if (!clientId) {
39850        return;
39851      }
39852  
39853      setExpandedState({
39854        type: 'expand',
39855        clientIds: [clientId]
39856      });
39857    }, [setExpandedState]);
39858    const collapse = (0,external_wp_element_namespaceObject.useCallback)(clientId => {
39859      if (!clientId) {
39860        return;
39861      }
39862  
39863      setExpandedState({
39864        type: 'collapse',
39865        clientIds: [clientId]
39866      });
39867    }, [setExpandedState]);
39868    const expandRow = (0,external_wp_element_namespaceObject.useCallback)(row => {
39869      var _row$dataset;
39870  
39871      expand(row === null || row === void 0 ? void 0 : (_row$dataset = row.dataset) === null || _row$dataset === void 0 ? void 0 : _row$dataset.block);
39872    }, [expand]);
39873    const collapseRow = (0,external_wp_element_namespaceObject.useCallback)(row => {
39874      var _row$dataset2;
39875  
39876      collapse(row === null || row === void 0 ? void 0 : (_row$dataset2 = row.dataset) === null || _row$dataset2 === void 0 ? void 0 : _row$dataset2.block);
39877    }, [collapse]);
39878    const focusRow = (0,external_wp_element_namespaceObject.useCallback)((event, startRow, endRow) => {
39879      if (event.shiftKey) {
39880        var _startRow$dataset, _endRow$dataset;
39881  
39882        updateBlockSelection(event, startRow === null || startRow === void 0 ? void 0 : (_startRow$dataset = startRow.dataset) === null || _startRow$dataset === void 0 ? void 0 : _startRow$dataset.block, endRow === null || endRow === void 0 ? void 0 : (_endRow$dataset = endRow.dataset) === null || _endRow$dataset === void 0 ? void 0 : _endRow$dataset.block);
39883      }
39884    }, [updateBlockSelection]);
39885    const contextValue = (0,external_wp_element_namespaceObject.useMemo)(() => ({
39886      __experimentalFeatures,
39887      __experimentalPersistentListViewFeatures,
39888      __experimentalHideContainerBlockActions,
39889      isTreeGridMounted: isMounted.current,
39890      draggedClientIds,
39891      expandedState,
39892      expand,
39893      collapse
39894    }), [__experimentalFeatures, __experimentalPersistentListViewFeatures, __experimentalHideContainerBlockActions, isMounted.current, draggedClientIds, expandedState, expand, collapse]);
39895    return (0,external_wp_element_namespaceObject.createElement)(external_wp_data_namespaceObject.AsyncModeProvider, {
39896      value: true
39897    }, (0,external_wp_element_namespaceObject.createElement)(ListViewDropIndicator, {
39898      listViewRef: elementRef,
39899      blockDropTarget: blockDropTarget
39900    }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalTreeGrid, {
39901      id: id,
39902      className: "block-editor-list-view-tree",
39903      "aria-label": (0,external_wp_i18n_namespaceObject.__)('Block navigation structure'),
39904      ref: treeGridRef,
39905      onCollapseRow: collapseRow,
39906      onExpandRow: expandRow,
39907      onFocusRow: focusRow
39908    }, (0,external_wp_element_namespaceObject.createElement)(ListViewContext.Provider, {
39909      value: contextValue
39910    }, (0,external_wp_element_namespaceObject.createElement)(branch, _extends({
39911      blocks: clientIdsTree,
39912      selectBlock: selectEditorBlock,
39913      showNestedBlocks: showNestedBlocks,
39914      showBlockMovers: showBlockMovers,
39915      fixedListWindow: fixedListWindow,
39916      selectedClientIds: selectedClientIds,
39917      expandNested: expandNested
39918    }, props)))));
39919  }
39920  
39921  /* harmony default export */ var components_list_view = ((0,external_wp_element_namespaceObject.forwardRef)(ListView));
39922  
39923  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-navigation/dropdown.js
39924  
39925  
39926  
39927  /**
39928   * WordPress dependencies
39929   */
39930  
39931  
39932  
39933  
39934  
39935  /**
39936   * Internal dependencies
39937   */
39938  
39939  
39940  
39941  
39942  function BlockNavigationDropdownToggle(_ref) {
39943    let {
39944      isEnabled,
39945      onToggle,
39946      isOpen,
39947      innerRef,
39948      ...props
39949    } = _ref;
39950    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, _extends({}, props, {
39951      ref: innerRef,
39952      icon: list_view,
39953      "aria-expanded": isOpen,
39954      "aria-haspopup": "true",
39955      onClick: isEnabled ? onToggle : undefined
39956      /* translators: button label text should, if possible, be under 16 characters. */
39957      ,
39958      label: (0,external_wp_i18n_namespaceObject.__)('List view'),
39959      className: "block-editor-block-navigation",
39960      "aria-disabled": !isEnabled
39961    }));
39962  }
39963  
39964  function BlockNavigationDropdown(_ref2, ref) {
39965    let {
39966      isDisabled,
39967      __experimentalFeatures,
39968      ...props
39969    } = _ref2;
39970    const hasBlocks = (0,external_wp_data_namespaceObject.useSelect)(select => !!select(store).getBlockCount(), []);
39971    const isEnabled = hasBlocks && !isDisabled;
39972    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Dropdown, {
39973      contentClassName: "block-editor-block-navigation__popover",
39974      position: "bottom right",
39975      renderToggle: _ref3 => {
39976        let {
39977          isOpen,
39978          onToggle
39979        } = _ref3;
39980        return (0,external_wp_element_namespaceObject.createElement)(BlockNavigationDropdownToggle, _extends({}, props, {
39981          innerRef: ref,
39982          isOpen: isOpen,
39983          onToggle: onToggle,
39984          isEnabled: isEnabled
39985        }));
39986      },
39987      renderContent: () => (0,external_wp_element_namespaceObject.createElement)("div", {
39988        className: "block-editor-block-navigation__container"
39989      }, (0,external_wp_element_namespaceObject.createElement)("p", {
39990        className: "block-editor-block-navigation__label"
39991      }, (0,external_wp_i18n_namespaceObject.__)('List view')), (0,external_wp_element_namespaceObject.createElement)(components_list_view, {
39992        showNestedBlocks: true,
39993        __experimentalFeatures: __experimentalFeatures
39994      }))
39995    });
39996  }
39997  
39998  /* harmony default export */ var dropdown = ((0,external_wp_element_namespaceObject.forwardRef)(BlockNavigationDropdown));
39999  
40000  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-styles/preview-panel.js
40001  
40002  
40003  /**
40004   * WordPress dependencies
40005   */
40006  
40007  /**
40008   * Internal dependencies
40009   */
40010  
40011  
40012  
40013  function BlockStylesPreviewPanel(_ref) {
40014    let {
40015      genericPreviewBlock,
40016      style,
40017      className,
40018      activeStyle
40019    } = _ref;
40020    const styleClassName = replaceActiveStyle(className, activeStyle, style);
40021    const previewBlocks = (0,external_wp_element_namespaceObject.useMemo)(() => {
40022      return { ...genericPreviewBlock,
40023        title: style.label || style.name,
40024        description: style.description,
40025        initialAttributes: { ...genericPreviewBlock.attributes,
40026          className: styleClassName + ' block-editor-block-styles__block-preview-container'
40027        }
40028      };
40029    }, [genericPreviewBlock, styleClassName]);
40030    return (0,external_wp_element_namespaceObject.createElement)(preview_panel, {
40031      item: previewBlocks,
40032      isStylePreview: true
40033    });
40034  }
40035  
40036  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-styles/index.js
40037  
40038  
40039  /**
40040   * External dependencies
40041   */
40042  
40043  
40044  /**
40045   * WordPress dependencies
40046   */
40047  
40048  
40049  
40050  
40051  
40052  /**
40053   * Internal dependencies
40054   */
40055  
40056  
40057  
40058  
40059  function BlockStylesPreviewPanelSlot(_ref) {
40060    let {
40061      scope
40062    } = _ref;
40063    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Slot, {
40064      name: `BlockStylesPreviewPanel/$scope}`
40065    });
40066  }
40067  
40068  function BlockStylesPreviewPanelFill(_ref2) {
40069    let {
40070      children,
40071      scope,
40072      ...props
40073    } = _ref2;
40074    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Fill, {
40075      name: `BlockStylesPreviewPanel/$scope}`
40076    }, (0,external_wp_element_namespaceObject.createElement)("div", props, children));
40077  } // Top position (in px) of the Block Styles container
40078  // relative to the editor pane.
40079  // The value is the equivalent of the container's right position.
40080  
40081  
40082  const DEFAULT_POSITION_TOP = 16; // Block Styles component for the Settings Sidebar.
40083  
40084  function BlockStyles(_ref3) {
40085    let {
40086      clientId,
40087      onSwitch = external_lodash_namespaceObject.noop,
40088      onHoverClassName = external_lodash_namespaceObject.noop,
40089      scope
40090    } = _ref3;
40091    const {
40092      onSelect,
40093      stylesToRender,
40094      activeStyle,
40095      genericPreviewBlock,
40096      className: previewClassName
40097    } = useStylesForBlocks({
40098      clientId,
40099      onSwitch
40100    });
40101    const [hoveredStyle, setHoveredStyle] = (0,external_wp_element_namespaceObject.useState)(null);
40102    const [containerScrollTop, setContainerScrollTop] = (0,external_wp_element_namespaceObject.useState)(0);
40103    const isMobileViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium', '<');
40104    (0,external_wp_element_namespaceObject.useLayoutEffect)(() => {
40105      const scrollContainer = document.querySelector('.interface-interface-skeleton__content');
40106      const scrollTop = (scrollContainer === null || scrollContainer === void 0 ? void 0 : scrollContainer.scrollTop) || 0;
40107      setContainerScrollTop(scrollTop + DEFAULT_POSITION_TOP);
40108    }, [hoveredStyle]);
40109  
40110    if (!stylesToRender || stylesToRender.length === 0) {
40111      return null;
40112    }
40113  
40114    const debouncedSetHoveredStyle = (0,external_lodash_namespaceObject.debounce)(setHoveredStyle, 250);
40115  
40116    const onSelectStylePreview = style => {
40117      onSelect(style);
40118      onHoverClassName(null);
40119      setHoveredStyle(null);
40120      debouncedSetHoveredStyle.cancel();
40121    };
40122  
40123    const styleItemHandler = item => {
40124      var _item$name;
40125  
40126      if (hoveredStyle === item) {
40127        debouncedSetHoveredStyle.cancel();
40128        return;
40129      }
40130  
40131      debouncedSetHoveredStyle(item);
40132      onHoverClassName((_item$name = item === null || item === void 0 ? void 0 : item.name) !== null && _item$name !== void 0 ? _item$name : null);
40133    };
40134  
40135    return (0,external_wp_element_namespaceObject.createElement)("div", {
40136      className: "block-editor-block-styles"
40137    }, (0,external_wp_element_namespaceObject.createElement)("div", {
40138      className: "block-editor-block-styles__variants"
40139    }, stylesToRender.map(style => {
40140      const buttonText = style.label || style.name;
40141      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
40142        className: classnames_default()('block-editor-block-styles__item', {
40143          'is-active': activeStyle.name === style.name
40144        }),
40145        key: style.name,
40146        variant: "secondary",
40147        label: buttonText,
40148        onMouseEnter: () => styleItemHandler(style),
40149        onFocus: () => styleItemHandler(style),
40150        onMouseLeave: () => styleItemHandler(null),
40151        onBlur: () => styleItemHandler(null),
40152        onKeyDown: event => {
40153          if (external_wp_keycodes_namespaceObject.ENTER === event.keyCode || external_wp_keycodes_namespaceObject.SPACE === event.keyCode) {
40154            event.preventDefault();
40155            onSelectStylePreview(style);
40156          }
40157        },
40158        onClick: () => onSelectStylePreview(style),
40159        role: "button",
40160        tabIndex: "0"
40161      }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalText, {
40162        as: "span",
40163        limit: 12,
40164        ellipsizeMode: "tail",
40165        className: "block-editor-block-styles__item-text",
40166        truncate: true
40167      }, buttonText));
40168    })), hoveredStyle && !isMobileViewport && (0,external_wp_element_namespaceObject.createElement)(BlockStylesPreviewPanelFill, {
40169      scope: scope,
40170      className: "block-editor-block-styles__preview-panel",
40171      style: {
40172        top: containerScrollTop
40173      },
40174      onMouseLeave: () => styleItemHandler(null)
40175    }, (0,external_wp_element_namespaceObject.createElement)(BlockStylesPreviewPanel, {
40176      activeStyle: activeStyle,
40177      className: previewClassName,
40178      genericPreviewBlock: genericPreviewBlock,
40179      style: hoveredStyle
40180    })));
40181  }
40182  
40183  BlockStyles.Slot = BlockStylesPreviewPanelSlot;
40184  /* harmony default export */ var block_styles = (BlockStyles);
40185  
40186  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/layout.js
40187  
40188  
40189  /**
40190   * WordPress dependencies
40191   */
40192  
40193  const layout = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
40194    xmlns: "http://www.w3.org/2000/svg",
40195    viewBox: "0 0 24 24"
40196  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
40197    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"
40198  }));
40199  /* harmony default export */ var library_layout = (layout);
40200  
40201  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-variation-picker/index.js
40202  
40203  
40204  /**
40205   * External dependencies
40206   */
40207  
40208  /**
40209   * WordPress dependencies
40210   */
40211  
40212  
40213  
40214  
40215  
40216  function BlockVariationPicker(_ref) {
40217    let {
40218      icon = library_layout,
40219      label = (0,external_wp_i18n_namespaceObject.__)('Choose variation'),
40220      instructions = (0,external_wp_i18n_namespaceObject.__)('Select a variation to start with.'),
40221      variations,
40222      onSelect,
40223      allowSkip
40224    } = _ref;
40225    const classes = classnames_default()('block-editor-block-variation-picker', {
40226      'has-many-variations': variations.length > 4
40227    });
40228    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Placeholder, {
40229      icon: icon,
40230      label: label,
40231      instructions: instructions,
40232      className: classes
40233    }, (0,external_wp_element_namespaceObject.createElement)("ul", {
40234      className: "block-editor-block-variation-picker__variations",
40235      role: "list",
40236      "aria-label": (0,external_wp_i18n_namespaceObject.__)('Block variations')
40237    }, variations.map(variation => (0,external_wp_element_namespaceObject.createElement)("li", {
40238      key: variation.name
40239    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
40240      variant: "secondary",
40241      icon: variation.icon,
40242      iconSize: 48,
40243      onClick: () => onSelect(variation),
40244      className: "block-editor-block-variation-picker__variation",
40245      label: variation.description || variation.title
40246    }), (0,external_wp_element_namespaceObject.createElement)("span", {
40247      className: "block-editor-block-variation-picker__variation-label",
40248      role: "presentation"
40249    }, variation.title)))), allowSkip && (0,external_wp_element_namespaceObject.createElement)("div", {
40250      className: "block-editor-block-variation-picker__skip"
40251    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
40252      variant: "link",
40253      onClick: () => onSelect()
40254    }, (0,external_wp_i18n_namespaceObject.__)('Skip'))));
40255  }
40256  
40257  /* harmony default export */ var block_variation_picker = (BlockVariationPicker);
40258  
40259  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/grid.js
40260  
40261  
40262  /**
40263   * WordPress dependencies
40264   */
40265  
40266  const grid = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
40267    xmlns: "http://www.w3.org/2000/svg",
40268    viewBox: "0 0 24 24"
40269  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
40270    d: "M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7.8 16.5H5c-.3 0-.5-.2-.5-.5v-6.2h6.8v6.7zm0-8.3H4.5V5c0-.3.2-.5.5-.5h6.2v6.7zm8.3 7.8c0 .3-.2.5-.5.5h-6.2v-6.8h6.8V19zm0-7.8h-6.8V4.5H19c.3 0 .5.2.5.5v6.2z",
40271    fillRule: "evenodd",
40272    clipRule: "evenodd"
40273  }));
40274  /* harmony default export */ var library_grid = (grid);
40275  
40276  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-pattern-setup/constants.js
40277  const VIEWMODES = {
40278    carousel: 'carousel',
40279    grid: 'grid'
40280  };
40281  
40282  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-pattern-setup/setup-toolbar.js
40283  
40284  
40285  /**
40286   * WordPress dependencies
40287   */
40288  
40289  
40290  
40291  /**
40292   * Internal dependencies
40293   */
40294  
40295  
40296  
40297  const Actions = _ref => {
40298    let {
40299      onStartBlank,
40300      onBlockPatternSelect
40301    } = _ref;
40302    return (0,external_wp_element_namespaceObject.createElement)("div", {
40303      className: "block-editor-block-pattern-setup__actions"
40304    }, onStartBlank && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
40305      onClick: onStartBlank
40306    }, (0,external_wp_i18n_namespaceObject.__)('Start blank')), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
40307      variant: "primary",
40308      onClick: onBlockPatternSelect
40309    }, (0,external_wp_i18n_namespaceObject.__)('Choose')));
40310  };
40311  
40312  const CarouselNavigation = _ref2 => {
40313    let {
40314      handlePrevious,
40315      handleNext,
40316      activeSlide,
40317      totalSlides
40318    } = _ref2;
40319    return (0,external_wp_element_namespaceObject.createElement)("div", {
40320      className: "block-editor-block-pattern-setup__navigation"
40321    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
40322      icon: chevron_left,
40323      label: (0,external_wp_i18n_namespaceObject.__)('Previous pattern'),
40324      onClick: handlePrevious,
40325      disabled: activeSlide === 0
40326    }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
40327      icon: chevron_right,
40328      label: (0,external_wp_i18n_namespaceObject.__)('Next pattern'),
40329      onClick: handleNext,
40330      disabled: activeSlide === totalSlides - 1
40331    }));
40332  };
40333  
40334  const SetupToolbar = _ref3 => {
40335    let {
40336      viewMode,
40337      setViewMode,
40338      handlePrevious,
40339      handleNext,
40340      activeSlide,
40341      totalSlides,
40342      onBlockPatternSelect,
40343      onStartBlank
40344    } = _ref3;
40345    const isCarouselView = viewMode === VIEWMODES.carousel;
40346    const displayControls = (0,external_wp_element_namespaceObject.createElement)("div", {
40347      className: "block-editor-block-pattern-setup__display-controls"
40348    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
40349      icon: stretch_full_width,
40350      label: (0,external_wp_i18n_namespaceObject.__)('Carousel view'),
40351      onClick: () => setViewMode(VIEWMODES.carousel),
40352      isPressed: isCarouselView
40353    }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
40354      icon: library_grid,
40355      label: (0,external_wp_i18n_namespaceObject.__)('Grid view'),
40356      onClick: () => setViewMode(VIEWMODES.grid),
40357      isPressed: viewMode === VIEWMODES.grid
40358    }));
40359    return (0,external_wp_element_namespaceObject.createElement)("div", {
40360      className: "block-editor-block-pattern-setup__toolbar"
40361    }, isCarouselView && (0,external_wp_element_namespaceObject.createElement)(CarouselNavigation, {
40362      handlePrevious: handlePrevious,
40363      handleNext: handleNext,
40364      activeSlide: activeSlide,
40365      totalSlides: totalSlides
40366    }), displayControls, isCarouselView && (0,external_wp_element_namespaceObject.createElement)(Actions, {
40367      onBlockPatternSelect: onBlockPatternSelect,
40368      onStartBlank: onStartBlank
40369    }));
40370  };
40371  
40372  /* harmony default export */ var setup_toolbar = (SetupToolbar);
40373  
40374  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-pattern-setup/use-patterns-setup.js
40375  /**
40376   * WordPress dependencies
40377   */
40378  
40379  /**
40380   * Internal dependencies
40381   */
40382  
40383  
40384  
40385  function usePatternsSetup(clientId, blockName, filterPatternsFn) {
40386    return (0,external_wp_data_namespaceObject.useSelect)(select => {
40387      const {
40388        getBlockRootClientId,
40389        __experimentalGetPatternsByBlockTypes,
40390        __experimentalGetAllowedPatterns
40391      } = select(store);
40392      const rootClientId = getBlockRootClientId(clientId);
40393  
40394      if (filterPatternsFn) {
40395        return __experimentalGetAllowedPatterns(rootClientId).filter(filterPatternsFn);
40396      }
40397  
40398      return __experimentalGetPatternsByBlockTypes(blockName, rootClientId);
40399    }, [clientId, blockName, filterPatternsFn]);
40400  }
40401  
40402  /* harmony default export */ var use_patterns_setup = (usePatternsSetup);
40403  
40404  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-pattern-setup/index.js
40405  
40406  
40407  
40408  /**
40409   * WordPress dependencies
40410   */
40411  
40412  
40413  
40414  
40415  
40416  
40417  /**
40418   * Internal dependencies
40419   */
40420  
40421  
40422  
40423  
40424  
40425  
40426  
40427  const SetupContent = _ref => {
40428    let {
40429      viewMode,
40430      activeSlide,
40431      patterns,
40432      onBlockPatternSelect,
40433      height
40434    } = _ref;
40435    const composite = (0,external_wp_components_namespaceObject.__unstableUseCompositeState)();
40436    const containerClass = 'block-editor-block-pattern-setup__container';
40437  
40438    if (viewMode === VIEWMODES.carousel) {
40439      const slideClass = new Map([[activeSlide, 'active-slide'], [activeSlide - 1, 'previous-slide'], [activeSlide + 1, 'next-slide']]);
40440      return (0,external_wp_element_namespaceObject.createElement)("div", {
40441        className: "block-editor-block-pattern-setup__carousel",
40442        style: {
40443          height
40444        }
40445      }, (0,external_wp_element_namespaceObject.createElement)("div", {
40446        className: containerClass
40447      }, (0,external_wp_element_namespaceObject.createElement)("ul", {
40448        className: "carousel-container"
40449      }, patterns.map((pattern, index) => (0,external_wp_element_namespaceObject.createElement)(BlockPatternSlide, {
40450        className: slideClass.get(index) || '',
40451        key: pattern.name,
40452        pattern: pattern,
40453        minHeight: height
40454      })))));
40455    }
40456  
40457    return (0,external_wp_element_namespaceObject.createElement)("div", {
40458      style: {
40459        height
40460      },
40461      className: "block-editor-block-pattern-setup__grid"
40462    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__unstableComposite, _extends({}, composite, {
40463      role: "listbox",
40464      className: containerClass,
40465      "aria-label": (0,external_wp_i18n_namespaceObject.__)('Patterns list')
40466    }), patterns.map(pattern => (0,external_wp_element_namespaceObject.createElement)(block_pattern_setup_BlockPattern, {
40467      key: pattern.name,
40468      pattern: pattern,
40469      onSelect: onBlockPatternSelect,
40470      composite: composite
40471    }))));
40472  };
40473  
40474  function block_pattern_setup_BlockPattern(_ref2) {
40475    let {
40476      pattern,
40477      onSelect,
40478      composite
40479    } = _ref2;
40480    const baseClassName = 'block-editor-block-pattern-setup-list';
40481    const {
40482      blocks,
40483      description,
40484      viewportWidth = 700
40485    } = pattern;
40486    const descriptionId = (0,external_wp_compose_namespaceObject.useInstanceId)(block_pattern_setup_BlockPattern, `$baseClassName}__item-description`);
40487    return (0,external_wp_element_namespaceObject.createElement)("div", {
40488      className: `$baseClassName}__list-item`,
40489      "aria-label": pattern.title,
40490      "aria-describedby": pattern.description ? descriptionId : undefined
40491    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__unstableCompositeItem, _extends({
40492      role: "option",
40493      as: "div"
40494    }, composite, {
40495      className: `$baseClassName}__item`,
40496      onClick: () => onSelect(blocks)
40497    }), (0,external_wp_element_namespaceObject.createElement)(block_preview, {
40498      blocks: blocks,
40499      viewportWidth: viewportWidth
40500    })), !!description && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.VisuallyHidden, {
40501      id: descriptionId
40502    }, description));
40503  }
40504  
40505  function BlockPatternSlide(_ref3) {
40506    let {
40507      className,
40508      pattern,
40509      minHeight
40510    } = _ref3;
40511    const {
40512      blocks,
40513      title,
40514      description
40515    } = pattern;
40516    const descriptionId = (0,external_wp_compose_namespaceObject.useInstanceId)(BlockPatternSlide, 'block-editor-block-pattern-setup-list__item-description');
40517    return (0,external_wp_element_namespaceObject.createElement)("li", {
40518      className: `pattern-slide $className}`,
40519      "aria-label": title,
40520      "aria-describedby": description ? descriptionId : undefined
40521    }, (0,external_wp_element_namespaceObject.createElement)(block_preview, {
40522      blocks: blocks,
40523      __experimentalMinHeight: minHeight
40524    }), !!description && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.VisuallyHidden, {
40525      id: descriptionId
40526    }, description));
40527  }
40528  
40529  const BlockPatternSetup = _ref4 => {
40530    let {
40531      clientId,
40532      blockName,
40533      filterPatternsFn,
40534      startBlankComponent,
40535      onBlockPatternSelect
40536    } = _ref4;
40537    const [viewMode, setViewMode] = (0,external_wp_element_namespaceObject.useState)(VIEWMODES.carousel);
40538    const [activeSlide, setActiveSlide] = (0,external_wp_element_namespaceObject.useState)(0);
40539    const [showBlank, setShowBlank] = (0,external_wp_element_namespaceObject.useState)(false);
40540    const {
40541      replaceBlock
40542    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
40543    const patterns = use_patterns_setup(clientId, blockName, filterPatternsFn);
40544    const [contentResizeListener, {
40545      height: contentHeight
40546    }] = (0,external_wp_compose_namespaceObject.useResizeObserver)();
40547  
40548    if (!(patterns !== null && patterns !== void 0 && patterns.length) || showBlank) {
40549      return startBlankComponent;
40550    }
40551  
40552    const onBlockPatternSelectDefault = blocks => {
40553      const clonedBlocks = blocks.map(block => (0,external_wp_blocks_namespaceObject.cloneBlock)(block));
40554      replaceBlock(clientId, clonedBlocks);
40555    };
40556  
40557    const onPatternSelectCallback = onBlockPatternSelect || onBlockPatternSelectDefault;
40558    const onStartBlank = startBlankComponent ? () => {
40559      setShowBlank(true);
40560    } : undefined;
40561    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, contentResizeListener, (0,external_wp_element_namespaceObject.createElement)("div", {
40562      className: `block-editor-block-pattern-setup view-mode-$viewMode}`
40563    }, (0,external_wp_element_namespaceObject.createElement)(SetupContent, {
40564      viewMode: viewMode,
40565      activeSlide: activeSlide,
40566      patterns: patterns,
40567      onBlockPatternSelect: onPatternSelectCallback,
40568      height: contentHeight - 2 * 60
40569    }), (0,external_wp_element_namespaceObject.createElement)(setup_toolbar, {
40570      viewMode: viewMode,
40571      setViewMode: setViewMode,
40572      activeSlide: activeSlide,
40573      totalSlides: patterns.length,
40574      handleNext: () => {
40575        setActiveSlide(active => active + 1);
40576      },
40577      handlePrevious: () => {
40578        setActiveSlide(active => active - 1);
40579      },
40580      onBlockPatternSelect: () => {
40581        onPatternSelectCallback(patterns[activeSlide].blocks);
40582      },
40583      onStartBlank: onStartBlank
40584    })));
40585  };
40586  
40587  /* harmony default export */ var block_pattern_setup = (BlockPatternSetup);
40588  
40589  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-variation-transforms/index.js
40590  
40591  
40592  /**
40593   * WordPress dependencies
40594   */
40595  
40596  
40597  
40598  
40599  
40600  
40601  /**
40602   * Internal dependencies
40603   */
40604  
40605  
40606  
40607  function VariationsButtons(_ref) {
40608    let {
40609      className,
40610      onSelectVariation,
40611      selectedValue,
40612      variations
40613    } = _ref;
40614    return (0,external_wp_element_namespaceObject.createElement)("fieldset", {
40615      className: className
40616    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.VisuallyHidden, {
40617      as: "legend"
40618    }, (0,external_wp_i18n_namespaceObject.__)('Transform to variation')), variations.map(variation => (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
40619      key: variation.name,
40620      icon: variation.icon,
40621      isPressed: selectedValue === variation.name,
40622      label: selectedValue === variation.name ? variation.title : (0,external_wp_i18n_namespaceObject.sprintf)(
40623      /* translators: %s: Name of the block variation */
40624      (0,external_wp_i18n_namespaceObject.__)('Transform to %s'), variation.title),
40625      onClick: () => onSelectVariation(variation.name),
40626      "aria-label": variation.title,
40627      showTooltip: true
40628    })));
40629  }
40630  
40631  function VariationsDropdown(_ref2) {
40632    let {
40633      className,
40634      onSelectVariation,
40635      selectedValue,
40636      variations
40637    } = _ref2;
40638    const selectOptions = variations.map(_ref3 => {
40639      let {
40640        name,
40641        title,
40642        description
40643      } = _ref3;
40644      return {
40645        value: name,
40646        label: title,
40647        info: description
40648      };
40649    });
40650    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.DropdownMenu, {
40651      className: className,
40652      label: (0,external_wp_i18n_namespaceObject.__)('Transform to variation'),
40653      text: (0,external_wp_i18n_namespaceObject.__)('Transform to variation'),
40654      popoverProps: {
40655        position: 'bottom center',
40656        className: `$className}__popover`
40657      },
40658      icon: chevron_down,
40659      toggleProps: {
40660        iconPosition: 'right'
40661      }
40662    }, () => (0,external_wp_element_namespaceObject.createElement)("div", {
40663      className: `$className}__container`
40664    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuGroup, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItemsChoice, {
40665      choices: selectOptions,
40666      value: selectedValue,
40667      onSelect: onSelectVariation
40668    }))));
40669  }
40670  
40671  function __experimentalBlockVariationTransforms(_ref4) {
40672    let {
40673      blockClientId
40674    } = _ref4;
40675    const {
40676      updateBlockAttributes
40677    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
40678    const {
40679      activeBlockVariation,
40680      variations
40681    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
40682      const {
40683        getActiveBlockVariation,
40684        getBlockVariations
40685      } = select(external_wp_blocks_namespaceObject.store);
40686      const {
40687        getBlockName,
40688        getBlockAttributes
40689      } = select(store);
40690      const name = blockClientId && getBlockName(blockClientId);
40691      return {
40692        activeBlockVariation: getActiveBlockVariation(name, getBlockAttributes(blockClientId)),
40693        variations: name && getBlockVariations(name, 'transform')
40694      };
40695    }, [blockClientId]);
40696    const selectedValue = activeBlockVariation === null || activeBlockVariation === void 0 ? void 0 : activeBlockVariation.name; // Check if each variation has a unique icon.
40697  
40698    const hasUniqueIcons = (0,external_wp_element_namespaceObject.useMemo)(() => {
40699      const variationIcons = new Set();
40700      variations.forEach(variation => {
40701        if (variation.icon) {
40702          variationIcons.add(variation.icon);
40703        }
40704      });
40705      return variationIcons.size === variations.length;
40706    }, [variations]);
40707  
40708    const onSelectVariation = variationName => {
40709      updateBlockAttributes(blockClientId, { ...variations.find(_ref5 => {
40710          let {
40711            name
40712          } = _ref5;
40713          return name === variationName;
40714        }).attributes
40715      });
40716    };
40717  
40718    const baseClass = 'block-editor-block-variation-transforms'; // Skip rendering if there are no variations
40719  
40720    if (!(variations !== null && variations !== void 0 && variations.length)) return null;
40721    const Component = hasUniqueIcons ? VariationsButtons : VariationsDropdown;
40722    return (0,external_wp_element_namespaceObject.createElement)(Component, {
40723      className: baseClass,
40724      onSelectVariation: onSelectVariation,
40725      selectedValue: selectedValue,
40726      variations: variations
40727    });
40728  }
40729  
40730  /* harmony default export */ var block_variation_transforms = (__experimentalBlockVariationTransforms);
40731  
40732  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/color-palette/with-color-context.js
40733  
40734  
40735  
40736  /**
40737   * External dependencies
40738   */
40739  
40740  /**
40741   * WordPress dependencies
40742   */
40743  
40744  
40745  /**
40746   * Internal dependencies
40747   */
40748  
40749  
40750  /* harmony default export */ var with_color_context = ((0,external_wp_compose_namespaceObject.createHigherOrderComponent)(WrappedComponent => {
40751    return props => {
40752      const colorsFeature = useSetting('color.palette');
40753      const disableCustomColorsFeature = !useSetting('color.custom');
40754      const colors = props.colors === undefined ? colorsFeature : props.colors;
40755      const disableCustomColors = props.disableCustomColors === undefined ? disableCustomColorsFeature : props.disableCustomColors;
40756      const hasColorsToChoose = !(0,external_lodash_namespaceObject.isEmpty)(colors) || !disableCustomColors;
40757      return (0,external_wp_element_namespaceObject.createElement)(WrappedComponent, _extends({}, props, {
40758        colors,
40759        disableCustomColors,
40760        hasColorsToChoose
40761      }));
40762    };
40763  }, 'withColorContext'));
40764  
40765  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/color-palette/index.js
40766  /**
40767   * WordPress dependencies
40768   */
40769  
40770  /**
40771   * Internal dependencies
40772   */
40773  
40774  
40775  /* harmony default export */ var color_palette = (with_color_context(external_wp_components_namespaceObject.ColorPalette));
40776  
40777  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/color-palette/control.js
40778  
40779  
40780  
40781  /**
40782   * Internal dependencies
40783   */
40784  
40785  function ColorPaletteControl(_ref) {
40786    let {
40787      onChange,
40788      value,
40789      ...otherProps
40790    } = _ref;
40791    return (0,external_wp_element_namespaceObject.createElement)(control, _extends({}, otherProps, {
40792      onColorChange: onChange,
40793      colorValue: value,
40794      gradients: [],
40795      disableCustomGradients: true
40796    }));
40797  }
40798  
40799  ;// CONCATENATED MODULE: external ["wp","date"]
40800  var external_wp_date_namespaceObject = window["wp"]["date"];
40801  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/date-format-picker/index.js
40802  
40803  
40804  /**
40805   * External dependencies
40806   */
40807  
40808  /**
40809   * WordPress dependencies
40810   */
40811  
40812  
40813  
40814  
40815   // So that we can illustrate the different formats in the dropdown properly,
40816  // show a date that has a day greater than 12 and a month with more than three
40817  // letters. Here we're using 2022-01-25 which is when WordPress 5.9 was
40818  // released.
40819  
40820  const EXAMPLE_DATE = new Date(2022, 0, 25);
40821  /**
40822   * The `DateFormatPicker` component renders controls that let the user choose a
40823   * _date format_. That is, how they want their dates to be formatted.
40824   *
40825   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/date-format-picker/README.md
40826   *
40827   * @param {Object}                          props
40828   * @param {string|null}                     props.format        The selected date
40829   *                                                              format. If
40830   *                                                              `null`,
40831   *                                                              _Default_ is
40832   *                                                              selected.
40833   * @param {string}                          props.defaultFormat The date format that
40834   *                                                              will be used if the
40835   *                                                              user selects
40836   *                                                              'Default'.
40837   * @param {( format: string|null ) => void} props.onChange      Called when a
40838   *                                                              selection is
40839   *                                                              made. If `null`,
40840   *                                                              _Default_ is
40841   *                                                              selected.
40842   */
40843  
40844  function DateFormatPicker(_ref) {
40845    let {
40846      format,
40847      defaultFormat,
40848      onChange
40849    } = _ref;
40850    return (0,external_wp_element_namespaceObject.createElement)("fieldset", {
40851      className: "block-editor-date-format-picker"
40852    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.VisuallyHidden, {
40853      as: "legend"
40854    }, (0,external_wp_i18n_namespaceObject.__)('Date format')), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToggleControl, {
40855      label: (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_i18n_namespaceObject.__)('Default format'), (0,external_wp_element_namespaceObject.createElement)("span", {
40856        className: "block-editor-date-format-picker__default-format-toggle-control__hint"
40857      }, (0,external_wp_date_namespaceObject.dateI18n)(defaultFormat, EXAMPLE_DATE))),
40858      checked: !format,
40859      onChange: checked => onChange(checked ? null : defaultFormat)
40860    }), format && (0,external_wp_element_namespaceObject.createElement)(NonDefaultControls, {
40861      format: format,
40862      onChange: onChange
40863    }));
40864  }
40865  
40866  function NonDefaultControls(_ref2) {
40867    var _suggestedOptions$fin;
40868  
40869    let {
40870      format,
40871      onChange
40872    } = _ref2;
40873    // Suggest a short format, medium format, long format, and a standardised
40874    // (YYYY-MM-DD) format. The short, medium, and long formats are localised as
40875    // different languages have different ways of writing these. For example, 'F
40876    // j, Y' (April 20, 2022) in American English (en_US) is 'j. F Y' (20. April
40877    // 2022) in German (de). The resultant array is de-duplicated as some
40878    // languages will use the same format string for short, medium, and long
40879    // formats.
40880    const suggestedFormats = (0,external_lodash_namespaceObject.uniq)(['Y-m-d', (0,external_wp_i18n_namespaceObject._x)('n/j/Y', 'short date format'), (0,external_wp_i18n_namespaceObject._x)('n/j/Y g:i A', 'short date format with time'), (0,external_wp_i18n_namespaceObject._x)('M j, Y', 'medium date format'), (0,external_wp_i18n_namespaceObject._x)('M j, Y g:i A', 'medium date format with time'), (0,external_wp_i18n_namespaceObject._x)('F j, Y', 'long date format')]);
40881    const suggestedOptions = suggestedFormats.map((suggestedFormat, index) => ({
40882      key: `suggested-$index}`,
40883      name: (0,external_wp_date_namespaceObject.dateI18n)(suggestedFormat, EXAMPLE_DATE),
40884      format: suggestedFormat
40885    }));
40886    const customOption = {
40887      key: 'custom',
40888      name: (0,external_wp_i18n_namespaceObject.__)('Custom'),
40889      className: 'block-editor-date-format-picker__custom-format-select-control__custom-option',
40890      __experimentalHint: (0,external_wp_i18n_namespaceObject.__)('Enter your own date format')
40891    };
40892    const [isCustom, setIsCustom] = (0,external_wp_element_namespaceObject.useState)(() => !!format && !suggestedFormats.includes(format));
40893    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.BaseControl, {
40894      className: "block-editor-date-format-picker__custom-format-select-control"
40895    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.CustomSelectControl, {
40896      label: (0,external_wp_i18n_namespaceObject.__)('Choose a format'),
40897      options: [...suggestedOptions, customOption],
40898      value: isCustom ? customOption : (_suggestedOptions$fin = suggestedOptions.find(option => option.format === format)) !== null && _suggestedOptions$fin !== void 0 ? _suggestedOptions$fin : customOption,
40899      onChange: _ref3 => {
40900        let {
40901          selectedItem
40902        } = _ref3;
40903  
40904        if (selectedItem === customOption) {
40905          setIsCustom(true);
40906        } else {
40907          setIsCustom(false);
40908          onChange(selectedItem.format);
40909        }
40910      }
40911    })), isCustom && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.TextControl, {
40912      label: (0,external_wp_i18n_namespaceObject.__)('Custom format'),
40913      hideLabelFromVision: true,
40914      help: (0,external_wp_element_namespaceObject.createInterpolateElement)((0,external_wp_i18n_namespaceObject.__)('Enter a date or time <Link>format string</Link>.'), {
40915        Link: (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ExternalLink, {
40916          href: (0,external_wp_i18n_namespaceObject.__)('https://wordpress.org/support/article/formatting-date-and-time/')
40917        })
40918      }),
40919      value: format,
40920      onChange: value => onChange(value)
40921    }));
40922  }
40923  
40924  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/colors-gradients/panel-color-gradient-settings.js
40925  
40926  
40927  
40928  /**
40929   * External dependencies
40930   */
40931  
40932  
40933  /**
40934   * WordPress dependencies
40935   */
40936  
40937  
40938  
40939  /**
40940   * Internal dependencies
40941   */
40942  
40943  
40944  
40945  
40946  
40947  
40948   // translators: first %s: The type of color or gradient (e.g. background, overlay...), second %s: the color name or value (e.g. red or #ff0000)
40949  
40950  const colorIndicatorAriaLabel = (0,external_wp_i18n_namespaceObject.__)('(%s: color %s)'); // translators: first %s: The type of color or gradient (e.g. background, overlay...), second %s: the color name or value (e.g. red or #ff0000)
40951  
40952  
40953  const gradientIndicatorAriaLabel = (0,external_wp_i18n_namespaceObject.__)('(%s: gradient %s)');
40954  
40955  const panel_color_gradient_settings_colorsAndGradientKeys = ['colors', 'disableCustomColors', 'gradients', 'disableCustomGradients'];
40956  
40957  const Indicators = _ref => {
40958    let {
40959      colors,
40960      gradients,
40961      settings
40962    } = _ref;
40963    return settings.map((_ref2, index) => {
40964      let {
40965        colorValue,
40966        gradientValue,
40967        label,
40968        colors: availableColors,
40969        gradients: availableGradients
40970      } = _ref2;
40971  
40972      if (!colorValue && !gradientValue) {
40973        return null;
40974      }
40975  
40976      let ariaLabel;
40977  
40978      if (colorValue) {
40979        const colorObject = getColorObjectByColorValue(availableColors || colors, colorValue);
40980        ariaLabel = (0,external_wp_i18n_namespaceObject.sprintf)(colorIndicatorAriaLabel, label.toLowerCase(), colorObject && colorObject.name || colorValue);
40981      } else {
40982        const gradientObject = __experimentalGetGradientObjectByGradientValue(availableGradients || gradients, colorValue);
40983  
40984        ariaLabel = (0,external_wp_i18n_namespaceObject.sprintf)(gradientIndicatorAriaLabel, label.toLowerCase(), gradientObject && gradientObject.name || gradientValue);
40985      }
40986  
40987      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ColorIndicator, {
40988        key: index,
40989        colorValue: colorValue || gradientValue,
40990        "aria-label": ariaLabel
40991      });
40992    });
40993  };
40994  
40995  const PanelColorGradientSettingsInner = _ref3 => {
40996    let {
40997      className,
40998      colors,
40999      gradients,
41000      disableCustomColors,
41001      disableCustomGradients,
41002      children,
41003      settings,
41004      title,
41005      showTitle = true,
41006      __experimentalHasMultipleOrigins,
41007      __experimentalIsRenderedInSidebar,
41008      enableAlpha,
41009      ...props
41010    } = _ref3;
41011  
41012    if ((0,external_lodash_namespaceObject.isEmpty)(colors) && (0,external_lodash_namespaceObject.isEmpty)(gradients) && disableCustomColors && disableCustomGradients && (0,external_lodash_namespaceObject.every)(settings, setting => (0,external_lodash_namespaceObject.isEmpty)(setting.colors) && (0,external_lodash_namespaceObject.isEmpty)(setting.gradients) && (setting.disableCustomColors === undefined || setting.disableCustomColors) && (setting.disableCustomGradients === undefined || setting.disableCustomGradients))) {
41013      return null;
41014    }
41015  
41016    const titleElement = (0,external_wp_element_namespaceObject.createElement)("span", {
41017      className: "block-editor-panel-color-gradient-settings__panel-title"
41018    }, title, (0,external_wp_element_namespaceObject.createElement)(Indicators, {
41019      colors: colors,
41020      gradients: gradients,
41021      settings: settings
41022    }));
41023    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.PanelBody, _extends({
41024      className: classnames_default()('block-editor-panel-color-gradient-settings', className),
41025      title: showTitle ? titleElement : undefined
41026    }, props), (0,external_wp_element_namespaceObject.createElement)(ColorGradientSettingsDropdown, {
41027      settings: settings,
41028      colors,
41029      gradients,
41030      disableCustomColors,
41031      disableCustomGradients,
41032      __experimentalHasMultipleOrigins,
41033      __experimentalIsRenderedInSidebar,
41034      enableAlpha
41035    }), !!children && (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalSpacer, {
41036      marginY: 4
41037    }), " ", children));
41038  };
41039  
41040  const PanelColorGradientSettingsSingleSelect = props => {
41041    const colorGradientSettings = useCommonSingleMultipleSelects();
41042    colorGradientSettings.colors = useSetting('color.palette');
41043    colorGradientSettings.gradients = useSetting('color.gradients');
41044    return (0,external_wp_element_namespaceObject.createElement)(PanelColorGradientSettingsInner, _extends({}, colorGradientSettings, props));
41045  };
41046  
41047  const PanelColorGradientSettingsMultipleSelect = props => {
41048    const colorGradientSettings = useMultipleOriginColorsAndGradients();
41049    return (0,external_wp_element_namespaceObject.createElement)(PanelColorGradientSettingsInner, _extends({}, colorGradientSettings, props));
41050  };
41051  
41052  const PanelColorGradientSettings = props => {
41053    if ((0,external_lodash_namespaceObject.every)(panel_color_gradient_settings_colorsAndGradientKeys, key => props.hasOwnProperty(key))) {
41054      return (0,external_wp_element_namespaceObject.createElement)(PanelColorGradientSettingsInner, props);
41055    }
41056  
41057    if (props.__experimentalHasMultipleOrigins) {
41058      return (0,external_wp_element_namespaceObject.createElement)(PanelColorGradientSettingsMultipleSelect, props);
41059    }
41060  
41061    return (0,external_wp_element_namespaceObject.createElement)(PanelColorGradientSettingsSingleSelect, props);
41062  };
41063  
41064  /* harmony default export */ var panel_color_gradient_settings = (PanelColorGradientSettings);
41065  
41066  ;// CONCATENATED MODULE: ./node_modules/react-easy-crop/node_modules/tslib/tslib.es6.js
41067  /*! *****************************************************************************

41068  Copyright (c) Microsoft Corporation.

41069  

41070  Permission to use, copy, modify, and/or distribute this software for any

41071  purpose with or without fee is hereby granted.

41072  

41073  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH

41074  REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY

41075  AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,

41076  INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM

41077  LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR

41078  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR

41079  PERFORMANCE OF THIS SOFTWARE.

41080  ***************************************************************************** */
41081  /* global Reflect, Promise */

41082  
41083  var extendStatics = function(d, b) {
41084      extendStatics = Object.setPrototypeOf ||
41085          ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
41086          function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
41087      return extendStatics(d, b);
41088  };
41089  
41090  function __extends(d, b) {
41091      extendStatics(d, b);
41092      function __() { this.constructor = d; }
41093      d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
41094  }
41095  
41096  var __assign = function() {
41097      __assign = Object.assign || function __assign(t) {
41098          for (var s, i = 1, n = arguments.length; i < n; i++) {
41099              s = arguments[i];
41100              for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
41101          }
41102          return t;
41103      }
41104      return __assign.apply(this, arguments);
41105  }
41106  
41107  function __rest(s, e) {
41108      var t = {};
41109      for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
41110          t[p] = s[p];
41111      if (s != null && typeof Object.getOwnPropertySymbols === "function")
41112          for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
41113              if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
41114                  t[p[i]] = s[p[i]];
41115          }
41116      return t;
41117  }
41118  
41119  function __decorate(decorators, target, key, desc) {
41120      var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
41121      if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
41122      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;
41123      return c > 3 && r && Object.defineProperty(target, key, r), r;
41124  }
41125  
41126  function __param(paramIndex, decorator) {
41127      return function (target, key) { decorator(target, key, paramIndex); }
41128  }
41129  
41130  function __metadata(metadataKey, metadataValue) {
41131      if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
41132  }
41133  
41134  function __awaiter(thisArg, _arguments, P, generator) {
41135      function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
41136      return new (P || (P = Promise))(function (resolve, reject) {
41137          function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
41138          function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
41139          function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41140          step((generator = generator.apply(thisArg, _arguments || [])).next());
41141      });
41142  }
41143  
41144  function __generator(thisArg, body) {
41145      var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
41146      return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
41147      function verb(n) { return function (v) { return step([n, v]); }; }
41148      function step(op) {
41149          if (f) throw new TypeError("Generator is already executing.");
41150          while (_) try {
41151              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;
41152              if (y = 0, t) op = [op[0] & 2, t.value];
41153              switch (op[0]) {
41154                  case 0: case 1: t = op; break;
41155                  case 4: _.label++; return { value: op[1], done: false };
41156                  case 5: _.label++; y = op[1]; op = [0]; continue;
41157                  case 7: op = _.ops.pop(); _.trys.pop(); continue;
41158                  default:
41159                      if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
41160                      if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
41161                      if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
41162                      if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41163                      if (t[2]) _.ops.pop();
41164                      _.trys.pop(); continue;
41165              }
41166              op = body.call(thisArg, _);
41167          } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
41168          if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
41169      }
41170  }
41171  
41172  var __createBinding = Object.create ? (function(o, m, k, k2) {
41173      if (k2 === undefined) k2 = k;
41174      Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
41175  }) : (function(o, m, k, k2) {
41176      if (k2 === undefined) k2 = k;
41177      o[k2] = m[k];
41178  });
41179  
41180  function __exportStar(m, o) {
41181      for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);
41182  }
41183  
41184  function __values(o) {
41185      var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
41186      if (m) return m.call(o);
41187      if (o && typeof o.length === "number") return {
41188          next: function () {
41189              if (o && i >= o.length) o = void 0;
41190              return { value: o && o[i++], done: !o };
41191          }
41192      };
41193      throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
41194  }
41195  
41196  function __read(o, n) {
41197      var m = typeof Symbol === "function" && o[Symbol.iterator];
41198      if (!m) return o;
41199      var i = m.call(o), r, ar = [], e;
41200      try {
41201          while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
41202      }
41203      catch (error) { e = { error: error }; }
41204      finally {
41205          try {
41206              if (r && !r.done && (m = i["return"])) m.call(i);
41207          }
41208          finally { if (e) throw e.error; }
41209      }
41210      return ar;
41211  }
41212  
41213  function __spread() {
41214      for (var ar = [], i = 0; i < arguments.length; i++)
41215          ar = ar.concat(__read(arguments[i]));
41216      return ar;
41217  }
41218  
41219  function __spreadArrays() {
41220      for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
41221      for (var r = Array(s), k = 0, i = 0; i < il; i++)
41222          for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
41223              r[k] = a[j];
41224      return r;
41225  };
41226  
41227  function __await(v) {
41228      return this instanceof __await ? (this.v = v, this) : new __await(v);
41229  }
41230  
41231  function __asyncGenerator(thisArg, _arguments, generator) {
41232      if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
41233      var g = generator.apply(thisArg, _arguments || []), i, q = [];
41234      return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
41235      function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
41236      function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
41237      function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
41238      function fulfill(value) { resume("next", value); }
41239      function reject(value) { resume("throw", value); }
41240      function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
41241  }
41242  
41243  function __asyncDelegator(o) {
41244      var i, p;
41245      return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
41246      function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
41247  }
41248  
41249  function __asyncValues(o) {
41250      if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
41251      var m = o[Symbol.asyncIterator], i;
41252      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);
41253      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); }); }; }
41254      function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
41255  }
41256  
41257  function __makeTemplateObject(cooked, raw) {
41258      if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
41259      return cooked;
41260  };
41261  
41262  var __setModuleDefault = Object.create ? (function(o, v) {
41263      Object.defineProperty(o, "default", { enumerable: true, value: v });
41264  }) : function(o, v) {
41265      o["default"] = v;
41266  };
41267  
41268  function __importStar(mod) {
41269      if (mod && mod.__esModule) return mod;
41270      var result = {};
41271      if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
41272      __setModuleDefault(result, mod);
41273      return result;
41274  }
41275  
41276  function __importDefault(mod) {
41277      return (mod && mod.__esModule) ? mod : { default: mod };
41278  }
41279  
41280  function __classPrivateFieldGet(receiver, privateMap) {
41281      if (!privateMap.has(receiver)) {
41282          throw new TypeError("attempted to get private field on non-instance");
41283      }
41284      return privateMap.get(receiver);
41285  }
41286  
41287  function __classPrivateFieldSet(receiver, privateMap, value) {
41288      if (!privateMap.has(receiver)) {
41289          throw new TypeError("attempted to set private field on non-instance");
41290      }
41291      privateMap.set(receiver, value);
41292      return value;
41293  }
41294  
41295  // EXTERNAL MODULE: ./node_modules/normalize-wheel/index.js
41296  var normalize_wheel = __webpack_require__(7970);
41297  var normalize_wheel_default = /*#__PURE__*/__webpack_require__.n(normalize_wheel);
41298  ;// CONCATENATED MODULE: ./node_modules/react-easy-crop/index.module.js
41299  
41300  
41301  
41302  
41303  /**

41304   * Compute the dimension of the crop area based on media size,

41305   * aspect ratio and optionally rotation

41306   */
41307  
41308  function getCropSize(mediaWidth, mediaHeight, containerWidth, containerHeight, aspect, rotation) {
41309    if (rotation === void 0) {
41310      rotation = 0;
41311    }
41312  
41313    var _a = translateSize(mediaWidth, mediaHeight, rotation),
41314        width = _a.width,
41315        height = _a.height;
41316  
41317    var fittingWidth = Math.min(width, containerWidth);
41318    var fittingHeight = Math.min(height, containerHeight);
41319  
41320    if (fittingWidth > fittingHeight * aspect) {
41321      return {
41322        width: fittingHeight * aspect,
41323        height: fittingHeight
41324      };
41325    }
41326  
41327    return {
41328      width: fittingWidth,
41329      height: fittingWidth / aspect
41330    };
41331  }
41332  /**

41333   * Ensure a new media position stays in the crop area.

41334   */
41335  
41336  function restrictPosition(position, mediaSize, cropSize, zoom, rotation) {
41337    if (rotation === void 0) {
41338      rotation = 0;
41339    }
41340  
41341    var _a = translateSize(mediaSize.width, mediaSize.height, rotation),
41342        width = _a.width,
41343        height = _a.height;
41344  
41345    return {
41346      x: restrictPositionCoord(position.x, width, cropSize.width, zoom),
41347      y: restrictPositionCoord(position.y, height, cropSize.height, zoom)
41348    };
41349  }
41350  
41351  function restrictPositionCoord(position, mediaSize, cropSize, zoom) {
41352    var maxPosition = mediaSize * zoom / 2 - cropSize / 2;
41353    return Math.min(maxPosition, Math.max(position, -maxPosition));
41354  }
41355  
41356  function getDistanceBetweenPoints(pointA, pointB) {
41357    return Math.sqrt(Math.pow(pointA.y - pointB.y, 2) + Math.pow(pointA.x - pointB.x, 2));
41358  }
41359  function getRotationBetweenPoints(pointA, pointB) {
41360    return Math.atan2(pointB.y - pointA.y, pointB.x - pointA.x) * 180 / Math.PI;
41361  }
41362  /**

41363   * Compute the output cropped area of the media in percentages and pixels.

41364   * x/y are the top-left coordinates on the src media

41365   */
41366  
41367  function computeCroppedArea(crop, mediaSize, cropSize, aspect, zoom, rotation, restrictPosition) {
41368    if (rotation === void 0) {
41369      rotation = 0;
41370    }
41371  
41372    if (restrictPosition === void 0) {
41373      restrictPosition = true;
41374    } // if the media is rotated by the user, we cannot limit the position anymore
41375    // as it might need to be negative.
41376  
41377  
41378    var limitAreaFn = restrictPosition && rotation === 0 ? limitArea : noOp;
41379    var croppedAreaPercentages = {
41380      x: limitAreaFn(100, ((mediaSize.width - cropSize.width / zoom) / 2 - crop.x / zoom) / mediaSize.width * 100),
41381      y: limitAreaFn(100, ((mediaSize.height - cropSize.height / zoom) / 2 - crop.y / zoom) / mediaSize.height * 100),
41382      width: limitAreaFn(100, cropSize.width / mediaSize.width * 100 / zoom),
41383      height: limitAreaFn(100, cropSize.height / mediaSize.height * 100 / zoom)
41384    }; // we compute the pixels size naively
41385  
41386    var widthInPixels = Math.round(limitAreaFn(mediaSize.naturalWidth, croppedAreaPercentages.width * mediaSize.naturalWidth / 100));
41387    var heightInPixels = Math.round(limitAreaFn(mediaSize.naturalHeight, croppedAreaPercentages.height * mediaSize.naturalHeight / 100));
41388    var isImgWiderThanHigh = mediaSize.naturalWidth >= mediaSize.naturalHeight * aspect; // then we ensure the width and height exactly match the aspect (to avoid rounding approximations)
41389    // if the media is wider than high, when zoom is 0, the crop height will be equals to iamge height
41390    // thus we want to compute the width from the height and aspect for accuracy.
41391    // Otherwise, we compute the height from width and aspect.
41392  
41393    var sizePixels = isImgWiderThanHigh ? {
41394      width: Math.round(heightInPixels * aspect),
41395      height: heightInPixels
41396    } : {
41397      width: widthInPixels,
41398      height: Math.round(widthInPixels / aspect)
41399    };
41400  
41401    var croppedAreaPixels = __assign(__assign({}, sizePixels), {
41402      x: Math.round(limitAreaFn(mediaSize.naturalWidth - sizePixels.width, croppedAreaPercentages.x * mediaSize.naturalWidth / 100)),
41403      y: Math.round(limitAreaFn(mediaSize.naturalHeight - sizePixels.height, croppedAreaPercentages.y * mediaSize.naturalHeight / 100))
41404    });
41405  
41406    return {
41407      croppedAreaPercentages: croppedAreaPercentages,
41408      croppedAreaPixels: croppedAreaPixels
41409    };
41410  }
41411  /**

41412   * Ensure the returned value is between 0 and max

41413   */
41414  
41415  function limitArea(max, value) {
41416    return Math.min(max, Math.max(0, value));
41417  }
41418  
41419  function noOp(_max, value) {
41420    return value;
41421  }
41422  /**

41423   * Compute the crop and zoom from the croppedAreaPixels

41424   */
41425  
41426  
41427  function getZoomFromCroppedAreaPixels(croppedAreaPixels, mediaSize, cropSize) {
41428    var mediaZoom = mediaSize.width / mediaSize.naturalWidth;
41429  
41430    if (cropSize) {
41431      var isHeightMaxSize_1 = cropSize.height > cropSize.width;
41432      return isHeightMaxSize_1 ? cropSize.height / mediaZoom / croppedAreaPixels.height : cropSize.width / mediaZoom / croppedAreaPixels.width;
41433    }
41434  
41435    var aspect = croppedAreaPixels.width / croppedAreaPixels.height;
41436    var isHeightMaxSize = mediaSize.naturalWidth >= mediaSize.naturalHeight * aspect;
41437    return isHeightMaxSize ? mediaSize.naturalHeight / croppedAreaPixels.height : mediaSize.naturalWidth / croppedAreaPixels.width;
41438  }
41439  /**

41440   * Compute the crop and zoom from the croppedAreaPixels

41441   */
41442  
41443  
41444  function getInitialCropFromCroppedAreaPixels(croppedAreaPixels, mediaSize, cropSize) {
41445    var mediaZoom = mediaSize.width / mediaSize.naturalWidth;
41446    var zoom = getZoomFromCroppedAreaPixels(croppedAreaPixels, mediaSize, cropSize);
41447    var cropZoom = mediaZoom * zoom;
41448    var crop = {
41449      x: ((mediaSize.naturalWidth - croppedAreaPixels.width) / 2 - croppedAreaPixels.x) * cropZoom,
41450      y: ((mediaSize.naturalHeight - croppedAreaPixels.height) / 2 - croppedAreaPixels.y) * cropZoom
41451    };
41452    return {
41453      crop: crop,
41454      zoom: zoom
41455    };
41456  }
41457  /**

41458   * Return the point that is the center of point a and b

41459   */
41460  
41461  function getCenter(a, b) {
41462    return {
41463      x: (b.x + a.x) / 2,
41464      y: (b.y + a.y) / 2
41465    };
41466  }
41467  /**

41468   *

41469   * Returns an x,y point once rotated around xMid,yMid

41470   */
41471  
41472  function rotateAroundMidPoint(x, y, xMid, yMid, degrees) {
41473    var cos = Math.cos;
41474    var sin = Math.sin;
41475    var radian = degrees * Math.PI / 180; // Convert to radians
41476    // Subtract midpoints, so that midpoint is translated to origin
41477    // and add it in the end again
41478  
41479    var xr = (x - xMid) * cos(radian) - (y - yMid) * sin(radian) + xMid;
41480    var yr = (x - xMid) * sin(radian) + (y - yMid) * cos(radian) + yMid;
41481    return [xr, yr];
41482  }
41483  /**

41484   * Returns the new bounding area of a rotated rectangle.

41485   */
41486  
41487  function translateSize(width, height, rotation) {
41488    var centerX = width / 2;
41489    var centerY = height / 2;
41490    var outerBounds = [rotateAroundMidPoint(0, 0, centerX, centerY, rotation), rotateAroundMidPoint(width, 0, centerX, centerY, rotation), rotateAroundMidPoint(width, height, centerX, centerY, rotation), rotateAroundMidPoint(0, height, centerX, centerY, rotation)];
41491    var minX = Math.min.apply(Math, outerBounds.map(function (p) {
41492      return p[0];
41493    }));
41494    var maxX = Math.max.apply(Math, outerBounds.map(function (p) {
41495      return p[0];
41496    }));
41497    var minY = Math.min.apply(Math, outerBounds.map(function (p) {
41498      return p[1];
41499    }));
41500    var maxY = Math.max.apply(Math, outerBounds.map(function (p) {
41501      return p[1];
41502    }));
41503    return {
41504      width: maxX - minX,
41505      height: maxY - minY
41506    };
41507  }
41508  /**

41509   * Combine multiple class names into a single string.

41510   */
41511  
41512  function classNames() {
41513    var args = [];
41514  
41515    for (var _i = 0; _i < arguments.length; _i++) {
41516      args[_i] = arguments[_i];
41517    }
41518  
41519    return args.filter(function (value) {
41520      if (typeof value === 'string' && value.length > 0) {
41521        return true;
41522      }
41523  
41524      return false;
41525    }).join(' ').trim();
41526  }
41527  
41528  var css_248z = ".reactEasyCrop_Container {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  overflow: hidden;\n  user-select: none;\n  touch-action: none;\n  cursor: move;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}\n\n.reactEasyCrop_Image,\n.reactEasyCrop_Video {\n  will-change: transform; /* this improves performances and prevent painting issues on iOS Chrome */\n}\n\n.reactEasyCrop_Contain {\n  max-width: 100%;\n  max-height: 100%;\n  margin: auto;\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  right: 0;\n}\n.reactEasyCrop_Cover_Horizontal {\n  width: 100%;\n  height: auto;\n}\n.reactEasyCrop_Cover_Vertical {\n  width: auto;\n  height: 100%;\n}\n\n.reactEasyCrop_CropArea {\n  position: absolute;\n  left: 50%;\n  top: 50%;\n  transform: translate(-50%, -50%);\n  border: 1px solid rgba(255, 255, 255, 0.5);\n  box-sizing: border-box;\n  box-shadow: 0 0 0 9999em;\n  color: rgba(0, 0, 0, 0.5);\n  overflow: hidden;\n}\n\n.reactEasyCrop_CropAreaRound {\n  border-radius: 50%;\n}\n\n.reactEasyCrop_CropAreaGrid::before {\n  content: ' ';\n  box-sizing: border-box;\n  position: absolute;\n  border: 1px solid rgba(255, 255, 255, 0.5);\n  top: 0;\n  bottom: 0;\n  left: 33.33%;\n  right: 33.33%;\n  border-top: 0;\n  border-bottom: 0;\n}\n\n.reactEasyCrop_CropAreaGrid::after {\n  content: ' ';\n  box-sizing: border-box;\n  position: absolute;\n  border: 1px solid rgba(255, 255, 255, 0.5);\n  top: 33.33%;\n  bottom: 33.33%;\n  left: 0;\n  right: 0;\n  border-left: 0;\n  border-right: 0;\n}\n";
41529  
41530  var MIN_ZOOM = 1;
41531  var MAX_ZOOM = 3;
41532  
41533  var Cropper =
41534  /** @class */
41535  function (_super) {
41536    __extends(Cropper, _super);
41537  
41538    function Cropper() {
41539      var _this = _super !== null && _super.apply(this, arguments) || this;
41540  
41541      _this.imageRef = null;
41542      _this.videoRef = null;
41543      _this.containerRef = null;
41544      _this.styleRef = null;
41545      _this.containerRect = null;
41546      _this.mediaSize = {
41547        width: 0,
41548        height: 0,
41549        naturalWidth: 0,
41550        naturalHeight: 0
41551      };
41552      _this.dragStartPosition = {
41553        x: 0,
41554        y: 0
41555      };
41556      _this.dragStartCrop = {
41557        x: 0,
41558        y: 0
41559      };
41560      _this.lastPinchDistance = 0;
41561      _this.lastPinchRotation = 0;
41562      _this.rafDragTimeout = null;
41563      _this.rafPinchTimeout = null;
41564      _this.wheelTimer = null;
41565      _this.state = {
41566        cropSize: null,
41567        hasWheelJustStarted: false
41568      }; // this is to prevent Safari on iOS >= 10 to zoom the page
41569  
41570      _this.preventZoomSafari = function (e) {
41571        return e.preventDefault();
41572      };
41573  
41574      _this.cleanEvents = function () {
41575        document.removeEventListener('mousemove', _this.onMouseMove);
41576        document.removeEventListener('mouseup', _this.onDragStopped);
41577        document.removeEventListener('touchmove', _this.onTouchMove);
41578        document.removeEventListener('touchend', _this.onDragStopped);
41579      };
41580  
41581      _this.clearScrollEvent = function () {
41582        if (_this.containerRef) _this.containerRef.removeEventListener('wheel', _this.onWheel);
41583  
41584        if (_this.wheelTimer) {
41585          clearTimeout(_this.wheelTimer);
41586        }
41587      };
41588  
41589      _this.onMediaLoad = function () {
41590        _this.computeSizes();
41591  
41592        _this.emitCropData();
41593  
41594        _this.setInitialCrop();
41595  
41596        if (_this.props.onMediaLoaded) {
41597          _this.props.onMediaLoaded(_this.mediaSize);
41598        }
41599      };
41600  
41601      _this.setInitialCrop = function () {
41602        var _a = _this.props,
41603            initialCroppedAreaPixels = _a.initialCroppedAreaPixels,
41604            cropSize = _a.cropSize;
41605  
41606        if (!initialCroppedAreaPixels) {
41607          return;
41608        }
41609  
41610        var _b = getInitialCropFromCroppedAreaPixels(initialCroppedAreaPixels, _this.mediaSize, cropSize),
41611            crop = _b.crop,
41612            zoom = _b.zoom;
41613  
41614        _this.props.onCropChange(crop);
41615  
41616        _this.props.onZoomChange && _this.props.onZoomChange(zoom);
41617      };
41618  
41619      _this.computeSizes = function () {
41620        var _a, _b, _c, _d, _e, _f;
41621  
41622        var mediaRef = _this.imageRef || _this.videoRef;
41623  
41624        if (mediaRef && _this.containerRef) {
41625          _this.containerRect = _this.containerRef.getBoundingClientRect();
41626          _this.mediaSize = {
41627            width: mediaRef.offsetWidth,
41628            height: mediaRef.offsetHeight,
41629            naturalWidth: ((_a = _this.imageRef) === null || _a === void 0 ? void 0 : _a.naturalWidth) || ((_b = _this.videoRef) === null || _b === void 0 ? void 0 : _b.videoWidth) || 0,
41630            naturalHeight: ((_c = _this.imageRef) === null || _c === void 0 ? void 0 : _c.naturalHeight) || ((_d = _this.videoRef) === null || _d === void 0 ? void 0 : _d.videoHeight) || 0
41631          };
41632          var cropSize = _this.props.cropSize ? _this.props.cropSize : getCropSize(mediaRef.offsetWidth, mediaRef.offsetHeight, _this.containerRect.width, _this.containerRect.height, _this.props.aspect, _this.props.rotation);
41633  
41634          if (((_e = _this.state.cropSize) === null || _e === void 0 ? void 0 : _e.height) !== cropSize.height || ((_f = _this.state.cropSize) === null || _f === void 0 ? void 0 : _f.width) !== cropSize.width) {
41635            _this.props.onCropSizeChange && _this.props.onCropSizeChange(cropSize);
41636          }
41637  
41638          _this.setState({
41639            cropSize: cropSize
41640          }, _this.recomputeCropPosition);
41641        }
41642      };
41643  
41644      _this.onMouseDown = function (e) {
41645        e.preventDefault();
41646        document.addEventListener('mousemove', _this.onMouseMove);
41647        document.addEventListener('mouseup', _this.onDragStopped);
41648  
41649        _this.onDragStart(Cropper.getMousePoint(e));
41650      };
41651  
41652      _this.onMouseMove = function (e) {
41653        return _this.onDrag(Cropper.getMousePoint(e));
41654      };
41655  
41656      _this.onTouchStart = function (e) {
41657        document.addEventListener('touchmove', _this.onTouchMove, {
41658          passive: false
41659        }); // iOS 11 now defaults to passive: true
41660  
41661        document.addEventListener('touchend', _this.onDragStopped);
41662  
41663        if (e.touches.length === 2) {
41664          _this.onPinchStart(e);
41665        } else if (e.touches.length === 1) {
41666          _this.onDragStart(Cropper.getTouchPoint(e.touches[0]));
41667        }
41668      };
41669  
41670      _this.onTouchMove = function (e) {
41671        // Prevent whole page from scrolling on iOS.
41672        e.preventDefault();
41673  
41674        if (e.touches.length === 2) {
41675          _this.onPinchMove(e);
41676        } else if (e.touches.length === 1) {
41677          _this.onDrag(Cropper.getTouchPoint(e.touches[0]));
41678        }
41679      };
41680  
41681      _this.onDragStart = function (_a) {
41682        var _b, _c;
41683  
41684        var x = _a.x,
41685            y = _a.y;
41686        _this.dragStartPosition = {
41687          x: x,
41688          y: y
41689        };
41690        _this.dragStartCrop = __assign({}, _this.props.crop);
41691        (_c = (_b = _this.props).onInteractionStart) === null || _c === void 0 ? void 0 : _c.call(_b);
41692      };
41693  
41694      _this.onDrag = function (_a) {
41695        var x = _a.x,
41696            y = _a.y;
41697        if (_this.rafDragTimeout) window.cancelAnimationFrame(_this.rafDragTimeout);
41698        _this.rafDragTimeout = window.requestAnimationFrame(function () {
41699          if (!_this.state.cropSize) return;
41700          if (x === undefined || y === undefined) return;
41701          var offsetX = x - _this.dragStartPosition.x;
41702          var offsetY = y - _this.dragStartPosition.y;
41703          var requestedPosition = {
41704            x: _this.dragStartCrop.x + offsetX,
41705            y: _this.dragStartCrop.y + offsetY
41706          };
41707          var newPosition = _this.props.restrictPosition ? restrictPosition(requestedPosition, _this.mediaSize, _this.state.cropSize, _this.props.zoom, _this.props.rotation) : requestedPosition;
41708  
41709          _this.props.onCropChange(newPosition);
41710        });
41711      };
41712  
41713      _this.onDragStopped = function () {
41714        var _a, _b;
41715  
41716        _this.cleanEvents();
41717  
41718        _this.emitCropData();
41719  
41720        (_b = (_a = _this.props).onInteractionEnd) === null || _b === void 0 ? void 0 : _b.call(_a);
41721      };
41722  
41723      _this.onWheel = function (e) {
41724        e.preventDefault();
41725        var point = Cropper.getMousePoint(e);
41726        var pixelY = normalize_wheel_default()(e).pixelY;
41727        var newZoom = _this.props.zoom - pixelY * _this.props.zoomSpeed / 200;
41728  
41729        _this.setNewZoom(newZoom, point);
41730  
41731        if (!_this.state.hasWheelJustStarted) {
41732          _this.setState({
41733            hasWheelJustStarted: true
41734          }, function () {
41735            var _a, _b;
41736  
41737            return (_b = (_a = _this.props).onInteractionStart) === null || _b === void 0 ? void 0 : _b.call(_a);
41738          });
41739        }
41740  
41741        if (_this.wheelTimer) {
41742          clearTimeout(_this.wheelTimer);
41743        }
41744  
41745        _this.wheelTimer = window.setTimeout(function () {
41746          return _this.setState({
41747            hasWheelJustStarted: false
41748          }, function () {
41749            var _a, _b;
41750  
41751            return (_b = (_a = _this.props).onInteractionEnd) === null || _b === void 0 ? void 0 : _b.call(_a);
41752          });
41753        }, 250);
41754      };
41755  
41756      _this.getPointOnContainer = function (_a) {
41757        var x = _a.x,
41758            y = _a.y;
41759  
41760        if (!_this.containerRect) {
41761          throw new Error('The Cropper is not mounted');
41762        }
41763  
41764        return {
41765          x: _this.containerRect.width / 2 - (x - _this.containerRect.left),
41766          y: _this.containerRect.height / 2 - (y - _this.containerRect.top)
41767        };
41768      };
41769  
41770      _this.getPointOnMedia = function (_a) {
41771        var x = _a.x,
41772            y = _a.y;
41773        var _b = _this.props,
41774            crop = _b.crop,
41775            zoom = _b.zoom;
41776        return {
41777          x: (x + crop.x) / zoom,
41778          y: (y + crop.y) / zoom
41779        };
41780      };
41781  
41782      _this.setNewZoom = function (zoom, point) {
41783        if (!_this.state.cropSize || !_this.props.onZoomChange) return;
41784  
41785        var zoomPoint = _this.getPointOnContainer(point);
41786  
41787        var zoomTarget = _this.getPointOnMedia(zoomPoint);
41788  
41789        var newZoom = Math.min(_this.props.maxZoom, Math.max(zoom, _this.props.minZoom));
41790        var requestedPosition = {
41791          x: zoomTarget.x * newZoom - zoomPoint.x,
41792          y: zoomTarget.y * newZoom - zoomPoint.y
41793        };
41794        var newPosition = _this.props.restrictPosition ? restrictPosition(requestedPosition, _this.mediaSize, _this.state.cropSize, newZoom, _this.props.rotation) : requestedPosition;
41795  
41796        _this.props.onCropChange(newPosition);
41797  
41798        _this.props.onZoomChange(newZoom);
41799      };
41800  
41801      _this.getCropData = function () {
41802        if (!_this.state.cropSize) {
41803          return null;
41804        } // this is to ensure the crop is correctly restricted after a zoom back (https://github.com/ricardo-ch/react-easy-crop/issues/6)
41805  
41806  
41807        var restrictedPosition = _this.props.restrictPosition ? restrictPosition(_this.props.crop, _this.mediaSize, _this.state.cropSize, _this.props.zoom, _this.props.rotation) : _this.props.crop;
41808        return computeCroppedArea(restrictedPosition, _this.mediaSize, _this.state.cropSize, _this.getAspect(), _this.props.zoom, _this.props.rotation, _this.props.restrictPosition);
41809      };
41810  
41811      _this.emitCropData = function () {
41812        var cropData = _this.getCropData();
41813  
41814        if (!cropData) return;
41815        var croppedAreaPercentages = cropData.croppedAreaPercentages,
41816            croppedAreaPixels = cropData.croppedAreaPixels;
41817  
41818        if (_this.props.onCropComplete) {
41819          _this.props.onCropComplete(croppedAreaPercentages, croppedAreaPixels);
41820        }
41821  
41822        if (_this.props.onCropAreaChange) {
41823          _this.props.onCropAreaChange(croppedAreaPercentages, croppedAreaPixels);
41824        }
41825      };
41826  
41827      _this.emitCropAreaChange = function () {
41828        var cropData = _this.getCropData();
41829  
41830        if (!cropData) return;
41831        var croppedAreaPercentages = cropData.croppedAreaPercentages,
41832            croppedAreaPixels = cropData.croppedAreaPixels;
41833  
41834        if (_this.props.onCropAreaChange) {
41835          _this.props.onCropAreaChange(croppedAreaPercentages, croppedAreaPixels);
41836        }
41837      };
41838  
41839      _this.recomputeCropPosition = function () {
41840        if (!_this.state.cropSize) return;
41841        var newPosition = _this.props.restrictPosition ? restrictPosition(_this.props.crop, _this.mediaSize, _this.state.cropSize, _this.props.zoom, _this.props.rotation) : _this.props.crop;
41842  
41843        _this.props.onCropChange(newPosition);
41844  
41845        _this.emitCropData();
41846      };
41847  
41848      return _this;
41849    }
41850  
41851    Cropper.prototype.componentDidMount = function () {
41852      window.addEventListener('resize', this.computeSizes);
41853  
41854      if (this.containerRef) {
41855        this.props.zoomWithScroll && this.containerRef.addEventListener('wheel', this.onWheel, {
41856          passive: false
41857        });
41858        this.containerRef.addEventListener('gesturestart', this.preventZoomSafari);
41859        this.containerRef.addEventListener('gesturechange', this.preventZoomSafari);
41860      }
41861  
41862      if (!this.props.disableAutomaticStylesInjection) {
41863        this.styleRef = document.createElement('style');
41864        this.styleRef.setAttribute('type', 'text/css');
41865        this.styleRef.innerHTML = css_248z;
41866        document.head.appendChild(this.styleRef);
41867      } // when rendered via SSR, the image can already be loaded and its onLoad callback will never be called
41868  
41869  
41870      if (this.imageRef && this.imageRef.complete) {
41871        this.onMediaLoad();
41872      }
41873    };
41874  
41875    Cropper.prototype.componentWillUnmount = function () {
41876      var _a;
41877  
41878      window.removeEventListener('resize', this.computeSizes);
41879  
41880      if (this.containerRef) {
41881        this.containerRef.removeEventListener('gesturestart', this.preventZoomSafari);
41882        this.containerRef.removeEventListener('gesturechange', this.preventZoomSafari);
41883      }
41884  
41885      if (this.styleRef) {
41886        (_a = this.styleRef.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(this.styleRef);
41887      }
41888  
41889      this.cleanEvents();
41890      this.props.zoomWithScroll && this.clearScrollEvent();
41891    };
41892  
41893    Cropper.prototype.componentDidUpdate = function (prevProps) {
41894      var _a, _b, _c, _d, _e, _f, _g, _h, _j;
41895  
41896      if (prevProps.rotation !== this.props.rotation) {
41897        this.computeSizes();
41898        this.recomputeCropPosition();
41899      } else if (prevProps.aspect !== this.props.aspect) {
41900        this.computeSizes();
41901      } else if (prevProps.zoom !== this.props.zoom) {
41902        this.recomputeCropPosition();
41903      } else if (((_a = prevProps.cropSize) === null || _a === void 0 ? void 0 : _a.height) !== ((_b = this.props.cropSize) === null || _b === void 0 ? void 0 : _b.height) || ((_c = prevProps.cropSize) === null || _c === void 0 ? void 0 : _c.width) !== ((_d = this.props.cropSize) === null || _d === void 0 ? void 0 : _d.width)) {
41904        this.computeSizes();
41905      } else if (((_e = prevProps.crop) === null || _e === void 0 ? void 0 : _e.x) !== ((_f = this.props.crop) === null || _f === void 0 ? void 0 : _f.x) || ((_g = prevProps.crop) === null || _g === void 0 ? void 0 : _g.y) !== ((_h = this.props.crop) === null || _h === void 0 ? void 0 : _h.y)) {
41906        this.emitCropAreaChange();
41907      }
41908  
41909      if (prevProps.zoomWithScroll !== this.props.zoomWithScroll && this.containerRef) {
41910        this.props.zoomWithScroll ? this.containerRef.addEventListener('wheel', this.onWheel, {
41911          passive: false
41912        }) : this.clearScrollEvent();
41913      }
41914  
41915      if (prevProps.video !== this.props.video) {
41916        (_j = this.videoRef) === null || _j === void 0 ? void 0 : _j.load();
41917      }
41918    };
41919  
41920    Cropper.prototype.getAspect = function () {
41921      var _a = this.props,
41922          cropSize = _a.cropSize,
41923          aspect = _a.aspect;
41924  
41925      if (cropSize) {
41926        return cropSize.width / cropSize.height;
41927      }
41928  
41929      return aspect;
41930    };
41931  
41932    Cropper.prototype.onPinchStart = function (e) {
41933      var pointA = Cropper.getTouchPoint(e.touches[0]);
41934      var pointB = Cropper.getTouchPoint(e.touches[1]);
41935      this.lastPinchDistance = getDistanceBetweenPoints(pointA, pointB);
41936      this.lastPinchRotation = getRotationBetweenPoints(pointA, pointB);
41937      this.onDragStart(getCenter(pointA, pointB));
41938    };
41939  
41940    Cropper.prototype.onPinchMove = function (e) {
41941      var _this = this;
41942  
41943      var pointA = Cropper.getTouchPoint(e.touches[0]);
41944      var pointB = Cropper.getTouchPoint(e.touches[1]);
41945      var center = getCenter(pointA, pointB);
41946      this.onDrag(center);
41947      if (this.rafPinchTimeout) window.cancelAnimationFrame(this.rafPinchTimeout);
41948      this.rafPinchTimeout = window.requestAnimationFrame(function () {
41949        var distance = getDistanceBetweenPoints(pointA, pointB);
41950        var newZoom = _this.props.zoom * (distance / _this.lastPinchDistance);
41951  
41952        _this.setNewZoom(newZoom, center);
41953  
41954        _this.lastPinchDistance = distance;
41955        var rotation = getRotationBetweenPoints(pointA, pointB);
41956        var newRotation = _this.props.rotation + (rotation - _this.lastPinchRotation);
41957        _this.props.onRotationChange && _this.props.onRotationChange(newRotation);
41958        _this.lastPinchRotation = rotation;
41959      });
41960    };
41961  
41962    Cropper.prototype.render = function () {
41963      var _this = this;
41964  
41965      var _a = this.props,
41966          image = _a.image,
41967          video = _a.video,
41968          mediaProps = _a.mediaProps,
41969          transform = _a.transform,
41970          _b = _a.crop,
41971          x = _b.x,
41972          y = _b.y,
41973          rotation = _a.rotation,
41974          zoom = _a.zoom,
41975          cropShape = _a.cropShape,
41976          showGrid = _a.showGrid,
41977          _c = _a.style,
41978          containerStyle = _c.containerStyle,
41979          cropAreaStyle = _c.cropAreaStyle,
41980          mediaStyle = _c.mediaStyle,
41981          _d = _a.classes,
41982          containerClassName = _d.containerClassName,
41983          cropAreaClassName = _d.cropAreaClassName,
41984          mediaClassName = _d.mediaClassName,
41985          objectFit = _a.objectFit;
41986      return /*#__PURE__*/external_React_default().createElement("div", {
41987        onMouseDown: this.onMouseDown,
41988        onTouchStart: this.onTouchStart,
41989        ref: function ref(el) {
41990          return _this.containerRef = el;
41991        },
41992        "data-testid": "container",
41993        style: containerStyle,
41994        className: classNames('reactEasyCrop_Container', containerClassName)
41995      }, image ? /*#__PURE__*/external_React_default().createElement("img", __assign({
41996        alt: "",
41997        className: classNames('reactEasyCrop_Image', objectFit === 'contain' && 'reactEasyCrop_Contain', objectFit === 'horizontal-cover' && 'reactEasyCrop_Cover_Horizontal', objectFit === 'vertical-cover' && 'reactEasyCrop_Cover_Vertical', mediaClassName)
41998      }, mediaProps, {
41999        src: image,
42000        ref: function ref(el) {
42001          return _this.imageRef = el;
42002        },
42003        style: __assign(__assign({}, mediaStyle), {
42004          transform: transform || "translate(" + x + "px, " + y + "px) rotate(" + rotation + "deg) scale(" + zoom + ")"
42005        }),
42006        onLoad: this.onMediaLoad
42007      })) : video && /*#__PURE__*/external_React_default().createElement("video", __assign({
42008        autoPlay: true,
42009        loop: true,
42010        muted: true,
42011        className: classNames('reactEasyCrop_Video', objectFit === 'contain' && 'reactEasyCrop_Contain', objectFit === 'horizontal-cover' && 'reactEasyCrop_Cover_Horizontal', objectFit === 'vertical-cover' && 'reactEasyCrop_Cover_Vertical', mediaClassName)
42012      }, mediaProps, {
42013        ref: function ref(el) {
42014          return _this.videoRef = el;
42015        },
42016        onLoadedMetadata: this.onMediaLoad,
42017        style: __assign(__assign({}, mediaStyle), {
42018          transform: transform || "translate(" + x + "px, " + y + "px) rotate(" + rotation + "deg) scale(" + zoom + ")"
42019        }),
42020        controls: false
42021      }), (Array.isArray(video) ? video : [{
42022        src: video
42023      }]).map(function (item) {
42024        return /*#__PURE__*/external_React_default().createElement("source", __assign({
42025          key: item.src
42026        }, item));
42027      })), this.state.cropSize && /*#__PURE__*/external_React_default().createElement("div", {
42028        style: __assign(__assign({}, cropAreaStyle), {
42029          width: this.state.cropSize.width,
42030          height: this.state.cropSize.height
42031        }),
42032        "data-testid": "cropper",
42033        className: classNames('reactEasyCrop_CropArea', cropShape === 'round' && 'reactEasyCrop_CropAreaRound', showGrid && 'reactEasyCrop_CropAreaGrid', cropAreaClassName)
42034      }));
42035    };
42036  
42037    Cropper.defaultProps = {
42038      zoom: 1,
42039      rotation: 0,
42040      aspect: 4 / 3,
42041      maxZoom: MAX_ZOOM,
42042      minZoom: MIN_ZOOM,
42043      cropShape: 'rect',
42044      objectFit: 'contain',
42045      showGrid: true,
42046      style: {},
42047      classes: {},
42048      mediaProps: {},
42049      zoomSpeed: 1,
42050      restrictPosition: true,
42051      zoomWithScroll: true
42052    };
42053  
42054    Cropper.getMousePoint = function (e) {
42055      return {
42056        x: Number(e.clientX),
42057        y: Number(e.clientY)
42058      };
42059    };
42060  
42061    Cropper.getTouchPoint = function (touch) {
42062      return {
42063        x: Number(touch.clientX),
42064        y: Number(touch.clientY)
42065      };
42066    };
42067  
42068    return Cropper;
42069  }((external_React_default()).Component);
42070  
42071  /* harmony default export */ var index_module = (Cropper);
42072  
42073  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/image-editor/constants.js
42074  const constants_MIN_ZOOM = 100;
42075  const constants_MAX_ZOOM = 300;
42076  const constants_POPOVER_PROPS = {
42077    position: 'bottom right',
42078    isAlternate: true
42079  };
42080  
42081  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/image-editor/use-save-image.js
42082  /**
42083   * WordPress dependencies
42084   */
42085  
42086  
42087  
42088  
42089  
42090  function useSaveImage(_ref) {
42091    let {
42092      crop,
42093      rotation,
42094      height,
42095      width,
42096      aspect,
42097      url,
42098      id,
42099      onSaveImage,
42100      onFinishEditing
42101    } = _ref;
42102    const {
42103      createErrorNotice
42104    } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store);
42105    const [isInProgress, setIsInProgress] = (0,external_wp_element_namespaceObject.useState)(false);
42106    const cancel = (0,external_wp_element_namespaceObject.useCallback)(() => {
42107      setIsInProgress(false);
42108      onFinishEditing();
42109    }, [setIsInProgress, onFinishEditing]);
42110    const apply = (0,external_wp_element_namespaceObject.useCallback)(() => {
42111      setIsInProgress(true);
42112      let attrs = {}; // The crop script may return some very small, sub-pixel values when the image was not cropped.
42113      // Crop only when the new size has changed by more than 0.1%.
42114  
42115      if (crop.width < 99.9 || crop.height < 99.9) {
42116        attrs = crop;
42117      }
42118  
42119      if (rotation > 0) {
42120        attrs.rotation = rotation;
42121      }
42122  
42123      attrs.src = url;
42124      external_wp_apiFetch_default()({
42125        path: `/wp/v2/media/$id}/edit`,
42126        method: 'POST',
42127        data: attrs
42128      }).then(response => {
42129        onSaveImage({
42130          id: response.id,
42131          url: response.source_url,
42132          height: height && width ? width / aspect : undefined
42133        });
42134      }).catch(error => {
42135        createErrorNotice((0,external_wp_i18n_namespaceObject.sprintf)(
42136        /* translators: 1. Error message */
42137        (0,external_wp_i18n_namespaceObject.__)('Could not edit image. %s'), error.message), {
42138          id: 'image-editing-error',
42139          type: 'snackbar'
42140        });
42141      }).finally(() => {
42142        setIsInProgress(false);
42143        onFinishEditing();
42144      });
42145    }, [setIsInProgress, crop, rotation, height, width, aspect, url, onSaveImage, createErrorNotice, setIsInProgress, onFinishEditing]);
42146    return (0,external_wp_element_namespaceObject.useMemo)(() => ({
42147      isInProgress,
42148      apply,
42149      cancel
42150    }), [isInProgress, apply, cancel]);
42151  }
42152  
42153  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/image-editor/use-transform-image.js
42154  /**
42155   * WordPress dependencies
42156   */
42157  
42158  
42159  
42160  function useTransformState(_ref) {
42161    let {
42162      url,
42163      naturalWidth,
42164      naturalHeight
42165    } = _ref;
42166    const [editedUrl, setEditedUrl] = (0,external_wp_element_namespaceObject.useState)();
42167    const [crop, setCrop] = (0,external_wp_element_namespaceObject.useState)();
42168    const [position, setPosition] = (0,external_wp_element_namespaceObject.useState)({
42169      x: 0,
42170      y: 0
42171    });
42172    const [zoom, setZoom] = (0,external_wp_element_namespaceObject.useState)();
42173    const [rotation, setRotation] = (0,external_wp_element_namespaceObject.useState)();
42174    const [aspect, setAspect] = (0,external_wp_element_namespaceObject.useState)();
42175    const [defaultAspect, setDefaultAspect] = (0,external_wp_element_namespaceObject.useState)();
42176    const initializeTransformValues = (0,external_wp_element_namespaceObject.useCallback)(() => {
42177      setPosition({
42178        x: 0,
42179        y: 0
42180      });
42181      setZoom(100);
42182      setRotation(0);
42183      setAspect(naturalWidth / naturalHeight);
42184      setDefaultAspect(naturalWidth / naturalHeight);
42185    }, [naturalWidth, naturalHeight, setPosition, setZoom, setRotation, setAspect, setDefaultAspect]);
42186    const rotateClockwise = (0,external_wp_element_namespaceObject.useCallback)(() => {
42187      const angle = (rotation + 90) % 360;
42188      let naturalAspectRatio = naturalWidth / naturalHeight;
42189  
42190      if (rotation % 180 === 90) {
42191        naturalAspectRatio = naturalHeight / naturalWidth;
42192      }
42193  
42194      if (angle === 0) {
42195        setEditedUrl();
42196        setRotation(angle);
42197        setAspect(1 / aspect);
42198        setPosition({
42199          x: -(position.y * naturalAspectRatio),
42200          y: position.x * naturalAspectRatio
42201        });
42202        return;
42203      }
42204  
42205      function editImage(event) {
42206        const canvas = document.createElement('canvas');
42207        let translateX = 0;
42208        let translateY = 0;
42209  
42210        if (angle % 180) {
42211          canvas.width = event.target.height;
42212          canvas.height = event.target.width;
42213        } else {
42214          canvas.width = event.target.width;
42215          canvas.height = event.target.height;
42216        }
42217  
42218        if (angle === 90 || angle === 180) {
42219          translateX = canvas.width;
42220        }
42221  
42222        if (angle === 270 || angle === 180) {
42223          translateY = canvas.height;
42224        }
42225  
42226        const context = canvas.getContext('2d');
42227        context.translate(translateX, translateY);
42228        context.rotate(angle * Math.PI / 180);
42229        context.drawImage(event.target, 0, 0);
42230        canvas.toBlob(blob => {
42231          setEditedUrl(URL.createObjectURL(blob));
42232          setRotation(angle);
42233          setAspect(1 / aspect);
42234          setPosition({
42235            x: -(position.y * naturalAspectRatio),
42236            y: position.x * naturalAspectRatio
42237          });
42238        });
42239      }
42240  
42241      const el = new window.Image();
42242      el.src = url;
42243      el.onload = editImage;
42244      const imgCrossOrigin = (0,external_wp_hooks_namespaceObject.applyFilters)('media.crossOrigin', undefined, url);
42245  
42246      if (typeof imgCrossOrigin === 'string') {
42247        el.crossOrigin = imgCrossOrigin;
42248      }
42249    }, [rotation, naturalWidth, naturalHeight, setEditedUrl, setRotation, setAspect, setPosition]);
42250    return (0,external_wp_element_namespaceObject.useMemo)(() => ({
42251      editedUrl,
42252      setEditedUrl,
42253      crop,
42254      setCrop,
42255      position,
42256      setPosition,
42257      zoom,
42258      setZoom,
42259      rotation,
42260      setRotation,
42261      rotateClockwise,
42262      aspect,
42263      setAspect,
42264      defaultAspect,
42265      initializeTransformValues
42266    }), [editedUrl, setEditedUrl, crop, setCrop, position, setPosition, zoom, setZoom, rotation, setRotation, rotateClockwise, aspect, setAspect, defaultAspect, initializeTransformValues]);
42267  }
42268  
42269  function useTransformImage(imageProperties, isEditing) {
42270    const transformState = useTransformState(imageProperties);
42271    const {
42272      initializeTransformValues
42273    } = transformState;
42274    (0,external_wp_element_namespaceObject.useEffect)(() => {
42275      if (isEditing) {
42276        initializeTransformValues();
42277      }
42278    }, [isEditing, initializeTransformValues]);
42279    return transformState;
42280  }
42281  
42282  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/image-editor/context.js
42283  
42284  
42285  /**
42286   * WordPress dependencies
42287   */
42288  
42289  /**
42290   * Internal dependencies
42291   */
42292  
42293  
42294  
42295  const ImageEditingContext = (0,external_wp_element_namespaceObject.createContext)({});
42296  const useImageEditingContext = () => (0,external_wp_element_namespaceObject.useContext)(ImageEditingContext);
42297  function ImageEditingProvider(_ref) {
42298    let {
42299      id,
42300      url,
42301      naturalWidth,
42302      naturalHeight,
42303      isEditing,
42304      onFinishEditing,
42305      onSaveImage,
42306      children
42307    } = _ref;
42308    const transformImage = useTransformImage({
42309      url,
42310      naturalWidth,
42311      naturalHeight
42312    }, isEditing);
42313    const saveImage = useSaveImage({
42314      id,
42315      url,
42316      onSaveImage,
42317      onFinishEditing,
42318      ...transformImage
42319    });
42320    const providerValue = (0,external_wp_element_namespaceObject.useMemo)(() => ({ ...transformImage,
42321      ...saveImage
42322    }), [transformImage, saveImage]);
42323    return (0,external_wp_element_namespaceObject.createElement)(ImageEditingContext.Provider, {
42324      value: providerValue
42325    }, children);
42326  }
42327  
42328  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/image-editor/cropper.js
42329  
42330  
42331  /**
42332   * External dependencies
42333   */
42334  
42335  
42336  /**
42337   * WordPress dependencies
42338   */
42339  
42340  
42341  /**
42342   * Internal dependencies
42343   */
42344  
42345  
42346  
42347  function ImageCropper(_ref) {
42348    let {
42349      url,
42350      width,
42351      height,
42352      clientWidth,
42353      naturalHeight,
42354      naturalWidth
42355    } = _ref;
42356    const {
42357      isInProgress,
42358      editedUrl,
42359      position,
42360      zoom,
42361      aspect,
42362      setPosition,
42363      setCrop,
42364      setZoom,
42365      rotation
42366    } = useImageEditingContext();
42367    let editedHeight = height || clientWidth * naturalHeight / naturalWidth;
42368  
42369    if (rotation % 180 === 90) {
42370      editedHeight = clientWidth * naturalWidth / naturalHeight;
42371    }
42372  
42373    return (0,external_wp_element_namespaceObject.createElement)("div", {
42374      className: classnames_default()('wp-block-image__crop-area', {
42375        'is-applying': isInProgress
42376      }),
42377      style: {
42378        width: width || clientWidth,
42379        height: editedHeight
42380      }
42381    }, (0,external_wp_element_namespaceObject.createElement)(index_module, {
42382      image: editedUrl || url,
42383      disabled: isInProgress,
42384      minZoom: constants_MIN_ZOOM / 100,
42385      maxZoom: constants_MAX_ZOOM / 100,
42386      crop: position,
42387      zoom: zoom / 100,
42388      aspect: aspect,
42389      onCropChange: setPosition,
42390      onCropComplete: newCropPercent => {
42391        setCrop(newCropPercent);
42392      },
42393      onZoomChange: newZoom => {
42394        setZoom(newZoom * 100);
42395      }
42396    }), isInProgress && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Spinner, null));
42397  }
42398  
42399  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/search.js
42400  
42401  
42402  /**
42403   * WordPress dependencies
42404   */
42405  
42406  const search = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
42407    xmlns: "http://www.w3.org/2000/svg",
42408    viewBox: "0 0 24 24"
42409  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
42410    d: "M13.5 6C10.5 6 8 8.5 8 11.5c0 1.1.3 2.1.9 3l-3.4 3 1 1.1 3.4-2.9c1 .9 2.2 1.4 3.6 1.4 3 0 5.5-2.5 5.5-5.5C19 8.5 16.5 6 13.5 6zm0 9.5c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"
42411  }));
42412  /* harmony default export */ var library_search = (search);
42413  
42414  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/image-editor/zoom-dropdown.js
42415  
42416  
42417  /**
42418   * WordPress dependencies
42419   */
42420  
42421  
42422  
42423  /**
42424   * Internal dependencies
42425   */
42426  
42427  
42428  
42429  function ZoomDropdown() {
42430    const {
42431      isInProgress,
42432      zoom,
42433      setZoom
42434    } = useImageEditingContext();
42435    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Dropdown, {
42436      contentClassName: "wp-block-image__zoom",
42437      popoverProps: constants_POPOVER_PROPS,
42438      renderToggle: _ref => {
42439        let {
42440          isOpen,
42441          onToggle
42442        } = _ref;
42443        return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarButton, {
42444          icon: library_search,
42445          label: (0,external_wp_i18n_namespaceObject.__)('Zoom'),
42446          onClick: onToggle,
42447          "aria-expanded": isOpen,
42448          disabled: isInProgress
42449        });
42450      },
42451      renderContent: () => (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.RangeControl, {
42452        label: (0,external_wp_i18n_namespaceObject.__)('Zoom'),
42453        min: constants_MIN_ZOOM,
42454        max: constants_MAX_ZOOM,
42455        value: Math.round(zoom),
42456        onChange: setZoom
42457      })
42458    });
42459  }
42460  
42461  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/aspect-ratio.js
42462  
42463  
42464  /**
42465   * WordPress dependencies
42466   */
42467  
42468  const aspectRatio = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
42469    xmlns: "http://www.w3.org/2000/svg",
42470    viewBox: "0 0 24 24"
42471  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
42472    d: "M18.5 5.5h-13c-1.1 0-2 .9-2 2v9c0 1.1.9 2 2 2h13c1.1 0 2-.9 2-2v-9c0-1.1-.9-2-2-2zm.5 11c0 .3-.2.5-.5.5h-13c-.3 0-.5-.2-.5-.5v-9c0-.3.2-.5.5-.5h13c.3 0 .5.2.5.5v9zM6.5 12H8v-2h2V8.5H6.5V12zm9.5 2h-2v1.5h3.5V12H16v2z"
42473  }));
42474  /* harmony default export */ var aspect_ratio = (aspectRatio);
42475  
42476  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/image-editor/aspect-ratio-dropdown.js
42477  
42478  
42479  /**
42480   * WordPress dependencies
42481   */
42482  
42483  
42484  
42485  /**
42486   * Internal dependencies
42487   */
42488  
42489  
42490  
42491  
42492  function AspectGroup(_ref) {
42493    let {
42494      aspectRatios,
42495      isDisabled,
42496      label,
42497      onClick,
42498      value
42499    } = _ref;
42500    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuGroup, {
42501      label: label
42502    }, aspectRatios.map(_ref2 => {
42503      let {
42504        title,
42505        aspect
42506      } = _ref2;
42507      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
42508        key: aspect,
42509        disabled: isDisabled,
42510        onClick: () => {
42511          onClick(aspect);
42512        },
42513        role: "menuitemradio",
42514        isSelected: aspect === value,
42515        icon: aspect === value ? library_check : undefined
42516      }, title);
42517    }));
42518  }
42519  
42520  function AspectRatioDropdown(_ref3) {
42521    let {
42522      toggleProps
42523    } = _ref3;
42524    const {
42525      isInProgress,
42526      aspect,
42527      setAspect,
42528      defaultAspect
42529    } = useImageEditingContext();
42530    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.DropdownMenu, {
42531      icon: aspect_ratio,
42532      label: (0,external_wp_i18n_namespaceObject.__)('Aspect Ratio'),
42533      popoverProps: constants_POPOVER_PROPS,
42534      toggleProps: toggleProps,
42535      className: "wp-block-image__aspect-ratio"
42536    }, _ref4 => {
42537      let {
42538        onClose
42539      } = _ref4;
42540      return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(AspectGroup, {
42541        isDisabled: isInProgress,
42542        onClick: newAspect => {
42543          setAspect(newAspect);
42544          onClose();
42545        },
42546        value: aspect,
42547        aspectRatios: [{
42548          title: (0,external_wp_i18n_namespaceObject.__)('Original'),
42549          aspect: defaultAspect
42550        }, {
42551          title: (0,external_wp_i18n_namespaceObject.__)('Square'),
42552          aspect: 1
42553        }]
42554      }), (0,external_wp_element_namespaceObject.createElement)(AspectGroup, {
42555        label: (0,external_wp_i18n_namespaceObject.__)('Landscape'),
42556        isDisabled: isInProgress,
42557        onClick: newAspect => {
42558          setAspect(newAspect);
42559          onClose();
42560        },
42561        value: aspect,
42562        aspectRatios: [{
42563          title: (0,external_wp_i18n_namespaceObject.__)('16:10'),
42564          aspect: 16 / 10
42565        }, {
42566          title: (0,external_wp_i18n_namespaceObject.__)('16:9'),
42567          aspect: 16 / 9
42568        }, {
42569          title: (0,external_wp_i18n_namespaceObject.__)('4:3'),
42570          aspect: 4 / 3
42571        }, {
42572          title: (0,external_wp_i18n_namespaceObject.__)('3:2'),
42573          aspect: 3 / 2
42574        }]
42575      }), (0,external_wp_element_namespaceObject.createElement)(AspectGroup, {
42576        label: (0,external_wp_i18n_namespaceObject.__)('Portrait'),
42577        isDisabled: isInProgress,
42578        onClick: newAspect => {
42579          setAspect(newAspect);
42580          onClose();
42581        },
42582        value: aspect,
42583        aspectRatios: [{
42584          title: (0,external_wp_i18n_namespaceObject.__)('10:16'),
42585          aspect: 10 / 16
42586        }, {
42587          title: (0,external_wp_i18n_namespaceObject.__)('9:16'),
42588          aspect: 9 / 16
42589        }, {
42590          title: (0,external_wp_i18n_namespaceObject.__)('3:4'),
42591          aspect: 3 / 4
42592        }, {
42593          title: (0,external_wp_i18n_namespaceObject.__)('2:3'),
42594          aspect: 2 / 3
42595        }]
42596      }));
42597    });
42598  }
42599  
42600  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/rotate-right.js
42601  
42602  
42603  /**
42604   * WordPress dependencies
42605   */
42606  
42607  const rotateRight = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
42608    xmlns: "http://www.w3.org/2000/svg",
42609    viewBox: "0 0 24 24"
42610  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
42611    d: "M15.1 4.8l-3-2.5V4c-4.4 0-8 3.6-8 8 0 3.7 2.5 6.9 6 7.7.3.1.6.1 1 .2l.2-1.5c-.4 0-.7-.1-1.1-.2l-.1.2v-.2c-2.6-.8-4.5-3.3-4.5-6.2 0-3.6 2.9-6.5 6.5-6.5v1.8l3-2.5zM20 11c-.2-1.4-.7-2.7-1.6-3.8l-1.2.8c.7.9 1.1 2 1.3 3.1L20 11zm-1.5 1.8c-.1.5-.2 1.1-.4 1.6s-.5 1-.8 1.5l1.2.9c.4-.5.8-1.1 1-1.8s.5-1.3.5-2l-1.5-.2zm-5.6 5.6l.2 1.5c1.4-.2 2.7-.7 3.8-1.6l-.9-1.1c-.9.7-2 1.1-3.1 1.2z"
42612  }));
42613  /* harmony default export */ var rotate_right = (rotateRight);
42614  
42615  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/image-editor/rotation-button.js
42616  
42617  
42618  /**
42619   * WordPress dependencies
42620   */
42621  
42622  
42623  
42624  /**
42625   * Internal dependencies
42626   */
42627  
42628  
42629  function RotationButton() {
42630    const {
42631      isInProgress,
42632      rotateClockwise
42633    } = useImageEditingContext();
42634    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarButton, {
42635      icon: rotate_right,
42636      label: (0,external_wp_i18n_namespaceObject.__)('Rotate'),
42637      onClick: rotateClockwise,
42638      disabled: isInProgress
42639    });
42640  }
42641  
42642  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/image-editor/form-controls.js
42643  
42644  
42645  /**
42646   * WordPress dependencies
42647   */
42648  
42649  
42650  /**
42651   * Internal dependencies
42652   */
42653  
42654  
42655  function FormControls() {
42656    const {
42657      isInProgress,
42658      apply,
42659      cancel
42660    } = useImageEditingContext();
42661    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarButton, {
42662      onClick: apply,
42663      disabled: isInProgress
42664    }, (0,external_wp_i18n_namespaceObject.__)('Apply')), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarButton, {
42665      onClick: cancel
42666    }, (0,external_wp_i18n_namespaceObject.__)('Cancel')));
42667  }
42668  
42669  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/image-editor/index.js
42670  
42671  
42672  /**
42673   * WordPress dependencies
42674   */
42675  
42676  /**
42677   * Internal dependencies
42678   */
42679  
42680  
42681  
42682  
42683  
42684  
42685  
42686  function ImageEditor(_ref) {
42687    let {
42688      url,
42689      width,
42690      height,
42691      clientWidth,
42692      naturalHeight,
42693      naturalWidth
42694    } = _ref;
42695    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(ImageCropper, {
42696      url: url,
42697      width: width,
42698      height: height,
42699      clientWidth: clientWidth,
42700      naturalHeight: naturalHeight,
42701      naturalWidth: naturalWidth
42702    }), (0,external_wp_element_namespaceObject.createElement)(block_controls, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarGroup, null, (0,external_wp_element_namespaceObject.createElement)(ZoomDropdown, null), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarItem, null, toggleProps => (0,external_wp_element_namespaceObject.createElement)(AspectRatioDropdown, {
42703      toggleProps: toggleProps
42704    })), (0,external_wp_element_namespaceObject.createElement)(RotationButton, null)), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarGroup, null, (0,external_wp_element_namespaceObject.createElement)(FormControls, null))));
42705  }
42706  
42707  
42708  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/image-size-control/use-dimension-handler.js
42709  /**
42710   * WordPress dependencies
42711   */
42712  
42713  function useDimensionHandler(customHeight, customWidth, defaultHeight, defaultWidth, onChange) {
42714    var _ref, _ref2;
42715  
42716    const [currentWidth, setCurrentWidth] = (0,external_wp_element_namespaceObject.useState)((_ref = customWidth !== null && customWidth !== void 0 ? customWidth : defaultWidth) !== null && _ref !== void 0 ? _ref : '');
42717    const [currentHeight, setCurrentHeight] = (0,external_wp_element_namespaceObject.useState)((_ref2 = customHeight !== null && customHeight !== void 0 ? customHeight : defaultHeight) !== null && _ref2 !== void 0 ? _ref2 : ''); // When an image is first inserted, the default dimensions are initially
42718    // undefined. This effect updates the dimensions when the default values
42719    // come through.
42720  
42721    (0,external_wp_element_namespaceObject.useEffect)(() => {
42722      if (customWidth === undefined && defaultWidth !== undefined) {
42723        setCurrentWidth(defaultWidth);
42724      }
42725  
42726      if (customHeight === undefined && defaultHeight !== undefined) {
42727        setCurrentHeight(defaultHeight);
42728      }
42729    }, [defaultWidth, defaultHeight]); // If custom values change, it means an outsider has resized the image using some other method (eg resize box)
42730    // this keeps track of these values too. We need to parse before comparing; custom values can be strings.
42731  
42732    (0,external_wp_element_namespaceObject.useEffect)(() => {
42733      if (customWidth !== undefined && Number.parseInt(customWidth) !== Number.parseInt(currentWidth)) {
42734        setCurrentWidth(customWidth);
42735      }
42736  
42737      if (customHeight !== undefined && Number.parseInt(customHeight) !== Number.parseInt(currentHeight)) {
42738        setCurrentHeight(customHeight);
42739      }
42740    }, [customWidth, customHeight]);
42741  
42742    const updateDimension = (dimension, value) => {
42743      if (dimension === 'width') {
42744        setCurrentWidth(value);
42745      } else {
42746        setCurrentHeight(value);
42747      }
42748  
42749      onChange({
42750        [dimension]: value === '' ? undefined : parseInt(value, 10)
42751      });
42752    };
42753  
42754    const updateDimensions = (nextHeight, nextWidth) => {
42755      setCurrentHeight(nextHeight !== null && nextHeight !== void 0 ? nextHeight : defaultHeight);
42756      setCurrentWidth(nextWidth !== null && nextWidth !== void 0 ? nextWidth : defaultWidth);
42757      onChange({
42758        height: nextHeight,
42759        width: nextWidth
42760      });
42761    };
42762  
42763    return {
42764      currentHeight,
42765      currentWidth,
42766      updateDimension,
42767      updateDimensions
42768    };
42769  }
42770  
42771  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/image-size-control/index.js
42772  
42773  
42774  /**
42775   * External dependencies
42776   */
42777  
42778  /**
42779   * WordPress dependencies
42780   */
42781  
42782  
42783  
42784  /**
42785   * Internal dependencies
42786   */
42787  
42788  
42789  const IMAGE_SIZE_PRESETS = [25, 50, 75, 100];
42790  function ImageSizeControl(_ref) {
42791    let {
42792      imageWidth,
42793      imageHeight,
42794      imageSizeOptions = [],
42795      isResizable = true,
42796      slug,
42797      width,
42798      height,
42799      onChange,
42800      onChangeImage = external_lodash_namespaceObject.noop
42801    } = _ref;
42802    const {
42803      currentHeight,
42804      currentWidth,
42805      updateDimension,
42806      updateDimensions
42807    } = useDimensionHandler(height, width, imageHeight, imageWidth, onChange);
42808    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, !(0,external_lodash_namespaceObject.isEmpty)(imageSizeOptions) && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.SelectControl, {
42809      label: (0,external_wp_i18n_namespaceObject.__)('Image size'),
42810      value: slug,
42811      options: imageSizeOptions,
42812      onChange: onChangeImage
42813    }), isResizable && (0,external_wp_element_namespaceObject.createElement)("div", {
42814      className: "block-editor-image-size-control"
42815    }, (0,external_wp_element_namespaceObject.createElement)("p", {
42816      className: "block-editor-image-size-control__row"
42817    }, (0,external_wp_i18n_namespaceObject.__)('Image dimensions')), (0,external_wp_element_namespaceObject.createElement)("div", {
42818      className: "block-editor-image-size-control__row"
42819    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.TextControl, {
42820      type: "number",
42821      className: "block-editor-image-size-control__width",
42822      label: (0,external_wp_i18n_namespaceObject.__)('Width'),
42823      value: currentWidth,
42824      min: 1,
42825      onChange: value => updateDimension('width', value)
42826    }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.TextControl, {
42827      type: "number",
42828      className: "block-editor-image-size-control__height",
42829      label: (0,external_wp_i18n_namespaceObject.__)('Height'),
42830      value: currentHeight,
42831      min: 1,
42832      onChange: value => updateDimension('height', value)
42833    })), (0,external_wp_element_namespaceObject.createElement)("div", {
42834      className: "block-editor-image-size-control__row"
42835    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ButtonGroup, {
42836      "aria-label": (0,external_wp_i18n_namespaceObject.__)('Image size presets')
42837    }, IMAGE_SIZE_PRESETS.map(scale => {
42838      const scaledWidth = Math.round(imageWidth * (scale / 100));
42839      const scaledHeight = Math.round(imageHeight * (scale / 100));
42840      const isCurrent = currentWidth === scaledWidth && currentHeight === scaledHeight;
42841      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
42842        key: scale,
42843        isSmall: true,
42844        variant: isCurrent ? 'primary' : undefined,
42845        isPressed: isCurrent,
42846        onClick: () => updateDimensions(scaledHeight, scaledWidth)
42847      }, scale, "%");
42848    })), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
42849      isSmall: true,
42850      onClick: () => updateDimensions()
42851    }, (0,external_wp_i18n_namespaceObject.__)('Reset')))));
42852  }
42853  
42854  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/keyboard-return.js
42855  
42856  
42857  /**
42858   * WordPress dependencies
42859   */
42860  
42861  const keyboardReturn = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
42862    xmlns: "http://www.w3.org/2000/svg",
42863    viewBox: "-2 -2 24 24"
42864  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
42865    d: "M6.734 16.106l2.176-2.38-1.093-1.028-3.846 4.158 3.846 4.157 1.093-1.027-2.176-2.38h2.811c1.125 0 2.25.03 3.374 0 1.428-.001 3.362-.25 4.963-1.277 1.66-1.065 2.868-2.906 2.868-5.859 0-2.479-1.327-4.896-3.65-5.93-1.82-.813-3.044-.8-4.806-.788l-.567.002v1.5c.184 0 .368 0 .553-.002 1.82-.007 2.704-.014 4.21.657 1.854.827 2.76 2.657 2.76 4.561 0 2.472-.973 3.824-2.178 4.596-1.258.807-2.864 1.04-4.163 1.04h-.02c-1.115.03-2.229 0-3.344 0H6.734z"
42866  }));
42867  /* harmony default export */ var keyboard_return = (keyboardReturn);
42868  
42869  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/link-control/settings-drawer.js
42870  
42871  
42872  /**
42873   * External dependencies
42874   */
42875  
42876  /**
42877   * WordPress dependencies
42878   */
42879  
42880  
42881  
42882  
42883  const LinkControlSettingsDrawer = _ref => {
42884    let {
42885      value,
42886      onChange = external_lodash_namespaceObject.noop,
42887      settings
42888    } = _ref;
42889  
42890    if (!settings || !settings.length) {
42891      return null;
42892    }
42893  
42894    const handleSettingChange = setting => newValue => {
42895      onChange({ ...value,
42896        [setting.id]: newValue
42897      });
42898    };
42899  
42900    const theSettings = settings.map(setting => (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToggleControl, {
42901      className: "block-editor-link-control__setting",
42902      key: setting.id,
42903      label: setting.title,
42904      onChange: handleSettingChange(setting),
42905      checked: value ? !!value[setting.id] : false
42906    }));
42907    return (0,external_wp_element_namespaceObject.createElement)("fieldset", {
42908      className: "block-editor-link-control__settings"
42909    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.VisuallyHidden, {
42910      as: "legend"
42911    }, (0,external_wp_i18n_namespaceObject.__)('Currently selected link settings')), theSettings);
42912  };
42913  
42914  /* harmony default export */ var settings_drawer = (LinkControlSettingsDrawer);
42915  
42916  // EXTERNAL MODULE: ./node_modules/dom-scroll-into-view/lib/index.js
42917  var dom_scroll_into_view_lib = __webpack_require__(5425);
42918  var lib_default = /*#__PURE__*/__webpack_require__.n(dom_scroll_into_view_lib);
42919  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/url-input/index.js
42920  
42921  
42922  
42923  /**
42924   * External dependencies
42925   */
42926  
42927  
42928  
42929  /**
42930   * WordPress dependencies
42931   */
42932  
42933  
42934  
42935  
42936  
42937  
42938  
42939  
42940  /**
42941   * Internal dependencies
42942   */
42943  
42944  
42945  
42946  class URLInput extends external_wp_element_namespaceObject.Component {
42947    constructor(props) {
42948      super(props);
42949      this.onChange = this.onChange.bind(this);
42950      this.onFocus = this.onFocus.bind(this);
42951      this.onKeyDown = this.onKeyDown.bind(this);
42952      this.selectLink = this.selectLink.bind(this);
42953      this.handleOnClick = this.handleOnClick.bind(this);
42954      this.bindSuggestionNode = this.bindSuggestionNode.bind(this);
42955      this.autocompleteRef = props.autocompleteRef || (0,external_wp_element_namespaceObject.createRef)();
42956      this.inputRef = (0,external_wp_element_namespaceObject.createRef)();
42957      this.updateSuggestions = (0,external_lodash_namespaceObject.debounce)(this.updateSuggestions.bind(this), 200);
42958      this.suggestionNodes = [];
42959      this.isUpdatingSuggestions = false;
42960      this.state = {
42961        suggestions: [],
42962        showSuggestions: false,
42963        selectedSuggestion: null,
42964        suggestionsListboxId: '',
42965        suggestionOptionIdPrefix: ''
42966      };
42967    }
42968  
42969    componentDidUpdate(prevProps) {
42970      const {
42971        showSuggestions,
42972        selectedSuggestion
42973      } = this.state;
42974      const {
42975        value,
42976        __experimentalShowInitialSuggestions = false
42977      } = this.props; // Only have to worry about scrolling selected suggestion into view
42978      // when already expanded.
42979  
42980      if (showSuggestions && selectedSuggestion !== null && this.suggestionNodes[selectedSuggestion] && !this.scrollingIntoView) {
42981        this.scrollingIntoView = true;
42982        lib_default()(this.suggestionNodes[selectedSuggestion], this.autocompleteRef.current, {
42983          onlyScrollIfNeeded: true
42984        });
42985        this.props.setTimeout(() => {
42986          this.scrollingIntoView = false;
42987        }, 100);
42988      } // Update suggestions when the value changes.
42989  
42990  
42991      if (prevProps.value !== value && !this.props.disableSuggestions && !this.isUpdatingSuggestions) {
42992        if (value !== null && value !== void 0 && value.length) {
42993          // If the new value is not empty we need to update with suggestions for it.
42994          this.updateSuggestions(value);
42995        } else if (__experimentalShowInitialSuggestions) {
42996          // If the new value is empty and we can show initial suggestions, then show initial suggestions.
42997          this.updateSuggestions();
42998        }
42999      }
43000    }
43001  
43002    componentDidMount() {
43003      if (this.shouldShowInitialSuggestions()) {
43004        this.updateSuggestions();
43005      }
43006    }
43007  
43008    componentWillUnmount() {
43009      var _this$suggestionsRequ, _this$suggestionsRequ2;
43010  
43011      (_this$suggestionsRequ = this.suggestionsRequest) === null || _this$suggestionsRequ === void 0 ? void 0 : (_this$suggestionsRequ2 = _this$suggestionsRequ.cancel) === null || _this$suggestionsRequ2 === void 0 ? void 0 : _this$suggestionsRequ2.call(_this$suggestionsRequ);
43012      delete this.suggestionsRequest;
43013    }
43014  
43015    bindSuggestionNode(index) {
43016      return ref => {
43017        this.suggestionNodes[index] = ref;
43018      };
43019    }
43020  
43021    shouldShowInitialSuggestions() {
43022      const {
43023        suggestions
43024      } = this.state;
43025      const {
43026        __experimentalShowInitialSuggestions = false,
43027        value
43028      } = this.props;
43029      return !this.isUpdatingSuggestions && __experimentalShowInitialSuggestions && !(value && value.length) && !(suggestions && suggestions.length);
43030    }
43031  
43032    updateSuggestions() {
43033      var _value;
43034  
43035      let value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
43036      const {
43037        __experimentalFetchLinkSuggestions: fetchLinkSuggestions,
43038        __experimentalHandleURLSuggestions: handleURLSuggestions
43039      } = this.props;
43040  
43041      if (!fetchLinkSuggestions) {
43042        return;
43043      } // Initial suggestions may only show if there is no value
43044      // (note: this includes whitespace).
43045  
43046  
43047      const isInitialSuggestions = !((_value = value) !== null && _value !== void 0 && _value.length); // Trim only now we've determined whether or not it originally had a "length"
43048      // (even if that value was all whitespace).
43049  
43050      value = value.trim(); // Allow a suggestions request if:
43051      // - there are at least 2 characters in the search input (except manual searches where
43052      //   search input length is not required to trigger a fetch)
43053      // - this is a direct entry (eg: a URL)
43054  
43055      if (!isInitialSuggestions && (value.length < 2 || !handleURLSuggestions && (0,external_wp_url_namespaceObject.isURL)(value))) {
43056        this.setState({
43057          showSuggestions: false,
43058          selectedSuggestion: null,
43059          loading: false
43060        });
43061        return;
43062      }
43063  
43064      this.isUpdatingSuggestions = true;
43065      this.setState({
43066        selectedSuggestion: null,
43067        loading: true
43068      });
43069      const request = fetchLinkSuggestions(value, {
43070        isInitialSuggestions
43071      });
43072      request.then(suggestions => {
43073        // A fetch Promise doesn't have an abort option. It's mimicked by
43074        // comparing the request reference in on the instance, which is
43075        // reset or deleted on subsequent requests or unmounting.
43076        if (this.suggestionsRequest !== request) {
43077          return;
43078        }
43079  
43080        this.setState({
43081          suggestions,
43082          loading: false,
43083          showSuggestions: !!suggestions.length
43084        });
43085  
43086        if (!!suggestions.length) {
43087          this.props.debouncedSpeak((0,external_wp_i18n_namespaceObject.sprintf)(
43088          /* translators: %s: number of results. */
43089          (0,external_wp_i18n_namespaceObject._n)('%d result found, use up and down arrow keys to navigate.', '%d results found, use up and down arrow keys to navigate.', suggestions.length), suggestions.length), 'assertive');
43090        } else {
43091          this.props.debouncedSpeak((0,external_wp_i18n_namespaceObject.__)('No results.'), 'assertive');
43092        }
43093  
43094        this.isUpdatingSuggestions = false;
43095      }).catch(() => {
43096        if (this.suggestionsRequest === request) {
43097          this.setState({
43098            loading: false
43099          });
43100          this.isUpdatingSuggestions = false;
43101        }
43102      }); // Note that this assignment is handled *before* the async search request
43103      // as a Promise always resolves on the next tick of the event loop.
43104  
43105      this.suggestionsRequest = request;
43106    }
43107  
43108    onChange(event) {
43109      const inputValue = event.target.value;
43110      this.props.onChange(inputValue);
43111  
43112      if (!this.props.disableSuggestions) {
43113        this.updateSuggestions(inputValue);
43114      }
43115    }
43116  
43117    onFocus() {
43118      const {
43119        suggestions
43120      } = this.state;
43121      const {
43122        disableSuggestions,
43123        value
43124      } = this.props; // When opening the link editor, if there's a value present, we want to load the suggestions pane with the results for this input search value
43125      // Don't re-run the suggestions on focus if there are already suggestions present (prevents searching again when tabbing between the input and buttons)
43126  
43127      if (value && !disableSuggestions && !this.isUpdatingSuggestions && !(suggestions && suggestions.length)) {
43128        // Ensure the suggestions are updated with the current input value.
43129        this.updateSuggestions(value);
43130      }
43131    }
43132  
43133    onKeyDown(event) {
43134      const {
43135        showSuggestions,
43136        selectedSuggestion,
43137        suggestions,
43138        loading
43139      } = this.state; // If the suggestions are not shown or loading, we shouldn't handle the arrow keys
43140      // We shouldn't preventDefault to allow block arrow keys navigation.
43141  
43142      if (!showSuggestions || !suggestions.length || loading) {
43143        // In the Windows version of Firefox the up and down arrows don't move the caret
43144        // within an input field like they do for Mac Firefox/Chrome/Safari. This causes
43145        // a form of focus trapping that is disruptive to the user experience. This disruption
43146        // only happens if the caret is not in the first or last position in the text input.
43147        // See: https://github.com/WordPress/gutenberg/issues/5693#issuecomment-436684747
43148        switch (event.keyCode) {
43149          // When UP is pressed, if the caret is at the start of the text, move it to the 0
43150          // position.
43151          case external_wp_keycodes_namespaceObject.UP:
43152            {
43153              if (0 !== event.target.selectionStart) {
43154                event.preventDefault(); // Set the input caret to position 0.
43155  
43156                event.target.setSelectionRange(0, 0);
43157              }
43158  
43159              break;
43160            }
43161          // When DOWN is pressed, if the caret is not at the end of the text, move it to the
43162          // last position.
43163  
43164          case external_wp_keycodes_namespaceObject.DOWN:
43165            {
43166              if (this.props.value.length !== event.target.selectionStart) {
43167                event.preventDefault(); // Set the input caret to the last position.
43168  
43169                event.target.setSelectionRange(this.props.value.length, this.props.value.length);
43170              }
43171  
43172              break;
43173            }
43174          // Submitting while loading should trigger onSubmit.
43175  
43176          case external_wp_keycodes_namespaceObject.ENTER:
43177            {
43178              if (this.props.onSubmit) {
43179                this.props.onSubmit(null, event);
43180              }
43181  
43182              break;
43183            }
43184        }
43185  
43186        return;
43187      }
43188  
43189      const suggestion = this.state.suggestions[this.state.selectedSuggestion];
43190  
43191      switch (event.keyCode) {
43192        case external_wp_keycodes_namespaceObject.UP:
43193          {
43194            event.preventDefault();
43195            const previousIndex = !selectedSuggestion ? suggestions.length - 1 : selectedSuggestion - 1;
43196            this.setState({
43197              selectedSuggestion: previousIndex
43198            });
43199            break;
43200          }
43201  
43202        case external_wp_keycodes_namespaceObject.DOWN:
43203          {
43204            event.preventDefault();
43205            const nextIndex = selectedSuggestion === null || selectedSuggestion === suggestions.length - 1 ? 0 : selectedSuggestion + 1;
43206            this.setState({
43207              selectedSuggestion: nextIndex
43208            });
43209            break;
43210          }
43211  
43212        case external_wp_keycodes_namespaceObject.TAB:
43213          {
43214            if (this.state.selectedSuggestion !== null) {
43215              this.selectLink(suggestion); // Announce a link has been selected when tabbing away from the input field.
43216  
43217              this.props.speak((0,external_wp_i18n_namespaceObject.__)('Link selected.'));
43218            }
43219  
43220            break;
43221          }
43222  
43223        case external_wp_keycodes_namespaceObject.ENTER:
43224          {
43225            if (this.state.selectedSuggestion !== null) {
43226              this.selectLink(suggestion);
43227  
43228              if (this.props.onSubmit) {
43229                this.props.onSubmit(suggestion, event);
43230              }
43231            } else if (this.props.onSubmit) {
43232              this.props.onSubmit(null, event);
43233            }
43234  
43235            break;
43236          }
43237      }
43238    }
43239  
43240    selectLink(suggestion) {
43241      this.props.onChange(suggestion.url, suggestion);
43242      this.setState({
43243        selectedSuggestion: null,
43244        showSuggestions: false
43245      });
43246    }
43247  
43248    handleOnClick(suggestion) {
43249      this.selectLink(suggestion); // Move focus to the input field when a link suggestion is clicked.
43250  
43251      this.inputRef.current.focus();
43252    }
43253  
43254    static getDerivedStateFromProps(_ref, _ref2) {
43255      let {
43256        value,
43257        instanceId,
43258        disableSuggestions,
43259        __experimentalShowInitialSuggestions = false
43260      } = _ref;
43261      let {
43262        showSuggestions
43263      } = _ref2;
43264      let shouldShowSuggestions = showSuggestions;
43265      const hasValue = value && value.length;
43266  
43267      if (!__experimentalShowInitialSuggestions && !hasValue) {
43268        shouldShowSuggestions = false;
43269      }
43270  
43271      if (disableSuggestions === true) {
43272        shouldShowSuggestions = false;
43273      }
43274  
43275      return {
43276        showSuggestions: shouldShowSuggestions,
43277        suggestionsListboxId: `block-editor-url-input-suggestions-$instanceId}`,
43278        suggestionOptionIdPrefix: `block-editor-url-input-suggestion-$instanceId}`
43279      };
43280    }
43281  
43282    render() {
43283      return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, this.renderControl(), this.renderSuggestions());
43284    }
43285  
43286    renderControl() {
43287      const {
43288        label,
43289        className,
43290        isFullWidth,
43291        instanceId,
43292        placeholder = (0,external_wp_i18n_namespaceObject.__)('Paste URL or type to search'),
43293        __experimentalRenderControl: renderControl,
43294        value = ''
43295      } = this.props;
43296      const {
43297        loading,
43298        showSuggestions,
43299        selectedSuggestion,
43300        suggestionsListboxId,
43301        suggestionOptionIdPrefix
43302      } = this.state;
43303      const controlProps = {
43304        id: `url-input-control-$instanceId}`,
43305        label,
43306        className: classnames_default()('block-editor-url-input', className, {
43307          'is-full-width': isFullWidth
43308        })
43309      };
43310      const inputProps = {
43311        value,
43312        required: true,
43313        className: 'block-editor-url-input__input',
43314        type: 'text',
43315        onChange: this.onChange,
43316        onFocus: this.onFocus,
43317        placeholder,
43318        onKeyDown: this.onKeyDown,
43319        role: 'combobox',
43320        'aria-label': (0,external_wp_i18n_namespaceObject.__)('URL'),
43321        'aria-expanded': showSuggestions,
43322        'aria-autocomplete': 'list',
43323        'aria-owns': suggestionsListboxId,
43324        'aria-activedescendant': selectedSuggestion !== null ? `$suggestionOptionIdPrefix}-$selectedSuggestion}` : undefined,
43325        ref: this.inputRef
43326      };
43327  
43328      if (renderControl) {
43329        return renderControl(controlProps, inputProps, loading);
43330      }
43331  
43332      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.BaseControl, controlProps, (0,external_wp_element_namespaceObject.createElement)("input", inputProps), loading && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Spinner, null));
43333    }
43334  
43335    renderSuggestions() {
43336      const {
43337        className,
43338        __experimentalRenderSuggestions: renderSuggestions,
43339        value = '',
43340        __experimentalShowInitialSuggestions = false
43341      } = this.props;
43342      const {
43343        showSuggestions,
43344        suggestions,
43345        selectedSuggestion,
43346        suggestionsListboxId,
43347        suggestionOptionIdPrefix,
43348        loading
43349      } = this.state;
43350      const suggestionsListProps = {
43351        id: suggestionsListboxId,
43352        ref: this.autocompleteRef,
43353        role: 'listbox'
43354      };
43355  
43356      const buildSuggestionItemProps = (suggestion, index) => {
43357        return {
43358          role: 'option',
43359          tabIndex: '-1',
43360          id: `$suggestionOptionIdPrefix}-$index}`,
43361          ref: this.bindSuggestionNode(index),
43362          'aria-selected': index === selectedSuggestion
43363        };
43364      };
43365  
43366      if ((0,external_lodash_namespaceObject.isFunction)(renderSuggestions) && showSuggestions && !!suggestions.length) {
43367        return renderSuggestions({
43368          suggestions,
43369          selectedSuggestion,
43370          suggestionsListProps,
43371          buildSuggestionItemProps,
43372          isLoading: loading,
43373          handleSuggestionClick: this.handleOnClick,
43374          isInitialSuggestions: __experimentalShowInitialSuggestions && !(value && value.length)
43375        });
43376      }
43377  
43378      if (!(0,external_lodash_namespaceObject.isFunction)(renderSuggestions) && showSuggestions && !!suggestions.length) {
43379        return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Popover, {
43380          position: "bottom",
43381          noArrow: true,
43382          focusOnMount: false
43383        }, (0,external_wp_element_namespaceObject.createElement)("div", _extends({}, suggestionsListProps, {
43384          className: classnames_default()('block-editor-url-input__suggestions', `$className}__suggestions`)
43385        }), suggestions.map((suggestion, index) => (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, _extends({}, buildSuggestionItemProps(suggestion, index), {
43386          key: suggestion.id,
43387          className: classnames_default()('block-editor-url-input__suggestion', {
43388            'is-selected': index === selectedSuggestion
43389          }),
43390          onClick: () => this.handleOnClick(suggestion)
43391        }), suggestion.title))));
43392      }
43393  
43394      return null;
43395    }
43396  
43397  }
43398  /**
43399   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/url-input/README.md
43400   */
43401  
43402  
43403  /* harmony default export */ var url_input = ((0,external_wp_compose_namespaceObject.compose)(external_wp_compose_namespaceObject.withSafeTimeout, external_wp_components_namespaceObject.withSpokenMessages, external_wp_compose_namespaceObject.withInstanceId, (0,external_wp_data_namespaceObject.withSelect)((select, props) => {
43404    // If a link suggestions handler is already provided then
43405    // bail.
43406    if ((0,external_lodash_namespaceObject.isFunction)(props.__experimentalFetchLinkSuggestions)) {
43407      return;
43408    }
43409  
43410    const {
43411      getSettings
43412    } = select(store);
43413    return {
43414      __experimentalFetchLinkSuggestions: getSettings().__experimentalFetchLinkSuggestions
43415    };
43416  }))(URLInput));
43417  
43418  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/link-control/search-create-button.js
43419  
43420  
43421  
43422  /**
43423   * External dependencies
43424   */
43425  
43426  
43427  /**
43428   * WordPress dependencies
43429   */
43430  
43431  
43432  
43433  
43434  
43435  const LinkControlSearchCreate = _ref => {
43436    let {
43437      searchTerm,
43438      onClick,
43439      itemProps,
43440      isSelected,
43441      buttonText
43442    } = _ref;
43443  
43444    if (!searchTerm) {
43445      return null;
43446    }
43447  
43448    let text;
43449  
43450    if (buttonText) {
43451      text = (0,external_lodash_namespaceObject.isFunction)(buttonText) ? buttonText(searchTerm) : buttonText;
43452    } else {
43453      text = (0,external_wp_element_namespaceObject.createInterpolateElement)((0,external_wp_i18n_namespaceObject.sprintf)(
43454      /* translators: %s: search term. */
43455      (0,external_wp_i18n_namespaceObject.__)('Create: <mark>%s</mark>'), searchTerm), {
43456        mark: (0,external_wp_element_namespaceObject.createElement)("mark", null)
43457      });
43458    }
43459  
43460    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, _extends({}, itemProps, {
43461      className: classnames_default()('block-editor-link-control__search-create block-editor-link-control__search-item', {
43462        'is-selected': isSelected
43463      }),
43464      onClick: onClick
43465    }), (0,external_wp_element_namespaceObject.createElement)(build_module_icon, {
43466      className: "block-editor-link-control__search-item-icon",
43467      icon: library_plus
43468    }), (0,external_wp_element_namespaceObject.createElement)("span", {
43469      className: "block-editor-link-control__search-item-header"
43470    }, (0,external_wp_element_namespaceObject.createElement)("span", {
43471      className: "block-editor-link-control__search-item-title"
43472    }, text)));
43473  };
43474  /* harmony default export */ var search_create_button = (LinkControlSearchCreate);
43475  
43476  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/globe.js
43477  
43478  
43479  /**
43480   * WordPress dependencies
43481   */
43482  
43483  const globe = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
43484    xmlns: "http://www.w3.org/2000/svg",
43485    viewBox: "0 0 24 24"
43486  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
43487    d: "M12 3.3c-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.8s-4-8.8-8.8-8.8zm6.5 5.5h-2.6C15.4 7.3 14.8 6 14 5c2 .6 3.6 2 4.5 3.8zm.7 3.2c0 .6-.1 1.2-.2 1.8h-2.9c.1-.6.1-1.2.1-1.8s-.1-1.2-.1-1.8H19c.2.6.2 1.2.2 1.8zM12 18.7c-1-.7-1.8-1.9-2.3-3.5h4.6c-.5 1.6-1.3 2.9-2.3 3.5zm-2.6-4.9c-.1-.6-.1-1.1-.1-1.8 0-.6.1-1.2.1-1.8h5.2c.1.6.1 1.1.1 1.8s-.1 1.2-.1 1.8H9.4zM4.8 12c0-.6.1-1.2.2-1.8h2.9c-.1.6-.1 1.2-.1 1.8 0 .6.1 1.2.1 1.8H5c-.2-.6-.2-1.2-.2-1.8zM12 5.3c1 .7 1.8 1.9 2.3 3.5H9.7c.5-1.6 1.3-2.9 2.3-3.5zM10 5c-.8 1-1.4 2.3-1.8 3.8H5.5C6.4 7 8 5.6 10 5zM5.5 15.3h2.6c.4 1.5 1 2.8 1.8 3.7-1.8-.6-3.5-2-4.4-3.7zM14 19c.8-1 1.4-2.2 1.8-3.7h2.6C17.6 17 16 18.4 14 19z"
43488  }));
43489  /* harmony default export */ var library_globe = (globe);
43490  
43491  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/link-control/search-item.js
43492  
43493  
43494  
43495  /**
43496   * External dependencies
43497   */
43498  
43499  /**
43500   * WordPress dependencies
43501   */
43502  
43503  
43504  
43505  
43506  
43507  const LinkControlSearchItem = _ref => {
43508    let {
43509      itemProps,
43510      suggestion,
43511      isSelected = false,
43512      onClick,
43513      isURL = false,
43514      searchTerm = '',
43515      shouldShowType = false
43516    } = _ref;
43517    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, _extends({}, itemProps, {
43518      onClick: onClick,
43519      className: classnames_default()('block-editor-link-control__search-item', {
43520        'is-selected': isSelected,
43521        'is-url': isURL,
43522        'is-entity': !isURL
43523      })
43524    }), isURL && (0,external_wp_element_namespaceObject.createElement)(build_module_icon, {
43525      className: "block-editor-link-control__search-item-icon",
43526      icon: library_globe
43527    }), (0,external_wp_element_namespaceObject.createElement)("span", {
43528      className: "block-editor-link-control__search-item-header"
43529    }, (0,external_wp_element_namespaceObject.createElement)("span", {
43530      className: "block-editor-link-control__search-item-title"
43531    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.TextHighlight, {
43532      text: suggestion.title,
43533      highlight: searchTerm
43534    })), (0,external_wp_element_namespaceObject.createElement)("span", {
43535      "aria-hidden": !isURL,
43536      className: "block-editor-link-control__search-item-info"
43537    }, !isURL && ((0,external_wp_url_namespaceObject.filterURLForDisplay)((0,external_wp_url_namespaceObject.safeDecodeURI)(suggestion.url)) || ''), isURL && (0,external_wp_i18n_namespaceObject.__)('Press ENTER to add this link'))), shouldShowType && suggestion.type && (0,external_wp_element_namespaceObject.createElement)("span", {
43538      className: "block-editor-link-control__search-item-type"
43539    }, getVisualTypeName(suggestion)));
43540  };
43541  
43542  function getVisualTypeName(suggestion) {
43543    if (suggestion.isFrontPage) {
43544      return 'front page';
43545    } // Rename 'post_tag' to 'tag'. Ideally, the API would return the localised CPT or taxonomy label.
43546  
43547  
43548    return suggestion.type === 'post_tag' ? 'tag' : suggestion.type;
43549  }
43550  
43551  /* harmony default export */ var search_item = (LinkControlSearchItem);
43552  
43553  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/link-control/constants.js
43554  /**
43555   * WordPress dependencies
43556   */
43557   // Used as a unique identifier for the "Create" option within search results.
43558  // Used to help distinguish the "Create" suggestion within the search results in
43559  // order to handle it as a unique case.
43560  
43561  const CREATE_TYPE = '__CREATE__';
43562  const DEFAULT_LINK_SETTINGS = [{
43563    id: 'opensInNewTab',
43564    title: (0,external_wp_i18n_namespaceObject.__)('Open in new tab')
43565  }];
43566  
43567  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/link-control/search-results.js
43568  
43569  
43570  /**
43571   * WordPress dependencies
43572   */
43573  
43574  
43575  /**
43576   * External dependencies
43577   */
43578  
43579  
43580  
43581  /**
43582   * Internal dependencies
43583   */
43584  
43585  
43586  
43587  
43588  function LinkControlSearchResults(_ref) {
43589    let {
43590      instanceId,
43591      withCreateSuggestion,
43592      currentInputValue,
43593      handleSuggestionClick,
43594      suggestionsListProps,
43595      buildSuggestionItemProps,
43596      suggestions,
43597      selectedSuggestion,
43598      isLoading,
43599      isInitialSuggestions,
43600      createSuggestionButtonText,
43601      suggestionsQuery
43602    } = _ref;
43603    const resultsListClasses = classnames_default()('block-editor-link-control__search-results', {
43604      'is-loading': isLoading
43605    });
43606    const directLinkEntryTypes = ['url', 'mailto', 'tel', 'internal'];
43607    const isSingleDirectEntryResult = suggestions.length === 1 && directLinkEntryTypes.includes(suggestions[0].type.toLowerCase());
43608    const shouldShowCreateSuggestion = withCreateSuggestion && !isSingleDirectEntryResult && !isInitialSuggestions; // If the query has a specified type, then we can skip showing them in the result. See #24839.
43609  
43610    const shouldShowSuggestionsTypes = !(suggestionsQuery !== null && suggestionsQuery !== void 0 && suggestionsQuery.type); // According to guidelines aria-label should be added if the label
43611    // itself is not visible.
43612    // See: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/listbox_role
43613  
43614    const searchResultsLabelId = `block-editor-link-control-search-results-label-$instanceId}`;
43615    const labelText = isInitialSuggestions ? (0,external_wp_i18n_namespaceObject.__)('Recently updated') : (0,external_wp_i18n_namespaceObject.sprintf)(
43616    /* translators: %s: search term. */
43617    (0,external_wp_i18n_namespaceObject.__)('Search results for "%s"'), currentInputValue); // VisuallyHidden rightly doesn't accept custom classNames
43618    // so we conditionally render it as a wrapper to visually hide the label
43619    // when that is required.
43620  
43621    const searchResultsLabel = (0,external_wp_element_namespaceObject.createElement)(isInitialSuggestions ? external_wp_element_namespaceObject.Fragment : external_wp_components_namespaceObject.VisuallyHidden, {}, // Empty props.
43622    (0,external_wp_element_namespaceObject.createElement)("span", {
43623      className: "block-editor-link-control__search-results-label",
43624      id: searchResultsLabelId
43625    }, labelText));
43626    return (0,external_wp_element_namespaceObject.createElement)("div", {
43627      className: "block-editor-link-control__search-results-wrapper"
43628    }, searchResultsLabel, (0,external_wp_element_namespaceObject.createElement)("div", _extends({}, suggestionsListProps, {
43629      className: resultsListClasses,
43630      "aria-labelledby": searchResultsLabelId
43631    }), suggestions.map((suggestion, index) => {
43632      if (shouldShowCreateSuggestion && CREATE_TYPE === suggestion.type) {
43633        return (0,external_wp_element_namespaceObject.createElement)(search_create_button, {
43634          searchTerm: currentInputValue,
43635          buttonText: createSuggestionButtonText,
43636          onClick: () => handleSuggestionClick(suggestion) // Intentionally only using `type` here as
43637          // the constant is enough to uniquely
43638          // identify the single "CREATE" suggestion.
43639          ,
43640          key: suggestion.type,
43641          itemProps: buildSuggestionItemProps(suggestion, index),
43642          isSelected: index === selectedSuggestion
43643        });
43644      } // If we're not handling "Create" suggestions above then
43645      // we don't want them in the main results so exit early.
43646  
43647  
43648      if (CREATE_TYPE === suggestion.type) {
43649        return null;
43650      }
43651  
43652      return (0,external_wp_element_namespaceObject.createElement)(search_item, {
43653        key: `$suggestion.id}-$suggestion.type}`,
43654        itemProps: buildSuggestionItemProps(suggestion, index),
43655        suggestion: suggestion,
43656        index: index,
43657        onClick: () => {
43658          handleSuggestionClick(suggestion);
43659        },
43660        isSelected: index === selectedSuggestion,
43661        isURL: directLinkEntryTypes.includes(suggestion.type.toLowerCase()),
43662        searchTerm: currentInputValue,
43663        shouldShowType: shouldShowSuggestionsTypes,
43664        isFrontPage: suggestion === null || suggestion === void 0 ? void 0 : suggestion.isFrontPage
43665      });
43666    })));
43667  }
43668  
43669  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/link-control/is-url-like.js
43670  /**
43671   * External dependencies
43672   */
43673  
43674  /**
43675   * WordPress dependencies
43676   */
43677  
43678  
43679  /**
43680   * Determines whether a given value could be a URL. Note this does not
43681   * guarantee the value is a URL only that it looks like it might be one. For
43682   * example, just because a string has `www.` in it doesn't make it a URL,
43683   * but it does make it highly likely that it will be so in the context of
43684   * creating a link it makes sense to treat it like one.
43685   *
43686   * @param {string} val the candidate for being URL-like (or not).
43687   *
43688   * @return {boolean} whether or not the value is potentially a URL.
43689   */
43690  
43691  function isURLLike(val) {
43692    const isInternal = (0,external_lodash_namespaceObject.startsWith)(val, '#');
43693    return (0,external_wp_url_namespaceObject.isURL)(val) || val && val.includes('www.') || isInternal;
43694  }
43695  
43696  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/link-control/use-search-handler.js
43697  /**
43698   * WordPress dependencies
43699   */
43700  
43701  
43702  
43703  /**
43704   * External dependencies
43705   */
43706  
43707  
43708  /**
43709   * Internal dependencies
43710   */
43711  
43712  
43713  
43714  
43715  const handleNoop = () => Promise.resolve([]);
43716  const handleDirectEntry = val => {
43717    let type = 'URL';
43718    const protocol = (0,external_wp_url_namespaceObject.getProtocol)(val) || '';
43719  
43720    if (protocol.includes('mailto')) {
43721      type = 'mailto';
43722    }
43723  
43724    if (protocol.includes('tel')) {
43725      type = 'tel';
43726    }
43727  
43728    if ((0,external_lodash_namespaceObject.startsWith)(val, '#')) {
43729      type = 'internal';
43730    }
43731  
43732    return Promise.resolve([{
43733      id: val,
43734      title: val,
43735      url: type === 'URL' ? (0,external_wp_url_namespaceObject.prependHTTP)(val) : val,
43736      type
43737    }]);
43738  };
43739  
43740  const handleEntitySearch = async (val, suggestionsQuery, fetchSearchSuggestions, directEntryHandler, withCreateSuggestion, withURLSuggestion, pageOnFront) => {
43741    const {
43742      isInitialSuggestions
43743    } = suggestionsQuery;
43744    let resultsIncludeFrontPage = false;
43745    let results = await Promise.all([fetchSearchSuggestions(val, suggestionsQuery), directEntryHandler(val)]); // Identify front page and update type to match.
43746  
43747    results[0] = results[0].map(result => {
43748      if (Number(result.id) === pageOnFront) {
43749        resultsIncludeFrontPage = true;
43750        result.isFrontPage = true;
43751        return result;
43752      }
43753  
43754      return result;
43755    });
43756    const couldBeURL = !val.includes(' '); // If it's potentially a URL search then concat on a URL search suggestion
43757    // just for good measure. That way once the actual results run out we always
43758    // have a URL option to fallback on.
43759  
43760    if (!resultsIncludeFrontPage && couldBeURL && withURLSuggestion && !isInitialSuggestions) {
43761      results = results[0].concat(results[1]);
43762    } else {
43763      results = results[0];
43764    } // If displaying initial suggestions just return plain results.
43765  
43766  
43767    if (isInitialSuggestions) {
43768      return results;
43769    } // Here we append a faux suggestion to represent a "CREATE" option. This
43770    // is detected in the rendering of the search results and handled as a
43771    // special case. This is currently necessary because the suggestions
43772    // dropdown will only appear if there are valid suggestions and
43773    // therefore unless the create option is a suggestion it will not
43774    // display in scenarios where there are no results returned from the
43775    // API. In addition promoting CREATE to a first class suggestion affords
43776    // the a11y benefits afforded by `URLInput` to all suggestions (eg:
43777    // keyboard handling, ARIA roles...etc).
43778    //
43779    // Note also that the value of the `title` and `url` properties must correspond
43780    // to the text value of the `<input>`. This is because `title` is used
43781    // when creating the suggestion. Similarly `url` is used when using keyboard to select
43782    // the suggestion (the <form> `onSubmit` handler falls-back to `url`).
43783  
43784  
43785    return isURLLike(val) || !withCreateSuggestion ? results : results.concat({
43786      // the `id` prop is intentionally ommitted here because it
43787      // is never exposed as part of the component's public API.
43788      // see: https://github.com/WordPress/gutenberg/pull/19775#discussion_r378931316.
43789      title: val,
43790      // Must match the existing `<input>`s text value.
43791      url: val,
43792      // Must match the existing `<input>`s text value.
43793      type: CREATE_TYPE
43794    });
43795  };
43796  
43797  function useSearchHandler(suggestionsQuery, allowDirectEntry, withCreateSuggestion, withURLSuggestion) {
43798    const {
43799      fetchSearchSuggestions,
43800      pageOnFront
43801    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
43802      const {
43803        getSettings
43804      } = select(store);
43805      return {
43806        pageOnFront: getSettings().pageOnFront,
43807        fetchSearchSuggestions: getSettings().__experimentalFetchLinkSuggestions
43808      };
43809    }, []);
43810    const directEntryHandler = allowDirectEntry ? handleDirectEntry : handleNoop;
43811    return (0,external_wp_element_namespaceObject.useCallback)((val, _ref) => {
43812      let {
43813        isInitialSuggestions
43814      } = _ref;
43815      return isURLLike(val) ? directEntryHandler(val, {
43816        isInitialSuggestions
43817      }) : handleEntitySearch(val, { ...suggestionsQuery,
43818        isInitialSuggestions
43819      }, fetchSearchSuggestions, directEntryHandler, withCreateSuggestion, withURLSuggestion, pageOnFront);
43820    }, [directEntryHandler, fetchSearchSuggestions, withCreateSuggestion]);
43821  }
43822  
43823  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/link-control/search-input.js
43824  
43825  
43826  /**
43827   * External dependencies
43828   */
43829  
43830  
43831  /**
43832   * WordPress dependencies
43833   */
43834  
43835  
43836  
43837  
43838  /**
43839   * Internal dependencies
43840   */
43841  
43842  
43843  
43844  
43845   // Must be a function as otherwise URLInput will default
43846  // to the fetchLinkSuggestions passed in block editor settings
43847  // which will cause an unintended http request.
43848  
43849  const noopSearchHandler = () => Promise.resolve([]);
43850  
43851  const LinkControlSearchInput = (0,external_wp_element_namespaceObject.forwardRef)((_ref, ref) => {
43852    let {
43853      value,
43854      children,
43855      currentLink = {},
43856      className = null,
43857      placeholder = null,
43858      withCreateSuggestion = false,
43859      onCreateSuggestion = external_lodash_namespaceObject.noop,
43860      onChange = external_lodash_namespaceObject.noop,
43861      onSelect = external_lodash_namespaceObject.noop,
43862      showSuggestions = true,
43863      renderSuggestions = props => (0,external_wp_element_namespaceObject.createElement)(LinkControlSearchResults, props),
43864      fetchSuggestions = null,
43865      allowDirectEntry = true,
43866      showInitialSuggestions = false,
43867      suggestionsQuery = {},
43868      withURLSuggestion = true,
43869      createSuggestionButtonText,
43870      useLabel = false
43871    } = _ref;
43872    const genericSearchHandler = useSearchHandler(suggestionsQuery, allowDirectEntry, withCreateSuggestion, withURLSuggestion);
43873    const searchHandler = showSuggestions ? fetchSuggestions || genericSearchHandler : noopSearchHandler;
43874    const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(LinkControlSearchInput);
43875    const [focusedSuggestion, setFocusedSuggestion] = (0,external_wp_element_namespaceObject.useState)();
43876    /**
43877     * Handles the user moving between different suggestions. Does not handle
43878     * choosing an individual item.
43879     *
43880     * @param {string} selection  the url of the selected suggestion.
43881     * @param {Object} suggestion the suggestion object.
43882     */
43883  
43884    const onInputChange = (selection, suggestion) => {
43885      onChange(selection);
43886      setFocusedSuggestion(suggestion);
43887    };
43888  
43889    const handleRenderSuggestions = props => renderSuggestions({ ...props,
43890      instanceId,
43891      withCreateSuggestion,
43892      currentInputValue: value,
43893      createSuggestionButtonText,
43894      suggestionsQuery,
43895      handleSuggestionClick: suggestion => {
43896        if (props.handleSuggestionClick) {
43897          props.handleSuggestionClick(suggestion);
43898        }
43899  
43900        onSuggestionSelected(suggestion);
43901      }
43902    });
43903  
43904    const onSuggestionSelected = async selectedSuggestion => {
43905      let suggestion = selectedSuggestion;
43906  
43907      if (CREATE_TYPE === selectedSuggestion.type) {
43908        // Create a new page and call onSelect with the output from the onCreateSuggestion callback.
43909        try {
43910          var _suggestion;
43911  
43912          suggestion = await onCreateSuggestion(selectedSuggestion.title);
43913  
43914          if ((_suggestion = suggestion) !== null && _suggestion !== void 0 && _suggestion.url) {
43915            onSelect(suggestion);
43916          }
43917        } catch (e) {}
43918  
43919        return;
43920      }
43921  
43922      if (allowDirectEntry || suggestion && Object.keys(suggestion).length >= 1) {
43923        onSelect( // Some direct entries don't have types or IDs, and we still need to clear the previous ones.
43924        { ...(0,external_lodash_namespaceObject.omit)(currentLink, 'id', 'url'),
43925          ...suggestion
43926        }, suggestion);
43927      }
43928    };
43929  
43930    const inputClasses = classnames_default()(className, {
43931      'has-no-label': !useLabel
43932    });
43933    return (0,external_wp_element_namespaceObject.createElement)("div", {
43934      className: "block-editor-link-control__search-input-container"
43935    }, (0,external_wp_element_namespaceObject.createElement)(url_input, {
43936      label: useLabel ? 'URL' : undefined,
43937      className: inputClasses,
43938      value: value,
43939      onChange: onInputChange,
43940      placeholder: placeholder !== null && placeholder !== void 0 ? placeholder : (0,external_wp_i18n_namespaceObject.__)('Search or type url'),
43941      __experimentalRenderSuggestions: showSuggestions ? handleRenderSuggestions : null,
43942      __experimentalFetchLinkSuggestions: searchHandler,
43943      __experimentalHandleURLSuggestions: true,
43944      __experimentalShowInitialSuggestions: showInitialSuggestions,
43945      onSubmit: (suggestion, event) => {
43946        var _value$trim;
43947  
43948        const hasSuggestion = suggestion || focusedSuggestion; // If there is no suggestion and the value (ie: any manually entered URL) is empty
43949        // then don't allow submission otherwise we get empty links.
43950  
43951        if (!hasSuggestion && !(value !== null && value !== void 0 && (_value$trim = value.trim()) !== null && _value$trim !== void 0 && _value$trim.length)) {
43952          event.preventDefault();
43953        } else {
43954          onSuggestionSelected(hasSuggestion || {
43955            url: value
43956          });
43957        }
43958      },
43959      ref: ref
43960    }), children);
43961  });
43962  /* harmony default export */ var search_input = (LinkControlSearchInput);
43963  
43964  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/info.js
43965  
43966  
43967  /**
43968   * WordPress dependencies
43969   */
43970  
43971  const info = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
43972    xmlns: "http://www.w3.org/2000/svg",
43973    viewBox: "0 0 24 24"
43974  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
43975    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"
43976  }));
43977  /* harmony default export */ var library_info = (info);
43978  
43979  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/pencil.js
43980  
43981  
43982  /**
43983   * WordPress dependencies
43984   */
43985  
43986  const pencil = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
43987    xmlns: "http://www.w3.org/2000/svg",
43988    viewBox: "0 0 24 24"
43989  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
43990    d: "M20.1 5.1L16.9 2 6.2 12.7l-1.3 4.4 4.5-1.3L20.1 5.1zM4 20.8h8v-1.5H4v1.5z"
43991  }));
43992  /* harmony default export */ var library_pencil = (pencil);
43993  
43994  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/edit.js
43995  /**
43996   * Internal dependencies
43997   */
43998  
43999  /* harmony default export */ var library_edit = (library_pencil);
44000  
44001  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/link-control/viewer-slot.js
44002  /**
44003   * WordPress dependencies
44004   */
44005  
44006  const {
44007    Slot: ViewerSlot,
44008    Fill: ViewerFill
44009  } = (0,external_wp_components_namespaceObject.createSlotFill)('BlockEditorLinkControlViewer');
44010  
44011  /* harmony default export */ var viewer_slot = ((/* unused pure expression or super */ null && (ViewerSlot)));
44012  
44013  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/link-control/use-rich-url-data.js
44014  /**
44015   * Internal dependencies
44016   */
44017  
44018  /**
44019   * WordPress dependencies
44020   */
44021  
44022  
44023  
44024  
44025  function use_rich_url_data_reducer(state, action) {
44026    switch (action.type) {
44027      case 'RESOLVED':
44028        return { ...state,
44029          isFetching: false,
44030          richData: action.richData
44031        };
44032  
44033      case 'ERROR':
44034        return { ...state,
44035          isFetching: false,
44036          richData: null
44037        };
44038  
44039      case 'LOADING':
44040        return { ...state,
44041          isFetching: true
44042        };
44043  
44044      default:
44045        throw new Error(`Unexpected action type $action.type}`);
44046    }
44047  }
44048  
44049  function useRemoteUrlData(url) {
44050    const [state, dispatch] = (0,external_wp_element_namespaceObject.useReducer)(use_rich_url_data_reducer, {
44051      richData: null,
44052      isFetching: false
44053    });
44054    const {
44055      fetchRichUrlData
44056    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
44057      const {
44058        getSettings
44059      } = select(store);
44060      return {
44061        fetchRichUrlData: getSettings().__experimentalFetchRichUrlData
44062      };
44063    }, []);
44064    (0,external_wp_element_namespaceObject.useEffect)(() => {
44065      // Only make the request if we have an actual URL
44066      // and the fetching util is available. In some editors
44067      // there may not be such a util.
44068      if (url !== null && url !== void 0 && url.length && fetchRichUrlData && typeof AbortController !== 'undefined') {
44069        dispatch({
44070          type: 'LOADING'
44071        });
44072        const controller = new window.AbortController();
44073        const signal = controller.signal;
44074        fetchRichUrlData(url, {
44075          signal
44076        }).then(urlData => {
44077          dispatch({
44078            type: 'RESOLVED',
44079            richData: urlData
44080          });
44081        }).catch(() => {
44082          // Avoid setting state on unmounted component
44083          if (!signal.aborted) {
44084            dispatch({
44085              type: 'ERROR'
44086            });
44087          }
44088        }); // Cleanup: when the URL changes the abort the current request.
44089  
44090        return () => {
44091          controller.abort();
44092        };
44093      }
44094    }, [url]);
44095    return state;
44096  }
44097  
44098  /* harmony default export */ var use_rich_url_data = (useRemoteUrlData);
44099  
44100  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/link-control/link-preview.js
44101  
44102  
44103  /**
44104   * External dependencies
44105   */
44106  
44107  /**
44108   * WordPress dependencies
44109   */
44110  
44111  
44112  
44113  
44114  
44115  
44116  /**
44117   * Internal dependencies
44118   */
44119  
44120  
44121  
44122  function LinkPreview(_ref) {
44123    var _value$url;
44124  
44125    let {
44126      value,
44127      onEditClick,
44128      hasRichPreviews = false,
44129      hasUnlinkControl = false,
44130      onRemove
44131    } = _ref;
44132    // Avoid fetching if rich previews are not desired.
44133    const showRichPreviews = hasRichPreviews ? value === null || value === void 0 ? void 0 : value.url : null;
44134    const {
44135      richData,
44136      isFetching
44137    } = use_rich_url_data(showRichPreviews); // Rich data may be an empty object so test for that.
44138  
44139    const hasRichData = richData && Object.keys(richData).length;
44140    const displayURL = value && (0,external_wp_url_namespaceObject.filterURLForDisplay)((0,external_wp_url_namespaceObject.safeDecodeURI)(value.url), 16) || '';
44141    const displayTitle = (richData === null || richData === void 0 ? void 0 : richData.title) || (value === null || value === void 0 ? void 0 : value.title) || displayURL; // url can be undefined if the href attribute is unset
44142  
44143    const isEmptyURL = !(value !== null && value !== void 0 && (_value$url = value.url) !== null && _value$url !== void 0 && _value$url.length);
44144    let icon;
44145  
44146    if (richData !== null && richData !== void 0 && richData.icon) {
44147      icon = (0,external_wp_element_namespaceObject.createElement)("img", {
44148        src: richData === null || richData === void 0 ? void 0 : richData.icon,
44149        alt: ""
44150      });
44151    } else if (isEmptyURL) {
44152      icon = (0,external_wp_element_namespaceObject.createElement)(build_module_icon, {
44153        icon: library_info,
44154        size: 32
44155      });
44156    } else {
44157      icon = (0,external_wp_element_namespaceObject.createElement)(build_module_icon, {
44158        icon: library_globe
44159      });
44160    }
44161  
44162    return (0,external_wp_element_namespaceObject.createElement)("div", {
44163      "aria-label": (0,external_wp_i18n_namespaceObject.__)('Currently selected'),
44164      "aria-selected": "true",
44165      className: classnames_default()('block-editor-link-control__search-item', {
44166        'is-current': true,
44167        'is-rich': hasRichData,
44168        'is-fetching': !!isFetching,
44169        'is-preview': true,
44170        'is-error': isEmptyURL
44171      })
44172    }, (0,external_wp_element_namespaceObject.createElement)("div", {
44173      className: "block-editor-link-control__search-item-top"
44174    }, (0,external_wp_element_namespaceObject.createElement)("span", {
44175      className: "block-editor-link-control__search-item-header"
44176    }, (0,external_wp_element_namespaceObject.createElement)("span", {
44177      className: classnames_default()('block-editor-link-control__search-item-icon', {
44178        'is-image': richData === null || richData === void 0 ? void 0 : richData.icon
44179      })
44180    }, icon), (0,external_wp_element_namespaceObject.createElement)("span", {
44181      className: "block-editor-link-control__search-item-details"
44182    }, !isEmptyURL ? (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ExternalLink, {
44183      className: "block-editor-link-control__search-item-title",
44184      href: value.url
44185    }, (0,external_wp_dom_namespaceObject.__unstableStripHTML)(displayTitle)), (value === null || value === void 0 ? void 0 : value.url) && (0,external_wp_element_namespaceObject.createElement)("span", {
44186      className: "block-editor-link-control__search-item-info"
44187    }, displayURL)) : (0,external_wp_element_namespaceObject.createElement)("span", {
44188      className: "block-editor-link-control__search-item-error-notice"
44189    }, (0,external_wp_i18n_namespaceObject.__)('Link is empty')))), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
44190      icon: library_edit,
44191      label: (0,external_wp_i18n_namespaceObject.__)('Edit'),
44192      className: "block-editor-link-control__search-item-action",
44193      onClick: onEditClick,
44194      iconSize: 24
44195    }), hasUnlinkControl && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
44196      icon: link_off,
44197      label: (0,external_wp_i18n_namespaceObject.__)('Unlink'),
44198      className: "block-editor-link-control__search-item-action block-editor-link-control__unlink",
44199      onClick: onRemove,
44200      iconSize: 24
44201    }), (0,external_wp_element_namespaceObject.createElement)(ViewerSlot, {
44202      fillProps: value
44203    })), (hasRichData && ((richData === null || richData === void 0 ? void 0 : richData.image) || (richData === null || richData === void 0 ? void 0 : richData.description)) || isFetching) && (0,external_wp_element_namespaceObject.createElement)("div", {
44204      className: "block-editor-link-control__search-item-bottom"
44205    }, ((richData === null || richData === void 0 ? void 0 : richData.image) || isFetching) && (0,external_wp_element_namespaceObject.createElement)("div", {
44206      "aria-hidden": !(richData !== null && richData !== void 0 && richData.image),
44207      className: classnames_default()('block-editor-link-control__search-item-image', {
44208        'is-placeholder': !(richData !== null && richData !== void 0 && richData.image)
44209      })
44210    }, (richData === null || richData === void 0 ? void 0 : richData.image) && (0,external_wp_element_namespaceObject.createElement)("img", {
44211      src: richData === null || richData === void 0 ? void 0 : richData.image,
44212      alt: ""
44213    })), ((richData === null || richData === void 0 ? void 0 : richData.description) || isFetching) && (0,external_wp_element_namespaceObject.createElement)("div", {
44214      "aria-hidden": !(richData !== null && richData !== void 0 && richData.description),
44215      className: classnames_default()('block-editor-link-control__search-item-description', {
44216        'is-placeholder': !(richData !== null && richData !== void 0 && richData.description)
44217      })
44218    }, (richData === null || richData === void 0 ? void 0 : richData.description) && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalText, {
44219      truncate: true,
44220      numberOfLines: "2"
44221    }, richData.description))));
44222  }
44223  
44224  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/link-control/use-create-page.js
44225  /**
44226   * WordPress dependencies
44227   */
44228  
44229  
44230  function useCreatePage(handleCreatePage) {
44231    const cancelableCreateSuggestion = (0,external_wp_element_namespaceObject.useRef)();
44232    const [isCreatingPage, setIsCreatingPage] = (0,external_wp_element_namespaceObject.useState)(false);
44233    const [errorMessage, setErrorMessage] = (0,external_wp_element_namespaceObject.useState)(null);
44234  
44235    const createPage = async function (suggestionTitle) {
44236      setIsCreatingPage(true);
44237      setErrorMessage(null);
44238  
44239      try {
44240        // Make cancellable in order that we can avoid setting State
44241        // if the component unmounts during the call to `createSuggestion`
44242        cancelableCreateSuggestion.current = makeCancelable( // Using Promise.resolve to allow createSuggestion to return a
44243        // non-Promise based value.
44244        Promise.resolve(handleCreatePage(suggestionTitle)));
44245        return await cancelableCreateSuggestion.current.promise;
44246      } catch (error) {
44247        if (error && error.isCanceled) {
44248          return; // bail if canceled to avoid setting state
44249        }
44250  
44251        setErrorMessage(error.message || (0,external_wp_i18n_namespaceObject.__)('An unknown error occurred during creation. Please try again.'));
44252        throw error;
44253      } finally {
44254        setIsCreatingPage(false);
44255      }
44256    };
44257    /**
44258     * Handles cancelling any pending Promises that have been made cancelable.
44259     */
44260  
44261  
44262    (0,external_wp_element_namespaceObject.useEffect)(() => {
44263      return () => {
44264        // componentDidUnmount
44265        if (cancelableCreateSuggestion.current) {
44266          cancelableCreateSuggestion.current.cancel();
44267        }
44268      };
44269    }, []);
44270    return {
44271      createPage,
44272      isCreatingPage,
44273      errorMessage
44274    };
44275  }
44276  /**
44277   * Creates a wrapper around a promise which allows it to be programmatically
44278   * cancelled.
44279   * See: https://reactjs.org/blog/2015/12/16/ismounted-antipattern.html
44280   *
44281   * @param {Promise} promise the Promise to make cancelable
44282   */
44283  
44284  const makeCancelable = promise => {
44285    let hasCanceled_ = false;
44286    const wrappedPromise = new Promise((resolve, reject) => {
44287      promise.then(val => hasCanceled_ ? reject({
44288        isCanceled: true
44289      }) : resolve(val), error => hasCanceled_ ? reject({
44290        isCanceled: true
44291      }) : reject(error));
44292    });
44293    return {
44294      promise: wrappedPromise,
44295  
44296      cancel() {
44297        hasCanceled_ = true;
44298      }
44299  
44300    };
44301  };
44302  
44303  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/link-control/index.js
44304  
44305  
44306  /**
44307   * External dependencies
44308   */
44309  
44310  
44311  /**
44312   * WordPress dependencies
44313   */
44314  
44315  
44316  
44317  
44318  
44319  
44320  
44321  /**
44322   * Internal dependencies
44323   */
44324  
44325  
44326  
44327  
44328  
44329  
44330  
44331  /**
44332   * Default properties associated with a link control value.
44333   *
44334   * @typedef WPLinkControlDefaultValue
44335   *
44336   * @property {string}   url           Link URL.
44337   * @property {string=}  title         Link title.
44338   * @property {boolean=} opensInNewTab Whether link should open in a new browser
44339   *                                    tab. This value is only assigned if not
44340   *                                    providing a custom `settings` prop.
44341   */
44342  
44343  /* eslint-disable jsdoc/valid-types */
44344  
44345  /**
44346   * Custom settings values associated with a link.
44347   *
44348   * @typedef {{[setting:string]:any}} WPLinkControlSettingsValue
44349   */
44350  
44351  /* eslint-enable */
44352  
44353  /**
44354   * Custom settings values associated with a link.
44355   *
44356   * @typedef WPLinkControlSetting
44357   *
44358   * @property {string} id    Identifier to use as property for setting value.
44359   * @property {string} title Human-readable label to show in user interface.
44360   */
44361  
44362  /**
44363   * Properties associated with a link control value, composed as a union of the
44364   * default properties and any custom settings values.
44365   *
44366   * @typedef {WPLinkControlDefaultValue&WPLinkControlSettingsValue} WPLinkControlValue
44367   */
44368  
44369  /** @typedef {(nextValue:WPLinkControlValue)=>void} WPLinkControlOnChangeProp */
44370  
44371  /**
44372   * Properties associated with a search suggestion used within the LinkControl.
44373   *
44374   * @typedef WPLinkControlSuggestion
44375   *
44376   * @property {string} id    Identifier to use to uniquely identify the suggestion.
44377   * @property {string} type  Identifies the type of the suggestion (eg: `post`,
44378   *                          `page`, `url`...etc)
44379   * @property {string} title Human-readable label to show in user interface.
44380   * @property {string} url   A URL for the suggestion.
44381   */
44382  
44383  /** @typedef {(title:string)=>WPLinkControlSuggestion} WPLinkControlCreateSuggestionProp */
44384  
44385  /**
44386   * @typedef WPLinkControlProps
44387   *
44388   * @property {(WPLinkControlSetting[])=}  settings                   An array of settings objects. Each object will used to
44389   *                                                                   render a `ToggleControl` for that setting.
44390   * @property {boolean=}                   forceIsEditingLink         If passed as either `true` or `false`, controls the
44391   *                                                                   internal editing state of the component to respective
44392   *                                                                   show or not show the URL input field.
44393   * @property {WPLinkControlValue=}        value                      Current link value.
44394   * @property {WPLinkControlOnChangeProp=} onChange                   Value change handler, called with the updated value if
44395   *                                                                   the user selects a new link or updates settings.
44396   * @property {boolean=}                   noDirectEntry              Whether to allow turning a URL-like search query directly into a link.
44397   * @property {boolean=}                   showSuggestions            Whether to present suggestions when typing the URL.
44398   * @property {boolean=}                   showInitialSuggestions     Whether to present initial suggestions immediately.
44399   * @property {boolean=}                   withCreateSuggestion       Whether to allow creation of link value from suggestion.
44400   * @property {Object=}                    suggestionsQuery           Query parameters to pass along to wp.blockEditor.__experimentalFetchLinkSuggestions.
44401   * @property {boolean=}                   noURLSuggestion            Whether to add a fallback suggestion which treats the search query as a URL.
44402   * @property {string|Function|undefined}  createSuggestionButtonText The text to use in the button that calls createSuggestion.
44403   * @property {Function}                   renderControlBottom        Optional controls to be rendered at the bottom of the component.
44404   */
44405  
44406  /**
44407   * Renders a link control. A link control is a controlled input which maintains
44408   * a value associated with a link (HTML anchor element) and relevant settings
44409   * for how that link is expected to behave.
44410   *
44411   * @param {WPLinkControlProps} props Component props.
44412   */
44413  
44414  function LinkControl(_ref) {
44415    var _currentInputValue$tr, _value$url, _value$url$trim;
44416  
44417    let {
44418      searchInputPlaceholder,
44419      value,
44420      settings = DEFAULT_LINK_SETTINGS,
44421      onChange = external_lodash_namespaceObject.noop,
44422      onRemove,
44423      noDirectEntry = false,
44424      showSuggestions = true,
44425      showInitialSuggestions,
44426      forceIsEditingLink,
44427      createSuggestion,
44428      withCreateSuggestion,
44429      inputValue: propInputValue = '',
44430      suggestionsQuery = {},
44431      noURLSuggestion = false,
44432      createSuggestionButtonText,
44433      hasRichPreviews = false,
44434      hasTextControl = false,
44435      renderControlBottom = null
44436    } = _ref;
44437  
44438    if (withCreateSuggestion === undefined && createSuggestion) {
44439      withCreateSuggestion = true;
44440    }
44441  
44442    const isMounting = (0,external_wp_element_namespaceObject.useRef)(true);
44443    const wrapperNode = (0,external_wp_element_namespaceObject.useRef)();
44444    const textInputRef = (0,external_wp_element_namespaceObject.useRef)();
44445    const [internalInputValue, setInternalInputValue] = (0,external_wp_element_namespaceObject.useState)((value === null || value === void 0 ? void 0 : value.url) || '');
44446    const [internalTextValue, setInternalTextValue] = (0,external_wp_element_namespaceObject.useState)((value === null || value === void 0 ? void 0 : value.title) || '');
44447    const currentInputValue = propInputValue || internalInputValue;
44448    const [isEditingLink, setIsEditingLink] = (0,external_wp_element_namespaceObject.useState)(forceIsEditingLink !== undefined ? forceIsEditingLink : !value || !value.url);
44449    const isEndingEditWithFocus = (0,external_wp_element_namespaceObject.useRef)(false);
44450    const currentInputIsEmpty = !(currentInputValue !== null && currentInputValue !== void 0 && (_currentInputValue$tr = currentInputValue.trim()) !== null && _currentInputValue$tr !== void 0 && _currentInputValue$tr.length);
44451    const {
44452      createPage,
44453      isCreatingPage,
44454      errorMessage
44455    } = useCreatePage(createSuggestion);
44456    (0,external_wp_element_namespaceObject.useEffect)(() => {
44457      if (forceIsEditingLink !== undefined && forceIsEditingLink !== isEditingLink) {
44458        setIsEditingLink(forceIsEditingLink);
44459      }
44460    }, [forceIsEditingLink]);
44461    (0,external_wp_element_namespaceObject.useEffect)(() => {
44462      // We don't auto focus into the Link UI on mount
44463      // because otherwise using the keyboard to select text
44464      // *within* the link format is not possible.
44465      if (isMounting.current) {
44466        isMounting.current = false;
44467        return;
44468      } // Unless we are mounting, we always want to focus either:
44469      // - the URL input
44470      // - the first focusable element in the Link UI.
44471      // But in editing mode if there is a text input present then
44472      // the URL input is at index 1. If not then it is at index 0.
44473  
44474  
44475      const whichFocusTargetIndex = textInputRef !== null && textInputRef !== void 0 && textInputRef.current ? 1 : 0; // Scenario - when:
44476      // - switching between editable and non editable LinkControl
44477      // - clicking on a link
44478      // ...then move focus to the *first* element to avoid focus loss
44479      // and to ensure focus is *within* the Link UI.
44480  
44481      const nextFocusTarget = external_wp_dom_namespaceObject.focus.focusable.find(wrapperNode.current)[whichFocusTargetIndex] || wrapperNode.current;
44482      nextFocusTarget.focus();
44483      isEndingEditWithFocus.current = false;
44484    }, [isEditingLink, isCreatingPage]);
44485    (0,external_wp_element_namespaceObject.useEffect)(() => {
44486      /**
44487       * If the value's `text` property changes then sync this
44488       * back up with state.
44489       */
44490      if (value !== null && value !== void 0 && value.title && value.title !== internalTextValue) {
44491        setInternalTextValue(value.title);
44492      }
44493      /**
44494       * Update the state value internalInputValue if the url value changes
44495       * for example when clicking on another anchor
44496       */
44497  
44498  
44499      if (value !== null && value !== void 0 && value.url) {
44500        setInternalInputValue(value.url);
44501      }
44502    }, [value]);
44503    /**
44504     * Cancels editing state and marks that focus may need to be restored after
44505     * the next render, if focus was within the wrapper when editing finished.
44506     */
44507  
44508    function stopEditing() {
44509      var _wrapperNode$current;
44510  
44511      isEndingEditWithFocus.current = !!((_wrapperNode$current = wrapperNode.current) !== null && _wrapperNode$current !== void 0 && _wrapperNode$current.contains(wrapperNode.current.ownerDocument.activeElement));
44512      setIsEditingLink(false);
44513    }
44514  
44515    const handleSelectSuggestion = updatedValue => {
44516      onChange({ ...updatedValue,
44517        title: internalTextValue || (updatedValue === null || updatedValue === void 0 ? void 0 : updatedValue.title)
44518      });
44519      stopEditing();
44520    };
44521  
44522    const handleSubmit = () => {
44523      if (currentInputValue !== (value === null || value === void 0 ? void 0 : value.url) || internalTextValue !== (value === null || value === void 0 ? void 0 : value.title)) {
44524        onChange({
44525          url: currentInputValue,
44526          title: internalTextValue
44527        });
44528      }
44529  
44530      stopEditing();
44531    };
44532  
44533    const handleSubmitWithEnter = event => {
44534      const {
44535        keyCode
44536      } = event;
44537  
44538      if (keyCode === external_wp_keycodes_namespaceObject.ENTER && !currentInputIsEmpty // Disallow submitting empty values.
44539      ) {
44540        event.preventDefault();
44541        handleSubmit();
44542      }
44543    };
44544  
44545    const shownUnlinkControl = onRemove && value && !isEditingLink && !isCreatingPage;
44546    const showSettingsDrawer = !!(settings !== null && settings !== void 0 && settings.length); // Only show text control once a URL value has been committed
44547    // and it isn't just empty whitespace.
44548    // See https://github.com/WordPress/gutenberg/pull/33849/#issuecomment-932194927.
44549  
44550    const showTextControl = (value === null || value === void 0 ? void 0 : (_value$url = value.url) === null || _value$url === void 0 ? void 0 : (_value$url$trim = _value$url.trim()) === null || _value$url$trim === void 0 ? void 0 : _value$url$trim.length) > 0 && hasTextControl;
44551    return (0,external_wp_element_namespaceObject.createElement)("div", {
44552      tabIndex: -1,
44553      ref: wrapperNode,
44554      className: "block-editor-link-control"
44555    }, isCreatingPage && (0,external_wp_element_namespaceObject.createElement)("div", {
44556      className: "block-editor-link-control__loading"
44557    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Spinner, null), " ", (0,external_wp_i18n_namespaceObject.__)('Creating'), "\u2026"), (isEditingLink || !value) && !isCreatingPage && (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)("div", {
44558      className: classnames_default()({
44559        'block-editor-link-control__search-input-wrapper': true,
44560        'has-text-control': showTextControl
44561      })
44562    }, showTextControl && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.TextControl, {
44563      ref: textInputRef,
44564      className: "block-editor-link-control__field block-editor-link-control__text-content",
44565      label: "Text",
44566      value: internalTextValue,
44567      onChange: setInternalTextValue,
44568      onKeyDown: handleSubmitWithEnter
44569    }), (0,external_wp_element_namespaceObject.createElement)(search_input, {
44570      currentLink: value,
44571      className: "block-editor-link-control__field block-editor-link-control__search-input",
44572      placeholder: searchInputPlaceholder,
44573      value: currentInputValue,
44574      withCreateSuggestion: withCreateSuggestion,
44575      onCreateSuggestion: createPage,
44576      onChange: setInternalInputValue,
44577      onSelect: handleSelectSuggestion,
44578      showInitialSuggestions: showInitialSuggestions,
44579      allowDirectEntry: !noDirectEntry,
44580      showSuggestions: showSuggestions,
44581      suggestionsQuery: suggestionsQuery,
44582      withURLSuggestion: !noURLSuggestion,
44583      createSuggestionButtonText: createSuggestionButtonText,
44584      useLabel: showTextControl
44585    }, (0,external_wp_element_namespaceObject.createElement)("div", {
44586      className: "block-editor-link-control__search-actions"
44587    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
44588      onClick: handleSubmit,
44589      label: (0,external_wp_i18n_namespaceObject.__)('Submit'),
44590      icon: keyboard_return,
44591      className: "block-editor-link-control__search-submit",
44592      disabled: currentInputIsEmpty // Disallow submitting empty values.
44593  
44594    })))), errorMessage && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Notice, {
44595      className: "block-editor-link-control__search-error",
44596      status: "error",
44597      isDismissible: false
44598    }, errorMessage)), value && !isEditingLink && !isCreatingPage && (0,external_wp_element_namespaceObject.createElement)(LinkPreview, {
44599      key: value === null || value === void 0 ? void 0 : value.url // force remount when URL changes to avoid race conditions for rich previews
44600      ,
44601      value: value,
44602      onEditClick: () => setIsEditingLink(true),
44603      hasRichPreviews: hasRichPreviews,
44604      hasUnlinkControl: shownUnlinkControl,
44605      onRemove: onRemove
44606    }), showSettingsDrawer && (0,external_wp_element_namespaceObject.createElement)("div", {
44607      className: "block-editor-link-control__tools"
44608    }, (0,external_wp_element_namespaceObject.createElement)(settings_drawer, {
44609      value: value,
44610      settings: settings,
44611      onChange: onChange
44612    })), renderControlBottom && renderControlBottom());
44613  }
44614  
44615  LinkControl.ViewerFill = ViewerFill;
44616  /* harmony default export */ var link_control = (LinkControl);
44617  
44618  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/media.js
44619  
44620  
44621  /**
44622   * WordPress dependencies
44623   */
44624  
44625  const media = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
44626    xmlns: "http://www.w3.org/2000/svg",
44627    viewBox: "0 0 24 24"
44628  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
44629    d: "M18.7 3H5.3C4 3 3 4 3 5.3v13.4C3 20 4 21 5.3 21h13.4c1.3 0 2.3-1 2.3-2.3V5.3C21 4 20 3 18.7 3zm.8 15.7c0 .4-.4.8-.8.8H5.3c-.4 0-.8-.4-.8-.8V5.3c0-.4.4-.8.8-.8h13.4c.4 0 .8.4.8.8v13.4zM10 15l5-3-5-3v6z"
44630  }));
44631  /* harmony default export */ var library_media = (media);
44632  
44633  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/upload.js
44634  
44635  
44636  /**
44637   * WordPress dependencies
44638   */
44639  
44640  const upload = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
44641    xmlns: "http://www.w3.org/2000/svg",
44642    viewBox: "0 0 24 24"
44643  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
44644    d: "M18.5 15v3.5H13V6.7l4.5 4.1 1-1.1-6.2-5.8-5.8 5.8 1 1.1 4-4v11.7h-6V15H4v5h16v-5z"
44645  }));
44646  /* harmony default export */ var library_upload = (upload);
44647  
44648  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/media-upload/index.js
44649  /**
44650   * WordPress dependencies
44651   */
44652  
44653  /**
44654   * This is a placeholder for the media upload component necessary to make it possible to provide
44655   * an integration with the core blocks that handle media files. By default it renders nothing but
44656   * it provides a way to have it overridden with the `editor.MediaUpload` filter.
44657   *
44658   * @return {WPComponent} The component to be rendered.
44659   */
44660  
44661  const MediaUpload = () => null;
44662  /**
44663   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/media-upload/README.md
44664   */
44665  
44666  
44667  /* harmony default export */ var media_upload = ((0,external_wp_components_namespaceObject.withFilters)('editor.MediaUpload')(MediaUpload));
44668  
44669  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/media-upload/check.js
44670  /**
44671   * WordPress dependencies
44672   */
44673  
44674  /**
44675   * Internal dependencies
44676   */
44677  
44678  
44679  function MediaUploadCheck(_ref) {
44680    let {
44681      fallback = null,
44682      children
44683    } = _ref;
44684    const hasUploadPermissions = (0,external_wp_data_namespaceObject.useSelect)(select => {
44685      const {
44686        getSettings
44687      } = select(store);
44688      return !!getSettings().mediaUpload;
44689    }, []);
44690    return hasUploadPermissions ? children : fallback;
44691  }
44692  /**
44693   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/media-upload/README.md
44694   */
44695  
44696  /* harmony default export */ var media_upload_check = (MediaUploadCheck);
44697  
44698  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/media-replace-flow/index.js
44699  
44700  
44701  /**
44702   * External dependencies
44703   */
44704  
44705  /**
44706   * WordPress dependencies
44707   */
44708  
44709  
44710  
44711  
44712  
44713  
44714  
44715  
44716  
44717  
44718  
44719  /**
44720   * Internal dependencies
44721   */
44722  
44723  
44724  
44725  
44726  
44727  
44728  const MediaReplaceFlow = _ref => {
44729    let {
44730      mediaURL,
44731      mediaId,
44732      mediaIds,
44733      allowedTypes,
44734      accept,
44735      onError,
44736      onSelect,
44737      onSelectURL,
44738      onFilesUpload = external_lodash_namespaceObject.noop,
44739      onCloseModal = external_lodash_namespaceObject.noop,
44740      name = (0,external_wp_i18n_namespaceObject.__)('Replace'),
44741      createNotice,
44742      removeNotice,
44743      children,
44744      multiple = false,
44745      addToGallery,
44746      handleUpload = true
44747    } = _ref;
44748    const [mediaURLValue, setMediaURLValue] = (0,external_wp_element_namespaceObject.useState)(mediaURL);
44749    const mediaUpload = (0,external_wp_data_namespaceObject.useSelect)(select => {
44750      return select(store).getSettings().mediaUpload;
44751    }, []);
44752    const editMediaButtonRef = (0,external_wp_element_namespaceObject.useRef)();
44753    const errorNoticeID = (0,external_lodash_namespaceObject.uniqueId)('block-editor/media-replace-flow/error-notice/');
44754  
44755    const onUploadError = message => {
44756      const safeMessage = (0,external_wp_dom_namespaceObject.__unstableStripHTML)(message);
44757  
44758      if (onError) {
44759        onError(safeMessage);
44760        return;
44761      } // We need to set a timeout for showing the notice
44762      // so that VoiceOver and possibly other screen readers
44763      // can announce the error afer the toolbar button
44764      // regains focus once the upload dialog closes.
44765      // Otherwise VO simply skips over the notice and announces
44766      // the focused element and the open menu.
44767  
44768  
44769      setTimeout(() => {
44770        createNotice('error', safeMessage, {
44771          speak: true,
44772          id: errorNoticeID,
44773          isDismissible: true
44774        });
44775      }, 1000);
44776    };
44777  
44778    const selectMedia = (media, closeMenu) => {
44779      closeMenu();
44780      setMediaURLValue(media === null || media === void 0 ? void 0 : media.url); // Calling `onSelect` after the state update since it might unmount the component.
44781  
44782      onSelect(media);
44783      (0,external_wp_a11y_namespaceObject.speak)((0,external_wp_i18n_namespaceObject.__)('The media file has been replaced'));
44784      removeNotice(errorNoticeID);
44785    };
44786  
44787    const uploadFiles = (event, closeMenu) => {
44788      const files = event.target.files;
44789  
44790      if (!handleUpload) {
44791        closeMenu();
44792        return onSelect(files);
44793      }
44794  
44795      onFilesUpload(files);
44796      mediaUpload({
44797        allowedTypes,
44798        filesList: files,
44799        onFileChange: _ref2 => {
44800          let [media] = _ref2;
44801          selectMedia(media, closeMenu);
44802        },
44803        onError: onUploadError
44804      });
44805    };
44806  
44807    const openOnArrowDown = event => {
44808      if (event.keyCode === external_wp_keycodes_namespaceObject.DOWN) {
44809        event.preventDefault();
44810        event.target.click();
44811      }
44812    };
44813  
44814    const onlyAllowsImages = () => {
44815      if (!allowedTypes || allowedTypes.length === 0) {
44816        return false;
44817      }
44818  
44819      return allowedTypes.every(allowedType => allowedType === 'image' || allowedType.startsWith('image/'));
44820    };
44821  
44822    const gallery = multiple && onlyAllowsImages();
44823    const POPOVER_PROPS = {
44824      isAlternate: true
44825    };
44826    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Dropdown, {
44827      popoverProps: POPOVER_PROPS,
44828      contentClassName: "block-editor-media-replace-flow__options",
44829      renderToggle: _ref3 => {
44830        let {
44831          isOpen,
44832          onToggle
44833        } = _ref3;
44834        return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarButton, {
44835          ref: editMediaButtonRef,
44836          "aria-expanded": isOpen,
44837          "aria-haspopup": "true",
44838          onClick: onToggle,
44839          onKeyDown: openOnArrowDown
44840        }, name);
44841      },
44842      renderContent: _ref4 => {
44843        let {
44844          onClose
44845        } = _ref4;
44846        return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.NavigableMenu, {
44847          className: "block-editor-media-replace-flow__media-upload-menu"
44848        }, (0,external_wp_element_namespaceObject.createElement)(media_upload, {
44849          gallery: gallery,
44850          addToGallery: addToGallery,
44851          multiple: multiple,
44852          value: multiple ? mediaIds : mediaId,
44853          onSelect: media => selectMedia(media, onClose),
44854          allowedTypes: allowedTypes,
44855          onClose: onCloseModal,
44856          render: _ref5 => {
44857            let {
44858              open
44859            } = _ref5;
44860            return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
44861              icon: library_media,
44862              onClick: open
44863            }, (0,external_wp_i18n_namespaceObject.__)('Open Media Library'));
44864          }
44865        }), (0,external_wp_element_namespaceObject.createElement)(media_upload_check, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.FormFileUpload, {
44866          onChange: event => {
44867            uploadFiles(event, onClose);
44868          },
44869          accept: accept,
44870          multiple: multiple,
44871          render: _ref6 => {
44872            let {
44873              openFileDialog
44874            } = _ref6;
44875            return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
44876              icon: library_upload,
44877              onClick: () => {
44878                openFileDialog();
44879              }
44880            }, (0,external_wp_i18n_namespaceObject.__)('Upload'));
44881          }
44882        })), children), onSelectURL && // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
44883        (0,external_wp_element_namespaceObject.createElement)("form", {
44884          className: "block-editor-media-flow__url-input"
44885        }, (0,external_wp_element_namespaceObject.createElement)("span", {
44886          className: "block-editor-media-replace-flow__image-url-label"
44887        }, (0,external_wp_i18n_namespaceObject.__)('Current media URL:')), (0,external_wp_element_namespaceObject.createElement)(link_control, {
44888          value: {
44889            url: mediaURLValue
44890          },
44891          settings: [],
44892          showSuggestions: false,
44893          onChange: _ref7 => {
44894            let {
44895              url
44896            } = _ref7;
44897            setMediaURLValue(url);
44898            onSelectURL(url);
44899            editMediaButtonRef.current.focus();
44900          }
44901        })));
44902      }
44903    });
44904  };
44905  /**
44906   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/media-replace-flow/README.md
44907   */
44908  
44909  
44910  /* harmony default export */ var media_replace_flow = ((0,external_wp_compose_namespaceObject.compose)([(0,external_wp_data_namespaceObject.withDispatch)(dispatch => {
44911    const {
44912      createNotice,
44913      removeNotice
44914    } = dispatch(external_wp_notices_namespaceObject.store);
44915    return {
44916      createNotice,
44917      removeNotice
44918    };
44919  }), (0,external_wp_components_namespaceObject.withFilters)('editor.MediaReplaceFlow')])(MediaReplaceFlow));
44920  
44921  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/url-popover/link-viewer-url.js
44922  
44923  
44924  /**
44925   * External dependencies
44926   */
44927  
44928  /**
44929   * WordPress dependencies
44930   */
44931  
44932  
44933  
44934  function LinkViewerURL(_ref) {
44935    let {
44936      url,
44937      urlLabel,
44938      className
44939    } = _ref;
44940    const linkClassName = classnames_default()(className, 'block-editor-url-popover__link-viewer-url');
44941  
44942    if (!url) {
44943      return (0,external_wp_element_namespaceObject.createElement)("span", {
44944        className: linkClassName
44945      });
44946    }
44947  
44948    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ExternalLink, {
44949      className: linkClassName,
44950      href: url
44951    }, urlLabel || (0,external_wp_url_namespaceObject.filterURLForDisplay)((0,external_wp_url_namespaceObject.safeDecodeURI)(url)));
44952  }
44953  
44954  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/url-popover/link-viewer.js
44955  
44956  
44957  
44958  /**
44959   * External dependencies
44960   */
44961  
44962  /**
44963   * WordPress dependencies
44964   */
44965  
44966  
44967  
44968  
44969  /**
44970   * Internal dependencies
44971   */
44972  
44973  
44974  function LinkViewer(_ref) {
44975    let {
44976      className,
44977      linkClassName,
44978      onEditLinkClick,
44979      url,
44980      urlLabel,
44981      ...props
44982    } = _ref;
44983    return (0,external_wp_element_namespaceObject.createElement)("div", _extends({
44984      className: classnames_default()('block-editor-url-popover__link-viewer', className)
44985    }, props), (0,external_wp_element_namespaceObject.createElement)(LinkViewerURL, {
44986      url: url,
44987      urlLabel: urlLabel,
44988      className: linkClassName
44989    }), onEditLinkClick && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
44990      icon: library_edit,
44991      label: (0,external_wp_i18n_namespaceObject.__)('Edit'),
44992      onClick: onEditLinkClick
44993    }));
44994  }
44995  
44996  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/url-popover/link-editor.js
44997  
44998  
44999  
45000  /**
45001   * External dependencies
45002   */
45003  
45004  /**
45005   * WordPress dependencies
45006   */
45007  
45008  
45009  
45010  
45011  /**
45012   * Internal dependencies
45013   */
45014  
45015  
45016  function LinkEditor(_ref) {
45017    let {
45018      autocompleteRef,
45019      className,
45020      onChangeInputValue,
45021      value,
45022      ...props
45023    } = _ref;
45024    return (0,external_wp_element_namespaceObject.createElement)("form", _extends({
45025      className: classnames_default()('block-editor-url-popover__link-editor', className)
45026    }, props), (0,external_wp_element_namespaceObject.createElement)(url_input, {
45027      value: value,
45028      onChange: onChangeInputValue,
45029      autocompleteRef: autocompleteRef
45030    }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
45031      icon: keyboard_return,
45032      label: (0,external_wp_i18n_namespaceObject.__)('Apply'),
45033      type: "submit"
45034    }));
45035  }
45036  
45037  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/url-popover/index.js
45038  
45039  
45040  
45041  /**
45042   * WordPress dependencies
45043   */
45044  
45045  
45046  
45047  
45048  /**
45049   * Internal dependencies
45050   */
45051  
45052  
45053  
45054  
45055  function URLPopover(_ref) {
45056    let {
45057      additionalControls,
45058      children,
45059      renderSettings,
45060      position = 'bottom center',
45061      focusOnMount = 'firstElement',
45062      ...popoverProps
45063    } = _ref;
45064    const [isSettingsExpanded, setIsSettingsExpanded] = (0,external_wp_element_namespaceObject.useState)(false);
45065    const showSettings = !!renderSettings && isSettingsExpanded;
45066  
45067    const toggleSettingsVisibility = () => {
45068      setIsSettingsExpanded(!isSettingsExpanded);
45069    };
45070  
45071    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Popover, _extends({
45072      className: "block-editor-url-popover",
45073      focusOnMount: focusOnMount,
45074      position: position
45075    }, popoverProps), (0,external_wp_element_namespaceObject.createElement)("div", {
45076      className: "block-editor-url-popover__input-container"
45077    }, (0,external_wp_element_namespaceObject.createElement)("div", {
45078      className: "block-editor-url-popover__row"
45079    }, children, !!renderSettings && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
45080      className: "block-editor-url-popover__settings-toggle",
45081      icon: chevron_down,
45082      label: (0,external_wp_i18n_namespaceObject.__)('Link settings'),
45083      onClick: toggleSettingsVisibility,
45084      "aria-expanded": isSettingsExpanded
45085    })), showSettings && (0,external_wp_element_namespaceObject.createElement)("div", {
45086      className: "block-editor-url-popover__row block-editor-url-popover__settings"
45087    }, renderSettings())), additionalControls && !showSettings && (0,external_wp_element_namespaceObject.createElement)("div", {
45088      className: "block-editor-url-popover__additional-controls"
45089    }, additionalControls));
45090  }
45091  
45092  URLPopover.LinkEditor = LinkEditor;
45093  URLPopover.LinkViewer = LinkViewer;
45094  /**
45095   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/url-popover/README.md
45096   */
45097  
45098  /* harmony default export */ var url_popover = (URLPopover);
45099  
45100  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/media-placeholder/index.js
45101  
45102  
45103  /**
45104   * External dependencies
45105   */
45106  
45107  
45108  /**
45109   * WordPress dependencies
45110   */
45111  
45112  
45113  
45114  
45115  
45116  
45117  /**
45118   * Internal dependencies
45119   */
45120  
45121  
45122  
45123  
45124  
45125  
45126  const InsertFromURLPopover = _ref => {
45127    let {
45128      src,
45129      onChange,
45130      onSubmit,
45131      onClose
45132    } = _ref;
45133    return (0,external_wp_element_namespaceObject.createElement)(url_popover, {
45134      onClose: onClose
45135    }, (0,external_wp_element_namespaceObject.createElement)("form", {
45136      className: "block-editor-media-placeholder__url-input-form",
45137      onSubmit: onSubmit
45138    }, (0,external_wp_element_namespaceObject.createElement)("input", {
45139      className: "block-editor-media-placeholder__url-input-field",
45140      type: "text",
45141      "aria-label": (0,external_wp_i18n_namespaceObject.__)('URL'),
45142      placeholder: (0,external_wp_i18n_namespaceObject.__)('Paste or type URL'),
45143      onChange: onChange,
45144      value: src
45145    }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
45146      className: "block-editor-media-placeholder__url-input-submit-button",
45147      icon: keyboard_return,
45148      label: (0,external_wp_i18n_namespaceObject.__)('Apply'),
45149      type: "submit"
45150    })));
45151  };
45152  
45153  function MediaPlaceholder(_ref2) {
45154    let {
45155      value = {},
45156      allowedTypes,
45157      className,
45158      icon,
45159      labels = {},
45160      mediaPreview,
45161      notices,
45162      isAppender,
45163      accept,
45164      addToGallery,
45165      multiple = false,
45166      handleUpload = true,
45167      disableDropZone,
45168      disableMediaButtons,
45169      onError,
45170      onSelect,
45171      onCancel,
45172      onSelectURL,
45173      onDoubleClick,
45174      onFilesPreUpload = external_lodash_namespaceObject.noop,
45175      onHTMLDrop = external_lodash_namespaceObject.noop,
45176      onClose = external_lodash_namespaceObject.noop,
45177      children,
45178      mediaLibraryButton,
45179      placeholder,
45180      style
45181    } = _ref2;
45182    const mediaUpload = (0,external_wp_data_namespaceObject.useSelect)(select => {
45183      const {
45184        getSettings
45185      } = select(store);
45186      return getSettings().mediaUpload;
45187    }, []);
45188    const [src, setSrc] = (0,external_wp_element_namespaceObject.useState)('');
45189    const [isURLInputVisible, setIsURLInputVisible] = (0,external_wp_element_namespaceObject.useState)(false);
45190    (0,external_wp_element_namespaceObject.useEffect)(() => {
45191      var _value$src;
45192  
45193      setSrc((_value$src = value === null || value === void 0 ? void 0 : value.src) !== null && _value$src !== void 0 ? _value$src : '');
45194    }, [value === null || value === void 0 ? void 0 : value.src]);
45195  
45196    const onlyAllowsImages = () => {
45197      if (!allowedTypes || allowedTypes.length === 0) {
45198        return false;
45199      }
45200  
45201      return allowedTypes.every(allowedType => allowedType === 'image' || allowedType.startsWith('image/'));
45202    };
45203  
45204    const onChangeSrc = event => {
45205      setSrc(event.target.value);
45206    };
45207  
45208    const openURLInput = () => {
45209      setIsURLInputVisible(true);
45210    };
45211  
45212    const closeURLInput = () => {
45213      setIsURLInputVisible(false);
45214    };
45215  
45216    const onSubmitSrc = event => {
45217      event.preventDefault();
45218  
45219      if (src && onSelectURL) {
45220        onSelectURL(src);
45221        closeURLInput();
45222      }
45223    };
45224  
45225    const onFilesUpload = files => {
45226      if (!handleUpload) {
45227        return onSelect(files);
45228      }
45229  
45230      onFilesPreUpload(files);
45231      let setMedia;
45232  
45233      if (multiple) {
45234        if (addToGallery) {
45235          // Since the setMedia function runs multiple times per upload group
45236          // and is passed newMedia containing every item in its group each time, we must
45237          // filter out whatever this upload group had previously returned to the
45238          // gallery before adding and returning the image array with replacement newMedia
45239          // values.
45240          // Define an array to store urls from newMedia between subsequent function calls.
45241          let lastMediaPassed = [];
45242  
45243          setMedia = newMedia => {
45244            // Remove any images this upload group is responsible for (lastMediaPassed).
45245            // Their replacements are contained in newMedia.
45246            const filteredMedia = (value !== null && value !== void 0 ? value : []).filter(item => {
45247              // If Item has id, only remove it if lastMediaPassed has an item with that id.
45248              if (item.id) {
45249                return !lastMediaPassed.some( // Be sure to convert to number for comparison.
45250                _ref3 => {
45251                  let {
45252                    id
45253                  } = _ref3;
45254                  return Number(id) === Number(item.id);
45255                });
45256              } // Compare transient images via .includes since gallery may append extra info onto the url.
45257  
45258  
45259              return !lastMediaPassed.some(_ref4 => {
45260                let {
45261                  urlSlug
45262                } = _ref4;
45263                return item.url.includes(urlSlug);
45264              });
45265            }); // Return the filtered media array along with newMedia.
45266  
45267            onSelect(filteredMedia.concat(newMedia)); // Reset lastMediaPassed and set it with ids and urls from newMedia.
45268  
45269            lastMediaPassed = newMedia.map(media => {
45270              // Add everything up to '.fileType' to compare via .includes.
45271              const cutOffIndex = media.url.lastIndexOf('.');
45272              const urlSlug = media.url.slice(0, cutOffIndex);
45273              return {
45274                id: media.id,
45275                urlSlug
45276              };
45277            });
45278          };
45279        } else {
45280          setMedia = onSelect;
45281        }
45282      } else {
45283        setMedia = _ref5 => {
45284          let [media] = _ref5;
45285          return onSelect(media);
45286        };
45287      }
45288  
45289      mediaUpload({
45290        allowedTypes,
45291        filesList: files,
45292        onFileChange: setMedia,
45293        onError
45294      });
45295    };
45296  
45297    const onUpload = event => {
45298      onFilesUpload(event.target.files);
45299    };
45300  
45301    const defaultRenderPlaceholder = content => {
45302      let {
45303        instructions,
45304        title
45305      } = labels;
45306  
45307      if (!mediaUpload && !onSelectURL) {
45308        instructions = (0,external_wp_i18n_namespaceObject.__)('To edit this block, you need permission to upload media.');
45309      }
45310  
45311      if (instructions === undefined || title === undefined) {
45312        const typesAllowed = allowedTypes !== null && allowedTypes !== void 0 ? allowedTypes : [];
45313        const [firstAllowedType] = typesAllowed;
45314        const isOneType = 1 === typesAllowed.length;
45315        const isAudio = isOneType && 'audio' === firstAllowedType;
45316        const isImage = isOneType && 'image' === firstAllowedType;
45317        const isVideo = isOneType && 'video' === firstAllowedType;
45318  
45319        if (instructions === undefined && mediaUpload) {
45320          instructions = (0,external_wp_i18n_namespaceObject.__)('Upload a media file or pick one from your media library.');
45321  
45322          if (isAudio) {
45323            instructions = (0,external_wp_i18n_namespaceObject.__)('Upload an audio file, pick one from your media library, or add one with a URL.');
45324          } else if (isImage) {
45325            instructions = (0,external_wp_i18n_namespaceObject.__)('Upload an image file, pick one from your media library, or add one with a URL.');
45326          } else if (isVideo) {
45327            instructions = (0,external_wp_i18n_namespaceObject.__)('Upload a video file, pick one from your media library, or add one with a URL.');
45328          }
45329        }
45330  
45331        if (title === undefined) {
45332          title = (0,external_wp_i18n_namespaceObject.__)('Media');
45333  
45334          if (isAudio) {
45335            title = (0,external_wp_i18n_namespaceObject.__)('Audio');
45336          } else if (isImage) {
45337            title = (0,external_wp_i18n_namespaceObject.__)('Image');
45338          } else if (isVideo) {
45339            title = (0,external_wp_i18n_namespaceObject.__)('Video');
45340          }
45341        }
45342      }
45343  
45344      const placeholderClassName = classnames_default()('block-editor-media-placeholder', className, {
45345        'is-appender': isAppender
45346      });
45347      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Placeholder, {
45348        icon: icon,
45349        label: title,
45350        instructions: instructions,
45351        className: placeholderClassName,
45352        notices: notices,
45353        onDoubleClick: onDoubleClick,
45354        preview: mediaPreview,
45355        style: style
45356      }, content, children);
45357    };
45358  
45359    const renderPlaceholder = placeholder !== null && placeholder !== void 0 ? placeholder : defaultRenderPlaceholder;
45360  
45361    const renderDropZone = () => {
45362      if (disableDropZone) {
45363        return null;
45364      }
45365  
45366      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.DropZone, {
45367        onFilesDrop: onFilesUpload,
45368        onHTMLDrop: onHTMLDrop
45369      });
45370    };
45371  
45372    const renderCancelLink = () => {
45373      return onCancel && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
45374        className: "block-editor-media-placeholder__cancel-button",
45375        title: (0,external_wp_i18n_namespaceObject.__)('Cancel'),
45376        variant: "link",
45377        onClick: onCancel
45378      }, (0,external_wp_i18n_namespaceObject.__)('Cancel'));
45379    };
45380  
45381    const renderUrlSelectionUI = () => {
45382      return onSelectURL && (0,external_wp_element_namespaceObject.createElement)("div", {
45383        className: "block-editor-media-placeholder__url-input-container"
45384      }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
45385        className: "block-editor-media-placeholder__button",
45386        onClick: openURLInput,
45387        isPressed: isURLInputVisible,
45388        variant: "tertiary"
45389      }, (0,external_wp_i18n_namespaceObject.__)('Insert from URL')), isURLInputVisible && (0,external_wp_element_namespaceObject.createElement)(InsertFromURLPopover, {
45390        src: src,
45391        onChange: onChangeSrc,
45392        onSubmit: onSubmitSrc,
45393        onClose: closeURLInput
45394      }));
45395    };
45396  
45397    const renderMediaUploadChecked = () => {
45398      const defaultButton = _ref6 => {
45399        let {
45400          open
45401        } = _ref6;
45402        return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
45403          variant: "tertiary",
45404          onClick: () => {
45405            open();
45406          }
45407        }, (0,external_wp_i18n_namespaceObject.__)('Media Library'));
45408      };
45409  
45410      const libraryButton = mediaLibraryButton !== null && mediaLibraryButton !== void 0 ? mediaLibraryButton : defaultButton;
45411      const uploadMediaLibraryButton = (0,external_wp_element_namespaceObject.createElement)(media_upload, {
45412        addToGallery: addToGallery,
45413        gallery: multiple && onlyAllowsImages(),
45414        multiple: multiple,
45415        onSelect: onSelect,
45416        onClose: onClose,
45417        allowedTypes: allowedTypes,
45418        value: Array.isArray(value) ? value.map(_ref7 => {
45419          let {
45420            id
45421          } = _ref7;
45422          return id;
45423        }) : value.id,
45424        render: libraryButton
45425      });
45426  
45427      if (mediaUpload && isAppender) {
45428        return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, renderDropZone(), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.FormFileUpload, {
45429          onChange: onUpload,
45430          accept: accept,
45431          multiple: multiple,
45432          render: _ref8 => {
45433            let {
45434              openFileDialog
45435            } = _ref8;
45436            const content = (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
45437              variant: "primary",
45438              className: classnames_default()('block-editor-media-placeholder__button', 'block-editor-media-placeholder__upload-button'),
45439              onClick: openFileDialog
45440            }, (0,external_wp_i18n_namespaceObject.__)('Upload')), uploadMediaLibraryButton, renderUrlSelectionUI(), renderCancelLink());
45441            return renderPlaceholder(content);
45442          }
45443        }));
45444      }
45445  
45446      if (mediaUpload) {
45447        const content = (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, renderDropZone(), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.FormFileUpload, {
45448          variant: "primary",
45449          className: classnames_default()('block-editor-media-placeholder__button', 'block-editor-media-placeholder__upload-button'),
45450          onChange: onUpload,
45451          accept: accept,
45452          multiple: multiple
45453        }, (0,external_wp_i18n_namespaceObject.__)('Upload')), uploadMediaLibraryButton, renderUrlSelectionUI(), renderCancelLink());
45454        return renderPlaceholder(content);
45455      }
45456  
45457      return renderPlaceholder(uploadMediaLibraryButton);
45458    };
45459  
45460    if (disableMediaButtons) {
45461      return (0,external_wp_element_namespaceObject.createElement)(media_upload_check, null, renderDropZone());
45462    }
45463  
45464    return (0,external_wp_element_namespaceObject.createElement)(media_upload_check, {
45465      fallback: renderPlaceholder(renderUrlSelectionUI())
45466    }, renderMediaUploadChecked());
45467  }
45468  /**
45469   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/media-placeholder/README.md
45470   */
45471  
45472  /* harmony default export */ var media_placeholder = ((0,external_wp_components_namespaceObject.withFilters)('editor.MediaPlaceholder')(MediaPlaceholder));
45473  
45474  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/panel-color-settings/index.js
45475  
45476  
45477  
45478  /**
45479   * Internal dependencies
45480   */
45481  
45482  
45483  const PanelColorSettings = _ref => {
45484    let {
45485      colorSettings,
45486      ...props
45487    } = _ref;
45488    const settings = colorSettings.map(setting => {
45489      if (!setting) {
45490        return setting;
45491      }
45492  
45493      const {
45494        value,
45495        onChange,
45496        ...otherSettings
45497      } = setting;
45498      return { ...otherSettings,
45499        colorValue: value,
45500        onColorChange: onChange
45501      };
45502    });
45503    return (0,external_wp_element_namespaceObject.createElement)(panel_color_gradient_settings, _extends({
45504      settings: settings,
45505      gradients: [],
45506      disableCustomGradients: true
45507    }, props));
45508  };
45509  
45510  /* harmony default export */ var panel_color_settings = (PanelColorSettings);
45511  
45512  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/rich-text/format-toolbar/index.js
45513  
45514  
45515  /**
45516   * External dependencies
45517   */
45518  
45519  
45520  /**
45521   * WordPress dependencies
45522   */
45523  
45524  
45525  
45526  
45527  const format_toolbar_POPOVER_PROPS = {
45528    position: 'bottom right',
45529    isAlternate: true
45530  };
45531  
45532  const FormatToolbar = () => {
45533    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, ['bold', 'italic', 'link'].map(format => (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Slot, {
45534      name: `RichText.ToolbarControls.$format}`,
45535      key: format
45536    })), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Slot, {
45537      name: "RichText.ToolbarControls"
45538    }, fills => {
45539      if (!fills.length) {
45540        return null;
45541      }
45542  
45543      const allProps = fills.map(_ref => {
45544        let [{
45545          props
45546        }] = _ref;
45547        return props;
45548      });
45549      const hasActive = allProps.some(_ref2 => {
45550        let {
45551          isActive
45552        } = _ref2;
45553        return isActive;
45554      });
45555      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarItem, null, toggleProps => (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.DropdownMenu, {
45556        icon: chevron_down
45557        /* translators: button label text should, if possible, be under 16 characters. */
45558        ,
45559        label: (0,external_wp_i18n_namespaceObject.__)('More'),
45560        toggleProps: { ...toggleProps,
45561          className: classnames_default()(toggleProps.className, {
45562            'is-pressed': hasActive
45563          }),
45564          describedBy: (0,external_wp_i18n_namespaceObject.__)('Displays more block tools')
45565        },
45566        controls: (0,external_lodash_namespaceObject.orderBy)(fills.map(_ref3 => {
45567          let [{
45568            props
45569          }] = _ref3;
45570          return props;
45571        }), 'title'),
45572        popoverProps: format_toolbar_POPOVER_PROPS
45573      }));
45574    }));
45575  };
45576  
45577  /* harmony default export */ var format_toolbar = (FormatToolbar);
45578  
45579  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/rich-text/format-toolbar-container.js
45580  
45581  
45582  /**
45583   * WordPress dependencies
45584   */
45585  
45586  /**
45587   * Internal dependencies
45588   */
45589  
45590  
45591  
45592  
45593  const FormatToolbarContainer = _ref => {
45594    let {
45595      inline,
45596      anchorRef
45597    } = _ref;
45598  
45599    if (inline) {
45600      // Render in popover.
45601      return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Popover, {
45602        noArrow: true,
45603        position: "top center",
45604        focusOnMount: false,
45605        anchorRef: anchorRef,
45606        className: "block-editor-rich-text__inline-format-toolbar",
45607        __unstableSlotName: "block-toolbar"
45608      }, (0,external_wp_element_namespaceObject.createElement)("div", {
45609        className: "block-editor-rich-text__inline-format-toolbar-group"
45610      }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarGroup, null, (0,external_wp_element_namespaceObject.createElement)(format_toolbar, null))));
45611    } // Render regular toolbar.
45612  
45613  
45614    return (0,external_wp_element_namespaceObject.createElement)(block_controls, {
45615      group: "inline"
45616    }, (0,external_wp_element_namespaceObject.createElement)(format_toolbar, null));
45617  };
45618  
45619  /* harmony default export */ var format_toolbar_container = (FormatToolbarContainer);
45620  
45621  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/rich-text/use-undo-automatic-change.js
45622  /**
45623   * WordPress dependencies
45624   */
45625  
45626  
45627  
45628  /**
45629   * Internal dependencies
45630   */
45631  
45632  
45633  function useUndoAutomaticChange() {
45634    const {
45635      didAutomaticChange,
45636      getSettings
45637    } = (0,external_wp_data_namespaceObject.useSelect)(store);
45638    return (0,external_wp_compose_namespaceObject.useRefEffect)(element => {
45639      function onKeyDown(event) {
45640        const {
45641          keyCode
45642        } = event;
45643  
45644        if (event.defaultPrevented) {
45645          return;
45646        }
45647  
45648        if (keyCode !== external_wp_keycodes_namespaceObject.DELETE && keyCode !== external_wp_keycodes_namespaceObject.BACKSPACE && keyCode !== external_wp_keycodes_namespaceObject.ESCAPE) {
45649          return;
45650        }
45651  
45652        if (!didAutomaticChange()) {
45653          return;
45654        }
45655  
45656        event.preventDefault();
45657  
45658        getSettings().__experimentalUndo();
45659      }
45660  
45661      element.addEventListener('keydown', onKeyDown);
45662      return () => {
45663        element.removeEventListener('keydown', onKeyDown);
45664      };
45665    }, []);
45666  }
45667  
45668  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/rich-text/use-caret-in-format.js
45669  /**
45670   * WordPress dependencies
45671   */
45672  
45673  
45674  /**
45675   * Internal dependencies
45676   */
45677  
45678  
45679  function useCaretInFormat(_ref) {
45680    let {
45681      value
45682    } = _ref;
45683    const hasActiveFormats = value.activeFormats && !!value.activeFormats.length;
45684    const {
45685      isCaretWithinFormattedText
45686    } = (0,external_wp_data_namespaceObject.useSelect)(store);
45687    const {
45688      enterFormattedText,
45689      exitFormattedText
45690    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
45691    (0,external_wp_element_namespaceObject.useEffect)(() => {
45692      if (hasActiveFormats) {
45693        if (!isCaretWithinFormattedText()) {
45694          enterFormattedText();
45695        }
45696      } else if (isCaretWithinFormattedText()) {
45697        exitFormattedText();
45698      }
45699    }, [hasActiveFormats]);
45700  }
45701  
45702  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/rich-text/use-mark-persistent.js
45703  /**
45704   * WordPress dependencies
45705   */
45706  
45707  
45708  /**
45709   * Internal dependencies
45710   */
45711  
45712  
45713  function useMarkPersistent(_ref) {
45714    let {
45715      html,
45716      value
45717    } = _ref;
45718    const previousText = (0,external_wp_element_namespaceObject.useRef)();
45719    const hasActiveFormats = value.activeFormats && !!value.activeFormats.length;
45720    const {
45721      __unstableMarkLastChangeAsPersistent
45722    } = (0,external_wp_data_namespaceObject.useDispatch)(store); // Must be set synchronously to make sure it applies to the last change.
45723  
45724    (0,external_wp_element_namespaceObject.useLayoutEffect)(() => {
45725      // Ignore mount.
45726      if (!previousText.current) {
45727        previousText.current = value.text;
45728        return;
45729      } // Text input, so don't create an undo level for every character.
45730      // Create an undo level after 1 second of no input.
45731  
45732  
45733      if (previousText.current !== value.text) {
45734        const timeout = window.setTimeout(() => {
45735          __unstableMarkLastChangeAsPersistent();
45736        }, 1000);
45737        previousText.current = value.text;
45738        return () => {
45739          window.clearTimeout(timeout);
45740        };
45741      }
45742  
45743      __unstableMarkLastChangeAsPersistent();
45744    }, [html, hasActiveFormats]);
45745  }
45746  
45747  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/rich-text/file-paste-handler.js
45748  /**
45749   * WordPress dependencies
45750   */
45751  
45752  function filePasteHandler(files) {
45753    return files.filter(_ref => {
45754      let {
45755        type
45756      } = _ref;
45757      return /^image\/(?:jpe?g|png|gif|webp)$/.test(type);
45758    }).map(file => `<img src="${(0,external_wp_blob_namespaceObject.createBlobURL)(file)}">`).join('');
45759  }
45760  
45761  ;// CONCATENATED MODULE: external ["wp","shortcode"]
45762  var external_wp_shortcode_namespaceObject = window["wp"]["shortcode"];
45763  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/rich-text/utils.js
45764  
45765  
45766  /**
45767   * WordPress dependencies
45768   */
45769  
45770  
45771  
45772  
45773  function addActiveFormats(value, activeFormats) {
45774    if (activeFormats !== null && activeFormats !== void 0 && activeFormats.length) {
45775      let index = value.formats.length;
45776  
45777      while (index--) {
45778        value.formats[index] = [...activeFormats, ...(value.formats[index] || [])];
45779      }
45780    }
45781  }
45782  /**
45783   * Get the multiline tag based on the multiline prop.
45784   *
45785   * @param {?(string|boolean)} multiline The multiline prop.
45786   *
45787   * @return {?string} The multiline tag.
45788   */
45789  
45790  function getMultilineTag(multiline) {
45791    if (multiline !== true && multiline !== 'p' && multiline !== 'li') {
45792      return;
45793    }
45794  
45795    return multiline === true ? 'p' : multiline;
45796  }
45797  function getAllowedFormats(_ref) {
45798    let {
45799      allowedFormats,
45800      formattingControls,
45801      disableFormats
45802    } = _ref;
45803  
45804    if (disableFormats) {
45805      return getAllowedFormats.EMPTY_ARRAY;
45806    }
45807  
45808    if (!allowedFormats && !formattingControls) {
45809      return;
45810    }
45811  
45812    if (allowedFormats) {
45813      return allowedFormats;
45814    }
45815  
45816    external_wp_deprecated_default()('wp.blockEditor.RichText formattingControls prop', {
45817      since: '5.4',
45818      alternative: 'allowedFormats',
45819      version: '6.2'
45820    });
45821    return formattingControls.map(name => `core/$name}`);
45822  }
45823  getAllowedFormats.EMPTY_ARRAY = [];
45824  const isShortcode = text => (0,external_wp_shortcode_namespaceObject.regexp)('.*').test(text);
45825  /**
45826   * Creates a link from pasted URL.
45827   * Creates a paragraph block containing a link to the URL, and calls `onReplace`.
45828   *
45829   * @param {string}   url       The URL that could not be embedded.
45830   * @param {Function} onReplace Function to call with the created fallback block.
45831   */
45832  
45833  function createLinkInParagraph(url, onReplace) {
45834    const link = createElement("a", {
45835      href: url
45836    }, url);
45837    onReplace(createBlock('core/paragraph', {
45838      content: renderToString(link)
45839    }));
45840  }
45841  
45842  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/rich-text/split-value.js
45843  /**
45844   * WordPress dependencies
45845   */
45846  
45847  /*
45848   * Signals to the RichText owner that the block can be replaced with two blocks
45849   * as a result of splitting the block by pressing enter, or with blocks as a
45850   * result of splitting the block by pasting block content in the instance.
45851   */
45852  
45853  function splitValue(_ref) {
45854    let {
45855      value,
45856      pastedBlocks = [],
45857      onReplace,
45858      onSplit,
45859      onSplitMiddle,
45860      multilineTag
45861    } = _ref;
45862  
45863    if (!onReplace || !onSplit) {
45864      return;
45865    } // Ensure the value has a selection. This might happen when trying to split
45866    // an empty value before there was a `selectionchange` event.
45867  
45868  
45869    const {
45870      start = 0,
45871      end = 0
45872    } = value;
45873    const valueWithEnsuredSelection = { ...value,
45874      start,
45875      end
45876    };
45877    const blocks = [];
45878    const [before, after] = (0,external_wp_richText_namespaceObject.split)(valueWithEnsuredSelection);
45879    const hasPastedBlocks = pastedBlocks.length > 0;
45880    let lastPastedBlockIndex = -1; // Consider the after value to be the original it is not empty and the
45881    // before value *is* empty.
45882  
45883    const isAfterOriginal = (0,external_wp_richText_namespaceObject.isEmpty)(before) && !(0,external_wp_richText_namespaceObject.isEmpty)(after); // Create a block with the content before the caret if there's no pasted
45884    // blocks, or if there are pasted blocks and the value is not empty. We do
45885    // not want a leading empty block on paste, but we do if split with e.g. the
45886    // enter key.
45887  
45888    if (!hasPastedBlocks || !(0,external_wp_richText_namespaceObject.isEmpty)(before)) {
45889      blocks.push(onSplit((0,external_wp_richText_namespaceObject.toHTMLString)({
45890        value: before,
45891        multilineTag
45892      }), !isAfterOriginal));
45893      lastPastedBlockIndex += 1;
45894    }
45895  
45896    if (hasPastedBlocks) {
45897      blocks.push(...pastedBlocks);
45898      lastPastedBlockIndex += pastedBlocks.length;
45899    } else if (onSplitMiddle) {
45900      blocks.push(onSplitMiddle());
45901    } // If there's pasted blocks, append a block with non empty content / after
45902    // the caret. Otherwise, do append an empty block if there is no
45903    // `onSplitMiddle` prop, but if there is and the content is empty, the
45904    // middle block is enough to set focus in.
45905  
45906  
45907    if (hasPastedBlocks ? !(0,external_wp_richText_namespaceObject.isEmpty)(after) : !onSplitMiddle || !(0,external_wp_richText_namespaceObject.isEmpty)(after)) {
45908      blocks.push(onSplit((0,external_wp_richText_namespaceObject.toHTMLString)({
45909        value: after,
45910        multilineTag
45911      }), isAfterOriginal));
45912    } // If there are pasted blocks, set the selection to the last one. Otherwise,
45913    // set the selection to the second block.
45914  
45915  
45916    const indexToSelect = hasPastedBlocks ? lastPastedBlockIndex : 1; // If there are pasted blocks, move the caret to the end of the selected
45917    // block Otherwise, retain the default value.
45918  
45919    const initialPosition = hasPastedBlocks ? -1 : 0;
45920    onReplace(blocks, indexToSelect, initialPosition);
45921  }
45922  
45923  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/rich-text/use-paste-handler.js
45924  /**
45925   * WordPress dependencies
45926   */
45927  
45928  
45929  
45930  
45931  
45932  
45933  /**
45934   * Internal dependencies
45935   */
45936  
45937  
45938  
45939  
45940  
45941  /** @typedef {import('@wordpress/rich-text').RichTextValue} RichTextValue */
45942  
45943  /**
45944   * Replaces line separators with line breaks if not multiline.
45945   * Replaces line breaks with line separators if multiline.
45946   *
45947   * @param {RichTextValue} value       Value to adjust.
45948   * @param {boolean}       isMultiline Whether to adjust to multiline or not.
45949   *
45950   * @return {RichTextValue} Adjusted value.
45951   */
45952  
45953  function adjustLines(value, isMultiline) {
45954    if (isMultiline) {
45955      return (0,external_wp_richText_namespaceObject.replace)(value, /\n+/g, external_wp_richText_namespaceObject.__UNSTABLE_LINE_SEPARATOR);
45956    }
45957  
45958    return (0,external_wp_richText_namespaceObject.replace)(value, new RegExp(external_wp_richText_namespaceObject.__UNSTABLE_LINE_SEPARATOR, 'g'), '\n');
45959  }
45960  
45961  function usePasteHandler(props) {
45962    const propsRef = (0,external_wp_element_namespaceObject.useRef)(props);
45963    propsRef.current = props;
45964    return (0,external_wp_compose_namespaceObject.useRefEffect)(element => {
45965      function _onPaste(event) {
45966        const {
45967          isSelected,
45968          disableFormats,
45969          onChange,
45970          value,
45971          formatTypes,
45972          tagName,
45973          onReplace,
45974          onSplit,
45975          onSplitMiddle,
45976          __unstableEmbedURLOnPaste,
45977          multilineTag,
45978          preserveWhiteSpace,
45979          pastePlainText
45980        } = propsRef.current;
45981  
45982        if (!isSelected) {
45983          return;
45984        }
45985  
45986        const {
45987          clipboardData
45988        } = event;
45989        let plainText = '';
45990        let html = ''; // IE11 only supports `Text` as an argument for `getData` and will
45991        // otherwise throw an invalid argument error, so we try the standard
45992        // arguments first, then fallback to `Text` if they fail.
45993  
45994        try {
45995          plainText = clipboardData.getData('text/plain');
45996          html = clipboardData.getData('text/html');
45997        } catch (error1) {
45998          try {
45999            html = clipboardData.getData('Text');
46000          } catch (error2) {
46001            // Some browsers like UC Browser paste plain text by default and
46002            // don't support clipboardData at all, so allow default
46003            // behaviour.
46004            return;
46005          }
46006        } // Remove Windows-specific metadata appended within copied HTML text.
46007  
46008  
46009        html = removeWindowsFragments(html); // Strip meta tag.
46010  
46011        html = removeCharsetMetaTag(html);
46012        event.preventDefault(); // Allows us to ask for this information when we get a report.
46013  
46014        window.console.log('Received HTML:\n\n', html);
46015        window.console.log('Received plain text:\n\n', plainText);
46016  
46017        if (disableFormats) {
46018          onChange((0,external_wp_richText_namespaceObject.insert)(value, plainText));
46019          return;
46020        }
46021  
46022        const transformed = formatTypes.reduce((accumlator, _ref) => {
46023          let {
46024            __unstablePasteRule
46025          } = _ref;
46026  
46027          // Only allow one transform.
46028          if (__unstablePasteRule && accumlator === value) {
46029            accumlator = __unstablePasteRule(value, {
46030              html,
46031              plainText
46032            });
46033          }
46034  
46035          return accumlator;
46036        }, value);
46037  
46038        if (transformed !== value) {
46039          onChange(transformed);
46040          return;
46041        }
46042  
46043        const files = [...(0,external_wp_dom_namespaceObject.getFilesFromDataTransfer)(clipboardData)];
46044        const isInternal = clipboardData.getData('rich-text') === 'true'; // If the data comes from a rich text instance, we can directly use it
46045        // without filtering the data. The filters are only meant for externally
46046        // pasted content and remove inline styles.
46047  
46048        if (isInternal) {
46049          const pastedMultilineTag = clipboardData.getData('rich-text-multi-line-tag') || undefined;
46050          let pastedValue = (0,external_wp_richText_namespaceObject.create)({
46051            html,
46052            multilineTag: pastedMultilineTag,
46053            multilineWrapperTags: pastedMultilineTag === 'li' ? ['ul', 'ol'] : undefined,
46054            preserveWhiteSpace
46055          });
46056          pastedValue = adjustLines(pastedValue, !!multilineTag);
46057          addActiveFormats(pastedValue, value.activeFormats);
46058          onChange((0,external_wp_richText_namespaceObject.insert)(value, pastedValue));
46059          return;
46060        }
46061  
46062        if (pastePlainText) {
46063          onChange((0,external_wp_richText_namespaceObject.insert)(value, (0,external_wp_richText_namespaceObject.create)({
46064            text: plainText
46065          })));
46066          return;
46067        } // Process any attached files, unless we infer that the files in
46068        // question are redundant "screenshots" of the actual HTML payload,
46069        // as created by certain office-type programs.
46070        //
46071        // @see shouldDismissPastedFiles
46072  
46073  
46074        if (files !== null && files !== void 0 && files.length && !shouldDismissPastedFiles(files, html, plainText)) {
46075          const content = (0,external_wp_blocks_namespaceObject.pasteHandler)({
46076            HTML: filePasteHandler(files),
46077            mode: 'BLOCKS',
46078            tagName,
46079            preserveWhiteSpace
46080          }); // Allows us to ask for this information when we get a report.
46081          // eslint-disable-next-line no-console
46082  
46083          window.console.log('Received items:\n\n', files);
46084  
46085          if (onReplace && (0,external_wp_richText_namespaceObject.isEmpty)(value)) {
46086            onReplace(content);
46087          } else {
46088            splitValue({
46089              value,
46090              pastedBlocks: content,
46091              onReplace,
46092              onSplit,
46093              onSplitMiddle,
46094              multilineTag
46095            });
46096          }
46097  
46098          return;
46099        }
46100  
46101        let mode = onReplace && onSplit ? 'AUTO' : 'INLINE'; // Force the blocks mode when the user is pasting
46102        // on a new line & the content resembles a shortcode.
46103        // Otherwise it's going to be detected as inline
46104        // and the shortcode won't be replaced.
46105  
46106        if (mode === 'AUTO' && (0,external_wp_richText_namespaceObject.isEmpty)(value) && isShortcode(plainText)) {
46107          mode = 'BLOCKS';
46108        }
46109  
46110        if (__unstableEmbedURLOnPaste && (0,external_wp_richText_namespaceObject.isEmpty)(value) && (0,external_wp_url_namespaceObject.isURL)(plainText.trim())) {
46111          mode = 'BLOCKS';
46112        }
46113  
46114        const content = (0,external_wp_blocks_namespaceObject.pasteHandler)({
46115          HTML: html,
46116          plainText,
46117          mode,
46118          tagName,
46119          preserveWhiteSpace
46120        });
46121  
46122        if (typeof content === 'string') {
46123          let valueToInsert = (0,external_wp_richText_namespaceObject.create)({
46124            html: content
46125          }); // If the content should be multiline, we should process text
46126          // separated by a line break as separate lines.
46127  
46128          valueToInsert = adjustLines(valueToInsert, !!multilineTag);
46129          addActiveFormats(valueToInsert, value.activeFormats);
46130          onChange((0,external_wp_richText_namespaceObject.insert)(value, valueToInsert));
46131        } else if (content.length > 0) {
46132          if (onReplace && (0,external_wp_richText_namespaceObject.isEmpty)(value)) {
46133            onReplace(content, content.length - 1, -1);
46134          } else {
46135            splitValue({
46136              value,
46137              pastedBlocks: content,
46138              onReplace,
46139              onSplit,
46140              onSplitMiddle,
46141              multilineTag
46142            });
46143          }
46144        }
46145      }
46146  
46147      element.addEventListener('paste', _onPaste);
46148      return () => {
46149        element.removeEventListener('paste', _onPaste);
46150      };
46151    }, []);
46152  }
46153  /**
46154   * Normalizes a given string of HTML to remove the Windows specific "Fragment" comments
46155   * and any preceeding and trailing whitespace.
46156   *
46157   * @param {string} html the html to be normalized
46158   * @return {string} the normalized html
46159   */
46160  
46161  function removeWindowsFragments(html) {
46162    const startReg = /.*<!--StartFragment-->/s;
46163    const endReg = /<!--EndFragment-->.*/s;
46164    return html.replace(startReg, '').replace(endReg, '');
46165  }
46166  /**
46167   * Removes the charset meta tag inserted by Chromium.
46168   * See:
46169   * - https://github.com/WordPress/gutenberg/issues/33585
46170   * - https://bugs.chromium.org/p/chromium/issues/detail?id=1264616#c4
46171   *
46172   * @param {string} html the html to be stripped of the meta tag.
46173   * @return {string} the cleaned html
46174   */
46175  
46176  
46177  function removeCharsetMetaTag(html) {
46178    const metaTag = `<meta charset='utf-8'>`;
46179  
46180    if (html.startsWith(metaTag)) {
46181      return html.slice(metaTag.length);
46182    }
46183  
46184    return html;
46185  }
46186  
46187  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/rich-text/prevent-event-discovery.js
46188  /**
46189   * WordPress dependencies
46190   */
46191  
46192  function preventEventDiscovery(value) {
46193    const searchText = 'tales of gutenberg';
46194    const addText = ' 🐡🐢🦀🐤🦋🐘🐧🐹🦁🦄🦍🐼🐿🎃🐴🐝🐆🦕🦔🌱🍇π🍌🐉💧🥨🌌🍂🍠🥦🥚🥝🎟🥥🥒🛵🥖🍒🍯🎾🎲🐺🐚🐮⌛️';
46195    const {
46196      start,
46197      text
46198    } = value;
46199  
46200    if (start < searchText.length) {
46201      return value;
46202    }
46203  
46204    const charactersBefore = text.slice(start - searchText.length, start);
46205  
46206    if (charactersBefore.toLowerCase() !== searchText) {
46207      return value;
46208    }
46209  
46210    return (0,external_wp_richText_namespaceObject.insert)(value, addText);
46211  }
46212  
46213  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/rich-text/use-input-rules.js
46214  /**
46215   * External dependencies
46216   */
46217  
46218  /**
46219   * WordPress dependencies
46220   */
46221  
46222  
46223  
46224  
46225  
46226  
46227  /**
46228   * Internal dependencies
46229   */
46230  
46231  
46232   // A robust way to retain selection position through various
46233  // transforms is to insert a special character at the position and
46234  // then recover it.
46235  
46236  const START_OF_SELECTED_AREA = '\u0086';
46237  
46238  function findSelection(blocks) {
46239    let i = blocks.length;
46240  
46241    while (i--) {
46242      const attributeKey = (0,external_lodash_namespaceObject.findKey)(blocks[i].attributes, v => typeof v === 'string' && v.indexOf(START_OF_SELECTED_AREA) !== -1);
46243  
46244      if (attributeKey) {
46245        blocks[i].attributes[attributeKey] = blocks[i].attributes[attributeKey].replace(START_OF_SELECTED_AREA, '');
46246        return blocks[i].clientId;
46247      }
46248  
46249      const nestedSelection = findSelection(blocks[i].innerBlocks);
46250  
46251      if (nestedSelection) {
46252        return nestedSelection;
46253      }
46254    }
46255  }
46256  
46257  function useInputRules(props) {
46258    const {
46259      __unstableMarkLastChangeAsPersistent,
46260      __unstableMarkAutomaticChange
46261    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
46262    const propsRef = (0,external_wp_element_namespaceObject.useRef)(props);
46263    propsRef.current = props;
46264    return (0,external_wp_compose_namespaceObject.useRefEffect)(element => {
46265      function inputRule() {
46266        const {
46267          value,
46268          onReplace,
46269          selectionChange
46270        } = propsRef.current;
46271  
46272        if (!onReplace) {
46273          return;
46274        }
46275  
46276        const {
46277          start,
46278          text
46279        } = value;
46280        const characterBefore = text.slice(start - 1, start); // The character right before the caret must be a plain space.
46281  
46282        if (characterBefore !== ' ') {
46283          return;
46284        }
46285  
46286        const trimmedTextBefore = text.slice(0, start).trim();
46287        const prefixTransforms = (0,external_wp_blocks_namespaceObject.getBlockTransforms)('from').filter(_ref => {
46288          let {
46289            type
46290          } = _ref;
46291          return type === 'prefix';
46292        });
46293        const transformation = (0,external_wp_blocks_namespaceObject.findTransform)(prefixTransforms, _ref2 => {
46294          let {
46295            prefix
46296          } = _ref2;
46297          return trimmedTextBefore === prefix;
46298        });
46299  
46300        if (!transformation) {
46301          return;
46302        }
46303  
46304        const content = (0,external_wp_richText_namespaceObject.toHTMLString)({
46305          value: (0,external_wp_richText_namespaceObject.insert)(value, START_OF_SELECTED_AREA, 0, start)
46306        });
46307        const block = transformation.transform(content);
46308        selectionChange(findSelection([block]));
46309        onReplace([block]);
46310  
46311        __unstableMarkAutomaticChange();
46312      }
46313  
46314      function onInput(event) {
46315        const {
46316          inputType,
46317          type
46318        } = event;
46319        const {
46320          value,
46321          onChange,
46322          __unstableAllowPrefixTransformations,
46323          formatTypes
46324        } = propsRef.current; // Only run input rules when inserting text.
46325  
46326        if (inputType !== 'insertText' && type !== 'compositionend') {
46327          return;
46328        }
46329  
46330        if (__unstableAllowPrefixTransformations && inputRule) {
46331          inputRule();
46332        }
46333  
46334        const transformed = formatTypes.reduce((accumlator, _ref3) => {
46335          let {
46336            __unstableInputRule
46337          } = _ref3;
46338  
46339          if (__unstableInputRule) {
46340            accumlator = __unstableInputRule(accumlator);
46341          }
46342  
46343          return accumlator;
46344        }, preventEventDiscovery(value));
46345  
46346        if (transformed !== value) {
46347          __unstableMarkLastChangeAsPersistent();
46348  
46349          onChange({ ...transformed,
46350            activeFormats: value.activeFormats
46351          });
46352  
46353          __unstableMarkAutomaticChange();
46354        }
46355      }
46356  
46357      element.addEventListener('input', onInput);
46358      element.addEventListener('compositionend', onInput);
46359      return () => {
46360        element.removeEventListener('input', onInput);
46361        element.removeEventListener('compositionend', onInput);
46362      };
46363    }, []);
46364  }
46365  
46366  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/rich-text/use-enter.js
46367  /**
46368   * WordPress dependencies
46369   */
46370  
46371  /**
46372   * WordPress dependencies
46373   */
46374  
46375  
46376  
46377  
46378  
46379  
46380  /**
46381   * Internal dependencies
46382   */
46383  
46384  
46385  
46386  function useEnter(props) {
46387    const {
46388      __unstableMarkAutomaticChange
46389    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
46390    const propsRef = (0,external_wp_element_namespaceObject.useRef)(props);
46391    propsRef.current = props;
46392    return (0,external_wp_compose_namespaceObject.useRefEffect)(element => {
46393      function onKeyDown(event) {
46394        if (event.defaultPrevented) {
46395          return;
46396        }
46397  
46398        const {
46399          removeEditorOnlyFormats,
46400          value,
46401          onReplace,
46402          onSplit,
46403          onSplitMiddle,
46404          multilineTag,
46405          onChange,
46406          disableLineBreaks,
46407          onSplitAtEnd
46408        } = propsRef.current;
46409  
46410        if (event.keyCode !== external_wp_keycodes_namespaceObject.ENTER) {
46411          return;
46412        }
46413  
46414        event.preventDefault();
46415        const _value = { ...value
46416        };
46417        _value.formats = removeEditorOnlyFormats(value);
46418        const canSplit = onReplace && onSplit;
46419  
46420        if (onReplace) {
46421          const transforms = (0,external_wp_blocks_namespaceObject.getBlockTransforms)('from').filter(_ref => {
46422            let {
46423              type
46424            } = _ref;
46425            return type === 'enter';
46426          });
46427          const transformation = (0,external_wp_blocks_namespaceObject.findTransform)(transforms, item => {
46428            return item.regExp.test(_value.text);
46429          });
46430  
46431          if (transformation) {
46432            onReplace([transformation.transform({
46433              content: _value.text
46434            })]);
46435  
46436            __unstableMarkAutomaticChange();
46437          }
46438        }
46439  
46440        if (multilineTag) {
46441          if (event.shiftKey) {
46442            if (!disableLineBreaks) {
46443              onChange((0,external_wp_richText_namespaceObject.insert)(_value, '\n'));
46444            }
46445          } else if (canSplit && (0,external_wp_richText_namespaceObject.__unstableIsEmptyLine)(_value)) {
46446            splitValue({
46447              value: _value,
46448              onReplace,
46449              onSplit,
46450              onSplitMiddle,
46451              multilineTag
46452            });
46453          } else {
46454            onChange((0,external_wp_richText_namespaceObject.__unstableInsertLineSeparator)(_value));
46455          }
46456        } else {
46457          const {
46458            text,
46459            start,
46460            end
46461          } = _value;
46462          const canSplitAtEnd = onSplitAtEnd && start === end && end === text.length;
46463  
46464          if (event.shiftKey || !canSplit && !canSplitAtEnd) {
46465            if (!disableLineBreaks) {
46466              onChange((0,external_wp_richText_namespaceObject.insert)(_value, '\n'));
46467            }
46468          } else if (!canSplit && canSplitAtEnd) {
46469            onSplitAtEnd();
46470          } else if (canSplit) {
46471            splitValue({
46472              value: _value,
46473              onReplace,
46474              onSplit,
46475              onSplitMiddle,
46476              multilineTag
46477            });
46478          }
46479        }
46480      }
46481  
46482      element.addEventListener('keydown', onKeyDown);
46483      return () => {
46484        element.removeEventListener('keydown', onKeyDown);
46485      };
46486    }, []);
46487  }
46488  
46489  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/rich-text/use-format-types.js
46490  /**
46491   * WordPress dependencies
46492   */
46493  
46494  
46495  /**
46496   * Internal dependencies
46497   */
46498  
46499  
46500  
46501  function formatTypesSelector(select) {
46502    return select(external_wp_richText_namespaceObject.store).getFormatTypes();
46503  }
46504  /**
46505   * Set of all interactive content tags.
46506   *
46507   * @see https://html.spec.whatwg.org/multipage/dom.html#interactive-content
46508   */
46509  
46510  
46511  const interactiveContentTags = new Set(['a', 'audio', 'button', 'details', 'embed', 'iframe', 'input', 'label', 'select', 'textarea', 'video']);
46512  /**
46513   * This hook provides RichText with the `formatTypes` and its derived props from
46514   * experimental format type settings.
46515   *
46516   * @param {Object}  $0                              Options
46517   * @param {string}  $0.clientId                     Block client ID.
46518   * @param {string}  $0.identifier                   Block attribute.
46519   * @param {boolean} $0.withoutInteractiveFormatting Whether to clean the interactive formattings or not.
46520   * @param {Array}   $0.allowedFormats               Allowed formats
46521   */
46522  
46523  function useFormatTypes(_ref) {
46524    let {
46525      clientId,
46526      identifier,
46527      withoutInteractiveFormatting,
46528      allowedFormats
46529    } = _ref;
46530    const allFormatTypes = (0,external_wp_data_namespaceObject.useSelect)(formatTypesSelector, []);
46531    const formatTypes = (0,external_wp_element_namespaceObject.useMemo)(() => {
46532      return allFormatTypes.filter(_ref2 => {
46533        let {
46534          name,
46535          tagName
46536        } = _ref2;
46537  
46538        if (allowedFormats && !allowedFormats.includes(name)) {
46539          return false;
46540        }
46541  
46542        if (withoutInteractiveFormatting && interactiveContentTags.has(tagName)) {
46543          return false;
46544        }
46545  
46546        return true;
46547      });
46548    }, [allFormatTypes, allowedFormats, interactiveContentTags]);
46549    const keyedSelected = (0,external_wp_data_namespaceObject.useSelect)(select => formatTypes.reduce((accumulator, type) => {
46550      if (type.__experimentalGetPropsForEditableTreePreparation) {
46551        accumulator[type.name] = type.__experimentalGetPropsForEditableTreePreparation(select, {
46552          richTextIdentifier: identifier,
46553          blockClientId: clientId
46554        });
46555      }
46556  
46557      return accumulator;
46558    }, {}), [formatTypes, clientId, identifier]);
46559    const dispatch = (0,external_wp_data_namespaceObject.useDispatch)();
46560    const prepareHandlers = [];
46561    const valueHandlers = [];
46562    const changeHandlers = [];
46563    const dependencies = [];
46564    formatTypes.forEach(type => {
46565      if (type.__experimentalCreatePrepareEditableTree) {
46566        const selected = keyedSelected[type.name];
46567  
46568        const handler = type.__experimentalCreatePrepareEditableTree(selected, {
46569          richTextIdentifier: identifier,
46570          blockClientId: clientId
46571        });
46572  
46573        if (type.__experimentalCreateOnChangeEditableValue) {
46574          valueHandlers.push(handler);
46575        } else {
46576          prepareHandlers.push(handler);
46577        }
46578  
46579        for (const key in selected) {
46580          dependencies.push(selected[key]);
46581        }
46582      }
46583  
46584      if (type.__experimentalCreateOnChangeEditableValue) {
46585        let dispatchers = {};
46586  
46587        if (type.__experimentalGetPropsForEditableTreeChangeHandler) {
46588          dispatchers = type.__experimentalGetPropsForEditableTreeChangeHandler(dispatch, {
46589            richTextIdentifier: identifier,
46590            blockClientId: clientId
46591          });
46592        }
46593  
46594        changeHandlers.push(type.__experimentalCreateOnChangeEditableValue({ ...(keyedSelected[type.name] || {}),
46595          ...dispatchers
46596        }, {
46597          richTextIdentifier: identifier,
46598          blockClientId: clientId
46599        }));
46600      }
46601    });
46602    return {
46603      formatTypes,
46604      prepareHandlers,
46605      valueHandlers,
46606      changeHandlers,
46607      dependencies
46608    };
46609  }
46610  
46611  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/rich-text/use-remove-browser-shortcuts.js
46612  /**
46613   * WordPress dependencies
46614   */
46615  
46616  
46617  /**
46618   * Hook to prevent default behaviors for key combinations otherwise handled
46619   * internally by RichText.
46620   *
46621   * @return {import('react').RefObject} The component to be rendered.
46622   */
46623  
46624  function useRemoveBrowserShortcuts() {
46625    return (0,external_wp_compose_namespaceObject.useRefEffect)(node => {
46626      function onKeydown(event) {
46627        if (external_wp_keycodes_namespaceObject.isKeyboardEvent.primary(event, 'z') || external_wp_keycodes_namespaceObject.isKeyboardEvent.primary(event, 'y') || external_wp_keycodes_namespaceObject.isKeyboardEvent.primaryShift(event, 'z')) {
46628          event.preventDefault();
46629        }
46630      }
46631  
46632      node.addEventListener('keydown', onKeydown);
46633      return () => {
46634        node.addEventListener('keydown', onKeydown);
46635      };
46636    }, []);
46637  }
46638  
46639  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/rich-text/use-shortcuts.js
46640  /**
46641   * WordPress dependencies
46642   */
46643  
46644  function useShortcuts(keyboardShortcuts) {
46645    return (0,external_wp_compose_namespaceObject.useRefEffect)(element => {
46646      function onKeyDown(event) {
46647        for (const keyboardShortcut of keyboardShortcuts.current) {
46648          keyboardShortcut(event);
46649        }
46650      }
46651  
46652      element.addEventListener('keydown', onKeyDown);
46653      return () => {
46654        element.removeEventListener('keydown', onKeyDown);
46655      };
46656    }, []);
46657  }
46658  
46659  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/rich-text/use-input-events.js
46660  /**
46661   * WordPress dependencies
46662   */
46663  
46664  function useInputEvents(inputEvents) {
46665    return (0,external_wp_compose_namespaceObject.useRefEffect)(element => {
46666      function onInput(event) {
46667        for (const keyboardShortcut of inputEvents.current) {
46668          keyboardShortcut(event);
46669        }
46670      }
46671  
46672      element.addEventListener('input', onInput);
46673      return () => {
46674        element.removeEventListener('input', onInput);
46675      };
46676    }, []);
46677  }
46678  
46679  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/rich-text/use-firefox-compat.js
46680  /**
46681   * WordPress dependencies
46682   */
46683  
46684  
46685  /**
46686   * Internal dependencies
46687   */
46688  
46689  
46690  function useFirefoxCompat() {
46691    const {
46692      isMultiSelecting
46693    } = (0,external_wp_data_namespaceObject.useSelect)(store);
46694    return (0,external_wp_compose_namespaceObject.useRefEffect)(element => {
46695      function onFocus() {
46696        if (!isMultiSelecting()) {
46697          return;
46698        } // This is a little hack to work around focus issues with nested
46699        // editable elements in Firefox. For some reason the editable child
46700        // element sometimes regains focus, while it should not be focusable
46701        // and focus should remain on the editable parent element.
46702        // To do: try to find the cause of the shifting focus.
46703  
46704  
46705        const parentEditable = element.parentElement.closest('[contenteditable="true"]');
46706  
46707        if (parentEditable) {
46708          parentEditable.focus();
46709        }
46710      }
46711  
46712      element.addEventListener('focus', onFocus);
46713      return () => {
46714        element.removeEventListener('focus', onFocus);
46715      };
46716    }, []);
46717  }
46718  
46719  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/rich-text/format-edit.js
46720  
46721  
46722  /**
46723   * WordPress dependencies
46724   */
46725  
46726  /**
46727   * External dependencies
46728   */
46729  
46730  
46731  function FormatEdit(_ref) {
46732    let {
46733      formatTypes,
46734      onChange,
46735      onFocus,
46736      value,
46737      forwardedRef
46738    } = _ref;
46739    return formatTypes.map(settings => {
46740      const {
46741        name,
46742        edit: Edit
46743      } = settings;
46744  
46745      if (!Edit) {
46746        return null;
46747      }
46748  
46749      const activeFormat = (0,external_wp_richText_namespaceObject.getActiveFormat)(value, name);
46750      let isActive = activeFormat !== undefined;
46751      const activeObject = (0,external_wp_richText_namespaceObject.getActiveObject)(value);
46752      const isObjectActive = activeObject !== undefined && activeObject.type === name; // Edge case: un-collapsed link formats.
46753      // If there is a missing link format at either end of the selection
46754      // then we shouldn't show the Edit UI because the selection has exceeded
46755      // the bounds of the link format.
46756      // Also if the format objects don't match then we're dealing with two separate
46757      // links so we should not allow the link to be modified over the top.
46758  
46759      if (name === 'core/link' && !(0,external_wp_richText_namespaceObject.isCollapsed)(value)) {
46760        const formats = value.formats;
46761        const linkFormatAtStart = (0,external_lodash_namespaceObject.find)(formats[value.start], {
46762          type: 'core/link'
46763        });
46764        const linkFormatAtEnd = (0,external_lodash_namespaceObject.find)(formats[value.end - 1], {
46765          type: 'core/link'
46766        });
46767  
46768        if (!linkFormatAtStart || !linkFormatAtEnd || linkFormatAtStart !== linkFormatAtEnd) {
46769          isActive = false;
46770        }
46771      }
46772  
46773      return (0,external_wp_element_namespaceObject.createElement)(Edit, {
46774        key: name,
46775        isActive: isActive,
46776        activeAttributes: isActive ? activeFormat.attributes || {} : {},
46777        isObjectActive: isObjectActive,
46778        activeObjectAttributes: isObjectActive ? activeObject.attributes || {} : {},
46779        value: value,
46780        onChange: onChange,
46781        onFocus: onFocus,
46782        contentRef: forwardedRef
46783      });
46784    });
46785  }
46786  
46787  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/rich-text/index.js
46788  
46789  
46790  
46791  /**
46792   * External dependencies
46793   */
46794  
46795  
46796  /**
46797   * WordPress dependencies
46798   */
46799  
46800  
46801  
46802  
46803  
46804  
46805  
46806  
46807  
46808  /**
46809   * Internal dependencies
46810   */
46811  
46812  
46813  
46814  
46815  
46816  
46817  
46818  
46819  
46820  
46821  
46822  
46823  
46824  
46825  
46826  
46827  
46828  
46829  const keyboardShortcutContext = (0,external_wp_element_namespaceObject.createContext)();
46830  const inputEventContext = (0,external_wp_element_namespaceObject.createContext)();
46831  /**
46832   * Removes props used for the native version of RichText so that they are not
46833   * passed to the DOM element and log warnings.
46834   *
46835   * @param {Object} props Props to filter.
46836   *
46837   * @return {Object} Filtered props.
46838   */
46839  
46840  function removeNativeProps(props) {
46841    return (0,external_lodash_namespaceObject.omit)(props, ['__unstableMobileNoFocusOnMount', 'deleteEnter', 'placeholderTextColor', 'textAlign', 'selectionColor', 'tagsToEliminate', 'rootTagsToEliminate', 'disableEditingMenu', 'fontSize', 'fontFamily', 'fontWeight', 'fontStyle', 'minWidth', 'maxWidth', 'setRef']);
46842  }
46843  
46844  function RichTextWrapper(_ref, forwardedRef) {
46845    let {
46846      children,
46847      tagName = 'div',
46848      value: originalValue = '',
46849      onChange: originalOnChange,
46850      isSelected: originalIsSelected,
46851      multiline,
46852      inlineToolbar,
46853      wrapperClassName,
46854      autocompleters,
46855      onReplace,
46856      placeholder,
46857      allowedFormats,
46858      formattingControls,
46859      withoutInteractiveFormatting,
46860      onRemove,
46861      onMerge,
46862      onSplit,
46863      __unstableOnSplitAtEnd: onSplitAtEnd,
46864      __unstableOnSplitMiddle: onSplitMiddle,
46865      identifier,
46866      preserveWhiteSpace,
46867      __unstablePastePlainText: pastePlainText,
46868      __unstableEmbedURLOnPaste,
46869      __unstableDisableFormats: disableFormats,
46870      disableLineBreaks,
46871      unstableOnFocus,
46872      __unstableAllowPrefixTransformations,
46873      ...props
46874    } = _ref;
46875    const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(RichTextWrapper);
46876    identifier = identifier || instanceId;
46877    props = removeNativeProps(props);
46878    const anchorRef = (0,external_wp_element_namespaceObject.useRef)();
46879    const {
46880      clientId
46881    } = useBlockEditContext();
46882  
46883    const selector = select => {
46884      const {
46885        getSelectionStart,
46886        getSelectionEnd
46887      } = select(store);
46888      const selectionStart = getSelectionStart();
46889      const selectionEnd = getSelectionEnd();
46890      let isSelected;
46891  
46892      if (originalIsSelected === undefined) {
46893        isSelected = selectionStart.clientId === clientId && selectionEnd.clientId === clientId && selectionStart.attributeKey === identifier;
46894      } else if (originalIsSelected) {
46895        isSelected = selectionStart.clientId === clientId;
46896      }
46897  
46898      return {
46899        selectionStart: isSelected ? selectionStart.offset : undefined,
46900        selectionEnd: isSelected ? selectionEnd.offset : undefined,
46901        isSelected
46902      };
46903    }; // This selector must run on every render so the right selection state is
46904    // retreived from the store on merge.
46905    // To do: fix this somehow.
46906  
46907  
46908    const {
46909      selectionStart,
46910      selectionEnd,
46911      isSelected
46912    } = (0,external_wp_data_namespaceObject.useSelect)(selector);
46913    const {
46914      selectionChange
46915    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
46916    const multilineTag = getMultilineTag(multiline);
46917    const adjustedAllowedFormats = getAllowedFormats({
46918      allowedFormats,
46919      formattingControls,
46920      disableFormats
46921    });
46922    const hasFormats = !adjustedAllowedFormats || adjustedAllowedFormats.length > 0;
46923    let adjustedValue = originalValue;
46924    let adjustedOnChange = originalOnChange; // Handle deprecated format.
46925  
46926    if (Array.isArray(originalValue)) {
46927      adjustedValue = external_wp_blocks_namespaceObject.children.toHTML(originalValue);
46928  
46929      adjustedOnChange = newValue => originalOnChange(external_wp_blocks_namespaceObject.children.fromDOM((0,external_wp_richText_namespaceObject.__unstableCreateElement)(document, newValue).childNodes));
46930    }
46931  
46932    const onSelectionChange = (0,external_wp_element_namespaceObject.useCallback)((start, end) => {
46933      const selection = {};
46934      const unset = start === undefined && end === undefined;
46935  
46936      if (typeof start === 'number' || unset) {
46937        selection.start = {
46938          clientId,
46939          attributeKey: identifier,
46940          offset: start
46941        };
46942      }
46943  
46944      if (typeof end === 'number' || unset) {
46945        selection.end = {
46946          clientId,
46947          attributeKey: identifier,
46948          offset: end
46949        };
46950      }
46951  
46952      selectionChange(selection);
46953    }, [clientId, identifier]);
46954    const {
46955      formatTypes,
46956      prepareHandlers,
46957      valueHandlers,
46958      changeHandlers,
46959      dependencies
46960    } = useFormatTypes({
46961      clientId,
46962      identifier,
46963      withoutInteractiveFormatting,
46964      allowedFormats: adjustedAllowedFormats
46965    });
46966  
46967    function addEditorOnlyFormats(value) {
46968      return valueHandlers.reduce((accumulator, fn) => fn(accumulator, value.text), value.formats);
46969    }
46970  
46971    function removeEditorOnlyFormats(value) {
46972      formatTypes.forEach(formatType => {
46973        // Remove formats created by prepareEditableTree, because they are editor only.
46974        if (formatType.__experimentalCreatePrepareEditableTree) {
46975          value = (0,external_wp_richText_namespaceObject.removeFormat)(value, formatType.name, 0, value.text.length);
46976        }
46977      });
46978      return value.formats;
46979    }
46980  
46981    function addInvisibleFormats(value) {
46982      return prepareHandlers.reduce((accumulator, fn) => fn(accumulator, value.text), value.formats);
46983    }
46984  
46985    const {
46986      value,
46987      onChange,
46988      ref: richTextRef
46989    } = (0,external_wp_richText_namespaceObject.__unstableUseRichText)({
46990      value: adjustedValue,
46991  
46992      onChange(html, _ref2) {
46993        let {
46994          __unstableFormats,
46995          __unstableText
46996        } = _ref2;
46997        adjustedOnChange(html);
46998        Object.values(changeHandlers).forEach(changeHandler => {
46999          changeHandler(__unstableFormats, __unstableText);
47000        });
47001      },
47002  
47003      selectionStart,
47004      selectionEnd,
47005      onSelectionChange,
47006      placeholder,
47007      __unstableIsSelected: isSelected,
47008      __unstableMultilineTag: multilineTag,
47009      __unstableDisableFormats: disableFormats,
47010      preserveWhiteSpace,
47011      __unstableDependencies: [...dependencies, tagName],
47012      __unstableAfterParse: addEditorOnlyFormats,
47013      __unstableBeforeSerialize: removeEditorOnlyFormats,
47014      __unstableAddInvisibleFormats: addInvisibleFormats
47015    });
47016    const autocompleteProps = useBlockEditorAutocompleteProps({
47017      onReplace,
47018      completers: autocompleters,
47019      record: value,
47020      onChange
47021    });
47022    useCaretInFormat({
47023      value
47024    });
47025    useMarkPersistent({
47026      html: adjustedValue,
47027      value
47028    });
47029    const keyboardShortcuts = (0,external_wp_element_namespaceObject.useRef)(new Set());
47030    const inputEvents = (0,external_wp_element_namespaceObject.useRef)(new Set());
47031  
47032    function onKeyDown(event) {
47033      const {
47034        keyCode
47035      } = event;
47036  
47037      if (event.defaultPrevented) {
47038        return;
47039      }
47040  
47041      if (keyCode === external_wp_keycodes_namespaceObject.DELETE || keyCode === external_wp_keycodes_namespaceObject.BACKSPACE) {
47042        const {
47043          start,
47044          end,
47045          text
47046        } = value;
47047        const isReverse = keyCode === external_wp_keycodes_namespaceObject.BACKSPACE;
47048        const hasActiveFormats = value.activeFormats && !!value.activeFormats.length; // Only process delete if the key press occurs at an uncollapsed edge.
47049  
47050        if (!(0,external_wp_richText_namespaceObject.isCollapsed)(value) || hasActiveFormats || isReverse && start !== 0 || !isReverse && end !== text.length) {
47051          return;
47052        }
47053  
47054        if (onMerge) {
47055          onMerge(!isReverse);
47056        } // Only handle remove on Backspace. This serves dual-purpose of being
47057        // an intentional user interaction distinguishing between Backspace and
47058        // Delete to remove the empty field, but also to avoid merge & remove
47059        // causing destruction of two fields (merge, then removed merged).
47060  
47061  
47062        if (onRemove && (0,external_wp_richText_namespaceObject.isEmpty)(value) && isReverse) {
47063          onRemove(!isReverse);
47064        }
47065  
47066        event.preventDefault();
47067      }
47068    }
47069  
47070    function onFocus() {
47071      anchorRef.current.focus();
47072    }
47073  
47074    const TagName = tagName;
47075    const content = (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, isSelected && (0,external_wp_element_namespaceObject.createElement)(keyboardShortcutContext.Provider, {
47076      value: keyboardShortcuts
47077    }, (0,external_wp_element_namespaceObject.createElement)(inputEventContext.Provider, {
47078      value: inputEvents
47079    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Popover.__unstableSlotNameProvider, {
47080      value: "__unstable-block-tools-after"
47081    }, children && children({
47082      value,
47083      onChange,
47084      onFocus
47085    }), (0,external_wp_element_namespaceObject.createElement)(FormatEdit, {
47086      value: value,
47087      onChange: onChange,
47088      onFocus: onFocus,
47089      formatTypes: formatTypes,
47090      forwardedRef: anchorRef
47091    })))), isSelected && hasFormats && (0,external_wp_element_namespaceObject.createElement)(format_toolbar_container, {
47092      inline: inlineToolbar,
47093      anchorRef: anchorRef.current
47094    }), (0,external_wp_element_namespaceObject.createElement)(TagName // Overridable props.
47095    , _extends({
47096      role: "textbox",
47097      "aria-multiline": !disableLineBreaks,
47098      "aria-label": placeholder
47099    }, props, autocompleteProps, {
47100      ref: (0,external_wp_compose_namespaceObject.useMergeRefs)([forwardedRef, autocompleteProps.ref, props.ref, richTextRef, useInputRules({
47101        value,
47102        onChange,
47103        __unstableAllowPrefixTransformations,
47104        formatTypes,
47105        onReplace,
47106        selectionChange
47107      }), useRemoveBrowserShortcuts(), useShortcuts(keyboardShortcuts), useInputEvents(inputEvents), useUndoAutomaticChange(), usePasteHandler({
47108        isSelected,
47109        disableFormats,
47110        onChange,
47111        value,
47112        formatTypes,
47113        tagName,
47114        onReplace,
47115        onSplit,
47116        onSplitMiddle,
47117        __unstableEmbedURLOnPaste,
47118        multilineTag,
47119        preserveWhiteSpace,
47120        pastePlainText
47121      }), useEnter({
47122        removeEditorOnlyFormats,
47123        value,
47124        onReplace,
47125        onSplit,
47126        onSplitMiddle,
47127        multilineTag,
47128        onChange,
47129        disableLineBreaks,
47130        onSplitAtEnd
47131      }), useFirefoxCompat(), anchorRef]),
47132      contentEditable: true,
47133      suppressContentEditableWarning: true,
47134      className: classnames_default()('block-editor-rich-text__editable', props.className, 'rich-text'),
47135      onFocus: unstableOnFocus,
47136      onKeyDown: onKeyDown
47137    })));
47138  
47139    if (!wrapperClassName) {
47140      return content;
47141    }
47142  
47143    external_wp_deprecated_default()('wp.blockEditor.RichText wrapperClassName prop', {
47144      since: '5.4',
47145      alternative: 'className prop or create your own wrapper div',
47146      version: '6.2'
47147    });
47148    const className = classnames_default()('block-editor-rich-text', wrapperClassName);
47149    return (0,external_wp_element_namespaceObject.createElement)("div", {
47150      className: className
47151    }, content);
47152  }
47153  
47154  const ForwardedRichTextContainer = (0,external_wp_element_namespaceObject.forwardRef)(RichTextWrapper);
47155  
47156  ForwardedRichTextContainer.Content = _ref3 => {
47157    let {
47158      value,
47159      tagName: Tag,
47160      multiline,
47161      ...props
47162    } = _ref3;
47163  
47164    // Handle deprecated `children` and `node` sources.
47165    if (Array.isArray(value)) {
47166      value = external_wp_blocks_namespaceObject.children.toHTML(value);
47167    }
47168  
47169    const MultilineTag = getMultilineTag(multiline);
47170  
47171    if (!value && MultilineTag) {
47172      value = `<$MultilineTag}></$MultilineTag}>`;
47173    }
47174  
47175    const content = (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.RawHTML, null, value);
47176  
47177    if (Tag) {
47178      return (0,external_wp_element_namespaceObject.createElement)(Tag, (0,external_lodash_namespaceObject.omit)(props, ['format']), content);
47179    }
47180  
47181    return content;
47182  };
47183  
47184  ForwardedRichTextContainer.isEmpty = value => {
47185    return !value || value.length === 0;
47186  };
47187  /**
47188   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/rich-text/README.md
47189   */
47190  
47191  
47192  /* harmony default export */ var rich_text = (ForwardedRichTextContainer);
47193  
47194  
47195  
47196  
47197  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/editable-text/index.js
47198  
47199  
47200  
47201  /**
47202   * WordPress dependencies
47203   */
47204  
47205  /**
47206   * Internal dependencies
47207   */
47208  
47209  
47210  const EditableText = (0,external_wp_element_namespaceObject.forwardRef)((props, ref) => {
47211    return (0,external_wp_element_namespaceObject.createElement)(rich_text, _extends({
47212      ref: ref
47213    }, props, {
47214      __unstableDisableFormats: true,
47215      preserveWhiteSpace: true
47216    }));
47217  });
47218  
47219  EditableText.Content = _ref => {
47220    let {
47221      value = '',
47222      tagName: Tag = 'div',
47223      ...props
47224    } = _ref;
47225    return (0,external_wp_element_namespaceObject.createElement)(Tag, props, value);
47226  };
47227  /**
47228   * Renders an editable text input in which text formatting is not allowed.
47229   */
47230  
47231  
47232  /* harmony default export */ var editable_text = (EditableText);
47233  
47234  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/plain-text/index.js
47235  
47236  
47237  
47238  /**
47239   * External dependencies
47240   */
47241  
47242  
47243  /**
47244   * WordPress dependencies
47245   */
47246  
47247  
47248  /**
47249   * Internal dependencies
47250   */
47251  
47252  
47253  /**
47254   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/plain-text/README.md
47255   */
47256  
47257  const PlainText = (0,external_wp_element_namespaceObject.forwardRef)((_ref, ref) => {
47258    let {
47259      __experimentalVersion,
47260      ...props
47261    } = _ref;
47262  
47263    if (__experimentalVersion === 2) {
47264      return (0,external_wp_element_namespaceObject.createElement)(editable_text, _extends({
47265        ref: ref
47266      }, props));
47267    }
47268  
47269    const {
47270      className,
47271      onChange,
47272      ...remainingProps
47273    } = props;
47274    return (0,external_wp_element_namespaceObject.createElement)(lib/* default */.Z, _extends({
47275      ref: ref,
47276      className: classnames_default()('block-editor-plain-text', className),
47277      onChange: event => onChange(event.target.value)
47278    }, remainingProps));
47279  });
47280  /* harmony default export */ var plain_text = (PlainText);
47281  
47282  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/responsive-block-control/label.js
47283  
47284  
47285  /**
47286   * WordPress dependencies
47287   */
47288  
47289  
47290  
47291  
47292  function ResponsiveBlockControlLabel(_ref) {
47293    let {
47294      property,
47295      viewport,
47296      desc
47297    } = _ref;
47298    const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(ResponsiveBlockControlLabel);
47299    const accessibleLabel = desc || (0,external_wp_i18n_namespaceObject.sprintf)(
47300    /* translators: 1: property name. 2: viewport name. */
47301    (0,external_wp_i18n_namespaceObject._x)('Controls the %1$s property for %2$s viewports.', 'Text labelling a interface as controlling a given layout property (eg: margin) for a given screen size.'), property, viewport.label);
47302    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)("span", {
47303      "aria-describedby": `rbc-desc-$instanceId}`
47304    }, viewport.label), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.VisuallyHidden, {
47305      as: "span",
47306      id: `rbc-desc-$instanceId}`
47307    }, accessibleLabel));
47308  }
47309  
47310  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/responsive-block-control/index.js
47311  
47312  
47313  /**
47314   * External dependencies
47315   */
47316  
47317  /**
47318   * WordPress dependencies
47319   */
47320  
47321  
47322  
47323  
47324  /**
47325   * Internal dependencies
47326   */
47327  
47328  
47329  
47330  function ResponsiveBlockControl(props) {
47331    const {
47332      title,
47333      property,
47334      toggleLabel,
47335      onIsResponsiveChange,
47336      renderDefaultControl,
47337      renderResponsiveControls,
47338      isResponsive = false,
47339      defaultLabel = {
47340        id: 'all',
47341  
47342        /* translators: 'Label. Used to signify a layout property (eg: margin, padding) will apply uniformly to all screensizes.' */
47343        label: (0,external_wp_i18n_namespaceObject.__)('All')
47344      },
47345      viewports = [{
47346        id: 'small',
47347        label: (0,external_wp_i18n_namespaceObject.__)('Small screens')
47348      }, {
47349        id: 'medium',
47350        label: (0,external_wp_i18n_namespaceObject.__)('Medium screens')
47351      }, {
47352        id: 'large',
47353        label: (0,external_wp_i18n_namespaceObject.__)('Large screens')
47354      }]
47355    } = props;
47356  
47357    if (!title || !property || !renderDefaultControl) {
47358      return null;
47359    }
47360  
47361    const toggleControlLabel = toggleLabel || (0,external_wp_i18n_namespaceObject.sprintf)(
47362    /* translators: 'Toggle control label. Should the property be the same across all screen sizes or unique per screen size.'. %s property value for the control (eg: margin, padding...etc) */
47363    (0,external_wp_i18n_namespaceObject.__)('Use the same %s on all screensizes.'), property);
47364    /* translators: 'Help text for the responsive mode toggle control.' */
47365  
47366    const toggleHelpText = (0,external_wp_i18n_namespaceObject.__)('Toggle between using the same value for all screen sizes or using a unique value per screen size.');
47367  
47368    const defaultControl = renderDefaultControl((0,external_wp_element_namespaceObject.createElement)(ResponsiveBlockControlLabel, {
47369      property: property,
47370      viewport: defaultLabel
47371    }), defaultLabel);
47372  
47373    const defaultResponsiveControls = () => {
47374      return viewports.map(viewport => (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, {
47375        key: viewport.id
47376      }, renderDefaultControl((0,external_wp_element_namespaceObject.createElement)(ResponsiveBlockControlLabel, {
47377        property: property,
47378        viewport: viewport
47379      }), viewport)));
47380    };
47381  
47382    return (0,external_wp_element_namespaceObject.createElement)("fieldset", {
47383      className: "block-editor-responsive-block-control"
47384    }, (0,external_wp_element_namespaceObject.createElement)("legend", {
47385      className: "block-editor-responsive-block-control__title"
47386    }, title), (0,external_wp_element_namespaceObject.createElement)("div", {
47387      className: "block-editor-responsive-block-control__inner"
47388    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToggleControl, {
47389      className: "block-editor-responsive-block-control__toggle",
47390      label: toggleControlLabel,
47391      checked: !isResponsive,
47392      onChange: onIsResponsiveChange,
47393      help: toggleHelpText
47394    }), (0,external_wp_element_namespaceObject.createElement)("div", {
47395      className: classnames_default()('block-editor-responsive-block-control__group', {
47396        'is-responsive': isResponsive
47397      })
47398    }, !isResponsive && defaultControl, isResponsive && (renderResponsiveControls ? renderResponsiveControls(viewports) : defaultResponsiveControls()))));
47399  }
47400  
47401  /* harmony default export */ var responsive_block_control = (ResponsiveBlockControl);
47402  
47403  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/rich-text/shortcut.js
47404  /**
47405   * WordPress dependencies
47406   */
47407  
47408  
47409  /**
47410   * Internal dependencies
47411   */
47412  
47413  
47414  function RichTextShortcut(_ref) {
47415    let {
47416      character,
47417      type,
47418      onUse
47419    } = _ref;
47420    const keyboardShortcuts = (0,external_wp_element_namespaceObject.useContext)(keyboardShortcutContext);
47421    const onUseRef = (0,external_wp_element_namespaceObject.useRef)();
47422    onUseRef.current = onUse;
47423    (0,external_wp_element_namespaceObject.useEffect)(() => {
47424      function callback(event) {
47425        if (external_wp_keycodes_namespaceObject.isKeyboardEvent[type](event, character)) {
47426          onUseRef.current();
47427          event.preventDefault();
47428        }
47429      }
47430  
47431      keyboardShortcuts.current.add(callback);
47432      return () => {
47433        keyboardShortcuts.current.delete(callback);
47434      };
47435    }, [character, type]);
47436    return null;
47437  }
47438  
47439  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/rich-text/toolbar-button.js
47440  
47441  
47442  
47443  /**
47444   * WordPress dependencies
47445   */
47446  
47447  
47448  function RichTextToolbarButton(_ref) {
47449    let {
47450      name,
47451      shortcutType,
47452      shortcutCharacter,
47453      ...props
47454    } = _ref;
47455    let shortcut;
47456    let fillName = 'RichText.ToolbarControls';
47457  
47458    if (name) {
47459      fillName += `.$name}`;
47460    }
47461  
47462    if (shortcutType && shortcutCharacter) {
47463      shortcut = external_wp_keycodes_namespaceObject.displayShortcut[shortcutType](shortcutCharacter);
47464    }
47465  
47466    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Fill, {
47467      name: fillName
47468    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarButton, _extends({}, props, {
47469      shortcut: shortcut
47470    })));
47471  }
47472  
47473  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/rich-text/input-event.js
47474  /**
47475   * WordPress dependencies
47476   */
47477  
47478  /**
47479   * Internal dependencies
47480   */
47481  
47482  
47483  function __unstableRichTextInputEvent(_ref) {
47484    let {
47485      inputType,
47486      onInput
47487    } = _ref;
47488    const callbacks = (0,external_wp_element_namespaceObject.useContext)(inputEventContext);
47489    const onInputRef = (0,external_wp_element_namespaceObject.useRef)();
47490    onInputRef.current = onInput;
47491    (0,external_wp_element_namespaceObject.useEffect)(() => {
47492      function callback(event) {
47493        if (event.inputType === inputType) {
47494          onInputRef.current();
47495          event.preventDefault();
47496        }
47497      }
47498  
47499      callbacks.current.add(callback);
47500      return () => {
47501        callbacks.current.delete(callback);
47502      };
47503    }, [inputType]);
47504    return null;
47505  }
47506  
47507  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/tool-selector/index.js
47508  
47509  
47510  
47511  /**
47512   * WordPress dependencies
47513   */
47514  
47515  
47516  
47517  
47518  
47519  /**
47520   * Internal dependencies
47521   */
47522  
47523  
47524  const selectIcon = (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.SVG, {
47525    xmlns: "http://www.w3.org/2000/svg",
47526    width: "24",
47527    height: "24",
47528    viewBox: "0 0 24 24"
47529  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Path, {
47530    d: "M9.4 20.5L5.2 3.8l14.6 9-2 .3c-.2 0-.4.1-.7.1-.9.2-1.6.3-2.2.5-.8.3-1.4.5-1.8.8-.4.3-.8.8-1.3 1.5-.4.5-.8 1.2-1.2 2l-.3.6-.9 1.9zM7.6 7.1l2.4 9.3c.2-.4.5-.8.7-1.1.6-.8 1.1-1.4 1.6-1.8.5-.4 1.3-.8 2.2-1.1l1.2-.3-8.1-5z"
47531  }));
47532  
47533  function ToolSelector(props, ref) {
47534    const isNavigationTool = (0,external_wp_data_namespaceObject.useSelect)(select => select(store).isNavigationMode(), []);
47535    const {
47536      setNavigationMode
47537    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
47538  
47539    const onSwitchMode = mode => {
47540      setNavigationMode(mode === 'edit' ? false : true);
47541    };
47542  
47543    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Dropdown, {
47544      renderToggle: _ref => {
47545        let {
47546          isOpen,
47547          onToggle
47548        } = _ref;
47549        return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, _extends({}, props, {
47550          ref: ref,
47551          icon: isNavigationTool ? selectIcon : library_edit,
47552          "aria-expanded": isOpen,
47553          "aria-haspopup": "true",
47554          onClick: onToggle
47555          /* translators: button label text should, if possible, be under 16 characters. */
47556          ,
47557          label: (0,external_wp_i18n_namespaceObject.__)('Tools')
47558        }));
47559      },
47560      position: "bottom right",
47561      renderContent: () => (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.NavigableMenu, {
47562        role: "menu",
47563        "aria-label": (0,external_wp_i18n_namespaceObject.__)('Tools')
47564      }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItemsChoice, {
47565        value: isNavigationTool ? 'select' : 'edit',
47566        onSelect: onSwitchMode,
47567        choices: [{
47568          value: 'edit',
47569          label: (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(build_module_icon, {
47570            icon: library_edit
47571          }), (0,external_wp_i18n_namespaceObject.__)('Edit'))
47572        }, {
47573          value: 'select',
47574          label: (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, selectIcon, (0,external_wp_i18n_namespaceObject.__)('Select'))
47575        }]
47576      })), (0,external_wp_element_namespaceObject.createElement)("div", {
47577        className: "block-editor-tool-selector__help"
47578      }, (0,external_wp_i18n_namespaceObject.__)('Tools provide different interactions for selecting, navigating, and editing blocks. Toggle between select and edit by pressing Escape and Enter.')))
47579    });
47580  }
47581  
47582  /* harmony default export */ var tool_selector = ((0,external_wp_element_namespaceObject.forwardRef)(ToolSelector));
47583  
47584  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/unit-control/index.js
47585  
47586  
47587  
47588  /**
47589   * WordPress dependencies
47590   */
47591  
47592  /**
47593   * Internal dependencies
47594   */
47595  
47596  
47597  function UnitControl(_ref) {
47598    let {
47599      units: unitsProp,
47600      ...props
47601    } = _ref;
47602    const units = (0,external_wp_components_namespaceObject.__experimentalUseCustomUnits)({
47603      availableUnits: useSetting('spacing.units') || ['%', 'px', 'em', 'rem', 'vw'],
47604      units: unitsProp
47605    });
47606    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalUnitControl, _extends({
47607      units: units
47608    }, props));
47609  }
47610  
47611  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/arrow-left.js
47612  
47613  
47614  /**
47615   * WordPress dependencies
47616   */
47617  
47618  const arrowLeft = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
47619    xmlns: "http://www.w3.org/2000/svg",
47620    viewBox: "0 0 24 24"
47621  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
47622    d: "M20 10.8H6.7l4.1-4.5-1.1-1.1-5.8 6.3 5.8 5.8 1.1-1.1-4-3.9H20z"
47623  }));
47624  /* harmony default export */ var arrow_left = (arrowLeft);
47625  
47626  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/url-input/button.js
47627  
47628  
47629  /**
47630   * WordPress dependencies
47631   */
47632  
47633  
47634  
47635  
47636  /**
47637   * Internal dependencies
47638   */
47639  
47640  
47641  
47642  class URLInputButton extends external_wp_element_namespaceObject.Component {
47643    constructor() {
47644      super(...arguments);
47645      this.toggle = this.toggle.bind(this);
47646      this.submitLink = this.submitLink.bind(this);
47647      this.state = {
47648        expanded: false
47649      };
47650    }
47651  
47652    toggle() {
47653      this.setState({
47654        expanded: !this.state.expanded
47655      });
47656    }
47657  
47658    submitLink(event) {
47659      event.preventDefault();
47660      this.toggle();
47661    }
47662  
47663    render() {
47664      const {
47665        url,
47666        onChange
47667      } = this.props;
47668      const {
47669        expanded
47670      } = this.state;
47671      const buttonLabel = url ? (0,external_wp_i18n_namespaceObject.__)('Edit link') : (0,external_wp_i18n_namespaceObject.__)('Insert link');
47672      return (0,external_wp_element_namespaceObject.createElement)("div", {
47673        className: "block-editor-url-input__button"
47674      }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
47675        icon: library_link,
47676        label: buttonLabel,
47677        onClick: this.toggle,
47678        className: "components-toolbar__control",
47679        isPressed: !!url
47680      }), expanded && (0,external_wp_element_namespaceObject.createElement)("form", {
47681        className: "block-editor-url-input__button-modal",
47682        onSubmit: this.submitLink
47683      }, (0,external_wp_element_namespaceObject.createElement)("div", {
47684        className: "block-editor-url-input__button-modal-line"
47685      }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
47686        className: "block-editor-url-input__back",
47687        icon: arrow_left,
47688        label: (0,external_wp_i18n_namespaceObject.__)('Close'),
47689        onClick: this.toggle
47690      }), (0,external_wp_element_namespaceObject.createElement)(url_input, {
47691        value: url || '',
47692        onChange: onChange
47693      }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
47694        icon: keyboard_return,
47695        label: (0,external_wp_i18n_namespaceObject.__)('Submit'),
47696        type: "submit"
47697      }))));
47698    }
47699  
47700  }
47701  /**
47702   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/url-input/README.md
47703   */
47704  
47705  
47706  /* harmony default export */ var url_input_button = (URLInputButton);
47707  
47708  ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/close.js
47709  
47710  
47711  /**
47712   * WordPress dependencies
47713   */
47714  
47715  const close_close = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
47716    xmlns: "http://www.w3.org/2000/svg",
47717    viewBox: "0 0 24 24"
47718  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
47719    d: "M13 11.8l6.1-6.3-1-1-6.1 6.2-6.1-6.2-1 1 6.1 6.3-6.5 6.7 1 1 6.5-6.6 6.5 6.6 1-1z"
47720  }));
47721  /* harmony default export */ var library_close = (close_close);
47722  
47723  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/url-popover/image-url-input-ui.js
47724  
47725  
47726  /**
47727   * External dependencies
47728   */
47729  
47730  /**
47731   * WordPress dependencies
47732   */
47733  
47734  
47735  
47736  
47737  
47738  /**
47739   * Internal dependencies
47740   */
47741  
47742  
47743  const LINK_DESTINATION_NONE = 'none';
47744  const LINK_DESTINATION_CUSTOM = 'custom';
47745  const LINK_DESTINATION_MEDIA = 'media';
47746  const LINK_DESTINATION_ATTACHMENT = 'attachment';
47747  const NEW_TAB_REL = ['noreferrer', 'noopener'];
47748  const icon = (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.SVG, {
47749    viewBox: "0 0 24 24",
47750    xmlns: "http://www.w3.org/2000/svg"
47751  }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Path, {
47752    d: "M0,0h24v24H0V0z",
47753    fill: "none"
47754  }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Path, {
47755    d: "m19 5v14h-14v-14h14m0-2h-14c-1.1 0-2 0.9-2 2v14c0 1.1 0.9 2 2 2h14c1.1 0 2-0.9 2-2v-14c0-1.1-0.9-2-2-2z"
47756  }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Path, {
47757    d: "m14.14 11.86l-3 3.87-2.14-2.59-3 3.86h12l-3.86-5.14z"
47758  }));
47759  
47760  const ImageURLInputUI = _ref => {
47761    let {
47762      linkDestination,
47763      onChangeUrl,
47764      url,
47765      mediaType = 'image',
47766      mediaUrl,
47767      mediaLink,
47768      linkTarget,
47769      linkClass,
47770      rel
47771    } = _ref;
47772    const [isOpen, setIsOpen] = (0,external_wp_element_namespaceObject.useState)(false);
47773    const openLinkUI = (0,external_wp_element_namespaceObject.useCallback)(() => {
47774      setIsOpen(true);
47775    });
47776    const [isEditingLink, setIsEditingLink] = (0,external_wp_element_namespaceObject.useState)(false);
47777    const [urlInput, setUrlInput] = (0,external_wp_element_namespaceObject.useState)(null);
47778    const autocompleteRef = (0,external_wp_element_namespaceObject.useRef)(null);
47779    const startEditLink = (0,external_wp_element_namespaceObject.useCallback)(() => {
47780      if (linkDestination === LINK_DESTINATION_MEDIA || linkDestination === LINK_DESTINATION_ATTACHMENT) {
47781        setUrlInput('');
47782      }
47783  
47784      setIsEditingLink(true);
47785    });
47786    const stopEditLink = (0,external_wp_element_namespaceObject.useCallback)(() => {
47787      setIsEditingLink(false);
47788    });
47789    const closeLinkUI = (0,external_wp_element_namespaceObject.useCallback)(() => {
47790      setUrlInput(null);
47791      stopEditLink();
47792      setIsOpen(false);
47793    });
47794  
47795    const getUpdatedLinkTargetSettings = value => {
47796      const newLinkTarget = value ? '_blank' : undefined;
47797      let updatedRel;
47798  
47799      if (newLinkTarget) {
47800        const rels = (rel !== null && rel !== void 0 ? rel : '').split(' ');
47801        NEW_TAB_REL.forEach(relVal => {
47802          if (!rels.includes(relVal)) {
47803            rels.push(relVal);
47804          }
47805        });
47806        updatedRel = rels.join(' ');
47807      } else {
47808        const rels = (rel !== null && rel !== void 0 ? rel : '').split(' ').filter(relVal => NEW_TAB_REL.includes(relVal) === false);
47809        updatedRel = rels.length ? rels.join(' ') : undefined;
47810      }
47811  
47812      return {
47813        linkTarget: newLinkTarget,
47814        rel: updatedRel
47815      };
47816    };
47817  
47818    const onFocusOutside = (0,external_wp_element_namespaceObject.useCallback)(() => {
47819      return event => {
47820        // The autocomplete suggestions list renders in a separate popover (in a portal),
47821        // so onFocusOutside fails to detect that a click on a suggestion occurred in the
47822        // LinkContainer. Detect clicks on autocomplete suggestions using a ref here, and
47823        // return to avoid the popover being closed.
47824        const autocompleteElement = autocompleteRef.current;
47825  
47826        if (autocompleteElement && autocompleteElement.contains(event.target)) {
47827          return;
47828        }
47829  
47830        setIsOpen(false);
47831        setUrlInput(null);
47832        stopEditLink();
47833      };
47834    });
47835    const onSubmitLinkChange = (0,external_wp_element_namespaceObject.useCallback)(() => {
47836      return event => {
47837        if (urlInput) {
47838          var _getLinkDestinations$;
47839  
47840          // It is possible the entered URL actually matches a named link destination.
47841          // This check will ensure our link destination is correct.
47842          const selectedDestination = ((_getLinkDestinations$ = getLinkDestinations().find(destination => destination.url === urlInput)) === null || _getLinkDestinations$ === void 0 ? void 0 : _getLinkDestinations$.linkDestination) || LINK_DESTINATION_CUSTOM;
47843          onChangeUrl({
47844            href: urlInput,
47845            linkDestination: selectedDestination
47846          });
47847        }
47848  
47849        stopEditLink();
47850        setUrlInput(null);
47851        event.preventDefault();
47852      };
47853    });
47854    const onLinkRemove = (0,external_wp_element_namespaceObject.useCallback)(() => {
47855      onChangeUrl({
47856        linkDestination: LINK_DESTINATION_NONE,
47857        href: ''
47858      });
47859    });
47860  
47861    const getLinkDestinations = () => {
47862      const linkDestinations = [{
47863        linkDestination: LINK_DESTINATION_MEDIA,
47864        title: (0,external_wp_i18n_namespaceObject.__)('Media File'),
47865        url: mediaType === 'image' ? mediaUrl : undefined,
47866        icon
47867      }];
47868  
47869      if (mediaType === 'image' && mediaLink) {
47870        linkDestinations.push({
47871          linkDestination: LINK_DESTINATION_ATTACHMENT,
47872          title: (0,external_wp_i18n_namespaceObject.__)('Attachment Page'),
47873          url: mediaType === 'image' ? mediaLink : undefined,
47874          icon: (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.SVG, {
47875            viewBox: "0 0 24 24",
47876            xmlns: "http://www.w3.org/2000/svg"
47877          }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Path, {
47878            d: "M0 0h24v24H0V0z",
47879            fill: "none"
47880          }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Path, {
47881            d: "M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zM6 20V4h7v5h5v11H6z"
47882          }))
47883        });
47884      }
47885  
47886      return linkDestinations;
47887    };
47888  
47889    const onSetHref = value => {
47890      const linkDestinations = getLinkDestinations();
47891      let linkDestinationInput;
47892  
47893      if (!value) {
47894        linkDestinationInput = LINK_DESTINATION_NONE;
47895      } else {
47896        linkDestinationInput = ((0,external_lodash_namespaceObject.find)(linkDestinations, destination => {
47897          return destination.url === value;
47898        }) || {
47899          linkDestination: LINK_DESTINATION_CUSTOM
47900        }).linkDestination;
47901      }
47902  
47903      onChangeUrl({
47904        linkDestination: linkDestinationInput,
47905        href: value
47906      });
47907    };
47908  
47909    const onSetNewTab = value => {
47910      const updatedLinkTarget = getUpdatedLinkTargetSettings(value);
47911      onChangeUrl(updatedLinkTarget);
47912    };
47913  
47914    const onSetLinkRel = value => {
47915      onChangeUrl({
47916        rel: value
47917      });
47918    };
47919  
47920    const onSetLinkClass = value => {
47921      onChangeUrl({
47922        linkClass: value
47923      });
47924    };
47925  
47926    const advancedOptions = (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToggleControl, {
47927      label: (0,external_wp_i18n_namespaceObject.__)('Open in new tab'),
47928      onChange: onSetNewTab,
47929      checked: linkTarget === '_blank'
47930    }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.TextControl, {
47931      label: (0,external_wp_i18n_namespaceObject.__)('Link Rel'),
47932      value: rel !== null && rel !== void 0 ? rel : '',
47933      onChange: onSetLinkRel
47934    }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.TextControl, {
47935      label: (0,external_wp_i18n_namespaceObject.__)('Link CSS Class'),
47936      value: linkClass || '',
47937      onChange: onSetLinkClass
47938    }));
47939    const linkEditorValue = urlInput !== null ? urlInput : url;
47940    const urlLabel = ((0,external_lodash_namespaceObject.find)(getLinkDestinations(), ['linkDestination', linkDestination]) || {}).title;
47941    return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarButton, {
47942      icon: library_link,
47943      className: "components-toolbar__control",
47944      label: url ? (0,external_wp_i18n_namespaceObject.__)('Edit link') : (0,external_wp_i18n_namespaceObject.__)('Insert link'),
47945      "aria-expanded": isOpen,
47946      onClick: openLinkUI
47947    }), isOpen && (0,external_wp_element_namespaceObject.createElement)(url_popover, {
47948      onFocusOutside: onFocusOutside(),
47949      onClose: closeLinkUI,
47950      renderSettings: () => advancedOptions,
47951      additionalControls: !linkEditorValue && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.NavigableMenu, null, (0,external_lodash_namespaceObject.map)(getLinkDestinations(), link => (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
47952        key: link.linkDestination,
47953        icon: link.icon,
47954        onClick: () => {
47955          setUrlInput(null);
47956          onSetHref(link.url);
47957          stopEditLink();
47958        }
47959      }, link.title)))
47960    }, (!url || isEditingLink) && (0,external_wp_element_namespaceObject.createElement)(url_popover.LinkEditor, {
47961      className: "block-editor-format-toolbar__link-container-content",
47962      value: linkEditorValue,
47963      onChangeInputValue: setUrlInput,
47964      onSubmit: onSubmitLinkChange(),
47965      autocompleteRef: autocompleteRef
47966    }), url && !isEditingLink && (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(url_popover.LinkViewer, {
47967      className: "block-editor-format-toolbar__link-container-content",
47968      url: url,
47969      onEditLinkClick: startEditLink,
47970      urlLabel: urlLabel
47971    }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
47972      icon: library_close,
47973      label: (0,external_wp_i18n_namespaceObject.__)('Remove link'),
47974      onClick: onLinkRemove
47975    }))));
47976  };
47977  
47978  
47979  
47980  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/preview-options/index.js
47981  
47982  
47983  /**
47984   * External dependencies
47985   */
47986  
47987  /**
47988   * WordPress dependencies
47989   */
47990  
47991  
47992  
47993  
47994  
47995  function PreviewOptions(_ref) {
47996    let {
47997      children,
47998      className,
47999      isEnabled = true,
48000      deviceType,
48001      setDeviceType
48002    } = _ref;
48003    const isMobile = (0,external_wp_compose_namespaceObject.useViewportMatch)('small', '<');
48004    if (isMobile) return null;
48005    const popoverProps = {
48006      className: classnames_default()(className, 'block-editor-post-preview__dropdown-content'),
48007      position: 'bottom left'
48008    };
48009    const toggleProps = {
48010      variant: 'tertiary',
48011      className: 'block-editor-post-preview__button-toggle',
48012      disabled: !isEnabled,
48013  
48014      /* translators: button label text should, if possible, be under 16 characters. */
48015      children: (0,external_wp_i18n_namespaceObject.__)('Preview')
48016    };
48017    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.DropdownMenu, {
48018      className: "block-editor-post-preview__dropdown",
48019      popoverProps: popoverProps,
48020      toggleProps: toggleProps,
48021      icon: null
48022    }, () => (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuGroup, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
48023      className: "block-editor-post-preview__button-resize",
48024      onClick: () => setDeviceType('Desktop'),
48025      icon: deviceType === 'Desktop' && library_check
48026    }, (0,external_wp_i18n_namespaceObject.__)('Desktop')), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
48027      className: "block-editor-post-preview__button-resize",
48028      onClick: () => setDeviceType('Tablet'),
48029      icon: deviceType === 'Tablet' && library_check
48030    }, (0,external_wp_i18n_namespaceObject.__)('Tablet')), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
48031      className: "block-editor-post-preview__button-resize",
48032      onClick: () => setDeviceType('Mobile'),
48033      icon: deviceType === 'Mobile' && library_check
48034    }, (0,external_wp_i18n_namespaceObject.__)('Mobile'))), children));
48035  }
48036  
48037  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/use-resize-canvas/index.js
48038  /**
48039   * WordPress dependencies
48040   */
48041  
48042  /**
48043   * Function to resize the editor window.
48044   *
48045   * @param {string} deviceType Used for determining the size of the container (e.g. Desktop, Tablet, Mobile)
48046   *
48047   * @return {Object} Inline styles to be added to resizable container.
48048   */
48049  
48050  function useResizeCanvas(deviceType) {
48051    const [actualWidth, updateActualWidth] = (0,external_wp_element_namespaceObject.useState)(window.innerWidth);
48052    (0,external_wp_element_namespaceObject.useEffect)(() => {
48053      if (deviceType === 'Desktop') {
48054        return;
48055      }
48056  
48057      const resizeListener = () => updateActualWidth(window.innerWidth);
48058  
48059      window.addEventListener('resize', resizeListener);
48060      return () => {
48061        window.removeEventListener('resize', resizeListener);
48062      };
48063    }, [deviceType]);
48064  
48065    const getCanvasWidth = device => {
48066      let deviceWidth;
48067  
48068      switch (device) {
48069        case 'Tablet':
48070          deviceWidth = 780;
48071          break;
48072  
48073        case 'Mobile':
48074          deviceWidth = 360;
48075          break;
48076  
48077        default:
48078          return null;
48079      }
48080  
48081      return deviceWidth < actualWidth ? deviceWidth : actualWidth;
48082    };
48083  
48084    const marginValue = () => window.innerHeight < 800 ? 36 : 72;
48085  
48086    const contentInlineStyles = device => {
48087      const height = device === 'Mobile' ? '768px' : '1024px';
48088  
48089      switch (device) {
48090        case 'Tablet':
48091        case 'Mobile':
48092          return {
48093            width: getCanvasWidth(device),
48094            margin: marginValue() + 'px auto',
48095            height,
48096            borderRadius: '2px 2px 2px 2px',
48097            border: '1px solid #ddd',
48098            overflowY: 'auto'
48099          };
48100  
48101        default:
48102          return null;
48103      }
48104    };
48105  
48106    return contentInlineStyles(deviceType);
48107  }
48108  
48109  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/skip-to-selected-block/index.js
48110  
48111  
48112  /**
48113   * WordPress dependencies
48114   */
48115  
48116  
48117  
48118  /**
48119   * Internal dependencies
48120   */
48121  
48122  
48123  
48124  
48125  const SkipToSelectedBlock = _ref => {
48126    let {
48127      selectedBlockClientId
48128    } = _ref;
48129    const ref = useBlockRef(selectedBlockClientId);
48130  
48131    const onClick = () => {
48132      ref.current.focus();
48133    };
48134  
48135    return selectedBlockClientId ? (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
48136      variant: "secondary",
48137      className: "block-editor-skip-to-selected-block",
48138      onClick: onClick
48139    }, (0,external_wp_i18n_namespaceObject.__)('Skip to the selected block')) : null;
48140  };
48141  /**
48142   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/skip-to-selected-block/README.md
48143   */
48144  
48145  
48146  /* harmony default export */ var skip_to_selected_block = ((0,external_wp_data_namespaceObject.withSelect)(select => {
48147    return {
48148      selectedBlockClientId: select(store).getBlockSelectionStart()
48149    };
48150  })(SkipToSelectedBlock));
48151  
48152  ;// CONCATENATED MODULE: external ["wp","wordcount"]
48153  var external_wp_wordcount_namespaceObject = window["wp"]["wordcount"];
48154  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/multi-selection-inspector/index.js
48155  
48156  
48157  /**
48158   * WordPress dependencies
48159   */
48160  
48161  
48162  
48163  
48164  
48165  /**
48166   * Internal dependencies
48167   */
48168  
48169  
48170  
48171  
48172  function MultiSelectionInspector(_ref) {
48173    let {
48174      blocks
48175    } = _ref;
48176    const words = (0,external_wp_wordcount_namespaceObject.count)((0,external_wp_blocks_namespaceObject.serialize)(blocks), 'words');
48177    return (0,external_wp_element_namespaceObject.createElement)("div", {
48178      className: "block-editor-multi-selection-inspector__card"
48179    }, (0,external_wp_element_namespaceObject.createElement)(block_icon, {
48180      icon: library_copy,
48181      showColors: true
48182    }), (0,external_wp_element_namespaceObject.createElement)("div", {
48183      className: "block-editor-multi-selection-inspector__card-content"
48184    }, (0,external_wp_element_namespaceObject.createElement)("div", {
48185      className: "block-editor-multi-selection-inspector__card-title"
48186    }, (0,external_wp_i18n_namespaceObject.sprintf)(
48187    /* translators: %d: number of blocks */
48188    (0,external_wp_i18n_namespaceObject._n)('%d block', '%d blocks', blocks.length), blocks.length)), (0,external_wp_element_namespaceObject.createElement)("div", {
48189      className: "block-editor-multi-selection-inspector__card-description"
48190    }, (0,external_wp_i18n_namespaceObject.sprintf)(
48191    /* translators: %d: number of words */
48192    (0,external_wp_i18n_namespaceObject._n)('%d word', '%d words', words), words))));
48193  }
48194  
48195  /* harmony default export */ var multi_selection_inspector = ((0,external_wp_data_namespaceObject.withSelect)(select => {
48196    const {
48197      getMultiSelectedBlocks
48198    } = select(store);
48199    return {
48200      blocks: getMultiSelectedBlocks()
48201    };
48202  })(MultiSelectionInspector));
48203  
48204  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/default-style-picker/index.js
48205  
48206  
48207  /**
48208   * WordPress dependencies
48209   */
48210  
48211  
48212  
48213  
48214  
48215  /**
48216   * Internal dependencies
48217   */
48218  
48219  
48220  
48221  function DefaultStylePicker(_ref) {
48222    let {
48223      blockName
48224    } = _ref;
48225    const {
48226      preferredStyle,
48227      onUpdatePreferredStyleVariations,
48228      styles
48229    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
48230      var _preferredStyleVariat, _preferredStyleVariat2;
48231  
48232      const settings = select(store).getSettings();
48233      const preferredStyleVariations = settings.__experimentalPreferredStyleVariations;
48234      return {
48235        preferredStyle: preferredStyleVariations === null || preferredStyleVariations === void 0 ? void 0 : (_preferredStyleVariat = preferredStyleVariations.value) === null || _preferredStyleVariat === void 0 ? void 0 : _preferredStyleVariat[blockName],
48236        onUpdatePreferredStyleVariations: (_preferredStyleVariat2 = preferredStyleVariations === null || preferredStyleVariations === void 0 ? void 0 : preferredStyleVariations.onChange) !== null && _preferredStyleVariat2 !== void 0 ? _preferredStyleVariat2 : null,
48237        styles: select(external_wp_blocks_namespaceObject.store).getBlockStyles(blockName)
48238      };
48239    }, [blockName]);
48240    const selectOptions = (0,external_wp_element_namespaceObject.useMemo)(() => [{
48241      label: (0,external_wp_i18n_namespaceObject.__)('Not set'),
48242      value: ''
48243    }, ...styles.map(_ref2 => {
48244      let {
48245        label,
48246        name
48247      } = _ref2;
48248      return {
48249        label,
48250        value: name
48251      };
48252    })], [styles]);
48253    const defaultStyleName = (0,external_wp_element_namespaceObject.useMemo)(() => {
48254      var _getDefaultStyle;
48255  
48256      return (_getDefaultStyle = getDefaultStyle(styles)) === null || _getDefaultStyle === void 0 ? void 0 : _getDefaultStyle.name;
48257    }, [styles]);
48258    const selectOnChange = (0,external_wp_element_namespaceObject.useCallback)(blockStyle => {
48259      onUpdatePreferredStyleVariations(blockName, blockStyle);
48260    }, [blockName, onUpdatePreferredStyleVariations]); // Until the functionality is migrated to global styles,
48261    // only show the default style picker if a non-default style has already been selected.
48262  
48263    if (!preferredStyle || preferredStyle === defaultStyleName) {
48264      return null;
48265    }
48266  
48267    return onUpdatePreferredStyleVariations && (0,external_wp_element_namespaceObject.createElement)("div", {
48268      className: "default-style-picker__default-switcher"
48269    }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.SelectControl, {
48270      options: selectOptions,
48271      value: preferredStyle || '',
48272      label: (0,external_wp_i18n_namespaceObject.__)('Default Style'),
48273      onChange: selectOnChange
48274    }));
48275  }
48276  
48277  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-inspector/index.js
48278  
48279  
48280  /**
48281   * WordPress dependencies
48282   */
48283  
48284  
48285  
48286  
48287  /**
48288   * Internal dependencies
48289   */
48290  
48291  
48292  
48293  
48294  
48295  
48296  
48297  
48298  
48299  
48300  
48301  const BlockInspector = _ref => {
48302    let {
48303      showNoBlockSelectedMessage = true
48304    } = _ref;
48305    const {
48306      count,
48307      hasBlockStyles,
48308      selectedBlockName,
48309      selectedBlockClientId,
48310      blockType
48311    } = (0,external_wp_data_namespaceObject.useSelect)(select => {
48312      const {
48313        getSelectedBlockClientId,
48314        getSelectedBlockCount,
48315        getBlockName
48316      } = select(store);
48317      const {
48318        getBlockStyles
48319      } = select(external_wp_blocks_namespaceObject.store);
48320  
48321      const _selectedBlockClientId = getSelectedBlockClientId();
48322  
48323      const _selectedBlockName = _selectedBlockClientId && getBlockName(_selectedBlockClientId);
48324  
48325      const _blockType = _selectedBlockName && (0,external_wp_blocks_namespaceObject.getBlockType)(_selectedBlockName);
48326  
48327      const blockStyles = _selectedBlockName && getBlockStyles(_selectedBlockName);
48328  
48329      return {
48330        count: getSelectedBlockCount(),
48331        selectedBlockClientId: _selectedBlockClientId,
48332        selectedBlockName: _selectedBlockName,
48333        blockType: _blockType,
48334        hasBlockStyles: blockStyles && blockStyles.length > 0
48335      };
48336    }, []);
48337  
48338    if (count > 1) {
48339      return (0,external_wp_element_namespaceObject.createElement)("div", {
48340        className: "block-editor-block-inspector"
48341      }, (0,external_wp_element_namespaceObject.createElement)(multi_selection_inspector, null), (0,external_wp_element_namespaceObject.createElement)(inspector_controls.Slot, null), (0,external_wp_element_namespaceObject.createElement)(inspector_controls.Slot, {
48342        __experimentalGroup: "color",
48343        label: (0,external_wp_i18n_namespaceObject.__)('Color'),
48344        className: "color-block-support-panel__inner-wrapper"
48345      }), (0,external_wp_element_namespaceObject.createElement)(inspector_controls.Slot, {
48346        __experimentalGroup: "typography",
48347        label: (0,external_wp_i18n_namespaceObject.__)('Typography')
48348      }), (0,external_wp_element_namespaceObject.createElement)(inspector_controls.Slot, {
48349        __experimentalGroup: "dimensions",
48350        label: (0,external_wp_i18n_namespaceObject.__)('Dimensions')
48351      }), (0,external_wp_element_namespaceObject.createElement)(inspector_controls.Slot, {
48352        __experimentalGroup: "border",
48353        label: (0,external_wp_i18n_namespaceObject.__)('Border')
48354      }));
48355    }
48356  
48357    const isSelectedBlockUnregistered = selectedBlockName === (0,external_wp_blocks_namespaceObject.getUnregisteredTypeHandlerName)();
48358    /*
48359     * If the selected block is of an unregistered type, avoid showing it as an actual selection
48360     * because we want the user to focus on the unregistered block warning, not block settings.
48361     */
48362  
48363    if (!blockType || !selectedBlockClientId || isSelectedBlockUnregistered) {
48364      if (showNoBlockSelectedMessage) {
48365        return (0,external_wp_element_namespaceObject.createElement)("span", {
48366          className: "block-editor-block-inspector__no-blocks"
48367        }, (0,external_wp_i18n_namespaceObject.__)('No block selected.'));
48368      }
48369  
48370      return null;
48371    }
48372  
48373    return (0,external_wp_element_namespaceObject.createElement)(BlockInspectorSingleBlock, {
48374      clientId: selectedBlockClientId,
48375      blockName: blockType.name,
48376      hasBlockStyles: hasBlockStyles
48377    });
48378  };
48379  
48380  const BlockInspectorSingleBlock = _ref2 => {
48381    let {
48382      clientId,
48383      blockName,
48384      hasBlockStyles
48385    } = _ref2;
48386    const blockInformation = useBlockDisplayInformation(clientId);
48387    return (0,external_wp_element_namespaceObject.createElement)("div", {
48388      className: "block-editor-block-inspector"
48389    }, (0,external_wp_element_namespaceObject.createElement)(block_card, blockInformation), (0,external_wp_element_namespaceObject.createElement)(block_variation_transforms, {
48390      blockClientId: clientId
48391    }), hasBlockStyles && (0,external_wp_element_namespaceObject.createElement)("div", null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.PanelBody, {
48392      title: (0,external_wp_i18n_namespaceObject.__)('Styles')
48393    }, (0,external_wp_element_namespaceObject.createElement)(block_styles, {
48394      scope: "core/block-inspector",
48395      clientId: clientId
48396    }), (0,external_wp_blocks_namespaceObject.hasBlockSupport)(blockName, 'defaultStylePicker', true) && (0,external_wp_element_namespaceObject.createElement)(DefaultStylePicker, {
48397      blockName: blockName
48398    }))), (0,external_wp_element_namespaceObject.createElement)(inspector_controls.Slot, null), (0,external_wp_element_namespaceObject.createElement)(inspector_controls.Slot, {
48399      __experimentalGroup: "color",
48400      label: (0,external_wp_i18n_namespaceObject.__)('Color'),
48401      className: "color-block-support-panel__inner-wrapper"
48402    }), (0,external_wp_element_namespaceObject.createElement)(inspector_controls.Slot, {
48403      __experimentalGroup: "typography",
48404      label: (0,external_wp_i18n_namespaceObject.__)('Typography')
48405    }), (0,external_wp_element_namespaceObject.createElement)(inspector_controls.Slot, {
48406      __experimentalGroup: "dimensions",
48407      label: (0,external_wp_i18n_namespaceObject.__)('Dimensions')
48408    }), (0,external_wp_element_namespaceObject.createElement)(inspector_controls.Slot, {
48409      __experimentalGroup: "border",
48410      label: (0,external_wp_i18n_namespaceObject.__)('Border')
48411    }), (0,external_wp_element_namespaceObject.createElement)("div", null, (0,external_wp_element_namespaceObject.createElement)(AdvancedControls, null)), (0,external_wp_element_namespaceObject.createElement)(skip_to_selected_block, {
48412      key: "back"
48413    }));
48414  };
48415  
48416  const AdvancedControls = () => {
48417    const slot = (0,external_wp_components_namespaceObject.__experimentalUseSlot)(InspectorAdvancedControls.slotName);
48418    const hasFills = Boolean(slot.fills && slot.fills.length);
48419  
48420    if (!hasFills) {
48421      return null;
48422    }
48423  
48424    return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.PanelBody, {
48425      className: "block-editor-block-inspector__advanced",
48426      title: (0,external_wp_i18n_namespaceObject.__)('Advanced'),
48427      initialOpen: false
48428    }, (0,external_wp_element_namespaceObject.createElement)(inspector_controls.Slot, {
48429      __experimentalGroup: "advanced"
48430    }));
48431  };
48432  /**
48433   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/block-inspector/README.md
48434   */
48435  
48436  
48437  /* harmony default export */ var block_inspector = (BlockInspector);
48438  
48439  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/block-tools/index.js
48440  
48441  
48442  
48443  /**
48444   * External dependencies
48445   */
48446  
48447  /**
48448   * WordPress dependencies
48449   */
48450  
48451  
48452  
48453  
48454  
48455  /**
48456   * Internal dependencies
48457   */
48458  
48459  
48460  
48461  
48462  
48463  
48464  /**
48465   * Renders block tools (the block toolbar, select/navigation mode toolbar, the
48466   * insertion point and a slot for the inline rich text toolbar). Must be wrapped
48467   * around the block content and editor styles wrapper or iframe.
48468   *
48469   * @param {Object} $0                      Props.
48470   * @param {Object} $0.children             The block content and style container.
48471   * @param {Object} $0.__unstableContentRef Ref holding the content scroll container.
48472   */
48473  
48474  function BlockTools(_ref) {
48475    let {
48476      children,
48477      __unstableContentRef,
48478      ...props
48479    } = _ref;
48480    const isLargeViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium');
48481    const hasFixedToolbar = (0,external_wp_data_namespaceObject.useSelect)(select => select(store).getSettings().hasFixedToolbar, []);
48482    const isMatch = (0,external_wp_keyboardShortcuts_namespaceObject.__unstableUseShortcutEventMatch)();
48483    const {
48484      getSelectedBlockClientIds,
48485      getBlockRootClientId
48486    } = (0,external_wp_data_namespaceObject.useSelect)(store);
48487    const {
48488      duplicateBlocks,
48489      removeBlocks,
48490      insertAfterBlock,
48491      insertBeforeBlock,
48492      clearSelectedBlock,
48493      moveBlocksUp,
48494      moveBlocksDown
48495    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
48496  
48497    function onKeyDown(event) {
48498      if (isMatch('core/block-editor/move-up', event)) {
48499        const clientIds = getSelectedBlockClientIds();
48500  
48501        if (clientIds.length) {
48502          event.preventDefault();
48503          const rootClientId = getBlockRootClientId((0,external_lodash_namespaceObject.first)(clientIds));
48504          moveBlocksUp(clientIds, rootClientId);
48505        }
48506      } else if (isMatch('core/block-editor/move-down', event)) {
48507        const clientIds = getSelectedBlockClientIds();
48508  
48509        if (clientIds.length) {
48510          event.preventDefault();
48511          const rootClientId = getBlockRootClientId((0,external_lodash_namespaceObject.first)(clientIds));
48512          moveBlocksDown(clientIds, rootClientId);
48513        }
48514      } else if (isMatch('core/block-editor/duplicate', event)) {
48515        const clientIds = getSelectedBlockClientIds();
48516  
48517        if (clientIds.length) {
48518          event.preventDefault();
48519          duplicateBlocks(clientIds);
48520        }
48521      } else if (isMatch('core/block-editor/remove', event)) {
48522        const clientIds = getSelectedBlockClientIds();
48523  
48524        if (clientIds.length) {
48525          event.preventDefault();
48526          removeBlocks(clientIds);
48527        }
48528      } else if (isMatch('core/block-editor/insert-after', event)) {
48529        const clientIds = getSelectedBlockClientIds();
48530  
48531        if (clientIds.length) {
48532          event.preventDefault();
48533          insertAfterBlock((0,external_lodash_namespaceObject.last)(clientIds));
48534        }
48535      } else if (isMatch('core/block-editor/insert-before', event)) {
48536        const clientIds = getSelectedBlockClientIds();
48537  
48538        if (clientIds.length) {
48539          event.preventDefault();
48540          insertBeforeBlock((0,external_lodash_namespaceObject.first)(clientIds));
48541        }
48542      } else if (isMatch('core/block-editor/unselect', event)) {
48543        const clientIds = getSelectedBlockClientIds();
48544  
48545        if (clientIds.length > 1) {
48546          event.preventDefault();
48547          clearSelectedBlock();
48548          event.target.ownerDocument.defaultView.getSelection().removeAllRanges();
48549        }
48550      }
48551    }
48552  
48553    return (// eslint-disable-next-line jsx-a11y/no-static-element-interactions
48554      (0,external_wp_element_namespaceObject.createElement)("div", _extends({}, props, {
48555        onKeyDown: onKeyDown
48556      }), (0,external_wp_element_namespaceObject.createElement)(InsertionPoint, {
48557        __unstableContentRef: __unstableContentRef
48558      }, (hasFixedToolbar || !isLargeViewport) && (0,external_wp_element_namespaceObject.createElement)(block_contextual_toolbar, {
48559        isFixed: true
48560      }), (0,external_wp_element_namespaceObject.createElement)(WrappedBlockPopover, {
48561        __unstableContentRef: __unstableContentRef
48562      }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Popover.Slot, {
48563        name: "block-toolbar",
48564        ref: usePopoverScroll(__unstableContentRef)
48565      }), children, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Popover.Slot, {
48566        name: "__unstable-block-tools-after",
48567        ref: usePopoverScroll(__unstableContentRef)
48568      })))
48569    );
48570  }
48571  
48572  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/inserter/library.js
48573  
48574  
48575  /**
48576   * External dependencies
48577   */
48578  
48579  /**
48580   * WordPress dependencies
48581   */
48582  
48583  
48584  
48585  /**
48586   * Internal dependencies
48587   */
48588  
48589  
48590  
48591  
48592  function InserterLibrary(_ref, ref) {
48593    let {
48594      rootClientId,
48595      clientId,
48596      isAppender,
48597      showInserterHelpPanel,
48598      showMostUsedBlocks = false,
48599      __experimentalInsertionIndex,
48600      __experimentalFilterValue,
48601      onSelect = external_lodash_namespaceObject.noop,
48602      shouldFocusBlock = false
48603    } = _ref;
48604    const destinationRootClientId = (0,external_wp_data_namespaceObject.useSelect)(select => {
48605      const {
48606        getBlockRootClientId
48607      } = select(store);
48608      return rootClientId || getBlockRootClientId(clientId) || undefined;
48609    }, [clientId, rootClientId]);
48610    return (0,external_wp_element_namespaceObject.createElement)(menu, {
48611      onSelect: onSelect,
48612      rootClientId: destinationRootClientId,
48613      clientId: clientId,
48614      isAppender: isAppender,
48615      showInserterHelpPanel: showInserterHelpPanel,
48616      showMostUsedBlocks: showMostUsedBlocks,
48617      __experimentalInsertionIndex: __experimentalInsertionIndex,
48618      __experimentalFilterValue: __experimentalFilterValue,
48619      shouldFocusBlock: shouldFocusBlock,
48620      ref: ref
48621    });
48622  }
48623  
48624  /* harmony default export */ var library = ((0,external_wp_element_namespaceObject.forwardRef)(InserterLibrary));
48625  
48626  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/keyboard-shortcuts/index.js
48627  /**
48628   * WordPress dependencies
48629   */
48630  
48631  
48632  
48633  
48634  
48635  function KeyboardShortcuts() {
48636    return null;
48637  }
48638  
48639  function KeyboardShortcutsRegister() {
48640    // Registering the shortcuts.
48641    const {
48642      registerShortcut
48643    } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_keyboardShortcuts_namespaceObject.store);
48644    (0,external_wp_element_namespaceObject.useEffect)(() => {
48645      registerShortcut({
48646        name: 'core/block-editor/duplicate',
48647        category: 'block',
48648        description: (0,external_wp_i18n_namespaceObject.__)('Duplicate the selected block(s).'),
48649        keyCombination: {
48650          modifier: 'primaryShift',
48651          character: 'd'
48652        }
48653      });
48654      registerShortcut({
48655        name: 'core/block-editor/remove',
48656        category: 'block',
48657        description: (0,external_wp_i18n_namespaceObject.__)('Remove the selected block(s).'),
48658        keyCombination: {
48659          modifier: 'access',
48660          character: 'z'
48661        }
48662      });
48663      registerShortcut({
48664        name: 'core/block-editor/insert-before',
48665        category: 'block',
48666        description: (0,external_wp_i18n_namespaceObject.__)('Insert a new block before the selected block(s).'),
48667        keyCombination: {
48668          modifier: 'primaryAlt',
48669          character: 't'
48670        }
48671      });
48672      registerShortcut({
48673        name: 'core/block-editor/insert-after',
48674        category: 'block',
48675        description: (0,external_wp_i18n_namespaceObject.__)('Insert a new block after the selected block(s).'),
48676        keyCombination: {
48677          modifier: 'primaryAlt',
48678          character: 'y'
48679        }
48680      });
48681      registerShortcut({
48682        name: 'core/block-editor/delete-multi-selection',
48683        category: 'block',
48684        description: (0,external_wp_i18n_namespaceObject.__)('Delete selection.'),
48685        keyCombination: {
48686          character: 'del'
48687        },
48688        aliases: [{
48689          character: 'backspace'
48690        }]
48691      });
48692      registerShortcut({
48693        name: 'core/block-editor/select-all',
48694        category: 'selection',
48695        description: (0,external_wp_i18n_namespaceObject.__)('Select all text when typing. Press again to select all blocks.'),
48696        keyCombination: {
48697          modifier: 'primary',
48698          character: 'a'
48699        }
48700      });
48701      registerShortcut({
48702        name: 'core/block-editor/unselect',
48703        category: 'selection',
48704        description: (0,external_wp_i18n_namespaceObject.__)('Clear selection.'),
48705        keyCombination: {
48706          character: 'escape'
48707        }
48708      });
48709      registerShortcut({
48710        name: 'core/block-editor/focus-toolbar',
48711        category: 'global',
48712        description: (0,external_wp_i18n_namespaceObject.__)('Navigate to the nearest toolbar.'),
48713        keyCombination: {
48714          modifier: 'alt',
48715          character: 'F10'
48716        }
48717      });
48718      registerShortcut({
48719        name: 'core/block-editor/move-up',
48720        category: 'block',
48721        description: (0,external_wp_i18n_namespaceObject.__)('Move the selected block(s) up.'),
48722        keyCombination: {
48723          modifier: 'secondary',
48724          character: 't'
48725        }
48726      });
48727      registerShortcut({
48728        name: 'core/block-editor/move-down',
48729        category: 'block',
48730        description: (0,external_wp_i18n_namespaceObject.__)('Move the selected block(s) down.'),
48731        keyCombination: {
48732          modifier: 'secondary',
48733          character: 'y'
48734        }
48735      });
48736    }, [registerShortcut]);
48737    return null;
48738  }
48739  
48740  KeyboardShortcuts.Register = KeyboardShortcutsRegister;
48741  /* harmony default export */ var keyboard_shortcuts = (KeyboardShortcuts);
48742  
48743  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/selection-scroll-into-view/index.js
48744  /**
48745   * WordPress dependencies
48746   */
48747  
48748  /**
48749   * Scrolls the multi block selection end into view if not in view already. This
48750   * is important to do after selection by keyboard.
48751   *
48752   * @deprecated
48753   */
48754  
48755  function MultiSelectScrollIntoView() {
48756    external_wp_deprecated_default()('wp.blockEditor.MultiSelectScrollIntoView', {
48757      hint: 'This behaviour is now built-in.',
48758      since: '5.8'
48759    });
48760    return null;
48761  }
48762  
48763  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/observe-typing/index.js
48764  
48765  
48766  /**
48767   * WordPress dependencies
48768   */
48769  
48770  
48771  
48772  
48773  /**
48774   * Internal dependencies
48775   */
48776  
48777  
48778  /**
48779   * Set of key codes upon which typing is to be initiated on a keydown event.
48780   *
48781   * @type {Set<number>}
48782   */
48783  
48784  const KEY_DOWN_ELIGIBLE_KEY_CODES = new Set([external_wp_keycodes_namespaceObject.UP, external_wp_keycodes_namespaceObject.RIGHT, external_wp_keycodes_namespaceObject.DOWN, external_wp_keycodes_namespaceObject.LEFT, external_wp_keycodes_namespaceObject.ENTER, external_wp_keycodes_namespaceObject.BACKSPACE]);
48785  /**
48786   * Returns true if a given keydown event can be inferred as intent to start
48787   * typing, or false otherwise. A keydown is considered eligible if it is a
48788   * text navigation without shift active.
48789   *
48790   * @param {KeyboardEvent} event Keydown event to test.
48791   *
48792   * @return {boolean} Whether event is eligible to start typing.
48793   */
48794  
48795  function isKeyDownEligibleForStartTyping(event) {
48796    const {
48797      keyCode,
48798      shiftKey
48799    } = event;
48800    return !shiftKey && KEY_DOWN_ELIGIBLE_KEY_CODES.has(keyCode);
48801  }
48802  /**
48803   * Removes the `isTyping` flag when the mouse moves in the document of the given
48804   * element.
48805   */
48806  
48807  
48808  function useMouseMoveTypingReset() {
48809    const isTyping = (0,external_wp_data_namespaceObject.useSelect)(select => select(store).isTyping(), []);
48810    const {
48811      stopTyping
48812    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
48813    return (0,external_wp_compose_namespaceObject.useRefEffect)(node => {
48814      if (!isTyping) {
48815        return;
48816      }
48817  
48818      const {
48819        ownerDocument
48820      } = node;
48821      let lastClientX;
48822      let lastClientY;
48823      /**
48824       * On mouse move, unset typing flag if user has moved cursor.
48825       *
48826       * @param {MouseEvent} event Mousemove event.
48827       */
48828  
48829      function stopTypingOnMouseMove(event) {
48830        const {
48831          clientX,
48832          clientY
48833        } = event; // We need to check that the mouse really moved because Safari
48834        // triggers mousemove events when shift or ctrl are pressed.
48835  
48836        if (lastClientX && lastClientY && (lastClientX !== clientX || lastClientY !== clientY)) {
48837          stopTyping();
48838        }
48839  
48840        lastClientX = clientX;
48841        lastClientY = clientY;
48842      }
48843  
48844      ownerDocument.addEventListener('mousemove', stopTypingOnMouseMove);
48845      return () => {
48846        ownerDocument.removeEventListener('mousemove', stopTypingOnMouseMove);
48847      };
48848    }, [isTyping, stopTyping]);
48849  }
48850  /**
48851   * Sets and removes the `isTyping` flag based on user actions:
48852   *
48853   * - Sets the flag if the user types within the given element.
48854   * - Removes the flag when the user selects some text, focusses a non-text
48855   *   field, presses ESC or TAB, or moves the mouse in the document.
48856   */
48857  
48858  function useTypingObserver() {
48859    const isTyping = (0,external_wp_data_namespaceObject.useSelect)(select => select(store).isTyping());
48860    const {
48861      startTyping,
48862      stopTyping
48863    } = (0,external_wp_data_namespaceObject.useDispatch)(store);
48864    const ref1 = useMouseMoveTypingReset();
48865    const ref2 = (0,external_wp_compose_namespaceObject.useRefEffect)(node => {
48866      const {
48867        ownerDocument
48868      } = node;
48869      const {
48870        defaultView
48871      } = ownerDocument; // Listeners to stop typing should only be added when typing.
48872      // Listeners to start typing should only be added when not typing.
48873  
48874      if (isTyping) {
48875        let timerId;
48876        /**
48877         * Stops typing when focus transitions to a non-text field element.
48878         *
48879         * @param {FocusEvent} event Focus event.
48880         */
48881  
48882        function stopTypingOnNonTextField(event) {
48883          const {
48884            target
48885          } = event; // Since focus to a non-text field via arrow key will trigger
48886          // before the keydown event, wait until after current stack
48887          // before evaluating whether typing is to be stopped. Otherwise,
48888          // typing will re-start.
48889  
48890          timerId = defaultView.setTimeout(() => {
48891            if (!(0,external_wp_dom_namespaceObject.isTextField)(target)) {
48892              stopTyping();
48893            }
48894          });
48895        }
48896        /**
48897         * Unsets typing flag if user presses Escape while typing flag is
48898         * active.
48899         *
48900         * @param {KeyboardEvent} event Keypress or keydown event to
48901         *                              interpret.
48902         */
48903  
48904  
48905        function stopTypingOnEscapeKey(event) {
48906          const {
48907            keyCode
48908          } = event;
48909  
48910          if (keyCode === external_wp_keycodes_namespaceObject.ESCAPE || keyCode === external_wp_keycodes_namespaceObject.TAB) {
48911            stopTyping();
48912          }
48913        }
48914        /**
48915         * On selection change, unset typing flag if user has made an
48916         * uncollapsed (shift) selection.
48917         */
48918  
48919  
48920        function stopTypingOnSelectionUncollapse() {
48921          const selection = defaultView.getSelection();
48922          const isCollapsed = selection.rangeCount > 0 && selection.getRangeAt(0).collapsed;
48923  
48924          if (!isCollapsed) {
48925            stopTyping();
48926          }
48927        }
48928  
48929        node.addEventListener('focus', stopTypingOnNonTextField);
48930        node.addEventListener('keydown', stopTypingOnEscapeKey);
48931        ownerDocument.addEventListener('selectionchange', stopTypingOnSelectionUncollapse);
48932        return () => {
48933          defaultView.clearTimeout(timerId);
48934          node.removeEventListener('focus', stopTypingOnNonTextField);
48935          node.removeEventListener('keydown', stopTypingOnEscapeKey);
48936          ownerDocument.removeEventListener('selectionchange', stopTypingOnSelectionUncollapse);
48937        };
48938      }
48939      /**
48940       * Handles a keypress or keydown event to infer intention to start
48941       * typing.
48942       *
48943       * @param {KeyboardEvent} event Keypress or keydown event to interpret.
48944       */
48945  
48946  
48947      function startTypingInTextField(event) {
48948        const {
48949          type,
48950          target
48951        } = event; // Abort early if already typing, or key press is incurred outside a
48952        // text field (e.g. arrow-ing through toolbar buttons).
48953        // Ignore typing if outside the current DOM container
48954  
48955        if (!(0,external_wp_dom_namespaceObject.isTextField)(target) || !node.contains(target)) {
48956          return;
48957        } // Special-case keydown because certain keys do not emit a keypress
48958        // event. Conversely avoid keydown as the canonical event since
48959        // there are many keydown which are explicitly not targeted for
48960        // typing.
48961  
48962  
48963        if (type === 'keydown' && !isKeyDownEligibleForStartTyping(event)) {
48964          return;
48965        }
48966  
48967        startTyping();
48968      }
48969  
48970      node.addEventListener('keypress', startTypingInTextField);
48971      node.addEventListener('keydown', startTypingInTextField);
48972      return () => {
48973        node.removeEventListener('keypress', startTypingInTextField);
48974        node.removeEventListener('keydown', startTypingInTextField);
48975      };
48976    }, [isTyping, startTyping, stopTyping]);
48977    return (0,external_wp_compose_namespaceObject.useMergeRefs)([ref1, ref2]);
48978  }
48979  
48980  function ObserveTyping(_ref) {
48981    let {
48982      children
48983    } = _ref;
48984    return (0,external_wp_element_namespaceObject.createElement)("div", {
48985      ref: useTypingObserver()
48986    }, children);
48987  }
48988  /**
48989   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/observe-typing/README.md
48990   */
48991  
48992  
48993  /* harmony default export */ var observe_typing = (ObserveTyping);
48994  
48995  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/typewriter/index.js
48996  
48997  
48998  /**
48999   * WordPress dependencies
49000   */
49001  
49002  
49003  
49004  
49005  /**
49006   * Internal dependencies
49007   */
49008  
49009  
49010  const isIE = window.navigator.userAgent.indexOf('Trident') !== -1;
49011  const arrowKeyCodes = new Set([external_wp_keycodes_namespaceObject.UP, external_wp_keycodes_namespaceObject.DOWN, external_wp_keycodes_namespaceObject.LEFT, external_wp_keycodes_namespaceObject.RIGHT]);
49012  const initialTriggerPercentage = 0.75;
49013  function useTypewriter() {
49014    const hasSelectedBlock = (0,external_wp_data_namespaceObject.useSelect)(select => select(store).hasSelectedBlock(), []);
49015    return (0,external_wp_compose_namespaceObject.useRefEffect)(node => {
49016      if (!hasSelectedBlock) {
49017        return;
49018      }
49019  
49020      const {
49021        ownerDocument
49022      } = node;
49023      const {
49024        defaultView
49025      } = ownerDocument;
49026      let scrollResizeRafId;
49027      let onKeyDownRafId;
49028      let caretRect;
49029  
49030      function onScrollResize() {
49031        if (scrollResizeRafId) {
49032          return;
49033        }
49034  
49035        scrollResizeRafId = defaultView.requestAnimationFrame(() => {
49036          computeCaretRectangle();
49037          scrollResizeRafId = null;
49038        });
49039      }
49040  
49041      function onKeyDown(event) {
49042        // Ensure the any remaining request is cancelled.
49043        if (onKeyDownRafId) {
49044          defaultView.cancelAnimationFrame(onKeyDownRafId);
49045        } // Use an animation frame for a smooth result.
49046  
49047  
49048        onKeyDownRafId = defaultView.requestAnimationFrame(() => {
49049          maintainCaretPosition(event);
49050          onKeyDownRafId = null;
49051        });
49052      }
49053      /**
49054       * Maintains the scroll position after a selection change caused by a
49055       * keyboard event.
49056       *
49057       * @param {KeyboardEvent} event Keyboard event.
49058       */
49059  
49060  
49061      function maintainCaretPosition(_ref) {
49062        let {
49063          keyCode
49064        } = _ref;
49065  
49066        if (!isSelectionEligibleForScroll()) {
49067          return;
49068        }
49069  
49070        const currentCaretRect = (0,external_wp_dom_namespaceObject.computeCaretRect)(defaultView);
49071  
49072        if (!currentCaretRect) {
49073          return;
49074        } // If for some reason there is no position set to be scrolled to, let
49075        // this be the position to be scrolled to in the future.
49076  
49077  
49078        if (!caretRect) {
49079          caretRect = currentCaretRect;
49080          return;
49081        } // Even though enabling the typewriter effect for arrow keys results in
49082        // a pleasant experience, it may not be the case for everyone, so, for
49083        // now, let's disable it.
49084  
49085  
49086        if (arrowKeyCodes.has(keyCode)) {
49087          // Reset the caret position to maintain.
49088          caretRect = currentCaretRect;
49089          return;
49090        }
49091  
49092        const diff = currentCaretRect.top - caretRect.top;
49093  
49094        if (diff === 0) {
49095          return;
49096        }
49097  
49098        const scrollContainer = (0,external_wp_dom_namespaceObject.getScrollContainer)(node); // The page must be scrollable.
49099  
49100        if (!scrollContainer) {
49101          return;
49102        }
49103  
49104        const windowScroll = scrollContainer === ownerDocument.body;
49105        const scrollY = windowScroll ? defaultView.scrollY : scrollContainer.scrollTop;
49106        const scrollContainerY = windowScroll ? 0 : scrollContainer.getBoundingClientRect().top;
49107        const relativeScrollPosition = windowScroll ? caretRect.top / defaultView.innerHeight : (caretRect.top - scrollContainerY) / (defaultView.innerHeight - scrollContainerY); // If the scroll position is at the start, the active editable element
49108        // is the last one, and the caret is positioned within the initial
49109        // trigger percentage of the page, do not scroll the page.
49110        // The typewriter effect should not kick in until an empty page has been
49111        // filled with the initial trigger percentage or the user scrolls
49112        // intentionally down.
49113  
49114        if (scrollY === 0 && relativeScrollPosition < initialTriggerPercentage && isLastEditableNode()) {
49115          // Reset the caret position to maintain.
49116          caretRect = currentCaretRect;
49117          return;
49118        }
49119  
49120        const scrollContainerHeight = windowScroll ? defaultView.innerHeight : scrollContainer.clientHeight; // Abort if the target scroll position would scroll the caret out of
49121        // view.
49122  
49123        if ( // The caret is under the lower fold.
49124        caretRect.top + caretRect.height > scrollContainerY + scrollContainerHeight || // The caret is above the upper fold.
49125        caretRect.top < scrollContainerY) {
49126          // Reset the caret position to maintain.
49127          caretRect = currentCaretRect;
49128          return;
49129        }
49130  
49131        if (windowScroll) {
49132          defaultView.scrollBy(0, diff);
49133        } else {
49134          scrollContainer.scrollTop += diff;
49135        }
49136      }
49137      /**
49138       * Adds a `selectionchange` listener to reset the scroll position to be
49139       * maintained.
49140       */
49141  
49142  
49143      function addSelectionChangeListener() {
49144        ownerDocument.addEventListener('selectionchange', computeCaretRectOnSelectionChange);
49145      }
49146      /**
49147       * Resets the scroll position to be maintained during a `selectionchange`
49148       * event. Also removes the listener, so it acts as a one-time listener.
49149       */
49150  
49151  
49152      function computeCaretRectOnSelectionChange() {
49153        ownerDocument.removeEventListener('selectionchange', computeCaretRectOnSelectionChange);
49154        computeCaretRectangle();
49155      }
49156      /**
49157       * Resets the scroll position to be maintained.
49158       */
49159  
49160  
49161      function computeCaretRectangle() {
49162        if (isSelectionEligibleForScroll()) {
49163          caretRect = (0,external_wp_dom_namespaceObject.computeCaretRect)(defaultView);
49164        }
49165      }
49166      /**
49167       * Checks if the current situation is elegible for scroll:
49168       * - There should be one and only one block selected.
49169       * - The component must contain the selection.
49170       * - The active element must be contenteditable.
49171       */
49172  
49173  
49174      function isSelectionEligibleForScroll() {
49175        return node.contains(ownerDocument.activeElement) && ownerDocument.activeElement.isContentEditable;
49176      }
49177  
49178      function isLastEditableNode() {
49179        const editableNodes = node.querySelectorAll('[contenteditable="true"]');
49180        const lastEditableNode = editableNodes[editableNodes.length - 1];
49181        return lastEditableNode === ownerDocument.activeElement;
49182      } // When the user scrolls or resizes, the scroll position should be
49183      // reset.
49184  
49185  
49186      defaultView.addEventListener('scroll', onScrollResize, true);
49187      defaultView.addEventListener('resize', onScrollResize, true);
49188      node.addEventListener('keydown', onKeyDown);
49189      node.addEventListener('keyup', maintainCaretPosition);
49190      node.addEventListener('mousedown', addSelectionChangeListener);
49191      node.addEventListener('touchstart', addSelectionChangeListener);
49192      return () => {
49193        defaultView.removeEventListener('scroll', onScrollResize, true);
49194        defaultView.removeEventListener('resize', onScrollResize, true);
49195        node.removeEventListener('keydown', onKeyDown);
49196        node.removeEventListener('keyup', maintainCaretPosition);
49197        node.removeEventListener('mousedown', addSelectionChangeListener);
49198        node.removeEventListener('touchstart', addSelectionChangeListener);
49199        ownerDocument.removeEventListener('selectionchange', computeCaretRectOnSelectionChange);
49200        defaultView.cancelAnimationFrame(scrollResizeRafId);
49201        defaultView.cancelAnimationFrame(onKeyDownRafId);
49202      };
49203    }, [hasSelectedBlock]);
49204  }
49205  
49206  function Typewriter(_ref2) {
49207    let {
49208      children
49209    } = _ref2;
49210    return (0,external_wp_element_namespaceObject.createElement)("div", {
49211      ref: useTypewriter(),
49212      className: "block-editor__typewriter"
49213    }, children);
49214  }
49215  /**
49216   * The exported component. The implementation of Typewriter faced technical
49217   * challenges in Internet Explorer, and is simply skipped, rendering the given
49218   * props children instead.
49219   *
49220   * @type {WPComponent}
49221   */
49222  
49223  
49224  const TypewriterOrIEBypass = isIE ? props => props.children : Typewriter;
49225  /**
49226   * Ensures that the text selection keeps the same vertical distance from the
49227   * viewport during keyboard events within this component. The vertical distance
49228   * can vary. It is the last clicked or scrolled to position.
49229   */
49230  
49231  /* harmony default export */ var typewriter = (TypewriterOrIEBypass);
49232  
49233  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/use-no-recursive-renders/index.js
49234  
49235  
49236  /**
49237   * WordPress dependencies
49238   */
49239  
49240  /**
49241   * Internal dependencies
49242   */
49243  
49244  
49245  const RenderedRefsContext = (0,external_wp_element_namespaceObject.createContext)({});
49246  /**
49247   * Immutably adds an unique identifier to a set scoped for a given block type.
49248   *
49249   * @param {Object} renderedBlocks Rendered blocks grouped by block name
49250   * @param {string} blockName      Name of the block.
49251   * @param {*}      uniqueId       Any value that acts as a unique identifier for a block instance.
49252   *
49253   * @return {Object} The list of rendered blocks grouped by block name.
49254   */
49255  
49256  function addToBlockType(renderedBlocks, blockName, uniqueId) {
49257    const result = { ...renderedBlocks,
49258      [blockName]: renderedBlocks[blockName] ? new Set(renderedBlocks[blockName]) : new Set()
49259    };
49260    result[blockName].add(uniqueId);
49261    return result;
49262  }
49263  /**
49264   * A React hook for keeping track of blocks previously rendered up in the block
49265   * tree. Blocks susceptible to recursion can use this hook in their `Edit`
49266   * function to prevent said recursion.
49267   *
49268   * @param {*}      uniqueId  Any value that acts as a unique identifier for a block instance.
49269   * @param {string} blockName Optional block name.
49270   *
49271   * @return {[boolean, Function]} A tuple of:
49272   *                               - a boolean describing whether the provided id
49273   *                                 has already been rendered;
49274   *                               - a React context provider to be used to wrap
49275   *                                 other elements.
49276   */
49277  
49278  
49279  function useNoRecursiveRenders(uniqueId) {
49280    var _previouslyRenderedBl;
49281  
49282    let blockName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
49283    const previouslyRenderedBlocks = (0,external_wp_element_namespaceObject.useContext)(RenderedRefsContext);
49284    const {
49285      name
49286    } = useBlockEditContext();
49287    blockName = blockName || name;
49288    const hasAlreadyRendered = Boolean((_previouslyRenderedBl = previouslyRenderedBlocks[blockName]) === null || _previouslyRenderedBl === void 0 ? void 0 : _previouslyRenderedBl.has(uniqueId));
49289    const newRenderedBlocks = (0,external_wp_element_namespaceObject.useMemo)(() => addToBlockType(previouslyRenderedBlocks, blockName, uniqueId), [previouslyRenderedBlocks, blockName, uniqueId]);
49290    const Provider = (0,external_wp_element_namespaceObject.useCallback)(_ref => {
49291      let {
49292        children
49293      } = _ref;
49294      return (0,external_wp_element_namespaceObject.createElement)(RenderedRefsContext.Provider, {
49295        value: newRenderedBlocks
49296      }, children);
49297    }, [newRenderedBlocks]);
49298    return [hasAlreadyRendered, Provider];
49299  }
49300  
49301  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/components/index.js
49302  /*
49303   * Block Creation Components
49304   */
49305  
49306  
49307  
49308  
49309  
49310  
49311  
49312  
49313  
49314  
49315  
49316  
49317  
49318  
49319  
49320  
49321  
49322  
49323  
49324  
49325  
49326  
49327  
49328  
49329  
49330  
49331  
49332  
49333  
49334  
49335  
49336  
49337  
49338  
49339  
49340  
49341  
49342  
49343  
49344  
49345  
49346  
49347  
49348  
49349  
49350  
49351  
49352  
49353  
49354  
49355  
49356  
49357  
49358  
49359  
49360  
49361  
49362  
49363  
49364  
49365  
49366  
49367  
49368  
49369  /*
49370   * Content Related Components
49371   */
49372  
49373  
49374  
49375  
49376  
49377  
49378  
49379  
49380  
49381  
49382  
49383  
49384  
49385  
49386  
49387  
49388  
49389  
49390  
49391  
49392  
49393  
49394  
49395  
49396  
49397  
49398  
49399  
49400  
49401  
49402  
49403  
49404  
49405  
49406  
49407  
49408  /*
49409   * State Related Components
49410   */
49411  
49412  
49413  
49414  
49415  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/utils/block-variation-transforms.js
49416  /**
49417   * External dependencies
49418   */
49419  
49420  /** @typedef {import('@wordpress/blocks').WPBlockVariation} WPBlockVariation */
49421  
49422  /**
49423   * Matches the provided block variations with a block's attributes. If no match
49424   * or more than one matches are found it returns `undefined`. If a single match is
49425   * found it returns it.
49426   *
49427   * This is a simple implementation for now as it takes into account only the attributes
49428   * of a block variation and not `InnerBlocks`.
49429   *
49430   * @param {Object}             blockAttributes - The block attributes to try to find a match.
49431   * @param {WPBlockVariation[]} variations      - A list of block variations to test for a match.
49432   * @return {?WPBlockVariation} - If a match is found returns it. If not or more than one matches are found returns `undefined`.
49433   */
49434  
49435  const __experimentalGetMatchingVariation = (blockAttributes, variations) => {
49436    if (!variations || !blockAttributes) return;
49437    const matches = variations.filter(_ref => {
49438      let {
49439        attributes
49440      } = _ref;
49441      if (!attributes || !Object.keys(attributes).length) return false;
49442      return (0,external_lodash_namespaceObject.isMatch)(blockAttributes, attributes);
49443    });
49444    if (matches.length !== 1) return;
49445    return matches[0];
49446  };
49447  
49448  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/utils/parse-css-unit-to-px.js
49449  /**
49450   * Converts string to object { value, unit }.
49451   *
49452   * @param {string} cssUnit
49453   * @return {Object} parsedUnit
49454   */
49455  function parseUnit(cssUnit) {
49456    const match = cssUnit === null || cssUnit === void 0 ? void 0 : cssUnit.trim().match(/^(0?[-.]?\d*\.?\d+)(r?e[m|x]|v[h|w|min|max]+|p[x|t|c]|[c|m]m|%|in|ch|Q|lh)$/);
49457  
49458    if (!isNaN(cssUnit) && !isNaN(parseFloat(cssUnit))) {
49459      return {
49460        value: parseFloat(cssUnit),
49461        unit: 'px'
49462      };
49463    }
49464  
49465    return match ? {
49466      value: parseFloat(match[1]) || match[1],
49467      unit: match[2]
49468    } : {
49469      value: cssUnit,
49470      unit: undefined
49471    };
49472  }
49473  /**
49474   * Evaluate a math expression.
49475   *
49476   * @param {string} expression
49477   * @return {number} evaluated expression.
49478   */
49479  
49480  
49481  function calculate(expression) {
49482    return Function(`'use strict'; return ($expression})`)();
49483  }
49484  /**
49485   * Calculates the css function value for the supported css functions such as max, min, clamp and calc.
49486   *
49487   * @param {string} functionUnitValue string should be in a particular format (for example min(12px,12px) ) no nested loops.
49488   * @param {Object} options
49489   * @return {string} unit containing the unit in PX.
49490   */
49491  
49492  
49493  function getFunctionUnitValue(functionUnitValue, options) {
49494    const functionUnit = functionUnitValue.split(/[(),]/g).filter(Boolean);
49495    const units = functionUnit.slice(1).map(unit => parseUnit(getPxFromCssUnit(unit, options)).value).filter(Boolean);
49496  
49497    switch (functionUnit[0]) {
49498      case 'min':
49499        return Math.min(...units) + 'px';
49500  
49501      case 'max':
49502        return Math.max(...units) + 'px';
49503  
49504      case 'clamp':
49505        if (units.length !== 3) {
49506          return null;
49507        }
49508  
49509        if (units[1] < units[0]) {
49510          return units[0] + 'px';
49511        }
49512  
49513        if (units[1] > units[2]) {
49514          return units[2] + 'px';
49515        }
49516  
49517        return units[1] + 'px';
49518  
49519      case 'calc':
49520        return units[0] + 'px';
49521    }
49522  }
49523  /**
49524   * Take a css function such as min, max, calc, clamp and returns parsedUnit
49525   *
49526   * How this works for the nested function is that it first replaces the inner function call.
49527   * Then it tackles the outer onces.
49528   * So for example: min( max(25px, 35px), 40px )
49529   * in the first pass we would replace max(25px, 35px) with 35px.
49530   * then we would try to evaluate min( 35px, 40px )
49531   * and then finally return 35px.
49532   *
49533   * @param {string} cssUnit
49534   * @return {Object} parsedUnit object.
49535   */
49536  
49537  
49538  function parseUnitFunction(cssUnit) {
49539    while (true) {
49540      const currentCssUnit = cssUnit;
49541      const regExp = /(max|min|calc|clamp)\(([^()]*)\)/g;
49542      const matches = regExp.exec(cssUnit) || [];
49543  
49544      if (matches[0]) {
49545        const functionUnitValue = getFunctionUnitValue(matches[0]);
49546        cssUnit = cssUnit.replace(matches[0], functionUnitValue);
49547      } // If the unit hasn't been modified or we have a single value break free.
49548  
49549  
49550      if (cssUnit === currentCssUnit || parseFloat(cssUnit)) {
49551        break;
49552      }
49553    }
49554  
49555    return parseUnit(cssUnit);
49556  }
49557  /**
49558   * Return true if we think this is a math expression.
49559   *
49560   * @param {string} cssUnit the cssUnit value being evaluted.
49561   * @return {boolean} Whether the cssUnit is a math expression.
49562   */
49563  
49564  
49565  function isMathExpression(cssUnit) {
49566    for (let i = 0; i < cssUnit.length; i++) {
49567      if (['+', '-', '/', '*'].includes(cssUnit[i])) {
49568        return true;
49569      }
49570    }
49571  
49572    return false;
49573  }
49574  /**
49575   * Evaluates the math expression and return a px value.
49576   *
49577   * @param {string} cssUnit the cssUnit value being evaluted.
49578   * @return {string} return a converfted value to px.
49579   */
49580  
49581  
49582  function evalMathExpression(cssUnit) {
49583    let errorFound = false; // Convert every part of the expression to px values.
49584  
49585    const cssUnitsBits = cssUnit.split(/[+-/*/]/g).filter(Boolean);
49586  
49587    for (const unit of cssUnitsBits) {
49588      // Standardize the unit to px and extract the value.
49589      const parsedUnit = parseUnit(getPxFromCssUnit(unit));
49590  
49591      if (!parseFloat(parsedUnit.value)) {
49592        errorFound = true; // End early since we are dealing with a null value.
49593  
49594        break;
49595      }
49596  
49597      cssUnit = cssUnit.replace(unit, parsedUnit.value);
49598    }
49599  
49600    return errorFound ? null : calculate(cssUnit).toFixed(0) + 'px';
49601  }
49602  /**
49603   * Convert a parsedUnit object to px value.
49604   *
49605   * @param {Object} parsedUnit
49606   * @param {Object} options
49607   * @return {string} or {null} returns the converted with in a px value format.
49608   */
49609  
49610  
49611  function convertParsedUnitToPx(parsedUnit, options) {
49612    const PIXELS_PER_INCH = 96;
49613    const ONE_PERCENT = 0.01;
49614    const defaultProperties = {
49615      fontSize: 16,
49616      lineHeight: 16,
49617      width: 375,
49618      height: 812,
49619      type: 'font'
49620    };
49621    const setOptions = Object.assign({}, defaultProperties, options);
49622    const relativeUnits = {
49623      em: setOptions.fontSize,
49624      rem: setOptions.fontSize,
49625      vh: setOptions.height * ONE_PERCENT,
49626      vw: setOptions.width * ONE_PERCENT,
49627      vmin: (setOptions.width < setOptions.height ? setOptions.width : setOptions.height) * ONE_PERCENT,
49628      vmax: (setOptions.width > setOptions.height ? setOptions.width : setOptions.height) * ONE_PERCENT,
49629      '%': (setOptions.type === 'font' ? setOptions.fontSize : setOptions.width) * ONE_PERCENT,
49630      ch: 8,
49631      // The advance measure (width) of the glyph "0" of the element's font. Approximate
49632      ex: 7.15625,
49633      // X-height of the element's font. Approximate.
49634      lh: setOptions.lineHeight
49635    };
49636    const absoluteUnits = {
49637      in: PIXELS_PER_INCH,
49638      cm: PIXELS_PER_INCH / 2.54,
49639      mm: PIXELS_PER_INCH / 25.4,
49640      pt: PIXELS_PER_INCH / 72,
49641      pc: PIXELS_PER_INCH / 6,
49642      px: 1,
49643      Q: PIXELS_PER_INCH / 2.54 / 40
49644    };
49645  
49646    if (relativeUnits[parsedUnit.unit]) {
49647      return (relativeUnits[parsedUnit.unit] * parsedUnit.value).toFixed(0) + 'px';
49648    }
49649  
49650    if (absoluteUnits[parsedUnit.unit]) {
49651      return (absoluteUnits[parsedUnit.unit] * parsedUnit.value).toFixed(0) + 'px';
49652    }
49653  
49654    return null;
49655  }
49656  /**
49657   * Returns the px value of a cssUnit.
49658   *
49659   * @param {string} cssUnit
49660   * @param {Object} options
49661   * @return {string} returns the cssUnit value in a simple px format.
49662   */
49663  
49664  
49665  function getPxFromCssUnit(cssUnit) {
49666    let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
49667  
49668    if (Number.isFinite(cssUnit)) {
49669      return cssUnit.toFixed(0) + 'px';
49670    }
49671  
49672    if (cssUnit === undefined) {
49673      return null;
49674    }
49675  
49676    let parsedUnit = parseUnit(cssUnit);
49677  
49678    if (!parsedUnit.unit) {
49679      parsedUnit = parseUnitFunction(cssUnit, options);
49680    }
49681  
49682    if (isMathExpression(cssUnit) && !parsedUnit.unit) {
49683      return evalMathExpression(cssUnit);
49684    }
49685  
49686    return convertParsedUnitToPx(parsedUnit, options);
49687  } // Use simple cache.
49688  
49689  const cache = {};
49690  /**
49691   * Returns the px value of a cssUnit. The memoized version of getPxFromCssUnit;
49692   *
49693   * @param {string} cssUnit
49694   * @param {Object} options
49695   * @return {string} returns the cssUnit value in a simple px format.
49696   */
49697  
49698  function memoizedGetPxFromCssUnit(cssUnit) {
49699    let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
49700    const hash = cssUnit + hashOptions(options);
49701  
49702    if (!cache[hash]) {
49703      cache[hash] = getPxFromCssUnit(cssUnit, options);
49704    }
49705  
49706    return cache[hash];
49707  }
49708  
49709  function hashOptions(options) {
49710    let hash = '';
49711  
49712    if (options.hasOwnProperty('fontSize')) {
49713      hash = ':' + options.width;
49714    }
49715  
49716    if (options.hasOwnProperty('lineHeight')) {
49717      hash = ':' + options.lineHeight;
49718    }
49719  
49720    if (options.hasOwnProperty('width')) {
49721      hash = ':' + options.width;
49722    }
49723  
49724    if (options.hasOwnProperty('height')) {
49725      hash = ':' + options.height;
49726    }
49727  
49728    if (options.hasOwnProperty('type')) {
49729      hash = ':' + options.type;
49730    }
49731  
49732    return hash;
49733  }
49734  
49735  /* harmony default export */ var parse_css_unit_to_px = (memoizedGetPxFromCssUnit);
49736  
49737  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/utils/index.js
49738  
49739  
49740  
49741  
49742  ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/index.js
49743  /**
49744   * Internal dependencies
49745   */
49746  
49747  
49748  
49749  
49750  
49751  
49752  
49753  }();
49754  (window.wp = window.wp || {}).blockEditor = __webpack_exports__;
49755  /******/ })()
49756  ;


Generated: Sat Apr 27 01:00:02 2024 Cross-referenced by PHPXref 0.7.1