@wordpress/block-editor 14.3.1 → 14.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/README.md +2 -2
  2. package/build/components/block-heading-level-dropdown/index.js +3 -1
  3. package/build/components/block-heading-level-dropdown/index.js.map +1 -1
  4. package/build/components/block-list/block.js +27 -4
  5. package/build/components/block-list/block.js.map +1 -1
  6. package/build/components/block-list/use-block-props/use-focus-first-element.js +0 -1
  7. package/build/components/block-list/use-block-props/use-focus-first-element.js.map +1 -1
  8. package/build/components/block-list/use-block-props/use-zoom-out-mode-exit.js +9 -4
  9. package/build/components/block-list/use-block-props/use-zoom-out-mode-exit.js.map +1 -1
  10. package/build/components/block-list/zoom-out-separator.js +18 -1
  11. package/build/components/block-list/zoom-out-separator.js.map +1 -1
  12. package/build/components/block-switcher/utils.js +1 -1
  13. package/build/components/block-switcher/utils.js.map +1 -1
  14. package/build/components/block-tools/zoom-out-toolbar.js +5 -2
  15. package/build/components/block-tools/zoom-out-toolbar.js.map +1 -1
  16. package/build/components/block-variation-transforms/index.js +12 -6
  17. package/build/components/block-variation-transforms/index.js.map +1 -1
  18. package/build/components/rich-text/event-listeners/paste-handler.js +2 -13
  19. package/build/components/rich-text/event-listeners/paste-handler.js.map +1 -1
  20. package/build/components/rich-text/index.js +34 -20
  21. package/build/components/rich-text/index.js.map +1 -1
  22. package/build/components/tool-selector/index.js +2 -1
  23. package/build/components/tool-selector/index.js.map +1 -1
  24. package/build/components/writing-flow/index.js +1 -2
  25. package/build/components/writing-flow/index.js.map +1 -1
  26. package/build/components/writing-flow/use-arrow-nav.js +1 -4
  27. package/build/components/writing-flow/use-arrow-nav.js.map +1 -1
  28. package/build/components/writing-flow/use-input.js +1 -31
  29. package/build/components/writing-flow/use-input.js.map +1 -1
  30. package/build/components/writing-flow/use-select-all.js +1 -14
  31. package/build/components/writing-flow/use-select-all.js.map +1 -1
  32. package/build/components/writing-flow/use-selection-observer.js +2 -6
  33. package/build/components/writing-flow/use-selection-observer.js.map +1 -1
  34. package/build/components/writing-flow/utils.js +0 -27
  35. package/build/components/writing-flow/utils.js.map +1 -1
  36. package/build/hooks/layout.js +12 -8
  37. package/build/hooks/layout.js.map +1 -1
  38. package/build/hooks/use-bindings-attributes.js +22 -28
  39. package/build/hooks/use-bindings-attributes.js.map +1 -1
  40. package/build/hooks/use-zoom-out.js +20 -23
  41. package/build/hooks/use-zoom-out.js.map +1 -1
  42. package/build/store/private-actions.js +25 -0
  43. package/build/store/private-actions.js.map +1 -1
  44. package/build/store/private-selectors.js +22 -0
  45. package/build/store/private-selectors.js.map +1 -1
  46. package/build/store/reducer.js +21 -1
  47. package/build/store/reducer.js.map +1 -1
  48. package/build/store/selectors.js +12 -5
  49. package/build/store/selectors.js.map +1 -1
  50. package/build-module/components/block-heading-level-dropdown/index.js +3 -1
  51. package/build-module/components/block-heading-level-dropdown/index.js.map +1 -1
  52. package/build-module/components/block-list/block.js +28 -7
  53. package/build-module/components/block-list/block.js.map +1 -1
  54. package/build-module/components/block-list/use-block-props/use-focus-first-element.js +0 -1
  55. package/build-module/components/block-list/use-block-props/use-focus-first-element.js.map +1 -1
  56. package/build-module/components/block-list/use-block-props/use-zoom-out-mode-exit.js +9 -4
  57. package/build-module/components/block-list/use-block-props/use-zoom-out-mode-exit.js.map +1 -1
  58. package/build-module/components/block-list/zoom-out-separator.js +18 -1
  59. package/build-module/components/block-list/zoom-out-separator.js.map +1 -1
  60. package/build-module/components/block-switcher/utils.js +1 -1
  61. package/build-module/components/block-switcher/utils.js.map +1 -1
  62. package/build-module/components/block-tools/zoom-out-toolbar.js +5 -2
  63. package/build-module/components/block-tools/zoom-out-toolbar.js.map +1 -1
  64. package/build-module/components/block-variation-transforms/index.js +12 -6
  65. package/build-module/components/block-variation-transforms/index.js.map +1 -1
  66. package/build-module/components/rich-text/event-listeners/paste-handler.js +2 -13
  67. package/build-module/components/rich-text/event-listeners/paste-handler.js.map +1 -1
  68. package/build-module/components/rich-text/index.js +34 -20
  69. package/build-module/components/rich-text/index.js.map +1 -1
  70. package/build-module/components/tool-selector/index.js +2 -1
  71. package/build-module/components/tool-selector/index.js.map +1 -1
  72. package/build-module/components/writing-flow/index.js +1 -2
  73. package/build-module/components/writing-flow/index.js.map +1 -1
  74. package/build-module/components/writing-flow/use-arrow-nav.js +1 -4
  75. package/build-module/components/writing-flow/use-arrow-nav.js.map +1 -1
  76. package/build-module/components/writing-flow/use-input.js +1 -31
  77. package/build-module/components/writing-flow/use-input.js.map +1 -1
  78. package/build-module/components/writing-flow/use-select-all.js +1 -14
  79. package/build-module/components/writing-flow/use-select-all.js.map +1 -1
  80. package/build-module/components/writing-flow/use-selection-observer.js +2 -6
  81. package/build-module/components/writing-flow/use-selection-observer.js.map +1 -1
  82. package/build-module/components/writing-flow/utils.js +0 -26
  83. package/build-module/components/writing-flow/utils.js.map +1 -1
  84. package/build-module/hooks/layout.js +13 -9
  85. package/build-module/hooks/layout.js.map +1 -1
  86. package/build-module/hooks/use-bindings-attributes.js +22 -28
  87. package/build-module/hooks/use-bindings-attributes.js.map +1 -1
  88. package/build-module/hooks/use-zoom-out.js +20 -23
  89. package/build-module/hooks/use-zoom-out.js.map +1 -1
  90. package/build-module/store/private-actions.js +23 -0
  91. package/build-module/store/private-actions.js.map +1 -1
  92. package/build-module/store/private-selectors.js +20 -0
  93. package/build-module/store/private-selectors.js.map +1 -1
  94. package/build-module/store/reducer.js +20 -1
  95. package/build-module/store/reducer.js.map +1 -1
  96. package/build-module/store/selectors.js +12 -5
  97. package/build-module/store/selectors.js.map +1 -1
  98. package/build-style/content-rtl.css +10 -0
  99. package/build-style/content.css +10 -0
  100. package/build-style/style-rtl.css +4 -0
  101. package/build-style/style.css +4 -0
  102. package/package.json +20 -20
  103. package/src/components/block-heading-level-dropdown/index.js +7 -1
  104. package/src/components/block-list/block.js +47 -11
  105. package/src/components/block-list/content.scss +12 -0
  106. package/src/components/block-list/use-block-props/use-focus-first-element.js +0 -1
  107. package/src/components/block-list/use-block-props/use-zoom-out-mode-exit.js +7 -3
  108. package/src/components/block-list/zoom-out-separator.js +14 -1
  109. package/src/components/block-switcher/test/use-transformed.patterns.js +3 -3
  110. package/src/components/block-switcher/test/utils.js +3 -3
  111. package/src/components/block-switcher/utils.js +1 -1
  112. package/src/components/block-toolbar/style.scss +7 -0
  113. package/src/components/block-tools/zoom-out-toolbar.js +5 -2
  114. package/src/components/block-variation-transforms/index.js +13 -4
  115. package/src/components/rich-text/event-listeners/paste-handler.js +2 -7
  116. package/src/components/rich-text/index.js +36 -23
  117. package/src/components/tool-selector/index.js +4 -1
  118. package/src/components/writing-flow/index.js +0 -2
  119. package/src/components/writing-flow/use-arrow-nav.js +2 -9
  120. package/src/components/writing-flow/use-input.js +1 -36
  121. package/src/components/writing-flow/use-select-all.js +1 -18
  122. package/src/components/writing-flow/use-selection-observer.js +3 -14
  123. package/src/components/writing-flow/utils.js +0 -30
  124. package/src/hooks/layout.js +17 -12
  125. package/src/hooks/use-bindings-attributes.js +26 -32
  126. package/src/hooks/use-zoom-out.js +21 -27
  127. package/src/store/private-actions.js +23 -0
  128. package/src/store/private-selectors.js +20 -0
  129. package/src/store/reducer.js +20 -0
  130. package/src/store/selectors.js +13 -8
  131. package/src/store/test/private-selectors.js +2 -2
  132. package/src/store/test/selectors.js +10 -6
  133. package/build/components/writing-flow/use-event-redirect.js +0 -66
  134. package/build/components/writing-flow/use-event-redirect.js.map +0 -1
  135. package/build-module/components/writing-flow/use-event-redirect.js +0 -60
  136. package/build-module/components/writing-flow/use-event-redirect.js.map +0 -1
  137. package/src/components/writing-flow/use-event-redirect.js +0 -72
@@ -12,7 +12,6 @@ var _data = require("@wordpress/data");
12
12
  var _compose = require("@wordpress/compose");
13
13
  var _dom2 = require("../../utils/dom");
14
14
  var _store = require("../../store");
15
- var _utils = require("./utils");
16
15
  /**
17
16
  * WordPress dependencies
18
17
  */
@@ -148,6 +147,7 @@ function useArrowNav() {
148
147
  }
149
148
  const {
150
149
  keyCode,
150
+ target,
151
151
  shiftKey,
152
152
  ctrlKey,
153
153
  altKey,
@@ -193,7 +193,6 @@ function useArrowNav() {
193
193
  }
194
194
  return;
195
195
  }
196
- const target = ownerDocument.activeElement === node ? (0, _utils.getSelectionRoot)(ownerDocument) : event.target;
197
196
 
198
197
  // Abort if our current target is not a candidate for navigation
199
198
  // (e.g. preserve native input behaviors).
