PluginProbe
Gutenberg / 18.9.0
Gutenberg v18.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 18.9.0, at build/widgets/index.js

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