PluginProbe
Gutenberg / 13.0.0
Gutenberg v13.0.0
24.1.0 24.0.0 23.9.1 23.9.0 23.8.0 23.7.2 23.7.1 23.7.0 23.6.1 23.6.2 23.6.0 23.5.3 23.5.2 23.5.1 23.5.0 23.4.0 23.3.2 23.3.1 23.3.0 23.2.0 23.2.1 23.2.2 23.1.1 23.1.0 23.0.1 All 404 releases
gutenberg / build / edit-widgets / index.js

index.js in Gutenberg 13.0.0, at build/edit-widgets/index.js

4,677 lines 157.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /******/ (function() { // webpackBootstrap
2 /******/ var __webpack_modules__ = ({
3
4 /***/ 4403:
5 /***/ (function(module, exports) {
6
7 var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
8 Copyright (c) 2018 Jed Watson.
9 Licensed under the MIT License (MIT), see
10 http://jedwatson.github.io/classnames
11 */
12 /* global define */
13
14 (function () {
15 'use strict';
16
17 var hasOwn = {}.hasOwnProperty;
18
19 function classNames() {
20 var classes = [];
21
22 for (var i = 0; i < arguments.length; i++) {
23 var arg = arguments[i];
24 if (!arg) continue;
25
26 var argType = typeof arg;
27
28 if (argType === 'string' || argType === 'number') {
29 classes.push(arg);
30 } else if (Array.isArray(arg)) {
31 if (arg.length) {
32 var inner = classNames.apply(null, arg);
33 if (inner) {
34 classes.push(inner);
35 }
36 }
37 } else if (argType === 'object') {
38 if (arg.toString === Object.prototype.toString) {
39 for (var key in arg) {
40 if (hasOwn.call(arg, key) && arg[key]) {
41 classes.push(key);
42 }
43 }
44 } else {
45 classes.push(arg.toString());
46 }
47 }
48 }
49
50 return classes.join(' ');
51 }
52
53 if ( true && module.exports) {
54 classNames.default = classNames;
55 module.exports = classNames;
56 } else if (true) {
57 // register as 'classnames', consistent with npm package name
58 !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () {
59 return classNames;
60 }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
61 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
62 } else {}
63 }());
64
65
66 /***/ })
67
68 /******/ });
69 /************************************************************************/
70 /******/ // The module cache
71 /******/ var __webpack_module_cache__ = {};
72 /******/
73 /******/ // The require function
74 /******/ function __webpack_require__(moduleId) {
75 /******/ // Check if module is in cache
76 /******/ var cachedModule = __webpack_module_cache__[moduleId];
77 /******/ if (cachedModule !== undefined) {
78 /******/ return cachedModule.exports;
79 /******/ }
80 /******/ // Create a new module (and put it into the cache)
81 /******/ var module = __webpack_module_cache__[moduleId] = {
82 /******/ // no module.id needed
83 /******/ // no module.loaded needed
84 /******/ exports: {}
85 /******/ };
86 /******/
87 /******/ // Execute the module function
88 /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
89 /******/
90 /******/ // Return the exports of the module
91 /******/ return module.exports;
92 /******/ }
93 /******/
94 /************************************************************************/
95 /******/ /* webpack/runtime/compat get default export */
96 /******/ !function() {
97 /******/ // getDefaultExport function for compatibility with non-harmony modules
98 /******/ __webpack_require__.n = function(module) {
99 /******/ var getter = module && module.__esModule ?
100 /******/ function() { return module['default']; } :
101 /******/ function() { return module; };
102 /******/ __webpack_require__.d(getter, { a: getter });
103 /******/ return getter;
104 /******/ };
105 /******/ }();
106 /******/
107 /******/ /* webpack/runtime/define property getters */
108 /******/ !function() {
109 /******/ // define getter functions for harmony exports
110 /******/ __webpack_require__.d = function(exports, definition) {
111 /******/ for(var key in definition) {
112 /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
113 /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
114 /******/ }
115 /******/ }
116 /******/ };
117 /******/ }();
118 /******/
119 /******/ /* webpack/runtime/hasOwnProperty shorthand */
120 /******/ !function() {
121 /******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
122 /******/ }();
123 /******/
124 /******/ /* webpack/runtime/make namespace object */
125 /******/ !function() {
126 /******/ // define __esModule on exports
127 /******/ __webpack_require__.r = function(exports) {
128 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
129 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
130 /******/ }
131 /******/ Object.defineProperty(exports, '__esModule', { value: true });
132 /******/ };
133 /******/ }();
134 /******/
135 /************************************************************************/
136 var __webpack_exports__ = {};
137 // This entry need to be wrapped in an IIFE because it need to be in strict mode.
138 !function() {
139 "use strict";
140 // ESM COMPAT FLAG
141 __webpack_require__.r(__webpack_exports__);
142
143 // EXPORTS
144 __webpack_require__.d(__webpack_exports__, {
145 "initialize": function() { return /* binding */ initialize; },
146 "reinitializeEditor": function() { return /* binding */ reinitializeEditor; }
147 });
148
149 // NAMESPACE OBJECT: ./packages/interface/build-module/store/actions.js
150 var actions_namespaceObject = {};
151 __webpack_require__.r(actions_namespaceObject);
152 __webpack_require__.d(actions_namespaceObject, {
153 "disableComplementaryArea": function() { return disableComplementaryArea; },
154 "enableComplementaryArea": function() { return enableComplementaryArea; },
155 "pinItem": function() { return pinItem; },
156 "setFeatureDefaults": function() { return setFeatureDefaults; },
157 "setFeatureValue": function() { return setFeatureValue; },
158 "toggleFeature": function() { return toggleFeature; },
159 "unpinItem": function() { return unpinItem; }
160 });
161
162 // NAMESPACE OBJECT: ./packages/interface/build-module/store/selectors.js
163 var selectors_namespaceObject = {};
164 __webpack_require__.r(selectors_namespaceObject);
165 __webpack_require__.d(selectors_namespaceObject, {
166 "getActiveComplementaryArea": function() { return getActiveComplementaryArea; },
167 "isFeatureActive": function() { return isFeatureActive; },
168 "isItemPinned": function() { return isItemPinned; }
169 });
170
171 // NAMESPACE OBJECT: ./packages/edit-widgets/build-module/store/actions.js
172 var store_actions_namespaceObject = {};
173 __webpack_require__.r(store_actions_namespaceObject);
174 __webpack_require__.d(store_actions_namespaceObject, {
175 "closeGeneralSidebar": function() { return closeGeneralSidebar; },
176 "moveBlockToWidgetArea": function() { return moveBlockToWidgetArea; },
177 "persistStubPost": function() { return persistStubPost; },
178 "saveEditedWidgetAreas": function() { return saveEditedWidgetAreas; },
179 "saveWidgetArea": function() { return saveWidgetArea; },
180 "saveWidgetAreas": function() { return saveWidgetAreas; },
181 "setIsInserterOpened": function() { return setIsInserterOpened; },
182 "setIsListViewOpened": function() { return setIsListViewOpened; },
183 "setIsWidgetAreaOpen": function() { return setIsWidgetAreaOpen; },
184 "setWidgetAreasOpenState": function() { return setWidgetAreasOpenState; },
185 "setWidgetIdForClientId": function() { return setWidgetIdForClientId; }
186 });
187
188 // NAMESPACE OBJECT: ./packages/edit-widgets/build-module/store/resolvers.js
189 var resolvers_namespaceObject = {};
190 __webpack_require__.r(resolvers_namespaceObject);
191 __webpack_require__.d(resolvers_namespaceObject, {
192 "getWidgetAreas": function() { return getWidgetAreas; },
193 "getWidgets": function() { return getWidgets; }
194 });
195
196 // NAMESPACE OBJECT: ./packages/edit-widgets/build-module/store/selectors.js
197 var store_selectors_namespaceObject = {};
198 __webpack_require__.r(store_selectors_namespaceObject);
199 __webpack_require__.d(store_selectors_namespaceObject, {
200 "__experimentalGetInsertionPoint": function() { return __experimentalGetInsertionPoint; },
201 "canInsertBlockInWidgetArea": function() { return canInsertBlockInWidgetArea; },
202 "getEditedWidgetAreas": function() { return getEditedWidgetAreas; },
203 "getIsWidgetAreaOpen": function() { return getIsWidgetAreaOpen; },
204 "getParentWidgetAreaBlock": function() { return getParentWidgetAreaBlock; },
205 "getReferenceWidgetBlocks": function() { return getReferenceWidgetBlocks; },
206 "getWidget": function() { return getWidget; },
207 "getWidgetAreaForWidgetId": function() { return getWidgetAreaForWidgetId; },
208 "getWidgetAreas": function() { return selectors_getWidgetAreas; },
209 "getWidgets": function() { return selectors_getWidgets; },
210 "isInserterOpened": function() { return isInserterOpened; },
211 "isListViewOpened": function() { return isListViewOpened; },
212 "isSavingWidgetAreas": function() { return isSavingWidgetAreas; }
213 });
214
215 // NAMESPACE OBJECT: ./packages/edit-widgets/build-module/blocks/widget-area/index.js
216 var widget_area_namespaceObject = {};
217 __webpack_require__.r(widget_area_namespaceObject);
218 __webpack_require__.d(widget_area_namespaceObject, {
219 "metadata": function() { return metadata; },
220 "name": function() { return widget_area_name; },
221 "settings": function() { return settings; }
222 });
223
224 ;// CONCATENATED MODULE: external ["wp","element"]
225 var external_wp_element_namespaceObject = window["wp"]["element"];
226 ;// CONCATENATED MODULE: external ["wp","blocks"]
227 var external_wp_blocks_namespaceObject = window["wp"]["blocks"];
228 ;// CONCATENATED MODULE: external ["wp","data"]
229 var external_wp_data_namespaceObject = window["wp"]["data"];
230 ;// CONCATENATED MODULE: external ["wp","blockLibrary"]
231 var external_wp_blockLibrary_namespaceObject = window["wp"]["blockLibrary"];
232 ;// CONCATENATED MODULE: external ["wp","coreData"]
233 var external_wp_coreData_namespaceObject = window["wp"]["coreData"];
234 ;// CONCATENATED MODULE: external ["wp","widgets"]
235 var external_wp_widgets_namespaceObject = window["wp"]["widgets"];
236 ;// CONCATENATED MODULE: external ["wp","preferences"]
237 var external_wp_preferences_namespaceObject = window["wp"]["preferences"];
238 ;// CONCATENATED MODULE: external ["wp","apiFetch"]
239 var external_wp_apiFetch_namespaceObject = window["wp"]["apiFetch"];
240 var external_wp_apiFetch_default = /*#__PURE__*/__webpack_require__.n(external_wp_apiFetch_namespaceObject);
241 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/store/reducer.js
242 /**
243 * WordPress dependencies
244 */
245
246 /**
247 * Controls the open state of the widget areas.
248 *
249 * @param {Object} state Redux state.
250 * @param {Object} action Redux action.
251 *
252 * @return {Array} Updated state.
253 */
254
255 function widgetAreasOpenState() {
256 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
257 let action = arguments.length > 1 ? arguments[1] : undefined;
258 const {
259 type
260 } = action;
261
262 switch (type) {
263 case 'SET_WIDGET_AREAS_OPEN_STATE':
264 {
265 return action.widgetAreasOpenState;
266 }
267
268 case 'SET_IS_WIDGET_AREA_OPEN':
269 {
270 const {
271 clientId,
272 isOpen
273 } = action;
274 return { ...state,
275 [clientId]: isOpen
276 };
277 }
278
279 default:
280 {
281 return state;
282 }
283 }
284 }
285 /**
286 * Reducer to set the block inserter panel open or closed.
287 *
288 * Note: this reducer interacts with the list view panel reducer
289 * to make sure that only one of the two panels is open at the same time.
290 *
291 * @param {Object} state Current state.
292 * @param {Object} action Dispatched action.
293 */
294
295 function blockInserterPanel() {
296 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
297 let action = arguments.length > 1 ? arguments[1] : undefined;
298
299 switch (action.type) {
300 case 'SET_IS_LIST_VIEW_OPENED':
301 return action.isOpen ? false : state;
302
303 case 'SET_IS_INSERTER_OPENED':
304 return action.value;
305 }
306
307 return state;
308 }
309 /**
310 * Reducer to set the list view panel open or closed.
311 *
312 * Note: this reducer interacts with the inserter panel reducer
313 * to make sure that only one of the two panels is open at the same time.
314 *
315 * @param {Object} state Current state.
316 * @param {Object} action Dispatched action.
317 */
318
319 function listViewPanel() {
320 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
321 let action = arguments.length > 1 ? arguments[1] : undefined;
322
323 switch (action.type) {
324 case 'SET_IS_INSERTER_OPENED':
325 return action.value ? false : state;
326
327 case 'SET_IS_LIST_VIEW_OPENED':
328 return action.isOpen;
329 }
330
331 return state;
332 }
333 /* harmony default export */ var reducer = ((0,external_wp_data_namespaceObject.combineReducers)({
334 blockInserterPanel,
335 listViewPanel,
336 widgetAreasOpenState
337 }));
338
339 ;// CONCATENATED MODULE: external ["wp","i18n"]
340 var external_wp_i18n_namespaceObject = window["wp"]["i18n"];
341 ;// CONCATENATED MODULE: external ["wp","notices"]
342 var external_wp_notices_namespaceObject = window["wp"]["notices"];
343 ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/extends.js
344 function _extends() {
345 _extends = Object.assign || function (target) {
346 for (var i = 1; i < arguments.length; i++) {
347 var source = arguments[i];
348
349 for (var key in source) {
350 if (Object.prototype.hasOwnProperty.call(source, key)) {
351 target[key] = source[key];
352 }
353 }
354 }
355
356 return target;
357 };
358
359 return _extends.apply(this, arguments);
360 }
361 // EXTERNAL MODULE: ./node_modules/classnames/index.js
362 var classnames = __webpack_require__(4403);
363 var classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);
364 ;// CONCATENATED MODULE: external ["wp","components"]
365 var external_wp_components_namespaceObject = window["wp"]["components"];
366 ;// CONCATENATED MODULE: external ["wp","primitives"]
367 var external_wp_primitives_namespaceObject = window["wp"]["primitives"];
368 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/check.js
369
370
371 /**
372 * WordPress dependencies
373 */
374
375 const check = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
376 xmlns: "http://www.w3.org/2000/svg",
377 viewBox: "0 0 24 24"
378 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
379 d: "M16.7 7.1l-6.3 8.5-3.3-2.5-.9 1.2 4.5 3.4L17.9 8z"
380 }));
381 /* harmony default export */ var library_check = (check);
382
383 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/star-filled.js
384
385
386 /**
387 * WordPress dependencies
388 */
389
390 const starFilled = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
391 xmlns: "http://www.w3.org/2000/svg",
392 viewBox: "0 0 24 24"
393 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
394 d: "M11.776 4.454a.25.25 0 01.448 0l2.069 4.192a.25.25 0 00.188.137l4.626.672a.25.25 0 01.139.426l-3.348 3.263a.25.25 0 00-.072.222l.79 4.607a.25.25 0 01-.362.263l-4.138-2.175a.25.25 0 00-.232 0l-4.138 2.175a.25.25 0 01-.363-.263l.79-4.607a.25.25 0 00-.071-.222L4.754 9.881a.25.25 0 01.139-.426l4.626-.672a.25.25 0 00.188-.137l2.069-4.192z"
395 }));
396 /* harmony default export */ var star_filled = (starFilled);
397
398 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/star-empty.js
399
400
401 /**
402 * WordPress dependencies
403 */
404
405 const starEmpty = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
406 xmlns: "http://www.w3.org/2000/svg",
407 viewBox: "0 0 24 24"
408 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
409 fillRule: "evenodd",
410 d: "M9.706 8.646a.25.25 0 01-.188.137l-4.626.672a.25.25 0 00-.139.427l3.348 3.262a.25.25 0 01.072.222l-.79 4.607a.25.25 0 00.362.264l4.138-2.176a.25.25 0 01.233 0l4.137 2.175a.25.25 0 00.363-.263l-.79-4.607a.25.25 0 01.072-.222l3.347-3.262a.25.25 0 00-.139-.427l-4.626-.672a.25.25 0 01-.188-.137l-2.069-4.192a.25.25 0 00-.448 0L9.706 8.646zM12 7.39l-.948 1.921a1.75 1.75 0 01-1.317.957l-2.12.308 1.534 1.495c.412.402.6.982.503 1.55l-.362 2.11 1.896-.997a1.75 1.75 0 011.629 0l1.895.997-.362-2.11a1.75 1.75 0 01.504-1.55l1.533-1.495-2.12-.308a1.75 1.75 0 01-1.317-.957L12 7.39z",
411 clipRule: "evenodd"
412 }));
413 /* harmony default export */ var star_empty = (starEmpty);
414
415 ;// CONCATENATED MODULE: external ["wp","viewport"]
416 var external_wp_viewport_namespaceObject = window["wp"]["viewport"];
417 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/close-small.js
418
419
420 /**
421 * WordPress dependencies
422 */
423
424 const closeSmall = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
425 xmlns: "http://www.w3.org/2000/svg",
426 viewBox: "0 0 24 24"
427 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
428 d: "M12 13.06l3.712 3.713 1.061-1.06L13.061 12l3.712-3.712-1.06-1.06L12 10.938 8.288 7.227l-1.061 1.06L10.939 12l-3.712 3.712 1.06 1.061L12 13.061z"
429 }));
430 /* harmony default export */ var close_small = (closeSmall);
431
432 ;// CONCATENATED MODULE: external "lodash"
433 var external_lodash_namespaceObject = window["lodash"];
434 ;// CONCATENATED MODULE: external ["wp","deprecated"]
435 var external_wp_deprecated_namespaceObject = window["wp"]["deprecated"];
436 var external_wp_deprecated_default = /*#__PURE__*/__webpack_require__.n(external_wp_deprecated_namespaceObject);
437 ;// CONCATENATED MODULE: ./packages/interface/build-module/store/actions.js
438 /**
439 * WordPress dependencies
440 */
441
442
443 /**
444 * Enable the complementary area.
445 *
446 * @param {string} scope Complementary area scope.
447 * @param {string} area Area identifier.
448 */
449
450 const enableComplementaryArea = (scope, area) => _ref => {
451 let {
452 registry
453 } = _ref;
454
455 // Return early if there's no area.
456 if (!area) {
457 return;
458 }
459
460 registry.dispatch(external_wp_preferences_namespaceObject.store).set(scope, 'complementaryArea', area);
461 };
462 /**
463 * Disable the complementary area.
464 *
465 * @param {string} scope Complementary area scope.
466 */
467
468 const disableComplementaryArea = scope => _ref2 => {
469 let {
470 registry
471 } = _ref2;
472 registry.dispatch(external_wp_preferences_namespaceObject.store).set(scope, 'complementaryArea', null);
473 };
474 /**
475 * Pins an item.
476 *
477 * @param {string} scope Item scope.
478 * @param {string} item Item identifier.
479 *
480 * @return {Object} Action object.
481 */
482
483 const pinItem = (scope, item) => _ref3 => {
484 let {
485 registry
486 } = _ref3;
487
488 // Return early if there's no item.
489 if (!item) {
490 return;
491 }
492
493 const pinnedItems = registry.select(external_wp_preferences_namespaceObject.store).get(scope, 'pinnedItems'); // The item is already pinned, there's nothing to do.
494
495 if ((pinnedItems === null || pinnedItems === void 0 ? void 0 : pinnedItems[item]) === true) {
496 return;
497 }
498
499 registry.dispatch(external_wp_preferences_namespaceObject.store).set(scope, 'pinnedItems', { ...pinnedItems,
500 [item]: true
501 });
502 };
503 /**
504 * Unpins an item.
505 *
506 * @param {string} scope Item scope.
507 * @param {string} item Item identifier.
508 */
509
510 const unpinItem = (scope, item) => _ref4 => {
511 let {
512 registry
513 } = _ref4;
514
515 // Return early if there's no item.
516 if (!item) {
517 return;
518 }
519
520 const pinnedItems = registry.select(external_wp_preferences_namespaceObject.store).get(scope, 'pinnedItems');
521 registry.dispatch(external_wp_preferences_namespaceObject.store).set(scope, 'pinnedItems', { ...pinnedItems,
522 [item]: false
523 });
524 };
525 /**
526 * Returns an action object used in signalling that a feature should be toggled.
527 *
528 * @param {string} scope The feature scope (e.g. core/edit-post).
529 * @param {string} featureName The feature name.
530 */
531
532 function toggleFeature(scope, featureName) {
533 return function (_ref5) {
534 let {
535 registry
536 } = _ref5;
537 external_wp_deprecated_default()(`wp.dispatch( 'core/interface' ).toggleFeature`, {
538 since: '6.0',
539 alternative: `wp.dispatch( 'core/preferences' ).toggle`
540 });
541 registry.dispatch(external_wp_preferences_namespaceObject.store).toggle(scope, featureName);
542 };
543 }
544 /**
545 * Returns an action object used in signalling that a feature should be set to
546 * a true or false value
547 *
548 * @param {string} scope The feature scope (e.g. core/edit-post).
549 * @param {string} featureName The feature name.
550 * @param {boolean} value The value to set.
551 *
552 * @return {Object} Action object.
553 */
554
555 function setFeatureValue(scope, featureName, value) {
556 return function (_ref6) {
557 let {
558 registry
559 } = _ref6;
560 external_wp_deprecated_default()(`wp.dispatch( 'core/interface' ).setFeatureValue`, {
561 since: '6.0',
562 alternative: `wp.dispatch( 'core/preferences' ).set`
563 });
564 registry.dispatch(external_wp_preferences_namespaceObject.store).set(scope, featureName, !!value);
565 };
566 }
567 /**
568 * Returns an action object used in signalling that defaults should be set for features.
569 *
570 * @param {string} scope The feature scope (e.g. core/edit-post).
571 * @param {Object<string, boolean>} defaults A key/value map of feature names to values.
572 *
573 * @return {Object} Action object.
574 */
575
576 function setFeatureDefaults(scope, defaults) {
577 return function (_ref7) {
578 let {
579 registry
580 } = _ref7;
581 external_wp_deprecated_default()(`wp.dispatch( 'core/interface' ).setFeatureDefaults`, {
582 since: '6.0',
583 alternative: `wp.dispatch( 'core/preferences' ).setDefaults`
584 });
585 registry.dispatch(external_wp_preferences_namespaceObject.store).setDefaults(scope, defaults);
586 };
587 }
588
589 ;// CONCATENATED MODULE: ./packages/interface/build-module/store/selectors.js
590 /**
591 * WordPress dependencies
592 */
593
594
595
596 /**
597 * Returns the complementary area that is active in a given scope.
598 *
599 * @param {Object} state Global application state.
600 * @param {string} scope Item scope.
601 *
602 * @return {string} The complementary area that is active in the given scope.
603 */
604
605 const getActiveComplementaryArea = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (state, scope) => {
606 return select(external_wp_preferences_namespaceObject.store).get(scope, 'complementaryArea');
607 });
608 /**
609 * Returns a boolean indicating if an item is pinned or not.
610 *
611 * @param {Object} state Global application state.
612 * @param {string} scope Scope.
613 * @param {string} item Item to check.
614 *
615 * @return {boolean} True if the item is pinned and false otherwise.
616 */
617
618 const isItemPinned = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (state, scope, item) => {
619 var _pinnedItems$item;
620
621 const pinnedItems = select(external_wp_preferences_namespaceObject.store).get(scope, 'pinnedItems');
622 return (_pinnedItems$item = pinnedItems === null || pinnedItems === void 0 ? void 0 : pinnedItems[item]) !== null && _pinnedItems$item !== void 0 ? _pinnedItems$item : true;
623 });
624 /**
625 * Returns a boolean indicating whether a feature is active for a particular
626 * scope.
627 *
628 * @param {Object} state The store state.
629 * @param {string} scope The scope of the feature (e.g. core/edit-post).
630 * @param {string} featureName The name of the feature.
631 *
632 * @return {boolean} Is the feature enabled?
633 */
634
635 const isFeatureActive = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (state, scope, featureName) => {
636 external_wp_deprecated_default()(`wp.select( 'core/interface' ).isFeatureActive( scope, featureName )`, {
637 since: '6.0',
638 alternative: `!! wp.select( 'core/preferences' ).isFeatureActive( scope, featureName )`
639 });
640 return !!select(external_wp_preferences_namespaceObject.store).get(scope, featureName);
641 });
642
643 ;// CONCATENATED MODULE: ./packages/interface/build-module/store/constants.js
644 /**
645 * The identifier for the data store.
646 *
647 * @type {string}
648 */
649 const STORE_NAME = 'core/interface';
650
651 ;// CONCATENATED MODULE: ./packages/interface/build-module/store/index.js
652 /**
653 * WordPress dependencies
654 */
655
656 /**
657 * Internal dependencies
658 */
659
660
661
662
663 /**
664 * Store definition for the interface namespace.
665 *
666 * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/data/README.md#createReduxStore
667 *
668 * @type {Object}
669 */
670
671 const store = (0,external_wp_data_namespaceObject.createReduxStore)(STORE_NAME, {
672 reducer: () => {},
673 actions: actions_namespaceObject,
674 selectors: selectors_namespaceObject
675 }); // Once we build a more generic persistence plugin that works across types of stores
676 // we'd be able to replace this with a register call.
677
678 (0,external_wp_data_namespaceObject.register)(store);
679
680 ;// CONCATENATED MODULE: external ["wp","plugins"]
681 var external_wp_plugins_namespaceObject = window["wp"]["plugins"];
682 ;// CONCATENATED MODULE: ./packages/interface/build-module/components/complementary-area-context/index.js
683 /**
684 * WordPress dependencies
685 */
686
687 /* harmony default export */ var complementary_area_context = ((0,external_wp_plugins_namespaceObject.withPluginContext)((context, ownProps) => {
688 return {
689 icon: ownProps.icon || context.icon,
690 identifier: ownProps.identifier || `${context.name}/${ownProps.name}`
691 };
692 }));
693
694 ;// CONCATENATED MODULE: ./packages/interface/build-module/components/complementary-area-toggle/index.js
695
696
697
698 /**
699 * External dependencies
700 */
701
702 /**
703 * WordPress dependencies
704 */
705
706
707
708 /**
709 * Internal dependencies
710 */
711
712
713
714
715 function ComplementaryAreaToggle(_ref) {
716 let {
717 as = external_wp_components_namespaceObject.Button,
718 scope,
719 identifier,
720 icon,
721 selectedIcon,
722 ...props
723 } = _ref;
724 const ComponentToUse = as;
725 const isSelected = (0,external_wp_data_namespaceObject.useSelect)(select => select(store).getActiveComplementaryArea(scope) === identifier, [identifier]);
726 const {
727 enableComplementaryArea,
728 disableComplementaryArea
729 } = (0,external_wp_data_namespaceObject.useDispatch)(store);
730 return (0,external_wp_element_namespaceObject.createElement)(ComponentToUse, _extends({
731 icon: selectedIcon && isSelected ? selectedIcon : icon,
732 onClick: () => {
733 if (isSelected) {
734 disableComplementaryArea(scope);
735 } else {
736 enableComplementaryArea(scope, identifier);
737 }
738 }
739 }, (0,external_lodash_namespaceObject.omit)(props, ['name'])));
740 }
741
742 /* harmony default export */ var complementary_area_toggle = (complementary_area_context(ComplementaryAreaToggle));
743
744 ;// CONCATENATED MODULE: ./packages/interface/build-module/components/complementary-area-header/index.js
745
746
747
748 /**
749 * External dependencies
750 */
751
752 /**
753 * WordPress dependencies
754 */
755
756
757 /**
758 * Internal dependencies
759 */
760
761
762
763 const ComplementaryAreaHeader = _ref => {
764 let {
765 smallScreenTitle,
766 children,
767 className,
768 toggleButtonProps
769 } = _ref;
770 const toggleButton = (0,external_wp_element_namespaceObject.createElement)(complementary_area_toggle, _extends({
771 icon: close_small
772 }, toggleButtonProps));
773 return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)("div", {
774 className: "components-panel__header interface-complementary-area-header__small"
775 }, smallScreenTitle && (0,external_wp_element_namespaceObject.createElement)("span", {
776 className: "interface-complementary-area-header__small-title"
777 }, smallScreenTitle), toggleButton), (0,external_wp_element_namespaceObject.createElement)("div", {
778 className: classnames_default()('components-panel__header', 'interface-complementary-area-header', className),
779 tabIndex: -1
780 }, children, toggleButton));
781 };
782
783 /* harmony default export */ var complementary_area_header = (ComplementaryAreaHeader);
784
785 ;// CONCATENATED MODULE: ./packages/interface/build-module/components/action-item/index.js
786
787
788
789 /**
790 * External dependencies
791 */
792
793 /**
794 * WordPress dependencies
795 */
796
797
798
799
800 function ActionItemSlot(_ref) {
801 let {
802 name,
803 as: Component = external_wp_components_namespaceObject.ButtonGroup,
804 fillProps = {},
805 bubblesVirtually,
806 ...props
807 } = _ref;
808 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Slot, {
809 name: name,
810 bubblesVirtually: bubblesVirtually,
811 fillProps: fillProps
812 }, fills => {
813 if ((0,external_lodash_namespaceObject.isEmpty)(external_wp_element_namespaceObject.Children.toArray(fills))) {
814 return null;
815 } // Special handling exists for backward compatibility.
816 // It ensures that menu items created by plugin authors aren't
817 // duplicated with automatically injected menu items coming
818 // from pinnable plugin sidebars.
819 // @see https://github.com/WordPress/gutenberg/issues/14457
820
821
822 const initializedByPlugins = [];
823 external_wp_element_namespaceObject.Children.forEach(fills, _ref2 => {
824 let {
825 props: {
826 __unstableExplicitMenuItem,
827 __unstableTarget
828 }
829 } = _ref2;
830
831 if (__unstableTarget && __unstableExplicitMenuItem) {
832 initializedByPlugins.push(__unstableTarget);
833 }
834 });
835 const children = external_wp_element_namespaceObject.Children.map(fills, child => {
836 if (!child.props.__unstableExplicitMenuItem && initializedByPlugins.includes(child.props.__unstableTarget)) {
837 return null;
838 }
839
840 return child;
841 });
842 return (0,external_wp_element_namespaceObject.createElement)(Component, props, children);
843 });
844 }
845
846 function ActionItem(_ref3) {
847 let {
848 name,
849 as: Component = external_wp_components_namespaceObject.Button,
850 onClick,
851 ...props
852 } = _ref3;
853 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Fill, {
854 name: name
855 }, _ref4 => {
856 let {
857 onClick: fpOnClick
858 } = _ref4;
859 return (0,external_wp_element_namespaceObject.createElement)(Component, _extends({
860 onClick: onClick || fpOnClick ? function () {
861 (onClick || external_lodash_namespaceObject.noop)(...arguments);
862 (fpOnClick || external_lodash_namespaceObject.noop)(...arguments);
863 } : undefined
864 }, props));
865 });
866 }
867
868 ActionItem.Slot = ActionItemSlot;
869 /* harmony default export */ var action_item = (ActionItem);
870
871 ;// CONCATENATED MODULE: ./packages/interface/build-module/components/complementary-area-more-menu-item/index.js
872
873
874
875 /**
876 * External dependencies
877 */
878
879 /**
880 * WordPress dependencies
881 */
882
883
884
885 /**
886 * Internal dependencies
887 */
888
889
890
891
892 const PluginsMenuItem = props => // Menu item is marked with unstable prop for backward compatibility.
893 // They are removed so they don't leak to DOM elements.
894 // @see https://github.com/WordPress/gutenberg/issues/14457
895 (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, (0,external_lodash_namespaceObject.omit)(props, ['__unstableExplicitMenuItem', '__unstableTarget']));
896
897 function ComplementaryAreaMoreMenuItem(_ref) {
898 let {
899 scope,
900 target,
901 __unstableExplicitMenuItem,
902 ...props
903 } = _ref;
904 return (0,external_wp_element_namespaceObject.createElement)(complementary_area_toggle, _extends({
905 as: toggleProps => {
906 return (0,external_wp_element_namespaceObject.createElement)(action_item, _extends({
907 __unstableExplicitMenuItem: __unstableExplicitMenuItem,
908 __unstableTarget: `${scope}/${target}`,
909 as: PluginsMenuItem,
910 name: `${scope}/plugin-more-menu`
911 }, toggleProps));
912 },
913 role: "menuitemcheckbox",
914 selectedIcon: library_check,
915 name: target,
916 scope: scope
917 }, props));
918 }
919
920 ;// CONCATENATED MODULE: ./packages/interface/build-module/components/pinned-items/index.js
921
922
923
924 /**
925 * External dependencies
926 */
927
928
929 /**
930 * WordPress dependencies
931 */
932
933
934
935 function PinnedItems(_ref) {
936 let {
937 scope,
938 ...props
939 } = _ref;
940 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Fill, _extends({
941 name: `PinnedItems/${scope}`
942 }, props));
943 }
944
945 function PinnedItemsSlot(_ref2) {
946 let {
947 scope,
948 className,
949 ...props
950 } = _ref2;
951 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Slot, _extends({
952 name: `PinnedItems/${scope}`
953 }, props), fills => !(0,external_lodash_namespaceObject.isEmpty)(fills) && (0,external_wp_element_namespaceObject.createElement)("div", {
954 className: classnames_default()(className, 'interface-pinned-items')
955 }, fills));
956 }
957
958 PinnedItems.Slot = PinnedItemsSlot;
959 /* harmony default export */ var pinned_items = (PinnedItems);
960
961 ;// CONCATENATED MODULE: ./packages/interface/build-module/components/complementary-area/index.js
962
963
964
965 /**
966 * External dependencies
967 */
968
969 /**
970 * WordPress dependencies
971 */
972
973
974
975
976
977
978
979 /**
980 * Internal dependencies
981 */
982
983
984
985
986
987
988
989
990 function ComplementaryAreaSlot(_ref) {
991 let {
992 scope,
993 ...props
994 } = _ref;
995 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Slot, _extends({
996 name: `ComplementaryArea/${scope}`
997 }, props));
998 }
999
1000 function ComplementaryAreaFill(_ref2) {
1001 let {
1002 scope,
1003 children,
1004 className
1005 } = _ref2;
1006 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Fill, {
1007 name: `ComplementaryArea/${scope}`
1008 }, (0,external_wp_element_namespaceObject.createElement)("div", {
1009 className: className
1010 }, children));
1011 }
1012
1013 function useAdjustComplementaryListener(scope, identifier, activeArea, isActive, isSmall) {
1014 const previousIsSmall = (0,external_wp_element_namespaceObject.useRef)(false);
1015 const shouldOpenWhenNotSmall = (0,external_wp_element_namespaceObject.useRef)(false);
1016 const {
1017 enableComplementaryArea,
1018 disableComplementaryArea
1019 } = (0,external_wp_data_namespaceObject.useDispatch)(store);
1020 (0,external_wp_element_namespaceObject.useEffect)(() => {
1021 // If the complementary area is active and the editor is switching from a big to a small window size.
1022 if (isActive && isSmall && !previousIsSmall.current) {
1023 // Disable the complementary area.
1024 disableComplementaryArea(scope); // Flag the complementary area to be reopened when the window size goes from small to big.
1025
1026 shouldOpenWhenNotSmall.current = true;
1027 } else if ( // If there is a flag indicating the complementary area should be enabled when we go from small to big window size
1028 // and we are going from a small to big window size.
1029 shouldOpenWhenNotSmall.current && !isSmall && previousIsSmall.current) {
1030 // Remove the flag indicating the complementary area should be enabled.
1031 shouldOpenWhenNotSmall.current = false; // Enable the complementary area.
1032
1033 enableComplementaryArea(scope, identifier);
1034 } else if ( // If the flag is indicating the current complementary should be reopened but another complementary area becomes active,
1035 // remove the flag.
1036 shouldOpenWhenNotSmall.current && activeArea && activeArea !== identifier) {
1037 shouldOpenWhenNotSmall.current = false;
1038 }
1039
1040 if (isSmall !== previousIsSmall.current) {
1041 previousIsSmall.current = isSmall;
1042 }
1043 }, [isActive, isSmall, scope, identifier, activeArea]);
1044 }
1045
1046 function ComplementaryArea(_ref3) {
1047 let {
1048 children,
1049 className,
1050 closeLabel = (0,external_wp_i18n_namespaceObject.__)('Close plugin'),
1051 identifier,
1052 header,
1053 headerClassName,
1054 icon,
1055 isPinnable = true,
1056 panelClassName,
1057 scope,
1058 name,
1059 smallScreenTitle,
1060 title,
1061 toggleShortcut,
1062 isActiveByDefault,
1063 showIconLabels = false
1064 } = _ref3;
1065 const {
1066 isActive,
1067 isPinned,
1068 activeArea,
1069 isSmall,
1070 isLarge
1071 } = (0,external_wp_data_namespaceObject.useSelect)(select => {
1072 const {
1073 getActiveComplementaryArea,
1074 isItemPinned
1075 } = select(store);
1076
1077 const _activeArea = getActiveComplementaryArea(scope);
1078
1079 return {
1080 isActive: _activeArea === identifier,
1081 isPinned: isItemPinned(scope, identifier),
1082 activeArea: _activeArea,
1083 isSmall: select(external_wp_viewport_namespaceObject.store).isViewportMatch('< medium'),
1084 isLarge: select(external_wp_viewport_namespaceObject.store).isViewportMatch('large')
1085 };
1086 }, [identifier, scope]);
1087 useAdjustComplementaryListener(scope, identifier, activeArea, isActive, isSmall);
1088 const {
1089 enableComplementaryArea,
1090 disableComplementaryArea,
1091 pinItem,
1092 unpinItem
1093 } = (0,external_wp_data_namespaceObject.useDispatch)(store);
1094 (0,external_wp_element_namespaceObject.useEffect)(() => {
1095 if (isActiveByDefault && activeArea === undefined && !isSmall) {
1096 enableComplementaryArea(scope, identifier);
1097 }
1098 }, [activeArea, isActiveByDefault, scope, identifier, isSmall]);
1099 return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, isPinnable && (0,external_wp_element_namespaceObject.createElement)(pinned_items, {
1100 scope: scope
1101 }, isPinned && (0,external_wp_element_namespaceObject.createElement)(complementary_area_toggle, {
1102 scope: scope,
1103 identifier: identifier,
1104 isPressed: isActive && (!showIconLabels || isLarge),
1105 "aria-expanded": isActive,
1106 label: title,
1107 icon: showIconLabels ? library_check : icon,
1108 showTooltip: !showIconLabels,
1109 variant: showIconLabels ? 'tertiary' : undefined
1110 })), name && isPinnable && (0,external_wp_element_namespaceObject.createElement)(ComplementaryAreaMoreMenuItem, {
1111 target: name,
1112 scope: scope,
1113 icon: icon
1114 }, title), isActive && (0,external_wp_element_namespaceObject.createElement)(ComplementaryAreaFill, {
1115 className: classnames_default()('interface-complementary-area', className),
1116 scope: scope
1117 }, (0,external_wp_element_namespaceObject.createElement)(complementary_area_header, {
1118 className: headerClassName,
1119 closeLabel: closeLabel,
1120 onClose: () => disableComplementaryArea(scope),
1121 smallScreenTitle: smallScreenTitle,
1122 toggleButtonProps: {
1123 label: closeLabel,
1124 shortcut: toggleShortcut,
1125 scope,
1126 identifier
1127 }
1128 }, header || (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)("strong", null, title), isPinnable && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
1129 className: "interface-complementary-area__pin-unpin-item",
1130 icon: isPinned ? star_filled : star_empty,
1131 label: isPinned ? (0,external_wp_i18n_namespaceObject.__)('Unpin from toolbar') : (0,external_wp_i18n_namespaceObject.__)('Pin to toolbar'),
1132 onClick: () => (isPinned ? unpinItem : pinItem)(scope, identifier),
1133 isPressed: isPinned,
1134 "aria-expanded": isPinned
1135 }))), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Panel, {
1136 className: panelClassName
1137 }, children)));
1138 }
1139
1140 const ComplementaryAreaWrapped = complementary_area_context(ComplementaryArea);
1141 ComplementaryAreaWrapped.Slot = ComplementaryAreaSlot;
1142 /* harmony default export */ var complementary_area = (ComplementaryAreaWrapped);
1143
1144 ;// CONCATENATED MODULE: external ["wp","compose"]
1145 var external_wp_compose_namespaceObject = window["wp"]["compose"];
1146 ;// CONCATENATED MODULE: ./packages/interface/build-module/components/interface-skeleton/index.js
1147
1148
1149
1150 /**
1151 * External dependencies
1152 */
1153
1154 /**
1155 * WordPress dependencies
1156 */
1157
1158 /**
1159 * WordPress dependencies
1160 */
1161
1162
1163
1164
1165
1166
1167 function useHTMLClass(className) {
1168 (0,external_wp_element_namespaceObject.useEffect)(() => {
1169 const element = document && document.querySelector(`html:not(.${className})`);
1170
1171 if (!element) {
1172 return;
1173 }
1174
1175 element.classList.toggle(className);
1176 return () => {
1177 element.classList.toggle(className);
1178 };
1179 }, [className]);
1180 }
1181
1182 function InterfaceSkeleton(_ref, ref) {
1183 let {
1184 footer,
1185 header,
1186 sidebar,
1187 secondarySidebar,
1188 notices,
1189 content,
1190 drawer,
1191 actions,
1192 labels,
1193 className,
1194 shortcuts
1195 } = _ref;
1196 const navigateRegionsProps = (0,external_wp_components_namespaceObject.__unstableUseNavigateRegions)(shortcuts);
1197 useHTMLClass('interface-interface-skeleton__html-container');
1198 const defaultLabels = {
1199 /* translators: accessibility text for the nav bar landmark region. */
1200 drawer: (0,external_wp_i18n_namespaceObject.__)('Drawer'),
1201
1202 /* translators: accessibility text for the top bar landmark region. */
1203 header: (0,external_wp_i18n_namespaceObject.__)('Header'),
1204
1205 /* translators: accessibility text for the content landmark region. */
1206 body: (0,external_wp_i18n_namespaceObject.__)('Content'),
1207
1208 /* translators: accessibility text for the secondary sidebar landmark region. */
1209 secondarySidebar: (0,external_wp_i18n_namespaceObject.__)('Block Library'),
1210
1211 /* translators: accessibility text for the settings landmark region. */
1212 sidebar: (0,external_wp_i18n_namespaceObject.__)('Settings'),
1213
1214 /* translators: accessibility text for the publish landmark region. */
1215 actions: (0,external_wp_i18n_namespaceObject.__)('Publish'),
1216
1217 /* translators: accessibility text for the footer landmark region. */
1218 footer: (0,external_wp_i18n_namespaceObject.__)('Footer')
1219 };
1220 const mergedLabels = { ...defaultLabels,
1221 ...labels
1222 };
1223 return (0,external_wp_element_namespaceObject.createElement)("div", _extends({}, navigateRegionsProps, {
1224 ref: (0,external_wp_compose_namespaceObject.useMergeRefs)([ref, navigateRegionsProps.ref]),
1225 className: classnames_default()(className, 'interface-interface-skeleton', navigateRegionsProps.className, !!footer && 'has-footer')
1226 }), !!drawer && (0,external_wp_element_namespaceObject.createElement)("div", {
1227 className: "interface-interface-skeleton__drawer",
1228 role: "region",
1229 "aria-label": mergedLabels.drawer,
1230 tabIndex: "-1"
1231 }, drawer), (0,external_wp_element_namespaceObject.createElement)("div", {
1232 className: "interface-interface-skeleton__editor"
1233 }, !!header && (0,external_wp_element_namespaceObject.createElement)("div", {
1234 className: "interface-interface-skeleton__header",
1235 role: "region",
1236 "aria-label": mergedLabels.header,
1237 tabIndex: "-1"
1238 }, header), (0,external_wp_element_namespaceObject.createElement)("div", {
1239 className: "interface-interface-skeleton__body"
1240 }, !!secondarySidebar && (0,external_wp_element_namespaceObject.createElement)("div", {
1241 className: "interface-interface-skeleton__secondary-sidebar",
1242 role: "region",
1243 "aria-label": mergedLabels.secondarySidebar,
1244 tabIndex: "-1"
1245 }, secondarySidebar), !!notices && (0,external_wp_element_namespaceObject.createElement)("div", {
1246 className: "interface-interface-skeleton__notices"
1247 }, notices), (0,external_wp_element_namespaceObject.createElement)("div", {
1248 className: "interface-interface-skeleton__content",
1249 role: "region",
1250 "aria-label": mergedLabels.body,
1251 tabIndex: "-1"
1252 }, content), !!sidebar && (0,external_wp_element_namespaceObject.createElement)("div", {
1253 className: "interface-interface-skeleton__sidebar",
1254 role: "region",
1255 "aria-label": mergedLabels.sidebar,
1256 tabIndex: "-1"
1257 }, sidebar), !!actions && (0,external_wp_element_namespaceObject.createElement)("div", {
1258 className: "interface-interface-skeleton__actions",
1259 role: "region",
1260 "aria-label": mergedLabels.actions,
1261 tabIndex: "-1"
1262 }, actions))), !!footer && (0,external_wp_element_namespaceObject.createElement)("div", {
1263 className: "interface-interface-skeleton__footer",
1264 role: "region",
1265 "aria-label": mergedLabels.footer,
1266 tabIndex: "-1"
1267 }, footer));
1268 }
1269
1270 /* harmony default export */ var interface_skeleton = ((0,external_wp_element_namespaceObject.forwardRef)(InterfaceSkeleton));
1271
1272 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/more-vertical.js
1273
1274
1275 /**
1276 * WordPress dependencies
1277 */
1278
1279 const moreVertical = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
1280 xmlns: "http://www.w3.org/2000/svg",
1281 viewBox: "0 0 24 24"
1282 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
1283 d: "M13 19h-2v-2h2v2zm0-6h-2v-2h2v2zm0-6h-2V5h2v2z"
1284 }));
1285 /* harmony default export */ var more_vertical = (moreVertical);
1286
1287 ;// CONCATENATED MODULE: ./packages/interface/build-module/components/more-menu-dropdown/index.js
1288
1289
1290 /**
1291 * External dependencies
1292 */
1293
1294 /**
1295 * WordPress dependencies
1296 */
1297
1298
1299
1300
1301 function MoreMenuDropdown(_ref) {
1302 let {
1303 as: DropdownComponent = external_wp_components_namespaceObject.DropdownMenu,
1304 className,
1305
1306 /* translators: button label text should, if possible, be under 16 characters. */
1307 label = (0,external_wp_i18n_namespaceObject.__)('Options'),
1308 popoverProps,
1309 toggleProps,
1310 children
1311 } = _ref;
1312 return (0,external_wp_element_namespaceObject.createElement)(DropdownComponent, {
1313 className: classnames_default()('interface-more-menu-dropdown', className),
1314 icon: more_vertical,
1315 label: label,
1316 popoverProps: {
1317 position: 'bottom left',
1318 ...popoverProps,
1319 className: classnames_default()('interface-more-menu-dropdown__content', popoverProps === null || popoverProps === void 0 ? void 0 : popoverProps.className)
1320 },
1321 toggleProps: {
1322 tooltipPosition: 'bottom',
1323 ...toggleProps
1324 }
1325 }, onClose => children(onClose));
1326 }
1327
1328 ;// CONCATENATED MODULE: ./packages/interface/build-module/components/index.js
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342 ;// CONCATENATED MODULE: ./packages/interface/build-module/index.js
1343
1344
1345
1346 ;// CONCATENATED MODULE: external ["wp","blockEditor"]
1347 var external_wp_blockEditor_namespaceObject = window["wp"]["blockEditor"];
1348 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/store/transformers.js
1349 /**
1350 * WordPress dependencies
1351 */
1352
1353
1354 /**
1355 * Converts a widget entity record into a block.
1356 *
1357 * @param {Object} widget The widget entity record.
1358 * @return {Object} a block (converted from the entity record).
1359 */
1360
1361 function transformWidgetToBlock(widget) {
1362 if (widget.id_base === 'block') {
1363 const parsedBlocks = (0,external_wp_blocks_namespaceObject.parse)(widget.instance.raw.content);
1364
1365 if (!parsedBlocks.length) {
1366 return (0,external_wp_widgets_namespaceObject.addWidgetIdToBlock)((0,external_wp_blocks_namespaceObject.createBlock)('core/paragraph', {}, []), widget.id);
1367 }
1368
1369 return (0,external_wp_widgets_namespaceObject.addWidgetIdToBlock)(parsedBlocks[0], widget.id);
1370 }
1371
1372 let attributes;
1373
1374 if (widget._embedded.about[0].is_multi) {
1375 attributes = {
1376 idBase: widget.id_base,
1377 instance: widget.instance
1378 };
1379 } else {
1380 attributes = {
1381 id: widget.id
1382 };
1383 }
1384
1385 return (0,external_wp_widgets_namespaceObject.addWidgetIdToBlock)((0,external_wp_blocks_namespaceObject.createBlock)('core/legacy-widget', attributes, []), widget.id);
1386 }
1387 /**
1388 * Converts a block to a widget entity record.
1389 *
1390 * @param {Object} block The block.
1391 * @param {Object?} relatedWidget A related widget entity record from the API (optional).
1392 * @return {Object} the widget object (converted from block).
1393 */
1394
1395 function transformBlockToWidget(block) {
1396 let relatedWidget = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1397 let widget;
1398 const isValidLegacyWidgetBlock = block.name === 'core/legacy-widget' && (block.attributes.id || block.attributes.instance);
1399
1400 if (isValidLegacyWidgetBlock) {
1401 var _block$attributes$id, _block$attributes$idB, _block$attributes$ins;
1402
1403 widget = { ...relatedWidget,
1404 id: (_block$attributes$id = block.attributes.id) !== null && _block$attributes$id !== void 0 ? _block$attributes$id : relatedWidget.id,
1405 id_base: (_block$attributes$idB = block.attributes.idBase) !== null && _block$attributes$idB !== void 0 ? _block$attributes$idB : relatedWidget.id_base,
1406 instance: (_block$attributes$ins = block.attributes.instance) !== null && _block$attributes$ins !== void 0 ? _block$attributes$ins : relatedWidget.instance
1407 };
1408 } else {
1409 widget = { ...relatedWidget,
1410 id_base: 'block',
1411 instance: {
1412 raw: {
1413 content: (0,external_wp_blocks_namespaceObject.serialize)(block)
1414 }
1415 }
1416 };
1417 } // Delete read-only properties.
1418
1419
1420 delete widget.rendered;
1421 delete widget.rendered_form;
1422 return widget;
1423 }
1424
1425 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/store/utils.js
1426 /**
1427 * "Kind" of the navigation post.
1428 *
1429 * @type {string}
1430 */
1431 const KIND = 'root';
1432 /**
1433 * "post type" of the navigation post.
1434 *
1435 * @type {string}
1436 */
1437
1438 const WIDGET_AREA_ENTITY_TYPE = 'sidebar';
1439 /**
1440 * "post type" of the widget area post.
1441 *
1442 * @type {string}
1443 */
1444
1445 const POST_TYPE = 'postType';
1446 /**
1447 * Builds an ID for a new widget area post.
1448 *
1449 * @param {number} widgetAreaId Widget area id.
1450 * @return {string} An ID.
1451 */
1452
1453 const buildWidgetAreaPostId = widgetAreaId => `widget-area-${widgetAreaId}`;
1454 /**
1455 * Builds an ID for a global widget areas post.
1456 *
1457 * @return {string} An ID.
1458 */
1459
1460 const buildWidgetAreasPostId = () => `widget-areas`;
1461 /**
1462 * Builds a query to resolve sidebars.
1463 *
1464 * @return {Object} Query.
1465 */
1466
1467 function buildWidgetAreasQuery() {
1468 return {
1469 per_page: -1
1470 };
1471 }
1472 /**
1473 * Builds a query to resolve widgets.
1474 *
1475 * @return {Object} Query.
1476 */
1477
1478 function buildWidgetsQuery() {
1479 return {
1480 per_page: -1,
1481 _embed: 'about'
1482 };
1483 }
1484 /**
1485 * Creates a stub post with given id and set of blocks. Used as a governing entity records
1486 * for all widget areas.
1487 *
1488 * @param {string} id Post ID.
1489 * @param {Array} blocks The list of blocks.
1490 * @return {Object} A stub post object formatted in compliance with the data layer.
1491 */
1492
1493 const createStubPost = (id, blocks) => ({
1494 id,
1495 slug: id,
1496 status: 'draft',
1497 type: 'page',
1498 blocks,
1499 meta: {
1500 widgetAreaId: id
1501 }
1502 });
1503
1504 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/store/constants.js
1505 /**
1506 * Module Constants
1507 */
1508 const constants_STORE_NAME = 'core/edit-widgets';
1509
1510 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/store/actions.js
1511 /**
1512 * WordPress dependencies
1513 */
1514
1515
1516
1517
1518
1519
1520 /**
1521 * Internal dependencies
1522 */
1523
1524
1525
1526
1527 /**
1528 * Persists a stub post with given ID to core data store. The post is meant to be in-memory only and
1529 * shouldn't be saved via the API.
1530 *
1531 * @param {string} id Post ID.
1532 * @param {Array} blocks Blocks the post should consist of.
1533 * @return {Object} The post object.
1534 */
1535
1536 const persistStubPost = (id, blocks) => _ref => {
1537 let {
1538 registry
1539 } = _ref;
1540 const stubPost = createStubPost(id, blocks);
1541 registry.dispatch(external_wp_coreData_namespaceObject.store).receiveEntityRecords(KIND, POST_TYPE, stubPost, {
1542 id: stubPost.id
1543 }, false);
1544 return stubPost;
1545 };
1546 /**
1547 * Converts all the blocks from edited widget areas into widgets,
1548 * and submits a batch request to save everything at once.
1549 *
1550 * Creates a snackbar notice on either success or error.
1551 *
1552 * @return {Function} An action creator.
1553 */
1554
1555 const saveEditedWidgetAreas = () => async _ref2 => {
1556 let {
1557 select,
1558 dispatch,
1559 registry
1560 } = _ref2;
1561 const editedWidgetAreas = select.getEditedWidgetAreas();
1562
1563 if (!(editedWidgetAreas !== null && editedWidgetAreas !== void 0 && editedWidgetAreas.length)) {
1564 return;
1565 }
1566
1567 try {
1568 await dispatch.saveWidgetAreas(editedWidgetAreas);
1569 registry.dispatch(external_wp_notices_namespaceObject.store).createSuccessNotice((0,external_wp_i18n_namespaceObject.__)('Widgets saved.'), {
1570 type: 'snackbar'
1571 });
1572 } catch (e) {
1573 registry.dispatch(external_wp_notices_namespaceObject.store).createErrorNotice(
1574 /* translators: %s: The error message. */
1575 (0,external_wp_i18n_namespaceObject.sprintf)((0,external_wp_i18n_namespaceObject.__)('There was an error. %s'), e.message), {
1576 type: 'snackbar'
1577 });
1578 }
1579 };
1580 /**
1581 * Converts all the blocks from specified widget areas into widgets,
1582 * and submits a batch request to save everything at once.
1583 *
1584 * @param {Object[]} widgetAreas Widget areas to save.
1585 * @return {Function} An action creator.
1586 */
1587
1588 const saveWidgetAreas = widgetAreas => async _ref3 => {
1589 let {
1590 dispatch,
1591 registry
1592 } = _ref3;
1593
1594 try {
1595 for (const widgetArea of widgetAreas) {
1596 await dispatch.saveWidgetArea(widgetArea.id);
1597 }
1598 } finally {
1599 // saveEditedEntityRecord resets the resolution status, let's fix it manually.
1600 await registry.dispatch(external_wp_coreData_namespaceObject.store).finishResolution('getEntityRecord', KIND, WIDGET_AREA_ENTITY_TYPE, buildWidgetAreasQuery());
1601 }
1602 };
1603 /**
1604 * Converts all the blocks from a widget area specified by ID into widgets,
1605 * and submits a batch request to save everything at once.
1606 *
1607 * @param {string} widgetAreaId ID of the widget area to process.
1608 * @return {Function} An action creator.
1609 */
1610
1611 const saveWidgetArea = widgetAreaId => async _ref4 => {
1612 let {
1613 dispatch,
1614 select,
1615 registry
1616 } = _ref4;
1617 const widgets = select.getWidgets();
1618 const post = registry.select(external_wp_coreData_namespaceObject.store).getEditedEntityRecord(KIND, POST_TYPE, buildWidgetAreaPostId(widgetAreaId)); // Get all widgets from this area
1619
1620 const areaWidgets = Object.values(widgets).filter(_ref5 => {
1621 let {
1622 sidebar
1623 } = _ref5;
1624 return sidebar === widgetAreaId;
1625 }); // Remove all duplicate reference widget instances for legacy widgets.
1626 // Why? We filter out the widgets with duplicate IDs to prevent adding more than one instance of a widget
1627 // implemented using a function. WordPress doesn't support having more than one instance of these, if you try to
1628 // save multiple instances of these in different sidebars you will run into undefined behaviors.
1629
1630 const usedReferenceWidgets = [];
1631 const widgetsBlocks = post.blocks.filter(block => {
1632 const {
1633 id
1634 } = block.attributes;
1635
1636 if (block.name === 'core/legacy-widget' && id) {
1637 if (usedReferenceWidgets.includes(id)) {
1638 return false;
1639 }
1640
1641 usedReferenceWidgets.push(id);
1642 }
1643
1644 return true;
1645 }); // Determine which widgets have been deleted. We can tell if a widget is
1646 // deleted and not just moved to a different area by looking to see if
1647 // getWidgetAreaForWidgetId() finds something.
1648
1649 const deletedWidgets = [];
1650
1651 for (const widget of areaWidgets) {
1652 const widgetsNewArea = select.getWidgetAreaForWidgetId(widget.id);
1653
1654 if (!widgetsNewArea) {
1655 deletedWidgets.push(widget);
1656 }
1657 }
1658
1659 const batchMeta = [];
1660 const batchTasks = [];
1661 const sidebarWidgetsIds = [];
1662
1663 for (let i = 0; i < widgetsBlocks.length; i++) {
1664 const block = widgetsBlocks[i];
1665 const widgetId = (0,external_wp_widgets_namespaceObject.getWidgetIdFromBlock)(block);
1666 const oldWidget = widgets[widgetId];
1667 const widget = transformBlockToWidget(block, oldWidget); // We'll replace the null widgetId after save, but we track it here
1668 // since order is important.
1669
1670 sidebarWidgetsIds.push(widgetId); // Check oldWidget as widgetId might refer to an ID which has been
1671 // deleted, e.g. if a deleted block is restored via undo after saving.
1672
1673 if (oldWidget) {
1674 // Update an existing widget.
1675 registry.dispatch(external_wp_coreData_namespaceObject.store).editEntityRecord('root', 'widget', widgetId, { ...widget,
1676 sidebar: widgetAreaId
1677 }, {
1678 undoIgnore: true
1679 });
1680 const hasEdits = registry.select(external_wp_coreData_namespaceObject.store).hasEditsForEntityRecord('root', 'widget', widgetId);
1681
1682 if (!hasEdits) {
1683 continue;
1684 }
1685
1686 batchTasks.push(_ref6 => {
1687 let {
1688 saveEditedEntityRecord
1689 } = _ref6;
1690 return saveEditedEntityRecord('root', 'widget', widgetId);
1691 });
1692 } else {
1693 // Create a new widget.
1694 batchTasks.push(_ref7 => {
1695 let {
1696 saveEntityRecord
1697 } = _ref7;
1698 return saveEntityRecord('root', 'widget', { ...widget,
1699 sidebar: widgetAreaId
1700 });
1701 });
1702 }
1703
1704 batchMeta.push({
1705 block,
1706 position: i,
1707 clientId: block.clientId
1708 });
1709 }
1710
1711 for (const widget of deletedWidgets) {
1712 batchTasks.push(_ref8 => {
1713 let {
1714 deleteEntityRecord
1715 } = _ref8;
1716 return deleteEntityRecord('root', 'widget', widget.id, {
1717 force: true
1718 });
1719 });
1720 }
1721
1722 const records = await registry.dispatch(external_wp_coreData_namespaceObject.store).__experimentalBatch(batchTasks);
1723 const preservedRecords = records.filter(record => !record.hasOwnProperty('deleted'));
1724 const failedWidgetNames = [];
1725
1726 for (let i = 0; i < preservedRecords.length; i++) {
1727 const widget = preservedRecords[i];
1728 const {
1729 block,
1730 position
1731 } = batchMeta[i]; // Set __internalWidgetId on the block. This will be persisted to the
1732 // store when we dispatch receiveEntityRecords( post ) below.
1733
1734 post.blocks[position].attributes.__internalWidgetId = widget.id;
1735 const error = registry.select(external_wp_coreData_namespaceObject.store).getLastEntitySaveError('root', 'widget', widget.id);
1736
1737 if (error) {
1738 var _block$attributes;
1739
1740 failedWidgetNames.push(((_block$attributes = block.attributes) === null || _block$attributes === void 0 ? void 0 : _block$attributes.name) || (block === null || block === void 0 ? void 0 : block.name));
1741 }
1742
1743 if (!sidebarWidgetsIds[position]) {
1744 sidebarWidgetsIds[position] = widget.id;
1745 }
1746 }
1747
1748 if (failedWidgetNames.length) {
1749 throw new Error((0,external_wp_i18n_namespaceObject.sprintf)(
1750 /* translators: %s: List of widget names */
1751 (0,external_wp_i18n_namespaceObject.__)('Could not save the following widgets: %s.'), failedWidgetNames.join(', ')));
1752 }
1753
1754 registry.dispatch(external_wp_coreData_namespaceObject.store).editEntityRecord(KIND, WIDGET_AREA_ENTITY_TYPE, widgetAreaId, {
1755 widgets: sidebarWidgetsIds
1756 }, {
1757 undoIgnore: true
1758 });
1759 dispatch(trySaveWidgetArea(widgetAreaId));
1760 registry.dispatch(external_wp_coreData_namespaceObject.store).receiveEntityRecords(KIND, POST_TYPE, post, undefined);
1761 };
1762
1763 const trySaveWidgetArea = widgetAreaId => _ref9 => {
1764 let {
1765 registry
1766 } = _ref9;
1767 registry.dispatch(external_wp_coreData_namespaceObject.store).saveEditedEntityRecord(KIND, WIDGET_AREA_ENTITY_TYPE, widgetAreaId, {
1768 throwOnError: true
1769 });
1770 };
1771 /**
1772 * Sets the clientId stored for a particular widgetId.
1773 *
1774 * @param {number} clientId Client id.
1775 * @param {number} widgetId Widget id.
1776 *
1777 * @return {Object} Action.
1778 */
1779
1780
1781 function setWidgetIdForClientId(clientId, widgetId) {
1782 return {
1783 type: 'SET_WIDGET_ID_FOR_CLIENT_ID',
1784 clientId,
1785 widgetId
1786 };
1787 }
1788 /**
1789 * Sets the open state of all the widget areas.
1790 *
1791 * @param {Object} widgetAreasOpenState The open states of all the widget areas.
1792 *
1793 * @return {Object} Action.
1794 */
1795
1796 function setWidgetAreasOpenState(widgetAreasOpenState) {
1797 return {
1798 type: 'SET_WIDGET_AREAS_OPEN_STATE',
1799 widgetAreasOpenState
1800 };
1801 }
1802 /**
1803 * Sets the open state of the widget area.
1804 *
1805 * @param {string} clientId The clientId of the widget area.
1806 * @param {boolean} isOpen Whether the widget area should be opened.
1807 *
1808 * @return {Object} Action.
1809 */
1810
1811 function setIsWidgetAreaOpen(clientId, isOpen) {
1812 return {
1813 type: 'SET_IS_WIDGET_AREA_OPEN',
1814 clientId,
1815 isOpen
1816 };
1817 }
1818 /**
1819 * Returns an action object used to open/close the inserter.
1820 *
1821 * @param {boolean|Object} value Whether the inserter should be
1822 * opened (true) or closed (false).
1823 * To specify an insertion point,
1824 * use an object.
1825 * @param {string} value.rootClientId The root client ID to insert at.
1826 * @param {number} value.insertionIndex The index to insert at.
1827 *
1828 * @return {Object} Action object.
1829 */
1830
1831 function setIsInserterOpened(value) {
1832 return {
1833 type: 'SET_IS_INSERTER_OPENED',
1834 value
1835 };
1836 }
1837 /**
1838 * Returns an action object used to open/close the list view.
1839 *
1840 * @param {boolean} isOpen A boolean representing whether the list view should be opened or closed.
1841 * @return {Object} Action object.
1842 */
1843
1844 function setIsListViewOpened(isOpen) {
1845 return {
1846 type: 'SET_IS_LIST_VIEW_OPENED',
1847 isOpen
1848 };
1849 }
1850 /**
1851 * Returns an action object signalling that the user closed the sidebar.
1852 *
1853 * @return {Object} Action creator.
1854 */
1855
1856 const closeGeneralSidebar = () => _ref10 => {
1857 let {
1858 registry
1859 } = _ref10;
1860 registry.dispatch(store).disableComplementaryArea(constants_STORE_NAME);
1861 };
1862 /**
1863 * Action that handles moving a block between widget areas
1864 *
1865 * @param {string} clientId The clientId of the block to move.
1866 * @param {string} widgetAreaId The id of the widget area to move the block to.
1867 */
1868
1869 const moveBlockToWidgetArea = (clientId, widgetAreaId) => async _ref11 => {
1870 let {
1871 dispatch,
1872 select,
1873 registry
1874 } = _ref11;
1875 const sourceRootClientId = registry.select(external_wp_blockEditor_namespaceObject.store).getBlockRootClientId([clientId]); // Search the top level blocks (widget areas) for the one with the matching
1876 // id attribute. Makes the assumption that all top-level blocks are widget
1877 // areas.
1878
1879 const widgetAreas = registry.select(external_wp_blockEditor_namespaceObject.store).getBlocks();
1880 const destinationWidgetAreaBlock = widgetAreas.find(_ref12 => {
1881 let {
1882 attributes
1883 } = _ref12;
1884 return attributes.id === widgetAreaId;
1885 });
1886 const destinationRootClientId = destinationWidgetAreaBlock.clientId; // Get the index for moving to the end of the the destination widget area.
1887
1888 const destinationInnerBlocksClientIds = registry.select(external_wp_blockEditor_namespaceObject.store).getBlockOrder(destinationRootClientId);
1889 const destinationIndex = destinationInnerBlocksClientIds.length; // Reveal the widget area, if it's not open.
1890
1891 const isDestinationWidgetAreaOpen = select.getIsWidgetAreaOpen(destinationRootClientId);
1892
1893 if (!isDestinationWidgetAreaOpen) {
1894 dispatch.setIsWidgetAreaOpen(destinationRootClientId, true);
1895 } // Move the block.
1896
1897
1898 registry.dispatch(external_wp_blockEditor_namespaceObject.store).moveBlocksToPosition([clientId], sourceRootClientId, destinationRootClientId, destinationIndex);
1899 };
1900
1901 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/store/resolvers.js
1902 /**
1903 * WordPress dependencies
1904 */
1905
1906
1907 /**
1908 * Internal dependencies
1909 */
1910
1911
1912
1913
1914 /**
1915 * Creates a "stub" widgets post reflecting all available widget areas. The
1916 * post is meant as a convenient to only exists in runtime and should never be saved. It
1917 * enables a convenient way of editing the widgets by using a regular post editor.
1918 *
1919 * Fetches all widgets from all widgets aras, converts them into blocks, and hydrates a new post with them.
1920 *
1921 * @return {Function} An action creator.
1922 */
1923
1924 const getWidgetAreas = () => async _ref => {
1925 let {
1926 dispatch,
1927 registry
1928 } = _ref;
1929 const query = buildWidgetAreasQuery();
1930 const widgetAreas = await registry.resolveSelect(external_wp_coreData_namespaceObject.store).getEntityRecords(KIND, WIDGET_AREA_ENTITY_TYPE, query);
1931 const widgetAreaBlocks = [];
1932 const sortedWidgetAreas = widgetAreas.sort((a, b) => {
1933 if (a.id === 'wp_inactive_widgets') {
1934 return 1;
1935 }
1936
1937 if (b.id === 'wp_inactive_widgets') {
1938 return -1;
1939 }
1940
1941 return 0;
1942 });
1943
1944 for (const widgetArea of sortedWidgetAreas) {
1945 widgetAreaBlocks.push((0,external_wp_blocks_namespaceObject.createBlock)('core/widget-area', {
1946 id: widgetArea.id,
1947 name: widgetArea.name
1948 }));
1949
1950 if (!widgetArea.widgets.length) {
1951 // If this widget area has no widgets, it won't get a post setup by
1952 // the getWidgets resolver.
1953 dispatch(persistStubPost(buildWidgetAreaPostId(widgetArea.id), []));
1954 }
1955 }
1956
1957 const widgetAreasOpenState = {};
1958 widgetAreaBlocks.forEach((widgetAreaBlock, index) => {
1959 // Defaults to open the first widget area.
1960 widgetAreasOpenState[widgetAreaBlock.clientId] = index === 0;
1961 });
1962 dispatch(setWidgetAreasOpenState(widgetAreasOpenState));
1963 dispatch(persistStubPost(buildWidgetAreasPostId(), widgetAreaBlocks));
1964 };
1965 /**
1966 * Fetches all widgets from all widgets ares, and groups them by widget area Id.
1967 *
1968 * @return {Function} An action creator.
1969 */
1970
1971 const getWidgets = () => async _ref2 => {
1972 let {
1973 dispatch,
1974 registry
1975 } = _ref2;
1976 const query = buildWidgetsQuery();
1977 const widgets = await registry.resolveSelect(external_wp_coreData_namespaceObject.store).getEntityRecords('root', 'widget', query);
1978 const groupedBySidebar = {};
1979
1980 for (const widget of widgets) {
1981 const block = transformWidgetToBlock(widget);
1982 groupedBySidebar[widget.sidebar] = groupedBySidebar[widget.sidebar] || [];
1983 groupedBySidebar[widget.sidebar].push(block);
1984 }
1985
1986 for (const sidebarId in groupedBySidebar) {
1987 if (groupedBySidebar.hasOwnProperty(sidebarId)) {
1988 // Persist the actual post containing the widget block
1989 dispatch(persistStubPost(buildWidgetAreaPostId(sidebarId), groupedBySidebar[sidebarId]));
1990 }
1991 }
1992 };
1993
1994 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/store/selectors.js
1995 /**
1996 * External dependencies
1997 */
1998
1999 /**
2000 * WordPress dependencies
2001 */
2002
2003
2004
2005
2006
2007 /**
2008 * Internal dependencies
2009 */
2010
2011
2012
2013 /**
2014 * Returns all API widgets.
2015 *
2016 * @return {Object[]} API List of widgets.
2017 */
2018
2019 const selectors_getWidgets = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => () => {
2020 const widgets = select(external_wp_coreData_namespaceObject.store).getEntityRecords('root', 'widget', buildWidgetsQuery());
2021 return (0,external_lodash_namespaceObject.keyBy)(widgets, 'id');
2022 });
2023 /**
2024 * Returns API widget data for a particular widget ID.
2025 *
2026 * @param {number} id Widget ID.
2027 *
2028 * @return {Object} API widget data for a particular widget ID.
2029 */
2030
2031 const getWidget = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (state, id) => {
2032 const widgets = select(constants_STORE_NAME).getWidgets();
2033 return widgets[id];
2034 });
2035 /**
2036 * Returns all API widget areas.
2037 *
2038 * @return {Object[]} API List of widget areas.
2039 */
2040
2041 const selectors_getWidgetAreas = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => () => {
2042 const query = buildWidgetAreasQuery();
2043 return select(external_wp_coreData_namespaceObject.store).getEntityRecords(KIND, WIDGET_AREA_ENTITY_TYPE, query);
2044 });
2045 /**
2046 * Returns widgetArea containing a block identify by given widgetId
2047 *
2048 * @param {string} widgetId The ID of the widget.
2049 * @return {Object} Containing widget area.
2050 */
2051
2052 const getWidgetAreaForWidgetId = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (state, widgetId) => {
2053 const widgetAreas = select(constants_STORE_NAME).getWidgetAreas();
2054 return widgetAreas.find(widgetArea => {
2055 const post = select(external_wp_coreData_namespaceObject.store).getEditedEntityRecord(KIND, POST_TYPE, buildWidgetAreaPostId(widgetArea.id));
2056 const blockWidgetIds = post.blocks.map(block => (0,external_wp_widgets_namespaceObject.getWidgetIdFromBlock)(block));
2057 return blockWidgetIds.includes(widgetId);
2058 });
2059 });
2060 /**
2061 * Given a child client id, returns the parent widget area block.
2062 *
2063 * @param {string} clientId The client id of a block in a widget area.
2064 *
2065 * @return {WPBlock} The widget area block.
2066 */
2067
2068 const getParentWidgetAreaBlock = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (state, clientId) => {
2069 const {
2070 getBlock,
2071 getBlockName,
2072 getBlockParents
2073 } = select(external_wp_blockEditor_namespaceObject.store);
2074 const blockParents = getBlockParents(clientId);
2075 const widgetAreaClientId = blockParents.find(parentClientId => getBlockName(parentClientId) === 'core/widget-area');
2076 return getBlock(widgetAreaClientId);
2077 });
2078 /**
2079 * Returns all edited widget area entity records.
2080 *
2081 * @return {Object[]} List of edited widget area entity records.
2082 */
2083
2084 const getEditedWidgetAreas = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (state, ids) => {
2085 let widgetAreas = select(constants_STORE_NAME).getWidgetAreas();
2086
2087 if (!widgetAreas) {
2088 return [];
2089 }
2090
2091 if (ids) {
2092 widgetAreas = widgetAreas.filter(_ref => {
2093 let {
2094 id
2095 } = _ref;
2096 return ids.includes(id);
2097 });
2098 }
2099
2100 return widgetAreas.filter(_ref2 => {
2101 let {
2102 id
2103 } = _ref2;
2104 return select(external_wp_coreData_namespaceObject.store).hasEditsForEntityRecord(KIND, POST_TYPE, buildWidgetAreaPostId(id));
2105 }).map(_ref3 => {
2106 let {
2107 id
2108 } = _ref3;
2109 return select(external_wp_coreData_namespaceObject.store).getEditedEntityRecord(KIND, WIDGET_AREA_ENTITY_TYPE, id);
2110 });
2111 });
2112 /**
2113 * Returns all blocks representing reference widgets.
2114 *
2115 * @param {string} referenceWidgetName Optional. If given, only reference widgets with this name will be returned.
2116 * @return {Array} List of all blocks representing reference widgets
2117 */
2118
2119 const getReferenceWidgetBlocks = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => function (state) {
2120 let referenceWidgetName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
2121 const results = [];
2122 const widgetAreas = select(constants_STORE_NAME).getWidgetAreas();
2123
2124 for (const _widgetArea of widgetAreas) {
2125 const post = select(external_wp_coreData_namespaceObject.store).getEditedEntityRecord(KIND, POST_TYPE, buildWidgetAreaPostId(_widgetArea.id));
2126
2127 for (const block of post.blocks) {
2128 var _block$attributes;
2129
2130 if (block.name === 'core/legacy-widget' && (!referenceWidgetName || ((_block$attributes = block.attributes) === null || _block$attributes === void 0 ? void 0 : _block$attributes.referenceWidgetName) === referenceWidgetName)) {
2131 results.push(block);
2132 }
2133 }
2134 }
2135
2136 return results;
2137 });
2138 /**
2139 * Returns true if any widget area is currently being saved.
2140 *
2141 * @return {boolean} True if any widget area is currently being saved. False otherwise.
2142 */
2143
2144 const isSavingWidgetAreas = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => () => {
2145 var _select$getWidgetArea;
2146
2147 const widgetAreasIds = (_select$getWidgetArea = select(constants_STORE_NAME).getWidgetAreas()) === null || _select$getWidgetArea === void 0 ? void 0 : _select$getWidgetArea.map(_ref4 => {
2148 let {
2149 id
2150 } = _ref4;
2151 return id;
2152 });
2153
2154 if (!widgetAreasIds) {
2155 return false;
2156 }
2157
2158 for (const id of widgetAreasIds) {
2159 const isSaving = select(external_wp_coreData_namespaceObject.store).isSavingEntityRecord(KIND, WIDGET_AREA_ENTITY_TYPE, id);
2160
2161 if (isSaving) {
2162 return true;
2163 }
2164 }
2165
2166 const widgetIds = [...Object.keys(select(constants_STORE_NAME).getWidgets()), undefined // account for new widgets without an ID
2167 ];
2168
2169 for (const id of widgetIds) {
2170 const isSaving = select(external_wp_coreData_namespaceObject.store).isSavingEntityRecord('root', 'widget', id);
2171
2172 if (isSaving) {
2173 return true;
2174 }
2175 }
2176
2177 return false;
2178 });
2179 /**
2180 * Gets whether the widget area is opened.
2181 *
2182 * @param {Array} state The open state of the widget areas.
2183 * @param {string} clientId The clientId of the widget area.
2184 *
2185 * @return {boolean} True if the widget area is open.
2186 */
2187
2188 const getIsWidgetAreaOpen = (state, clientId) => {
2189 const {
2190 widgetAreasOpenState
2191 } = state;
2192 return !!widgetAreasOpenState[clientId];
2193 };
2194 /**
2195 * Returns true if the inserter is opened.
2196 *
2197 * @param {Object} state Global application state.
2198 *
2199 * @return {boolean} Whether the inserter is opened.
2200 */
2201
2202 function isInserterOpened(state) {
2203 return !!state.blockInserterPanel;
2204 }
2205 /**
2206 * Get the insertion point for the inserter.
2207 *
2208 * @param {Object} state Global application state.
2209 *
2210 * @return {Object} The root client ID and index to insert at.
2211 */
2212
2213 function __experimentalGetInsertionPoint(state) {
2214 const {
2215 rootClientId,
2216 insertionIndex
2217 } = state.blockInserterPanel;
2218 return {
2219 rootClientId,
2220 insertionIndex
2221 };
2222 }
2223 /**
2224 * Returns true if a block can be inserted into a widget area.
2225 *
2226 * @param {Array} state The open state of the widget areas.
2227 * @param {string} blockName The name of the block being inserted.
2228 *
2229 * @return {boolean} True if the block can be inserted in a widget area.
2230 */
2231
2232 const canInsertBlockInWidgetArea = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (state, blockName) => {
2233 // Widget areas are always top-level blocks, which getBlocks will return.
2234 const widgetAreas = select(external_wp_blockEditor_namespaceObject.store).getBlocks(); // Makes an assumption that a block that can be inserted into one
2235 // widget area can be inserted into any widget area. Uses the first
2236 // widget area for testing whether the block can be inserted.
2237
2238 const [firstWidgetArea] = widgetAreas;
2239 return select(external_wp_blockEditor_namespaceObject.store).canInsertBlockType(blockName, firstWidgetArea.clientId);
2240 });
2241 /**
2242 * Returns true if the list view is opened.
2243 *
2244 * @param {Object} state Global application state.
2245 *
2246 * @return {boolean} Whether the list view is opened.
2247 */
2248
2249 function isListViewOpened(state) {
2250 return state.listViewPanel;
2251 }
2252
2253 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/store/index.js
2254 /**
2255 * WordPress dependencies
2256 */
2257
2258
2259 /**
2260 * Internal dependencies
2261 */
2262
2263
2264
2265
2266
2267
2268 /**
2269 * Block editor data store configuration.
2270 *
2271 * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/data/README.md#register
2272 *
2273 * @type {Object}
2274 */
2275
2276 const storeConfig = {
2277 reducer: reducer,
2278 selectors: store_selectors_namespaceObject,
2279 resolvers: resolvers_namespaceObject,
2280 actions: store_actions_namespaceObject
2281 };
2282 /**
2283 * Store definition for the edit widgets namespace.
2284 *
2285 * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/data/README.md#createReduxStore
2286 *
2287 * @type {Object}
2288 */
2289
2290 const store_store = (0,external_wp_data_namespaceObject.createReduxStore)(constants_STORE_NAME, storeConfig);
2291 (0,external_wp_data_namespaceObject.register)(store_store); // This package uses a few in-memory post types as wrappers for convenience.
2292 // This middleware prevents any network requests related to these types as they are
2293 // bound to fail anyway.
2294
2295 external_wp_apiFetch_default().use(function (options, next) {
2296 var _options$path;
2297
2298 if (((_options$path = options.path) === null || _options$path === void 0 ? void 0 : _options$path.indexOf('/wp/v2/types/widget-area')) === 0) {
2299 return Promise.resolve({});
2300 }
2301
2302 return next(options);
2303 });
2304
2305 ;// CONCATENATED MODULE: external ["wp","hooks"]
2306 var external_wp_hooks_namespaceObject = window["wp"]["hooks"];
2307 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/filters/move-to-widget-area.js
2308
2309
2310 /**
2311 * WordPress dependencies
2312 */
2313
2314
2315
2316
2317
2318 /**
2319 * Internal dependencies
2320 */
2321
2322
2323 const withMoveToWidgetAreaToolbarItem = (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(BlockEdit => props => {
2324 const {
2325 clientId,
2326 name: blockName
2327 } = props;
2328 const {
2329 widgetAreas,
2330 currentWidgetAreaId,
2331 canInsertBlockInWidgetArea
2332 } = (0,external_wp_data_namespaceObject.useSelect)(select => {
2333 var _widgetAreaBlock$attr;
2334
2335 // Component won't display for a widget area, so don't run selectors.
2336 if (blockName === 'core/widget-area') {
2337 return {};
2338 }
2339
2340 const selectors = select(store_store);
2341 const widgetAreaBlock = selectors.getParentWidgetAreaBlock(clientId);
2342 return {
2343 widgetAreas: selectors.getWidgetAreas(),
2344 currentWidgetAreaId: widgetAreaBlock === null || widgetAreaBlock === void 0 ? void 0 : (_widgetAreaBlock$attr = widgetAreaBlock.attributes) === null || _widgetAreaBlock$attr === void 0 ? void 0 : _widgetAreaBlock$attr.id,
2345 canInsertBlockInWidgetArea: selectors.canInsertBlockInWidgetArea(blockName)
2346 };
2347 }, [clientId, blockName]);
2348 const {
2349 moveBlockToWidgetArea
2350 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store);
2351 const hasMultipleWidgetAreas = (widgetAreas === null || widgetAreas === void 0 ? void 0 : widgetAreas.length) > 1;
2352 const isMoveToWidgetAreaVisible = blockName !== 'core/widget-area' && hasMultipleWidgetAreas && canInsertBlockInWidgetArea;
2353 return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(BlockEdit, props), isMoveToWidgetAreaVisible && (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.BlockControls, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_widgets_namespaceObject.MoveToWidgetArea, {
2354 widgetAreas: widgetAreas,
2355 currentWidgetAreaId: currentWidgetAreaId,
2356 onSelect: widgetAreaId => {
2357 moveBlockToWidgetArea(props.clientId, widgetAreaId);
2358 }
2359 })));
2360 }, 'withMoveToWidgetAreaToolbarItem');
2361 (0,external_wp_hooks_namespaceObject.addFilter)('editor.BlockEdit', 'core/edit-widgets/block-edit', withMoveToWidgetAreaToolbarItem);
2362
2363 ;// CONCATENATED MODULE: external ["wp","mediaUtils"]
2364 var external_wp_mediaUtils_namespaceObject = window["wp"]["mediaUtils"];
2365 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/filters/replace-media-upload.js
2366 /**
2367 * WordPress dependencies
2368 */
2369
2370
2371
2372 const replaceMediaUpload = () => external_wp_mediaUtils_namespaceObject.MediaUpload;
2373
2374 (0,external_wp_hooks_namespaceObject.addFilter)('editor.MediaUpload', 'core/edit-widgets/replace-media-upload', replaceMediaUpload);
2375
2376 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/filters/index.js
2377 /**
2378 * Internal dependencies
2379 */
2380
2381
2382
2383 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/blocks/widget-area/edit/use-is-dragging-within.js
2384 /**
2385 * WordPress dependencies
2386 */
2387
2388 /** @typedef {import('@wordpress/element').RefObject} RefObject */
2389
2390 /**
2391 * A React hook to determine if it's dragging within the target element.
2392 *
2393 * @param {RefObject<HTMLElement>} elementRef The target elementRef object.
2394 *
2395 * @return {boolean} Is dragging within the target element.
2396 */
2397
2398 const useIsDraggingWithin = elementRef => {
2399 const [isDraggingWithin, setIsDraggingWithin] = (0,external_wp_element_namespaceObject.useState)(false);
2400 (0,external_wp_element_namespaceObject.useEffect)(() => {
2401 const {
2402 ownerDocument
2403 } = elementRef.current;
2404
2405 function handleDragStart(event) {
2406 // Check the first time when the dragging starts.
2407 handleDragEnter(event);
2408 } // Set to false whenever the user cancel the drag event by either releasing the mouse or press Escape.
2409
2410
2411 function handleDragEnd() {
2412 setIsDraggingWithin(false);
2413 }
2414
2415 function handleDragEnter(event) {
2416 // Check if the current target is inside the item element.
2417 if (elementRef.current.contains(event.target)) {
2418 setIsDraggingWithin(true);
2419 } else {
2420 setIsDraggingWithin(false);
2421 }
2422 } // Bind these events to the document to catch all drag events.
2423 // Ideally, we can also use `event.relatedTarget`, but sadly that doesn't work in Safari.
2424
2425
2426 ownerDocument.addEventListener('dragstart', handleDragStart);
2427 ownerDocument.addEventListener('dragend', handleDragEnd);
2428 ownerDocument.addEventListener('dragenter', handleDragEnter);
2429 return () => {
2430 ownerDocument.removeEventListener('dragstart', handleDragStart);
2431 ownerDocument.removeEventListener('dragend', handleDragEnd);
2432 ownerDocument.removeEventListener('dragenter', handleDragEnter);
2433 };
2434 }, []);
2435 return isDraggingWithin;
2436 };
2437
2438 /* harmony default export */ var use_is_dragging_within = (useIsDraggingWithin);
2439
2440 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/blocks/widget-area/edit/inner-blocks.js
2441
2442
2443 /**
2444 * External dependencies
2445 */
2446
2447 /**
2448 * WordPress dependencies
2449 */
2450
2451
2452
2453
2454 /**
2455 * Internal dependencies
2456 */
2457
2458
2459 function WidgetAreaInnerBlocks(_ref) {
2460 let {
2461 id
2462 } = _ref;
2463 const [blocks, onInput, onChange] = (0,external_wp_coreData_namespaceObject.useEntityBlockEditor)('root', 'postType');
2464 const innerBlocksRef = (0,external_wp_element_namespaceObject.useRef)();
2465 const isDraggingWithinInnerBlocks = use_is_dragging_within(innerBlocksRef);
2466 const shouldHighlightDropZone = isDraggingWithinInnerBlocks; // Using the experimental hook so that we can control the className of the element.
2467
2468 const innerBlocksProps = (0,external_wp_blockEditor_namespaceObject.useInnerBlocksProps)({
2469 ref: innerBlocksRef
2470 }, {
2471 value: blocks,
2472 onInput,
2473 onChange,
2474 templateLock: false,
2475 renderAppender: external_wp_blockEditor_namespaceObject.InnerBlocks.ButtonBlockAppender
2476 });
2477 return (0,external_wp_element_namespaceObject.createElement)("div", {
2478 "data-widget-area-id": id,
2479 className: classnames_default()('wp-block-widget-area__inner-blocks block-editor-inner-blocks editor-styles-wrapper', {
2480 'wp-block-widget-area__highlight-drop-zone': shouldHighlightDropZone
2481 })
2482 }, (0,external_wp_element_namespaceObject.createElement)("div", innerBlocksProps));
2483 }
2484
2485 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/blocks/widget-area/edit/index.js
2486
2487
2488 /**
2489 * WordPress dependencies
2490 */
2491
2492
2493
2494
2495 /**
2496 * Internal dependencies
2497 */
2498
2499
2500
2501
2502 /** @typedef {import('@wordpress/element').RefObject} RefObject */
2503
2504 function WidgetAreaEdit(_ref) {
2505 let {
2506 clientId,
2507 className,
2508 attributes: {
2509 id,
2510 name
2511 }
2512 } = _ref;
2513 const isOpen = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getIsWidgetAreaOpen(clientId), [clientId]);
2514 const {
2515 setIsWidgetAreaOpen
2516 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store);
2517 const wrapper = (0,external_wp_element_namespaceObject.useRef)();
2518 const setOpen = (0,external_wp_element_namespaceObject.useCallback)(openState => setIsWidgetAreaOpen(clientId, openState), [clientId]);
2519 const isDragging = useIsDragging(wrapper);
2520 const isDraggingWithin = use_is_dragging_within(wrapper);
2521 const [openedWhileDragging, setOpenedWhileDragging] = (0,external_wp_element_namespaceObject.useState)(false);
2522 (0,external_wp_element_namespaceObject.useEffect)(() => {
2523 if (!isDragging) {
2524 setOpenedWhileDragging(false);
2525 return;
2526 }
2527
2528 if (isDraggingWithin && !isOpen) {
2529 setOpen(true);
2530 setOpenedWhileDragging(true);
2531 } else if (!isDraggingWithin && isOpen && openedWhileDragging) {
2532 setOpen(false);
2533 }
2534 }, [isOpen, isDragging, isDraggingWithin, openedWhileDragging]);
2535 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Panel, {
2536 className: className,
2537 ref: wrapper
2538 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.PanelBody, {
2539 title: name,
2540 opened: isOpen,
2541 onToggle: () => {
2542 setIsWidgetAreaOpen(clientId, !isOpen);
2543 },
2544 scrollAfterOpen: !isDragging
2545 }, _ref2 => {
2546 let {
2547 opened
2548 } = _ref2;
2549 return (// This is required to ensure LegacyWidget blocks are not
2550 // unmounted when the panel is collapsed. Unmounting legacy
2551 // widgets may have unintended consequences (e.g. TinyMCE
2552 // not being properly reinitialized)
2553 (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__unstableDisclosureContent, {
2554 className: "wp-block-widget-area__panel-body-content",
2555 visible: opened
2556 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_coreData_namespaceObject.EntityProvider, {
2557 kind: "root",
2558 type: "postType",
2559 id: `widget-area-${id}`
2560 }, (0,external_wp_element_namespaceObject.createElement)(WidgetAreaInnerBlocks, {
2561 id: id
2562 })))
2563 );
2564 }));
2565 }
2566 /**
2567 * A React hook to determine if dragging is active.
2568 *
2569 * @param {RefObject<HTMLElement>} elementRef The target elementRef object.
2570 *
2571 * @return {boolean} Is dragging within the entire document.
2572 */
2573
2574 const useIsDragging = elementRef => {
2575 const [isDragging, setIsDragging] = (0,external_wp_element_namespaceObject.useState)(false);
2576 (0,external_wp_element_namespaceObject.useEffect)(() => {
2577 const {
2578 ownerDocument
2579 } = elementRef.current;
2580
2581 function handleDragStart() {
2582 setIsDragging(true);
2583 }
2584
2585 function handleDragEnd() {
2586 setIsDragging(false);
2587 }
2588
2589 ownerDocument.addEventListener('dragstart', handleDragStart);
2590 ownerDocument.addEventListener('dragend', handleDragEnd);
2591 return () => {
2592 ownerDocument.removeEventListener('dragstart', handleDragStart);
2593 ownerDocument.removeEventListener('dragend', handleDragEnd);
2594 };
2595 }, []);
2596 return isDragging;
2597 };
2598
2599 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/blocks/widget-area/index.js
2600 /**
2601 * WordPress dependencies
2602 */
2603
2604 /**
2605 * Internal dependencies
2606 */
2607
2608 const metadata = {
2609 name: "core/widget-area",
2610 category: "widgets",
2611 attributes: {
2612 id: {
2613 type: "string"
2614 },
2615 name: {
2616 type: "string"
2617 }
2618 },
2619 supports: {
2620 html: false,
2621 inserter: false,
2622 customClassName: false,
2623 reusable: false,
2624 __experimentalToolbar: false,
2625 __experimentalParentSelector: false
2626 },
2627 editorStyle: "wp-block-widget-area-editor",
2628 style: "wp-block-widget-area"
2629 };
2630
2631 const {
2632 name: widget_area_name
2633 } = metadata;
2634
2635 const settings = {
2636 title: (0,external_wp_i18n_namespaceObject.__)('Widget Area'),
2637 description: (0,external_wp_i18n_namespaceObject.__)('A widget area container.'),
2638 __experimentalLabel: _ref => {
2639 let {
2640 name: label
2641 } = _ref;
2642 return label;
2643 },
2644 edit: WidgetAreaEdit
2645 };
2646
2647 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/components/error-boundary/index.js
2648
2649
2650 /**
2651 * WordPress dependencies
2652 */
2653
2654
2655
2656
2657
2658
2659 function CopyButton(_ref) {
2660 let {
2661 text,
2662 children
2663 } = _ref;
2664 const ref = (0,external_wp_compose_namespaceObject.useCopyToClipboard)(text);
2665 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
2666 variant: "secondary",
2667 ref: ref
2668 }, children);
2669 }
2670
2671 class ErrorBoundary extends external_wp_element_namespaceObject.Component {
2672 constructor() {
2673 super(...arguments);
2674 this.reboot = this.reboot.bind(this);
2675 this.state = {
2676 error: null
2677 };
2678 }
2679
2680 componentDidCatch(error) {
2681 this.setState({
2682 error
2683 });
2684 }
2685
2686 reboot() {
2687 this.props.onError();
2688 }
2689
2690 render() {
2691 const {
2692 error
2693 } = this.state;
2694
2695 if (!error) {
2696 return this.props.children;
2697 }
2698
2699 return (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.Warning, {
2700 className: "edit-widgets-error-boundary",
2701 actions: [(0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
2702 key: "recovery",
2703 onClick: this.reboot,
2704 variant: "secondary"
2705 }, (0,external_wp_i18n_namespaceObject.__)('Attempt Recovery')), (0,external_wp_element_namespaceObject.createElement)(CopyButton, {
2706 key: "copy-error",
2707 text: error.stack
2708 }, (0,external_wp_i18n_namespaceObject.__)('Copy Error'))]
2709 }, (0,external_wp_i18n_namespaceObject.__)('The editor has encountered an unexpected error.'));
2710 }
2711
2712 }
2713
2714 ;// CONCATENATED MODULE: external ["wp","reusableBlocks"]
2715 var external_wp_reusableBlocks_namespaceObject = window["wp"]["reusableBlocks"];
2716 ;// CONCATENATED MODULE: external ["wp","keyboardShortcuts"]
2717 var external_wp_keyboardShortcuts_namespaceObject = window["wp"]["keyboardShortcuts"];
2718 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/components/keyboard-shortcuts/index.js
2719 /**
2720 * WordPress dependencies
2721 */
2722
2723
2724
2725
2726
2727 /**
2728 * Internal dependencies
2729 */
2730
2731
2732
2733 function KeyboardShortcuts() {
2734 const {
2735 redo,
2736 undo
2737 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store);
2738 const {
2739 saveEditedWidgetAreas
2740 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store);
2741 (0,external_wp_keyboardShortcuts_namespaceObject.useShortcut)('core/edit-widgets/undo', event => {
2742 undo();
2743 event.preventDefault();
2744 });
2745 (0,external_wp_keyboardShortcuts_namespaceObject.useShortcut)('core/edit-widgets/redo', event => {
2746 redo();
2747 event.preventDefault();
2748 });
2749 (0,external_wp_keyboardShortcuts_namespaceObject.useShortcut)('core/edit-widgets/save', event => {
2750 event.preventDefault();
2751 saveEditedWidgetAreas();
2752 });
2753 return null;
2754 }
2755
2756 function KeyboardShortcutsRegister() {
2757 // Registering the shortcuts.
2758 const {
2759 registerShortcut
2760 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_keyboardShortcuts_namespaceObject.store);
2761 (0,external_wp_element_namespaceObject.useEffect)(() => {
2762 registerShortcut({
2763 name: 'core/edit-widgets/undo',
2764 category: 'global',
2765 description: (0,external_wp_i18n_namespaceObject.__)('Undo your last changes.'),
2766 keyCombination: {
2767 modifier: 'primary',
2768 character: 'z'
2769 }
2770 });
2771 registerShortcut({
2772 name: 'core/edit-widgets/redo',
2773 category: 'global',
2774 description: (0,external_wp_i18n_namespaceObject.__)('Redo your last undo.'),
2775 keyCombination: {
2776 modifier: 'primaryShift',
2777 character: 'z'
2778 }
2779 });
2780 registerShortcut({
2781 name: 'core/edit-widgets/save',
2782 category: 'global',
2783 description: (0,external_wp_i18n_namespaceObject.__)('Save your changes.'),
2784 keyCombination: {
2785 modifier: 'primary',
2786 character: 's'
2787 }
2788 });
2789 registerShortcut({
2790 name: 'core/edit-widgets/keyboard-shortcuts',
2791 category: 'main',
2792 description: (0,external_wp_i18n_namespaceObject.__)('Display these keyboard shortcuts.'),
2793 keyCombination: {
2794 modifier: 'access',
2795 character: 'h'
2796 }
2797 });
2798 registerShortcut({
2799 name: 'core/edit-widgets/next-region',
2800 category: 'global',
2801 description: (0,external_wp_i18n_namespaceObject.__)('Navigate to the next part of the editor.'),
2802 keyCombination: {
2803 modifier: 'ctrl',
2804 character: '`'
2805 },
2806 aliases: [{
2807 modifier: 'access',
2808 character: 'n'
2809 }]
2810 });
2811 registerShortcut({
2812 name: 'core/edit-widgets/previous-region',
2813 category: 'global',
2814 description: (0,external_wp_i18n_namespaceObject.__)('Navigate to the previous part of the editor.'),
2815 keyCombination: {
2816 modifier: 'ctrlShift',
2817 character: '`'
2818 },
2819 aliases: [{
2820 modifier: 'access',
2821 character: 'p'
2822 }]
2823 });
2824 }, [registerShortcut]);
2825 return null;
2826 }
2827
2828 KeyboardShortcuts.Register = KeyboardShortcutsRegister;
2829 /* harmony default export */ var keyboard_shortcuts = (KeyboardShortcuts);
2830
2831 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/hooks/use-last-selected-widget-area.js
2832 /**
2833 * WordPress dependencies
2834 */
2835
2836
2837
2838 /**
2839 * Internal dependencies
2840 */
2841
2842
2843
2844 /**
2845 * A react hook that returns the client id of the last widget area to have
2846 * been selected, or to have a selected block within it.
2847 *
2848 * @return {string} clientId of the widget area last selected.
2849 */
2850
2851 const useLastSelectedWidgetArea = () => (0,external_wp_data_namespaceObject.useSelect)(select => {
2852 var _widgetAreasPost$bloc;
2853
2854 const {
2855 getBlockSelectionEnd,
2856 getBlockName
2857 } = select(external_wp_blockEditor_namespaceObject.store);
2858 const selectionEndClientId = getBlockSelectionEnd(); // If the selected block is a widget area, return its clientId.
2859
2860 if (getBlockName(selectionEndClientId) === 'core/widget-area') {
2861 return selectionEndClientId;
2862 }
2863
2864 const {
2865 getParentWidgetAreaBlock
2866 } = select(store_store);
2867 const widgetAreaBlock = getParentWidgetAreaBlock(selectionEndClientId);
2868 const widgetAreaBlockClientId = widgetAreaBlock === null || widgetAreaBlock === void 0 ? void 0 : widgetAreaBlock.clientId;
2869
2870 if (widgetAreaBlockClientId) {
2871 return widgetAreaBlockClientId;
2872 } // If no widget area has been selected, return the clientId of the first
2873 // area.
2874
2875
2876 const {
2877 getEntityRecord
2878 } = select(external_wp_coreData_namespaceObject.store);
2879 const widgetAreasPost = getEntityRecord(KIND, POST_TYPE, buildWidgetAreasPostId());
2880 return widgetAreasPost === null || widgetAreasPost === void 0 ? void 0 : (_widgetAreasPost$bloc = widgetAreasPost.blocks[0]) === null || _widgetAreasPost$bloc === void 0 ? void 0 : _widgetAreasPost$bloc.clientId;
2881 }, []);
2882
2883 /* harmony default export */ var use_last_selected_widget_area = (useLastSelectedWidgetArea);
2884
2885 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/constants.js
2886 const ALLOW_REUSABLE_BLOCKS = false;
2887 const ENABLE_EXPERIMENTAL_FSE_BLOCKS = false;
2888
2889 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/components/widget-areas-block-editor-provider/index.js
2890
2891
2892
2893 /**
2894 * External dependencies
2895 */
2896
2897 /**
2898 * WordPress dependencies
2899 */
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909 /**
2910 * Internal dependencies
2911 */
2912
2913
2914
2915
2916
2917
2918
2919 function WidgetAreasBlockEditorProvider(_ref) {
2920 let {
2921 blockEditorSettings,
2922 children,
2923 ...props
2924 } = _ref;
2925 const {
2926 hasUploadPermissions,
2927 reusableBlocks,
2928 isFixedToolbarActive,
2929 keepCaretInsideBlock
2930 } = (0,external_wp_data_namespaceObject.useSelect)(select => ({
2931 hasUploadPermissions: (0,external_lodash_namespaceObject.defaultTo)(select(external_wp_coreData_namespaceObject.store).canUser('create', 'media'), true),
2932 widgetAreas: select(store_store).getWidgetAreas(),
2933 widgets: select(store_store).getWidgets(),
2934 reusableBlocks: ALLOW_REUSABLE_BLOCKS ? select(external_wp_coreData_namespaceObject.store).getEntityRecords('postType', 'wp_block') : [],
2935 isFixedToolbarActive: !!select(external_wp_preferences_namespaceObject.store).get('core/edit-widgets', 'fixedToolbar'),
2936 keepCaretInsideBlock: !!select(external_wp_preferences_namespaceObject.store).get('core/edit-widgets', 'keepCaretInsideBlock')
2937 }), []);
2938 const {
2939 setIsInserterOpened
2940 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store);
2941 const settings = (0,external_wp_element_namespaceObject.useMemo)(() => {
2942 let mediaUploadBlockEditor;
2943
2944 if (hasUploadPermissions) {
2945 mediaUploadBlockEditor = _ref2 => {
2946 let {
2947 onError,
2948 ...argumentsObject
2949 } = _ref2;
2950 (0,external_wp_mediaUtils_namespaceObject.uploadMedia)({
2951 wpAllowedMimeTypes: blockEditorSettings.allowedMimeTypes,
2952 onError: _ref3 => {
2953 let {
2954 message
2955 } = _ref3;
2956 return onError(message);
2957 },
2958 ...argumentsObject
2959 });
2960 };
2961 }
2962
2963 return { ...blockEditorSettings,
2964 __experimentalReusableBlocks: reusableBlocks,
2965 hasFixedToolbar: isFixedToolbarActive,
2966 keepCaretInsideBlock,
2967 mediaUpload: mediaUploadBlockEditor,
2968 templateLock: 'all',
2969 __experimentalSetIsInserterOpened: setIsInserterOpened
2970 };
2971 }, [blockEditorSettings, isFixedToolbarActive, keepCaretInsideBlock, hasUploadPermissions, reusableBlocks, setIsInserterOpened]);
2972 const widgetAreaId = use_last_selected_widget_area();
2973 const [blocks, onInput, onChange] = (0,external_wp_coreData_namespaceObject.useEntityBlockEditor)(KIND, POST_TYPE, {
2974 id: buildWidgetAreasPostId()
2975 });
2976 return (0,external_wp_element_namespaceObject.createElement)(external_wp_keyboardShortcuts_namespaceObject.ShortcutProvider, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.BlockEditorKeyboardShortcuts.Register, null), (0,external_wp_element_namespaceObject.createElement)(keyboard_shortcuts.Register, null), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.SlotFillProvider, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.BlockEditorProvider, _extends({
2977 value: blocks,
2978 onInput: onInput,
2979 onChange: onChange,
2980 settings: settings,
2981 useSubRegistry: false
2982 }, props), (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.CopyHandler, null, children), (0,external_wp_element_namespaceObject.createElement)(external_wp_reusableBlocks_namespaceObject.ReusableBlocksMenuItems, {
2983 rootClientId: widgetAreaId
2984 }))));
2985 }
2986
2987 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/cog.js
2988
2989
2990 /**
2991 * WordPress dependencies
2992 */
2993
2994 const cog = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
2995 xmlns: "http://www.w3.org/2000/svg",
2996 viewBox: "0 0 24 24"
2997 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
2998 fillRule: "evenodd",
2999 d: "M10.289 4.836A1 1 0 0111.275 4h1.306a1 1 0 01.987.836l.244 1.466c.787.26 1.503.679 2.108 1.218l1.393-.522a1 1 0 011.216.437l.653 1.13a1 1 0 01-.23 1.273l-1.148.944a6.025 6.025 0 010 2.435l1.149.946a1 1 0 01.23 1.272l-.653 1.13a1 1 0 01-1.216.437l-1.394-.522c-.605.54-1.32.958-2.108 1.218l-.244 1.466a1 1 0 01-.987.836h-1.306a1 1 0 01-.986-.836l-.244-1.466a5.995 5.995 0 01-2.108-1.218l-1.394.522a1 1 0 01-1.217-.436l-.653-1.131a1 1 0 01.23-1.272l1.149-.946a6.026 6.026 0 010-2.435l-1.148-.944a1 1 0 01-.23-1.272l.653-1.131a1 1 0 011.217-.437l1.393.522a5.994 5.994 0 012.108-1.218l.244-1.466zM14.929 12a3 3 0 11-6 0 3 3 0 016 0z",
3000 clipRule: "evenodd"
3001 }));
3002 /* harmony default export */ var library_cog = (cog);
3003
3004 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/block-default.js
3005
3006
3007 /**
3008 * WordPress dependencies
3009 */
3010
3011 const blockDefault = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
3012 xmlns: "http://www.w3.org/2000/svg",
3013 viewBox: "0 0 24 24"
3014 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
3015 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"
3016 }));
3017 /* harmony default export */ var block_default = (blockDefault);
3018
3019 ;// CONCATENATED MODULE: external ["wp","url"]
3020 var external_wp_url_namespaceObject = window["wp"]["url"];
3021 ;// CONCATENATED MODULE: external ["wp","dom"]
3022 var external_wp_dom_namespaceObject = window["wp"]["dom"];
3023 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/components/sidebar/widget-areas.js
3024
3025
3026 /**
3027 * WordPress dependencies
3028 */
3029
3030
3031
3032
3033
3034
3035
3036
3037 /**
3038 * Internal dependencies
3039 */
3040
3041
3042 function WidgetAreas(_ref) {
3043 let {
3044 selectedWidgetAreaId
3045 } = _ref;
3046 const widgetAreas = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getWidgetAreas(), []);
3047 const selectedWidgetArea = (0,external_wp_element_namespaceObject.useMemo)(() => selectedWidgetAreaId && (widgetAreas === null || widgetAreas === void 0 ? void 0 : widgetAreas.find(widgetArea => widgetArea.id === selectedWidgetAreaId)), [selectedWidgetAreaId, widgetAreas]);
3048 let description;
3049
3050 if (!selectedWidgetArea) {
3051 description = (0,external_wp_i18n_namespaceObject.__)('Widget Areas are global parts in your site’s layout that can accept blocks. These vary by theme, but are typically parts like your Sidebar or Footer.');
3052 } else if (selectedWidgetAreaId === 'wp_inactive_widgets') {
3053 description = (0,external_wp_i18n_namespaceObject.__)('Blocks in this Widget Area will not be displayed in your site.');
3054 } else {
3055 description = selectedWidgetArea.description;
3056 }
3057
3058 return (0,external_wp_element_namespaceObject.createElement)("div", {
3059 className: "edit-widgets-widget-areas"
3060 }, (0,external_wp_element_namespaceObject.createElement)("div", {
3061 className: "edit-widgets-widget-areas__top-container"
3062 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.BlockIcon, {
3063 icon: block_default
3064 }), (0,external_wp_element_namespaceObject.createElement)("div", null, (0,external_wp_element_namespaceObject.createElement)("p", {
3065 // Use `dangerouslySetInnerHTML` to keep backwards
3066 // compatibility. Basic markup in the description is an
3067 // established feature of WordPress.
3068 // @see https://github.com/WordPress/gutenberg/issues/33106
3069 dangerouslySetInnerHTML: {
3070 __html: (0,external_wp_dom_namespaceObject.safeHTML)(description)
3071 }
3072 }), (widgetAreas === null || widgetAreas === void 0 ? void 0 : widgetAreas.length) === 0 && (0,external_wp_element_namespaceObject.createElement)("p", null, (0,external_wp_i18n_namespaceObject.__)('Your theme does not contain any Widget Areas.')), !selectedWidgetArea && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
3073 href: (0,external_wp_url_namespaceObject.addQueryArgs)('customize.php', {
3074 'autofocus[panel]': 'widgets',
3075 return: window.location.pathname
3076 }),
3077 variant: "tertiary"
3078 }, (0,external_wp_i18n_namespaceObject.__)('Manage with live preview')))));
3079 }
3080
3081 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/components/sidebar/index.js
3082
3083
3084 /**
3085 * External dependencies
3086 */
3087
3088 /**
3089 * WordPress dependencies
3090 */
3091
3092
3093
3094
3095
3096
3097
3098
3099 const SIDEBAR_ACTIVE_BY_DEFAULT = external_wp_element_namespaceObject.Platform.select({
3100 web: true,
3101 native: false
3102 });
3103 const BLOCK_INSPECTOR_IDENTIFIER = 'edit-widgets/block-inspector'; // Widget areas were one called block areas, so use 'edit-widgets/block-areas'
3104 // for backwards compatibility.
3105
3106 const WIDGET_AREAS_IDENTIFIER = 'edit-widgets/block-areas';
3107 /**
3108 * Internal dependencies
3109 */
3110
3111
3112
3113
3114 function ComplementaryAreaTab(_ref) {
3115 let {
3116 identifier,
3117 label,
3118 isActive
3119 } = _ref;
3120 const {
3121 enableComplementaryArea
3122 } = (0,external_wp_data_namespaceObject.useDispatch)(store);
3123 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
3124 onClick: () => enableComplementaryArea(store_store.name, identifier),
3125 className: classnames_default()('edit-widgets-sidebar__panel-tab', {
3126 'is-active': isActive
3127 }),
3128 "aria-label": isActive ? // translators: %s: sidebar label e.g: "Widget Areas".
3129 (0,external_wp_i18n_namespaceObject.sprintf)((0,external_wp_i18n_namespaceObject.__)('%s (selected)'), label) : label,
3130 "data-label": label
3131 }, label);
3132 }
3133
3134 function Sidebar() {
3135 const {
3136 enableComplementaryArea
3137 } = (0,external_wp_data_namespaceObject.useDispatch)(store);
3138 const {
3139 currentArea,
3140 hasSelectedNonAreaBlock,
3141 isGeneralSidebarOpen,
3142 selectedWidgetAreaBlock
3143 } = (0,external_wp_data_namespaceObject.useSelect)(select => {
3144 const {
3145 getSelectedBlock,
3146 getBlock,
3147 getBlockParentsByBlockName
3148 } = select(external_wp_blockEditor_namespaceObject.store);
3149 const {
3150 getActiveComplementaryArea
3151 } = select(store);
3152 const selectedBlock = getSelectedBlock();
3153 const activeArea = getActiveComplementaryArea(store_store.name);
3154 let currentSelection = activeArea;
3155
3156 if (!currentSelection) {
3157 if (selectedBlock) {
3158 currentSelection = BLOCK_INSPECTOR_IDENTIFIER;
3159 } else {
3160 currentSelection = WIDGET_AREAS_IDENTIFIER;
3161 }
3162 }
3163
3164 let widgetAreaBlock;
3165
3166 if (selectedBlock) {
3167 if (selectedBlock.name === 'core/widget-area') {
3168 widgetAreaBlock = selectedBlock;
3169 } else {
3170 widgetAreaBlock = getBlock(getBlockParentsByBlockName(selectedBlock.clientId, 'core/widget-area')[0]);
3171 }
3172 }
3173
3174 return {
3175 currentArea: currentSelection,
3176 hasSelectedNonAreaBlock: !!(selectedBlock && selectedBlock.name !== 'core/widget-area'),
3177 isGeneralSidebarOpen: !!activeArea,
3178 selectedWidgetAreaBlock: widgetAreaBlock
3179 };
3180 }, []); // currentArea, and isGeneralSidebarOpen are intentionally left out from the dependencies,
3181 // because we want to run the effect when a block is selected/unselected and not when the sidebar state changes.
3182
3183 (0,external_wp_element_namespaceObject.useEffect)(() => {
3184 if (hasSelectedNonAreaBlock && currentArea === WIDGET_AREAS_IDENTIFIER && isGeneralSidebarOpen) {
3185 enableComplementaryArea('core/edit-widgets', BLOCK_INSPECTOR_IDENTIFIER);
3186 }
3187
3188 if (!hasSelectedNonAreaBlock && currentArea === BLOCK_INSPECTOR_IDENTIFIER && isGeneralSidebarOpen) {
3189 enableComplementaryArea('core/edit-widgets', WIDGET_AREAS_IDENTIFIER);
3190 }
3191 }, [hasSelectedNonAreaBlock, enableComplementaryArea]);
3192 return (0,external_wp_element_namespaceObject.createElement)(complementary_area, {
3193 className: "edit-widgets-sidebar",
3194 header: (0,external_wp_element_namespaceObject.createElement)("ul", null, (0,external_wp_element_namespaceObject.createElement)("li", null, (0,external_wp_element_namespaceObject.createElement)(ComplementaryAreaTab, {
3195 identifier: WIDGET_AREAS_IDENTIFIER,
3196 label: selectedWidgetAreaBlock ? selectedWidgetAreaBlock.attributes.name : (0,external_wp_i18n_namespaceObject.__)('Widget Areas'),
3197 isActive: currentArea === WIDGET_AREAS_IDENTIFIER
3198 })), (0,external_wp_element_namespaceObject.createElement)("li", null, (0,external_wp_element_namespaceObject.createElement)(ComplementaryAreaTab, {
3199 identifier: BLOCK_INSPECTOR_IDENTIFIER,
3200 label: (0,external_wp_i18n_namespaceObject.__)('Block'),
3201 isActive: currentArea === BLOCK_INSPECTOR_IDENTIFIER
3202 }))),
3203 headerClassName: "edit-widgets-sidebar__panel-tabs"
3204 /* translators: button label text should, if possible, be under 16 characters. */
3205 ,
3206 title: (0,external_wp_i18n_namespaceObject.__)('Settings'),
3207 closeLabel: (0,external_wp_i18n_namespaceObject.__)('Close settings'),
3208 scope: "core/edit-widgets",
3209 identifier: currentArea,
3210 icon: library_cog,
3211 isActiveByDefault: SIDEBAR_ACTIVE_BY_DEFAULT
3212 }, currentArea === WIDGET_AREAS_IDENTIFIER && (0,external_wp_element_namespaceObject.createElement)(WidgetAreas, {
3213 selectedWidgetAreaId: selectedWidgetAreaBlock === null || selectedWidgetAreaBlock === void 0 ? void 0 : selectedWidgetAreaBlock.attributes.id
3214 }), currentArea === BLOCK_INSPECTOR_IDENTIFIER && (hasSelectedNonAreaBlock ? (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.BlockInspector, null) : // Pretend that Widget Areas are part of the UI by not
3215 // showing the Block Inspector when one is selected.
3216 (0,external_wp_element_namespaceObject.createElement)("span", {
3217 className: "block-editor-block-inspector__no-blocks"
3218 }, (0,external_wp_i18n_namespaceObject.__)('No block selected.'))));
3219 }
3220
3221 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/plus.js
3222
3223
3224 /**
3225 * WordPress dependencies
3226 */
3227
3228 const plus = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
3229 xmlns: "http://www.w3.org/2000/svg",
3230 viewBox: "0 0 24 24"
3231 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
3232 d: "M18 11.2h-5.2V6h-1.6v5.2H6v1.6h5.2V18h1.6v-5.2H18z"
3233 }));
3234 /* harmony default export */ var library_plus = (plus);
3235
3236 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/list-view.js
3237
3238
3239 /**
3240 * WordPress dependencies
3241 */
3242
3243 const listView = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
3244 viewBox: "0 0 24 24",
3245 xmlns: "http://www.w3.org/2000/svg"
3246 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
3247 d: "M13.8 5.2H3v1.5h10.8V5.2zm-3.6 12v1.5H21v-1.5H10.2zm7.2-6H6.6v1.5h10.8v-1.5z"
3248 }));
3249 /* harmony default export */ var list_view = (listView);
3250
3251 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/components/save-button/index.js
3252
3253
3254 /**
3255 * WordPress dependencies
3256 */
3257
3258
3259
3260 /**
3261 * Internal dependencies
3262 */
3263
3264
3265
3266 function SaveButton() {
3267 const {
3268 hasEditedWidgetAreaIds,
3269 isSaving
3270 } = (0,external_wp_data_namespaceObject.useSelect)(select => {
3271 var _getEditedWidgetAreas;
3272
3273 const {
3274 getEditedWidgetAreas,
3275 isSavingWidgetAreas
3276 } = select(store_store);
3277 return {
3278 hasEditedWidgetAreaIds: ((_getEditedWidgetAreas = getEditedWidgetAreas()) === null || _getEditedWidgetAreas === void 0 ? void 0 : _getEditedWidgetAreas.length) > 0,
3279 isSaving: isSavingWidgetAreas()
3280 };
3281 }, []);
3282 const {
3283 saveEditedWidgetAreas
3284 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store);
3285 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
3286 variant: "primary",
3287 isBusy: isSaving,
3288 "aria-disabled": isSaving,
3289 onClick: isSaving ? undefined : saveEditedWidgetAreas,
3290 disabled: !hasEditedWidgetAreaIds
3291 }, isSaving ? (0,external_wp_i18n_namespaceObject.__)('Saving…') : (0,external_wp_i18n_namespaceObject.__)('Update'));
3292 }
3293
3294 /* harmony default export */ var save_button = (SaveButton);
3295
3296 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/undo.js
3297
3298
3299 /**
3300 * WordPress dependencies
3301 */
3302
3303 const undo = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
3304 xmlns: "http://www.w3.org/2000/svg",
3305 viewBox: "0 0 24 24"
3306 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
3307 d: "M18.3 11.7c-.6-.6-1.4-.9-2.3-.9H6.7l2.9-3.3-1.1-1-4.5 5L8.5 16l1-1-2.7-2.7H16c.5 0 .9.2 1.3.5 1 1 1 3.4 1 4.5v.3h1.5v-.2c0-1.5 0-4.3-1.5-5.7z"
3308 }));
3309 /* harmony default export */ var library_undo = (undo);
3310
3311 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/redo.js
3312
3313
3314 /**
3315 * WordPress dependencies
3316 */
3317
3318 const redo = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
3319 xmlns: "http://www.w3.org/2000/svg",
3320 viewBox: "0 0 24 24"
3321 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
3322 d: "M15.6 6.5l-1.1 1 2.9 3.3H8c-.9 0-1.7.3-2.3.9-1.4 1.5-1.4 4.2-1.4 5.6v.2h1.5v-.3c0-1.1 0-3.5 1-4.5.3-.3.7-.5 1.3-.5h9.2L14.5 15l1.1 1.1 4.6-4.6-4.6-5z"
3323 }));
3324 /* harmony default export */ var library_redo = (redo);
3325
3326 ;// CONCATENATED MODULE: external ["wp","keycodes"]
3327 var external_wp_keycodes_namespaceObject = window["wp"]["keycodes"];
3328 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/components/header/undo-redo/undo.js
3329
3330
3331 /**
3332 * WordPress dependencies
3333 */
3334
3335
3336
3337
3338
3339
3340 function UndoButton() {
3341 const hasUndo = (0,external_wp_data_namespaceObject.useSelect)(select => select(external_wp_coreData_namespaceObject.store).hasUndo(), []);
3342 const {
3343 undo
3344 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store);
3345 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarButton, {
3346 icon: !(0,external_wp_i18n_namespaceObject.isRTL)() ? library_undo : library_redo,
3347 label: (0,external_wp_i18n_namespaceObject.__)('Undo'),
3348 shortcut: external_wp_keycodes_namespaceObject.displayShortcut.primary('z') // If there are no undo levels we don't want to actually disable this
3349 // button, because it will remove focus for keyboard users.
3350 // See: https://github.com/WordPress/gutenberg/issues/3486
3351 ,
3352 "aria-disabled": !hasUndo,
3353 onClick: hasUndo ? undo : undefined
3354 });
3355 }
3356
3357 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/components/header/undo-redo/redo.js
3358
3359
3360 /**
3361 * WordPress dependencies
3362 */
3363
3364
3365
3366
3367
3368
3369 function RedoButton() {
3370 const hasRedo = (0,external_wp_data_namespaceObject.useSelect)(select => select(external_wp_coreData_namespaceObject.store).hasRedo(), []);
3371 const {
3372 redo
3373 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store);
3374 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarButton, {
3375 icon: !(0,external_wp_i18n_namespaceObject.isRTL)() ? library_redo : library_undo,
3376 label: (0,external_wp_i18n_namespaceObject.__)('Redo'),
3377 shortcut: external_wp_keycodes_namespaceObject.displayShortcut.primaryShift('z') // If there are no undo levels we don't want to actually disable this
3378 // button, because it will remove focus for keyboard users.
3379 // See: https://github.com/WordPress/gutenberg/issues/3486
3380 ,
3381 "aria-disabled": !hasRedo,
3382 onClick: hasRedo ? redo : undefined
3383 });
3384 }
3385
3386 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/external.js
3387
3388
3389 /**
3390 * WordPress dependencies
3391 */
3392
3393 const external = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
3394 xmlns: "http://www.w3.org/2000/svg",
3395 viewBox: "0 0 24 24"
3396 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
3397 d: "M18.2 17c0 .7-.6 1.2-1.2 1.2H7c-.7 0-1.2-.6-1.2-1.2V7c0-.7.6-1.2 1.2-1.2h3.2V4.2H7C5.5 4.2 4.2 5.5 4.2 7v10c0 1.5 1.2 2.8 2.8 2.8h10c1.5 0 2.8-1.2 2.8-2.8v-3.6h-1.5V17zM14.9 3v1.5h3.7l-6.4 6.4 1.1 1.1 6.4-6.4v3.7h1.5V3h-6.3z"
3398 }));
3399 /* harmony default export */ var library_external = (external);
3400
3401 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/components/keyboard-shortcut-help-modal/config.js
3402 /**
3403 * WordPress dependencies
3404 */
3405
3406 const textFormattingShortcuts = [{
3407 keyCombination: {
3408 modifier: 'primary',
3409 character: 'b'
3410 },
3411 description: (0,external_wp_i18n_namespaceObject.__)('Make the selected text bold.')
3412 }, {
3413 keyCombination: {
3414 modifier: 'primary',
3415 character: 'i'
3416 },
3417 description: (0,external_wp_i18n_namespaceObject.__)('Make the selected text italic.')
3418 }, {
3419 keyCombination: {
3420 modifier: 'primary',
3421 character: 'k'
3422 },
3423 description: (0,external_wp_i18n_namespaceObject.__)('Convert the selected text into a link.')
3424 }, {
3425 keyCombination: {
3426 modifier: 'primaryShift',
3427 character: 'k'
3428 },
3429 description: (0,external_wp_i18n_namespaceObject.__)('Remove a link.')
3430 }, {
3431 keyCombination: {
3432 modifier: 'primary',
3433 character: 'u'
3434 },
3435 description: (0,external_wp_i18n_namespaceObject.__)('Underline the selected text.')
3436 }];
3437
3438 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/components/keyboard-shortcut-help-modal/shortcut.js
3439
3440
3441 /**
3442 * External dependencies
3443 */
3444
3445 /**
3446 * WordPress dependencies
3447 */
3448
3449
3450
3451
3452 function KeyCombination(_ref) {
3453 let {
3454 keyCombination,
3455 forceAriaLabel
3456 } = _ref;
3457 const shortcut = keyCombination.modifier ? external_wp_keycodes_namespaceObject.displayShortcutList[keyCombination.modifier](keyCombination.character) : keyCombination.character;
3458 const ariaLabel = keyCombination.modifier ? external_wp_keycodes_namespaceObject.shortcutAriaLabel[keyCombination.modifier](keyCombination.character) : keyCombination.character;
3459 return (0,external_wp_element_namespaceObject.createElement)("kbd", {
3460 className: "edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination",
3461 "aria-label": forceAriaLabel || ariaLabel
3462 }, (0,external_lodash_namespaceObject.castArray)(shortcut).map((character, index) => {
3463 if (character === '+') {
3464 return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, {
3465 key: index
3466 }, character);
3467 }
3468
3469 return (0,external_wp_element_namespaceObject.createElement)("kbd", {
3470 key: index,
3471 className: "edit-widgets-keyboard-shortcut-help-modal__shortcut-key"
3472 }, character);
3473 }));
3474 }
3475
3476 function Shortcut(_ref2) {
3477 let {
3478 description,
3479 keyCombination,
3480 aliases = [],
3481 ariaLabel
3482 } = _ref2;
3483 return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)("div", {
3484 className: "edit-widgets-keyboard-shortcut-help-modal__shortcut-description"
3485 }, description), (0,external_wp_element_namespaceObject.createElement)("div", {
3486 className: "edit-widgets-keyboard-shortcut-help-modal__shortcut-term"
3487 }, (0,external_wp_element_namespaceObject.createElement)(KeyCombination, {
3488 keyCombination: keyCombination,
3489 forceAriaLabel: ariaLabel
3490 }), aliases.map((alias, index) => (0,external_wp_element_namespaceObject.createElement)(KeyCombination, {
3491 keyCombination: alias,
3492 forceAriaLabel: ariaLabel,
3493 key: index
3494 }))));
3495 }
3496
3497 /* harmony default export */ var keyboard_shortcut_help_modal_shortcut = (Shortcut);
3498
3499 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/components/keyboard-shortcut-help-modal/dynamic-shortcut.js
3500
3501
3502 /**
3503 * WordPress dependencies
3504 */
3505
3506
3507 /**
3508 * Internal dependencies
3509 */
3510
3511
3512
3513 function DynamicShortcut(_ref) {
3514 let {
3515 name
3516 } = _ref;
3517 const {
3518 keyCombination,
3519 description,
3520 aliases
3521 } = (0,external_wp_data_namespaceObject.useSelect)(select => {
3522 const {
3523 getShortcutKeyCombination,
3524 getShortcutDescription,
3525 getShortcutAliases
3526 } = select(external_wp_keyboardShortcuts_namespaceObject.store);
3527 return {
3528 keyCombination: getShortcutKeyCombination(name),
3529 aliases: getShortcutAliases(name),
3530 description: getShortcutDescription(name)
3531 };
3532 }, [name]);
3533
3534 if (!keyCombination) {
3535 return null;
3536 }
3537
3538 return (0,external_wp_element_namespaceObject.createElement)(keyboard_shortcut_help_modal_shortcut, {
3539 keyCombination: keyCombination,
3540 description: description,
3541 aliases: aliases
3542 });
3543 }
3544
3545 /* harmony default export */ var dynamic_shortcut = (DynamicShortcut);
3546
3547 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/components/keyboard-shortcut-help-modal/index.js
3548
3549
3550 /**
3551 * External dependencies
3552 */
3553
3554
3555 /**
3556 * WordPress dependencies
3557 */
3558
3559
3560
3561
3562
3563 /**
3564 * Internal dependencies
3565 */
3566
3567
3568
3569
3570
3571 const ShortcutList = _ref => {
3572 let {
3573 shortcuts
3574 } = _ref;
3575 return (
3576 /*
3577 * Disable reason: The `list` ARIA role is redundant but
3578 * Safari+VoiceOver won't announce the list otherwise.
3579 */
3580
3581 /* eslint-disable jsx-a11y/no-redundant-roles */
3582 (0,external_wp_element_namespaceObject.createElement)("ul", {
3583 className: "edit-widgets-keyboard-shortcut-help-modal__shortcut-list",
3584 role: "list"
3585 }, shortcuts.map((shortcut, index) => (0,external_wp_element_namespaceObject.createElement)("li", {
3586 className: "edit-widgets-keyboard-shortcut-help-modal__shortcut",
3587 key: index
3588 }, (0,external_lodash_namespaceObject.isString)(shortcut) ? (0,external_wp_element_namespaceObject.createElement)(dynamic_shortcut, {
3589 name: shortcut
3590 }) : (0,external_wp_element_namespaceObject.createElement)(keyboard_shortcut_help_modal_shortcut, shortcut))))
3591 /* eslint-enable jsx-a11y/no-redundant-roles */
3592
3593 );
3594 };
3595
3596 const ShortcutSection = _ref2 => {
3597 let {
3598 title,
3599 shortcuts,
3600 className
3601 } = _ref2;
3602 return (0,external_wp_element_namespaceObject.createElement)("section", {
3603 className: classnames_default()('edit-widgets-keyboard-shortcut-help-modal__section', className)
3604 }, !!title && (0,external_wp_element_namespaceObject.createElement)("h2", {
3605 className: "edit-widgets-keyboard-shortcut-help-modal__section-title"
3606 }, title), (0,external_wp_element_namespaceObject.createElement)(ShortcutList, {
3607 shortcuts: shortcuts
3608 }));
3609 };
3610
3611 const ShortcutCategorySection = _ref3 => {
3612 let {
3613 title,
3614 categoryName,
3615 additionalShortcuts = []
3616 } = _ref3;
3617 const categoryShortcuts = (0,external_wp_data_namespaceObject.useSelect)(select => {
3618 return select(external_wp_keyboardShortcuts_namespaceObject.store).getCategoryShortcuts(categoryName);
3619 }, [categoryName]);
3620 return (0,external_wp_element_namespaceObject.createElement)(ShortcutSection, {
3621 title: title,
3622 shortcuts: categoryShortcuts.concat(additionalShortcuts)
3623 });
3624 };
3625
3626 function KeyboardShortcutHelpModal(_ref4) {
3627 let {
3628 isModalActive,
3629 toggleModal
3630 } = _ref4;
3631 (0,external_wp_keyboardShortcuts_namespaceObject.useShortcut)('core/edit-widgets/keyboard-shortcuts', toggleModal, {
3632 bindGlobal: true
3633 });
3634
3635 if (!isModalActive) {
3636 return null;
3637 }
3638
3639 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Modal, {
3640 className: "edit-widgets-keyboard-shortcut-help-modal",
3641 title: (0,external_wp_i18n_namespaceObject.__)('Keyboard shortcuts'),
3642 closeLabel: (0,external_wp_i18n_namespaceObject.__)('Close'),
3643 onRequestClose: toggleModal
3644 }, (0,external_wp_element_namespaceObject.createElement)(ShortcutSection, {
3645 className: "edit-widgets-keyboard-shortcut-help-modal__main-shortcuts",
3646 shortcuts: ['core/edit-widgets/keyboard-shortcuts']
3647 }), (0,external_wp_element_namespaceObject.createElement)(ShortcutCategorySection, {
3648 title: (0,external_wp_i18n_namespaceObject.__)('Global shortcuts'),
3649 categoryName: "global"
3650 }), (0,external_wp_element_namespaceObject.createElement)(ShortcutCategorySection, {
3651 title: (0,external_wp_i18n_namespaceObject.__)('Selection shortcuts'),
3652 categoryName: "selection"
3653 }), (0,external_wp_element_namespaceObject.createElement)(ShortcutCategorySection, {
3654 title: (0,external_wp_i18n_namespaceObject.__)('Block shortcuts'),
3655 categoryName: "block",
3656 additionalShortcuts: [{
3657 keyCombination: {
3658 character: '/'
3659 },
3660 description: (0,external_wp_i18n_namespaceObject.__)('Change the block type after adding a new paragraph.'),
3661
3662 /* translators: The forward-slash character. e.g. '/'. */
3663 ariaLabel: (0,external_wp_i18n_namespaceObject.__)('Forward-slash')
3664 }]
3665 }), (0,external_wp_element_namespaceObject.createElement)(ShortcutSection, {
3666 title: (0,external_wp_i18n_namespaceObject.__)('Text formatting'),
3667 shortcuts: textFormattingShortcuts
3668 }));
3669 }
3670
3671 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/components/more-menu/tools-more-menu-group.js
3672
3673
3674 /**
3675 * External dependencies
3676 */
3677
3678 /**
3679 * WordPress dependencies
3680 */
3681
3682
3683 const {
3684 Fill: ToolsMoreMenuGroup,
3685 Slot
3686 } = (0,external_wp_components_namespaceObject.createSlotFill)('EditWidgetsToolsMoreMenuGroup');
3687
3688 ToolsMoreMenuGroup.Slot = _ref => {
3689 let {
3690 fillProps
3691 } = _ref;
3692 return (0,external_wp_element_namespaceObject.createElement)(Slot, {
3693 fillProps: fillProps
3694 }, fills => !(0,external_lodash_namespaceObject.isEmpty)(fills) && fills);
3695 };
3696
3697 /* harmony default export */ var tools_more_menu_group = (ToolsMoreMenuGroup);
3698
3699 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/components/more-menu/index.js
3700
3701
3702 /**
3703 * WordPress dependencies
3704 */
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714 /**
3715 * Internal dependencies
3716 */
3717
3718
3719
3720 function MoreMenu() {
3721 const [isKeyboardShortcutsModalActive, setIsKeyboardShortcutsModalVisible] = (0,external_wp_element_namespaceObject.useState)(false);
3722
3723 const toggleKeyboardShortcutsModal = () => setIsKeyboardShortcutsModalVisible(!isKeyboardShortcutsModalActive);
3724
3725 (0,external_wp_keyboardShortcuts_namespaceObject.useShortcut)('core/edit-widgets/keyboard-shortcuts', toggleKeyboardShortcutsModal);
3726 const isLargeViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium');
3727 return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(MoreMenuDropdown, null, onClose => (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, isLargeViewport && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuGroup, {
3728 label: (0,external_wp_i18n_namespaceObject._x)('View', 'noun')
3729 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_preferences_namespaceObject.PreferenceToggleMenuItem, {
3730 scope: "core/edit-widgets",
3731 name: "fixedToolbar",
3732 label: (0,external_wp_i18n_namespaceObject.__)('Top toolbar'),
3733 info: (0,external_wp_i18n_namespaceObject.__)('Access all block and document tools in a single place'),
3734 messageActivated: (0,external_wp_i18n_namespaceObject.__)('Top toolbar activated'),
3735 messageDeactivated: (0,external_wp_i18n_namespaceObject.__)('Top toolbar deactivated')
3736 })), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuGroup, {
3737 label: (0,external_wp_i18n_namespaceObject.__)('Tools')
3738 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
3739 onClick: () => {
3740 setIsKeyboardShortcutsModalVisible(true);
3741 },
3742 shortcut: external_wp_keycodes_namespaceObject.displayShortcut.access('h')
3743 }, (0,external_wp_i18n_namespaceObject.__)('Keyboard shortcuts')), (0,external_wp_element_namespaceObject.createElement)(external_wp_preferences_namespaceObject.PreferenceToggleMenuItem, {
3744 scope: "core/edit-widgets",
3745 name: "welcomeGuide",
3746 label: (0,external_wp_i18n_namespaceObject.__)('Welcome Guide')
3747 }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, {
3748 role: "menuitem",
3749 icon: library_external,
3750 href: (0,external_wp_i18n_namespaceObject.__)('https://wordpress.org/support/article/block-based-widgets-editor/'),
3751 target: "_blank",
3752 rel: "noopener noreferrer"
3753 }, (0,external_wp_i18n_namespaceObject.__)('Help'), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.VisuallyHidden, {
3754 as: "span"
3755 },
3756 /* translators: accessibility text */
3757 (0,external_wp_i18n_namespaceObject.__)('(opens in a new tab)'))), (0,external_wp_element_namespaceObject.createElement)(tools_more_menu_group.Slot, {
3758 fillProps: {
3759 onClose
3760 }
3761 })), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuGroup, {
3762 label: (0,external_wp_i18n_namespaceObject.__)('Preferences')
3763 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_preferences_namespaceObject.PreferenceToggleMenuItem, {
3764 scope: "core/edit-widgets",
3765 name: "keepCaretInsideBlock",
3766 label: (0,external_wp_i18n_namespaceObject.__)('Contain text cursor inside block'),
3767 info: (0,external_wp_i18n_namespaceObject.__)('Aids screen readers by stopping text caret from leaving blocks.'),
3768 messageActivated: (0,external_wp_i18n_namespaceObject.__)('Contain text cursor inside block activated'),
3769 messageDeactivated: (0,external_wp_i18n_namespaceObject.__)('Contain text cursor inside block deactivated')
3770 }), (0,external_wp_element_namespaceObject.createElement)(external_wp_preferences_namespaceObject.PreferenceToggleMenuItem, {
3771 scope: "core/edit-widgets",
3772 name: "themeStyles",
3773 info: (0,external_wp_i18n_namespaceObject.__)('Make the editor look like your theme.'),
3774 label: (0,external_wp_i18n_namespaceObject.__)('Use theme styles')
3775 }), isLargeViewport && (0,external_wp_element_namespaceObject.createElement)(external_wp_preferences_namespaceObject.PreferenceToggleMenuItem, {
3776 scope: "core/edit-widgets",
3777 name: "showBlockBreadcrumbs",
3778 label: (0,external_wp_i18n_namespaceObject.__)('Display block breadcrumbs'),
3779 info: (0,external_wp_i18n_namespaceObject.__)('Shows block breadcrumbs at the bottom of the editor.'),
3780 messageActivated: (0,external_wp_i18n_namespaceObject.__)('Display block breadcrumbs activated'),
3781 messageDeactivated: (0,external_wp_i18n_namespaceObject.__)('Display block breadcrumbs deactivated')
3782 })))), (0,external_wp_element_namespaceObject.createElement)(KeyboardShortcutHelpModal, {
3783 isModalActive: isKeyboardShortcutsModalActive,
3784 toggleModal: toggleKeyboardShortcutsModal
3785 }));
3786 }
3787
3788 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/components/header/index.js
3789
3790
3791 /**
3792 * WordPress dependencies
3793 */
3794
3795
3796
3797
3798
3799
3800
3801
3802 /**
3803 * Internal dependencies
3804 */
3805
3806
3807
3808
3809
3810
3811
3812
3813 function Header() {
3814 const isMediumViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium');
3815 const inserterButton = (0,external_wp_element_namespaceObject.useRef)();
3816 const widgetAreaClientId = use_last_selected_widget_area();
3817 const isLastSelectedWidgetAreaOpen = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getIsWidgetAreaOpen(widgetAreaClientId), [widgetAreaClientId]);
3818 const {
3819 isInserterOpen,
3820 isListViewOpen
3821 } = (0,external_wp_data_namespaceObject.useSelect)(select => {
3822 const {
3823 isInserterOpened,
3824 isListViewOpened
3825 } = select(store_store);
3826 return {
3827 isInserterOpen: isInserterOpened(),
3828 isListViewOpen: isListViewOpened()
3829 };
3830 }, []);
3831 const {
3832 setIsWidgetAreaOpen,
3833 setIsInserterOpened,
3834 setIsListViewOpened
3835 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store);
3836 const {
3837 selectBlock
3838 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_blockEditor_namespaceObject.store);
3839
3840 const handleClick = () => {
3841 if (isInserterOpen) {
3842 // Focusing the inserter button closes the inserter popover.
3843 setIsInserterOpened(false);
3844 } else {
3845 if (!isLastSelectedWidgetAreaOpen) {
3846 // Select the last selected block if hasn't already.
3847 selectBlock(widgetAreaClientId); // Open the last selected widget area when opening the inserter.
3848
3849 setIsWidgetAreaOpen(widgetAreaClientId, true);
3850 } // The DOM updates resulting from selectBlock() and setIsInserterOpened() calls are applied the
3851 // same tick and pretty much in a random order. The inserter is closed if any other part of the
3852 // app receives focus. If selectBlock() happens to take effect after setIsInserterOpened() then
3853 // the inserter is visible for a brief moment and then gets auto-closed due to focus moving to
3854 // the selected block.
3855
3856
3857 window.requestAnimationFrame(() => setIsInserterOpened(true));
3858 }
3859 };
3860
3861 const toggleListView = (0,external_wp_element_namespaceObject.useCallback)(() => setIsListViewOpened(!isListViewOpen), [setIsListViewOpened, isListViewOpen]);
3862 return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)("div", {
3863 className: "edit-widgets-header"
3864 }, (0,external_wp_element_namespaceObject.createElement)("div", {
3865 className: "edit-widgets-header__navigable-toolbar-wrapper"
3866 }, isMediumViewport && (0,external_wp_element_namespaceObject.createElement)("h1", {
3867 className: "edit-widgets-header__title"
3868 }, (0,external_wp_i18n_namespaceObject.__)('Widgets')), !isMediumViewport && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.VisuallyHidden, {
3869 as: "h1",
3870 className: "edit-widgets-header__title"
3871 }, (0,external_wp_i18n_namespaceObject.__)('Widgets')), (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.NavigableToolbar, {
3872 className: "edit-widgets-header-toolbar",
3873 "aria-label": (0,external_wp_i18n_namespaceObject.__)('Document tools')
3874 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarItem, {
3875 ref: inserterButton,
3876 as: external_wp_components_namespaceObject.Button,
3877 className: "edit-widgets-header-toolbar__inserter-toggle",
3878 variant: "primary",
3879 isPressed: isInserterOpen,
3880 onMouseDown: event => {
3881 event.preventDefault();
3882 },
3883 onClick: handleClick,
3884 icon: library_plus
3885 /* translators: button label text should, if possible, be under 16
3886 characters. */
3887 ,
3888 label: (0,external_wp_i18n_namespaceObject._x)('Toggle block inserter', 'Generic label for block inserter button')
3889 }), isMediumViewport && (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(UndoButton, null), (0,external_wp_element_namespaceObject.createElement)(RedoButton, null), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarItem, {
3890 as: external_wp_components_namespaceObject.Button,
3891 className: "edit-widgets-header-toolbar__list-view-toggle",
3892 icon: list_view,
3893 isPressed: isListViewOpen
3894 /* translators: button label text should, if possible, be under 16 characters. */
3895 ,
3896 label: (0,external_wp_i18n_namespaceObject.__)('List View'),
3897 onClick: toggleListView
3898 })))), (0,external_wp_element_namespaceObject.createElement)("div", {
3899 className: "edit-widgets-header__actions"
3900 }, (0,external_wp_element_namespaceObject.createElement)(save_button, null), (0,external_wp_element_namespaceObject.createElement)(pinned_items.Slot, {
3901 scope: "core/edit-widgets"
3902 }), (0,external_wp_element_namespaceObject.createElement)(MoreMenu, null))));
3903 }
3904
3905 /* harmony default export */ var header = (Header);
3906
3907 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/components/notices/index.js
3908
3909
3910 /**
3911 * External dependencies
3912 */
3913
3914 /**
3915 * WordPress dependencies
3916 */
3917
3918
3919
3920
3921
3922 function Notices() {
3923 const {
3924 removeNotice
3925 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store);
3926 const {
3927 notices
3928 } = (0,external_wp_data_namespaceObject.useSelect)(select => {
3929 return {
3930 notices: select(external_wp_notices_namespaceObject.store).getNotices()
3931 };
3932 }, []);
3933 const dismissibleNotices = (0,external_lodash_namespaceObject.filter)(notices, {
3934 isDismissible: true,
3935 type: 'default'
3936 });
3937 const nonDismissibleNotices = (0,external_lodash_namespaceObject.filter)(notices, {
3938 isDismissible: false,
3939 type: 'default'
3940 });
3941 const snackbarNotices = (0,external_lodash_namespaceObject.filter)(notices, {
3942 type: 'snackbar'
3943 });
3944 return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.NoticeList, {
3945 notices: nonDismissibleNotices,
3946 className: "edit-widgets-notices__pinned"
3947 }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.NoticeList, {
3948 notices: dismissibleNotices,
3949 className: "edit-widgets-notices__dismissible",
3950 onRemove: removeNotice
3951 }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.SnackbarList, {
3952 notices: snackbarNotices,
3953 className: "edit-widgets-notices__snackbar",
3954 onRemove: removeNotice
3955 }));
3956 }
3957
3958 /* harmony default export */ var notices = (Notices);
3959
3960 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/components/widget-areas-block-editor-content/index.js
3961
3962
3963 /**
3964 * WordPress dependencies
3965 */
3966
3967
3968
3969
3970 /**
3971 * Internal dependencies
3972 */
3973
3974
3975
3976 function WidgetAreasBlockEditorContent(_ref) {
3977 let {
3978 blockEditorSettings
3979 } = _ref;
3980 const hasThemeStyles = (0,external_wp_data_namespaceObject.useSelect)(select => !!select(external_wp_preferences_namespaceObject.store).get('core/edit-widgets', 'themeStyles'), []);
3981 const styles = (0,external_wp_element_namespaceObject.useMemo)(() => {
3982 return hasThemeStyles ? blockEditorSettings.styles : [];
3983 }, [blockEditorSettings, hasThemeStyles]);
3984 return (0,external_wp_element_namespaceObject.createElement)("div", {
3985 className: "edit-widgets-block-editor"
3986 }, (0,external_wp_element_namespaceObject.createElement)(notices, null), (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.BlockTools, null, (0,external_wp_element_namespaceObject.createElement)(keyboard_shortcuts, null), (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.__unstableEditorStyles, {
3987 styles: styles
3988 }), (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.BlockSelectionClearer, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.WritingFlow, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.ObserveTyping, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.BlockList, {
3989 className: "edit-widgets-main-block-list"
3990 }))))));
3991 }
3992
3993 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/close.js
3994
3995
3996 /**
3997 * WordPress dependencies
3998 */
3999
4000 const close_close = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
4001 xmlns: "http://www.w3.org/2000/svg",
4002 viewBox: "0 0 24 24"
4003 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
4004 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"
4005 }));
4006 /* harmony default export */ var library_close = (close_close);
4007
4008 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/hooks/use-widget-library-insertion-point.js
4009 /**
4010 * WordPress dependencies
4011 */
4012
4013
4014
4015 /**
4016 * Internal dependencies
4017 */
4018
4019
4020
4021
4022 const useWidgetLibraryInsertionPoint = () => {
4023 const firstRootId = (0,external_wp_data_namespaceObject.useSelect)(select => {
4024 var _widgetAreasPost$bloc;
4025
4026 // Default to the first widget area
4027 const {
4028 getEntityRecord
4029 } = select(external_wp_coreData_namespaceObject.store);
4030 const widgetAreasPost = getEntityRecord(KIND, POST_TYPE, buildWidgetAreasPostId());
4031 return widgetAreasPost === null || widgetAreasPost === void 0 ? void 0 : (_widgetAreasPost$bloc = widgetAreasPost.blocks[0]) === null || _widgetAreasPost$bloc === void 0 ? void 0 : _widgetAreasPost$bloc.clientId;
4032 }, []);
4033 return (0,external_wp_data_namespaceObject.useSelect)(select => {
4034 const {
4035 getBlockRootClientId,
4036 getBlockSelectionEnd,
4037 getBlockOrder,
4038 getBlockIndex
4039 } = select(external_wp_blockEditor_namespaceObject.store);
4040
4041 const insertionPoint = select(store_store).__experimentalGetInsertionPoint(); // "Browse all" in the quick inserter will set the rootClientId to the current block.
4042 // Otherwise, it will just be undefined, and we'll have to handle it differently below.
4043
4044
4045 if (insertionPoint.rootClientId) {
4046 return insertionPoint;
4047 }
4048
4049 const clientId = getBlockSelectionEnd() || firstRootId;
4050 const rootClientId = getBlockRootClientId(clientId); // If the selected block is at the root level, it's a widget area and
4051 // blocks can't be inserted here. Return this block as the root and the
4052 // last child clientId indicating insertion at the end.
4053
4054 if (clientId && rootClientId === '') {
4055 return {
4056 rootClientId: clientId,
4057 insertionIndex: getBlockOrder(clientId).length
4058 };
4059 }
4060
4061 return {
4062 rootClientId,
4063 insertionIndex: getBlockIndex(clientId) + 1
4064 };
4065 }, [firstRootId]);
4066 };
4067
4068 /* harmony default export */ var use_widget_library_insertion_point = (useWidgetLibraryInsertionPoint);
4069
4070 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/components/secondary-sidebar/inserter-sidebar.js
4071
4072
4073
4074 /**
4075 * WordPress dependencies
4076 */
4077
4078
4079
4080
4081
4082
4083
4084 /**
4085 * Internal dependencies
4086 */
4087
4088
4089
4090 function InserterSidebar() {
4091 const isMobileViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium', '<');
4092 const {
4093 rootClientId,
4094 insertionIndex
4095 } = use_widget_library_insertion_point();
4096 const {
4097 setIsInserterOpened
4098 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store);
4099 const closeInserter = (0,external_wp_element_namespaceObject.useCallback)(() => {
4100 return setIsInserterOpened(false);
4101 }, [setIsInserterOpened]);
4102 const TagName = !isMobileViewport ? external_wp_components_namespaceObject.VisuallyHidden : 'div';
4103 const [inserterDialogRef, inserterDialogProps] = (0,external_wp_compose_namespaceObject.__experimentalUseDialog)({
4104 onClose: closeInserter,
4105 focusOnMount: null
4106 });
4107 const libraryRef = (0,external_wp_element_namespaceObject.useRef)();
4108 (0,external_wp_element_namespaceObject.useEffect)(() => {
4109 libraryRef.current.focusSearch();
4110 }, []);
4111 return (0,external_wp_element_namespaceObject.createElement)("div", _extends({
4112 ref: inserterDialogRef
4113 }, inserterDialogProps, {
4114 className: "edit-widgets-layout__inserter-panel"
4115 }), (0,external_wp_element_namespaceObject.createElement)(TagName, {
4116 className: "edit-widgets-layout__inserter-panel-header"
4117 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
4118 icon: library_close,
4119 onClick: closeInserter,
4120 label: (0,external_wp_i18n_namespaceObject.__)('Close block inserter')
4121 })), (0,external_wp_element_namespaceObject.createElement)("div", {
4122 className: "edit-widgets-layout__inserter-panel-content"
4123 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.__experimentalLibrary, {
4124 showInserterHelpPanel: true,
4125 shouldFocusBlock: isMobileViewport,
4126 rootClientId: rootClientId,
4127 __experimentalInsertionIndex: insertionIndex,
4128 ref: libraryRef
4129 })));
4130 }
4131
4132 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/components/secondary-sidebar/list-view-sidebar.js
4133
4134
4135 /**
4136 * WordPress dependencies
4137 */
4138
4139
4140
4141
4142
4143
4144
4145 /**
4146 * Internal dependencies
4147 */
4148
4149
4150 function ListViewSidebar() {
4151 const {
4152 setIsListViewOpened
4153 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store);
4154 const focusOnMountRef = (0,external_wp_compose_namespaceObject.useFocusOnMount)('firstElement');
4155 const headerFocusReturnRef = (0,external_wp_compose_namespaceObject.useFocusReturn)();
4156 const contentFocusReturnRef = (0,external_wp_compose_namespaceObject.useFocusReturn)();
4157
4158 function closeOnEscape(event) {
4159 if (event.keyCode === external_wp_keycodes_namespaceObject.ESCAPE && !event.defaultPrevented) {
4160 event.preventDefault();
4161 setIsListViewOpened(false);
4162 }
4163 }
4164
4165 const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(ListViewSidebar);
4166 const labelId = `edit-widgets-editor__list-view-panel-label-${instanceId}`;
4167 return (// eslint-disable-next-line jsx-a11y/no-static-element-interactions
4168 (0,external_wp_element_namespaceObject.createElement)("div", {
4169 "aria-labelledby": labelId,
4170 className: "edit-widgets-editor__list-view-panel",
4171 onKeyDown: closeOnEscape
4172 }, (0,external_wp_element_namespaceObject.createElement)("div", {
4173 className: "edit-widgets-editor__list-view-panel-header",
4174 ref: headerFocusReturnRef
4175 }, (0,external_wp_element_namespaceObject.createElement)("strong", {
4176 id: labelId
4177 }, (0,external_wp_i18n_namespaceObject.__)('List View')), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
4178 icon: close_small,
4179 label: (0,external_wp_i18n_namespaceObject.__)('Close List View Sidebar'),
4180 onClick: () => setIsListViewOpened(false)
4181 })), (0,external_wp_element_namespaceObject.createElement)("div", {
4182 className: "edit-widgets-editor__list-view-panel-content",
4183 ref: (0,external_wp_compose_namespaceObject.useMergeRefs)([contentFocusReturnRef, focusOnMountRef])
4184 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.__experimentalListView, {
4185 showNestedBlocks: true,
4186 __experimentalHideContainerBlockActions: true,
4187 __experimentalFeatures: true,
4188 __experimentalPersistentListViewFeatures: true
4189 })))
4190 );
4191 }
4192
4193 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/components/secondary-sidebar/index.js
4194
4195
4196 /**
4197 * WordPress dependencies
4198 */
4199
4200 /**
4201 * Internal dependencies
4202 */
4203
4204
4205 /**
4206 * Internal dependencies
4207 */
4208
4209
4210
4211 function SecondarySidebar() {
4212 const {
4213 isInserterOpen,
4214 isListViewOpen
4215 } = (0,external_wp_data_namespaceObject.useSelect)(select => {
4216 const {
4217 isInserterOpened,
4218 isListViewOpened
4219 } = select(store_store);
4220 return {
4221 isInserterOpen: isInserterOpened(),
4222 isListViewOpen: isListViewOpened()
4223 };
4224 }, []);
4225
4226 if (isInserterOpen) {
4227 return (0,external_wp_element_namespaceObject.createElement)(InserterSidebar, null);
4228 }
4229
4230 if (isListViewOpen) {
4231 return (0,external_wp_element_namespaceObject.createElement)(ListViewSidebar, null);
4232 }
4233
4234 return null;
4235 }
4236
4237 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/components/layout/interface.js
4238
4239
4240 /**
4241 * WordPress dependencies
4242 */
4243
4244
4245
4246
4247
4248
4249
4250
4251 /**
4252 * Internal dependencies
4253 */
4254
4255
4256
4257
4258
4259 const interfaceLabels = {
4260 /* translators: accessibility text for the widgets screen top bar landmark region. */
4261 header: (0,external_wp_i18n_namespaceObject.__)('Widgets top bar'),
4262
4263 /* translators: accessibility text for the widgets screen content landmark region. */
4264 body: (0,external_wp_i18n_namespaceObject.__)('Widgets and blocks'),
4265
4266 /* translators: accessibility text for the widgets screen settings landmark region. */
4267 sidebar: (0,external_wp_i18n_namespaceObject.__)('Widgets settings'),
4268
4269 /* translators: accessibility text for the widgets screen footer landmark region. */
4270 footer: (0,external_wp_i18n_namespaceObject.__)('Widgets footer')
4271 };
4272
4273 function Interface(_ref) {
4274 let {
4275 blockEditorSettings
4276 } = _ref;
4277 const isMobileViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('medium', '<');
4278 const isHugeViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('huge', '>=');
4279 const {
4280 setIsInserterOpened,
4281 setIsListViewOpened,
4282 closeGeneralSidebar
4283 } = (0,external_wp_data_namespaceObject.useDispatch)(store_store);
4284 const {
4285 hasBlockBreadCrumbsEnabled,
4286 hasSidebarEnabled,
4287 isInserterOpened,
4288 isListViewOpened,
4289 previousShortcut,
4290 nextShortcut
4291 } = (0,external_wp_data_namespaceObject.useSelect)(select => ({
4292 hasSidebarEnabled: !!select(store).getActiveComplementaryArea(store_store.name),
4293 isInserterOpened: !!select(store_store).isInserterOpened(),
4294 isListViewOpened: !!select(store_store).isListViewOpened(),
4295 hasBlockBreadCrumbsEnabled: !!select(external_wp_preferences_namespaceObject.store).get('core/edit-widgets', 'showBlockBreadcrumbs'),
4296 previousShortcut: select(external_wp_keyboardShortcuts_namespaceObject.store).getAllShortcutKeyCombinations('core/edit-widgets/previous-region'),
4297 nextShortcut: select(external_wp_keyboardShortcuts_namespaceObject.store).getAllShortcutKeyCombinations('core/edit-widgets/next-region')
4298 }), []); // Inserter and Sidebars are mutually exclusive
4299
4300 (0,external_wp_element_namespaceObject.useEffect)(() => {
4301 if (hasSidebarEnabled && !isHugeViewport) {
4302 setIsInserterOpened(false);
4303 setIsListViewOpened(false);
4304 }
4305 }, [hasSidebarEnabled, isHugeViewport]);
4306 (0,external_wp_element_namespaceObject.useEffect)(() => {
4307 if ((isInserterOpened || isListViewOpened) && !isHugeViewport) {
4308 closeGeneralSidebar();
4309 }
4310 }, [isInserterOpened, isListViewOpened, isHugeViewport]);
4311 const secondarySidebarLabel = isListViewOpened ? (0,external_wp_i18n_namespaceObject.__)('List View') : (0,external_wp_i18n_namespaceObject.__)('Block Library');
4312 const hasSecondarySidebar = isListViewOpened || isInserterOpened;
4313 return (0,external_wp_element_namespaceObject.createElement)(interface_skeleton, {
4314 labels: { ...interfaceLabels,
4315 secondarySidebar: secondarySidebarLabel
4316 },
4317 header: (0,external_wp_element_namespaceObject.createElement)(header, null),
4318 secondarySidebar: hasSecondarySidebar && (0,external_wp_element_namespaceObject.createElement)(SecondarySidebar, null),
4319 sidebar: hasSidebarEnabled && (0,external_wp_element_namespaceObject.createElement)(complementary_area.Slot, {
4320 scope: "core/edit-widgets"
4321 }),
4322 content: (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(WidgetAreasBlockEditorContent, {
4323 blockEditorSettings: blockEditorSettings
4324 }), (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.BlockStyles.Slot, {
4325 scope: "core/block-inspector"
4326 })),
4327 footer: hasBlockBreadCrumbsEnabled && !isMobileViewport && (0,external_wp_element_namespaceObject.createElement)("div", {
4328 className: "edit-widgets-layout__footer"
4329 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.BlockBreadcrumb, {
4330 rootLabelText: (0,external_wp_i18n_namespaceObject.__)('Widgets')
4331 })),
4332 shortcuts: {
4333 previous: previousShortcut,
4334 next: nextShortcut
4335 }
4336 });
4337 }
4338
4339 /* harmony default export */ var layout_interface = (Interface);
4340
4341 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/components/layout/unsaved-changes-warning.js
4342 /**
4343 * WordPress dependencies
4344 */
4345
4346
4347
4348 /**
4349 * Internal dependencies
4350 */
4351
4352
4353 /**
4354 * Warns the user if there are unsaved changes before leaving the editor.
4355 *
4356 * This is a duplicate of the component implemented in the editor package.
4357 * Duplicated here as edit-widgets doesn't depend on editor.
4358 *
4359 * @return {WPComponent} The component.
4360 */
4361
4362 function UnsavedChangesWarning() {
4363 const isDirty = (0,external_wp_data_namespaceObject.useSelect)(select => {
4364 const {
4365 getEditedWidgetAreas
4366 } = select(store_store);
4367 const editedWidgetAreas = getEditedWidgetAreas();
4368 return (editedWidgetAreas === null || editedWidgetAreas === void 0 ? void 0 : editedWidgetAreas.length) > 0;
4369 }, []);
4370 (0,external_wp_element_namespaceObject.useEffect)(() => {
4371 /**
4372 * Warns the user if there are unsaved changes before leaving the editor.
4373 *
4374 * @param {Event} event `beforeunload` event.
4375 *
4376 * @return {?string} Warning prompt message, if unsaved changes exist.
4377 */
4378 const warnIfUnsavedChanges = event => {
4379 if (isDirty) {
4380 event.returnValue = (0,external_wp_i18n_namespaceObject.__)('You have unsaved changes. If you proceed, they will be lost.');
4381 return event.returnValue;
4382 }
4383 };
4384
4385 window.addEventListener('beforeunload', warnIfUnsavedChanges);
4386 return () => {
4387 window.removeEventListener('beforeunload', warnIfUnsavedChanges);
4388 };
4389 }, [isDirty]);
4390 return null;
4391 }
4392
4393 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/components/welcome-guide/index.js
4394
4395
4396 /**
4397 * WordPress dependencies
4398 */
4399
4400
4401
4402
4403
4404 /**
4405 * Internal dependencies
4406 */
4407
4408
4409 function WelcomeGuide() {
4410 var _widgetAreas$filter$l;
4411
4412 const isActive = (0,external_wp_data_namespaceObject.useSelect)(select => !!select(external_wp_preferences_namespaceObject.store).get('core/edit-widgets', 'welcomeGuide'), []);
4413 const {
4414 toggle
4415 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_preferences_namespaceObject.store);
4416 const widgetAreas = (0,external_wp_data_namespaceObject.useSelect)(select => select(store_store).getWidgetAreas({
4417 per_page: -1
4418 }), []);
4419
4420 if (!isActive) {
4421 return null;
4422 }
4423
4424 const isEntirelyBlockWidgets = widgetAreas === null || widgetAreas === void 0 ? void 0 : widgetAreas.every(widgetArea => widgetArea.id === 'wp_inactive_widgets' || widgetArea.widgets.every(widgetId => widgetId.startsWith('block-')));
4425 const numWidgetAreas = (_widgetAreas$filter$l = widgetAreas === null || widgetAreas === void 0 ? void 0 : widgetAreas.filter(widgetArea => widgetArea.id !== 'wp_inactive_widgets').length) !== null && _widgetAreas$filter$l !== void 0 ? _widgetAreas$filter$l : 0;
4426 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Guide, {
4427 className: "edit-widgets-welcome-guide",
4428 contentLabel: (0,external_wp_i18n_namespaceObject.__)('Welcome to block Widgets'),
4429 finishButtonText: (0,external_wp_i18n_namespaceObject.__)('Get started'),
4430 onFinish: () => toggle('core/edit-widgets', 'welcomeGuide'),
4431 pages: [{
4432 image: (0,external_wp_element_namespaceObject.createElement)(WelcomeGuideImage, {
4433 nonAnimatedSrc: "https://s.w.org/images/block-editor/welcome-canvas.svg",
4434 animatedSrc: "https://s.w.org/images/block-editor/welcome-canvas.gif"
4435 }),
4436 content: (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)("h1", {
4437 className: "edit-widgets-welcome-guide__heading"
4438 }, (0,external_wp_i18n_namespaceObject.__)('Welcome to block Widgets')), isEntirelyBlockWidgets ? (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)("p", {
4439 className: "edit-widgets-welcome-guide__text"
4440 }, (0,external_wp_i18n_namespaceObject.sprintf)( // Translators: %s: Number of block areas in the current theme.
4441 (0,external_wp_i18n_namespaceObject._n)('Your theme provides %s “block” area for you to add and edit content. Try adding a search bar, social icons, or other types of blocks here and see how they’ll look on your site.', 'Your theme provides %s different “block” areas for you to add and edit content. Try adding a search bar, social icons, or other types of blocks here and see how they’ll look on your site.', numWidgetAreas), numWidgetAreas))) : (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)("p", {
4442 className: "edit-widgets-welcome-guide__text"
4443 }, (0,external_wp_i18n_namespaceObject.__)('You can now add any block to your site’s widget areas. Don’t worry, all of your favorite widgets still work flawlessly.')), (0,external_wp_element_namespaceObject.createElement)("p", {
4444 className: "edit-widgets-welcome-guide__text"
4445 }, (0,external_wp_element_namespaceObject.createElement)("strong", null, (0,external_wp_i18n_namespaceObject.__)('Want to stick with the old widgets?')), ' ', (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ExternalLink, {
4446 href: (0,external_wp_i18n_namespaceObject.__)('https://wordpress.org/plugins/classic-widgets/')
4447 }, (0,external_wp_i18n_namespaceObject.__)('Get the Classic Widgets plugin.')))))
4448 }, {
4449 image: (0,external_wp_element_namespaceObject.createElement)(WelcomeGuideImage, {
4450 nonAnimatedSrc: "https://s.w.org/images/block-editor/welcome-editor.svg",
4451 animatedSrc: "https://s.w.org/images/block-editor/welcome-editor.gif"
4452 }),
4453 content: (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)("h1", {
4454 className: "edit-widgets-welcome-guide__heading"
4455 }, (0,external_wp_i18n_namespaceObject.__)('Make each block your own')), (0,external_wp_element_namespaceObject.createElement)("p", {
4456 className: "edit-widgets-welcome-guide__text"
4457 }, (0,external_wp_i18n_namespaceObject.__)('Each block comes with its own set of controls for changing things like color, width, and alignment. These will show and hide automatically when you have a block selected.')))
4458 }, {
4459 image: (0,external_wp_element_namespaceObject.createElement)(WelcomeGuideImage, {
4460 nonAnimatedSrc: "https://s.w.org/images/block-editor/welcome-library.svg",
4461 animatedSrc: "https://s.w.org/images/block-editor/welcome-library.gif"
4462 }),
4463 content: (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)("h1", {
4464 className: "edit-widgets-welcome-guide__heading"
4465 }, (0,external_wp_i18n_namespaceObject.__)('Get to know the block library')), (0,external_wp_element_namespaceObject.createElement)("p", {
4466 className: "edit-widgets-welcome-guide__text"
4467 }, (0,external_wp_element_namespaceObject.createInterpolateElement)((0,external_wp_i18n_namespaceObject.__)('All of the blocks available to you live in the block library. You’ll find it wherever you see the <InserterIconImage /> icon.'), {
4468 InserterIconImage: (0,external_wp_element_namespaceObject.createElement)("img", {
4469 className: "edit-widgets-welcome-guide__inserter-icon",
4470 alt: (0,external_wp_i18n_namespaceObject.__)('inserter'),
4471 src: "data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='18' height='18' rx='2' fill='%231E1E1E'/%3E%3Cpath d='M9.22727 4V14M4 8.77273H14' stroke='white' stroke-width='1.5'/%3E%3C/svg%3E%0A"
4472 })
4473 })))
4474 }, {
4475 image: (0,external_wp_element_namespaceObject.createElement)(WelcomeGuideImage, {
4476 nonAnimatedSrc: "https://s.w.org/images/block-editor/welcome-documentation.svg",
4477 animatedSrc: "https://s.w.org/images/block-editor/welcome-documentation.gif"
4478 }),
4479 content: (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)("h1", {
4480 className: "edit-widgets-welcome-guide__heading"
4481 }, (0,external_wp_i18n_namespaceObject.__)('Learn how to use the block editor')), (0,external_wp_element_namespaceObject.createElement)("p", {
4482 className: "edit-widgets-welcome-guide__text"
4483 }, (0,external_wp_i18n_namespaceObject.__)('New to the block editor? Want to learn more about using it? '), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ExternalLink, {
4484 href: (0,external_wp_i18n_namespaceObject.__)('https://wordpress.org/support/article/wordpress-editor/')
4485 }, (0,external_wp_i18n_namespaceObject.__)("Here's a detailed guide."))))
4486 }]
4487 });
4488 }
4489
4490 function WelcomeGuideImage(_ref) {
4491 let {
4492 nonAnimatedSrc,
4493 animatedSrc
4494 } = _ref;
4495 return (0,external_wp_element_namespaceObject.createElement)("picture", {
4496 className: "edit-widgets-welcome-guide__image"
4497 }, (0,external_wp_element_namespaceObject.createElement)("source", {
4498 srcSet: nonAnimatedSrc,
4499 media: "(prefers-reduced-motion: reduce)"
4500 }), (0,external_wp_element_namespaceObject.createElement)("img", {
4501 src: animatedSrc,
4502 width: "312",
4503 height: "240",
4504 alt: ""
4505 }));
4506 }
4507
4508 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/components/layout/index.js
4509
4510
4511 /**
4512 * WordPress dependencies
4513 */
4514
4515
4516
4517
4518
4519 /**
4520 * Internal dependencies
4521 */
4522
4523
4524
4525
4526
4527
4528
4529
4530 function Layout(_ref) {
4531 let {
4532 blockEditorSettings,
4533 onError
4534 } = _ref;
4535 const {
4536 createErrorNotice
4537 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store);
4538
4539 function onPluginAreaError(name) {
4540 createErrorNotice((0,external_wp_i18n_namespaceObject.sprintf)(
4541 /* translators: %s: plugin name */
4542 (0,external_wp_i18n_namespaceObject.__)('The "%s" plugin has encountered an error and cannot be rendered.'), name));
4543 }
4544
4545 return (0,external_wp_element_namespaceObject.createElement)(ErrorBoundary, {
4546 onError: onError
4547 }, (0,external_wp_element_namespaceObject.createElement)(WidgetAreasBlockEditorProvider, {
4548 blockEditorSettings: blockEditorSettings
4549 }, (0,external_wp_element_namespaceObject.createElement)(layout_interface, {
4550 blockEditorSettings: blockEditorSettings
4551 }), (0,external_wp_element_namespaceObject.createElement)(Sidebar, null), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Popover.Slot, null), (0,external_wp_element_namespaceObject.createElement)(external_wp_plugins_namespaceObject.PluginArea, {
4552 onError: onPluginAreaError
4553 }), (0,external_wp_element_namespaceObject.createElement)(UnsavedChangesWarning, null), (0,external_wp_element_namespaceObject.createElement)(WelcomeGuide, null)));
4554 }
4555
4556 /* harmony default export */ var layout = (Layout);
4557
4558 ;// CONCATENATED MODULE: ./packages/edit-widgets/build-module/index.js
4559
4560
4561 /**
4562 * WordPress dependencies
4563 */
4564
4565
4566
4567
4568
4569
4570
4571 /**
4572 * Internal dependencies
4573 */
4574
4575
4576
4577
4578
4579
4580 const disabledBlocks = ['core/more', 'core/freeform', 'core/template-part', ...(ALLOW_REUSABLE_BLOCKS ? [] : ['core/block'])];
4581 /**
4582 * Reinitializes the editor after the user chooses to reboot the editor after
4583 * an unhandled error occurs, replacing previously mounted editor element using
4584 * an initial state from prior to the crash.
4585 *
4586 * @param {Element} target DOM node in which editor is rendered.
4587 * @param {?Object} settings Editor settings object.
4588 */
4589
4590 function reinitializeEditor(target, settings) {
4591 (0,external_wp_element_namespaceObject.unmountComponentAtNode)(target);
4592 const reboot = reinitializeEditor.bind(null, target, settings);
4593 (0,external_wp_element_namespaceObject.render)((0,external_wp_element_namespaceObject.createElement)(layout, {
4594 blockEditorSettings: settings,
4595 onError: reboot
4596 }), target);
4597 }
4598 /**
4599 * Initializes the block editor in the widgets screen.
4600 *
4601 * @param {string} id ID of the root element to render the screen in.
4602 * @param {Object} settings Block editor settings.
4603 */
4604
4605 function initialize(id, settings) {
4606 const target = document.getElementById(id);
4607 const reboot = reinitializeEditor.bind(null, target, settings);
4608
4609 const coreBlocks = (0,external_wp_blockLibrary_namespaceObject.__experimentalGetCoreBlocks)().filter(block => {
4610 return !(disabledBlocks.includes(block.name) || block.name.startsWith('core/post') || block.name.startsWith('core/query') || block.name.startsWith('core/site') || block.name.startsWith('core/navigation'));
4611 });
4612
4613 (0,external_wp_data_namespaceObject.dispatch)(external_wp_preferences_namespaceObject.store).setDefaults('core/edit-widgets', {
4614 fixedToolbar: false,
4615 welcomeGuide: true,
4616 showBlockBreadcrumbs: true,
4617 themeStyles: true
4618 });
4619
4620 (0,external_wp_data_namespaceObject.dispatch)(external_wp_blocks_namespaceObject.store).__experimentalReapplyBlockTypeFilters();
4621
4622 (0,external_wp_blockLibrary_namespaceObject.registerCoreBlocks)(coreBlocks);
4623 (0,external_wp_widgets_namespaceObject.registerLegacyWidgetBlock)();
4624
4625 if (true) {
4626 (0,external_wp_blockLibrary_namespaceObject.__experimentalRegisterExperimentalCoreBlocks)({
4627 enableFSEBlocks: ENABLE_EXPERIMENTAL_FSE_BLOCKS
4628 });
4629 }
4630
4631 (0,external_wp_widgets_namespaceObject.registerLegacyWidgetVariations)(settings);
4632 registerBlock(widget_area_namespaceObject);
4633 (0,external_wp_widgets_namespaceObject.registerWidgetGroupBlock)();
4634
4635 settings.__experimentalFetchLinkSuggestions = (search, searchOptions) => (0,external_wp_coreData_namespaceObject.__experimentalFetchLinkSuggestions)(search, searchOptions, settings); // As we are unregistering `core/freeform` to avoid the Classic block, we must
4636 // replace it with something as the default freeform content handler. Failure to
4637 // do this will result in errors in the default block parser.
4638 // see: https://github.com/WordPress/gutenberg/issues/33097
4639
4640
4641 (0,external_wp_blocks_namespaceObject.setFreeformContentHandlerName)('core/html');
4642 (0,external_wp_element_namespaceObject.render)((0,external_wp_element_namespaceObject.createElement)(layout, {
4643 blockEditorSettings: settings,
4644 onError: reboot
4645 }), target);
4646 }
4647 /**
4648 * Function to register an individual block.
4649 *
4650 * @param {Object} block The block to be registered.
4651 *
4652 */
4653
4654 const registerBlock = block => {
4655 if (!block) {
4656 return;
4657 }
4658
4659 const {
4660 metadata,
4661 settings,
4662 name
4663 } = block;
4664
4665 if (metadata) {
4666 (0,external_wp_blocks_namespaceObject.unstable__bootstrapServerSideBlockDefinitions)({
4667 [name]: metadata
4668 });
4669 }
4670
4671 (0,external_wp_blocks_namespaceObject.registerBlockType)(name, settings);
4672 };
4673
4674 }();
4675 (window.wp = window.wp || {}).editWidgets = __webpack_exports__;
4676 /******/ })()
4677 ;