@@ -230,7 +229,6 @@ function useArrowNav() {
230
229
  // When Alt is pressed, only intercept if the caret is also at
231
230
  // the horizontal edge.
232
231
  altKey ? (0, _dom.isHorizontalEdge)(target, isReverseDir) : true) && !keepCaretInsideBlock) {
233
- node.contentEditable = false;
234
232
  const closestTabbable = getClosestTabbable(target, isReverse, node, true);
235
233
  if (closestTabbable) {
236
234
  (0, _dom.placeCaretAtVerticalEdge)(closestTabbable,
@@ -240,7 +238,6 @@ function useArrowNav() {
240
238
  event.preventDefault();
241
239
  }
242
240
  } else if (isHorizontal && defaultView.getSelection().isCollapsed && (0, _dom.isHorizontalEdge)(target, isReverseDir) && !keepCaretInsideBlock) {
243
- node.contentEditable = false;
244
241
  const closestTabbable = getClosestTabbable(target, isReverseDir, node);
245
242
  (0, _dom.placeCaretAtHorizontalEdge)(closestTabbable, isReverse);
246
243
  event.preventDefault();
@@ -1 +1 @@
1
- {"version":3,"names":["_dom","require","_keycodes","_data","_compose","_dom2","_store","_utils","isNavigationCandidate","element","keyCode","hasModifier","isVertical","UP","DOWN","tagName","elementType","getAttribute","verticalInputTypes","includes","simpleInputTypes","getClosestTabbable","target","isReverse","containerElement","onlyVertical","focusableNodes","focus","focusable","find","reverse","slice","indexOf","targetRect","getBoundingClientRect","isTabCandidate","node","closest","children","length","isInSameBlock","firstElementChild","tabbable","isTabbableIndex","isContentEditable","contentEditable","nodeRect","left","right","useArrowNav","getMultiSelectedBlocksStartClientId","getMultiSelectedBlocksEndClientId","getSettings","hasMultiSelection","__unstableIsFullySelected","useSelect","blockEditorStore","selectBlock","useDispatch","useRefEffect","verticalRect","onMouseDown","isClosestTabbableABlock","closestTabbable","getBlockClientId","onKeyDown","event","defaultPrevented","shiftKey","ctrlKey","altKey","metaKey","isUp","isDown","isLeft","LEFT","isRight","RIGHT","isHorizontal","isNav","isNavEdge","isVerticalEdge","isHorizontalEdge","ownerDocument","defaultView","preventDefault","activeElement","getSelectionRoot","computeCaretRect","isReverseDir","isRTL","keepCaretInsideBlock","placeCaretAtVerticalEdge","undefined","getSelection","isCollapsed","placeCaretAtHorizontalEdge","addEventListener","removeEventListener"],"sources":["@wordpress/block-editor/src/components/writing-flow/use-arrow-nav.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport {\n\tcomputeCaretRect,\n\tfocus,\n\tisHorizontalEdge,\n\tisVerticalEdge,\n\tplaceCaretAtHorizontalEdge,\n\tplaceCaretAtVerticalEdge,\n\tisRTL,\n} from '@wordpress/dom';\nimport { UP, DOWN, LEFT, RIGHT } from '@wordpress/keycodes';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { useRefEffect } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport { getBlockClientId, isInSameBlock } from '../../utils/dom';\nimport { store as blockEditorStore } from '../../store';\nimport { getSelectionRoot } from './utils';\n\n/**\n * Returns true if the element should consider edge navigation upon a keyboard\n * event of the given directional key code, or false otherwise.\n *\n * @param {Element} element HTML element to test.\n * @param {number} keyCode KeyboardEvent keyCode to test.\n * @param {boolean} hasModifier Whether a modifier is pressed.\n *\n * @return {boolean} Whether element should consider edge navigation.\n */\nexport function isNavigationCandidate( element, keyCode, hasModifier ) {\n\tconst isVertical = keyCode === UP || keyCode === DOWN;\n\tconst { tagName } = element;\n\tconst elementType = element.getAttribute( 'type' );\n\n\t// Native inputs should not navigate vertically, unless they are simple types that don't need up/down arrow keys.\n\tif ( isVertical && ! hasModifier ) {\n\t\tif ( tagName === 'INPUT' ) {\n\t\t\tconst verticalInputTypes = [\n\t\t\t\t'date',\n\t\t\t\t'datetime-local',\n\t\t\t\t'month',\n\t\t\t\t'number',\n\t\t\t\t'range',\n\t\t\t\t'time',\n\t\t\t\t'week',\n\t\t\t];\n\t\t\treturn ! verticalInputTypes.includes( elementType );\n\t\t}\n\t\treturn true;\n\t}\n\n\t// Native inputs should not navigate horizontally, unless they are simple types that don't need left/right arrow keys.\n\tif ( tagName === 'INPUT' ) {\n\t\tconst simpleInputTypes = [\n\t\t\t'button',\n\t\t\t'checkbox',\n\t\t\t'number',\n\t\t\t'color',\n\t\t\t'file',\n\t\t\t'image',\n\t\t\t'radio',\n\t\t\t'reset',\n\t\t\t'submit',\n\t\t];\n\t\treturn simpleInputTypes.includes( elementType );\n\t}\n\n\t// Native textareas should not navigate horizontally.\n\treturn tagName !== 'TEXTAREA';\n}\n\n/**\n * Returns the optimal tab target from the given focused element in the desired\n * direction. A preference is made toward text fields, falling back to the block\n * focus stop if no other candidates exist for the block.\n *\n * @param {Element} target Currently focused text field.\n * @param {boolean} isReverse True if considering as the first field.\n * @param {Element} containerElement Element containing all blocks.\n * @param {boolean} onlyVertical Whether to only consider tabbable elements\n * that are visually above or under the\n * target.\n *\n * @return {?Element} Optimal tab target, if one exists.\n */\nexport function getClosestTabbable(\n\ttarget,\n\tisReverse,\n\tcontainerElement,\n\tonlyVertical\n) {\n\t// Since the current focus target is not guaranteed to be a text field, find\n\t// all focusables. Tabbability is considered later.\n\tlet focusableNodes = focus.focusable.find( containerElement );\n\n\tif ( isReverse ) {\n\t\tfocusableNodes.reverse();\n\t}\n\n\t// Consider as candidates those focusables after the current target. It's\n\t// assumed this can only be reached if the target is focusable (on its\n\t// keydown event), so no need to verify it exists in the set.\n\tfocusableNodes = focusableNodes.slice(\n\t\tfocusableNodes.indexOf( target ) + 1\n\t);\n\n\tlet targetRect;\n\n\tif ( onlyVertical ) {\n\t\ttargetRect = target.getBoundingClientRect();\n\t}\n\n\tfunction isTabCandidate( node ) {\n\t\tif ( node.closest( '[inert]' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Skip if there's only one child that is content editable (and thus a\n\t\t// better candidate).\n\t\tif (\n\t\t\tnode.children.length === 1 &&\n\t\t\tisInSameBlock( node, node.firstElementChild ) &&\n\t\t\tnode.firstElementChild.getAttribute( 'contenteditable' ) === 'true'\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Not a candidate if the node is not tabbable.\n\t\tif ( ! focus.tabbable.isTabbableIndex( node ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Skip focusable elements such as links within content editable nodes.\n\t\tif ( node.isContentEditable && node.contentEditable !== 'true' ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( onlyVertical ) {\n\t\t\tconst nodeRect = node.getBoundingClientRect();\n\n\t\t\tif (\n\t\t\t\tnodeRect.left >= targetRect.right ||\n\t\t\t\tnodeRect.right <= targetRect.left\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\treturn focusableNodes.find( isTabCandidate );\n}\n\nexport default function useArrowNav() {\n\tconst {\n\t\tgetMultiSelectedBlocksStartClientId,\n\t\tgetMultiSelectedBlocksEndClientId,\n\t\tgetSettings,\n\t\thasMultiSelection,\n\t\t__unstableIsFullySelected,\n\t} = useSelect( blockEditorStore );\n\tconst { selectBlock } = useDispatch( blockEditorStore );\n\treturn useRefEffect( ( node ) => {\n\t\t// Here a DOMRect is stored while moving the caret vertically so\n\t\t// vertical position of the start position can be restored. This is to\n\t\t// recreate browser behaviour across blocks.\n\t\tlet verticalRect;\n\n\t\tfunction onMouseDown() {\n\t\t\tverticalRect = null;\n\t\t}\n\n\t\tfunction isClosestTabbableABlock( target, isReverse ) {\n\t\t\tconst closestTabbable = getClosestTabbable(\n\t\t\t\ttarget,\n\t\t\t\tisReverse,\n\t\t\t\tnode\n\t\t\t);\n\t\t\treturn closestTabbable && getBlockClientId( closestTabbable );\n\t\t}\n\n\t\tfunction onKeyDown( event ) {\n\t\t\t// Abort if navigation has already been handled (e.g. RichText\n\t\t\t// inline boundaries).\n\t\t\tif ( event.defaultPrevented ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst { keyCode, shiftKey, ctrlKey, altKey, metaKey } = event;\n\t\t\tconst isUp = keyCode === UP;\n\t\t\tconst isDown = keyCode === DOWN;\n\t\t\tconst isLeft = keyCode === LEFT;\n\t\t\tconst isRight = keyCode === RIGHT;\n\t\t\tconst isReverse = isUp || isLeft;\n\t\t\tconst isHorizontal = isLeft || isRight;\n\t\t\tconst isVertical = isUp || isDown;\n\t\t\tconst isNav = isHorizontal || isVertical;\n\t\t\tconst hasModifier = shiftKey || ctrlKey || altKey || metaKey;\n\t\t\tconst isNavEdge = isVertical ? isVerticalEdge : isHorizontalEdge;\n\t\t\tconst { ownerDocument } = node;\n\t\t\tconst { defaultView } = ownerDocument;\n\n\t\t\tif ( ! isNav ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If there is a multi-selection, the arrow keys should collapse the\n\t\t\t// selection to the start or end of the selection.\n\t\t\tif ( hasMultiSelection() ) {\n\t\t\t\tif ( shiftKey ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Only handle if we have a full selection (not a native partial\n\t\t\t\t// selection).\n\t\t\t\tif ( ! __unstableIsFullySelected() ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tif ( isReverse ) {\n\t\t\t\t\tselectBlock( getMultiSelectedBlocksStartClientId() );\n\t\t\t\t} else {\n\t\t\t\t\tselectBlock( getMultiSelectedBlocksEndClientId(), -1 );\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst target =\n\t\t\t\townerDocument.activeElement === node\n\t\t\t\t\t? getSelectionRoot( ownerDocument )\n\t\t\t\t\t: event.target;\n\n\t\t\t// Abort if our current target is not a candidate for navigation\n\t\t\t// (e.g. preserve native input behaviors).\n\t\t\tif ( ! isNavigationCandidate( target, keyCode, hasModifier ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// When presing any key other than up or down, the initial vertical\n\t\t\t// position must ALWAYS be reset. The vertical position is saved so\n\t\t\t// it can be restored as well as possible on sebsequent vertical\n\t\t\t// arrow key presses. It may not always be possible to restore the\n\t\t\t// exact same position (such as at an empty line), so it wouldn't be\n\t\t\t// good to compute the position right before any vertical arrow key\n\t\t\t// press.\n\t\t\tif ( ! isVertical ) {\n\t\t\t\tverticalRect = null;\n\t\t\t} else if ( ! verticalRect ) {\n\t\t\t\tverticalRect = computeCaretRect( defaultView );\n\t\t\t}\n\n\t\t\t// In the case of RTL scripts, right means previous and left means\n\t\t\t// next, which is the exact reverse of LTR.\n\t\t\tconst isReverseDir = isRTL( target ) ? ! isReverse : isReverse;\n\t\t\tconst { keepCaretInsideBlock } = getSettings();\n\n\t\t\tif ( shiftKey ) {\n\t\t\t\tif (\n\t\t\t\t\tisClosestTabbableABlock( target, isReverse ) &&\n\t\t\t\t\tisNavEdge( target, isReverse )\n\t\t\t\t) {\n\t\t\t\t\tnode.contentEditable = true;\n\t\t\t\t\t// Firefox doesn't automatically move focus.\n\t\t\t\t\tnode.focus();\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tisVertical &&\n\t\t\t\tisVerticalEdge( target, isReverse ) &&\n\t\t\t\t// When Alt is pressed, only intercept if the caret is also at\n\t\t\t\t// the horizontal edge.\n\t\t\t\t( altKey ? isHorizontalEdge( target, isReverseDir ) : true ) &&\n\t\t\t\t! keepCaretInsideBlock\n\t\t\t) {\n\t\t\t\tnode.contentEditable = false;\n\t\t\t\tconst closestTabbable = getClosestTabbable(\n\t\t\t\t\ttarget,\n\t\t\t\t\tisReverse,\n\t\t\t\t\tnode,\n\t\t\t\t\ttrue\n\t\t\t\t);\n\n\t\t\t\tif ( closestTabbable ) {\n\t\t\t\t\tplaceCaretAtVerticalEdge(\n\t\t\t\t\t\tclosestTabbable,\n\t\t\t\t\t\t// When Alt is pressed, place the caret at the furthest\n\t\t\t\t\t\t// horizontal edge and the furthest vertical edge.\n\t\t\t\t\t\taltKey ? ! isReverse : isReverse,\n\t\t\t\t\t\taltKey ? undefined : verticalRect\n\t\t\t\t\t);\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tisHorizontal &&\n\t\t\t\tdefaultView.getSelection().isCollapsed &&\n\t\t\t\tisHorizontalEdge( target, isReverseDir ) &&\n\t\t\t\t! keepCaretInsideBlock\n\t\t\t) {\n\t\t\t\tnode.contentEditable = false;\n\t\t\t\tconst closestTabbable = getClosestTabbable(\n\t\t\t\t\ttarget,\n\t\t\t\t\tisReverseDir,\n\t\t\t\t\tnode\n\t\t\t\t);\n\t\t\t\tplaceCaretAtHorizontalEdge( closestTabbable, isReverse );\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\n\t\tnode.addEventListener( 'mousedown', onMouseDown );\n\t\tnode.addEventListener( 'keydown', onKeyDown );\n\t\treturn () => {\n\t\t\tnode.removeEventListener( 'mousedown', onMouseDown );\n\t\t\tnode.removeEventListener( 'keydown', onKeyDown );\n\t\t};\n\t}, [] );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_dom","require","_keycodes","_data","_compose","_dom2","_store","isNavigationCandidate","element","keyCode","hasModifier","isVertical","UP","DOWN","tagName","elementType","getAttribute","verticalInputTypes","includes","simpleInputTypes","getClosestTabbable","target","isReverse","containerElement","onlyVertical","focusableNodes","focus","focusable","find","reverse","slice","indexOf","targetRect","getBoundingClientRect","isTabCandidate","node","closest","children","length","isInSameBlock","firstElementChild","tabbable","isTabbableIndex","isContentEditable","contentEditable","nodeRect","left","right","useArrowNav","getMultiSelectedBlocksStartClientId","getMultiSelectedBlocksEndClientId","getSettings","hasMultiSelection","__unstableIsFullySelected","useSelect","blockEditorStore","selectBlock","useDispatch","useRefEffect","verticalRect","onMouseDown","isClosestTabbableABlock","closestTabbable","getBlockClientId","onKeyDown","event","defaultPrevented","shiftKey","ctrlKey","altKey","metaKey","isUp","isDown","isLeft","LEFT","isRight","RIGHT","isHorizontal","isNav","isNavEdge","isVerticalEdge","isHorizontalEdge","ownerDocument","defaultView","preventDefault","computeCaretRect","isReverseDir","isRTL","keepCaretInsideBlock","placeCaretAtVerticalEdge","undefined","getSelection","isCollapsed","placeCaretAtHorizontalEdge","addEventListener","removeEventListener"],"sources":["@wordpress/block-editor/src/components/writing-flow/use-arrow-nav.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport {\n\tcomputeCaretRect,\n\tfocus,\n\tisHorizontalEdge,\n\tisVerticalEdge,\n\tplaceCaretAtHorizontalEdge,\n\tplaceCaretAtVerticalEdge,\n\tisRTL,\n} from '@wordpress/dom';\nimport { UP, DOWN, LEFT, RIGHT } from '@wordpress/keycodes';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { useRefEffect } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport { getBlockClientId, isInSameBlock } from '../../utils/dom';\nimport { store as blockEditorStore } from '../../store';\n\n/**\n * Returns true if the element should consider edge navigation upon a keyboard\n * event of the given directional key code, or false otherwise.\n *\n * @param {Element} element HTML element to test.\n * @param {number} keyCode KeyboardEvent keyCode to test.\n * @param {boolean} hasModifier Whether a modifier is pressed.\n *\n * @return {boolean} Whether element should consider edge navigation.\n */\nexport function isNavigationCandidate( element, keyCode, hasModifier ) {\n\tconst isVertical = keyCode === UP || keyCode === DOWN;\n\tconst { tagName } = element;\n\tconst elementType = element.getAttribute( 'type' );\n\n\t// Native inputs should not navigate vertically, unless they are simple types that don't need up/down arrow keys.\n\tif ( isVertical && ! hasModifier ) {\n\t\tif ( tagName === 'INPUT' ) {\n\t\t\tconst verticalInputTypes = [\n\t\t\t\t'date',\n\t\t\t\t'datetime-local',\n\t\t\t\t'month',\n\t\t\t\t'number',\n\t\t\t\t'range',\n\t\t\t\t'time',\n\t\t\t\t'week',\n\t\t\t];\n\t\t\treturn ! verticalInputTypes.includes( elementType );\n\t\t}\n\t\treturn true;\n\t}\n\n\t// Native inputs should not navigate horizontally, unless they are simple types that don't need left/right arrow keys.\n\tif ( tagName === 'INPUT' ) {\n\t\tconst simpleInputTypes = [\n\t\t\t'button',\n\t\t\t'checkbox',\n\t\t\t'number',\n\t\t\t'color',\n\t\t\t'file',\n\t\t\t'image',\n\t\t\t'radio',\n\t\t\t'reset',\n\t\t\t'submit',\n\t\t];\n\t\treturn simpleInputTypes.includes( elementType );\n\t}\n\n\t// Native textareas should not navigate horizontally.\n\treturn tagName !== 'TEXTAREA';\n}\n\n/**\n * Returns the optimal tab target from the given focused element in the desired\n * direction. A preference is made toward text fields, falling back to the block\n * focus stop if no other candidates exist for the block.\n *\n * @param {Element} target Currently focused text field.\n * @param {boolean} isReverse True if considering as the first field.\n * @param {Element} containerElement Element containing all blocks.\n * @param {boolean} onlyVertical Whether to only consider tabbable elements\n * that are visually above or under the\n * target.\n *\n * @return {?Element} Optimal tab target, if one exists.\n */\nexport function getClosestTabbable(\n\ttarget,\n\tisReverse,\n\tcontainerElement,\n\tonlyVertical\n) {\n\t// Since the current focus target is not guaranteed to be a text field, find\n\t// all focusables. Tabbability is considered later.\n\tlet focusableNodes = focus.focusable.find( containerElement );\n\n\tif ( isReverse ) {\n\t\tfocusableNodes.reverse();\n\t}\n\n\t// Consider as candidates those focusables after the current target. It's\n\t// assumed this can only be reached if the target is focusable (on its\n\t// keydown event), so no need to verify it exists in the set.\n\tfocusableNodes = focusableNodes.slice(\n\t\tfocusableNodes.indexOf( target ) + 1\n\t);\n\n\tlet targetRect;\n\n\tif ( onlyVertical ) {\n\t\ttargetRect = target.getBoundingClientRect();\n\t}\n\n\tfunction isTabCandidate( node ) {\n\t\tif ( node.closest( '[inert]' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Skip if there's only one child that is content editable (and thus a\n\t\t// better candidate).\n\t\tif (\n\t\t\tnode.children.length === 1 &&\n\t\t\tisInSameBlock( node, node.firstElementChild ) &&\n\t\t\tnode.firstElementChild.getAttribute( 'contenteditable' ) === 'true'\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Not a candidate if the node is not tabbable.\n\t\tif ( ! focus.tabbable.isTabbableIndex( node ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Skip focusable elements such as links within content editable nodes.\n\t\tif ( node.isContentEditable && node.contentEditable !== 'true' ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( onlyVertical ) {\n\t\t\tconst nodeRect = node.getBoundingClientRect();\n\n\t\t\tif (\n\t\t\t\tnodeRect.left >= targetRect.right ||\n\t\t\t\tnodeRect.right <= targetRect.left\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\treturn focusableNodes.find( isTabCandidate );\n}\n\nexport default function useArrowNav() {\n\tconst {\n\t\tgetMultiSelectedBlocksStartClientId,\n\t\tgetMultiSelectedBlocksEndClientId,\n\t\tgetSettings,\n\t\thasMultiSelection,\n\t\t__unstableIsFullySelected,\n\t} = useSelect( blockEditorStore );\n\tconst { selectBlock } = useDispatch( blockEditorStore );\n\treturn useRefEffect( ( node ) => {\n\t\t// Here a DOMRect is stored while moving the caret vertically so\n\t\t// vertical position of the start position can be restored. This is to\n\t\t// recreate browser behaviour across blocks.\n\t\tlet verticalRect;\n\n\t\tfunction onMouseDown() {\n\t\t\tverticalRect = null;\n\t\t}\n\n\t\tfunction isClosestTabbableABlock( target, isReverse ) {\n\t\t\tconst closestTabbable = getClosestTabbable(\n\t\t\t\ttarget,\n\t\t\t\tisReverse,\n\t\t\t\tnode\n\t\t\t);\n\t\t\treturn closestTabbable && getBlockClientId( closestTabbable );\n\t\t}\n\n\t\tfunction onKeyDown( event ) {\n\t\t\t// Abort if navigation has already been handled (e.g. RichText\n\t\t\t// inline boundaries).\n\t\t\tif ( event.defaultPrevented ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst { keyCode, target, shiftKey, ctrlKey, altKey, metaKey } =\n\t\t\t\tevent;\n\t\t\tconst isUp = keyCode === UP;\n\t\t\tconst isDown = keyCode === DOWN;\n\t\t\tconst isLeft = keyCode === LEFT;\n\t\t\tconst isRight = keyCode === RIGHT;\n\t\t\tconst isReverse = isUp || isLeft;\n\t\t\tconst isHorizontal = isLeft || isRight;\n\t\t\tconst isVertical = isUp || isDown;\n\t\t\tconst isNav = isHorizontal || isVertical;\n\t\t\tconst hasModifier = shiftKey || ctrlKey || altKey || metaKey;\n\t\t\tconst isNavEdge = isVertical ? isVerticalEdge : isHorizontalEdge;\n\t\t\tconst { ownerDocument } = node;\n\t\t\tconst { defaultView } = ownerDocument;\n\n\t\t\tif ( ! isNav ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If there is a multi-selection, the arrow keys should collapse the\n\t\t\t// selection to the start or end of the selection.\n\t\t\tif ( hasMultiSelection() ) {\n\t\t\t\tif ( shiftKey ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Only handle if we have a full selection (not a native partial\n\t\t\t\t// selection).\n\t\t\t\tif ( ! __unstableIsFullySelected() ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tif ( isReverse ) {\n\t\t\t\t\tselectBlock( getMultiSelectedBlocksStartClientId() );\n\t\t\t\t} else {\n\t\t\t\t\tselectBlock( getMultiSelectedBlocksEndClientId(), -1 );\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Abort if our current target is not a candidate for navigation\n\t\t\t// (e.g. preserve native input behaviors).\n\t\t\tif ( ! isNavigationCandidate( target, keyCode, hasModifier ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// When presing any key other than up or down, the initial vertical\n\t\t\t// position must ALWAYS be reset. The vertical position is saved so\n\t\t\t// it can be restored as well as possible on sebsequent vertical\n\t\t\t// arrow key presses. It may not always be possible to restore the\n\t\t\t// exact same position (such as at an empty line), so it wouldn't be\n\t\t\t// good to compute the position right before any vertical arrow key\n\t\t\t// press.\n\t\t\tif ( ! isVertical ) {\n\t\t\t\tverticalRect = null;\n\t\t\t} else if ( ! verticalRect ) {\n\t\t\t\tverticalRect = computeCaretRect( defaultView );\n\t\t\t}\n\n\t\t\t// In the case of RTL scripts, right means previous and left means\n\t\t\t// next, which is the exact reverse of LTR.\n\t\t\tconst isReverseDir = isRTL( target ) ? ! isReverse : isReverse;\n\t\t\tconst { keepCaretInsideBlock } = getSettings();\n\n\t\t\tif ( shiftKey ) {\n\t\t\t\tif (\n\t\t\t\t\tisClosestTabbableABlock( target, isReverse ) &&\n\t\t\t\t\tisNavEdge( target, isReverse )\n\t\t\t\t) {\n\t\t\t\t\tnode.contentEditable = true;\n\t\t\t\t\t// Firefox doesn't automatically move focus.\n\t\t\t\t\tnode.focus();\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tisVertical &&\n\t\t\t\tisVerticalEdge( target, isReverse ) &&\n\t\t\t\t// When Alt is pressed, only intercept if the caret is also at\n\t\t\t\t// the horizontal edge.\n\t\t\t\t( altKey ? isHorizontalEdge( target, isReverseDir ) : true ) &&\n\t\t\t\t! keepCaretInsideBlock\n\t\t\t) {\n\t\t\t\tconst closestTabbable = getClosestTabbable(\n\t\t\t\t\ttarget,\n\t\t\t\t\tisReverse,\n\t\t\t\t\tnode,\n\t\t\t\t\ttrue\n\t\t\t\t);\n\n\t\t\t\tif ( closestTabbable ) {\n\t\t\t\t\tplaceCaretAtVerticalEdge(\n\t\t\t\t\t\tclosestTabbable,\n\t\t\t\t\t\t// When Alt is pressed, place the caret at the furthest\n\t\t\t\t\t\t// horizontal edge and the furthest vertical edge.\n\t\t\t\t\t\taltKey ? ! isReverse : isReverse,\n\t\t\t\t\t\taltKey ? undefined : verticalRect\n\t\t\t\t\t);\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tisHorizontal &&\n\t\t\t\tdefaultView.getSelection().isCollapsed &&\n\t\t\t\tisHorizontalEdge( target, isReverseDir ) &&\n\t\t\t\t! keepCaretInsideBlock\n\t\t\t) {\n\t\t\t\tconst closestTabbable = getClosestTabbable(\n\t\t\t\t\ttarget,\n\t\t\t\t\tisReverseDir,\n\t\t\t\t\tnode\n\t\t\t\t);\n\t\t\t\tplaceCaretAtHorizontalEdge( closestTabbable, isReverse );\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\n\t\tnode.addEventListener( 'mousedown', onMouseDown );\n\t\tnode.addEventListener( 'keydown', onKeyDown );\n\t\treturn () => {\n\t\t\tnode.removeEventListener( 'mousedown', onMouseDown );\n\t\t\tnode.removeEventListener( 'keydown', onKeyDown );\n\t\t};\n\t}, [] );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -9,7 +9,6 @@ var _compose = require("@wordpress/compose");
9
9
  var _keycodes = require("@wordpress/keycodes");
10
10
  var _blocks = require("@wordpress/blocks");
11
11
  var _store = require("../../store");
12
- var _utils = require("./utils");
13
12
  /**
14
13
  * WordPress dependencies
15
14
  */
@@ -49,22 +48,7 @@ function useInput() {
49
48
  // DOM. This will cause React errors (and the DOM should only be
50
49
  // altered in a controlled fashion).
51
50
  if (node.contentEditable === 'true') {
52
- const selection = node.ownerDocument.defaultView.getSelection();
53
- const range = selection.rangeCount ? selection.getRangeAt(0) : null;
54
- const root = (0, _utils.getSelectionRoot)(node.ownerDocument);
55
-
56
- // If selection is contained within a nested editable, allow
57
- // input. We need to ensure that selection is maintained.
58
- if (root) {
59
- node.contentEditable = false;
60
- root.focus();
61
- selection.removeAllRanges();
62
- if (range) {
63
- selection.addRange(range);
64
- }
65
- } else {
66
- event.preventDefault();
67
- }
51
+ event.preventDefault();
68
52
  }
69
53
  }
70
54
  function onKeyDown(event) {
@@ -72,20 +56,6 @@ function useInput() {
72
56
  return;
73
57
  }
74
58
  if (!hasMultiSelection()) {
75
- const {
76
- ownerDocument
77
- } = node;
78
- if (node === ownerDocument.activeElement) {
79
- if (event.key === 'End' || event.key === 'Home') {
80
- const selectionRoot = (0, _utils.getSelectionRoot)(ownerDocument);
81
- const selection = ownerDocument.defaultView.getSelection();
82
- selection.selectAllChildren(selectionRoot);
83
- const method = event.key === 'End' ? 'collapseToEnd' : 'collapseToStart';
84
- selection[method]();
85
- event.preventDefault();
86
- return;
87
- }
88
- }
89
59
  if (event.keyCode === _keycodes.ENTER) {
90
60
  if (event.shiftKey || __unstableIsFullySelected()) {
91
61
  return;
@@ -1 +1 @@
1
- {"version":3,"names":["_data","require","_compose","_keycodes","_blocks","_store","_utils","useInput","__unstableIsFullySelected","getSelectedBlockClientIds","getSelectedBlockClientId","__unstableIsSelectionMergeable","hasMultiSelection","getBlockName","canInsertBlockType","getBlockRootClientId","getSelectionStart","getSelectionEnd","getBlockAttributes","useSelect","blockEditorStore","replaceBlocks","__unstableSplitSelection","removeBlocks","__unstableDeleteSelection","__unstableExpandSelection","__unstableMarkAutomaticChange","useDispatch","useRefEffect","node","onBeforeInput","event","contentEditable","selection","ownerDocument","defaultView","getSelection","range","rangeCount","getRangeAt","root","getSelectionRoot","focus","removeAllRanges","addRange","preventDefault","onKeyDown","defaultPrevented","activeElement","key","selectionRoot","selectAllChildren","method","keyCode","ENTER","shiftKey","clientId","blockName","selectionStart","selectionEnd","attributeKey","selectedAttributeValue","transforms","getBlockTransforms","filter","type","transformation","findTransform","item","regExp","test","transform","content","hasBlockSupport","__deprecatedOnSplit","createBlock","getDefaultBlockName","BACKSPACE","DELETE","length","metaKey","ctrlKey","onCompositionStart","addEventListener","removeEventListener"],"sources":["@wordpress/block-editor/src/components/writing-flow/use-input.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { useRefEffect } from '@wordpress/compose';\nimport { ENTER, BACKSPACE, DELETE } from '@wordpress/keycodes';\nimport {\n\tcreateBlock,\n\tgetDefaultBlockName,\n\thasBlockSupport,\n\tgetBlockTransforms,\n\tfindTransform,\n} from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\nimport { getSelectionRoot } from './utils';\n\n/**\n * Handles input for selections across blocks.\n */\nexport default function useInput() {\n\tconst {\n\t\t__unstableIsFullySelected,\n\t\tgetSelectedBlockClientIds,\n\t\tgetSelectedBlockClientId,\n\t\t__unstableIsSelectionMergeable,\n\t\thasMultiSelection,\n\t\tgetBlockName,\n\t\tcanInsertBlockType,\n\t\tgetBlockRootClientId,\n\t\tgetSelectionStart,\n\t\tgetSelectionEnd,\n\t\tgetBlockAttributes,\n\t} = useSelect( blockEditorStore );\n\tconst {\n\t\treplaceBlocks,\n\t\t__unstableSplitSelection,\n\t\tremoveBlocks,\n\t\t__unstableDeleteSelection,\n\t\t__unstableExpandSelection,\n\t\t__unstableMarkAutomaticChange,\n\t} = useDispatch( blockEditorStore );\n\n\treturn useRefEffect( ( node ) => {\n\t\tfunction onBeforeInput( event ) {\n\t\t\t// If writing flow is editable, NEVER allow the browser to alter the\n\t\t\t// DOM. This will cause React errors (and the DOM should only be\n\t\t\t// altered in a controlled fashion).\n\t\t\tif ( node.contentEditable === 'true' ) {\n\t\t\t\tconst selection = node.ownerDocument.defaultView.getSelection();\n\t\t\t\tconst range = selection.rangeCount\n\t\t\t\t\t? selection.getRangeAt( 0 )\n\t\t\t\t\t: null;\n\t\t\t\tconst root = getSelectionRoot( node.ownerDocument );\n\n\t\t\t\t// If selection is contained within a nested editable, allow\n\t\t\t\t// input. We need to ensure that selection is maintained.\n\t\t\t\tif ( root ) {\n\t\t\t\t\tnode.contentEditable = false;\n\t\t\t\t\troot.focus();\n\t\t\t\t\tselection.removeAllRanges();\n\t\t\t\t\tif ( range ) {\n\t\t\t\t\t\tselection.addRange( range );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction onKeyDown( event ) {\n\t\t\tif ( event.defaultPrevented ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( ! hasMultiSelection() ) {\n\t\t\t\tconst { ownerDocument } = node;\n\t\t\t\tif ( node === ownerDocument.activeElement ) {\n\t\t\t\t\tif ( event.key === 'End' || event.key === 'Home' ) {\n\t\t\t\t\t\tconst selectionRoot = getSelectionRoot( ownerDocument );\n\t\t\t\t\t\tconst selection =\n\t\t\t\t\t\t\townerDocument.defaultView.getSelection();\n\t\t\t\t\t\tselection.selectAllChildren( selectionRoot );\n\t\t\t\t\t\tconst method =\n\t\t\t\t\t\t\tevent.key === 'End'\n\t\t\t\t\t\t\t\t? 'collapseToEnd'\n\t\t\t\t\t\t\t\t: 'collapseToStart';\n\t\t\t\t\t\tselection[ method ]();\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( event.keyCode === ENTER ) {\n\t\t\t\t\tif ( event.shiftKey || __unstableIsFullySelected() ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst clientId = getSelectedBlockClientId();\n\t\t\t\t\tconst blockName = getBlockName( clientId );\n\t\t\t\t\tconst selectionStart = getSelectionStart();\n\t\t\t\t\tconst selectionEnd = getSelectionEnd();\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tselectionStart.attributeKey ===\n\t\t\t\t\t\tselectionEnd.attributeKey\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst selectedAttributeValue =\n\t\t\t\t\t\t\tgetBlockAttributes( clientId )[\n\t\t\t\t\t\t\t\tselectionStart.attributeKey\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\tconst transforms = getBlockTransforms( 'from' ).filter(\n\t\t\t\t\t\t\t( { type } ) => type === 'enter'\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst transformation = findTransform(\n\t\t\t\t\t\t\ttransforms,\n\t\t\t\t\t\t\t( item ) => {\n\t\t\t\t\t\t\t\treturn item.regExp.test(\n\t\t\t\t\t\t\t\t\tselectedAttributeValue\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif ( transformation ) {\n\t\t\t\t\t\t\treplaceBlocks(\n\t\t\t\t\t\t\t\tclientId,\n\t\t\t\t\t\t\t\ttransformation.transform( {\n\t\t\t\t\t\t\t\t\tcontent: selectedAttributeValue,\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t__unstableMarkAutomaticChange();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (\n\t\t\t\t\t\t! hasBlockSupport( blockName, 'splitting', false ) &&\n\t\t\t\t\t\t! event.__deprecatedOnSplit\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Ensure template is not locked.\n\t\t\t\t\tif (\n\t\t\t\t\t\tcanInsertBlockType(\n\t\t\t\t\t\t\tblockName,\n\t\t\t\t\t\t\tgetBlockRootClientId( clientId )\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\t__unstableSplitSelection();\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( event.keyCode === ENTER ) {\n\t\t\t\tnode.contentEditable = false;\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif ( __unstableIsFullySelected() ) {\n\t\t\t\t\treplaceBlocks(\n\t\t\t\t\t\tgetSelectedBlockClientIds(),\n\t\t\t\t\t\tcreateBlock( getDefaultBlockName() )\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\t__unstableSplitSelection();\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tevent.keyCode === BACKSPACE ||\n\t\t\t\tevent.keyCode === DELETE\n\t\t\t) {\n\t\t\t\tnode.contentEditable = false;\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif ( __unstableIsFullySelected() ) {\n\t\t\t\t\tremoveBlocks( getSelectedBlockClientIds() );\n\t\t\t\t} else if ( __unstableIsSelectionMergeable() ) {\n\t\t\t\t\t__unstableDeleteSelection( event.keyCode === DELETE );\n\t\t\t\t} else {\n\t\t\t\t\t__unstableExpandSelection();\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\t// If key.length is longer than 1, it's a control key that doesn't\n\t\t\t\t// input anything.\n\t\t\t\tevent.key.length === 1 &&\n\t\t\t\t! ( event.metaKey || event.ctrlKey )\n\t\t\t) {\n\t\t\t\tnode.contentEditable = false;\n\t\t\t\tif ( __unstableIsSelectionMergeable() ) {\n\t\t\t\t\t__unstableDeleteSelection( event.keyCode === DELETE );\n\t\t\t\t} else {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t// Safari does not stop default behaviour with either\n\t\t\t\t\t// event.preventDefault() or node.contentEditable = false, so\n\t\t\t\t\t// remove the selection to stop browser manipulation.\n\t\t\t\t\tnode.ownerDocument.defaultView\n\t\t\t\t\t\t.getSelection()\n\t\t\t\t\t\t.removeAllRanges();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction onCompositionStart( event ) {\n\t\t\tif ( ! hasMultiSelection() ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tnode.contentEditable = false;\n\n\t\t\tif ( __unstableIsSelectionMergeable() ) {\n\t\t\t\t__unstableDeleteSelection();\n\t\t\t} else {\n\t\t\t\tevent.preventDefault();\n\t\t\t\t// Safari does not stop default behaviour with either\n\t\t\t\t// event.preventDefault() or node.contentEditable = false, so\n\t\t\t\t// remove the selection to stop browser manipulation.\n\t\t\t\tnode.ownerDocument.defaultView.getSelection().removeAllRanges();\n\t\t\t}\n\t\t}\n\n\t\tnode.addEventListener( 'beforeinput', onBeforeInput );\n\t\tnode.addEventListener( 'keydown', onKeyDown );\n\t\tnode.addEventListener( 'compositionstart', onCompositionStart );\n\t\treturn () => {\n\t\t\tnode.removeEventListener( 'beforeinput', onBeforeInput );\n\t\t\tnode.removeEventListener( 'keydown', onKeyDown );\n\t\t\tnode.removeEventListener( 'compositionstart', onCompositionStart );\n\t\t};\n\t}, [] );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_data","require","_compose","_keycodes","_blocks","_store","useInput","__unstableIsFullySelected","getSelectedBlockClientIds","getSelectedBlockClientId","__unstableIsSelectionMergeable","hasMultiSelection","getBlockName","canInsertBlockType","getBlockRootClientId","getSelectionStart","getSelectionEnd","getBlockAttributes","useSelect","blockEditorStore","replaceBlocks","__unstableSplitSelection","removeBlocks","__unstableDeleteSelection","__unstableExpandSelection","__unstableMarkAutomaticChange","useDispatch","useRefEffect","node","onBeforeInput","event","contentEditable","preventDefault","onKeyDown","defaultPrevented","keyCode","ENTER","shiftKey","clientId","blockName","selectionStart","selectionEnd","attributeKey","selectedAttributeValue","transforms","getBlockTransforms","filter","type","transformation","findTransform","item","regExp","test","transform","content","hasBlockSupport","__deprecatedOnSplit","createBlock","getDefaultBlockName","BACKSPACE","DELETE","key","length","metaKey","ctrlKey","ownerDocument","defaultView","getSelection","removeAllRanges","onCompositionStart","addEventListener","removeEventListener"],"sources":["@wordpress/block-editor/src/components/writing-flow/use-input.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { useRefEffect } from '@wordpress/compose';\nimport { ENTER, BACKSPACE, DELETE } from '@wordpress/keycodes';\nimport {\n\tcreateBlock,\n\tgetDefaultBlockName,\n\thasBlockSupport,\n\tgetBlockTransforms,\n\tfindTransform,\n} from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\n\n/**\n * Handles input for selections across blocks.\n */\nexport default function useInput() {\n\tconst {\n\t\t__unstableIsFullySelected,\n\t\tgetSelectedBlockClientIds,\n\t\tgetSelectedBlockClientId,\n\t\t__unstableIsSelectionMergeable,\n\t\thasMultiSelection,\n\t\tgetBlockName,\n\t\tcanInsertBlockType,\n\t\tgetBlockRootClientId,\n\t\tgetSelectionStart,\n\t\tgetSelectionEnd,\n\t\tgetBlockAttributes,\n\t} = useSelect( blockEditorStore );\n\tconst {\n\t\treplaceBlocks,\n\t\t__unstableSplitSelection,\n\t\tremoveBlocks,\n\t\t__unstableDeleteSelection,\n\t\t__unstableExpandSelection,\n\t\t__unstableMarkAutomaticChange,\n\t} = useDispatch( blockEditorStore );\n\n\treturn useRefEffect( ( node ) => {\n\t\tfunction onBeforeInput( event ) {\n\t\t\t// If writing flow is editable, NEVER allow the browser to alter the\n\t\t\t// DOM. This will cause React errors (and the DOM should only be\n\t\t\t// altered in a controlled fashion).\n\t\t\tif ( node.contentEditable === 'true' ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\n\t\tfunction onKeyDown( event ) {\n\t\t\tif ( event.defaultPrevented ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( ! hasMultiSelection() ) {\n\t\t\t\tif ( event.keyCode === ENTER ) {\n\t\t\t\t\tif ( event.shiftKey || __unstableIsFullySelected() ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst clientId = getSelectedBlockClientId();\n\t\t\t\t\tconst blockName = getBlockName( clientId );\n\t\t\t\t\tconst selectionStart = getSelectionStart();\n\t\t\t\t\tconst selectionEnd = getSelectionEnd();\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tselectionStart.attributeKey ===\n\t\t\t\t\t\tselectionEnd.attributeKey\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst selectedAttributeValue =\n\t\t\t\t\t\t\tgetBlockAttributes( clientId )[\n\t\t\t\t\t\t\t\tselectionStart.attributeKey\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\tconst transforms = getBlockTransforms( 'from' ).filter(\n\t\t\t\t\t\t\t( { type } ) => type === 'enter'\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst transformation = findTransform(\n\t\t\t\t\t\t\ttransforms,\n\t\t\t\t\t\t\t( item ) => {\n\t\t\t\t\t\t\t\treturn item.regExp.test(\n\t\t\t\t\t\t\t\t\tselectedAttributeValue\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif ( transformation ) {\n\t\t\t\t\t\t\treplaceBlocks(\n\t\t\t\t\t\t\t\tclientId,\n\t\t\t\t\t\t\t\ttransformation.transform( {\n\t\t\t\t\t\t\t\t\tcontent: selectedAttributeValue,\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t__unstableMarkAutomaticChange();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (\n\t\t\t\t\t\t! hasBlockSupport( blockName, 'splitting', false ) &&\n\t\t\t\t\t\t! event.__deprecatedOnSplit\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Ensure template is not locked.\n\t\t\t\t\tif (\n\t\t\t\t\t\tcanInsertBlockType(\n\t\t\t\t\t\t\tblockName,\n\t\t\t\t\t\t\tgetBlockRootClientId( clientId )\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\t__unstableSplitSelection();\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( event.keyCode === ENTER ) {\n\t\t\t\tnode.contentEditable = false;\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif ( __unstableIsFullySelected() ) {\n\t\t\t\t\treplaceBlocks(\n\t\t\t\t\t\tgetSelectedBlockClientIds(),\n\t\t\t\t\t\tcreateBlock( getDefaultBlockName() )\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\t__unstableSplitSelection();\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tevent.keyCode === BACKSPACE ||\n\t\t\t\tevent.keyCode === DELETE\n\t\t\t) {\n\t\t\t\tnode.contentEditable = false;\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif ( __unstableIsFullySelected() ) {\n\t\t\t\t\tremoveBlocks( getSelectedBlockClientIds() );\n\t\t\t\t} else if ( __unstableIsSelectionMergeable() ) {\n\t\t\t\t\t__unstableDeleteSelection( event.keyCode === DELETE );\n\t\t\t\t} else {\n\t\t\t\t\t__unstableExpandSelection();\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\t// If key.length is longer than 1, it's a control key that doesn't\n\t\t\t\t// input anything.\n\t\t\t\tevent.key.length === 1 &&\n\t\t\t\t! ( event.metaKey || event.ctrlKey )\n\t\t\t) {\n\t\t\t\tnode.contentEditable = false;\n\t\t\t\tif ( __unstableIsSelectionMergeable() ) {\n\t\t\t\t\t__unstableDeleteSelection( event.keyCode === DELETE );\n\t\t\t\t} else {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t// Safari does not stop default behaviour with either\n\t\t\t\t\t// event.preventDefault() or node.contentEditable = false, so\n\t\t\t\t\t// remove the selection to stop browser manipulation.\n\t\t\t\t\tnode.ownerDocument.defaultView\n\t\t\t\t\t\t.getSelection()\n\t\t\t\t\t\t.removeAllRanges();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction onCompositionStart( event ) {\n\t\t\tif ( ! hasMultiSelection() ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tnode.contentEditable = false;\n\n\t\t\tif ( __unstableIsSelectionMergeable() ) {\n\t\t\t\t__unstableDeleteSelection();\n\t\t\t} else {\n\t\t\t\tevent.preventDefault();\n\t\t\t\t// Safari does not stop default behaviour with either\n\t\t\t\t// event.preventDefault() or node.contentEditable = false, so\n\t\t\t\t// remove the selection to stop browser manipulation.\n\t\t\t\tnode.ownerDocument.defaultView.getSelection().removeAllRanges();\n\t\t\t}\n\t\t}\n\n\t\tnode.addEventListener( 'beforeinput', onBeforeInput );\n\t\tnode.addEventListener( 'keydown', onKeyDown );\n\t\tnode.addEventListener( 'compositionstart', onCompositionStart );\n\t\treturn () => {\n\t\t\tnode.removeEventListener( 'beforeinput', onBeforeInput );\n\t\t\tnode.removeEventListener( 'keydown', onKeyDown );\n\t\t\tnode.removeEventListener( 'compositionstart', onCompositionStart );\n\t\t};\n\t}, [] );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -9,7 +9,6 @@ var _data = require("@wordpress/data");
9
9
  var _keyboardShortcuts = require("@wordpress/keyboard-shortcuts");
10
10
  var _compose = require("@wordpress/compose");
11
11
  var _store = require("../../store");
12
- var _utils = require("./utils");
13
12
  /**
14
13
  * WordPress dependencies
15
14
  */
@@ -34,19 +33,8 @@ function useSelectAll() {
34
33
  if (!isMatch('core/block-editor/select-all', event)) {
35
34
  return;
36
35
  }
37
- const selectionRoot = (0, _utils.getSelectionRoot)(node.ownerDocument);
38
36
  const selectedClientIds = getSelectedBlockClientIds();
39
-
40
- // Abort if there is selection, but it is not within a block.
41
- if (selectionRoot && !selectedClientIds.length) {
42
- return;
43
- }
44
- if (selectionRoot && selectedClientIds.length < 2 && !(0, _dom.isEntirelySelected)(selectionRoot)) {
45
- if (node === node.ownerDocument.activeElement) {
46
- event.preventDefault();
47
- node.ownerDocument.defaultView.getSelection().selectAllChildren(selectionRoot);
48
- return;
49
- }
37
+ if (selectedClientIds.length < 2 && !(0, _dom.isEntirelySelected)(event.target)) {
50
38
  return;
51
39
  }
52
40
  event.preventDefault();
@@ -59,7 +47,6 @@ function useSelectAll() {
59
47
  if (selectedClientIds.length === blockClientIds.length) {
60
48
  if (rootClientId) {
61
49
  node.ownerDocument.defaultView.getSelection().removeAllRanges();
62
- node.contentEditable = 'false';
63
50
  selectBlock(rootClientId);
64
51
  }
65
52
  return;
@@ -1 +1 @@
1
- {"version":3,"names":["_dom","require","_data","_keyboardShortcuts","_compose","_store","_utils","useSelectAll","getBlockOrder","getSelectedBlockClientIds","getBlockRootClientId","useSelect","blockEditorStore","multiSelect","selectBlock","useDispatch","isMatch","useShortcutEventMatch","useRefEffect","node","onKeyDown","event","selectionRoot","getSelectionRoot","ownerDocument","selectedClientIds","length","isEntirelySelected","activeElement","preventDefault","defaultView","getSelection","selectAllChildren","firstSelectedClientId","rootClientId","blockClientIds","removeAllRanges","contentEditable","addEventListener","removeEventListener"],"sources":["@wordpress/block-editor/src/components/writing-flow/use-select-all.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { isEntirelySelected } from '@wordpress/dom';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { __unstableUseShortcutEventMatch as useShortcutEventMatch } from '@wordpress/keyboard-shortcuts';\nimport { useRefEffect } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\nimport { getSelectionRoot } from './utils';\n\nexport default function useSelectAll() {\n\tconst { getBlockOrder, getSelectedBlockClientIds, getBlockRootClientId } =\n\t\tuseSelect( blockEditorStore );\n\tconst { multiSelect, selectBlock } = useDispatch( blockEditorStore );\n\tconst isMatch = useShortcutEventMatch();\n\n\treturn useRefEffect( ( node ) => {\n\t\tfunction onKeyDown( event ) {\n\t\t\tif ( ! isMatch( 'core/block-editor/select-all', event ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst selectionRoot = getSelectionRoot( node.ownerDocument );\n\t\t\tconst selectedClientIds = getSelectedBlockClientIds();\n\n\t\t\t// Abort if there is selection, but it is not within a block.\n\t\t\tif ( selectionRoot && ! selectedClientIds.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tselectionRoot &&\n\t\t\t\tselectedClientIds.length < 2 &&\n\t\t\t\t! isEntirelySelected( selectionRoot )\n\t\t\t) {\n\t\t\t\tif ( node === node.ownerDocument.activeElement ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tnode.ownerDocument.defaultView\n\t\t\t\t\t\t.getSelection()\n\t\t\t\t\t\t.selectAllChildren( selectionRoot );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tevent.preventDefault();\n\n\t\t\tconst [ firstSelectedClientId ] = selectedClientIds;\n\t\t\tconst rootClientId = getBlockRootClientId( firstSelectedClientId );\n\t\t\tconst blockClientIds = getBlockOrder( rootClientId );\n\n\t\t\t// If we have selected all sibling nested blocks, try selecting up a\n\t\t\t// level. See: https://github.com/WordPress/gutenberg/pull/31859/\n\t\t\tif ( selectedClientIds.length === blockClientIds.length ) {\n\t\t\t\tif ( rootClientId ) {\n\t\t\t\t\tnode.ownerDocument.defaultView\n\t\t\t\t\t\t.getSelection()\n\t\t\t\t\t\t.removeAllRanges();\n\t\t\t\t\tnode.contentEditable = 'false';\n\t\t\t\t\tselectBlock( rootClientId );\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmultiSelect(\n\t\t\t\tblockClientIds[ 0 ],\n\t\t\t\tblockClientIds[ blockClientIds.length - 1 ]\n\t\t\t);\n\t\t}\n\n\t\tnode.addEventListener( 'keydown', onKeyDown );\n\n\t\treturn () => {\n\t\t\tnode.removeEventListener( 'keydown', onKeyDown );\n\t\t};\n\t}, [] );\n}\n"],"mappings":";;;;;;AAGA,IAAAA,IAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AACA,IAAAE,kBAAA,GAAAF,OAAA;AACA,IAAAG,QAAA,GAAAH,OAAA;AAKA,IAAAI,MAAA,GAAAJ,OAAA;AACA,IAAAK,MAAA,GAAAL,OAAA;AAZA;AACA;AACA;;AAMA;AACA;AACA;;AAIe,SAASM,YAAYA,CAAA,EAAG;EACtC,MAAM;IAAEC,aAAa;IAAEC,yBAAyB;IAAEC;EAAqB,CAAC,GACvE,IAAAC,eAAS,EAAEC,YAAiB,CAAC;EAC9B,MAAM;IAAEC,WAAW;IAAEC;EAAY,CAAC,GAAG,IAAAC,iBAAW,EAAEH,YAAiB,CAAC;EACpE,MAAMI,OAAO,GAAG,IAAAC,kDAAqB,EAAC,CAAC;EAEvC,OAAO,IAAAC,qBAAY,EAAIC,IAAI,IAAM;IAChC,SAASC,SAASA,CAAEC,KAAK,EAAG;MAC3B,IAAK,CAAEL,OAAO,CAAE,8BAA8B,EAAEK,KAAM,CAAC,EAAG;QACzD;MACD;MAEA,MAAMC,aAAa,GAAG,IAAAC,uBAAgB,EAAEJ,IAAI,CAACK,aAAc,CAAC;MAC5D,MAAMC,iBAAiB,GAAGhB,yBAAyB,CAAC,CAAC;;MAErD;MACA,IAAKa,aAAa,IAAI,CAAEG,iBAAiB,CAACC,MAAM,EAAG;QAClD;MACD;MAEA,IACCJ,aAAa,IACbG,iBAAiB,CAACC,MAAM,GAAG,CAAC,IAC5B,CAAE,IAAAC,uBAAkB,EAAEL,aAAc,CAAC,EACpC;QACD,IAAKH,IAAI,KAAKA,IAAI,CAACK,aAAa,CAACI,aAAa,EAAG;UAChDP,KAAK,CAACQ,cAAc,CAAC,CAAC;UACtBV,IAAI,CAACK,aAAa,CAACM,WAAW,CAC5BC,YAAY,CAAC,CAAC,CACdC,iBAAiB,CAAEV,aAAc,CAAC;UACpC;QACD;QAEA;MACD;MAEAD,KAAK,CAACQ,cAAc,CAAC,CAAC;MAEtB,MAAM,CAAEI,qBAAqB,CAAE,GAAGR,iBAAiB;MACnD,MAAMS,YAAY,GAAGxB,oBAAoB,CAAEuB,qBAAsB,CAAC;MAClE,MAAME,cAAc,GAAG3B,aAAa,CAAE0B,YAAa,CAAC;;MAEpD;MACA;MACA,IAAKT,iBAAiB,CAACC,MAAM,KAAKS,cAAc,CAACT,MAAM,EAAG;QACzD,IAAKQ,YAAY,EAAG;UACnBf,IAAI,CAACK,aAAa,CAACM,WAAW,CAC5BC,YAAY,CAAC,CAAC,CACdK,eAAe,CAAC,CAAC;UACnBjB,IAAI,CAACkB,eAAe,GAAG,OAAO;UAC9BvB,WAAW,CAAEoB,YAAa,CAAC;QAC5B;QACA;MACD;MAEArB,WAAW,CACVsB,cAAc,CAAE,CAAC,CAAE,EACnBA,cAAc,CAAEA,cAAc,CAACT,MAAM,GAAG,CAAC,CAC1C,CAAC;IACF;IAEAP,IAAI,CAACmB,gBAAgB,CAAE,SAAS,EAAElB,SAAU,CAAC;IAE7C,OAAO,MAAM;MACZD,IAAI,CAACoB,mBAAmB,CAAE,SAAS,EAAEnB,SAAU,CAAC;IACjD,CAAC;EACF,CAAC,EAAE,EAAG,CAAC;AACR","ignoreList":[]}
1
+ {"version":3,"names":["_dom","require","_data","_keyboardShortcuts","_compose","_store","useSelectAll","getBlockOrder","getSelectedBlockClientIds","getBlockRootClientId","useSelect","blockEditorStore","multiSelect","selectBlock","useDispatch","isMatch","useShortcutEventMatch","useRefEffect","node","onKeyDown","event","selectedClientIds","length","isEntirelySelected","target","preventDefault","firstSelectedClientId","rootClientId","blockClientIds","ownerDocument","defaultView","getSelection","removeAllRanges","addEventListener","removeEventListener"],"sources":["@wordpress/block-editor/src/components/writing-flow/use-select-all.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { isEntirelySelected } from '@wordpress/dom';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { __unstableUseShortcutEventMatch as useShortcutEventMatch } from '@wordpress/keyboard-shortcuts';\nimport { useRefEffect } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\n\nexport default function useSelectAll() {\n\tconst { getBlockOrder, getSelectedBlockClientIds, getBlockRootClientId } =\n\t\tuseSelect( blockEditorStore );\n\tconst { multiSelect, selectBlock } = useDispatch( blockEditorStore );\n\tconst isMatch = useShortcutEventMatch();\n\n\treturn useRefEffect( ( node ) => {\n\t\tfunction onKeyDown( event ) {\n\t\t\tif ( ! isMatch( 'core/block-editor/select-all', event ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst selectedClientIds = getSelectedBlockClientIds();\n\n\t\t\tif (\n\t\t\t\tselectedClientIds.length < 2 &&\n\t\t\t\t! isEntirelySelected( event.target )\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tevent.preventDefault();\n\n\t\t\tconst [ firstSelectedClientId ] = selectedClientIds;\n\t\t\tconst rootClientId = getBlockRootClientId( firstSelectedClientId );\n\t\t\tconst blockClientIds = getBlockOrder( rootClientId );\n\n\t\t\t// If we have selected all sibling nested blocks, try selecting up a\n\t\t\t// level. See: https://github.com/WordPress/gutenberg/pull/31859/\n\t\t\tif ( selectedClientIds.length === blockClientIds.length ) {\n\t\t\t\tif ( rootClientId ) {\n\t\t\t\t\tnode.ownerDocument.defaultView\n\t\t\t\t\t\t.getSelection()\n\t\t\t\t\t\t.removeAllRanges();\n\t\t\t\t\tselectBlock( rootClientId );\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmultiSelect(\n\t\t\t\tblockClientIds[ 0 ],\n\t\t\t\tblockClientIds[ blockClientIds.length - 1 ]\n\t\t\t);\n\t\t}\n\n\t\tnode.addEventListener( 'keydown', onKeyDown );\n\n\t\treturn () => {\n\t\t\tnode.removeEventListener( 'keydown', onKeyDown );\n\t\t};\n\t}, [] );\n}\n"],"mappings":";;;;;;AAGA,IAAAA,IAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AACA,IAAAE,kBAAA,GAAAF,OAAA;AACA,IAAAG,QAAA,GAAAH,OAAA;AAKA,IAAAI,MAAA,GAAAJ,OAAA;AAXA;AACA;AACA;;AAMA;AACA;AACA;;AAGe,SAASK,YAAYA,CAAA,EAAG;EACtC,MAAM;IAAEC,aAAa;IAAEC,yBAAyB;IAAEC;EAAqB,CAAC,GACvE,IAAAC,eAAS,EAAEC,YAAiB,CAAC;EAC9B,MAAM;IAAEC,WAAW;IAAEC;EAAY,CAAC,GAAG,IAAAC,iBAAW,EAAEH,YAAiB,CAAC;EACpE,MAAMI,OAAO,GAAG,IAAAC,kDAAqB,EAAC,CAAC;EAEvC,OAAO,IAAAC,qBAAY,EAAIC,IAAI,IAAM;IAChC,SAASC,SAASA,CAAEC,KAAK,EAAG;MAC3B,IAAK,CAAEL,OAAO,CAAE,8BAA8B,EAAEK,KAAM,CAAC,EAAG;QACzD;MACD;MAEA,MAAMC,iBAAiB,GAAGb,yBAAyB,CAAC,CAAC;MAErD,IACCa,iBAAiB,CAACC,MAAM,GAAG,CAAC,IAC5B,CAAE,IAAAC,uBAAkB,EAAEH,KAAK,CAACI,MAAO,CAAC,EACnC;QACD;MACD;MAEAJ,KAAK,CAACK,cAAc,CAAC,CAAC;MAEtB,MAAM,CAAEC,qBAAqB,CAAE,GAAGL,iBAAiB;MACnD,MAAMM,YAAY,GAAGlB,oBAAoB,CAAEiB,qBAAsB,CAAC;MAClE,MAAME,cAAc,GAAGrB,aAAa,CAAEoB,YAAa,CAAC;;MAEpD;MACA;MACA,IAAKN,iBAAiB,CAACC,MAAM,KAAKM,cAAc,CAACN,MAAM,EAAG;QACzD,IAAKK,YAAY,EAAG;UACnBT,IAAI,CAACW,aAAa,CAACC,WAAW,CAC5BC,YAAY,CAAC,CAAC,CACdC,eAAe,CAAC,CAAC;UACnBnB,WAAW,CAAEc,YAAa,CAAC;QAC5B;QACA;MACD;MAEAf,WAAW,CACVgB,cAAc,CAAE,CAAC,CAAE,EACnBA,cAAc,CAAEA,cAAc,CAACN,MAAM,GAAG,CAAC,CAC1C,CAAC;IACF;IAEAJ,IAAI,CAACe,gBAAgB,CAAE,SAAS,EAAEd,SAAU,CAAC;IAE7C,OAAO,MAAM;MACZD,IAAI,CAACgB,mBAAmB,CAAE,SAAS,EAAEf,SAAU,CAAC;IACjD,CAAC;EACF,CAAC,EAAE,EAAG,CAAC;AACR","ignoreList":[]}
@@ -115,8 +115,7 @@ function useSelectionObserver() {
115
115
  const {
116
116
  getBlockParents,
117
117
  getBlockSelectionStart,
118
- isMultiSelecting,
119
- getSelectedBlockClientId
118
+ isMultiSelecting
120
119
  } = (0, _data.useSelect)(_store.store);
121
120
  return (0, _compose.useRefEffect)(node => {
122
121
  const {
@@ -179,13 +178,10 @@ function useSelectionObserver() {
179
178
  setContentEditableWrapper(node, false);
180
179
  return;
181
180
  }
182
- setContentEditableWrapper(node, !!(startClientId && endClientId));
183
181
  const isSingularSelection = startClientId === endClientId;
184
182
  if (isSingularSelection) {
185
183
  if (!isMultiSelecting()) {
186
- if (getSelectedBlockClientId() !== startClientId) {
187
- selectBlock(startClientId);
188
- }
184
+ selectBlock(startClientId);
189
185
  } else {
190
186
  multiSelect(startClientId, startClientId);
191
187
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_data","require","_compose","_richText","_dom","_store","_dom2","extractSelectionStartNode","selection","anchorNode","anchorOffset","nodeType","TEXT_NODE","childNodes","extractSelectionEndNode","focusNode","focusOffset","length","isSelectionForward","_focusNode$previousSi","previousSibling","parentElement","findDepth","a","b","depth","setContentEditableWrapper","node","value","contentEditable","String","focus","getRichTextElement","element","ELEMENT_NODE","closest","useSelectionObserver","multiSelect","selectBlock","selectionChange","useDispatch","blockEditorStore","getBlockParents","getBlockSelectionStart","isMultiSelecting","getSelectedBlockClientId","useSelect","useRefEffect","ownerDocument","defaultView","onSelectionChange","event","getSelection","rangeCount","startNode","endNode","contains","isClickShift","shiftKey","type","isCollapsed","startClientId","getBlockClientId","endClientId","selectedClientId","clickedClientId","target","focusNodeIsNonSelectable","undefined","isSingularSelection","startPath","endPath","richTextElementStart","richTextElementEnd","_richTextDataStart$st","_richTextDataEnd$star","range","getRangeAt","richTextDataStart","create","__unstableIsEditableTree","richTextDataEnd","startOffset","start","end","endOffset","clientId","attributeKey","dataset","wpBlockAttributeKey","offset","addEventListener","removeEventListener"],"sources":["@wordpress/block-editor/src/components/writing-flow/use-selection-observer.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { useRefEffect } from '@wordpress/compose';\nimport { create } from '@wordpress/rich-text';\nimport { isSelectionForward } from '@wordpress/dom';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\nimport { getBlockClientId } from '../../utils/dom';\n\n/**\n * Extract the selection start node from the selection. When the anchor node is\n * not a text node, the selection offset is the index of a child node.\n *\n * @param {Selection} selection The selection.\n *\n * @return {Element} The selection start node.\n */\nfunction extractSelectionStartNode( selection ) {\n\tconst { anchorNode, anchorOffset } = selection;\n\n\tif ( anchorNode.nodeType === anchorNode.TEXT_NODE ) {\n\t\treturn anchorNode;\n\t}\n\n\tif ( anchorOffset === 0 ) {\n\t\treturn anchorNode;\n\t}\n\n\treturn anchorNode.childNodes[ anchorOffset - 1 ];\n}\n\n/**\n * Extract the selection end node from the selection. When the focus node is not\n * a text node, the selection offset is the index of a child node. The selection\n * reaches up to but excluding that child node.\n *\n * @param {Selection} selection The selection.\n *\n * @return {Element} The selection start node.\n */\nfunction extractSelectionEndNode( selection ) {\n\tconst { focusNode, focusOffset } = selection;\n\n\tif ( focusNode.nodeType === focusNode.TEXT_NODE ) {\n\t\treturn focusNode;\n\t}\n\n\tif ( focusOffset === focusNode.childNodes.length ) {\n\t\treturn focusNode;\n\t}\n\n\t// When the selection is forward (the selection ends with the focus node),\n\t// the selection may extend into the next element with an offset of 0. This\n\t// may trigger multi selection even though the selection does not visually\n\t// end in the next block.\n\tif ( focusOffset === 0 && isSelectionForward( selection ) ) {\n\t\treturn focusNode.previousSibling ?? focusNode.parentElement;\n\t}\n\n\treturn focusNode.childNodes[ focusOffset ];\n}\n\nfunction findDepth( a, b ) {\n\tlet depth = 0;\n\n\twhile ( a[ depth ] === b[ depth ] ) {\n\t\tdepth++;\n\t}\n\n\treturn depth;\n}\n\n/**\n * Sets the `contenteditable` wrapper element to `value`.\n *\n * @param {HTMLElement} node Block element.\n * @param {boolean} value `contentEditable` value (true or false)\n */\nfunction setContentEditableWrapper( node, value ) {\n\t// Since we are calling this on every selection change, check if the value\n\t// needs to be updated first because it trigger the browser to recalculate\n\t// style.\n\tif ( node.contentEditable !== String( value ) ) {\n\t\tnode.contentEditable = value;\n\n\t\t// Firefox doesn't automatically move focus.\n\t\tif ( value ) {\n\t\t\tnode.focus();\n\t\t}\n\t}\n}\n\nfunction getRichTextElement( node ) {\n\tconst element =\n\t\tnode.nodeType === node.ELEMENT_NODE ? node : node.parentElement;\n\treturn element?.closest( '[data-wp-block-attribute-key]' );\n}\n\n/**\n * Sets a multi-selection based on the native selection across blocks.\n */\nexport default function useSelectionObserver() {\n\tconst { multiSelect, selectBlock, selectionChange } =\n\t\tuseDispatch( blockEditorStore );\n\tconst {\n\t\tgetBlockParents,\n\t\tgetBlockSelectionStart,\n\t\tisMultiSelecting,\n\t\tgetSelectedBlockClientId,\n\t} = useSelect( blockEditorStore );\n\treturn useRefEffect(\n\t\t( node ) => {\n\t\t\tconst { ownerDocument } = node;\n\t\t\tconst { defaultView } = ownerDocument;\n\n\t\t\tfunction onSelectionChange( event ) {\n\t\t\t\tconst selection = defaultView.getSelection();\n\n\t\t\t\tif ( ! selection.rangeCount ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst startNode = extractSelectionStartNode( selection );\n\t\t\t\tconst endNode = extractSelectionEndNode( selection );\n\n\t\t\t\tif (\n\t\t\t\t\t! node.contains( startNode ) ||\n\t\t\t\t\t! node.contains( endNode )\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// If selection is collapsed and we haven't used `shift+click`,\n\t\t\t\t// end multi selection and disable the contentEditable wrapper.\n\t\t\t\t// We have to check about `shift+click` case because elements\n\t\t\t\t// that don't support text selection might be involved, and we might\n\t\t\t\t// update the clientIds to multi-select blocks.\n\t\t\t\t// For now we check if the event is a `mouse` event.\n\t\t\t\tconst isClickShift = event.shiftKey && event.type === 'mouseup';\n\t\t\t\tif ( selection.isCollapsed && ! isClickShift ) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tnode.contentEditable === 'true' &&\n\t\t\t\t\t\t! isMultiSelecting()\n\t\t\t\t\t) {\n\t\t\t\t\t\tsetContentEditableWrapper( node, false );\n\t\t\t\t\t\tlet element =\n\t\t\t\t\t\t\tstartNode.nodeType === startNode.ELEMENT_NODE\n\t\t\t\t\t\t\t\t? startNode\n\t\t\t\t\t\t\t\t: startNode.parentElement;\n\t\t\t\t\t\telement = element?.closest( '[contenteditable]' );\n\t\t\t\t\t\telement?.focus();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet startClientId = getBlockClientId( startNode );\n\t\t\t\tlet endClientId = getBlockClientId( endNode );\n\n\t\t\t\t// If the selection has changed and we had pressed `shift+click`,\n\t\t\t\t// we need to check if in an element that doesn't support\n\t\t\t\t// text selection has been clicked.\n\t\t\t\tif ( isClickShift ) {\n\t\t\t\t\tconst selectedClientId = getBlockSelectionStart();\n\t\t\t\t\tconst clickedClientId = getBlockClientId( event.target );\n\t\t\t\t\t// `endClientId` is not defined if we end the selection by clicking a non-selectable block.\n\t\t\t\t\t// We need to check if there was already a selection with a non-selectable focusNode.\n\t\t\t\t\tconst focusNodeIsNonSelectable =\n\t\t\t\t\t\tclickedClientId !== endClientId;\n\t\t\t\t\tif (\n\t\t\t\t\t\t( startClientId === endClientId &&\n\t\t\t\t\t\t\tselection.isCollapsed ) ||\n\t\t\t\t\t\t! endClientId ||\n\t\t\t\t\t\tfocusNodeIsNonSelectable\n\t\t\t\t\t) {\n\t\t\t\t\t\tendClientId = clickedClientId;\n\t\t\t\t\t}\n\t\t\t\t\t// Handle the case when we have a non-selectable block\n\t\t\t\t\t// selected and click another one.\n\t\t\t\t\tif ( startClientId !== selectedClientId ) {\n\t\t\t\t\t\tstartClientId = selectedClientId;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If the selection did not involve a block, return.\n\t\t\t\tif (\n\t\t\t\t\tstartClientId === undefined &&\n\t\t\t\t\tendClientId === undefined\n\t\t\t\t) {\n\t\t\t\t\tsetContentEditableWrapper( node, false );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsetContentEditableWrapper(\n\t\t\t\t\tnode,\n\t\t\t\t\t!! ( startClientId && endClientId )\n\t\t\t\t);\n\n\t\t\t\tconst isSingularSelection = startClientId === endClientId;\n\t\t\t\tif ( isSingularSelection ) {\n\t\t\t\t\tif ( ! isMultiSelecting() ) {\n\t\t\t\t\t\tif ( getSelectedBlockClientId() !== startClientId ) {\n\t\t\t\t\t\t\tselectBlock( startClientId );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmultiSelect( startClientId, startClientId );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst startPath = [\n\t\t\t\t\t\t...getBlockParents( startClientId ),\n\t\t\t\t\t\tstartClientId,\n\t\t\t\t\t];\n\t\t\t\t\tconst endPath = [\n\t\t\t\t\t\t...getBlockParents( endClientId ),\n\t\t\t\t\t\tendClientId,\n\t\t\t\t\t];\n\t\t\t\t\tconst depth = findDepth( startPath, endPath );\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tstartPath[ depth ] !== startClientId ||\n\t\t\t\t\t\tendPath[ depth ] !== endClientId\n\t\t\t\t\t) {\n\t\t\t\t\t\tmultiSelect( startPath[ depth ], endPath[ depth ] );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst richTextElementStart =\n\t\t\t\t\t\tgetRichTextElement( startNode );\n\t\t\t\t\tconst richTextElementEnd = getRichTextElement( endNode );\n\n\t\t\t\t\tif ( richTextElementStart && richTextElementEnd ) {\n\t\t\t\t\t\tconst range = selection.getRangeAt( 0 );\n\t\t\t\t\t\tconst richTextDataStart = create( {\n\t\t\t\t\t\t\telement: richTextElementStart,\n\t\t\t\t\t\t\trange,\n\t\t\t\t\t\t\t__unstableIsEditableTree: true,\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tconst richTextDataEnd = create( {\n\t\t\t\t\t\t\telement: richTextElementEnd,\n\t\t\t\t\t\t\trange,\n\t\t\t\t\t\t\t__unstableIsEditableTree: true,\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tconst startOffset =\n\t\t\t\t\t\t\trichTextDataStart.start ?? richTextDataStart.end;\n\t\t\t\t\t\tconst endOffset =\n\t\t\t\t\t\t\trichTextDataEnd.start ?? richTextDataEnd.end;\n\t\t\t\t\t\tselectionChange( {\n\t\t\t\t\t\t\tstart: {\n\t\t\t\t\t\t\t\tclientId: startClientId,\n\t\t\t\t\t\t\t\tattributeKey:\n\t\t\t\t\t\t\t\t\trichTextElementStart.dataset\n\t\t\t\t\t\t\t\t\t\t.wpBlockAttributeKey,\n\t\t\t\t\t\t\t\toffset: startOffset,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tend: {\n\t\t\t\t\t\t\t\tclientId: endClientId,\n\t\t\t\t\t\t\t\tattributeKey:\n\t\t\t\t\t\t\t\t\trichTextElementEnd.dataset\n\t\t\t\t\t\t\t\t\t\t.wpBlockAttributeKey,\n\t\t\t\t\t\t\t\toffset: endOffset,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmultiSelect( startClientId, endClientId );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\townerDocument.addEventListener(\n\t\t\t\t'selectionchange',\n\t\t\t\tonSelectionChange\n\t\t\t);\n\t\t\tdefaultView.addEventListener( 'mouseup', onSelectionChange );\n\t\t\treturn () => {\n\t\t\t\townerDocument.removeEventListener(\n\t\t\t\t\t'selectionchange',\n\t\t\t\t\tonSelectionChange\n\t\t\t\t);\n\t\t\t\tdefaultView.removeEventListener( 'mouseup', onSelectionChange );\n\t\t\t};\n\t\t},\n\t\t[ multiSelect, selectBlock, selectionChange, getBlockParents ]\n\t);\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_data","require","_compose","_richText","_dom","_store","_dom2","extractSelectionStartNode","selection","anchorNode","anchorOffset","nodeType","TEXT_NODE","childNodes","extractSelectionEndNode","focusNode","focusOffset","length","isSelectionForward","_focusNode$previousSi","previousSibling","parentElement","findDepth","a","b","depth","setContentEditableWrapper","node","value","contentEditable","String","focus","getRichTextElement","element","ELEMENT_NODE","closest","useSelectionObserver","multiSelect","selectBlock","selectionChange","useDispatch","blockEditorStore","getBlockParents","getBlockSelectionStart","isMultiSelecting","useSelect","useRefEffect","ownerDocument","defaultView","onSelectionChange","event","getSelection","rangeCount","startNode","endNode","contains","isClickShift","shiftKey","type","isCollapsed","startClientId","getBlockClientId","endClientId","selectedClientId","clickedClientId","target","focusNodeIsNonSelectable","undefined","isSingularSelection","startPath","endPath","richTextElementStart","richTextElementEnd","_richTextDataStart$st","_richTextDataEnd$star","range","getRangeAt","richTextDataStart","create","__unstableIsEditableTree","richTextDataEnd","startOffset","start","end","endOffset","clientId","attributeKey","dataset","wpBlockAttributeKey","offset","addEventListener","removeEventListener"],"sources":["@wordpress/block-editor/src/components/writing-flow/use-selection-observer.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { useRefEffect } from '@wordpress/compose';\nimport { create } from '@wordpress/rich-text';\nimport { isSelectionForward } from '@wordpress/dom';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\nimport { getBlockClientId } from '../../utils/dom';\n\n/**\n * Extract the selection start node from the selection. When the anchor node is\n * not a text node, the selection offset is the index of a child node.\n *\n * @param {Selection} selection The selection.\n *\n * @return {Element} The selection start node.\n */\nfunction extractSelectionStartNode( selection ) {\n\tconst { anchorNode, anchorOffset } = selection;\n\n\tif ( anchorNode.nodeType === anchorNode.TEXT_NODE ) {\n\t\treturn anchorNode;\n\t}\n\n\tif ( anchorOffset === 0 ) {\n\t\treturn anchorNode;\n\t}\n\n\treturn anchorNode.childNodes[ anchorOffset - 1 ];\n}\n\n/**\n * Extract the selection end node from the selection. When the focus node is not\n * a text node, the selection offset is the index of a child node. The selection\n * reaches up to but excluding that child node.\n *\n * @param {Selection} selection The selection.\n *\n * @return {Element} The selection start node.\n */\nfunction extractSelectionEndNode( selection ) {\n\tconst { focusNode, focusOffset } = selection;\n\n\tif ( focusNode.nodeType === focusNode.TEXT_NODE ) {\n\t\treturn focusNode;\n\t}\n\n\tif ( focusOffset === focusNode.childNodes.length ) {\n\t\treturn focusNode;\n\t}\n\n\t// When the selection is forward (the selection ends with the focus node),\n\t// the selection may extend into the next element with an offset of 0. This\n\t// may trigger multi selection even though the selection does not visually\n\t// end in the next block.\n\tif ( focusOffset === 0 && isSelectionForward( selection ) ) {\n\t\treturn focusNode.previousSibling ?? focusNode.parentElement;\n\t}\n\n\treturn focusNode.childNodes[ focusOffset ];\n}\n\nfunction findDepth( a, b ) {\n\tlet depth = 0;\n\n\twhile ( a[ depth ] === b[ depth ] ) {\n\t\tdepth++;\n\t}\n\n\treturn depth;\n}\n\n/**\n * Sets the `contenteditable` wrapper element to `value`.\n *\n * @param {HTMLElement} node Block element.\n * @param {boolean} value `contentEditable` value (true or false)\n */\nfunction setContentEditableWrapper( node, value ) {\n\t// Since we are calling this on every selection change, check if the value\n\t// needs to be updated first because it trigger the browser to recalculate\n\t// style.\n\tif ( node.contentEditable !== String( value ) ) {\n\t\tnode.contentEditable = value;\n\n\t\t// Firefox doesn't automatically move focus.\n\t\tif ( value ) {\n\t\t\tnode.focus();\n\t\t}\n\t}\n}\n\nfunction getRichTextElement( node ) {\n\tconst element =\n\t\tnode.nodeType === node.ELEMENT_NODE ? node : node.parentElement;\n\treturn element?.closest( '[data-wp-block-attribute-key]' );\n}\n\n/**\n * Sets a multi-selection based on the native selection across blocks.\n */\nexport default function useSelectionObserver() {\n\tconst { multiSelect, selectBlock, selectionChange } =\n\t\tuseDispatch( blockEditorStore );\n\tconst { getBlockParents, getBlockSelectionStart, isMultiSelecting } =\n\t\tuseSelect( blockEditorStore );\n\treturn useRefEffect(\n\t\t( node ) => {\n\t\t\tconst { ownerDocument } = node;\n\t\t\tconst { defaultView } = ownerDocument;\n\n\t\t\tfunction onSelectionChange( event ) {\n\t\t\t\tconst selection = defaultView.getSelection();\n\n\t\t\t\tif ( ! selection.rangeCount ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst startNode = extractSelectionStartNode( selection );\n\t\t\t\tconst endNode = extractSelectionEndNode( selection );\n\n\t\t\t\tif (\n\t\t\t\t\t! node.contains( startNode ) ||\n\t\t\t\t\t! node.contains( endNode )\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// If selection is collapsed and we haven't used `shift+click`,\n\t\t\t\t// end multi selection and disable the contentEditable wrapper.\n\t\t\t\t// We have to check about `shift+click` case because elements\n\t\t\t\t// that don't support text selection might be involved, and we might\n\t\t\t\t// update the clientIds to multi-select blocks.\n\t\t\t\t// For now we check if the event is a `mouse` event.\n\t\t\t\tconst isClickShift = event.shiftKey && event.type === 'mouseup';\n\t\t\t\tif ( selection.isCollapsed && ! isClickShift ) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tnode.contentEditable === 'true' &&\n\t\t\t\t\t\t! isMultiSelecting()\n\t\t\t\t\t) {\n\t\t\t\t\t\tsetContentEditableWrapper( node, false );\n\t\t\t\t\t\tlet element =\n\t\t\t\t\t\t\tstartNode.nodeType === startNode.ELEMENT_NODE\n\t\t\t\t\t\t\t\t? startNode\n\t\t\t\t\t\t\t\t: startNode.parentElement;\n\t\t\t\t\t\telement = element?.closest( '[contenteditable]' );\n\t\t\t\t\t\telement?.focus();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet startClientId = getBlockClientId( startNode );\n\t\t\t\tlet endClientId = getBlockClientId( endNode );\n\n\t\t\t\t// If the selection has changed and we had pressed `shift+click`,\n\t\t\t\t// we need to check if in an element that doesn't support\n\t\t\t\t// text selection has been clicked.\n\t\t\t\tif ( isClickShift ) {\n\t\t\t\t\tconst selectedClientId = getBlockSelectionStart();\n\t\t\t\t\tconst clickedClientId = getBlockClientId( event.target );\n\t\t\t\t\t// `endClientId` is not defined if we end the selection by clicking a non-selectable block.\n\t\t\t\t\t// We need to check if there was already a selection with a non-selectable focusNode.\n\t\t\t\t\tconst focusNodeIsNonSelectable =\n\t\t\t\t\t\tclickedClientId !== endClientId;\n\t\t\t\t\tif (\n\t\t\t\t\t\t( startClientId === endClientId &&\n\t\t\t\t\t\t\tselection.isCollapsed ) ||\n\t\t\t\t\t\t! endClientId ||\n\t\t\t\t\t\tfocusNodeIsNonSelectable\n\t\t\t\t\t) {\n\t\t\t\t\t\tendClientId = clickedClientId;\n\t\t\t\t\t}\n\t\t\t\t\t// Handle the case when we have a non-selectable block\n\t\t\t\t\t// selected and click another one.\n\t\t\t\t\tif ( startClientId !== selectedClientId ) {\n\t\t\t\t\t\tstartClientId = selectedClientId;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If the selection did not involve a block, return.\n\t\t\t\tif (\n\t\t\t\t\tstartClientId === undefined &&\n\t\t\t\t\tendClientId === undefined\n\t\t\t\t) {\n\t\t\t\t\tsetContentEditableWrapper( node, false );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst isSingularSelection = startClientId === endClientId;\n\t\t\t\tif ( isSingularSelection ) {\n\t\t\t\t\tif ( ! isMultiSelecting() ) {\n\t\t\t\t\t\tselectBlock( startClientId );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmultiSelect( startClientId, startClientId );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst startPath = [\n\t\t\t\t\t\t...getBlockParents( startClientId ),\n\t\t\t\t\t\tstartClientId,\n\t\t\t\t\t];\n\t\t\t\t\tconst endPath = [\n\t\t\t\t\t\t...getBlockParents( endClientId ),\n\t\t\t\t\t\tendClientId,\n\t\t\t\t\t];\n\t\t\t\t\tconst depth = findDepth( startPath, endPath );\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tstartPath[ depth ] !== startClientId ||\n\t\t\t\t\t\tendPath[ depth ] !== endClientId\n\t\t\t\t\t) {\n\t\t\t\t\t\tmultiSelect( startPath[ depth ], endPath[ depth ] );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst richTextElementStart =\n\t\t\t\t\t\tgetRichTextElement( startNode );\n\t\t\t\t\tconst richTextElementEnd = getRichTextElement( endNode );\n\n\t\t\t\t\tif ( richTextElementStart && richTextElementEnd ) {\n\t\t\t\t\t\tconst range = selection.getRangeAt( 0 );\n\t\t\t\t\t\tconst richTextDataStart = create( {\n\t\t\t\t\t\t\telement: richTextElementStart,\n\t\t\t\t\t\t\trange,\n\t\t\t\t\t\t\t__unstableIsEditableTree: true,\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tconst richTextDataEnd = create( {\n\t\t\t\t\t\t\telement: richTextElementEnd,\n\t\t\t\t\t\t\trange,\n\t\t\t\t\t\t\t__unstableIsEditableTree: true,\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tconst startOffset =\n\t\t\t\t\t\t\trichTextDataStart.start ?? richTextDataStart.end;\n\t\t\t\t\t\tconst endOffset =\n\t\t\t\t\t\t\trichTextDataEnd.start ?? richTextDataEnd.end;\n\t\t\t\t\t\tselectionChange( {\n\t\t\t\t\t\t\tstart: {\n\t\t\t\t\t\t\t\tclientId: startClientId,\n\t\t\t\t\t\t\t\tattributeKey:\n\t\t\t\t\t\t\t\t\trichTextElementStart.dataset\n\t\t\t\t\t\t\t\t\t\t.wpBlockAttributeKey,\n\t\t\t\t\t\t\t\toffset: startOffset,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tend: {\n\t\t\t\t\t\t\t\tclientId: endClientId,\n\t\t\t\t\t\t\t\tattributeKey:\n\t\t\t\t\t\t\t\t\trichTextElementEnd.dataset\n\t\t\t\t\t\t\t\t\t\t.wpBlockAttributeKey,\n\t\t\t\t\t\t\t\toffset: endOffset,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmultiSelect( startClientId, endClientId );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\townerDocument.addEventListener(\n\t\t\t\t'selectionchange',\n\t\t\t\tonSelectionChange\n\t\t\t);\n\t\t\tdefaultView.addEventListener( 'mouseup', onSelectionChange );\n\t\t\treturn () => {\n\t\t\t\townerDocument.removeEventListener(\n\t\t\t\t\t'selectionchange',\n\t\t\t\t\tonSelectionChange\n\t\t\t\t);\n\t\t\t\tdefaultView.removeEventListener( 'mouseup', onSelectionChange );\n\t\t\t};\n\t\t},\n\t\t[ multiSelect, selectBlock, selectionChange, getBlockParents ]\n\t);\n}\n"],"mappings":"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","ignoreList":[]}
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.getPasteBlocks = getPasteBlocks;
7
- exports.getSelectionRoot = getSelectionRoot;
8
7
  exports.requiresWrapperOnCopy = void 0;
9
8
  exports.setClipboardBlocks = setClipboardBlocks;
10
9
  var _dom = require("@wordpress/dom");
@@ -101,30 +100,4 @@ function toPlainText(html) {
101
100
  // Merge any consecutive line breaks
102
101
  return plainText.replace(/\n\n+/g, '\n\n');
103
102
  }
104
-
105
- /**
106
- * Gets the current content editable root element based on the selection.
107
- * @param {Document} ownerDocument
108
- * @return {Element|undefined} The content editable root element.
109
- */
110
- function getSelectionRoot(ownerDocument) {
111
- const {
112
- defaultView
113
- } = ownerDocument;
114
- const {
115
- anchorNode,
116
- focusNode
117
- } = defaultView.getSelection();
118
- if (!anchorNode || !focusNode) {
119
- return;
120
- }
121
- const anchorElement = (anchorNode.nodeType === anchorNode.ELEMENT_NODE ? anchorNode : anchorNode.parentElement).closest('[contenteditable]');
122
- if (!anchorElement) {
123
- return;
124
- }
125
- if (!anchorElement.contains(focusNode)) {
126
- return;
127
- }
128
- return anchorElement;
129
- }
130
103
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_dom","require","_blocks2","_pasting","_store","requiresWrapperOnCopy","exports","Symbol","setClipboardBlocks","event","blocks","registry","_blocks","firstBlock","firstBlockType","select","blocksStore","getBlockType","name","getBlockRootClientId","getBlockName","getBlockAttributes","blockEditorStore","wrapperBlockClientId","clientId","wrapperBlockName","createBlock","serialized","serialize","clipboardData","setData","toPlainText","getPasteBlocks","canUserUseUnfilteredHTML","plainText","html","files","getPasteEventData","length","fromTransforms","getBlockTransforms","reduce","accumulator","file","transformation","findTransform","transform","type","isMatch","push","flat","pasteHandler","HTML","mode","replace","stripHTML","trim","getSelectionRoot","ownerDocument","defaultView","anchorNode","focusNode","getSelection","anchorElement","nodeType","ELEMENT_NODE","parentElement","closest","contains"],"sources":["@wordpress/block-editor/src/components/writing-flow/utils.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __unstableStripHTML as stripHTML } from '@wordpress/dom';\nimport {\n\tserialize,\n\tcreateBlock,\n\tpasteHandler,\n\tfindTransform,\n\tgetBlockTransforms,\n\tstore as blocksStore,\n} from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport { getPasteEventData } from '../../utils/pasting';\nimport { store as blockEditorStore } from '../../store';\n\nexport const requiresWrapperOnCopy = Symbol( 'requiresWrapperOnCopy' );\n\n/**\n * Sets the clipboard data for the provided blocks, with both HTML and plain\n * text representations.\n *\n * @param {ClipboardEvent} event Clipboard event.\n * @param {WPBlock[]} blocks Blocks to set as clipboard data.\n * @param {Object} registry The registry to select from.\n */\nexport function setClipboardBlocks( event, blocks, registry ) {\n\tlet _blocks = blocks;\n\n\tconst [ firstBlock ] = blocks;\n\n\tif ( firstBlock ) {\n\t\tconst firstBlockType = registry\n\t\t\t.select( blocksStore )\n\t\t\t.getBlockType( firstBlock.name );\n\n\t\tif ( firstBlockType[ requiresWrapperOnCopy ] ) {\n\t\t\tconst { getBlockRootClientId, getBlockName, getBlockAttributes } =\n\t\t\t\tregistry.select( blockEditorStore );\n\t\t\tconst wrapperBlockClientId = getBlockRootClientId(\n\t\t\t\tfirstBlock.clientId\n\t\t\t);\n\t\t\tconst wrapperBlockName = getBlockName( wrapperBlockClientId );\n\n\t\t\tif ( wrapperBlockName ) {\n\t\t\t\t_blocks = createBlock(\n\t\t\t\t\twrapperBlockName,\n\t\t\t\t\tgetBlockAttributes( wrapperBlockClientId ),\n\t\t\t\t\t_blocks\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst serialized = serialize( _blocks );\n\n\tevent.clipboardData.setData( 'text/plain', toPlainText( serialized ) );\n\tevent.clipboardData.setData( 'text/html', serialized );\n}\n\n/**\n * Returns the blocks to be pasted from the clipboard event.\n *\n * @param {ClipboardEvent} event The clipboard event.\n * @param {boolean} canUserUseUnfilteredHTML Whether the user can or can't post unfiltered HTML.\n * @return {Array|string} A list of blocks or a string, depending on `handlerMode`.\n */\nexport function getPasteBlocks( event, canUserUseUnfilteredHTML ) {\n\tconst { plainText, html, files } = getPasteEventData( event );\n\tlet blocks = [];\n\n\tif ( files.length ) {\n\t\tconst fromTransforms = getBlockTransforms( 'from' );\n\t\tblocks = files\n\t\t\t.reduce( ( accumulator, file ) => {\n\t\t\t\tconst transformation = findTransform(\n\t\t\t\t\tfromTransforms,\n\t\t\t\t\t( transform ) =>\n\t\t\t\t\t\ttransform.type === 'files' &&\n\t\t\t\t\t\ttransform.isMatch( [ file ] )\n\t\t\t\t);\n\t\t\t\tif ( transformation ) {\n\t\t\t\t\taccumulator.push( transformation.transform( [ file ] ) );\n\t\t\t\t}\n\t\t\t\treturn accumulator;\n\t\t\t}, [] )\n\t\t\t.flat();\n\t} else {\n\t\tblocks = pasteHandler( {\n\t\t\tHTML: html,\n\t\t\tplainText,\n\t\t\tmode: 'BLOCKS',\n\t\t\tcanUserUseUnfilteredHTML,\n\t\t} );\n\t}\n\n\treturn blocks;\n}\n\n/**\n * Given a string of HTML representing serialized blocks, returns the plain\n * text extracted after stripping the HTML of any tags and fixing line breaks.\n *\n * @param {string} html Serialized blocks.\n * @return {string} The plain-text content with any html removed.\n */\nfunction toPlainText( html ) {\n\t// Manually handle BR tags as line breaks prior to `stripHTML` call\n\thtml = html.replace( /<br>/g, '\\n' );\n\n\tconst plainText = stripHTML( html ).trim();\n\n\t// Merge any consecutive line breaks\n\treturn plainText.replace( /\\n\\n+/g, '\\n\\n' );\n}\n\n/**\n * Gets the current content editable root element based on the selection.\n * @param {Document} ownerDocument\n * @return {Element|undefined} The content editable root element.\n */\nexport function getSelectionRoot( ownerDocument ) {\n\tconst { defaultView } = ownerDocument;\n\tconst { anchorNode, focusNode } = defaultView.getSelection();\n\n\tif ( ! anchorNode || ! focusNode ) {\n\t\treturn;\n\t}\n\n\tconst anchorElement = (\n\t\tanchorNode.nodeType === anchorNode.ELEMENT_NODE\n\t\t\t? anchorNode\n\t\t\t: anchorNode.parentElement\n\t).closest( '[contenteditable]' );\n\n\tif ( ! anchorElement ) {\n\t\treturn;\n\t}\n\n\tif ( ! anchorElement.contains( focusNode ) ) {\n\t\treturn;\n\t}\n\n\treturn anchorElement;\n}\n"],"mappings":";;;;;;;;;AAGA,IAAAA,IAAA,GAAAC,OAAA;AACA,IAAAC,QAAA,GAAAD,OAAA;AAYA,IAAAE,QAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AAjBA;AACA;AACA;;AAWA;AACA;AACA;;AAIO,MAAMI,qBAAqB,GAAAC,OAAA,CAAAD,qBAAA,GAAGE,MAAM,CAAE,uBAAwB,CAAC;;AAEtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,kBAAkBA,CAAEC,KAAK,EAAEC,MAAM,EAAEC,QAAQ,EAAG;EAC7D,IAAIC,OAAO,GAAGF,MAAM;EAEpB,MAAM,CAAEG,UAAU,CAAE,GAAGH,MAAM;EAE7B,IAAKG,UAAU,EAAG;IACjB,MAAMC,cAAc,GAAGH,QAAQ,CAC7BI,MAAM,CAAEC,cAAY,CAAC,CACrBC,YAAY,CAAEJ,UAAU,CAACK,IAAK,CAAC;IAEjC,IAAKJ,cAAc,CAAET,qBAAqB,CAAE,EAAG;MAC9C,MAAM;QAAEc,oBAAoB;QAAEC,YAAY;QAAEC;MAAmB,CAAC,GAC/DV,QAAQ,CAACI,MAAM,CAAEO,YAAiB,CAAC;MACpC,MAAMC,oBAAoB,GAAGJ,oBAAoB,CAChDN,UAAU,CAACW,QACZ,CAAC;MACD,MAAMC,gBAAgB,GAAGL,YAAY,CAAEG,oBAAqB,CAAC;MAE7D,IAAKE,gBAAgB,EAAG;QACvBb,OAAO,GAAG,IAAAc,oBAAW,EACpBD,gBAAgB,EAChBJ,kBAAkB,CAAEE,oBAAqB,CAAC,EAC1CX,OACD,CAAC;MACF;IACD;EACD;EAEA,MAAMe,UAAU,GAAG,IAAAC,kBAAS,EAAEhB,OAAQ,CAAC;EAEvCH,KAAK,CAACoB,aAAa,CAACC,OAAO,CAAE,YAAY,EAAEC,WAAW,CAAEJ,UAAW,CAAE,CAAC;EACtElB,KAAK,CAACoB,aAAa,CAACC,OAAO,CAAE,WAAW,EAAEH,UAAW,CAAC;AACvD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASK,cAAcA,CAAEvB,KAAK,EAAEwB,wBAAwB,EAAG;EACjE,MAAM;IAAEC,SAAS;IAAEC,IAAI;IAAEC;EAAM,CAAC,GAAG,IAAAC,0BAAiB,EAAE5B,KAAM,CAAC;EAC7D,IAAIC,MAAM,GAAG,EAAE;EAEf,IAAK0B,KAAK,CAACE,MAAM,EAAG;IACnB,MAAMC,cAAc,GAAG,IAAAC,2BAAkB,EAAE,MAAO,CAAC;IACnD9B,MAAM,GAAG0B,KAAK,CACZK,MAAM,CAAE,CAAEC,WAAW,EAAEC,IAAI,KAAM;MACjC,MAAMC,cAAc,GAAG,IAAAC,sBAAa,EACnCN,cAAc,EACZO,SAAS,IACVA,SAAS,CAACC,IAAI,KAAK,OAAO,IAC1BD,SAAS,CAACE,OAAO,CAAE,CAAEL,IAAI,CAAG,CAC9B,CAAC;MACD,IAAKC,cAAc,EAAG;QACrBF,WAAW,CAACO,IAAI,CAAEL,cAAc,CAACE,SAAS,CAAE,CAAEH,IAAI,CAAG,CAAE,CAAC;MACzD;MACA,OAAOD,WAAW;IACnB,CAAC,EAAE,EAAG,CAAC,CACNQ,IAAI,CAAC,CAAC;EACT,CAAC,MAAM;IACNxC,MAAM,GAAG,IAAAyC,qBAAY,EAAE;MACtBC,IAAI,EAAEjB,IAAI;MACVD,SAAS;MACTmB,IAAI,EAAE,QAAQ;MACdpB;IACD,CAAE,CAAC;EACJ;EAEA,OAAOvB,MAAM;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASqB,WAAWA,CAAEI,IAAI,EAAG;EAC5B;EACAA,IAAI,GAAGA,IAAI,CAACmB,OAAO,CAAE,OAAO,EAAE,IAAK,CAAC;EAEpC,MAAMpB,SAAS,GAAG,IAAAqB,wBAAS,EAAEpB,IAAK,CAAC,CAACqB,IAAI,CAAC,CAAC;;EAE1C;EACA,OAAOtB,SAAS,CAACoB,OAAO,CAAE,QAAQ,EAAE,MAAO,CAAC;AAC7C;;AAEA;AACA;AACA;AACA;AACA;AACO,SAASG,gBAAgBA,CAAEC,aAAa,EAAG;EACjD,MAAM;IAAEC;EAAY,CAAC,GAAGD,aAAa;EACrC,MAAM;IAAEE,UAAU;IAAEC;EAAU,CAAC,GAAGF,WAAW,CAACG,YAAY,CAAC,CAAC;EAE5D,IAAK,CAAEF,UAAU,IAAI,CAAEC,SAAS,EAAG;IAClC;EACD;EAEA,MAAME,aAAa,GAAG,CACrBH,UAAU,CAACI,QAAQ,KAAKJ,UAAU,CAACK,YAAY,GAC5CL,UAAU,GACVA,UAAU,CAACM,aAAa,EAC1BC,OAAO,CAAE,mBAAoB,CAAC;EAEhC,IAAK,CAAEJ,aAAa,EAAG;IACtB;EACD;EAEA,IAAK,CAAEA,aAAa,CAACK,QAAQ,CAAEP,SAAU,CAAC,EAAG;IAC5C;EACD;EAEA,OAAOE,aAAa;AACrB","ignoreList":[]}
1
+ {"version":3,"names":["_dom","require","_blocks2","_pasting","_store","requiresWrapperOnCopy","exports","Symbol","setClipboardBlocks","event","blocks","registry","_blocks","firstBlock","firstBlockType","select","blocksStore","getBlockType","name","getBlockRootClientId","getBlockName","getBlockAttributes","blockEditorStore","wrapperBlockClientId","clientId","wrapperBlockName","createBlock","serialized","serialize","clipboardData","setData","toPlainText","getPasteBlocks","canUserUseUnfilteredHTML","plainText","html","files","getPasteEventData","length","fromTransforms","getBlockTransforms","reduce","accumulator","file","transformation","findTransform","transform","type","isMatch","push","flat","pasteHandler","HTML","mode","replace","stripHTML","trim"],"sources":["@wordpress/block-editor/src/components/writing-flow/utils.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __unstableStripHTML as stripHTML } from '@wordpress/dom';\nimport {\n\tserialize,\n\tcreateBlock,\n\tpasteHandler,\n\tfindTransform,\n\tgetBlockTransforms,\n\tstore as blocksStore,\n} from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport { getPasteEventData } from '../../utils/pasting';\nimport { store as blockEditorStore } from '../../store';\n\nexport const requiresWrapperOnCopy = Symbol( 'requiresWrapperOnCopy' );\n\n/**\n * Sets the clipboard data for the provided blocks, with both HTML and plain\n * text representations.\n *\n * @param {ClipboardEvent} event Clipboard event.\n * @param {WPBlock[]} blocks Blocks to set as clipboard data.\n * @param {Object} registry The registry to select from.\n */\nexport function setClipboardBlocks( event, blocks, registry ) {\n\tlet _blocks = blocks;\n\n\tconst [ firstBlock ] = blocks;\n\n\tif ( firstBlock ) {\n\t\tconst firstBlockType = registry\n\t\t\t.select( blocksStore )\n\t\t\t.getBlockType( firstBlock.name );\n\n\t\tif ( firstBlockType[ requiresWrapperOnCopy ] ) {\n\t\t\tconst { getBlockRootClientId, getBlockName, getBlockAttributes } =\n\t\t\t\tregistry.select( blockEditorStore );\n\t\t\tconst wrapperBlockClientId = getBlockRootClientId(\n\t\t\t\tfirstBlock.clientId\n\t\t\t);\n\t\t\tconst wrapperBlockName = getBlockName( wrapperBlockClientId );\n\n\t\t\tif ( wrapperBlockName ) {\n\t\t\t\t_blocks = createBlock(\n\t\t\t\t\twrapperBlockName,\n\t\t\t\t\tgetBlockAttributes( wrapperBlockClientId ),\n\t\t\t\t\t_blocks\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst serialized = serialize( _blocks );\n\n\tevent.clipboardData.setData( 'text/plain', toPlainText( serialized ) );\n\tevent.clipboardData.setData( 'text/html', serialized );\n}\n\n/**\n * Returns the blocks to be pasted from the clipboard event.\n *\n * @param {ClipboardEvent} event The clipboard event.\n * @param {boolean} canUserUseUnfilteredHTML Whether the user can or can't post unfiltered HTML.\n * @return {Array|string} A list of blocks or a string, depending on `handlerMode`.\n */\nexport function getPasteBlocks( event, canUserUseUnfilteredHTML ) {\n\tconst { plainText, html, files } = getPasteEventData( event );\n\tlet blocks = [];\n\n\tif ( files.length ) {\n\t\tconst fromTransforms = getBlockTransforms( 'from' );\n\t\tblocks = files\n\t\t\t.reduce( ( accumulator, file ) => {\n\t\t\t\tconst transformation = findTransform(\n\t\t\t\t\tfromTransforms,\n\t\t\t\t\t( transform ) =>\n\t\t\t\t\t\ttransform.type === 'files' &&\n\t\t\t\t\t\ttransform.isMatch( [ file ] )\n\t\t\t\t);\n\t\t\t\tif ( transformation ) {\n\t\t\t\t\taccumulator.push( transformation.transform( [ file ] ) );\n\t\t\t\t}\n\t\t\t\treturn accumulator;\n\t\t\t}, [] )\n\t\t\t.flat();\n\t} else {\n\t\tblocks = pasteHandler( {\n\t\t\tHTML: html,\n\t\t\tplainText,\n\t\t\tmode: 'BLOCKS',\n\t\t\tcanUserUseUnfilteredHTML,\n\t\t} );\n\t}\n\n\treturn blocks;\n}\n\n/**\n * Given a string of HTML representing serialized blocks, returns the plain\n * text extracted after stripping the HTML of any tags and fixing line breaks.\n *\n * @param {string} html Serialized blocks.\n * @return {string} The plain-text content with any html removed.\n */\nfunction toPlainText( html ) {\n\t// Manually handle BR tags as line breaks prior to `stripHTML` call\n\thtml = html.replace( /<br>/g, '\\n' );\n\n\tconst plainText = stripHTML( html ).trim();\n\n\t// Merge any consecutive line breaks\n\treturn plainText.replace( /\\n\\n+/g, '\\n\\n' );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -260,18 +260,22 @@ function LayoutTypeSwitcher({
260
260
  type,
261
261
  onChange
262
262
  }) {
263
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.ButtonGroup, {
263
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.__experimentalToggleGroupControl, {
264
+ __next40pxDefaultSize: true,
265
+ isBlock: true,
266
+ label: (0, _i18n.__)('Layout type'),
267
+ __nextHasNoMarginBottom: true,
268
+ hideLabelFromVision: true,
269
+ isAdaptiveWidth: true,
270
+ value: type,
271
+ onChange: onChange,
264
272
  children: (0, _layouts.getLayoutTypes)().map(({
265
273
  name,
266
274
  label
267
275
  }) => {
268
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.Button
269
- // TODO: Switch to `true` (40px size) if possible
270
- , {
271
- __next40pxDefaultSize: false,
272
- isPressed: type === name,
273
- onClick: () => onChange(name),
274
- children: label
276
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.__experimentalToggleGroupControlOption, {
277
+ value: name,
278
+ label: label
275
279
  }, name);
276
280
  })
277
281
  });