PluginProbe
Gutenberg / 12.6.0
Gutenberg v12.6.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 7.4.0 All 402 releases
gutenberg / build / format-library / index.js

index.js in Gutenberg 12.6.0, at build/format-library/index.js

1,820 lines 56.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /******/ (function() { // webpackBootstrap
2 /******/ "use strict";
3 /******/ // The require scope
4 /******/ var __webpack_require__ = {};
5 /******/
6 /************************************************************************/
7 /******/ /* webpack/runtime/make namespace object */
8 /******/ !function() {
9 /******/ // define __esModule on exports
10 /******/ __webpack_require__.r = function(exports) {
11 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
12 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
13 /******/ }
14 /******/ Object.defineProperty(exports, '__esModule', { value: true });
15 /******/ };
16 /******/ }();
17 /******/
18 /************************************************************************/
19 var __webpack_exports__ = {};
20 // ESM COMPAT FLAG
21 __webpack_require__.r(__webpack_exports__);
22
23 ;// CONCATENATED MODULE: external ["wp","richText"]
24 var external_wp_richText_namespaceObject = window["wp"]["richText"];
25 ;// CONCATENATED MODULE: external ["wp","element"]
26 var external_wp_element_namespaceObject = window["wp"]["element"];
27 ;// CONCATENATED MODULE: external ["wp","i18n"]
28 var external_wp_i18n_namespaceObject = window["wp"]["i18n"];
29 ;// CONCATENATED MODULE: external ["wp","blockEditor"]
30 var external_wp_blockEditor_namespaceObject = window["wp"]["blockEditor"];
31 ;// CONCATENATED MODULE: external ["wp","primitives"]
32 var external_wp_primitives_namespaceObject = window["wp"]["primitives"];
33 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/format-bold.js
34
35
36 /**
37 * WordPress dependencies
38 */
39
40 const formatBold = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
41 xmlns: "http://www.w3.org/2000/svg",
42 viewBox: "0 0 24 24"
43 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
44 d: "M14.7 11.3c1-.6 1.5-1.6 1.5-3 0-2.3-1.3-3.4-4-3.4H7v14h5.8c1.4 0 2.5-.3 3.3-1 .8-.7 1.2-1.7 1.2-2.9.1-1.9-.8-3.1-2.6-3.7zm-5.1-4h2.3c.6 0 1.1.1 1.4.4.3.3.5.7.5 1.2s-.2 1-.5 1.2c-.3.3-.8.4-1.4.4H9.6V7.3zm4.6 9c-.4.3-1 .4-1.7.4H9.6v-3.9h2.9c.7 0 1.3.2 1.7.5.4.3.6.8.6 1.5s-.2 1.2-.6 1.5z"
45 }));
46 /* harmony default export */ var format_bold = (formatBold);
47 //# sourceMappingURL=format-bold.js.map
48 ;// CONCATENATED MODULE: ./packages/format-library/build-module/bold/index.js
49
50
51 /**
52 * WordPress dependencies
53 */
54
55
56
57
58 const bold_name = 'core/bold';
59
60 const title = (0,external_wp_i18n_namespaceObject.__)('Bold');
61
62 const bold = {
63 name: bold_name,
64 title,
65 tagName: 'strong',
66 className: null,
67
68 edit(_ref) {
69 let {
70 isActive,
71 value,
72 onChange,
73 onFocus
74 } = _ref;
75
76 function onToggle() {
77 onChange((0,external_wp_richText_namespaceObject.toggleFormat)(value, {
78 type: bold_name,
79 title
80 }));
81 }
82
83 function onClick() {
84 onChange((0,external_wp_richText_namespaceObject.toggleFormat)(value, {
85 type: bold_name
86 }));
87 onFocus();
88 }
89
90 return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.RichTextShortcut, {
91 type: "primary",
92 character: "b",
93 onUse: onToggle
94 }), (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.RichTextToolbarButton, {
95 name: "bold",
96 icon: format_bold,
97 title: title,
98 onClick: onClick,
99 isActive: isActive,
100 shortcutType: "primary",
101 shortcutCharacter: "b"
102 }), (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.__unstableRichTextInputEvent, {
103 inputType: "formatBold",
104 onInput: onToggle
105 }));
106 }
107
108 };
109 //# sourceMappingURL=index.js.map
110 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/code.js
111
112
113 /**
114 * WordPress dependencies
115 */
116
117 const code = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
118 viewBox: "0 0 24 24",
119 xmlns: "http://www.w3.org/2000/svg"
120 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
121 d: "M20.8 10.7l-4.3-4.3-1.1 1.1 4.3 4.3c.1.1.1.3 0 .4l-4.3 4.3 1.1 1.1 4.3-4.3c.7-.8.7-1.9 0-2.6zM4.2 11.8l4.3-4.3-1-1-4.3 4.3c-.7.7-.7 1.8 0 2.5l4.3 4.3 1.1-1.1-4.3-4.3c-.2-.1-.2-.3-.1-.4z"
122 }));
123 /* harmony default export */ var library_code = (code);
124 //# sourceMappingURL=code.js.map
125 ;// CONCATENATED MODULE: ./packages/format-library/build-module/code/index.js
126
127
128 /**
129 * WordPress dependencies
130 */
131
132
133
134
135 const code_name = 'core/code';
136
137 const code_title = (0,external_wp_i18n_namespaceObject.__)('Inline code');
138
139 const code_code = {
140 name: code_name,
141 title: code_title,
142 tagName: 'code',
143 className: null,
144
145 __unstableInputRule(value) {
146 const BACKTICK = '`';
147 const {
148 start,
149 text
150 } = value;
151 const characterBefore = text.slice(start - 1, start); // Quick check the text for the necessary character.
152
153 if (characterBefore !== BACKTICK) {
154 return value;
155 }
156
157 const textBefore = text.slice(0, start - 1);
158 const indexBefore = textBefore.lastIndexOf(BACKTICK);
159
160 if (indexBefore === -1) {
161 return value;
162 }
163
164 const startIndex = indexBefore;
165 const endIndex = start - 2;
166
167 if (startIndex === endIndex) {
168 return value;
169 }
170
171 value = (0,external_wp_richText_namespaceObject.remove)(value, startIndex, startIndex + 1);
172 value = (0,external_wp_richText_namespaceObject.remove)(value, endIndex, endIndex + 1);
173 value = (0,external_wp_richText_namespaceObject.applyFormat)(value, {
174 type: code_name
175 }, startIndex, endIndex);
176 return value;
177 },
178
179 edit(_ref) {
180 let {
181 value,
182 onChange,
183 onFocus,
184 isActive
185 } = _ref;
186
187 function onClick() {
188 onChange((0,external_wp_richText_namespaceObject.toggleFormat)(value, {
189 type: code_name,
190 title: code_title
191 }));
192 onFocus();
193 }
194
195 return (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.RichTextToolbarButton, {
196 icon: library_code,
197 title: code_title,
198 onClick: onClick,
199 isActive: isActive,
200 role: "menuitemcheckbox"
201 });
202 }
203
204 };
205 //# sourceMappingURL=index.js.map
206 ;// CONCATENATED MODULE: external ["wp","components"]
207 var external_wp_components_namespaceObject = window["wp"]["components"];
208 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/keyboard-return.js
209
210
211 /**
212 * WordPress dependencies
213 */
214
215 const keyboardReturn = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
216 xmlns: "http://www.w3.org/2000/svg",
217 viewBox: "-2 -2 24 24"
218 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
219 d: "M6.734 16.106l2.176-2.38-1.093-1.028-3.846 4.158 3.846 4.157 1.093-1.027-2.176-2.38h2.811c1.125 0 2.25.03 3.374 0 1.428-.001 3.362-.25 4.963-1.277 1.66-1.065 2.868-2.906 2.868-5.859 0-2.479-1.327-4.896-3.65-5.93-1.82-.813-3.044-.8-4.806-.788l-.567.002v1.5c.184 0 .368 0 .553-.002 1.82-.007 2.704-.014 4.21.657 1.854.827 2.76 2.657 2.76 4.561 0 2.472-.973 3.824-2.178 4.596-1.258.807-2.864 1.04-4.163 1.04h-.02c-1.115.03-2.229 0-3.344 0H6.734z"
220 }));
221 /* harmony default export */ var keyboard_return = (keyboardReturn);
222 //# sourceMappingURL=keyboard-return.js.map
223 ;// CONCATENATED MODULE: ./packages/format-library/build-module/image/index.js
224
225
226 /**
227 * WordPress dependencies
228 */
229
230
231
232
233
234
235 const ALLOWED_MEDIA_TYPES = ['image'];
236 const image_name = 'core/image';
237
238 const image_title = (0,external_wp_i18n_namespaceObject.__)('Inline image');
239
240 const image_image = {
241 name: image_name,
242 title: image_title,
243 keywords: [(0,external_wp_i18n_namespaceObject.__)('photo'), (0,external_wp_i18n_namespaceObject.__)('media')],
244 object: true,
245 tagName: 'img',
246 className: null,
247 attributes: {
248 className: 'class',
249 style: 'style',
250 url: 'src',
251 alt: 'alt'
252 },
253 edit: Edit
254 };
255
256 function InlineUI(_ref) {
257 let {
258 value,
259 onChange,
260 activeObjectAttributes,
261 contentRef
262 } = _ref;
263 const {
264 style
265 } = activeObjectAttributes;
266 const [width, setWidth] = (0,external_wp_element_namespaceObject.useState)(style === null || style === void 0 ? void 0 : style.replace(/\D/g, ''));
267 const anchorRef = (0,external_wp_richText_namespaceObject.useAnchorRef)({
268 ref: contentRef,
269 value,
270 settings: image_image
271 });
272 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Popover, {
273 position: "bottom center",
274 focusOnMount: false,
275 anchorRef: anchorRef,
276 className: "block-editor-format-toolbar__image-popover"
277 }, (0,external_wp_element_namespaceObject.createElement)("form", {
278 className: "block-editor-format-toolbar__image-container-content",
279 onSubmit: event => {
280 const newReplacements = value.replacements.slice();
281 newReplacements[value.start] = {
282 type: image_name,
283 attributes: { ...activeObjectAttributes,
284 style: width ? `width: ${width}px;` : ''
285 }
286 };
287 onChange({ ...value,
288 replacements: newReplacements
289 });
290 event.preventDefault();
291 }
292 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.TextControl, {
293 className: "block-editor-format-toolbar__image-container-value",
294 type: "number",
295 label: (0,external_wp_i18n_namespaceObject.__)('Width'),
296 value: width,
297 min: 1,
298 onChange: newWidth => setWidth(newWidth)
299 }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, {
300 icon: keyboard_return,
301 label: (0,external_wp_i18n_namespaceObject.__)('Apply'),
302 type: "submit"
303 })));
304 }
305
306 function Edit(_ref2) {
307 let {
308 value,
309 onChange,
310 onFocus,
311 isObjectActive,
312 activeObjectAttributes,
313 contentRef
314 } = _ref2;
315 const [isModalOpen, setIsModalOpen] = (0,external_wp_element_namespaceObject.useState)(false);
316
317 function openModal() {
318 setIsModalOpen(true);
319 }
320
321 function closeModal() {
322 setIsModalOpen(false);
323 }
324
325 return (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.MediaUploadCheck, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.RichTextToolbarButton, {
326 icon: (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.SVG, {
327 xmlns: "http://www.w3.org/2000/svg",
328 viewBox: "0 0 24 24"
329 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Path, {
330 d: "M4 18.5h16V17H4v1.5zM16 13v1.5h4V13h-4zM5.1 15h7.8c.6 0 1.1-.5 1.1-1.1V6.1c0-.6-.5-1.1-1.1-1.1H5.1C4.5 5 4 5.5 4 6.1v7.8c0 .6.5 1.1 1.1 1.1zm.4-8.5h7V10l-1-1c-.3-.3-.8-.3-1 0l-1.6 1.5-1.2-.7c-.3-.2-.6-.2-.9 0l-1.3 1V6.5zm0 6.1l1.8-1.3 1.3.8c.3.2.7.2.9-.1l1.5-1.4 1.5 1.4v1.5h-7v-.9z"
331 })),
332 title: image_title,
333 onClick: openModal,
334 isActive: isObjectActive
335 }), isModalOpen && (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.MediaUpload, {
336 allowedTypes: ALLOWED_MEDIA_TYPES,
337 onSelect: _ref3 => {
338 let {
339 id,
340 url,
341 alt,
342 width: imgWidth
343 } = _ref3;
344 closeModal();
345 onChange((0,external_wp_richText_namespaceObject.insertObject)(value, {
346 type: image_name,
347 attributes: {
348 className: `wp-image-${id}`,
349 style: `width: ${Math.min(imgWidth, 150)}px;`,
350 url,
351 alt
352 }
353 }));
354 onFocus();
355 },
356 onClose: closeModal,
357 render: _ref4 => {
358 let {
359 open
360 } = _ref4;
361 open();
362 return null;
363 }
364 }), isObjectActive && (0,external_wp_element_namespaceObject.createElement)(InlineUI, {
365 value: value,
366 onChange: onChange,
367 activeObjectAttributes: activeObjectAttributes,
368 contentRef: contentRef
369 }));
370 }
371 //# sourceMappingURL=index.js.map
372 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/format-italic.js
373
374
375 /**
376 * WordPress dependencies
377 */
378
379 const formatItalic = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
380 xmlns: "http://www.w3.org/2000/svg",
381 viewBox: "0 0 24 24"
382 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
383 d: "M12.5 5L10 19h1.9l2.5-14z"
384 }));
385 /* harmony default export */ var format_italic = (formatItalic);
386 //# sourceMappingURL=format-italic.js.map
387 ;// CONCATENATED MODULE: ./packages/format-library/build-module/italic/index.js
388
389
390 /**
391 * WordPress dependencies
392 */
393
394
395
396
397 const italic_name = 'core/italic';
398
399 const italic_title = (0,external_wp_i18n_namespaceObject.__)('Italic');
400
401 const italic = {
402 name: italic_name,
403 title: italic_title,
404 tagName: 'em',
405 className: null,
406
407 edit(_ref) {
408 let {
409 isActive,
410 value,
411 onChange,
412 onFocus
413 } = _ref;
414
415 function onToggle() {
416 onChange((0,external_wp_richText_namespaceObject.toggleFormat)(value, {
417 type: italic_name,
418 title: italic_title
419 }));
420 }
421
422 function onClick() {
423 onChange((0,external_wp_richText_namespaceObject.toggleFormat)(value, {
424 type: italic_name
425 }));
426 onFocus();
427 }
428
429 return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.RichTextShortcut, {
430 type: "primary",
431 character: "i",
432 onUse: onToggle
433 }), (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.RichTextToolbarButton, {
434 name: "italic",
435 icon: format_italic,
436 title: italic_title,
437 onClick: onClick,
438 isActive: isActive,
439 shortcutType: "primary",
440 shortcutCharacter: "i"
441 }), (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.__unstableRichTextInputEvent, {
442 inputType: "formatItalic",
443 onInput: onToggle
444 }));
445 }
446
447 };
448 //# sourceMappingURL=index.js.map
449 ;// CONCATENATED MODULE: external ["wp","url"]
450 var external_wp_url_namespaceObject = window["wp"]["url"];
451 ;// CONCATENATED MODULE: external ["wp","htmlEntities"]
452 var external_wp_htmlEntities_namespaceObject = window["wp"]["htmlEntities"];
453 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/link-off.js
454
455
456 /**
457 * WordPress dependencies
458 */
459
460 const linkOff = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
461 xmlns: "http://www.w3.org/2000/svg",
462 viewBox: "0 0 24 24"
463 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
464 d: "M15.6 7.3h-.7l1.6-3.5-.9-.4-3.9 8.5H9v1.5h2l-1.3 2.8H8.4c-2 0-3.7-1.7-3.7-3.7s1.7-3.7 3.7-3.7H10V7.3H8.4c-2.9 0-5.2 2.3-5.2 5.2 0 2.9 2.3 5.2 5.2 5.2H9l-1.4 3.2.9.4 5.7-12.5h1.4c2 0 3.7 1.7 3.7 3.7s-1.7 3.7-3.7 3.7H14v1.5h1.6c2.9 0 5.2-2.3 5.2-5.2 0-2.9-2.4-5.2-5.2-5.2z"
465 }));
466 /* harmony default export */ var link_off = (linkOff);
467 //# sourceMappingURL=link-off.js.map
468 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/link.js
469
470
471 /**
472 * WordPress dependencies
473 */
474
475 const link_link = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
476 xmlns: "http://www.w3.org/2000/svg",
477 viewBox: "0 0 24 24"
478 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
479 d: "M15.6 7.2H14v1.5h1.6c2 0 3.7 1.7 3.7 3.7s-1.7 3.7-3.7 3.7H14v1.5h1.6c2.8 0 5.2-2.3 5.2-5.2 0-2.9-2.3-5.2-5.2-5.2zM4.7 12.4c0-2 1.7-3.7 3.7-3.7H10V7.2H8.4c-2.9 0-5.2 2.3-5.2 5.2 0 2.9 2.3 5.2 5.2 5.2H10v-1.5H8.4c-2 0-3.7-1.7-3.7-3.7zm4.6.9h5.3v-1.5H9.3v1.5z"
480 }));
481 /* harmony default export */ var library_link = (link_link);
482 //# sourceMappingURL=link.js.map
483 ;// CONCATENATED MODULE: external ["wp","a11y"]
484 var external_wp_a11y_namespaceObject = window["wp"]["a11y"];
485 ;// CONCATENATED MODULE: external ["wp","data"]
486 var external_wp_data_namespaceObject = window["wp"]["data"];
487 ;// CONCATENATED MODULE: external "lodash"
488 var external_lodash_namespaceObject = window["lodash"];
489 ;// CONCATENATED MODULE: ./packages/format-library/build-module/link/utils.js
490 /**
491 * External dependencies
492 */
493
494 /**
495 * WordPress dependencies
496 */
497
498
499 /**
500 * Check for issues with the provided href.
501 *
502 * @param {string} href The href.
503 *
504 * @return {boolean} Is the href invalid?
505 */
506
507 function isValidHref(href) {
508 if (!href) {
509 return false;
510 }
511
512 const trimmedHref = href.trim();
513
514 if (!trimmedHref) {
515 return false;
516 } // Does the href start with something that looks like a URL protocol?
517
518
519 if (/^\S+:/.test(trimmedHref)) {
520 const protocol = (0,external_wp_url_namespaceObject.getProtocol)(trimmedHref);
521
522 if (!(0,external_wp_url_namespaceObject.isValidProtocol)(protocol)) {
523 return false;
524 } // Add some extra checks for http(s) URIs, since these are the most common use-case.
525 // This ensures URIs with an http protocol have exactly two forward slashes following the protocol.
526
527
528 if ((0,external_lodash_namespaceObject.startsWith)(protocol, 'http') && !/^https?:\/\/[^\/\s]/i.test(trimmedHref)) {
529 return false;
530 }
531
532 const authority = (0,external_wp_url_namespaceObject.getAuthority)(trimmedHref);
533
534 if (!(0,external_wp_url_namespaceObject.isValidAuthority)(authority)) {
535 return false;
536 }
537
538 const path = (0,external_wp_url_namespaceObject.getPath)(trimmedHref);
539
540 if (path && !(0,external_wp_url_namespaceObject.isValidPath)(path)) {
541 return false;
542 }
543
544 const queryString = (0,external_wp_url_namespaceObject.getQueryString)(trimmedHref);
545
546 if (queryString && !(0,external_wp_url_namespaceObject.isValidQueryString)(queryString)) {
547 return false;
548 }
549
550 const fragment = (0,external_wp_url_namespaceObject.getFragment)(trimmedHref);
551
552 if (fragment && !(0,external_wp_url_namespaceObject.isValidFragment)(fragment)) {
553 return false;
554 }
555 } // Validate anchor links.
556
557
558 if ((0,external_lodash_namespaceObject.startsWith)(trimmedHref, '#') && !(0,external_wp_url_namespaceObject.isValidFragment)(trimmedHref)) {
559 return false;
560 }
561
562 return true;
563 }
564 /**
565 * Generates the format object that will be applied to the link text.
566 *
567 * @param {Object} options
568 * @param {string} options.url The href of the link.
569 * @param {string} options.type The type of the link.
570 * @param {string} options.id The ID of the link.
571 * @param {boolean} options.opensInNewWindow Whether this link will open in a new window.
572 *
573 * @return {Object} The final format object.
574 */
575
576 function createLinkFormat(_ref) {
577 let {
578 url,
579 type,
580 id,
581 opensInNewWindow
582 } = _ref;
583 const format = {
584 type: 'core/link',
585 attributes: {
586 url
587 }
588 };
589 if (type) format.attributes.type = type;
590 if (id) format.attributes.id = id;
591
592 if (opensInNewWindow) {
593 format.attributes.target = '_blank';
594 format.attributes.rel = 'noreferrer noopener';
595 }
596
597 return format;
598 }
599 /* eslint-disable jsdoc/no-undefined-types */
600
601 /**
602 * Get the start and end boundaries of a given format from a rich text value.
603 *
604 *
605 * @param {RichTextValue} value the rich text value to interrogate.
606 * @param {string} format the identifier for the target format (e.g. `core/link`, `core/bold`).
607 * @param {number?} startIndex optional startIndex to seek from.
608 * @param {number?} endIndex optional endIndex to seek from.
609 * @return {Object} object containing start and end values for the given format.
610 */
611
612 /* eslint-enable jsdoc/no-undefined-types */
613
614 function getFormatBoundary(value, format) {
615 let startIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : value.start;
616 let endIndex = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : value.end;
617 const EMPTY_BOUNDARIES = {
618 start: null,
619 end: null
620 };
621 const {
622 formats
623 } = value;
624 let targetFormat;
625 let initialIndex;
626
627 if (!(formats !== null && formats !== void 0 && formats.length)) {
628 return EMPTY_BOUNDARIES;
629 } // Clone formats to avoid modifying source formats.
630
631
632 const newFormats = formats.slice();
633 const formatAtStart = (0,external_lodash_namespaceObject.find)(newFormats[startIndex], {
634 type: format.type
635 });
636 const formatAtEnd = (0,external_lodash_namespaceObject.find)(newFormats[endIndex], {
637 type: format.type
638 });
639 const formatAtEndMinusOne = (0,external_lodash_namespaceObject.find)(newFormats[endIndex - 1], {
640 type: format.type
641 });
642
643 if (!!formatAtStart) {
644 // Set values to conform to "start"
645 targetFormat = formatAtStart;
646 initialIndex = startIndex;
647 } else if (!!formatAtEnd) {
648 // Set values to conform to "end"
649 targetFormat = formatAtEnd;
650 initialIndex = endIndex;
651 } else if (!!formatAtEndMinusOne) {
652 // This is an edge case which will occur if you create a format, then place
653 // the caret just before the format and hit the back ARROW key. The resulting
654 // value object will have start and end +1 beyond the edge of the format boundary.
655 targetFormat = formatAtEndMinusOne;
656 initialIndex = endIndex - 1;
657 } else {
658 return EMPTY_BOUNDARIES;
659 }
660
661 const index = newFormats[initialIndex].indexOf(targetFormat);
662 const walkingArgs = [newFormats, initialIndex, targetFormat, index]; // Walk the startIndex "backwards" to the leading "edge" of the matching format.
663
664 startIndex = walkToStart(...walkingArgs); // Walk the endIndex "forwards" until the trailing "edge" of the matching format.
665
666 endIndex = walkToEnd(...walkingArgs); // Safe guard: start index cannot be less than 0
667
668 startIndex = startIndex < 0 ? 0 : startIndex; // // Return the indicies of the "edges" as the boundaries.
669
670 return {
671 start: startIndex,
672 end: endIndex
673 };
674 }
675 /**
676 * Walks forwards/backwards towards the boundary of a given format within an
677 * array of format objects. Returns the index of the boundary.
678 *
679 * @param {Array} formats the formats to search for the given format type.
680 * @param {number} initialIndex the starting index from which to walk.
681 * @param {Object} targetFormatRef a reference to the format type object being sought.
682 * @param {number} formatIndex the index at which we expect the target format object to be.
683 * @param {string} direction either 'forwards' or 'backwards' to indicate the direction.
684 * @return {number} the index of the boundary of the given format.
685 */
686
687 function walkToBoundary(formats, initialIndex, targetFormatRef, formatIndex, direction) {
688 let index = initialIndex;
689 const directions = {
690 forwards: 1,
691 backwards: -1
692 };
693 const directionIncrement = directions[direction] || 1; // invalid direction arg default to forwards
694
695 const inverseDirectionIncrement = directionIncrement * -1;
696
697 while (formats[index] && formats[index][formatIndex] === targetFormatRef) {
698 // Increment/decrement in the direction of operation.
699 index = index + directionIncrement;
700 } // Restore by one in inverse direction of operation
701 // to avoid out of bounds.
702
703
704 index = index + inverseDirectionIncrement;
705 return index;
706 }
707
708 const walkToStart = (0,external_lodash_namespaceObject.partialRight)(walkToBoundary, 'backwards');
709 const walkToEnd = (0,external_lodash_namespaceObject.partialRight)(walkToBoundary, 'forwards');
710 //# sourceMappingURL=utils.js.map
711 ;// CONCATENATED MODULE: ./packages/format-library/build-module/link/use-link-instance-key.js
712 // Weakly referenced map allows unused ids to be garbage collected.
713 const weakMap = new WeakMap(); // Incrementing zero-based ID value
714
715 let id = -1;
716 const prefix = 'link-control-instance';
717
718 function getKey(_id) {
719 return `${prefix}-${_id}`;
720 }
721 /**
722 * Builds a unique link control key for the given object reference.
723 *
724 * @param {Object} instance an unique object reference specific to this link control instance.
725 * @return {string} the unique key to use for this link control.
726 */
727
728
729 function useLinkInstanceKey(instance) {
730 if (!instance) {
731 return;
732 }
733
734 if (weakMap.has(instance)) {
735 return getKey(weakMap.get(instance));
736 }
737
738 id += 1;
739 weakMap.set(instance, id);
740 return getKey(id);
741 }
742
743 /* harmony default export */ var use_link_instance_key = (useLinkInstanceKey);
744 //# sourceMappingURL=use-link-instance-key.js.map
745 ;// CONCATENATED MODULE: ./packages/format-library/build-module/link/inline.js
746
747
748 /**
749 * WordPress dependencies
750 */
751
752
753
754
755
756
757
758 /**
759 * Internal dependencies
760 */
761
762
763
764
765
766 function InlineLinkUI(_ref) {
767 let {
768 isActive,
769 activeAttributes,
770 addingLink,
771 value,
772 onChange,
773 speak,
774 stopAddingLink,
775 contentRef
776 } = _ref;
777 const richLinkTextValue = getRichTextValueFromSelection(value, isActive); // Get the text content minus any HTML tags.
778
779 const richTextText = richLinkTextValue.text;
780 /**
781 * Pending settings to be applied to the next link. When inserting a new
782 * link, toggle values cannot be applied immediately, because there is not
783 * yet a link for them to apply to. Thus, they are maintained in a state
784 * value until the time that the link can be inserted or edited.
785 *
786 * @type {[Object|undefined,Function]}
787 */
788
789 const [nextLinkValue, setNextLinkValue] = (0,external_wp_element_namespaceObject.useState)();
790 const {
791 createPageEntity,
792 userCanCreatePages
793 } = (0,external_wp_data_namespaceObject.useSelect)(select => {
794 const {
795 getSettings
796 } = select(external_wp_blockEditor_namespaceObject.store);
797
798 const _settings = getSettings();
799
800 return {
801 createPageEntity: _settings.__experimentalCreatePageEntity,
802 userCanCreatePages: _settings.__experimentalUserCanCreatePages
803 };
804 }, []);
805 const linkValue = {
806 url: activeAttributes.url,
807 type: activeAttributes.type,
808 id: activeAttributes.id,
809 opensInNewTab: activeAttributes.target === '_blank',
810 title: richTextText,
811 ...nextLinkValue
812 };
813
814 function removeLink() {
815 const newValue = (0,external_wp_richText_namespaceObject.removeFormat)(value, 'core/link');
816 onChange(newValue);
817 stopAddingLink();
818 speak((0,external_wp_i18n_namespaceObject.__)('Link removed.'), 'assertive');
819 }
820
821 function onChangeLink(nextValue) {
822 // Merge with values from state, both for the purpose of assigning the
823 // next state value, and for use in constructing the new link format if
824 // the link is ready to be applied.
825 nextValue = { ...nextLinkValue,
826 ...nextValue
827 }; // LinkControl calls `onChange` immediately upon the toggling a setting.
828
829 const didToggleSetting = linkValue.opensInNewTab !== nextValue.opensInNewTab && linkValue.url === nextValue.url; // If change handler was called as a result of a settings change during
830 // link insertion, it must be held in state until the link is ready to
831 // be applied.
832
833 const didToggleSettingForNewLink = didToggleSetting && nextValue.url === undefined; // If link will be assigned, the state value can be considered flushed.
834 // Otherwise, persist the pending changes.
835
836 setNextLinkValue(didToggleSettingForNewLink ? nextValue : undefined);
837
838 if (didToggleSettingForNewLink) {
839 return;
840 }
841
842 const newUrl = (0,external_wp_url_namespaceObject.prependHTTP)(nextValue.url);
843 const linkFormat = createLinkFormat({
844 url: newUrl,
845 type: nextValue.type,
846 id: nextValue.id !== undefined && nextValue.id !== null ? String(nextValue.id) : undefined,
847 opensInNewWindow: nextValue.opensInNewTab
848 });
849 const newText = nextValue.title || newUrl;
850
851 if ((0,external_wp_richText_namespaceObject.isCollapsed)(value) && !isActive) {
852 // Scenario: we don't have any actively selected text or formats.
853 const toInsert = (0,external_wp_richText_namespaceObject.applyFormat)((0,external_wp_richText_namespaceObject.create)({
854 text: newText
855 }), linkFormat, 0, newText.length);
856 onChange((0,external_wp_richText_namespaceObject.insert)(value, toInsert));
857 } else {
858 // Scenario: we have any active text selection or an active format
859 let newValue;
860
861 if (newText === richTextText) {
862 // If we're not updating the text then ignore
863 newValue = (0,external_wp_richText_namespaceObject.applyFormat)(value, linkFormat);
864 } else {
865 // Create new RichText value for the new text in order that we
866 // can apply formats to it.
867 newValue = (0,external_wp_richText_namespaceObject.create)({
868 text: newText
869 }); // Apply the new Link format to this new text value.
870
871 newValue = (0,external_wp_richText_namespaceObject.applyFormat)(newValue, linkFormat, 0, newText.length); // Update the original (full) RichTextValue replacing the
872 // target text with the *new* RichTextValue containing:
873 // 1. The new text content.
874 // 2. The new link format.
875 // Note original formats will be lost when applying this change.
876 // That is expected behaviour.
877 // See: https://github.com/WordPress/gutenberg/pull/33849#issuecomment-936134179.
878
879 newValue = (0,external_wp_richText_namespaceObject.replace)(value, richTextText, newValue);
880 }
881
882 newValue.start = newValue.end;
883 newValue.activeFormats = [];
884 onChange(newValue);
885 } // Focus should only be shifted back to the formatted segment when the
886 // URL is submitted.
887
888
889 if (!didToggleSetting) {
890 stopAddingLink();
891 }
892
893 if (!isValidHref(newUrl)) {
894 speak((0,external_wp_i18n_namespaceObject.__)('Warning: the link has been inserted but may have errors. Please test it.'), 'assertive');
895 } else if (isActive) {
896 speak((0,external_wp_i18n_namespaceObject.__)('Link edited.'), 'assertive');
897 } else {
898 speak((0,external_wp_i18n_namespaceObject.__)('Link inserted.'), 'assertive');
899 }
900 }
901
902 const anchorRef = (0,external_wp_richText_namespaceObject.useAnchorRef)({
903 ref: contentRef,
904 value,
905 settings: build_module_link_link
906 }); // Generate a string based key that is unique to this anchor reference.
907 // This is used to force re-mount the LinkControl component to avoid
908 // potential stale state bugs caused by the component not being remounted
909 // See https://github.com/WordPress/gutenberg/pull/34742.
910
911 const forceRemountKey = use_link_instance_key(anchorRef); // The focusOnMount prop shouldn't evolve during render of a Popover
912 // otherwise it causes a render of the content.
913
914 const focusOnMount = (0,external_wp_element_namespaceObject.useRef)(addingLink ? 'firstElement' : false);
915
916 async function handleCreate(pageTitle) {
917 const page = await createPageEntity({
918 title: pageTitle,
919 status: 'draft'
920 });
921 return {
922 id: page.id,
923 type: page.type,
924 title: page.title.rendered,
925 url: page.link,
926 kind: 'post-type'
927 };
928 }
929
930 function createButtonText(searchTerm) {
931 return (0,external_wp_element_namespaceObject.createInterpolateElement)((0,external_wp_i18n_namespaceObject.sprintf)(
932 /* translators: %s: search term. */
933 (0,external_wp_i18n_namespaceObject.__)('Create Page: <mark>%s</mark>'), searchTerm), {
934 mark: (0,external_wp_element_namespaceObject.createElement)("mark", null)
935 });
936 }
937
938 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Popover, {
939 anchorRef: anchorRef,
940 focusOnMount: focusOnMount.current,
941 onClose: stopAddingLink,
942 position: "bottom center"
943 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.__experimentalLinkControl, {
944 key: forceRemountKey,
945 value: linkValue,
946 onChange: onChangeLink,
947 onRemove: removeLink,
948 forceIsEditingLink: addingLink,
949 hasRichPreviews: true,
950 createSuggestion: createPageEntity && handleCreate,
951 withCreateSuggestion: userCanCreatePages,
952 createSuggestionButtonText: createButtonText,
953 hasTextControl: true
954 }));
955 }
956
957 function getRichTextValueFromSelection(value, isActive) {
958 // Default to the selection ranges on the RichTextValue object.
959 let textStart = value.start;
960 let textEnd = value.end; // If the format is currently active then the rich text value
961 // should always be taken from the bounds of the active format
962 // and not the selected text.
963
964 if (isActive) {
965 const boundary = getFormatBoundary(value, {
966 type: 'core/link'
967 });
968 textStart = boundary.start; // Text *selection* always extends +1 beyond the edge of the format.
969 // We account for that here.
970
971 textEnd = boundary.end + 1;
972 } // Get a RichTextValue containing the selected text content.
973
974
975 return (0,external_wp_richText_namespaceObject.slice)(value, textStart, textEnd);
976 }
977
978 /* harmony default export */ var inline = ((0,external_wp_components_namespaceObject.withSpokenMessages)(InlineLinkUI));
979 //# sourceMappingURL=inline.js.map
980 ;// CONCATENATED MODULE: ./packages/format-library/build-module/link/index.js
981
982
983 /**
984 * WordPress dependencies
985 */
986
987
988
989
990
991
992
993
994 /**
995 * Internal dependencies
996 */
997
998
999
1000 const link_name = 'core/link';
1001
1002 const link_title = (0,external_wp_i18n_namespaceObject.__)('Link');
1003
1004 function link_Edit(_ref) {
1005 let {
1006 isActive,
1007 activeAttributes,
1008 value,
1009 onChange,
1010 onFocus,
1011 contentRef
1012 } = _ref;
1013 const [addingLink, setAddingLink] = (0,external_wp_element_namespaceObject.useState)(false);
1014
1015 function addLink() {
1016 const text = (0,external_wp_richText_namespaceObject.getTextContent)((0,external_wp_richText_namespaceObject.slice)(value));
1017
1018 if (text && (0,external_wp_url_namespaceObject.isURL)(text) && isValidHref(text)) {
1019 onChange((0,external_wp_richText_namespaceObject.applyFormat)(value, {
1020 type: link_name,
1021 attributes: {
1022 url: text
1023 }
1024 }));
1025 } else if (text && (0,external_wp_url_namespaceObject.isEmail)(text)) {
1026 onChange((0,external_wp_richText_namespaceObject.applyFormat)(value, {
1027 type: link_name,
1028 attributes: {
1029 url: `mailto:${text}`
1030 }
1031 }));
1032 } else {
1033 setAddingLink(true);
1034 }
1035 }
1036
1037 function stopAddingLink() {
1038 setAddingLink(false);
1039 onFocus();
1040 }
1041
1042 function onRemoveFormat() {
1043 onChange((0,external_wp_richText_namespaceObject.removeFormat)(value, link_name));
1044 (0,external_wp_a11y_namespaceObject.speak)((0,external_wp_i18n_namespaceObject.__)('Link removed.'), 'assertive');
1045 }
1046
1047 return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.RichTextShortcut, {
1048 type: "primary",
1049 character: "k",
1050 onUse: addLink
1051 }), (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.RichTextShortcut, {
1052 type: "primaryShift",
1053 character: "k",
1054 onUse: onRemoveFormat
1055 }), isActive && (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.RichTextToolbarButton, {
1056 name: "link",
1057 icon: link_off,
1058 title: (0,external_wp_i18n_namespaceObject.__)('Unlink'),
1059 onClick: onRemoveFormat,
1060 isActive: isActive,
1061 shortcutType: "primaryShift",
1062 shortcutCharacter: "k"
1063 }), !isActive && (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.RichTextToolbarButton, {
1064 name: "link",
1065 icon: library_link,
1066 title: link_title,
1067 onClick: addLink,
1068 isActive: isActive,
1069 shortcutType: "primary",
1070 shortcutCharacter: "k"
1071 }), (addingLink || isActive) && (0,external_wp_element_namespaceObject.createElement)(inline, {
1072 addingLink: addingLink,
1073 stopAddingLink: stopAddingLink,
1074 isActive: isActive,
1075 activeAttributes: activeAttributes,
1076 value: value,
1077 onChange: onChange,
1078 contentRef: contentRef
1079 }));
1080 }
1081
1082 const build_module_link_link = {
1083 name: link_name,
1084 title: link_title,
1085 tagName: 'a',
1086 className: null,
1087 attributes: {
1088 url: 'href',
1089 type: 'data-type',
1090 id: 'data-id',
1091 target: 'target'
1092 },
1093
1094 __unstablePasteRule(value, _ref2) {
1095 let {
1096 html,
1097 plainText
1098 } = _ref2;
1099
1100 if ((0,external_wp_richText_namespaceObject.isCollapsed)(value)) {
1101 return value;
1102 }
1103
1104 const pastedText = (html || plainText).replace(/<[^>]+>/g, '').trim(); // A URL was pasted, turn the selection into a link
1105
1106 if (!(0,external_wp_url_namespaceObject.isURL)(pastedText)) {
1107 return value;
1108 } // Allows us to ask for this information when we get a report.
1109
1110
1111 window.console.log('Created link:\n\n', pastedText);
1112 return (0,external_wp_richText_namespaceObject.applyFormat)(value, {
1113 type: link_name,
1114 attributes: {
1115 url: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(pastedText)
1116 }
1117 });
1118 },
1119
1120 edit: link_Edit
1121 };
1122 //# sourceMappingURL=index.js.map
1123 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/format-strikethrough.js
1124
1125
1126 /**
1127 * WordPress dependencies
1128 */
1129
1130 const formatStrikethrough = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
1131 xmlns: "http://www.w3.org/2000/svg",
1132 viewBox: "0 0 24 24"
1133 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
1134 d: "M9.1 9v-.5c0-.6.2-1.1.7-1.4.5-.3 1.2-.5 2-.5.7 0 1.4.1 2.1.3.7.2 1.4.5 2.1.9l.2-1.9c-.6-.3-1.2-.5-1.9-.7-.8-.1-1.6-.2-2.4-.2-1.5 0-2.7.3-3.6 1-.8.7-1.2 1.5-1.2 2.6V9h2zM20 12H4v1h8.3c.3.1.6.2.8.3.5.2.9.5 1.1.8.3.3.4.7.4 1.2 0 .7-.2 1.1-.8 1.5-.5.3-1.2.5-2.1.5-.8 0-1.6-.1-2.4-.3-.8-.2-1.5-.5-2.2-.8L7 18.1c.5.2 1.2.4 2 .6.8.2 1.6.3 2.4.3 1.7 0 3-.3 3.9-1 .9-.7 1.3-1.6 1.3-2.8 0-.9-.2-1.7-.7-2.2H20v-1z"
1135 }));
1136 /* harmony default export */ var format_strikethrough = (formatStrikethrough);
1137 //# sourceMappingURL=format-strikethrough.js.map
1138 ;// CONCATENATED MODULE: ./packages/format-library/build-module/strikethrough/index.js
1139
1140
1141 /**
1142 * WordPress dependencies
1143 */
1144
1145
1146
1147
1148 const strikethrough_name = 'core/strikethrough';
1149
1150 const strikethrough_title = (0,external_wp_i18n_namespaceObject.__)('Strikethrough');
1151
1152 const strikethrough = {
1153 name: strikethrough_name,
1154 title: strikethrough_title,
1155 tagName: 's',
1156 className: null,
1157
1158 edit(_ref) {
1159 let {
1160 isActive,
1161 value,
1162 onChange,
1163 onFocus
1164 } = _ref;
1165
1166 function onClick() {
1167 onChange((0,external_wp_richText_namespaceObject.toggleFormat)(value, {
1168 type: strikethrough_name,
1169 title: strikethrough_title
1170 }));
1171 onFocus();
1172 }
1173
1174 return (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.RichTextToolbarButton, {
1175 icon: format_strikethrough,
1176 title: strikethrough_title,
1177 onClick: onClick,
1178 isActive: isActive,
1179 role: "menuitemcheckbox"
1180 });
1181 }
1182
1183 };
1184 //# sourceMappingURL=index.js.map
1185 ;// CONCATENATED MODULE: ./packages/format-library/build-module/underline/index.js
1186
1187
1188 /**
1189 * WordPress dependencies
1190 */
1191
1192
1193
1194 const underline_name = 'core/underline';
1195
1196 const underline_title = (0,external_wp_i18n_namespaceObject.__)('Underline');
1197
1198 const underline = {
1199 name: underline_name,
1200 title: underline_title,
1201 tagName: 'span',
1202 className: null,
1203 attributes: {
1204 style: 'style'
1205 },
1206
1207 edit(_ref) {
1208 let {
1209 value,
1210 onChange
1211 } = _ref;
1212
1213 const onToggle = () => {
1214 onChange((0,external_wp_richText_namespaceObject.toggleFormat)(value, {
1215 type: underline_name,
1216 attributes: {
1217 style: 'text-decoration: underline;'
1218 },
1219 title: underline_title
1220 }));
1221 };
1222
1223 return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.RichTextShortcut, {
1224 type: "primary",
1225 character: "u",
1226 onUse: onToggle
1227 }), (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.__unstableRichTextInputEvent, {
1228 inputType: "formatUnderline",
1229 onInput: onToggle
1230 }));
1231 }
1232
1233 };
1234 //# sourceMappingURL=index.js.map
1235 ;// CONCATENATED MODULE: ./packages/icons/build-module/icon/index.js
1236 /**
1237 * WordPress dependencies
1238 */
1239
1240 /** @typedef {{icon: JSX.Element, size?: number} & import('@wordpress/primitives').SVGProps} IconProps */
1241
1242 /**
1243 * Return an SVG icon.
1244 *
1245 * @param {IconProps} props icon is the SVG component to render
1246 * size is a number specifiying the icon size in pixels
1247 * Other props will be passed to wrapped SVG component
1248 *
1249 * @return {JSX.Element} Icon component
1250 */
1251
1252 function Icon(_ref) {
1253 let {
1254 icon,
1255 size = 24,
1256 ...props
1257 } = _ref;
1258 return (0,external_wp_element_namespaceObject.cloneElement)(icon, {
1259 width: size,
1260 height: size,
1261 ...props
1262 });
1263 }
1264
1265 /* harmony default export */ var icon = (Icon);
1266 //# sourceMappingURL=index.js.map
1267 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/text-color.js
1268
1269
1270 /**
1271 * WordPress dependencies
1272 */
1273
1274 const textColor = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
1275 xmlns: "http://www.w3.org/2000/svg",
1276 viewBox: "0 0 24 24"
1277 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
1278 d: "M12.9 6h-2l-4 11h1.9l1.1-3h4.2l1.1 3h1.9L12.9 6zm-2.5 6.5l1.5-4.9 1.7 4.9h-3.2z"
1279 }));
1280 /* harmony default export */ var text_color = (textColor);
1281 //# sourceMappingURL=text-color.js.map
1282 ;// CONCATENATED MODULE: ./packages/format-library/build-module/text-color/inline.js
1283
1284
1285 /**
1286 * External dependencies
1287 */
1288
1289 /**
1290 * WordPress dependencies
1291 */
1292
1293
1294
1295
1296
1297
1298
1299 /**
1300 * Internal dependencies
1301 */
1302
1303
1304
1305 function parseCSS() {
1306 let css = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
1307 return css.split(';').reduce((accumulator, rule) => {
1308 if (rule) {
1309 const [property, value] = rule.split(':');
1310 if (property === 'color') accumulator.color = value;
1311 if (property === 'background-color' && value !== transparentValue) accumulator.backgroundColor = value;
1312 }
1313
1314 return accumulator;
1315 }, {});
1316 }
1317
1318 function parseClassName() {
1319 let className = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
1320 let colorSettings = arguments.length > 1 ? arguments[1] : undefined;
1321 return className.split(' ').reduce((accumulator, name) => {
1322 // `colorSlug` could contain dashes, so simply match the start and end.
1323 if (name.startsWith('has-') && name.endsWith('-color')) {
1324 const colorSlug = name.replace(/^has-/, '').replace(/-color$/, '');
1325 const colorObject = (0,external_wp_blockEditor_namespaceObject.getColorObjectByAttributeValues)(colorSettings, colorSlug);
1326 accumulator.color = colorObject.color;
1327 }
1328
1329 return accumulator;
1330 }, {});
1331 }
1332 function getActiveColors(value, name, colorSettings) {
1333 const activeColorFormat = (0,external_wp_richText_namespaceObject.getActiveFormat)(value, name);
1334
1335 if (!activeColorFormat) {
1336 return {};
1337 }
1338
1339 return { ...parseCSS(activeColorFormat.attributes.style),
1340 ...parseClassName(activeColorFormat.attributes.class, colorSettings)
1341 };
1342 }
1343
1344 function setColors(value, name, colorSettings, colors) {
1345 const {
1346 color,
1347 backgroundColor
1348 } = { ...getActiveColors(value, name, colorSettings),
1349 ...colors
1350 };
1351
1352 if (!color && !backgroundColor) {
1353 return (0,external_wp_richText_namespaceObject.removeFormat)(value, name);
1354 }
1355
1356 const styles = [];
1357 const classNames = [];
1358 const attributes = {};
1359
1360 if (backgroundColor) {
1361 styles.push(['background-color', backgroundColor].join(':'));
1362 } else {
1363 // Override default browser color for mark element.
1364 styles.push(['background-color', transparentValue].join(':'));
1365 }
1366
1367 if (color) {
1368 const colorObject = (0,external_wp_blockEditor_namespaceObject.getColorObjectByColorValue)(colorSettings, color);
1369
1370 if (colorObject) {
1371 classNames.push((0,external_wp_blockEditor_namespaceObject.getColorClassName)('color', colorObject.slug));
1372 } else {
1373 styles.push(['color', color].join(':'));
1374 }
1375 }
1376
1377 if (styles.length) attributes.style = styles.join(';');
1378 if (classNames.length) attributes.class = classNames.join(' ');
1379 return (0,external_wp_richText_namespaceObject.applyFormat)(value, {
1380 type: name,
1381 attributes
1382 });
1383 }
1384
1385 function ColorPicker(_ref) {
1386 let {
1387 name,
1388 property,
1389 value,
1390 onChange
1391 } = _ref;
1392 const colors = (0,external_wp_data_namespaceObject.useSelect)(select => {
1393 const {
1394 getSettings
1395 } = select(external_wp_blockEditor_namespaceObject.store);
1396 return (0,external_lodash_namespaceObject.get)(getSettings(), ['colors'], []);
1397 }, []);
1398 const onColorChange = (0,external_wp_element_namespaceObject.useCallback)(color => {
1399 onChange(setColors(value, name, colors, {
1400 [property]: color
1401 }));
1402 }, [colors, onChange, property]);
1403 const activeColors = (0,external_wp_element_namespaceObject.useMemo)(() => getActiveColors(value, name, colors), [name, value, colors]);
1404 return (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.ColorPalette, {
1405 value: activeColors[property],
1406 onChange: onColorChange
1407 });
1408 }
1409
1410 function InlineColorUI(_ref2) {
1411 let {
1412 name,
1413 value,
1414 onChange,
1415 onClose,
1416 contentRef
1417 } = _ref2;
1418
1419 /*
1420 As you change the text color by typing a HEX value into a field,
1421 the return value of document.getSelection jumps to the field you're editing,
1422 not the highlighted text. Given that useAnchorRef uses document.getSelection,
1423 it will return null, since it can't find the <mark> element within the HEX input.
1424 This caches the last truthy value of the selection anchor reference.
1425 */
1426 const anchorRef = (0,external_wp_blockEditor_namespaceObject.useCachedTruthy)((0,external_wp_richText_namespaceObject.useAnchorRef)({
1427 ref: contentRef,
1428 value,
1429 settings: text_color_textColor
1430 }));
1431 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Popover, {
1432 onClose: onClose,
1433 className: "components-inline-color-popover",
1434 anchorRef: anchorRef
1435 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.TabPanel, {
1436 tabs: [{
1437 name: 'color',
1438 title: (0,external_wp_i18n_namespaceObject.__)('Text')
1439 }, {
1440 name: 'backgroundColor',
1441 title: (0,external_wp_i18n_namespaceObject.__)('Background')
1442 }]
1443 }, tab => (0,external_wp_element_namespaceObject.createElement)(ColorPicker, {
1444 name: name,
1445 property: tab.name,
1446 value: value,
1447 onChange: onChange
1448 })));
1449 }
1450 //# sourceMappingURL=inline.js.map
1451 ;// CONCATENATED MODULE: ./packages/format-library/build-module/text-color/index.js
1452
1453
1454 /**
1455 * External dependencies
1456 */
1457
1458 /**
1459 * WordPress dependencies
1460 */
1461
1462
1463
1464
1465
1466
1467 /**
1468 * Internal dependencies
1469 */
1470
1471
1472 const transparentValue = 'rgba(0, 0, 0, 0)';
1473 const text_color_name = 'core/text-color';
1474
1475 const text_color_title = (0,external_wp_i18n_namespaceObject.__)('Highlight');
1476
1477 const EMPTY_ARRAY = [];
1478
1479 function getComputedStyleProperty(element, property) {
1480 const {
1481 ownerDocument
1482 } = element;
1483 const {
1484 defaultView
1485 } = ownerDocument;
1486 const style = defaultView.getComputedStyle(element);
1487 const value = style.getPropertyValue(property);
1488
1489 if (property === 'background-color' && value === transparentValue && element.parentElement) {
1490 return getComputedStyleProperty(element.parentElement, property);
1491 }
1492
1493 return value;
1494 }
1495
1496 function fillComputedColors(element, _ref) {
1497 let {
1498 color,
1499 backgroundColor
1500 } = _ref;
1501
1502 if (!color && !backgroundColor) {
1503 return;
1504 }
1505
1506 return {
1507 color: color || getComputedStyleProperty(element, 'color'),
1508 backgroundColor: backgroundColor === transparentValue ? getComputedStyleProperty(element, 'background-color') : backgroundColor
1509 };
1510 }
1511
1512 function TextColorEdit(_ref2) {
1513 let {
1514 value,
1515 onChange,
1516 isActive,
1517 activeAttributes,
1518 contentRef
1519 } = _ref2;
1520 const allowCustomControl = (0,external_wp_blockEditor_namespaceObject.useSetting)('color.custom');
1521 const colors = (0,external_wp_blockEditor_namespaceObject.useSetting)('color.palette') || EMPTY_ARRAY;
1522 const [isAddingColor, setIsAddingColor] = (0,external_wp_element_namespaceObject.useState)(false);
1523 const enableIsAddingColor = (0,external_wp_element_namespaceObject.useCallback)(() => setIsAddingColor(true), [setIsAddingColor]);
1524 const disableIsAddingColor = (0,external_wp_element_namespaceObject.useCallback)(() => setIsAddingColor(false), [setIsAddingColor]);
1525 const colorIndicatorStyle = (0,external_wp_element_namespaceObject.useMemo)(() => fillComputedColors(contentRef.current, getActiveColors(value, text_color_name, colors)), [value, colors]);
1526 const hasColorsToChoose = !(0,external_lodash_namespaceObject.isEmpty)(colors) || !allowCustomControl;
1527
1528 if (!hasColorsToChoose && !isActive) {
1529 return null;
1530 }
1531
1532 return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.RichTextToolbarButton, {
1533 className: "format-library-text-color-button",
1534 isActive: isActive,
1535 icon: (0,external_wp_element_namespaceObject.createElement)(icon, {
1536 icon: text_color,
1537 style: colorIndicatorStyle
1538 }),
1539 title: text_color_title // If has no colors to choose but a color is active remove the color onClick
1540 ,
1541 onClick: hasColorsToChoose ? enableIsAddingColor : () => onChange((0,external_wp_richText_namespaceObject.removeFormat)(value, text_color_name)),
1542 role: "menuitemcheckbox"
1543 }), isAddingColor && (0,external_wp_element_namespaceObject.createElement)(InlineColorUI, {
1544 name: text_color_name,
1545 onClose: disableIsAddingColor,
1546 activeAttributes: activeAttributes,
1547 value: value,
1548 onChange: onChange,
1549 contentRef: contentRef
1550 }));
1551 }
1552
1553 const text_color_textColor = {
1554 name: text_color_name,
1555 title: text_color_title,
1556 tagName: 'mark',
1557 className: 'has-inline-color',
1558 attributes: {
1559 style: 'style',
1560 class: 'class'
1561 },
1562
1563 /*
1564 * Since this format relies on the <mark> tag, it's important to
1565 * prevent the default yellow background color applied by most
1566 * browsers. The solution is to detect when this format is used with a
1567 * text color but no background color, and in such cases to override
1568 * the default styling with a transparent background.
1569 *
1570 * @see https://github.com/WordPress/gutenberg/pull/35516
1571 */
1572 __unstableFilterAttributeValue(key, value) {
1573 if (key !== 'style') return value; // We should not add a background-color if it's already set
1574
1575 if (value && value.includes('background-color')) return value;
1576 const addedCSS = ['background-color', transparentValue].join(':'); // Prepend `addedCSS` to avoid a double `;;` as any the existing CSS
1577 // rules will already include a `;`.
1578
1579 return value ? [addedCSS, value].join(';') : addedCSS;
1580 },
1581
1582 edit: TextColorEdit
1583 };
1584 //# sourceMappingURL=index.js.map
1585 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/subscript.js
1586
1587
1588 /**
1589 * WordPress dependencies
1590 */
1591
1592 const subscript = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
1593 xmlns: "http://www.w3.org/2000/svg",
1594 viewBox: "0 0 24 24"
1595 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
1596 d: "M16.9 18.3l.8-1.2c.4-.6.7-1.2.9-1.6.2-.4.3-.8.3-1.2 0-.3-.1-.7-.2-1-.1-.3-.4-.5-.6-.7-.3-.2-.6-.3-1-.3s-.8.1-1.1.2c-.3.1-.7.3-1 .6l.2 1.3c.3-.3.5-.5.8-.6s.6-.2.9-.2c.3 0 .5.1.7.2.2.2.2.4.2.7 0 .3-.1.5-.2.8-.1.3-.4.7-.8 1.3L15 19.4h4.3v-1.2h-2.4zM14.1 7.2h-2L9.5 11 6.9 7.2h-2l3.6 5.3L4.7 18h2l2.7-4 2.7 4h2l-3.8-5.5 3.8-5.3z"
1597 }));
1598 /* harmony default export */ var library_subscript = (subscript);
1599 //# sourceMappingURL=subscript.js.map
1600 ;// CONCATENATED MODULE: ./packages/format-library/build-module/subscript/index.js
1601
1602
1603 /**
1604 * WordPress dependencies
1605 */
1606
1607
1608
1609
1610 const subscript_name = 'core/subscript';
1611
1612 const subscript_title = (0,external_wp_i18n_namespaceObject.__)('Subscript');
1613
1614 const subscript_subscript = {
1615 name: subscript_name,
1616 title: subscript_title,
1617 tagName: 'sub',
1618 className: null,
1619
1620 edit(_ref) {
1621 let {
1622 isActive,
1623 value,
1624 onChange,
1625 onFocus
1626 } = _ref;
1627
1628 function onToggle() {
1629 onChange((0,external_wp_richText_namespaceObject.toggleFormat)(value, {
1630 type: subscript_name,
1631 title: subscript_title
1632 }));
1633 }
1634
1635 function onClick() {
1636 onToggle();
1637 onFocus();
1638 }
1639
1640 return (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.RichTextToolbarButton, {
1641 icon: library_subscript,
1642 title: subscript_title,
1643 onClick: onClick,
1644 isActive: isActive,
1645 role: "menuitemcheckbox"
1646 });
1647 }
1648
1649 };
1650 //# sourceMappingURL=index.js.map
1651 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/superscript.js
1652
1653
1654 /**
1655 * WordPress dependencies
1656 */
1657
1658 const superscript = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
1659 xmlns: "http://www.w3.org/2000/svg",
1660 viewBox: "0 0 24 24"
1661 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
1662 d: "M16.9 10.3l.8-1.3c.4-.6.7-1.2.9-1.6.2-.4.3-.8.3-1.2 0-.3-.1-.7-.2-1-.2-.2-.4-.4-.7-.6-.3-.2-.6-.3-1-.3s-.8.1-1.1.2c-.3.1-.7.3-1 .6l.1 1.3c.3-.3.5-.5.8-.6s.6-.2.9-.2c.3 0 .5.1.7.2.2.2.2.4.2.7 0 .3-.1.5-.2.8-.1.3-.4.7-.8 1.3l-1.8 2.8h4.3v-1.2h-2.2zm-2.8-3.1h-2L9.5 11 6.9 7.2h-2l3.6 5.3L4.7 18h2l2.7-4 2.7 4h2l-3.8-5.5 3.8-5.3z"
1663 }));
1664 /* harmony default export */ var library_superscript = (superscript);
1665 //# sourceMappingURL=superscript.js.map
1666 ;// CONCATENATED MODULE: ./packages/format-library/build-module/superscript/index.js
1667
1668
1669 /**
1670 * WordPress dependencies
1671 */
1672
1673
1674
1675
1676 const superscript_name = 'core/superscript';
1677
1678 const superscript_title = (0,external_wp_i18n_namespaceObject.__)('Superscript');
1679
1680 const superscript_superscript = {
1681 name: superscript_name,
1682 title: superscript_title,
1683 tagName: 'sup',
1684 className: null,
1685
1686 edit(_ref) {
1687 let {
1688 isActive,
1689 value,
1690 onChange,
1691 onFocus
1692 } = _ref;
1693
1694 function onToggle() {
1695 onChange((0,external_wp_richText_namespaceObject.toggleFormat)(value, {
1696 type: superscript_name,
1697 title: superscript_title
1698 }));
1699 }
1700
1701 function onClick() {
1702 onToggle();
1703 onFocus();
1704 }
1705
1706 return (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.RichTextToolbarButton, {
1707 icon: library_superscript,
1708 title: superscript_title,
1709 onClick: onClick,
1710 isActive: isActive,
1711 role: "menuitemcheckbox"
1712 });
1713 }
1714
1715 };
1716 //# sourceMappingURL=index.js.map
1717 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/button.js
1718
1719
1720 /**
1721 * WordPress dependencies
1722 */
1723
1724 const button_button = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
1725 viewBox: "0 0 24 24",
1726 xmlns: "http://www.w3.org/2000/svg"
1727 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
1728 d: "M19 6.5H5c-1.1 0-2 .9-2 2v7c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-7c0-1.1-.9-2-2-2zm.5 9c0 .3-.2.5-.5.5H5c-.3 0-.5-.2-.5-.5v-7c0-.3.2-.5.5-.5h14c.3 0 .5.2.5.5v7zM8 12.8h8v-1.5H8v1.5z"
1729 }));
1730 /* harmony default export */ var library_button = (button_button);
1731 //# sourceMappingURL=button.js.map
1732 ;// CONCATENATED MODULE: ./packages/format-library/build-module/keyboard/index.js
1733
1734
1735 /**
1736 * WordPress dependencies
1737 */
1738
1739
1740
1741
1742 const keyboard_name = 'core/keyboard';
1743
1744 const keyboard_title = (0,external_wp_i18n_namespaceObject.__)('Keyboard input');
1745
1746 const keyboard = {
1747 name: keyboard_name,
1748 title: keyboard_title,
1749 tagName: 'kbd',
1750 className: null,
1751
1752 edit(_ref) {
1753 let {
1754 isActive,
1755 value,
1756 onChange,
1757 onFocus
1758 } = _ref;
1759
1760 function onToggle() {
1761 onChange((0,external_wp_richText_namespaceObject.toggleFormat)(value, {
1762 type: keyboard_name,
1763 title: keyboard_title
1764 }));
1765 }
1766
1767 function onClick() {
1768 onToggle();
1769 onFocus();
1770 }
1771
1772 return (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.RichTextToolbarButton, {
1773 icon: library_button,
1774 title: keyboard_title,
1775 onClick: onClick,
1776 isActive: isActive,
1777 role: "menuitemcheckbox"
1778 });
1779 }
1780
1781 };
1782 //# sourceMappingURL=index.js.map
1783 ;// CONCATENATED MODULE: ./packages/format-library/build-module/default-formats.js
1784 /**
1785 * Internal dependencies
1786 */
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798 /* harmony default export */ var default_formats = ([bold, code_code, image_image, italic, build_module_link_link, strikethrough, underline, text_color_textColor, subscript_subscript, superscript_superscript, keyboard]);
1799 //# sourceMappingURL=default-formats.js.map
1800 ;// CONCATENATED MODULE: ./packages/format-library/build-module/index.js
1801 /**
1802 * WordPress dependencies
1803 */
1804
1805 /**
1806 * Internal dependencies
1807 */
1808
1809
1810 default_formats.forEach(_ref => {
1811 let {
1812 name,
1813 ...settings
1814 } = _ref;
1815 return (0,external_wp_richText_namespaceObject.registerFormatType)(name, settings);
1816 });
1817 //# sourceMappingURL=index.js.map
1818 (window.wp = window.wp || {}).formatLibrary = __webpack_exports__;
1819 /******/ })()
1820 ;