PluginProbe
Gutenberg / trunk
Gutenberg vtrunk
24.1.0 24.0.0 23.9.1 23.9.0 23.8.0 23.7.2 23.7.1 23.7.0 23.6.1 23.6.2 23.6.0 23.5.3 23.5.2 23.5.1 23.5.0 23.4.0 23.3.2 23.3.1 23.3.0 23.2.0 23.2.1 23.2.2 23.1.1 23.1.0 23.0.1 All 404 releases
← All changes | build/scripts/rich-text/index.js +501 -278 23.5.1 → trunk View file →
@@ -1,4 +1,5 @@
1 +(function() {
1 2 "use strict";
2 3 var wp;
3 4 (wp ||= {}).richText = (() => {
4 5 var __create = Object.create;
@@ -256,10 +257,10 @@
256 257 if (keys1.length !== keys2.length) {
257 258 return false;
258 259 }
259 260 const length = keys1.length;
260 - for (let i2 = 0; i2 < length; i2++) {
261 - const name = keys1[i2];
261 + for (let i = 0; i < length; i++) {
262 + const name = keys1[i];
262 263 if (attributes1[name] !== attributes2[name]) {
263 264 return false;
264 265 }
265 266 }
@@ -396,11 +397,11 @@
396 397 return EMPTY_ACTIVE_FORMATS3;
397 398 }
398 399 const selectedFormats = formats.slice(start, end);
399 400 const _activeFormats = [...selectedFormats[0]];
400 - let i2 = selectedFormats.length;
401 - while (i2--) {
402 - const formatsAtIndex = selectedFormats[i2];
401 + let i = selectedFormats.length;
402 + while (i--) {
403 + const formatsAtIndex = selectedFormats[i];
403 404 if (!formatsAtIndex) {
404 405 return EMPTY_ACTIVE_FORMATS3;
405 406 }
406 407 let ii = _activeFormats.length;
@@ -488,11 +489,11 @@
488 489 object: formatType.object,
489 490 attributes: restoreOnAttributes(elementAttributes, isEditableTree)
490 491 };
491 492 }
492 - function isEqualUntil(a2, b2, index) {
493 + function isEqualUntil(a, b, index) {
493 494 do {
494 - if (a2[index] !== b2[index]) {
495 + if (a[index] !== b[index]) {
495 496 return false;
496 497 }
497 498 } while (index--);
498 499 return true;
@@ -520,15 +521,15 @@
520 521 const deepestActiveFormat = activeFormats[activeFormats.length - 1];
521 522 let lastCharacterFormats;
522 523 let lastCharacter;
523 524 append3(tree, "");
524 - for (let i2 = 0; i2 < formatsLength; i2++) {
525 - const character = text.charAt(i2);
525 + for (let i = 0; i < formatsLength; i++) {
526 + const character = text.charAt(i);
526 527 const shouldInsertPadding = isEditableTree && // Pad the line if the line is empty.
527 528 (!lastCharacter || // Pad the line if the previous character is a line break, otherwise
528 529 // the line break won't be visible.
529 530 lastCharacter === "\n");
530 - const characterFormats = formats[i2];
531 + const characterFormats = formats[i];
531 532 let pointer = getLastChild3(tree);
532 533 if (characterFormats) {
533 534 characterFormats.forEach((format, formatIndex) => {
534 535 if (pointer && lastCharacterFormats && // Reuse the last element if all formats remain the same.
@@ -559,9 +560,9 @@
559 560 }
560 561 pointer = append3(newNode, "");
561 562 });
562 563 }
563 - if (i2 === 0) {
564 + if (i === 0) {
564 565 if (onStartIndex && start === 0) {
565 566 onStartIndex(tree, pointer);
566 567 }
567 568 if (onEndIndex && end === 0) {
@@ -568,9 +569,9 @@
568 569 onEndIndex(tree, pointer);
569 570 }
570 571 }
571 572 if (character === OBJECT_REPLACEMENT_CHARACTER) {
572 - const replacement = replacements[i2];
573 + const replacement = replacements[i];
573 574 if (!replacement) {
574 575 continue;
575 576 }
576 577 const { type, attributes, innerHTML } = replacement;
@@ -607,9 +608,9 @@
607 608 const attrs = {
608 609 contenteditable: "false",
609 610 "data-rich-text-bogus": true
610 611 };
611 - if (start === i2 && end === i2 + 1) {
612 + if (start === i && end === i + 1) {
612 613 attrs["data-rich-text-format-boundary"] = true;
613 614 }
614 615 pointer = append3(pointer, {
615 616 type: "span",
@@ -614,9 +615,9 @@
614 615 pointer = append3(pointer, {
615 616 type: "span",
616 617 attributes: attrs
617 618 });
618 - if (isEditableTree && i2 + 1 === text.length) {
619 + if (isEditableTree && i + 1 === text.length) {
619 620 append3(getParent3(pointer), ZWNBSP);
620 621 }
621 622 }
622 623 pointer = append3(
@@ -656,16 +657,16 @@
656 657 pointer = append3(getParent3(pointer), character);
657 658 } else {
658 659 appendText3(pointer, character);
659 660 }
660 - if (onStartIndex && start === i2 + 1) {
661 + if (onStartIndex && start === i + 1) {
661 662 onStartIndex(tree, pointer);
662 663 }
663 - if (onEndIndex && end === i2 + 1) {
664 + if (onEndIndex && end === i + 1) {
664 665 onEndIndex(tree, pointer);
665 666 }
666 - if (shouldInsertPadding && i2 === text.length) {
667 - append3(getParent3(pointer), ZWNBSP);
667 + if (shouldInsertPadding && i === text.length) {
668 + appendText3(pointer, ZWNBSP);
668 669 if (placeholder && text.length === 0) {
669 670 append3(getParent3(pointer), {
670 671 type: "span",
671 672 attributes: {
@@ -985,9 +986,9 @@
985 986 }
986 987 function collapseWhiteSpace(element, isRoot = true, hasPrecedingSpace = false, hasTrailingSpace = false) {
987 988 const clone = element.cloneNode(true);
988 989 clone.normalize();
989 - Array.from(clone.childNodes).forEach((node, i2, nodes) => {
990 + Array.from(clone.childNodes).forEach((node, i, nodes) => {
990 991 if (node.nodeType === node.TEXT_NODE) {
991 992 let newNodeValue = node.nodeValue;
992 993 if (/[\n\t\r\f]/.test(newNodeValue)) {
993 994 newNodeValue = newNodeValue.replace(/[\n\t\r\f]+/g, " ");
@@ -994,12 +995,12 @@
994 995 }
995 996 if (newNodeValue.indexOf(" ") !== -1) {
996 997 newNodeValue = newNodeValue.replace(/ {2,}/g, " ");
997 998 }
998 - if (i2 === 0 && newNodeValue.startsWith(" ") && (isRoot || hasPrecedingSpace)) {
999 + if (i === 0 && newNodeValue.startsWith(" ") && (isRoot || hasPrecedingSpace)) {
999 1000 newNodeValue = newNodeValue.slice(1);
1000 1001 }
1001 - if (i2 === nodes.length - 1 && newNodeValue.endsWith(" ") && (isRoot || hasTrailingSpace)) {
1002 + if (i === nodes.length - 1 && newNodeValue.endsWith(" ") && (isRoot || hasTrailingSpace)) {
1002 1003 newNodeValue = newNodeValue.slice(0, -1);
1003 1004 }
1004 1005 node.nodeValue = newNodeValue;
1005 1006 } else if (node.nodeType === node.ELEMENT_NODE) {
@@ -1162,10 +1163,10 @@
1162 1163 return;
1163 1164 }
1164 1165 const length = element.attributes.length;
1165 1166 let accumulator;
1166 - for (let i2 = 0; i2 < length; i2++) {
1167 - const { name, value } = element.attributes[i2];
1167 + for (let i = 0; i < length; i++) {
1168 + const { name, value } = element.attributes[i];
1168 1169 if (name.indexOf("data-rich-text-") === 0) {
1169 1170 continue;
1170 1171 }
1171 1172 const safeName = /^on/i.test(name) ? "data-disable-rich-text-" + name : name;
@@ -1175,13 +1176,13 @@
1175 1176 return accumulator;
1176 1177 }
1177 1178
1178 1179 // packages/rich-text/build-module/concat.mjs
1179 - function mergePair(a2, b2) {
1180 - a2.formats = a2.formats.concat(b2.formats);
1181 - a2.replacements = a2.replacements.concat(b2.replacements);
1182 - a2.text += b2.text;
1183 - return a2;
1180 + function mergePair(a, b) {
1181 + a.formats = a.formats.concat(b.formats);
1182 + a.replacements = a.replacements.concat(b.replacements);
1183 + a.text += b.text;
1184 + return a;
1184 1185 }
1185 1186 function concat(...values) {
1186 1187 return normaliseFormats(values.reduce(mergePair, create()));
1187 1188 }
@@ -1337,11 +1338,11 @@
1337 1338 endIndex++;
1338 1339 }
1339 1340 }
1340 1341 } else {
1341 - for (let i2 = startIndex; i2 < endIndex; i2++) {
1342 - if (newFormats[i2]) {
1343 - filterFormats(newFormats, i2, formatType);
1342 + for (let i = startIndex; i < endIndex; i++) {
1343 + if (newFormats[i]) {
1344 + filterFormats(newFormats, i, formatType);
1344 1345 }
1345 1346 }
1346 1347 }
1347 1348 return normaliseFormats({
@@ -1493,10 +1494,10 @@
1493 1494 return [before, after];
1494 1495 }
1495 1496
1496 1497 // packages/rich-text/build-module/is-range-equal.mjs
1497 - function isRangeEqual(a2, b2) {
1498 - return a2 === b2 || a2 && b2 && a2.startContainer === b2.startContainer && a2.startOffset === b2.startOffset && a2.endContainer === b2.endContainer && a2.endOffset === b2.endOffset;
1498 + function isRangeEqual(a, b) {
1499 + return a === b || a && b && a.startContainer === b.startContainer && a.startOffset === b.startOffset && a.endContainer === b.endContainer && a.endOffset === b.endOffset;
1499 1500 }
1500 1501
1501 1502 // packages/rich-text/build-module/to-dom.mjs
1502 1503 var MATHML_NAMESPACE = "http://www.w3.org/1998/Math/MathML";
@@ -1501,13 +1502,13 @@
1501 1502 // packages/rich-text/build-module/to-dom.mjs
1502 1503 var MATHML_NAMESPACE = "http://www.w3.org/1998/Math/MathML";
1503 1504 function createPathToNode(node, rootNode, path) {
1504 1505 const parentNode = node.parentNode;
1505 - let i2 = 0;
1506 + let i = 0;
1506 1507 while (node = node.previousSibling) {
1507 - i2++;
1508 + i++;
1508 1509 }
1509 - path = [i2, ...path];
1510 + path = [i, ...path];
1510 1511 if (parentNode !== rootNode) {
1511 1512 path = createPathToNode(parentNode, rootNode, path);
1512 1513 }
1513 1514 return path;
@@ -1641,12 +1642,12 @@
1641 1642 applySelection(selection, current);
1642 1643 }
1643 1644 }
1644 1645 function applyValue(future, current) {
1645 - let i2 = 0;
1646 + let i = 0;
1646 1647 let futureChild;
1647 1648 while (futureChild = future.firstChild) {
1648 - const currentChild = current.childNodes[i2];
1649 + const currentChild = current.childNodes[i];
1649 1650 if (!currentChild) {
1650 1651 current.appendChild(futureChild);
1651 1652 } else if (!currentChild.isEqualNode(futureChild)) {
1652 1653 if (currentChild.nodeName !== futureChild.nodeName || currentChild.nodeType === currentChild.TEXT_NODE && currentChild.data !== futureChild.data) {
@@ -1676,12 +1677,12 @@
1676 1677 }
1677 1678 } else {
1678 1679 future.removeChild(futureChild);
1679 1680 }
1680 - i2++;
1681 + i++;
1681 1682 }
1682 - while (current.childNodes[i2]) {
1683 - current.removeChild(current.childNodes[i2]);
1683 + while (current.childNodes[i]) {
1684 + current.removeChild(current.childNodes[i]);
1684 1685 }
1685 1686 }
1686 1687 function applySelection({ startPath, endPath }, current) {
1687 1688 const { node: startContainer, offset: startOffset } = getNodeByPath(
@@ -1749,9 +1750,9 @@
1749 1750 );
1750 1751
1751 1752 // packages/rich-text/build-module/hook/index.mjs
1752 1753 var import_element5 = __toESM(require_element(), 1);
1753 - var import_compose9 = __toESM(require_compose(), 1);
1754 + var import_compose8 = __toESM(require_compose(), 1);
1754 1755 var import_data9 = __toESM(require_data(), 1);
1755 1756 var import_deprecated = __toESM(require_deprecated(), 1);
1756 1757
1757 1758 // packages/rich-text/build-module/hook/use-default-style.mjs
@@ -1766,163 +1767,176 @@
1766 1767 }, []);
1767 1768 }
1768 1769
1769 1770 // node_modules/colord/index.mjs
1770 - var r = { grad: 0.9, turn: 360, rad: 360 / (2 * Math.PI) };
1771 - var t = function(r2) {
1771 + for (r = { grad: 0.9, turn: 360, rad: 360 / (2 * Math.PI) }, t = function(r2) {
1772 1772 return "string" == typeof r2 ? r2.length > 0 : "number" == typeof r2;
1773 - };
1774 - var n = function(r2, t2, n2) {
1773 + }, n = function(r2, t2, n2) {
1775 1774 return void 0 === t2 && (t2 = 0), void 0 === n2 && (n2 = Math.pow(10, t2)), Math.round(n2 * r2) / n2 + 0;
1776 - };
1777 - var e = function(r2, t2, n2) {
1775 + }, u = function(r2, t2, n2) {
1778 1776 return void 0 === t2 && (t2 = 0), void 0 === n2 && (n2 = 1), r2 > n2 ? n2 : r2 > t2 ? r2 : t2;
1779 - };
1780 - var u = function(r2) {
1781 - return (r2 = isFinite(r2) ? r2 % 360 : 0) > 0 ? r2 : r2 + 360;
1782 - };
1783 - var a = function(r2) {
1784 - return { r: e(r2.r, 0, 255), g: e(r2.g, 0, 255), b: e(r2.b, 0, 255), a: e(r2.a) };
1785 - };
1786 - var o = function(r2) {
1777 + }, e = function(r2) {
1778 + return (r2 = isFinite(r2) ? r2 % 360 : 0) < 0 ? r2 + 360 : r2;
1779 + }, o = function(r2, t2) {
1780 + return void 0 === t2 && (t2 = 0), n(r2, t2) % 360;
1781 + }, a = function(r2) {
1782 + return { r: u(r2.r, 0, 255), g: u(r2.g, 0, 255), b: u(r2.b, 0, 255), a: u(r2.a) };
1783 + }, i = function(r2) {
1787 1784 return { r: n(r2.r), g: n(r2.g), b: n(r2.b), a: n(r2.a, 3) };
1785 + }, s = /^#([0-9a-f]{3,8})$/i, d = function(r2, t2) {
1786 + var n2 = r2.charCodeAt(t2);
1787 + return (15 & n2) + 9 * (n2 >> 6);
1788 + }, h = function(r2, t2) {
1789 + return d(r2, t2) << 4 | d(r2, t2 + 1);
1790 + }, b = [], f = 0; f < 256; f++) b.push((f < 16 ? "0" : "") + f.toString(16));
1791 + var r;
1792 + var t;
1793 + var n;
1794 + var u;
1795 + var e;
1796 + var o;
1797 + var a;
1798 + var i;
1799 + var s;
1800 + var d;
1801 + var h;
1802 + var b;
1803 + var f;
1804 + var g = function(r) {
1805 + return b[u(r, 0, 255)];
1788 1806 };
1789 - var i = /^#([0-9a-f]{3,8})$/i;
1790 - var s = function(r2) {
1791 - var t2 = r2.toString(16);
1792 - return t2.length < 2 ? "0" + t2 : t2;
1807 + var c = function(r) {
1808 + var t = r.r, n = r.g, u = r.b, e = r.a, o = Math.max(t, n, u), a = o - Math.min(t, n, u), i = a ? o === t ? (n - u) / a : o === n ? 2 + (u - t) / a : 4 + (t - n) / a : 0;
1809 + return { h: 60 * (i < 0 ? i + 6 : i), s: o ? a / o * 100 : 0, v: o / 255 * 100, a: e };
1793 1810 };
1794 - var h = function(r2) {
1795 - var t2 = r2.r, n2 = r2.g, e2 = r2.b, u2 = r2.a, a2 = Math.max(t2, n2, e2), o2 = a2 - Math.min(t2, n2, e2), i2 = o2 ? a2 === t2 ? (n2 - e2) / o2 : a2 === n2 ? 2 + (e2 - t2) / o2 : 4 + (t2 - n2) / o2 : 0;
1796 - return { h: 60 * (i2 < 0 ? i2 + 6 : i2), s: a2 ? o2 / a2 * 100 : 0, v: a2 / 255 * 100, a: u2 };
1811 + var v = function(r) {
1812 + var t = r.h, n = r.s, u = r.v, e = r.a;
1813 + t = t / 360 * 6, n /= 100, u /= 100;
1814 + var o = Math.floor(t), a = u * (1 - n), i = u * (1 - (t - o) * n), s = u * (1 - (1 - t + o) * n), d = o % 6;
1815 + return { r: 255 * [u, i, a, a, s, u][d], g: 255 * [s, u, u, i, a, a][d], b: 255 * [a, a, s, u, u, i][d], a: e };
1797 1816 };
1798 - var b = function(r2) {
1799 - var t2 = r2.h, n2 = r2.s, e2 = r2.v, u2 = r2.a;
1800 - t2 = t2 / 360 * 6, n2 /= 100, e2 /= 100;
1801 - var a2 = Math.floor(t2), o2 = e2 * (1 - n2), i2 = e2 * (1 - (t2 - a2) * n2), s2 = e2 * (1 - (1 - t2 + a2) * n2), h2 = a2 % 6;
1802 - return { r: 255 * [e2, i2, o2, o2, s2, e2][h2], g: 255 * [s2, e2, e2, i2, o2, o2][h2], b: 255 * [o2, o2, s2, e2, e2, i2][h2], a: u2 };
1817 + var l = function(r) {
1818 + return { h: e(r.h), s: u(r.s, 0, 100), l: u(r.l, 0, 100), a: u(r.a) };
1803 1819 };
1804 - var g = function(r2) {
1805 - return { h: u(r2.h), s: e(r2.s, 0, 100), l: e(r2.l, 0, 100), a: e(r2.a) };
1820 + var p = function(r) {
1821 + return { h: o(r.h), s: n(r.s), l: n(r.l), a: n(r.a, 3) };
1806 1822 };
1807 - var d = function(r2) {
1808 - return { h: n(r2.h), s: n(r2.s), l: n(r2.l), a: n(r2.a, 3) };
1823 + var m = function(r) {
1824 + return v((n = (t = r).s, { h: t.h, s: (n *= ((u = t.l) < 50 ? u : 100 - u) / 100) > 0 ? 2 * n / (u + n) * 100 : 0, v: u + n, a: t.a }));
1825 + var t, n, u;
1809 1826 };
1810 - var f = function(r2) {
1811 - return b((n2 = (t2 = r2).s, { h: t2.h, s: (n2 *= ((e2 = t2.l) < 50 ? e2 : 100 - e2) / 100) > 0 ? 2 * n2 / (e2 + n2) * 100 : 0, v: e2 + n2, a: t2.a }));
1812 - var t2, n2, e2;
1827 + var y = function(r) {
1828 + return { h: (t = c(r)).h, s: (e = (200 - (n = t.s)) * (u = t.v) / 100) > 0 && e < 200 ? n * u / 100 / (e <= 100 ? e : 200 - e) * 100 : 0, l: e / 2, a: t.a };
1829 + var t, n, u, e;
1813 1830 };
1814 - var c = function(r2) {
1815 - return { h: (t2 = h(r2)).h, s: (u2 = (200 - (n2 = t2.s)) * (e2 = t2.v) / 100) > 0 && u2 < 200 ? n2 * e2 / 100 / (u2 <= 100 ? u2 : 200 - u2) * 100 : 0, l: u2 / 2, a: t2.a };
1816 - var t2, n2, e2, u2;
1817 - };
1818 - var l = /^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s*,\s*([+-]?\d*\.?\d+)%\s*,\s*([+-]?\d*\.?\d+)%\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i;
1819 - var p = /^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s+([+-]?\d*\.?\d+)%\s+([+-]?\d*\.?\d+)%\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i;
1820 - var v = /^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i;
1821 - var m = /^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i;
1822 - var y = { string: [[function(r2) {
1823 - var t2 = i.exec(r2);
1824 - return t2 ? (r2 = t2[1]).length <= 4 ? { r: parseInt(r2[0] + r2[0], 16), g: parseInt(r2[1] + r2[1], 16), b: parseInt(r2[2] + r2[2], 16), a: 4 === r2.length ? n(parseInt(r2[3] + r2[3], 16) / 255, 2) : 1 } : 6 === r2.length || 8 === r2.length ? { r: parseInt(r2.substr(0, 2), 16), g: parseInt(r2.substr(2, 2), 16), b: parseInt(r2.substr(4, 2), 16), a: 8 === r2.length ? n(parseInt(r2.substr(6, 2), 16) / 255, 2) : 1 } : null : null;
1825 - }, "hex"], [function(r2) {
1826 - var t2 = v.exec(r2) || m.exec(r2);
1827 - return t2 ? t2[2] !== t2[4] || t2[4] !== t2[6] ? null : a({ r: Number(t2[1]) / (t2[2] ? 100 / 255 : 1), g: Number(t2[3]) / (t2[4] ? 100 / 255 : 1), b: Number(t2[5]) / (t2[6] ? 100 / 255 : 1), a: void 0 === t2[7] ? 1 : Number(t2[7]) / (t2[8] ? 100 : 1) }) : null;
1828 - }, "rgb"], [function(t2) {
1829 - var n2 = l.exec(t2) || p.exec(t2);
1830 - if (!n2) return null;
1831 - var e2, u2, a2 = g({ h: (e2 = n2[1], u2 = n2[2], void 0 === u2 && (u2 = "deg"), Number(e2) * (r[u2] || 1)), s: Number(n2[3]), l: Number(n2[4]), a: void 0 === n2[5] ? 1 : Number(n2[5]) / (n2[6] ? 100 : 1) });
1832 - return f(a2);
1833 - }, "hsl"]], object: [[function(r2) {
1834 - var n2 = r2.r, e2 = r2.g, u2 = r2.b, o2 = r2.a, i2 = void 0 === o2 ? 1 : o2;
1835 - return t(n2) && t(e2) && t(u2) ? a({ r: Number(n2), g: Number(e2), b: Number(u2), a: Number(i2) }) : null;
1836 - }, "rgb"], [function(r2) {
1837 - var n2 = r2.h, e2 = r2.s, u2 = r2.l, a2 = r2.a, o2 = void 0 === a2 ? 1 : a2;
1838 - if (!t(n2) || !t(e2) || !t(u2)) return null;
1839 - var i2 = g({ h: Number(n2), s: Number(e2), l: Number(u2), a: Number(o2) });
1840 - return f(i2);
1841 - }, "hsl"], [function(r2) {
1842 - var n2 = r2.h, a2 = r2.s, o2 = r2.v, i2 = r2.a, s2 = void 0 === i2 ? 1 : i2;
1843 - if (!t(n2) || !t(a2) || !t(o2)) return null;
1844 - var h2 = (function(r3) {
1845 - return { h: u(r3.h), s: e(r3.s, 0, 100), v: e(r3.v, 0, 100), a: e(r3.a) };
1846 - })({ h: Number(n2), s: Number(a2), v: Number(o2), a: Number(s2) });
1847 - return b(h2);
1831 + var N = /^hsla?\(\s*([+-]?(?:\d*\.\d+|\d+))(deg|rad|grad|turn)?\s*,\s*([+-]?(?:\d*\.\d+|\d+))%\s*,\s*([+-]?(?:\d*\.\d+|\d+))%\s*(?:,\s*([+-]?(?:\d*\.\d+|\d+))(%)?\s*)?\)$/i;
1832 + var x = /^hsla?\(\s*([+-]?(?:\d*\.\d+|\d+))(deg|rad|grad|turn)?\s+([+-]?(?:\d*\.\d+|\d+))%\s+([+-]?(?:\d*\.\d+|\d+))%\s*(?:\/\s*([+-]?(?:\d*\.\d+|\d+))(%)?\s*)?\)$/i;
1833 + var M = /^rgba?\(\s*([+-]?(?:\d*\.\d+|\d+))(%)?\s*,\s*([+-]?(?:\d*\.\d+|\d+))(%)?\s*,\s*([+-]?(?:\d*\.\d+|\d+))(%)?\s*(?:,\s*([+-]?(?:\d*\.\d+|\d+))(%)?\s*)?\)$/i;
1834 + var H = /^rgba?\(\s*([+-]?(?:\d*\.\d+|\d+))(%)?\s+([+-]?(?:\d*\.\d+|\d+))(%)?\s+([+-]?(?:\d*\.\d+|\d+))(%)?\s*(?:\/\s*([+-]?(?:\d*\.\d+|\d+))(%)?\s*)?\)$/i;
1835 + var $ = { string: [[function(r) {
1836 + if (!s.test(r)) return null;
1837 + var t = r.length;
1838 + return t <= 5 ? { r: 17 * d(r, 1), g: 17 * d(r, 2), b: 17 * d(r, 3), a: 5 === t ? n(17 * d(r, 4) / 255, 2) : 1 } : 7 === t || 9 === t ? { r: h(r, 1), g: h(r, 3), b: h(r, 5), a: 9 === t ? n(h(r, 7) / 255, 2) : 1 } : null;
1839 + }, "hex"], [function(r) {
1840 + var t = M.exec(r) || H.exec(r);
1841 + return t ? t[2] !== t[4] || t[4] !== t[6] ? null : a({ r: Number(t[1]) / (t[2] ? 100 / 255 : 1), g: Number(t[3]) / (t[4] ? 100 / 255 : 1), b: Number(t[5]) / (t[6] ? 100 / 255 : 1), a: void 0 === t[7] ? 1 : Number(t[7]) / (t[8] ? 100 : 1) }) : null;
1842 + }, "rgb"], [function(t) {
1843 + var n = N.exec(t) || x.exec(t);
1844 + if (!n) return null;
1845 + var u, e, o = l({ h: (u = n[1], e = n[2], void 0 === e && (e = "deg"), Number(u) * (r[e] || 1)), s: Number(n[3]), l: Number(n[4]), a: void 0 === n[5] ? 1 : Number(n[5]) / (n[6] ? 100 : 1) });
1846 + return m(o);
1847 + }, "hsl"]], object: [[function(r) {
1848 + var n = r.r, u = r.g, e = r.b, o = r.a, i = void 0 === o ? 1 : o;
1849 + return t(n) && t(u) && t(e) ? a({ r: Number(n), g: Number(u), b: Number(e), a: Number(i) }) : null;
1850 + }, "rgb"], [function(r) {
1851 + var n = r.h, u = r.s, e = r.l, o = r.a, a = void 0 === o ? 1 : o;
1852 + if (!t(n) || !t(u) || !t(e)) return null;
1853 + var i = l({ h: Number(n), s: Number(u), l: Number(e), a: Number(a) });
1854 + return m(i);
1855 + }, "hsl"], [function(r) {
1856 + var n = r.h, o = r.s, a = r.v, i = r.a, s = void 0 === i ? 1 : i;
1857 + if (!t(n) || !t(o) || !t(a)) return null;
1858 + var d = (function(r2) {
1859 + return { h: e(r2.h), s: u(r2.s, 0, 100), v: u(r2.v, 0, 100), a: u(r2.a) };
1860 + })({ h: Number(n), s: Number(o), v: Number(a), a: Number(s) });
1861 + return v(d);
1848 1862 }, "hsv"]] };
1849 - var N = function(r2, t2) {
1850 - for (var n2 = 0; n2 < t2.length; n2++) {
1851 - var e2 = t2[n2][0](r2);
1852 - if (e2) return [e2, t2[n2][1]];
1863 + var j = function(r, t) {
1864 + for (var n = 0; n < t.length; n++) {
1865 + var u = t[n][0](r);
1866 + if (u) return [u, t[n][1]];
1853 1867 }
1854 1868 return [null, void 0];
1855 1869 };
1856 - var x = function(r2) {
1857 - return "string" == typeof r2 ? N(r2.trim(), y.string) : "object" == typeof r2 && null !== r2 ? N(r2, y.object) : [null, void 0];
1870 + var w = function(r) {
1871 + return "string" == typeof r ? j(r.trim(), $.string) : "object" == typeof r && null !== r ? j(r, $.object) : [null, void 0];
1858 1872 };
1859 - var M = function(r2, t2) {
1860 - var n2 = c(r2);
1861 - return { h: n2.h, s: e(n2.s + 100 * t2, 0, 100), l: n2.l, a: n2.a };
1873 + var k = function(r, t) {
1874 + var n = y(r);
1875 + return { h: n.h, s: u(n.s + 100 * t, 0, 100), l: n.l, a: n.a };
1862 1876 };
1863 - var H = function(r2) {
1864 - return (299 * r2.r + 587 * r2.g + 114 * r2.b) / 1e3 / 255;
1877 + var E = function(r) {
1878 + return (299 * r.r + 587 * r.g + 114 * r.b) / 1e3 / 255;
1865 1879 };
1866 - var $ = function(r2, t2) {
1867 - var n2 = c(r2);
1868 - return { h: n2.h, s: n2.s, l: e(n2.l + 100 * t2, 0, 100), a: n2.a };
1880 + var R = function(r, t) {
1881 + var n = y(r);
1882 + return { h: n.h, s: n.s, l: u(n.l + 100 * t, 0, 100), a: n.a };
1869 1883 };
1870 - var j = (function() {
1871 - function r2(r3) {
1872 - this.parsed = x(r3)[0], this.rgba = this.parsed || { r: 0, g: 0, b: 0, a: 1 };
1884 + var q = (function() {
1885 + function r(r2) {
1886 + this.parsed = w(r2)[0], this.rgba = this.parsed || { r: 0, g: 0, b: 0, a: 1 };
1873 1887 }
1874 - return r2.prototype.isValid = function() {
1888 + return r.prototype.isValid = function() {
1875 1889 return null !== this.parsed;
1876 - }, r2.prototype.brightness = function() {
1877 - return n(H(this.rgba), 2);
1878 - }, r2.prototype.isDark = function() {
1879 - return H(this.rgba) < 0.5;
1880 - }, r2.prototype.isLight = function() {
1881 - return H(this.rgba) >= 0.5;
1882 - }, r2.prototype.toHex = function() {
1883 - return r3 = o(this.rgba), t2 = r3.r, e2 = r3.g, u2 = r3.b, i2 = (a2 = r3.a) < 1 ? s(n(255 * a2)) : "", "#" + s(t2) + s(e2) + s(u2) + i2;
1884 - var r3, t2, e2, u2, a2, i2;
1885 - }, r2.prototype.toRgb = function() {
1886 - return o(this.rgba);
1887 - }, r2.prototype.toRgbString = function() {
1888 - return r3 = o(this.rgba), t2 = r3.r, n2 = r3.g, e2 = r3.b, (u2 = r3.a) < 1 ? "rgba(" + t2 + ", " + n2 + ", " + e2 + ", " + u2 + ")" : "rgb(" + t2 + ", " + n2 + ", " + e2 + ")";
1889 - var r3, t2, n2, e2, u2;
1890 - }, r2.prototype.toHsl = function() {
1891 - return d(c(this.rgba));
1892 - }, r2.prototype.toHslString = function() {
1893 - return r3 = d(c(this.rgba)), t2 = r3.h, n2 = r3.s, e2 = r3.l, (u2 = r3.a) < 1 ? "hsla(" + t2 + ", " + n2 + "%, " + e2 + "%, " + u2 + ")" : "hsl(" + t2 + ", " + n2 + "%, " + e2 + "%)";
1894 - var r3, t2, n2, e2, u2;
1895 - }, r2.prototype.toHsv = function() {
1896 - return r3 = h(this.rgba), { h: n(r3.h), s: n(r3.s), v: n(r3.v), a: n(r3.a, 3) };
1897 - var r3;
1898 - }, r2.prototype.invert = function() {
1899 - return w({ r: 255 - (r3 = this.rgba).r, g: 255 - r3.g, b: 255 - r3.b, a: r3.a });
1900 - var r3;
1901 - }, r2.prototype.saturate = function(r3) {
1902 - return void 0 === r3 && (r3 = 0.1), w(M(this.rgba, r3));
1903 - }, r2.prototype.desaturate = function(r3) {
1904 - return void 0 === r3 && (r3 = 0.1), w(M(this.rgba, -r3));
1905 - }, r2.prototype.grayscale = function() {
1906 - return w(M(this.rgba, -1));
1907 - }, r2.prototype.lighten = function(r3) {
1908 - return void 0 === r3 && (r3 = 0.1), w($(this.rgba, r3));
1909 - }, r2.prototype.darken = function(r3) {
1910 - return void 0 === r3 && (r3 = 0.1), w($(this.rgba, -r3));
1911 - }, r2.prototype.rotate = function(r3) {
1912 - return void 0 === r3 && (r3 = 15), this.hue(this.hue() + r3);
1913 - }, r2.prototype.alpha = function(r3) {
1914 - return "number" == typeof r3 ? w({ r: (t2 = this.rgba).r, g: t2.g, b: t2.b, a: r3 }) : n(this.rgba.a, 3);
1915 - var t2;
1916 - }, r2.prototype.hue = function(r3) {
1917 - var t2 = c(this.rgba);
1918 - return "number" == typeof r3 ? w({ h: r3, s: t2.s, l: t2.l, a: t2.a }) : n(t2.h);
1919 - }, r2.prototype.isEqual = function(r3) {
1920 - return this.toHex() === w(r3).toHex();
1921 - }, r2;
1890 + }, r.prototype.brightness = function() {
1891 + return n(E(this.rgba), 2);
1892 + }, r.prototype.isDark = function() {
1893 + return E(this.rgba) < 0.5;
1894 + }, r.prototype.isLight = function() {
1895 + return E(this.rgba) >= 0.5;
1896 + }, r.prototype.toHex = function() {
1897 + return r2 = i(this.rgba), t = r2.r, u = r2.g, e = r2.b, a = (o = r2.a) < 1 ? g(n(255 * o)) : "", "#" + g(t) + g(u) + g(e) + a;
1898 + var r2, t, u, e, o, a;
1899 + }, r.prototype.toRgb = function() {
1900 + return i(this.rgba);
1901 + }, r.prototype.toRgbString = function() {
1902 + return r2 = i(this.rgba), t = r2.r, n = r2.g, u = r2.b, (e = r2.a) < 1 ? "rgba(" + t + ", " + n + ", " + u + ", " + e + ")" : "rgb(" + t + ", " + n + ", " + u + ")";
1903 + var r2, t, n, u, e;
1904 + }, r.prototype.toHsl = function() {
1905 + return p(y(this.rgba));
1906 + }, r.prototype.toHslString = function() {
1907 + return r2 = p(y(this.rgba)), t = r2.h, n = r2.s, u = r2.l, (e = r2.a) < 1 ? "hsla(" + t + ", " + n + "%, " + u + "%, " + e + ")" : "hsl(" + t + ", " + n + "%, " + u + "%)";
1908 + var r2, t, n, u, e;
1909 + }, r.prototype.toHsv = function() {
1910 + return r2 = c(this.rgba), { h: o(r2.h), s: n(r2.s), v: n(r2.v), a: n(r2.a, 3) };
1911 + var r2;
1912 + }, r.prototype.invert = function() {
1913 + return A({ r: 255 - (r2 = this.rgba).r, g: 255 - r2.g, b: 255 - r2.b, a: r2.a });
1914 + var r2;
1915 + }, r.prototype.saturate = function(r2) {
1916 + return void 0 === r2 && (r2 = 0.1), A(k(this.rgba, r2));
1917 + }, r.prototype.desaturate = function(r2) {
1918 + return void 0 === r2 && (r2 = 0.1), A(k(this.rgba, -r2));
1919 + }, r.prototype.grayscale = function() {
1920 + return A(k(this.rgba, -1));
1921 + }, r.prototype.lighten = function(r2) {
1922 + return void 0 === r2 && (r2 = 0.1), A(R(this.rgba, r2));
1923 + }, r.prototype.darken = function(r2) {
1924 + return void 0 === r2 && (r2 = 0.1), A(R(this.rgba, -r2));
1925 + }, r.prototype.rotate = function(r2) {
1926 + return void 0 === r2 && (r2 = 15), this.hue(y(this.rgba).h + r2);
1927 + }, r.prototype.alpha = function(r2) {
1928 + return "number" == typeof r2 ? A({ r: (t = this.rgba).r, g: t.g, b: t.b, a: r2 }) : n(this.rgba.a, 3);
1929 + var t;
1930 + }, r.prototype.hue = function(r2) {
1931 + var t = y(this.rgba);
1932 + return "number" == typeof r2 ? A({ h: r2, s: t.s, l: t.l, a: t.a }) : o(t.h);
1933 + }, r.prototype.isEqual = function(r2) {
1934 + return this.toHex() === A(r2).toHex();
1935 + }, r;
1922 1936 })();
1923 - var w = function(r2) {
1924 - return r2 instanceof j ? r2 : new j(r2);
1937 + var A = function(r) {
1938 + return r instanceof q ? r : new q(r);
1925 1939 };
1926 1940
1927 1941 // packages/rich-text/build-module/hook/use-boundary-style.mjs
1928 1942 var import_element2 = __toESM(require_element(), 1);
@@ -1941,10 +1955,10 @@
1941 1955 }
1942 1956 const { ownerDocument } = element;
1943 1957 const { defaultView } = ownerDocument;
1944 1958 const computedStyle = defaultView.getComputedStyle(element);
1945 - const newColor = w(computedStyle.color).alpha(0.2).toRgbString();
1946 - const selector = `.rich-text:focus ${boundarySelector}`;
1959 + const newColor = A(computedStyle.color).alpha(0.2).toRgbString();
1960 + const selector = `[contenteditable="true"]:focus ${boundarySelector}`;
1947 1961 const rule = `background-color: ${newColor}`;
1948 1962 const style = `${selector} {${rule}}`;
1949 1963 const globalStyleId = "rich-text-boundary-style";
1950 1964 let globalStyle = ownerDocument.getElementById(globalStyleId);
@@ -1961,18 +1975,40 @@
1961 1975 }
1962 1976
1963 1977 // packages/rich-text/build-module/hook/event-listeners/index.mjs
1964 1978 var import_element3 = __toESM(require_element(), 1);
1965 - var import_compose8 = __toESM(require_compose(), 1);
1979 + var import_compose7 = __toESM(require_compose(), 1);
1966 1980
1967 1981 // packages/rich-text/build-module/hook/event-listeners/copy-handler.mjs
1968 1982 var import_compose = __toESM(require_compose(), 1);
1983 +
1984 + // packages/rich-text/build-module/owns-selection.mjs
1985 + function ownsSelection(element) {
1986 + const { ownerDocument } = element;
1987 + const { activeElement } = ownerDocument;
1988 + if (activeElement === element) {
1989 + return true;
1990 + }
1991 + if (!activeElement || activeElement.contentEditable !== "true" || element.contentEditable !== "true" || !activeElement.contains(element)) {
1992 + return false;
1993 + }
1994 + const selection = ownerDocument.defaultView.getSelection();
1995 + const { anchorNode, focusNode } = selection;
1996 + return !!anchorNode && !!focusNode && element.contains(anchorNode) && element.contains(focusNode);
1997 + }
1998 +
1999 + // packages/rich-text/build-module/hook/event-listeners/copy-handler.mjs
1969 2000 var { subscribeDelegatedListener } = unlock(import_compose.privateApis);
1970 2001 var copy_handler_default = (props) => (element) => {
1971 2002 function onCopy(event) {
1972 - const { record } = props.current;
2003 + const { record, handleChange } = props.current;
1973 2004 const { ownerDocument } = element;
1974 - if (isCollapsed(record.current) || !element.contains(ownerDocument.activeElement)) {
2005 + if (
2006 + // Another handler may have already claimed the clipboard, e.g.
2007 + // the block editor copying the whole block when its entire
2008 + // text is selected.
2009 + event.defaultPrevented || isCollapsed(record.current) || !element.contains(ownerDocument.activeElement) && !ownsSelection(element)
2010 + ) {
1975 2011 return;
1976 2012 }
1977 2013 const selectedRecord = slice(record.current);
1978 2014 const plainText = getTextContent(selectedRecord);
@@ -1981,9 +2017,9 @@
1981 2017 event.clipboardData.setData("text/html", html);
1982 2018 event.clipboardData.setData("rich-text", "true");
1983 2019 event.preventDefault();
1984 2020 if (event.type === "cut") {
1985 - ownerDocument.execCommand("delete");
2021 + handleChange(remove2(record.current));
1986 2022 }
1987 2023 }
1988 2024 const { defaultView } = element.ownerDocument;
1989 2025 const unsubscribeCopy = subscribeDelegatedListener(
@@ -2024,9 +2060,9 @@
2024 2060 selection.addRange(range);
2025 2061 event.preventDefault();
2026 2062 }
2027 2063 function onFocusIn(event) {
2028 - if (event.relatedTarget && !element.contains(event.relatedTarget) && event.relatedTarget.tagName === "A") {
2064 + if (event.relatedTarget && !element.contains(event.relatedTarget)) {
2029 2065 onClick(event);
2030 2066 }
2031 2067 }
2032 2068 const unsubscribeClick = subscribeDelegatedListener2(
@@ -2046,10 +2082,55 @@
2046 2082 };
2047 2083
2048 2084 // packages/rich-text/build-module/hook/event-listeners/format-boundaries.mjs
2049 2085 var import_keycodes = __toESM(require_keycodes(), 1);
2086 +
2087 + // packages/rich-text/build-module/subscribe-owned-listener.mjs
2050 2088 var import_compose3 = __toESM(require_compose(), 1);
2051 2089 var { subscribeDelegatedListener: subscribeDelegatedListener3 } = unlock(import_compose3.privateApis);
2090 + var registries = /* @__PURE__ */ new WeakMap();
2091 + function subscribeOwnedListener(element, eventType, callback, capture = false) {
2092 + const { ownerDocument } = element;
2093 + let byEvent = registries.get(ownerDocument);
2094 + if (!byEvent) {
2095 + byEvent = /* @__PURE__ */ new Map();
2096 + registries.set(ownerDocument, byEvent);
2097 + }
2098 + const key = capture ? `${eventType}:capture` : eventType;
2099 + let elements = byEvent.get(key);
2100 + if (!elements) {
2101 + elements = /* @__PURE__ */ new WeakMap();
2102 + byEvent.set(key, elements);
2103 + subscribeDelegatedListener3(
2104 + ownerDocument,
2105 + eventType,
2106 + (event) => {
2107 + const { defaultView, activeElement } = ownerDocument;
2108 + const anchorNode = defaultView?.getSelection()?.anchorNode;
2109 + for (let node = anchorNode ?? activeElement; node; node = node.parentNode) {
2110 + const callbacks = elements.get(node);
2111 + if (callbacks && ownsSelection(node)) {
2112 + for (const cb of callbacks) {
2113 + cb(event);
2114 + }
2115 + }
2116 + }
2117 + },
2118 + capture
2119 + );
2120 + }
2121 + let set = elements.get(element);
2122 + if (!set) {
2123 + set = /* @__PURE__ */ new Set();
2124 + elements.set(element, set);
2125 + }
2126 + set.add(callback);
2127 + return () => {
2128 + set.delete(callback);
2129 + };
2130 + }
2131 +
2132 + // packages/rich-text/build-module/hook/event-listeners/format-boundaries.mjs
2052 2133 var EMPTY_ACTIVE_FORMATS = [];
2053 2134 var format_boundaries_default = (props) => (element) => {
2054 2135 function onKeyDown(event) {
2055 2136 const { keyCode, shiftKey, altKey, metaKey, ctrlKey } = event;
@@ -2110,15 +2191,13 @@
2110 2191 record.current = newValue;
2111 2192 applyRecord(newValue);
2112 2193 forceRender();
2113 2194 }
2114 - return subscribeDelegatedListener3(element, "keydown", onKeyDown, true);
2195 + return subscribeOwnedListener(element, "keydown", onKeyDown, true);
2115 2196 };
2116 2197
2117 2198 // packages/rich-text/build-module/hook/event-listeners/delete.mjs
2118 2199 var import_keycodes2 = __toESM(require_keycodes(), 1);
2119 - var import_compose4 = __toESM(require_compose(), 1);
2120 - var { subscribeDelegatedListener: subscribeDelegatedListener4 } = unlock(import_compose4.privateApis);
2121 2200 var delete_default = (props) => (element) => {
2122 2201 function onKeyDown(event) {
2123 2202 const { keyCode } = event;
2124 2203 if (event.defaultPrevented) {
@@ -2134,13 +2213,13 @@
2134 2213 handleChange(remove2(currentValue));
2135 2214 event.preventDefault();
2136 2215 }
2137 2216 }
2138 - return subscribeDelegatedListener4(element, "keydown", onKeyDown);
2217 + return subscribeOwnedListener(element, "keydown", onKeyDown);
2139 2218 };
2140 2219
2141 2220 // packages/rich-text/build-module/hook/event-listeners/input-and-selection.mjs
2142 - var import_compose5 = __toESM(require_compose(), 1);
2221 + var import_compose4 = __toESM(require_compose(), 1);
2143 2222
2144 2223 // packages/rich-text/build-module/update-formats.mjs
2145 2224 function updateFormats({ value, start, end, formats }) {
2146 2225 const min = Math.min(start, end);
@@ -2169,9 +2248,9 @@
2169 2248 return value;
2170 2249 }
2171 2250
2172 2251 // packages/rich-text/build-module/hook/event-listeners/input-and-selection.mjs
2173 - var { subscribeDelegatedListener: subscribeDelegatedListener5 } = unlock(import_compose5.privateApis);
2252 + var { subscribeDelegatedListener: subscribeDelegatedListener4 } = unlock(import_compose4.privateApis);
2174 2253 var INSERTION_INPUT_TYPES_TO_IGNORE = /* @__PURE__ */ new Set([
2175 2254 "insertParagraph",
2176 2255 "insertOrderedList",
2177 2256 "insertUnorderedList",
@@ -2179,24 +2258,19 @@
2179 2258 "insertLink"
2180 2259 ]);
2181 2260 var EMPTY_ACTIVE_FORMATS2 = [];
2182 2261 var PLACEHOLDER_ATTR_NAME = "data-rich-text-placeholder";
2183 - function fixPlaceholderSelection(defaultView) {
2184 - const selection = defaultView.getSelection();
2185 - const { anchorNode, anchorOffset } = selection;
2186 - if (anchorNode.nodeType !== anchorNode.ELEMENT_NODE) {
2187 - return;
2188 - }
2189 - const targetNode = anchorNode.childNodes[anchorOffset];
2190 - if (!targetNode || targetNode.nodeType !== targetNode.ELEMENT_NODE || !targetNode.hasAttribute(PLACEHOLDER_ATTR_NAME)) {
2191 - return;
2192 - }
2193 - selection.collapseToStart();
2194 - }
2195 2262 var input_and_selection_default = (props) => (element) => {
2196 2263 const { ownerDocument } = element;
2197 2264 const { defaultView } = ownerDocument;
2198 2265 let isComposing = false;
2266 + let isPointerDown = false;
2267 + function onPointerDown() {
2268 + isPointerDown = true;
2269 + }
2270 + function onPointerUp() {
2271 + isPointerDown = false;
2272 + }
2199 2273 function onInput(event) {
2200 2274 if (isComposing) {
2201 2275 return;
2202 2276 }
@@ -2219,33 +2293,42 @@
2219 2293 formats: clearFormats ? [] : oldActiveFormats
2220 2294 });
2221 2295 handleChange(change);
2222 2296 }
2297 + let selectionSnapshot;
2223 2298 function handleSelectionChange() {
2224 2299 const { record, applyRecord, createRecord, onSelectionChange } = props.current;
2225 2300 if (element.contentEditable !== "true") {
2226 2301 return;
2227 2302 }
2228 - if (ownerDocument.activeElement !== element) {
2229 - ownerDocument.removeEventListener(
2230 - "selectionchange",
2231 - handleSelectionChange
2232 - );
2303 + if (ownerDocument.activeElement !== element && !ownsSelection(element)) {
2233 2304 return;
2234 2305 }
2235 2306 if (isComposing) {
2236 2307 return;
2237 2308 }
2309 + const selection = defaultView.getSelection();
2310 + if (selectionSnapshot && selectionSnapshot.anchorNode === selection.anchorNode && selectionSnapshot.anchorOffset === selection.anchorOffset && selectionSnapshot.focusNode === selection.focusNode && selectionSnapshot.focusOffset === selection.focusOffset && selectionSnapshot.processedStart === record.current.start && selectionSnapshot.processedEnd === record.current.end) {
2311 + return;
2312 + }
2238 2313 const { start, end, text } = createRecord();
2239 2314 const oldRecord = record.current;
2315 + if (text.length === 0) {
2316 + applyRecord({ ...oldRecord, start, end });
2317 + }
2318 + selectionSnapshot = {
2319 + anchorNode: selection.anchorNode,
2320 + anchorOffset: selection.anchorOffset,
2321 + focusNode: selection.focusNode,
2322 + focusOffset: selection.focusOffset,
2323 + processedStart: start,
2324 + processedEnd: end
2325 + };
2240 2326 if (text !== oldRecord.text) {
2241 2327 onInput();
2242 2328 return;
2243 2329 }
2244 2330 if (start === oldRecord.start && end === oldRecord.end) {
2245 - if (oldRecord.text.length === 0 && start === 0) {
2246 - fixPlaceholderSelection(defaultView);
2247 - }
2248 2331 return;
2249 2332 }
2250 2333 const newValue = {
2251 2334 ...oldRecord,
@@ -2267,21 +2350,13 @@
2267 2350 onSelectionChange(start, end);
2268 2351 }
2269 2352 function onCompositionStart() {
2270 2353 isComposing = true;
2271 - ownerDocument.removeEventListener(
2272 - "selectionchange",
2273 - handleSelectionChange
2274 - );
2275 2354 element.querySelector(`[${PLACEHOLDER_ATTR_NAME}]`)?.remove();
2276 2355 }
2277 2356 function onCompositionEnd() {
2278 2357 isComposing = false;
2279 2358 onInput({ inputType: "insertText" });
2280 - ownerDocument.addEventListener(
2281 - "selectionchange",
2282 - handleSelectionChange
2283 - );
2284 2359 }
2285 2360 function onFocus(event) {
2286 2361 if (event.target !== element) {
2287 2362 return;
@@ -2290,8 +2365,16 @@
2290 2365 return;
2291 2366 }
2292 2367 const { record, isSelected, onSelectionChange, applyRecord } = props.current;
2293 2368 if (element.parentElement.closest('[contenteditable="true"]')) {
2369 + const selection = defaultView.getSelection();
2370 + if (!selection.anchorNode || !element.contains(selection.anchorNode)) {
2371 + if (isSelected && record.current.start !== void 0) {
2372 + applyRecord(record.current);
2373 + } else {
2374 + selection.collapse(element, 0);
2375 + }
2376 + }
2294 2377 return;
2295 2378 }
2296 2379 if (!isSelected) {
2297 2380 const index = void 0;
@@ -2300,51 +2383,89 @@
2300 2383 start: index,
2301 2384 end: index,
2302 2385 activeFormats: EMPTY_ACTIVE_FORMATS2
2303 2386 };
2304 - } else {
2305 - applyRecord(record.current, { domOnly: true });
2387 + selectionSnapshot = void 0;
2388 + } else if (!isPointerDown) {
2389 + applyRecord(record.current);
2306 2390 }
2307 2391 onSelectionChange(record.current.start, record.current.end);
2308 2392 window.queueMicrotask(handleSelectionChange);
2309 - ownerDocument.addEventListener(
2310 - "selectionchange",
2311 - handleSelectionChange
2312 - );
2313 2393 }
2314 - const unsubscribeInput = subscribeDelegatedListener5(
2394 + const unsubscribeInput = subscribeOwnedListener(
2315 2395 element,
2316 2396 "input",
2317 2397 onInput,
2318 2398 true
2319 2399 );
2320 - const unsubscribeCompositionStart = subscribeDelegatedListener5(
2400 + const unsubscribeCompositionStart = subscribeOwnedListener(
2321 2401 element,
2322 2402 "compositionstart",
2323 2403 onCompositionStart
2324 2404 );
2325 - const unsubscribeCompositionEnd = subscribeDelegatedListener5(
2405 + const unsubscribeCompositionEnd = subscribeOwnedListener(
2326 2406 element,
2327 2407 "compositionend",
2328 2408 onCompositionEnd,
2329 2409 true
2330 2410 );
2331 - const unsubscribeFocus = subscribeDelegatedListener5(
2411 + const unsubscribeFocus = subscribeDelegatedListener4(
2332 2412 element,
2333 2413 "focusin",
2334 2414 onFocus
2335 2415 );
2416 + const unsubscribePointerDown = subscribeDelegatedListener4(
2417 + element,
2418 + "pointerdown",
2419 + onPointerDown
2420 + );
2421 + const unsubscribePointerUp = subscribeDelegatedListener4(
2422 + defaultView,
2423 + "pointerup",
2424 + onPointerUp
2425 + );
2426 + const unsubscribePointerCancel = subscribeDelegatedListener4(
2427 + defaultView,
2428 + "pointercancel",
2429 + onPointerUp
2430 + );
2431 + const unsubscribeSelectionChange = subscribeOwnedListener(
2432 + element,
2433 + "selectionchange",
2434 + handleSelectionChange
2435 + );
2436 + const unsubscribeEnsureSelectionSync = [
2437 + "keydown",
2438 + "beforeinput",
2439 + "copy",
2440 + "cut",
2441 + "paste"
2442 + ].map(
2443 + (eventType) => subscribeOwnedListener(
2444 + element,
2445 + eventType,
2446 + handleSelectionChange,
2447 + true
2448 + )
2449 + );
2336 2450 return () => {
2337 2451 unsubscribeInput();
2338 2452 unsubscribeCompositionStart();
2339 2453 unsubscribeCompositionEnd();
2340 2454 unsubscribeFocus();
2455 + unsubscribePointerDown();
2456 + unsubscribePointerUp();
2457 + unsubscribePointerCancel();
2458 + unsubscribeSelectionChange();
2459 + unsubscribeEnsureSelectionSync.forEach(
2460 + (unsubscribe) => unsubscribe()
2461 + );
2341 2462 };
2342 2463 };
2343 2464
2344 2465 // packages/rich-text/build-module/hook/event-listeners/selection-change-compat.mjs
2345 - var import_compose6 = __toESM(require_compose(), 1);
2346 - var { subscribeDelegatedListener: subscribeDelegatedListener6 } = unlock(import_compose6.privateApis);
2466 + var import_compose5 = __toESM(require_compose(), 1);
2467 + var { subscribeDelegatedListener: subscribeDelegatedListener5 } = unlock(import_compose5.privateApis);
2347 2468 var selection_change_compat_default = () => (element) => {
2348 2469 const { ownerDocument } = element;
2349 2470 const { defaultView } = ownerDocument;
2350 2471 const selection = defaultView?.getSelection();
@@ -2370,14 +2491,14 @@
2370 2491 ownerDocument.addEventListener("selectionchange", onCancel);
2371 2492 ownerDocument.addEventListener("input", onCancel);
2372 2493 range = getRange();
2373 2494 }
2374 - const unsubscribePointerDown = subscribeDelegatedListener6(
2495 + const unsubscribePointerDown = subscribeDelegatedListener5(
2375 2496 element,
2376 2497 "pointerdown",
2377 2498 onDown
2378 2499 );
2379 - const unsubscribeKeyDown = subscribeDelegatedListener6(
2500 + const unsubscribeKeyDown = subscribeDelegatedListener5(
2380 2501 element,
2381 2502 "keydown",
2382 2503 onDown
2383 2504 );
@@ -2387,10 +2508,10 @@
2387 2508 };
2388 2509 };
2389 2510
2390 2511 // packages/rich-text/build-module/hook/event-listeners/prevent-focus-capture.mjs
2391 - var import_compose7 = __toESM(require_compose(), 1);
2392 - var { subscribeDelegatedListener: subscribeDelegatedListener7 } = unlock(import_compose7.privateApis);
2512 + var import_compose6 = __toESM(require_compose(), 1);
2513 + var { subscribeDelegatedListener: subscribeDelegatedListener6 } = unlock(import_compose6.privateApis);
2393 2514 function preventFocusCapture() {
2394 2515 return (element) => {
2395 2516 const { ownerDocument } = element;
2396 2517 const { defaultView } = ownerDocument;
@@ -2404,31 +2525,44 @@
2404 2525 }
2405 2526 if (!event.target.contains(element)) {
2406 2527 return;
2407 2528 }
2529 + if (!event.target.closest("[data-block]")) {
2530 + return;
2531 + }
2408 2532 value = element.getAttribute("contenteditable");
2533 + defaultView.getSelection().removeAllRanges();
2409 2534 element.setAttribute("contenteditable", "false");
2410 - defaultView.getSelection().removeAllRanges();
2411 2535 }
2412 2536 function onPointerUp() {
2413 2537 if (value !== null) {
2414 2538 element.setAttribute("contenteditable", value);
2415 2539 value = null;
2540 + const selection = defaultView.getSelection();
2541 + if (selection.isCollapsed && element.contains(selection.anchorNode)) {
2542 + selection.removeAllRanges();
2543 + }
2416 2544 }
2417 2545 }
2418 - const unsubscribePointerDown = subscribeDelegatedListener7(
2546 + const unsubscribePointerDown = subscribeDelegatedListener6(
2419 2547 defaultView,
2420 2548 "pointerdown",
2421 2549 onPointerDown
2422 2550 );
2423 - const unsubscribePointerUp = subscribeDelegatedListener7(
2551 + const unsubscribePointerUp = subscribeDelegatedListener6(
2424 2552 defaultView,
2425 2553 "pointerup",
2426 2554 onPointerUp
2427 2555 );
2556 + const unsubscribePointerCancel = subscribeDelegatedListener6(
2557 + defaultView,
2558 + "pointercancel",
2559 + onPointerUp
2560 + );
2428 2561 return () => {
2429 2562 unsubscribePointerDown();
2430 2563 unsubscribePointerUp();
2564 + unsubscribePointerCancel();
2431 2565 };
2432 2566 };
2433 2567 }
2434 2568
@@ -2433,13 +2567,13 @@
2433 2567 }
2434 2568
2435 2569 // packages/rich-text/build-module/hook/event-listeners/index.mjs
2436 2570 var allEventListeners = [
2571 + input_and_selection_default,
2437 2572 copy_handler_default,
2438 2573 select_object_default,
2439 2574 format_boundaries_default,
2440 2575 delete_default,
2441 - input_and_selection_default,
2442 2576 selection_change_compat_default,
2443 2577 preventFocusCapture
2444 2578 ];
2445 2579 function useEventListeners(props) {
@@ -2450,9 +2584,9 @@
2450 2584 const refEffects = (0, import_element3.useMemo)(
2451 2585 () => allEventListeners.map((refEffect) => refEffect(propsRef)),
2452 2586 [propsRef]
2453 2587 );
2454 - return (0, import_compose8.useRefEffect)(
2588 + return (0, import_compose7.useRefEffect)(
2455 2589 (element) => {
2456 2590 const cleanups = refEffects.map((effect) => effect(element));
2457 2591 return () => {
2458 2592 cleanups.forEach((cleanup) => cleanup());
@@ -2585,8 +2719,12 @@
2585 2719 };
2586 2720 }
2587 2721
2588 2722 // packages/rich-text/build-module/hook/index.mjs
2723 + function hasFocus(element) {
2724 + const { activeElement } = element.ownerDocument;
2725 + return activeElement === element || activeElement?.contentEditable === "true" && activeElement.contains(element);
2726 + }
2589 2727 function useRichTextBase({
2590 2728 value = "",
2591 2729 selectionStart,
2592 2730 selectionEnd,
@@ -2651,14 +2789,11 @@
2651 2789 }
2652 2790 recordRef.current.start = selectionStart;
2653 2791 recordRef.current.end = selectionEnd;
2654 2792 }
2655 - const hadSelectionUpdateRef = (0, import_element5.useRef)(false);
2656 2793 if (!recordRef.current) {
2657 - hadSelectionUpdateRef.current = isSelected;
2658 2794 setRecordFromProps();
2659 2795 } else if (selectionStart !== recordRef.current.start || selectionEnd !== recordRef.current.end) {
2660 - hadSelectionUpdateRef.current = isSelected;
2661 2796 recordRef.current = {
2662 2797 ...recordRef.current,
2663 2798 start: selectionStart,
2664 2799 end: selectionEnd,
@@ -2664,8 +2799,13 @@
2664 2799 end: selectionEnd,
2665 2800 activeFormats: void 0
2666 2801 };
2667 2802 }
2803 + const sentSelectionRef = (0, import_element5.useRef)([]);
2804 + function sendSelection(start, end) {
2805 + sentSelectionRef.current = [start, end];
2806 + onSelectionChange(start, end);
2807 + }
2668 2808 function handleChange(newRecord) {
2669 2809 recordRef.current = newRecord;
2670 2810 applyRecord(newRecord);
2671 2811 if (disableFormats) {
@@ -2683,9 +2823,9 @@
2683 2823 }
2684 2824 }
2685 2825 const { start, end, formats, text } = recordRef.current;
2686 2826 registry.batch(() => {
2687 - onSelectionChange(start, end);
2827 + sendSelection(start, end);
2688 2828 onChange(_valueRef.current, {
2689 2829 __unstableFormats: formats,
2690 2830 __unstableText: text
2691 2831 });
@@ -2691,36 +2831,26 @@
2691 2831 });
2692 2832 });
2693 2833 forceRender();
2694 2834 }
2695 - function applyFromProps() {
2696 - const previousValue = _valueRef.current;
2697 - setRecordFromProps();
2698 - const contentLengthChanged = previousValue && typeof previousValue === "string" && typeof value === "string" && previousValue.length !== value.length;
2699 - const hasFocus = ref.current?.contains(
2700 - ref.current.ownerDocument.activeElement
2701 - );
2702 - const skipSelection = contentLengthChanged && !hasFocus;
2703 - applyRecord(recordRef.current, { domOnly: skipSelection });
2704 - }
2705 - const didMountRef = (0, import_element5.useRef)(false);
2706 2835 (0, import_element5.useLayoutEffect)(() => {
2707 - if (didMountRef.current && value !== _valueRef.current) {
2708 - applyFromProps();
2709 - forceRender();
2836 + if (value === _valueRef.current) {
2837 + return;
2710 2838 }
2839 + setRecordFromProps();
2840 + applyRecord(recordRef.current, {
2841 + domOnly: !hasFocus(ref.current)
2842 + });
2843 + forceRender();
2711 2844 }, [value]);
2712 2845 (0, import_element5.useLayoutEffect)(() => {
2713 - if (!hadSelectionUpdateRef.current) {
2714 - return;
2846 + const [sentStart, sentEnd] = sentSelectionRef.current;
2847 + sentSelectionRef.current = [];
2848 + if (isSelected && (selectionStart !== sentStart || selectionEnd !== sentEnd) && hasFocus(ref.current)) {
2849 + applyRecord(recordRef.current);
2715 2850 }
2716 - if (ref.current.ownerDocument.activeElement !== ref.current) {
2717 - ref.current.focus();
2718 - }
2719 - applyRecord(recordRef.current);
2720 - hadSelectionUpdateRef.current = false;
2721 - }, [hadSelectionUpdateRef.current]);
2722 - const mergedRefs = (0, import_compose9.useMergeRefs)([
2851 + }, [selectionStart, selectionEnd, isSelected]);
2852 + const mergedRefs = (0, import_compose8.useMergeRefs)([
2723 2853 ref,
2724 2854 useDefaultStyle(),
2725 2855 useBoundaryStyle({ record: recordRef }),
2726 2856 useEventListeners({
@@ -2728,15 +2858,20 @@
2728 2858 handleChange,
2729 2859 applyRecord,
2730 2860 createRecord,
2731 2861 isSelected,
2732 - onSelectionChange,
2862 + onSelectionChange: sendSelection,
2733 2863 forceRender
2734 2864 }),
2735 - (0, import_compose9.useRefEffect)(() => {
2736 - applyFromProps();
2737 - didMountRef.current = true;
2738 - }, [placeholder, ...__unstableDependencies])
2865 + (0, import_compose8.useRefEffect)(
2866 + (element) => {
2867 + setRecordFromProps();
2868 + applyRecord(recordRef.current, {
2869 + domOnly: !hasFocus(element)
2870 + });
2871 + },
2872 + [placeholder, ...__unstableDependencies]
2873 + )
2739 2874 ]);
2740 2875 return {
2741 2876 value: recordRef.current,
2742 2877 // A function to get the most recent value so event handlers in
@@ -2814,16 +2949,102 @@
2814 2949 });
2815 2950 return useRichTextBase(props);
2816 2951 }
2817 2952
2953 + // packages/rich-text/build-module/contexts.mjs
2954 + var import_element6 = __toESM(require_element(), 1);
2955 + var KeyboardShortcutContext = (0, import_element6.createContext)();
2956 + KeyboardShortcutContext.displayName = "KeyboardShortcutContext";
2957 + var InputEventContext = (0, import_element6.createContext)();
2958 + InputEventContext.displayName = "InputEventContext";
2959 +
2960 + // packages/rich-text/build-module/keyboard-shortcut.mjs
2961 + var import_keycodes3 = __toESM(require_keycodes(), 1);
2962 + var import_element7 = __toESM(require_element(), 1);
2963 + var import_compose9 = __toESM(require_compose(), 1);
2964 + function RichTextShortcut({ character, type, onUse }) {
2965 + const keyboardShortcuts = (0, import_element7.useContext)(KeyboardShortcutContext);
2966 + const stableOnUse = (0, import_compose9.useEvent)(onUse);
2967 + (0, import_element7.useEffect)(() => {
2968 + const shortcuts = keyboardShortcuts.current;
2969 + function callback(event) {
2970 + if (import_keycodes3.isKeyboardEvent[type](event, character)) {
2971 + stableOnUse();
2972 + event.preventDefault();
2973 + }
2974 + }
2975 + shortcuts.add(callback);
2976 + return () => {
2977 + shortcuts.delete(callback);
2978 + };
2979 + }, [character, type, keyboardShortcuts, stableOnUse]);
2980 + return null;
2981 + }
2982 +
2983 + // packages/rich-text/build-module/input-event.mjs
2984 + var import_element8 = __toESM(require_element(), 1);
2985 + var import_compose10 = __toESM(require_compose(), 1);
2986 + function RichTextInputEvent({ inputType, onInput }) {
2987 + const callbacks = (0, import_element8.useContext)(InputEventContext);
2988 + const stableOnInput = (0, import_compose10.useEvent)(onInput);
2989 + (0, import_element8.useEffect)(() => {
2990 + const inputCallbacks = callbacks.current;
2991 + function callback(event) {
2992 + if (event.inputType === inputType) {
2993 + stableOnInput();
2994 + event.preventDefault();
2995 + }
2996 + }
2997 + inputCallbacks.add(callback);
2998 + return () => {
2999 + inputCallbacks.delete(callback);
3000 + };
3001 + }, [inputType, callbacks, stableOnInput]);
3002 + return null;
3003 + }
3004 +
3005 + // packages/rich-text/build-module/event-listeners.mjs
3006 + var shortcutsListener = (props) => (element) => {
3007 + const { keyboardShortcuts } = props.current;
3008 + function onKeyDown(event) {
3009 + for (const keyboardShortcut of keyboardShortcuts.current) {
3010 + keyboardShortcut(event);
3011 + }
3012 + }
3013 + element.addEventListener("keydown", onKeyDown);
3014 + return () => {
3015 + element.removeEventListener("keydown", onKeyDown);
3016 + };
3017 + };
3018 + var inputEventsListener = (props) => (element) => {
3019 + const { inputEvents } = props.current;
3020 + function onInput(event) {
3021 + for (const inputEventHandler of inputEvents.current) {
3022 + inputEventHandler(event);
3023 + }
3024 + }
3025 + element.addEventListener("input", onInput);
3026 + return () => {
3027 + element.removeEventListener("input", onInput);
3028 + };
3029 + };
3030 +
2818 3031 // packages/rich-text/build-module/private-apis.mjs
2819 3032 var privateApis = {};
2820 3033 lock(privateApis, {
2821 - useRichText
3034 + useRichText,
3035 + KeyboardShortcutContext,
3036 + InputEventContext,
3037 + RichTextShortcut,
3038 + RichTextInputEvent,
3039 + shortcutsListener,
3040 + inputEventsListener,
3041 + ownsSelection,
3042 + subscribeOwnedListener
2822 3043 });
2823 3044
2824 3045 // packages/rich-text/build-module/hook/use-anchor-ref.mjs
2825 - var import_element6 = __toESM(require_element(), 1);
3046 + var import_element9 = __toESM(require_element(), 1);
2826 3047 var import_deprecated2 = __toESM(require_deprecated(), 1);
2827 3048 function useAnchorRef({ ref, value, settings = {} }) {
2828 3049 (0, import_deprecated2.default)("`useAnchorRef` hook", {
2829 3050 since: "6.1",
@@ -2830,9 +3051,9 @@
2830 3051 alternative: "`useAnchor` hook"
2831 3052 });
2832 3053 const { tagName, className, name } = settings;
2833 3054 const activeFormat = name ? getActiveFormat(value, name) : void 0;
2834 - return (0, import_element6.useMemo)(() => {
3055 + return (0, import_element9.useMemo)(() => {
2835 3056 if (!ref.current) {
2836 3057 return;
2837 3058 }
2838 3059 const {
@@ -2857,10 +3078,10 @@
2857 3078 }, [activeFormat, value.start, value.end, tagName, className]);
2858 3079 }
2859 3080
2860 3081 // packages/rich-text/build-module/hook/use-anchor.mjs
2861 - var import_compose10 = __toESM(require_compose(), 1);
2862 - var import_element7 = __toESM(require_element(), 1);
3082 + var import_compose11 = __toESM(require_compose(), 1);
3083 + var import_element10 = __toESM(require_element(), 1);
2863 3084 var import_dom = __toESM(require_dom(), 1);
2864 3085 function getFormatElement(range, editableContentElement, tagName, className) {
2865 3086 let element = range.startContainer;
2866 3087 if (element.nodeType === element.TEXT_NODE && element instanceof window.Text && range.startOffset === element.length && element.nextSibling) {
@@ -2939,13 +3160,13 @@
2939 3160 settings
2940 3161 }) {
2941 3162 const { tagName, className } = settings ?? DEFAULT_SETTINGS;
2942 3163 const isActive = !!(settings && "isActive" in settings && settings.isActive);
2943 - const [anchor, setAnchor] = (0, import_element7.useState)(
3164 + const [anchor, setAnchor] = (0, import_element10.useState)(
2944 3165 () => getAnchor(editableContentElement, tagName, className ?? "")
2945 3166 );
2946 - const wasActive = (0, import_compose10.usePrevious)(isActive);
2947 - (0, import_element7.useLayoutEffect)(() => {
3167 + const wasActive = (0, import_compose11.usePrevious)(isActive);
3168 + (0, import_element10.useLayoutEffect)(() => {
2948 3169 if (!editableContentElement) {
2949 3170 return;
2950 3171 }
2951 3172 function callback() {
@@ -2959,9 +3180,9 @@
2959 3180 function detach() {
2960 3181 ownerDocument.removeEventListener("selectionchange", callback);
2961 3182 }
2962 3183 const { ownerDocument } = editableContentElement;
2963 - if (editableContentElement === ownerDocument.activeElement || // When a link is created, we need to attach the popover to the newly created anchor.
3184 + if (ownsSelection(editableContentElement) || // When a link is created, we need to attach the popover to the newly created anchor.
2964 3185 !wasActive && isActive || // Sometimes we're _removing_ an active anchor, such as the inline color popover.
2965 3186 // When we add the color, it switches from a virtual anchor to a `<mark>` element.
2966 3187 // When we _remove_ the color, it switches from a `<mark>` element to a virtual anchor.
2967 3188 wasActive && !isActive) {
@@ -2984,6 +3205,8 @@
2984 3205 // packages/rich-text/build-module/index.mjs
2985 3206 function __experimentalRichText() {
2986 3207 }
2987 3208 return __toCommonJS(index_exports);
3209 +})();
3210 +(window.wp ||= {}).richText = wp.richText;
2988 3211 })();
2989 3212 //# sourceMappingURL=index.js.map