PluginProbe
Gutenberg / 13.9.0
Gutenberg v13.9.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 12.6.0 All 403 releases
gutenberg / build / widgets / index.js

index.js in Gutenberg 13.9.0, at build/widgets/index.js

1,840 lines 53.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /******/ (() => { // webpackBootstrap
2 /******/ var __webpack_modules__ = ({
3
4 /***/ 4403:
5 /***/ ((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 /******/ (() => {
97 /******/ // getDefaultExport function for compatibility with non-harmony modules
98 /******/ __webpack_require__.n = (module) => {
99 /******/ var getter = module && module.__esModule ?
100 /******/ () => (module['default']) :
101 /******/ () => (module);
102 /******/ __webpack_require__.d(getter, { a: getter });
103 /******/ return getter;
104 /******/ };
105 /******/ })();
106 /******/
107 /******/ /* webpack/runtime/define property getters */
108 /******/ (() => {
109 /******/ // define getter functions for harmony exports
110 /******/ __webpack_require__.d = (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 /******/ (() => {
121 /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
122 /******/ })();
123 /******/
124 /******/ /* webpack/runtime/make namespace object */
125 /******/ (() => {
126 /******/ // define __esModule on exports
127 /******/ __webpack_require__.r = (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 (() => {
139 "use strict";
140 // ESM COMPAT FLAG
141 __webpack_require__.r(__webpack_exports__);
142
143 // EXPORTS
144 __webpack_require__.d(__webpack_exports__, {
145 "MoveToWidgetArea": () => (/* reexport */ MoveToWidgetArea),
146 "addWidgetIdToBlock": () => (/* reexport */ addWidgetIdToBlock),
147 "getWidgetIdFromBlock": () => (/* reexport */ getWidgetIdFromBlock),
148 "registerLegacyWidgetBlock": () => (/* binding */ registerLegacyWidgetBlock),
149 "registerLegacyWidgetVariations": () => (/* reexport */ registerLegacyWidgetVariations),
150 "registerWidgetGroupBlock": () => (/* binding */ registerWidgetGroupBlock)
151 });
152
153 // NAMESPACE OBJECT: ./packages/widgets/build-module/blocks/legacy-widget/index.js
154 var legacy_widget_namespaceObject = {};
155 __webpack_require__.r(legacy_widget_namespaceObject);
156 __webpack_require__.d(legacy_widget_namespaceObject, {
157 "metadata": () => (metadata),
158 "name": () => (legacy_widget_name),
159 "settings": () => (settings)
160 });
161
162 // NAMESPACE OBJECT: ./packages/widgets/build-module/blocks/widget-group/index.js
163 var widget_group_namespaceObject = {};
164 __webpack_require__.r(widget_group_namespaceObject);
165 __webpack_require__.d(widget_group_namespaceObject, {
166 "metadata": () => (widget_group_metadata),
167 "name": () => (widget_group_name),
168 "settings": () => (widget_group_settings)
169 });
170
171 ;// CONCATENATED MODULE: external ["wp","blocks"]
172 const external_wp_blocks_namespaceObject = window["wp"]["blocks"];
173 ;// CONCATENATED MODULE: external ["wp","element"]
174 const external_wp_element_namespaceObject = window["wp"]["element"];
175 ;// CONCATENATED MODULE: external ["wp","primitives"]
176 const external_wp_primitives_namespaceObject = window["wp"]["primitives"];
177 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/widget.js
178
179
180 /**
181 * WordPress dependencies
182 */
183
184 const widget = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
185 xmlns: "http://www.w3.org/2000/svg",
186 viewBox: "0 0 24 24"
187 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
188 d: "M6 3H8V5H16V3H18V5C19.1046 5 20 5.89543 20 7V19C20 20.1046 19.1046 21 18 21H6C4.89543 21 4 20.1046 4 19V7C4 5.89543 4.89543 5 6 5V3ZM18 6.5H6C5.72386 6.5 5.5 6.72386 5.5 7V8H18.5V7C18.5 6.72386 18.2761 6.5 18 6.5ZM18.5 9.5H5.5V19C5.5 19.2761 5.72386 19.5 6 19.5H18C18.2761 19.5 18.5 19.2761 18.5 19V9.5ZM11 11H13V13H11V11ZM7 11V13H9V11H7ZM15 13V11H17V13H15Z"
189 }));
190 /* harmony default export */ const library_widget = (widget);
191
192 // EXTERNAL MODULE: ./node_modules/classnames/index.js
193 var classnames = __webpack_require__(4403);
194 var classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);
195 ;// CONCATENATED MODULE: external ["wp","blockEditor"]
196 const external_wp_blockEditor_namespaceObject = window["wp"]["blockEditor"];
197 ;// CONCATENATED MODULE: external ["wp","components"]
198 const external_wp_components_namespaceObject = window["wp"]["components"];
199 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/brush.js
200
201
202 /**
203 * WordPress dependencies
204 */
205
206 const brush = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
207 xmlns: "http://www.w3.org/2000/svg",
208 viewBox: "0 0 24 24"
209 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
210 d: "M4 20h8v-1.5H4V20zM18.9 3.5c-.6-.6-1.5-.6-2.1 0l-7.2 7.2c-.4-.1-.7 0-1.1.1-.5.2-1.5.7-1.9 2.2-.4 1.7-.8 2.2-1.1 2.7-.1.1-.2.3-.3.4l-.6 1.1H6c2 0 3.4-.4 4.7-1.4.8-.6 1.2-1.4 1.3-2.3 0-.3 0-.5-.1-.7L19 5.7c.5-.6.5-1.6-.1-2.2zM9.7 14.7c-.7.5-1.5.8-2.4 1 .2-.5.5-1.2.8-2.3.2-.6.4-1 .8-1.1.5-.1 1 .1 1.3.3.2.2.3.5.2.8 0 .3-.1.9-.7 1.3z"
211 }));
212 /* harmony default export */ const library_brush = (brush);
213
214 ;// CONCATENATED MODULE: external ["wp","i18n"]
215 const external_wp_i18n_namespaceObject = window["wp"]["i18n"];
216 ;// CONCATENATED MODULE: external ["wp","data"]
217 const external_wp_data_namespaceObject = window["wp"]["data"];
218 ;// CONCATENATED MODULE: external ["wp","coreData"]
219 const external_wp_coreData_namespaceObject = window["wp"]["coreData"];
220 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/legacy-widget/edit/widget-type-selector.js
221
222
223 /**
224 * WordPress dependencies
225 */
226
227
228
229
230
231 function WidgetTypeSelector(_ref) {
232 let {
233 selectedId,
234 onSelect
235 } = _ref;
236 const widgetTypes = (0,external_wp_data_namespaceObject.useSelect)(select => {
237 var _select$getSettings$w, _select$getSettings, _select$getWidgetType;
238
239 const hiddenIds = (_select$getSettings$w = (_select$getSettings = select(external_wp_blockEditor_namespaceObject.store).getSettings()) === null || _select$getSettings === void 0 ? void 0 : _select$getSettings.widgetTypesToHideFromLegacyWidgetBlock) !== null && _select$getSettings$w !== void 0 ? _select$getSettings$w : [];
240 return (_select$getWidgetType = select(external_wp_coreData_namespaceObject.store).getWidgetTypes({
241 per_page: -1
242 })) === null || _select$getWidgetType === void 0 ? void 0 : _select$getWidgetType.filter(widgetType => !hiddenIds.includes(widgetType.id));
243 }, []);
244
245 if (!widgetTypes) {
246 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Spinner, null);
247 }
248
249 if (widgetTypes.length === 0) {
250 return (0,external_wp_i18n_namespaceObject.__)('There are no widgets available.');
251 }
252
253 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.SelectControl, {
254 label: (0,external_wp_i18n_namespaceObject.__)('Select a legacy widget to display:'),
255 value: selectedId !== null && selectedId !== void 0 ? selectedId : '',
256 options: [{
257 value: '',
258 label: (0,external_wp_i18n_namespaceObject.__)('Select widget')
259 }, ...widgetTypes.map(widgetType => ({
260 value: widgetType.id,
261 label: widgetType.name
262 }))],
263 onChange: value => {
264 if (value) {
265 const selected = widgetTypes.find(widgetType => widgetType.id === value);
266 onSelect({
267 selectedId: selected.id,
268 isMulti: selected.is_multi
269 });
270 } else {
271 onSelect({
272 selectedId: null
273 });
274 }
275 }
276 });
277 }
278
279 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/legacy-widget/edit/inspector-card.js
280
281 function InspectorCard(_ref) {
282 let {
283 name,
284 description
285 } = _ref;
286 return (0,external_wp_element_namespaceObject.createElement)("div", {
287 className: "wp-block-legacy-widget-inspector-card"
288 }, (0,external_wp_element_namespaceObject.createElement)("h3", {
289 className: "wp-block-legacy-widget-inspector-card__name"
290 }, name), (0,external_wp_element_namespaceObject.createElement)("span", null, description));
291 }
292
293 ;// CONCATENATED MODULE: external ["wp","notices"]
294 const external_wp_notices_namespaceObject = window["wp"]["notices"];
295 ;// CONCATENATED MODULE: external ["wp","compose"]
296 const external_wp_compose_namespaceObject = window["wp"]["compose"];
297 ;// CONCATENATED MODULE: external "lodash"
298 const external_lodash_namespaceObject = window["lodash"];
299 ;// CONCATENATED MODULE: external ["wp","apiFetch"]
300 const external_wp_apiFetch_namespaceObject = window["wp"]["apiFetch"];
301 var external_wp_apiFetch_default = /*#__PURE__*/__webpack_require__.n(external_wp_apiFetch_namespaceObject);
302 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/legacy-widget/edit/control.js
303 /**
304 * External dependencies
305 */
306
307 /**
308 * WordPress dependencies
309 */
310
311
312
313 /**
314 * An API for creating and loading a widget control (a <div class="widget">
315 * element) that is compatible with most third party widget scripts. By not
316 * using React for this, we ensure that we have complete contorl over the DOM
317 * and do not accidentally remove any elements that a third party widget script
318 * has attached an event listener to.
319 *
320 * @property {Element} element The control's DOM element.
321 */
322
323 class Control {
324 /**
325 * Creates and loads a new control.
326 *
327 * @access public
328 * @param {Object} params
329 * @param {string} params.id
330 * @param {string} params.idBase
331 * @param {Object} params.instance
332 * @param {Function} params.onChangeInstance
333 * @param {Function} params.onChangeHasPreview
334 * @param {Function} params.onError
335 */
336 constructor(_ref) {
337 let {
338 id,
339 idBase,
340 instance,
341 onChangeInstance,
342 onChangeHasPreview,
343 onError
344 } = _ref;
345 this.id = id;
346 this.idBase = idBase;
347 this._instance = instance;
348 this._hasPreview = null;
349 this.onChangeInstance = onChangeInstance;
350 this.onChangeHasPreview = onChangeHasPreview;
351 this.onError = onError; // We can't use the real widget number as this is calculated by the
352 // server and we may not ever *actually* save this widget. Instead, use
353 // a fake but unique number.
354
355 this.number = ++lastNumber;
356 this.handleFormChange = (0,external_lodash_namespaceObject.debounce)(this.handleFormChange.bind(this), 200);
357 this.handleFormSubmit = this.handleFormSubmit.bind(this);
358 this.initDOM();
359 this.bindEvents();
360 this.loadContent();
361 }
362 /**
363 * Clean up the control so that it can be garabge collected.
364 *
365 * @access public
366 */
367
368
369 destroy() {
370 this.unbindEvents();
371 this.element.remove(); // TODO: How do we make third party widget scripts remove their event
372 // listeners?
373 }
374 /**
375 * Creates the control's DOM structure.
376 *
377 * @access private
378 */
379
380
381 initDOM() {
382 var _this$id, _this$idBase;
383
384 this.element = el('div', {
385 class: 'widget open'
386 }, [el('div', {
387 class: 'widget-inside'
388 }, [this.form = el('form', {
389 class: 'form',
390 method: 'post'
391 }, [// These hidden form inputs are what most widgets' scripts
392 // use to access data about the widget.
393 el('input', {
394 class: 'widget-id',
395 type: 'hidden',
396 name: 'widget-id',
397 value: (_this$id = this.id) !== null && _this$id !== void 0 ? _this$id : `${this.idBase}-${this.number}`
398 }), el('input', {
399 class: 'id_base',
400 type: 'hidden',
401 name: 'id_base',
402 value: (_this$idBase = this.idBase) !== null && _this$idBase !== void 0 ? _this$idBase : this.id
403 }), el('input', {
404 class: 'widget-width',
405 type: 'hidden',
406 name: 'widget-width',
407 value: '250'
408 }), el('input', {
409 class: 'widget-height',
410 type: 'hidden',
411 name: 'widget-height',
412 value: '200'
413 }), el('input', {
414 class: 'widget_number',
415 type: 'hidden',
416 name: 'widget_number',
417 value: this.idBase ? this.number.toString() : ''
418 }), this.content = el('div', {
419 class: 'widget-content'
420 }), // Non-multi widgets can be saved via a Save button.
421 this.id && el('button', {
422 class: 'button is-primary',
423 type: 'submit'
424 }, (0,external_wp_i18n_namespaceObject.__)('Save'))])])]);
425 }
426 /**
427 * Adds the control's event listeners.
428 *
429 * @access private
430 */
431
432
433 bindEvents() {
434 // Prefer jQuery 'change' event instead of the native 'change' event
435 // because many widgets use jQuery's event bus to trigger an update.
436 if (window.jQuery) {
437 const {
438 jQuery: $
439 } = window;
440 $(this.form).on('change', null, this.handleFormChange);
441 $(this.form).on('input', null, this.handleFormChange);
442 $(this.form).on('submit', this.handleFormSubmit);
443 } else {
444 this.form.addEventListener('change', this.handleFormChange);
445 this.form.addEventListener('input', this.handleFormChange);
446 this.form.addEventListener('submit', this.handleFormSubmit);
447 }
448 }
449 /**
450 * Removes the control's event listeners.
451 *
452 * @access private
453 */
454
455
456 unbindEvents() {
457 if (window.jQuery) {
458 const {
459 jQuery: $
460 } = window;
461 $(this.form).off('change', null, this.handleFormChange);
462 $(this.form).off('input', null, this.handleFormChange);
463 $(this.form).off('submit', this.handleFormSubmit);
464 } else {
465 this.form.removeEventListener('change', this.handleFormChange);
466 this.form.removeEventListener('input', this.handleFormChange);
467 this.form.removeEventListener('submit', this.handleFormSubmit);
468 }
469 }
470 /**
471 * Fetches the widget's form HTML from the REST API and loads it into the
472 * control's form.
473 *
474 * @access private
475 */
476
477
478 async loadContent() {
479 try {
480 if (this.id) {
481 const {
482 form
483 } = await saveWidget(this.id);
484 this.content.innerHTML = form;
485 } else if (this.idBase) {
486 const {
487 form,
488 preview
489 } = await encodeWidget({
490 idBase: this.idBase,
491 instance: this.instance,
492 number: this.number
493 });
494 this.content.innerHTML = form;
495 this.hasPreview = !isEmptyHTML(preview); // If we don't have an instance, perform a save right away. This
496 // happens when creating a new Legacy Widget block.
497
498 if (!this.instance.hash) {
499 const {
500 instance
501 } = await encodeWidget({
502 idBase: this.idBase,
503 instance: this.instance,
504 number: this.number,
505 formData: serializeForm(this.form)
506 });
507 this.instance = instance;
508 }
509 } // Trigger 'widget-added' when widget is ready. This event is what
510 // widgets' scripts use to initialize, attach events, etc. The event
511 // must be fired using jQuery's event bus as this is what widget
512 // scripts expect. If jQuery is not loaded, do nothing - some
513 // widgets will still work regardless.
514
515
516 if (window.jQuery) {
517 const {
518 jQuery: $
519 } = window;
520 $(document).trigger('widget-added', [$(this.element)]);
521 }
522 } catch (error) {
523 this.onError(error);
524 }
525 }
526 /**
527 * Perform a save when a multi widget's form is changed. Non-multi widgets
528 * are saved manually.
529 *
530 * @access private
531 */
532
533
534 handleFormChange() {
535 if (this.idBase) {
536 this.saveForm();
537 }
538 }
539 /**
540 * Perform a save when the control's form is manually submitted.
541 *
542 * @access private
543 * @param {Event} event
544 */
545
546
547 handleFormSubmit(event) {
548 event.preventDefault();
549 this.saveForm();
550 }
551 /**
552 * Serialize the control's form, send it to the REST API, and update the
553 * instance with the encoded instance that the REST API returns.
554 *
555 * @access private
556 */
557
558
559 async saveForm() {
560 const formData = serializeForm(this.form);
561
562 try {
563 if (this.id) {
564 const {
565 form
566 } = await saveWidget(this.id, formData);
567 this.content.innerHTML = form;
568
569 if (window.jQuery) {
570 const {
571 jQuery: $
572 } = window;
573 $(document).trigger('widget-updated', [$(this.element)]);
574 }
575 } else if (this.idBase) {
576 const {
577 instance,
578 preview
579 } = await encodeWidget({
580 idBase: this.idBase,
581 instance: this.instance,
582 number: this.number,
583 formData
584 });
585 this.instance = instance;
586 this.hasPreview = !isEmptyHTML(preview);
587 }
588 } catch (error) {
589 this.onError(error);
590 }
591 }
592 /**
593 * The widget's instance object.
594 *
595 * @access private
596 */
597
598
599 get instance() {
600 return this._instance;
601 }
602 /**
603 * The widget's instance object.
604 *
605 * @access private
606 */
607
608
609 set instance(instance) {
610 if (this._instance !== instance) {
611 this._instance = instance;
612 this.onChangeInstance(instance);
613 }
614 }
615 /**
616 * Whether or not the widget can be previewed.
617 *
618 * @access public
619 */
620
621
622 get hasPreview() {
623 return this._hasPreview;
624 }
625 /**
626 * Whether or not the widget can be previewed.
627 *
628 * @access private
629 */
630
631
632 set hasPreview(hasPreview) {
633 if (this._hasPreview !== hasPreview) {
634 this._hasPreview = hasPreview;
635 this.onChangeHasPreview(hasPreview);
636 }
637 }
638
639 }
640 let lastNumber = 0;
641
642 function el(tagName) {
643 let attributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
644 let content = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
645 const element = document.createElement(tagName);
646
647 for (const [attribute, value] of Object.entries(attributes)) {
648 element.setAttribute(attribute, value);
649 }
650
651 if (Array.isArray(content)) {
652 for (const child of content) {
653 if (child) {
654 element.appendChild(child);
655 }
656 }
657 } else if (typeof content === 'string') {
658 element.innerText = content;
659 }
660
661 return element;
662 }
663
664 async function saveWidget(id) {
665 let formData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
666 let widget;
667
668 if (formData) {
669 widget = await external_wp_apiFetch_default()({
670 path: `/wp/v2/widgets/${id}?context=edit`,
671 method: 'PUT',
672 data: {
673 form_data: formData
674 }
675 });
676 } else {
677 widget = await external_wp_apiFetch_default()({
678 path: `/wp/v2/widgets/${id}?context=edit`,
679 method: 'GET'
680 });
681 }
682
683 return {
684 form: widget.rendered_form
685 };
686 }
687
688 async function encodeWidget(_ref2) {
689 let {
690 idBase,
691 instance,
692 number,
693 formData = null
694 } = _ref2;
695 const response = await external_wp_apiFetch_default()({
696 path: `/wp/v2/widget-types/${idBase}/encode`,
697 method: 'POST',
698 data: {
699 instance,
700 number,
701 form_data: formData
702 }
703 });
704 return {
705 instance: response.instance,
706 form: response.form,
707 preview: response.preview
708 };
709 }
710
711 function isEmptyHTML(html) {
712 const element = document.createElement('div');
713 element.innerHTML = html;
714 return isEmptyNode(element);
715 }
716
717 function isEmptyNode(node) {
718 switch (node.nodeType) {
719 case node.TEXT_NODE:
720 // Text nodes are empty if it's entirely whitespace.
721 return node.nodeValue.trim() === '';
722
723 case node.ELEMENT_NODE:
724 // Elements that are "embedded content" are not empty.
725 // https://dev.w3.org/html5/spec-LC/content-models.html#embedded-content-0
726 if (['AUDIO', 'CANVAS', 'EMBED', 'IFRAME', 'IMG', 'MATH', 'OBJECT', 'SVG', 'VIDEO'].includes(node.tagName)) {
727 return false;
728 } // Elements with no children are empty.
729
730
731 if (!node.hasChildNodes()) {
732 return true;
733 } // Elements with children are empty if all their children are empty.
734
735
736 return Array.from(node.childNodes).every(isEmptyNode);
737
738 default:
739 return true;
740 }
741 }
742
743 function serializeForm(form) {
744 return new window.URLSearchParams(Array.from(new window.FormData(form))).toString();
745 }
746
747 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/legacy-widget/edit/form.js
748
749
750 /**
751 * External dependencies
752 */
753
754 /**
755 * WordPress dependencies
756 */
757
758
759
760
761
762
763
764 /**
765 * Internal dependencies
766 */
767
768
769 function Form(_ref) {
770 let {
771 title,
772 isVisible,
773 id,
774 idBase,
775 instance,
776 isWide,
777 onChangeInstance,
778 onChangeHasPreview
779 } = _ref;
780 const ref = (0,external_wp_element_namespaceObject.useRef)();
781 const isMediumLargeViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('small'); // We only want to remount the control when the instance changes
782 // *externally*. For example, if the user performs an undo. To do this, we
783 // keep track of changes made to instance by the control itself and then
784 // ignore those.
785
786 const outgoingInstances = (0,external_wp_element_namespaceObject.useRef)(new Set());
787 const incomingInstances = (0,external_wp_element_namespaceObject.useRef)(new Set());
788 const {
789 createNotice
790 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store);
791 (0,external_wp_element_namespaceObject.useEffect)(() => {
792 if (incomingInstances.current.has(instance)) {
793 incomingInstances.current.delete(instance);
794 return;
795 }
796
797 const control = new Control({
798 id,
799 idBase,
800 instance,
801
802 onChangeInstance(nextInstance) {
803 outgoingInstances.current.add(instance);
804 incomingInstances.current.add(nextInstance);
805 onChangeInstance(nextInstance);
806 },
807
808 onChangeHasPreview,
809
810 onError(error) {
811 window.console.error(error);
812 createNotice('error', (0,external_wp_i18n_namespaceObject.sprintf)(
813 /* translators: %s: the name of the affected block. */
814 (0,external_wp_i18n_namespaceObject.__)('The "%s" block was affected by errors and may not function properly. Check the developer tools for more details.'), idBase || id));
815 }
816
817 });
818 ref.current.appendChild(control.element);
819 return () => {
820 if (outgoingInstances.current.has(instance)) {
821 outgoingInstances.current.delete(instance);
822 return;
823 }
824
825 control.destroy();
826 };
827 }, [id, idBase, instance, onChangeInstance, onChangeHasPreview, isMediumLargeViewport]);
828
829 if (isWide && isMediumLargeViewport) {
830 return (0,external_wp_element_namespaceObject.createElement)("div", {
831 className: classnames_default()({
832 'wp-block-legacy-widget__container': isVisible
833 })
834 }, isVisible && (0,external_wp_element_namespaceObject.createElement)("h3", {
835 className: "wp-block-legacy-widget__edit-form-title"
836 }, title), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Popover, {
837 focusOnMount: false,
838 position: "middle right",
839 __unstableForcePosition: true
840 }, (0,external_wp_element_namespaceObject.createElement)("div", {
841 ref: ref,
842 className: "wp-block-legacy-widget__edit-form",
843 hidden: !isVisible
844 })));
845 }
846
847 return (0,external_wp_element_namespaceObject.createElement)("div", {
848 ref: ref,
849 className: "wp-block-legacy-widget__edit-form",
850 hidden: !isVisible
851 }, (0,external_wp_element_namespaceObject.createElement)("h3", {
852 className: "wp-block-legacy-widget__edit-form-title"
853 }, title));
854 }
855
856 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/legacy-widget/edit/preview.js
857
858
859 /**
860 * External dependencies
861 */
862
863 /**
864 * WordPress dependencies
865 */
866
867
868
869
870
871
872 function Preview(_ref) {
873 let {
874 idBase,
875 instance,
876 isVisible
877 } = _ref;
878 const [isLoaded, setIsLoaded] = (0,external_wp_element_namespaceObject.useState)(false);
879 const [srcDoc, setSrcDoc] = (0,external_wp_element_namespaceObject.useState)('');
880 (0,external_wp_element_namespaceObject.useEffect)(() => {
881 const abortController = typeof window.AbortController === 'undefined' ? undefined : new window.AbortController();
882
883 async function fetchPreviewHTML() {
884 const restRoute = `/wp/v2/widget-types/${idBase}/render`;
885 return await external_wp_apiFetch_default()({
886 path: restRoute,
887 method: 'POST',
888 signal: abortController === null || abortController === void 0 ? void 0 : abortController.signal,
889 data: instance ? {
890 instance
891 } : {}
892 });
893 }
894
895 fetchPreviewHTML().then(response => {
896 setSrcDoc(response.preview);
897 }).catch(error => {
898 if ('AbortError' === error.name) {
899 // We don't want to log aborted requests.
900 return;
901 }
902
903 throw error;
904 });
905 return () => abortController === null || abortController === void 0 ? void 0 : abortController.abort();
906 }, [idBase, instance]); // Resize the iframe on either the load event, or when the iframe becomes visible.
907
908 const ref = (0,external_wp_compose_namespaceObject.useRefEffect)(iframe => {
909 // Only set height if the iframe is loaded,
910 // or it will grow to an unexpected large height in Safari if it's hidden initially.
911 if (!isLoaded) {
912 return;
913 } // If the preview frame has another origin then this won't work.
914 // One possible solution is to add custom script to call `postMessage` in the preview frame.
915 // Or, better yet, we migrate away from iframe.
916
917
918 function setHeight() {
919 // Pick the maximum of these two values to account for margin collapsing.
920 const height = Math.max(iframe.contentDocument.documentElement.offsetHeight, iframe.contentDocument.body.offsetHeight);
921 iframe.style.height = `${height}px`;
922 }
923
924 const {
925 IntersectionObserver
926 } = iframe.ownerDocument.defaultView; // Observe for intersections that might cause a change in the height of
927 // the iframe, e.g. a Widget Area becoming expanded.
928
929 const intersectionObserver = new IntersectionObserver(_ref2 => {
930 let [entry] = _ref2;
931
932 if (entry.isIntersecting) {
933 setHeight();
934 }
935 }, {
936 threshold: 1
937 });
938 intersectionObserver.observe(iframe);
939 iframe.addEventListener('load', setHeight);
940 return () => {
941 intersectionObserver.disconnect();
942 iframe.removeEventListener('load', setHeight);
943 };
944 }, [isLoaded]);
945 return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, isVisible && !isLoaded && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Placeholder, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Spinner, null)), (0,external_wp_element_namespaceObject.createElement)("div", {
946 className: classnames_default()('wp-block-legacy-widget__edit-preview', {
947 'is-offscreen': !isVisible || !isLoaded
948 })
949 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Disabled, null, (0,external_wp_element_namespaceObject.createElement)("iframe", {
950 ref: ref,
951 className: "wp-block-legacy-widget__edit-preview-iframe",
952 tabIndex: "-1",
953 title: (0,external_wp_i18n_namespaceObject.__)('Legacy Widget Preview'),
954 srcDoc: srcDoc,
955 onLoad: event => {
956 // To hide the scrollbars of the preview frame for some edge cases,
957 // such as negative margins in the Gallery Legacy Widget.
958 // It can't be scrolled anyway.
959 // TODO: Ideally, this should be fixed in core.
960 event.target.contentDocument.body.style.overflow = 'hidden';
961 setIsLoaded(true);
962 },
963 height: 100
964 }))));
965 }
966
967 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/legacy-widget/edit/no-preview.js
968
969
970 /**
971 * WordPress dependencies
972 */
973
974 function NoPreview(_ref) {
975 let {
976 name
977 } = _ref;
978 return (0,external_wp_element_namespaceObject.createElement)("div", {
979 className: "wp-block-legacy-widget__edit-no-preview"
980 }, name && (0,external_wp_element_namespaceObject.createElement)("h3", null, name), (0,external_wp_element_namespaceObject.createElement)("p", null, (0,external_wp_i18n_namespaceObject.__)('No preview available.')));
981 }
982
983 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/legacy-widget/edit/convert-to-blocks-button.js
984
985
986 /**
987 * WordPress dependencies
988 */
989
990
991
992
993
994 function ConvertToBlocksButton(_ref) {
995 let {
996 clientId,
997 rawInstance
998 } = _ref;
999 const {
1000 replaceBlocks
1001 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_blockEditor_namespaceObject.store);
1002 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarButton, {
1003 onClick: () => {
1004 if (rawInstance.title) {
1005 replaceBlocks(clientId, [(0,external_wp_blocks_namespaceObject.createBlock)('core/heading', {
1006 content: rawInstance.title
1007 }), ...(0,external_wp_blocks_namespaceObject.rawHandler)({
1008 HTML: rawInstance.text
1009 })]);
1010 } else {
1011 replaceBlocks(clientId, (0,external_wp_blocks_namespaceObject.rawHandler)({
1012 HTML: rawInstance.text
1013 }));
1014 }
1015 }
1016 }, (0,external_wp_i18n_namespaceObject.__)('Convert to blocks'));
1017 }
1018
1019 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/legacy-widget/edit/index.js
1020
1021
1022 /**
1023 * External dependencies
1024 */
1025
1026 /**
1027 * WordPress dependencies
1028 */
1029
1030
1031
1032
1033
1034
1035
1036
1037 /**
1038 * Internal dependencies
1039 */
1040
1041
1042
1043
1044
1045
1046
1047 function Edit(props) {
1048 const {
1049 id,
1050 idBase
1051 } = props.attributes;
1052 const {
1053 isWide = false
1054 } = props;
1055 const blockProps = (0,external_wp_blockEditor_namespaceObject.useBlockProps)({
1056 className: classnames_default()({
1057 'is-wide-widget': isWide
1058 })
1059 });
1060 return (0,external_wp_element_namespaceObject.createElement)("div", blockProps, !id && !idBase ? (0,external_wp_element_namespaceObject.createElement)(Empty, props) : (0,external_wp_element_namespaceObject.createElement)(NotEmpty, props));
1061 }
1062
1063 function Empty(_ref) {
1064 let {
1065 attributes: {
1066 id,
1067 idBase
1068 },
1069 setAttributes
1070 } = _ref;
1071 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Placeholder, {
1072 icon: (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.BlockIcon, {
1073 icon: library_brush
1074 }),
1075 label: (0,external_wp_i18n_namespaceObject.__)('Legacy Widget')
1076 }, (0,external_wp_element_namespaceObject.createElement)(WidgetTypeSelector, {
1077 selectedId: id !== null && id !== void 0 ? id : idBase,
1078 onSelect: _ref2 => {
1079 let {
1080 selectedId,
1081 isMulti
1082 } = _ref2;
1083
1084 if (!selectedId) {
1085 setAttributes({
1086 id: null,
1087 idBase: null,
1088 instance: null
1089 });
1090 } else if (isMulti) {
1091 setAttributes({
1092 id: null,
1093 idBase: selectedId,
1094 instance: {}
1095 });
1096 } else {
1097 setAttributes({
1098 id: selectedId,
1099 idBase: null,
1100 instance: null
1101 });
1102 }
1103 }
1104 }));
1105 }
1106
1107 function NotEmpty(_ref3) {
1108 let {
1109 attributes: {
1110 id,
1111 idBase,
1112 instance
1113 },
1114 setAttributes,
1115 clientId,
1116 isSelected,
1117 isWide = false
1118 } = _ref3;
1119 const [hasPreview, setHasPreview] = (0,external_wp_element_namespaceObject.useState)(null);
1120 const widgetTypeId = id !== null && id !== void 0 ? id : idBase;
1121 const {
1122 record: widgetType,
1123 hasResolved: hasResolvedWidgetType
1124 } = (0,external_wp_coreData_namespaceObject.useEntityRecord)('root', 'widgetType', widgetTypeId);
1125 const isNavigationMode = (0,external_wp_data_namespaceObject.useSelect)(select => select(external_wp_blockEditor_namespaceObject.store).isNavigationMode(), []);
1126 const setInstance = (0,external_wp_element_namespaceObject.useCallback)(nextInstance => {
1127 setAttributes({
1128 instance: nextInstance
1129 });
1130 }, []);
1131
1132 if (!widgetType && hasResolvedWidgetType) {
1133 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Placeholder, {
1134 icon: (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.BlockIcon, {
1135 icon: library_brush
1136 }),
1137 label: (0,external_wp_i18n_namespaceObject.__)('Legacy Widget')
1138 }, (0,external_wp_i18n_namespaceObject.__)('Widget is missing.'));
1139 }
1140
1141 if (!hasResolvedWidgetType) {
1142 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Placeholder, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Spinner, null));
1143 }
1144
1145 const mode = idBase && (isNavigationMode || !isSelected) ? 'preview' : 'edit';
1146 return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, idBase === 'text' && (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.BlockControls, {
1147 group: "other"
1148 }, (0,external_wp_element_namespaceObject.createElement)(ConvertToBlocksButton, {
1149 clientId: clientId,
1150 rawInstance: instance.raw
1151 })), (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.InspectorControls, null, (0,external_wp_element_namespaceObject.createElement)(InspectorCard, {
1152 name: widgetType.name,
1153 description: widgetType.description
1154 })), (0,external_wp_element_namespaceObject.createElement)(Form, {
1155 title: widgetType.name,
1156 isVisible: mode === 'edit',
1157 id: id,
1158 idBase: idBase,
1159 instance: instance,
1160 isWide: isWide,
1161 onChangeInstance: setInstance,
1162 onChangeHasPreview: setHasPreview
1163 }), idBase && (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, hasPreview === null && mode === 'preview' && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Placeholder, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Spinner, null)), hasPreview === true && (0,external_wp_element_namespaceObject.createElement)(Preview, {
1164 idBase: idBase,
1165 instance: instance,
1166 isVisible: mode === 'preview'
1167 }), hasPreview === false && mode === 'preview' && (0,external_wp_element_namespaceObject.createElement)(NoPreview, {
1168 name: widgetType.name
1169 })));
1170 }
1171
1172 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/legacy-widget/transforms.js
1173 /**
1174 * WordPress dependencies
1175 */
1176
1177 const legacyWidgetTransforms = [{
1178 block: 'core/calendar',
1179 widget: 'calendar'
1180 }, {
1181 block: 'core/search',
1182 widget: 'search'
1183 }, {
1184 block: 'core/html',
1185 widget: 'custom_html',
1186 transform: _ref => {
1187 let {
1188 content
1189 } = _ref;
1190 return {
1191 content
1192 };
1193 }
1194 }, {
1195 block: 'core/archives',
1196 widget: 'archives',
1197 transform: _ref2 => {
1198 let {
1199 count,
1200 dropdown
1201 } = _ref2;
1202 return {
1203 displayAsDropdown: !!dropdown,
1204 showPostCounts: !!count
1205 };
1206 }
1207 }, {
1208 block: 'core/latest-posts',
1209 widget: 'recent-posts',
1210 transform: _ref3 => {
1211 let {
1212 show_date: displayPostDate,
1213 number
1214 } = _ref3;
1215 return {
1216 displayPostDate: !!displayPostDate,
1217 postsToShow: number
1218 };
1219 }
1220 }, {
1221 block: 'core/latest-comments',
1222 widget: 'recent-comments',
1223 transform: _ref4 => {
1224 let {
1225 number
1226 } = _ref4;
1227 return {
1228 commentsToShow: number
1229 };
1230 }
1231 }, {
1232 block: 'core/tag-cloud',
1233 widget: 'tag_cloud',
1234 transform: _ref5 => {
1235 let {
1236 taxonomy,
1237 count
1238 } = _ref5;
1239 return {
1240 showTagCounts: !!count,
1241 taxonomy
1242 };
1243 }
1244 }, {
1245 block: 'core/categories',
1246 widget: 'categories',
1247 transform: _ref6 => {
1248 let {
1249 count,
1250 dropdown,
1251 hierarchical
1252 } = _ref6;
1253 return {
1254 displayAsDropdown: !!dropdown,
1255 showPostCounts: !!count,
1256 showHierarchy: !!hierarchical
1257 };
1258 }
1259 }, {
1260 block: 'core/audio',
1261 widget: 'media_audio',
1262 transform: _ref7 => {
1263 let {
1264 url,
1265 preload,
1266 loop,
1267 attachment_id: id
1268 } = _ref7;
1269 return {
1270 src: url,
1271 id,
1272 preload,
1273 loop
1274 };
1275 }
1276 }, {
1277 block: 'core/video',
1278 widget: 'media_video',
1279 transform: _ref8 => {
1280 let {
1281 url,
1282 preload,
1283 loop,
1284 attachment_id: id
1285 } = _ref8;
1286 return {
1287 src: url,
1288 id,
1289 preload,
1290 loop
1291 };
1292 }
1293 }, {
1294 block: 'core/image',
1295 widget: 'media_image',
1296 transform: _ref9 => {
1297 let {
1298 alt,
1299 attachment_id: id,
1300 caption,
1301 height,
1302 link_classes: linkClass,
1303 link_rel: rel,
1304 link_target_blank: targetBlack,
1305 link_type: linkDestination,
1306 link_url: link,
1307 size: sizeSlug,
1308 url,
1309 width
1310 } = _ref9;
1311 return {
1312 alt,
1313 caption,
1314 height,
1315 id,
1316 link,
1317 linkClass,
1318 linkDestination,
1319 linkTarget: targetBlack ? '_blank' : undefined,
1320 rel,
1321 sizeSlug,
1322 url,
1323 width
1324 };
1325 }
1326 }, {
1327 block: 'core/gallery',
1328 widget: 'media_gallery',
1329 transform: _ref10 => {
1330 let {
1331 ids,
1332 link_type: linkTo,
1333 size,
1334 number
1335 } = _ref10;
1336 return {
1337 ids,
1338 columns: number,
1339 linkTo,
1340 sizeSlug: size,
1341 images: ids.map(id => ({
1342 id
1343 }))
1344 };
1345 }
1346 }, {
1347 block: 'core/rss',
1348 widget: 'rss',
1349 transform: _ref11 => {
1350 let {
1351 url,
1352 show_author: displayAuthor,
1353 show_date: displayDate,
1354 show_summary: displayExcerpt,
1355 items
1356 } = _ref11;
1357 return {
1358 feedURL: url,
1359 displayAuthor: !!displayAuthor,
1360 displayDate: !!displayDate,
1361 displayExcerpt: !!displayExcerpt,
1362 itemsToShow: items
1363 };
1364 }
1365 }].map(_ref12 => {
1366 let {
1367 block,
1368 widget,
1369 transform
1370 } = _ref12;
1371 return {
1372 type: 'block',
1373 blocks: [block],
1374 isMatch: _ref13 => {
1375 let {
1376 idBase,
1377 instance
1378 } = _ref13;
1379 return idBase === widget && !!(instance !== null && instance !== void 0 && instance.raw);
1380 },
1381 transform: _ref14 => {
1382 var _instance$raw;
1383
1384 let {
1385 instance
1386 } = _ref14;
1387 const transformedBlock = (0,external_wp_blocks_namespaceObject.createBlock)(block, transform ? transform(instance.raw) : undefined);
1388
1389 if (!((_instance$raw = instance.raw) !== null && _instance$raw !== void 0 && _instance$raw.title)) {
1390 return transformedBlock;
1391 }
1392
1393 return [(0,external_wp_blocks_namespaceObject.createBlock)('core/heading', {
1394 content: instance.raw.title
1395 }), transformedBlock];
1396 }
1397 };
1398 });
1399 const transforms = {
1400 to: legacyWidgetTransforms
1401 };
1402 /* harmony default export */ const legacy_widget_transforms = (transforms);
1403
1404 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/legacy-widget/index.js
1405 /**
1406 * WordPress dependencies
1407 */
1408
1409 /**
1410 * Internal dependencies
1411 */
1412
1413 const metadata = {
1414 apiVersion: 2,
1415 name: "core/legacy-widget",
1416 title: "Legacy Widget",
1417 category: "widgets",
1418 description: "Display a legacy widget.",
1419 textdomain: "default",
1420 attributes: {
1421 id: {
1422 type: "string",
1423 "default": null
1424 },
1425 idBase: {
1426 type: "string",
1427 "default": null
1428 },
1429 instance: {
1430 type: "object",
1431 "default": null
1432 }
1433 },
1434 supports: {
1435 html: false,
1436 customClassName: false,
1437 reusable: false
1438 },
1439 editorStyle: "wp-block-legacy-widget-editor"
1440 };
1441
1442
1443 const {
1444 name: legacy_widget_name
1445 } = metadata;
1446
1447 const settings = {
1448 icon: library_widget,
1449 edit: Edit,
1450 transforms: legacy_widget_transforms
1451 };
1452
1453 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/group.js
1454
1455
1456 /**
1457 * WordPress dependencies
1458 */
1459
1460 const group = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
1461 viewBox: "0 0 24 24",
1462 xmlns: "http://www.w3.org/2000/svg"
1463 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
1464 d: "M18 4h-7c-1.1 0-2 .9-2 2v3H6c-1.1 0-2 .9-2 2v7c0 1.1.9 2 2 2h7c1.1 0 2-.9 2-2v-3h3c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-4.5 14c0 .3-.2.5-.5.5H6c-.3 0-.5-.2-.5-.5v-7c0-.3.2-.5.5-.5h3V13c0 1.1.9 2 2 2h2.5v3zm0-4.5H11c-.3 0-.5-.2-.5-.5v-2.5H13c.3 0 .5.2.5.5v2.5zm5-.5c0 .3-.2.5-.5.5h-3V11c0-1.1-.9-2-2-2h-2.5V6c0-.3.2-.5.5-.5h7c.3 0 .5.2.5.5v7z"
1465 }));
1466 /* harmony default export */ const library_group = (group);
1467
1468 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/widget-group/edit.js
1469
1470
1471 /**
1472 * WordPress dependencies
1473 */
1474
1475
1476
1477
1478
1479 function edit_Edit(props) {
1480 const {
1481 clientId
1482 } = props;
1483 const {
1484 innerBlocks
1485 } = (0,external_wp_data_namespaceObject.useSelect)(select => select(external_wp_blockEditor_namespaceObject.store).getBlock(clientId), [clientId]);
1486 return (0,external_wp_element_namespaceObject.createElement)("div", (0,external_wp_blockEditor_namespaceObject.useBlockProps)({
1487 className: 'widget'
1488 }), innerBlocks.length === 0 ? (0,external_wp_element_namespaceObject.createElement)(PlaceholderContent, props) : (0,external_wp_element_namespaceObject.createElement)(PreviewContent, props));
1489 }
1490
1491 function PlaceholderContent(_ref) {
1492 let {
1493 clientId
1494 } = _ref;
1495 return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Placeholder, {
1496 className: "wp-block-widget-group__placeholder",
1497 icon: (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.BlockIcon, {
1498 icon: library_group
1499 }),
1500 label: (0,external_wp_i18n_namespaceObject.__)('Widget Group')
1501 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.ButtonBlockAppender, {
1502 rootClientId: clientId
1503 })), (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.InnerBlocks, {
1504 renderAppender: false
1505 }));
1506 }
1507
1508 function PreviewContent(_ref2) {
1509 var _attributes$title;
1510
1511 let {
1512 attributes,
1513 setAttributes
1514 } = _ref2;
1515 return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.RichText, {
1516 tagName: "h2",
1517 className: "widget-title",
1518 allowedFormats: [],
1519 placeholder: (0,external_wp_i18n_namespaceObject.__)('Title'),
1520 value: (_attributes$title = attributes.title) !== null && _attributes$title !== void 0 ? _attributes$title : '',
1521 onChange: title => setAttributes({
1522 title
1523 })
1524 }), (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.InnerBlocks, null));
1525 }
1526
1527 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/widget-group/save.js
1528
1529
1530 /**
1531 * WordPress dependencies
1532 */
1533
1534 function save(_ref) {
1535 let {
1536 attributes
1537 } = _ref;
1538 return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.RichText.Content, {
1539 tagName: "h2",
1540 className: "widget-title",
1541 value: attributes.title
1542 }), (0,external_wp_element_namespaceObject.createElement)("div", {
1543 className: "wp-widget-group__inner-blocks"
1544 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.InnerBlocks.Content, null)));
1545 }
1546
1547 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/widget-group/deprecated.js
1548
1549
1550 /**
1551 * WordPress dependencies
1552 */
1553
1554 const v1 = {
1555 attributes: {
1556 title: {
1557 type: 'string'
1558 }
1559 },
1560 supports: {
1561 html: false,
1562 inserter: true,
1563 customClassName: true,
1564 reusable: false
1565 },
1566
1567 save(_ref) {
1568 let {
1569 attributes
1570 } = _ref;
1571 return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.RichText.Content, {
1572 tagName: "h2",
1573 className: "widget-title",
1574 value: attributes.title
1575 }), (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.InnerBlocks.Content, null));
1576 }
1577
1578 };
1579 /* harmony default export */ const deprecated = ([v1]);
1580
1581 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/widget-group/index.js
1582 /**
1583 * WordPress dependencies
1584 */
1585
1586
1587
1588 /**
1589 * Internal dependencies
1590 */
1591
1592 const widget_group_metadata = {
1593 apiVersion: 2,
1594 name: "core/widget-group",
1595 category: "widgets",
1596 attributes: {
1597 title: {
1598 type: "string"
1599 }
1600 },
1601 supports: {
1602 html: false,
1603 inserter: true,
1604 customClassName: true,
1605 reusable: false
1606 },
1607 editorStyle: "wp-block-widget-group-editor",
1608 style: "wp-block-widget-group"
1609 };
1610
1611
1612
1613 const {
1614 name: widget_group_name
1615 } = widget_group_metadata;
1616
1617 const widget_group_settings = {
1618 title: (0,external_wp_i18n_namespaceObject.__)('Widget Group'),
1619 description: (0,external_wp_i18n_namespaceObject.__)('Create a classic widget layout with a title that’s styled by your theme for your widget areas.'),
1620 icon: library_group,
1621 __experimentalLabel: _ref => {
1622 let {
1623 name: label
1624 } = _ref;
1625 return label;
1626 },
1627 edit: edit_Edit,
1628 save: save,
1629 transforms: {
1630 from: [{
1631 type: 'block',
1632 isMultiBlock: true,
1633 blocks: ['*'],
1634
1635 isMatch(attributes, blocks) {
1636 // Avoid transforming existing `widget-group` blocks.
1637 return !blocks.some(block => block.name === 'core/widget-group');
1638 },
1639
1640 __experimentalConvert(blocks) {
1641 // Put the selected blocks inside the new Widget Group's innerBlocks.
1642 let innerBlocks = [...blocks.map(block => {
1643 return (0,external_wp_blocks_namespaceObject.createBlock)(block.name, block.attributes, block.innerBlocks);
1644 })]; // If the first block is a heading then assume this is intended
1645 // to be the Widget's "title".
1646
1647 const firstHeadingBlock = innerBlocks[0].name === 'core/heading' ? innerBlocks[0] : null; // Remove the first heading block as we're copying
1648 // it's content into the Widget Group's title attribute.
1649
1650 innerBlocks = innerBlocks.filter(block => block !== firstHeadingBlock);
1651 return (0,external_wp_blocks_namespaceObject.createBlock)('core/widget-group', { ...(firstHeadingBlock && {
1652 title: firstHeadingBlock.attributes.content
1653 })
1654 }, innerBlocks);
1655 }
1656
1657 }]
1658 },
1659 deprecated: deprecated
1660 };
1661
1662 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/move-to.js
1663
1664
1665 /**
1666 * WordPress dependencies
1667 */
1668
1669 const moveTo = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
1670 xmlns: "http://www.w3.org/2000/svg",
1671 viewBox: "0 0 24 24"
1672 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
1673 d: "M19.75 9c0-1.257-.565-2.197-1.39-2.858-.797-.64-1.827-1.017-2.815-1.247-1.802-.42-3.703-.403-4.383-.396L11 4.5V6l.177-.001c.696-.006 2.416-.02 4.028.356.887.207 1.67.518 2.216.957.52.416.829.945.829 1.688 0 .592-.167.966-.407 1.23-.255.281-.656.508-1.236.674-1.19.34-2.82.346-4.607.346h-.077c-1.692 0-3.527 0-4.942.404-.732.209-1.424.545-1.935 1.108-.526.579-.796 1.33-.796 2.238 0 1.257.565 2.197 1.39 2.858.797.64 1.827 1.017 2.815 1.247 1.802.42 3.703.403 4.383.396L13 19.5h.714V22L18 18.5 13.714 15v3H13l-.177.001c-.696.006-2.416.02-4.028-.356-.887-.207-1.67-.518-2.216-.957-.52-.416-.829-.945-.829-1.688 0-.592.167-.966.407-1.23.255-.281.656-.508 1.237-.674 1.189-.34 2.819-.346 4.606-.346h.077c1.692 0 3.527 0 4.941-.404.732-.209 1.425-.545 1.936-1.108.526-.579.796-1.33.796-2.238z"
1674 }));
1675 /* harmony default export */ const move_to = (moveTo);
1676
1677 ;// CONCATENATED MODULE: ./packages/widgets/build-module/components/move-to-widget-area/index.js
1678
1679
1680 /**
1681 * WordPress dependencies
1682 */
1683
1684
1685
1686 function MoveToWidgetArea(_ref) {
1687 let {
1688 currentWidgetAreaId,
1689 widgetAreas,
1690 onSelect
1691 } = _ref;
1692 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarGroup, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarItem, null, toggleProps => (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.DropdownMenu, {
1693 icon: move_to,
1694 label: (0,external_wp_i18n_namespaceObject.__)('Move to widget area'),
1695 toggleProps: toggleProps
1696 }, _ref2 => {
1697 let {
1698 onClose
1699 } = _ref2;
1700 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuGroup, {
1701 label: (0,external_wp_i18n_namespaceObject.__)('Move to')
1702 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItemsChoice, {
1703 choices: widgetAreas.map(widgetArea => ({
1704 value: widgetArea.id,
1705 label: widgetArea.name,
1706 info: widgetArea.description
1707 })),
1708 value: currentWidgetAreaId,
1709 onSelect: value => {
1710 onSelect(value);
1711 onClose();
1712 }
1713 }));
1714 })));
1715 }
1716
1717 ;// CONCATENATED MODULE: ./packages/widgets/build-module/components/index.js
1718
1719
1720 ;// CONCATENATED MODULE: ./packages/widgets/build-module/utils.js
1721 // @ts-check
1722
1723 /**
1724 * Get the internal widget id from block.
1725 *
1726 * @typedef {Object} Attributes
1727 * @property {string} __internalWidgetId The internal widget id.
1728 * @typedef {Object} Block
1729 * @property {Attributes} attributes The attributes of the block.
1730 *
1731 * @param {Block} block The block.
1732 * @return {string} The internal widget id.
1733 */
1734 function getWidgetIdFromBlock(block) {
1735 return block.attributes.__internalWidgetId;
1736 }
1737 /**
1738 * Add internal widget id to block's attributes.
1739 *
1740 * @param {Block} block The block.
1741 * @param {string} widgetId The widget id.
1742 * @return {Block} The updated block.
1743 */
1744
1745 function addWidgetIdToBlock(block, widgetId) {
1746 return { ...block,
1747 attributes: { ...(block.attributes || {}),
1748 __internalWidgetId: widgetId
1749 }
1750 };
1751 }
1752
1753 ;// CONCATENATED MODULE: ./packages/widgets/build-module/register-legacy-widget-variations.js
1754 /**
1755 * WordPress dependencies
1756 */
1757
1758
1759
1760 function registerLegacyWidgetVariations(settings) {
1761 const unsubscribe = (0,external_wp_data_namespaceObject.subscribe)(() => {
1762 var _settings$widgetTypes, _select$getWidgetType;
1763
1764 const hiddenIds = (_settings$widgetTypes = settings === null || settings === void 0 ? void 0 : settings.widgetTypesToHideFromLegacyWidgetBlock) !== null && _settings$widgetTypes !== void 0 ? _settings$widgetTypes : [];
1765 const widgetTypes = (_select$getWidgetType = (0,external_wp_data_namespaceObject.select)(external_wp_coreData_namespaceObject.store).getWidgetTypes({
1766 per_page: -1
1767 })) === null || _select$getWidgetType === void 0 ? void 0 : _select$getWidgetType.filter(widgetType => !hiddenIds.includes(widgetType.id));
1768
1769 if (widgetTypes) {
1770 unsubscribe();
1771 (0,external_wp_data_namespaceObject.dispatch)(external_wp_blocks_namespaceObject.store).addBlockVariations('core/legacy-widget', widgetTypes.map(widgetType => ({
1772 name: widgetType.id,
1773 title: widgetType.name,
1774 description: widgetType.description,
1775 attributes: widgetType.is_multi ? {
1776 idBase: widgetType.id,
1777 instance: {}
1778 } : {
1779 id: widgetType.id
1780 }
1781 })));
1782 }
1783 });
1784 }
1785
1786 ;// CONCATENATED MODULE: ./packages/widgets/build-module/index.js
1787 /**
1788 * WordPress dependencies
1789 */
1790
1791 /**
1792 * Internal dependencies
1793 */
1794
1795
1796
1797
1798
1799 /**
1800 * Registers the Legacy Widget block.
1801 *
1802 * Note that for the block to be useful, any scripts required by a widget must
1803 * be loaded into the page.
1804 *
1805 * @see https://developer.wordpress.org/block-editor/how-to-guides/widgets/legacy-widget-block/
1806 */
1807
1808 function registerLegacyWidgetBlock() {
1809 const {
1810 metadata,
1811 settings,
1812 name
1813 } = legacy_widget_namespaceObject;
1814 (0,external_wp_blocks_namespaceObject.registerBlockType)({
1815 name,
1816 ...metadata
1817 }, settings);
1818 }
1819 /**
1820 * Registers the Widget Group block.
1821 */
1822
1823 function registerWidgetGroupBlock() {
1824 const {
1825 metadata,
1826 settings,
1827 name
1828 } = widget_group_namespaceObject;
1829 (0,external_wp_blocks_namespaceObject.registerBlockType)({
1830 name,
1831 ...metadata
1832 }, settings);
1833 }
1834
1835
1836 })();
1837
1838 (window.wp = window.wp || {}).widgets = __webpack_exports__;
1839 /******/ })()
1840 ;