@wordpress/block-editor 12.14.0 → 12.15.0

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 (240) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +1 -1
  3. package/build/components/block-list/block.native.js +2 -0
  4. package/build/components/block-list/block.native.js.map +1 -1
  5. package/build/components/block-parent-selector/index.js +1 -1
  6. package/build/components/block-parent-selector/index.js.map +1 -1
  7. package/build/components/block-pattern-setup/index.js +25 -16
  8. package/build/components/block-pattern-setup/index.js.map +1 -1
  9. package/build/components/block-pattern-setup/setup-toolbar.js +4 -2
  10. package/build/components/block-pattern-setup/setup-toolbar.js.map +1 -1
  11. package/build/components/block-patterns-list/index.js +36 -19
  12. package/build/components/block-patterns-list/index.js.map +1 -1
  13. package/build/components/block-rename/index.js +28 -0
  14. package/build/components/block-rename/index.js.map +1 -0
  15. package/build/components/block-rename/is-empty-string.js +10 -0
  16. package/build/components/block-rename/is-empty-string.js.map +1 -0
  17. package/build/components/block-rename/modal.js +87 -0
  18. package/build/components/block-rename/modal.js.map +1 -0
  19. package/build/components/block-rename/rename-control.js +74 -0
  20. package/build/components/block-rename/rename-control.js.map +1 -0
  21. package/build/components/block-rename/use-block-rename.js +17 -0
  22. package/build/components/block-rename/use-block-rename.js.map +1 -0
  23. package/build/components/block-settings-menu/block-settings-dropdown.js +33 -20
  24. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  25. package/build/components/block-settings-menu-controls/index.js +7 -0
  26. package/build/components/block-settings-menu-controls/index.js.map +1 -1
  27. package/build/components/block-toolbar/block-toolbar-menu.native.js +1 -1
  28. package/build/components/block-toolbar/block-toolbar-menu.native.js.map +1 -1
  29. package/build/components/block-types-list/index.js +6 -2
  30. package/build/components/block-types-list/index.js.map +1 -1
  31. package/build/components/date-format-picker/index.js +8 -1
  32. package/build/components/date-format-picker/index.js.map +1 -1
  33. package/build/components/global-styles/advanced-panel.js +1 -1
  34. package/build/components/global-styles/advanced-panel.js.map +1 -1
  35. package/build/components/image-size-control/index.js +0 -5
  36. package/build/components/image-size-control/index.js.map +1 -1
  37. package/build/components/inner-blocks/index.js +3 -1
  38. package/build/components/inner-blocks/index.js.map +1 -1
  39. package/build/components/inner-blocks/warning-max-depth-exceeded.native.js +29 -31
  40. package/build/components/inner-blocks/warning-max-depth-exceeded.native.js.map +1 -1
  41. package/build/components/inserter/block-patterns-explorer/pattern-list.js +1 -1
  42. package/build/components/inserter/block-patterns-explorer/pattern-list.js.map +1 -1
  43. package/build/components/inserter/block-patterns-tab/pattern-category-previews.js +1 -1
  44. package/build/components/inserter/block-patterns-tab/pattern-category-previews.js.map +1 -1
  45. package/build/components/inserter/block-patterns-tab/use-pattern-categories.js +1 -1
  46. package/build/components/inserter/block-patterns-tab/use-pattern-categories.js.map +1 -1
  47. package/build/components/inserter/block-patterns-tab/utils.js +3 -4
  48. package/build/components/inserter/block-patterns-tab/utils.js.map +1 -1
  49. package/build/components/inserter/hooks/use-patterns-state.js +2 -1
  50. package/build/components/inserter/hooks/use-patterns-state.js.map +1 -1
  51. package/build/components/inserter-listbox/index.js +11 -6
  52. package/build/components/inserter-listbox/index.js.map +1 -1
  53. package/build/components/inserter-listbox/item.js +24 -23
  54. package/build/components/inserter-listbox/item.js.map +1 -1
  55. package/build/components/inserter-listbox/row.js +5 -5
  56. package/build/components/inserter-listbox/row.js.map +1 -1
  57. package/build/components/list-view/use-list-view-expand-selected-item.js +2 -3
  58. package/build/components/list-view/use-list-view-expand-selected-item.js.map +1 -1
  59. package/build/components/preview-options/index.js +4 -2
  60. package/build/components/preview-options/index.js.map +1 -1
  61. package/build/components/rich-text/index.native.js +1 -1
  62. package/build/components/rich-text/index.native.js.map +1 -1
  63. package/build/components/rich-text/native/index.native.js +34 -3
  64. package/build/components/rich-text/native/index.native.js.map +1 -1
  65. package/build/components/rich-text/use-input-rules.js +30 -1
  66. package/build/components/rich-text/use-input-rules.js.map +1 -1
  67. package/build/components/spacing-sizes-control/input-controls/spacing-input-control.js +1 -1
  68. package/build/components/spacing-sizes-control/input-controls/spacing-input-control.js.map +1 -1
  69. package/build/components/use-block-drop-zone/index.js +4 -1
  70. package/build/components/use-block-drop-zone/index.js.map +1 -1
  71. package/build/components/use-moving-animation/index.js +2 -1
  72. package/build/components/use-moving-animation/index.js.map +1 -1
  73. package/build/components/use-settings/index.js +2 -2
  74. package/build/components/use-settings/index.js.map +1 -1
  75. package/build/hooks/block-renaming.js +42 -0
  76. package/build/hooks/block-renaming.js.map +1 -1
  77. package/build/hooks/custom-fields.js +53 -48
  78. package/build/hooks/custom-fields.js.map +1 -1
  79. package/build/hooks/index.js +0 -1
  80. package/build/hooks/index.js.map +1 -1
  81. package/build/hooks/layout.js +13 -7
  82. package/build/hooks/layout.js.map +1 -1
  83. package/build/layouts/constrained.js +4 -3
  84. package/build/layouts/constrained.js.map +1 -1
  85. package/build/store/selectors.js +2 -0
  86. package/build/store/selectors.js.map +1 -1
  87. package/build/utils/transform-styles/index.js +26 -6
  88. package/build/utils/transform-styles/index.js.map +1 -1
  89. package/build-module/components/block-list/block.native.js +2 -0
  90. package/build-module/components/block-list/block.native.js.map +1 -1
  91. package/build-module/components/block-parent-selector/index.js +1 -1
  92. package/build-module/components/block-parent-selector/index.js.map +1 -1
  93. package/build-module/components/block-pattern-setup/index.js +24 -15
  94. package/build-module/components/block-pattern-setup/index.js.map +1 -1
  95. package/build-module/components/block-pattern-setup/setup-toolbar.js +4 -2
  96. package/build-module/components/block-pattern-setup/setup-toolbar.js.map +1 -1
  97. package/build-module/components/block-patterns-list/index.js +36 -19
  98. package/build-module/components/block-patterns-list/index.js.map +1 -1
  99. package/build-module/components/block-rename/index.js +4 -0
  100. package/build-module/components/block-rename/index.js.map +1 -0
  101. package/build-module/components/block-rename/is-empty-string.js +4 -0
  102. package/build-module/components/block-rename/is-empty-string.js.map +1 -0
  103. package/build-module/components/block-rename/modal.js +79 -0
  104. package/build-module/components/block-rename/modal.js.map +1 -0
  105. package/build-module/components/block-rename/rename-control.js +66 -0
  106. package/build-module/components/block-rename/rename-control.js.map +1 -0
  107. package/build-module/components/block-rename/use-block-rename.js +10 -0
  108. package/build-module/components/block-rename/use-block-rename.js.map +1 -0
  109. package/build-module/components/block-settings-menu/block-settings-dropdown.js +34 -21
  110. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  111. package/build-module/components/block-settings-menu-controls/index.js +7 -0
  112. package/build-module/components/block-settings-menu-controls/index.js.map +1 -1
  113. package/build-module/components/block-toolbar/block-toolbar-menu.native.js +1 -1
  114. package/build-module/components/block-toolbar/block-toolbar-menu.native.js.map +1 -1
  115. package/build-module/components/block-types-list/index.js +6 -2
  116. package/build-module/components/block-types-list/index.js.map +1 -1
  117. package/build-module/components/date-format-picker/index.js +8 -1
  118. package/build-module/components/date-format-picker/index.js.map +1 -1
  119. package/build-module/components/global-styles/advanced-panel.js +1 -1
  120. package/build-module/components/global-styles/advanced-panel.js.map +1 -1
  121. package/build-module/components/image-size-control/index.js +0 -5
  122. package/build-module/components/image-size-control/index.js.map +1 -1
  123. package/build-module/components/inner-blocks/index.js +3 -1
  124. package/build-module/components/inner-blocks/index.js.map +1 -1
  125. package/build-module/components/inner-blocks/warning-max-depth-exceeded.native.js +30 -32
  126. package/build-module/components/inner-blocks/warning-max-depth-exceeded.native.js.map +1 -1
  127. package/build-module/components/inserter/block-patterns-explorer/pattern-list.js +2 -2
  128. package/build-module/components/inserter/block-patterns-explorer/pattern-list.js.map +1 -1
  129. package/build-module/components/inserter/block-patterns-tab/pattern-category-previews.js +4 -4
  130. package/build-module/components/inserter/block-patterns-tab/pattern-category-previews.js.map +1 -1
  131. package/build-module/components/inserter/block-patterns-tab/use-pattern-categories.js +2 -2
  132. package/build-module/components/inserter/block-patterns-tab/use-pattern-categories.js.map +1 -1
  133. package/build-module/components/inserter/block-patterns-tab/utils.js +3 -4
  134. package/build-module/components/inserter/block-patterns-tab/utils.js.map +1 -1
  135. package/build-module/components/inserter/hooks/use-patterns-state.js +2 -1
  136. package/build-module/components/inserter/hooks/use-patterns-state.js.map +1 -1
  137. package/build-module/components/inserter-listbox/index.js +13 -8
  138. package/build-module/components/inserter-listbox/index.js.map +1 -1
  139. package/build-module/components/inserter-listbox/item.js +25 -23
  140. package/build-module/components/inserter-listbox/item.js.map +1 -1
  141. package/build-module/components/inserter-listbox/row.js +6 -5
  142. package/build-module/components/inserter-listbox/row.js.map +1 -1
  143. package/build-module/components/list-view/use-list-view-expand-selected-item.js +2 -3
  144. package/build-module/components/list-view/use-list-view-expand-selected-item.js.map +1 -1
  145. package/build-module/components/preview-options/index.js +4 -2
  146. package/build-module/components/preview-options/index.js.map +1 -1
  147. package/build-module/components/rich-text/index.native.js +1 -1
  148. package/build-module/components/rich-text/index.native.js.map +1 -1
  149. package/build-module/components/rich-text/native/index.native.js +34 -3
  150. package/build-module/components/rich-text/native/index.native.js.map +1 -1
  151. package/build-module/components/rich-text/use-input-rules.js +31 -2
  152. package/build-module/components/rich-text/use-input-rules.js.map +1 -1
  153. package/build-module/components/spacing-sizes-control/input-controls/spacing-input-control.js +1 -1
  154. package/build-module/components/spacing-sizes-control/input-controls/spacing-input-control.js.map +1 -1
  155. package/build-module/components/use-block-drop-zone/index.js +4 -1
  156. package/build-module/components/use-block-drop-zone/index.js.map +1 -1
  157. package/build-module/components/use-moving-animation/index.js +2 -1
  158. package/build-module/components/use-moving-animation/index.js.map +1 -1
  159. package/build-module/components/use-settings/index.js +2 -2
  160. package/build-module/components/use-settings/index.js.map +1 -1
  161. package/build-module/hooks/block-renaming.js +40 -0
  162. package/build-module/hooks/block-renaming.js.map +1 -1
  163. package/build-module/hooks/custom-fields.js +53 -48
  164. package/build-module/hooks/custom-fields.js.map +1 -1
  165. package/build-module/hooks/index.js +0 -1
  166. package/build-module/hooks/index.js.map +1 -1
  167. package/build-module/hooks/layout.js +13 -7
  168. package/build-module/hooks/layout.js.map +1 -1
  169. package/build-module/layouts/constrained.js +4 -3
  170. package/build-module/layouts/constrained.js.map +1 -1
  171. package/build-module/store/selectors.js +2 -0
  172. package/build-module/store/selectors.js.map +1 -1
  173. package/build-module/utils/transform-styles/index.js +24 -7
  174. package/build-module/utils/transform-styles/index.js.map +1 -1
  175. package/build-style/content-rtl.css +6 -6
  176. package/build-style/content.css +6 -6
  177. package/build-style/style-rtl.css +10 -5
  178. package/build-style/style.css +10 -5
  179. package/package.json +31 -31
  180. package/src/components/block-list/block.native.js +2 -0
  181. package/src/components/block-parent-selector/index.js +1 -1
  182. package/src/components/block-pattern-setup/index.js +38 -22
  183. package/src/components/block-pattern-setup/setup-toolbar.js +2 -0
  184. package/src/components/block-pattern-setup/style.scss +4 -1
  185. package/src/components/block-patterns-list/README.md +4 -4
  186. package/src/components/block-patterns-list/index.js +60 -34
  187. package/src/components/block-patterns-list/style.scss +7 -0
  188. package/src/components/block-rename/index.js +3 -0
  189. package/src/components/block-rename/is-empty-string.js +3 -0
  190. package/src/components/block-rename/modal.js +115 -0
  191. package/src/components/block-rename/rename-control.js +80 -0
  192. package/src/components/block-rename/use-block-rename.js +10 -0
  193. package/src/components/block-settings-menu/block-settings-dropdown.js +38 -34
  194. package/src/components/block-settings-menu-controls/index.js +9 -0
  195. package/src/components/block-toolbar/block-toolbar-menu.native.js +1 -4
  196. package/src/components/block-types-list/index.js +5 -4
  197. package/src/components/button-block-appender/content.scss +2 -2
  198. package/src/components/date-format-picker/index.js +7 -0
  199. package/src/components/editable-text/README.md +0 -36
  200. package/src/components/global-styles/advanced-panel.js +1 -1
  201. package/src/components/image-size-control/index.js +0 -6
  202. package/src/components/inner-blocks/index.js +6 -2
  203. package/src/components/inner-blocks/warning-max-depth-exceeded.native.js +57 -33
  204. package/src/components/inserter/block-patterns-explorer/pattern-list.js +5 -1
  205. package/src/components/inserter/block-patterns-tab/pattern-category-previews.js +7 -3
  206. package/src/components/inserter/block-patterns-tab/use-pattern-categories.js +6 -1
  207. package/src/components/inserter/block-patterns-tab/utils.js +6 -4
  208. package/src/components/inserter/hooks/use-patterns-state.js +3 -1
  209. package/src/components/inserter-listbox/index.js +11 -7
  210. package/src/components/inserter-listbox/item.js +11 -12
  211. package/src/components/inserter-listbox/row.js +6 -12
  212. package/src/components/list-view/use-list-view-expand-selected-item.js +7 -8
  213. package/src/components/plain-text/README.md +0 -28
  214. package/src/components/preview-options/index.js +2 -0
  215. package/src/components/rich-text/README.md +0 -58
  216. package/src/components/rich-text/index.native.js +1 -1
  217. package/src/components/rich-text/native/index.native.js +45 -2
  218. package/src/components/rich-text/use-input-rules.js +30 -2
  219. package/src/components/spacing-sizes-control/input-controls/spacing-input-control.js +1 -1
  220. package/src/components/url-input/README.md +1 -74
  221. package/src/components/use-block-drop-zone/index.js +4 -1
  222. package/src/components/use-moving-animation/index.js +1 -1
  223. package/src/components/use-settings/index.js +2 -2
  224. package/src/components/use-settings/test/index.js +1 -1
  225. package/src/hooks/block-renaming.js +47 -0
  226. package/src/hooks/custom-fields.js +68 -65
  227. package/src/hooks/index.js +0 -1
  228. package/src/hooks/layout.js +12 -8
  229. package/src/hooks/test/__snapshots__/align.native.js.snap +5 -5
  230. package/src/layouts/constrained.js +57 -50
  231. package/src/store/selectors.js +2 -0
  232. package/src/style.scss +1 -1
  233. package/src/utils/test/transform-styles.js +49 -0
  234. package/src/utils/transform-styles/index.js +39 -13
  235. package/build/hooks/block-rename-ui.js +0 -167
  236. package/build/hooks/block-rename-ui.js.map +0 -1
  237. package/build-module/hooks/block-rename-ui.js +0 -159
  238. package/build-module/hooks/block-rename-ui.js.map +0 -1
  239. package/src/hooks/block-rename-ui.js +0 -228
  240. /package/src/{hooks/block-rename-ui.scss → components/block-rename/style.scss} +0 -0
@@ -8,7 +8,6 @@ import {
8
8
  __experimentalNumberControl as NumberControl,
9
9
  __experimentalHStack as HStack,
10
10
  } from '@wordpress/components';
11
- import deprecated from '@wordpress/deprecated';
12
11
  import { __ } from '@wordpress/i18n';
13
12
 
14
13
  /**
@@ -31,11 +30,6 @@ export default function ImageSizeControl( {
31
30
  onChange,
32
31
  onChangeImage = noop,
33
32
  } ) {
34
- deprecated( 'wp.blockEditor.__experimentalImageSizeControl', {
35
- since: '6.3',
36
- alternative:
37
- 'wp.blockEditor.privateApis.DimensionsTool and wp.blockEditor.privateApis.ResolutionTool',
38
- } );
39
33
  const { currentHeight, currentWidth, updateDimension, updateDimensions } =
40
34
  useDimensionHandler( height, width, imageHeight, imageWidth, onChange );
41
35
 
@@ -169,8 +169,11 @@ const ForwardedInnerBlocks = forwardRef( ( props, ref ) => {
169
169
  * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/inner-blocks/README.md
170
170
  */
171
171
  export function useInnerBlocksProps( props = {}, options = {} ) {
172
- const { __unstableDisableLayoutClassNames, __unstableDisableDropZone } =
173
- options;
172
+ const {
173
+ __unstableDisableLayoutClassNames,
174
+ __unstableDisableDropZone,
175
+ dropZoneElement,
176
+ } = options;
174
177
  const {
175
178
  clientId,
176
179
  layout = null,
@@ -211,6 +214,7 @@ export function useInnerBlocksProps( props = {}, options = {} ) {
211
214
  );
212
215
 
213
216
  const blockDropZoneRef = useBlockDropZone( {
217
+ dropZoneElement,
214
218
  rootClientId: clientId,
215
219
  } );
216
220
 
@@ -8,7 +8,7 @@ import { TouchableWithoutFeedback, View } from 'react-native';
8
8
  */
9
9
  import { __, sprintf } from '@wordpress/i18n';
10
10
  import { useState } from '@wordpress/element';
11
- import { useDispatch, useSelect } from '@wordpress/data';
11
+ import { useSelect } from '@wordpress/data';
12
12
 
13
13
  /**
14
14
  * Internal dependencies
@@ -18,54 +18,71 @@ import UnsupportedBlockDetails from '../unsupported-block-details';
18
18
  import { store as blockEditorStore } from '../../store';
19
19
  import { MAX_NESTING_DEPTH } from './constants';
20
20
  import useUnsupportedBlockEditor from '../use-unsupported-block-editor';
21
+ import {
22
+ useConvertToGroupButtons,
23
+ useConvertToGroupButtonProps,
24
+ } from '../convert-to-group-buttons';
25
+
26
+ const EMPTY_ARRAY = [];
21
27
 
22
28
  const WarningMaxDepthExceeded = ( { clientId } ) => {
23
29
  const [ showDetails, setShowDetails ] = useState( false );
24
30
 
25
- const { isSelected, innerBlocks } = useSelect(
26
- ( select ) => {
27
- const { getBlock, isBlockSelected } = select( blockEditorStore );
28
- return {
29
- innerBlocks: getBlock( clientId )?.innerBlocks || [],
30
- isSelected: isBlockSelected( clientId ),
31
- };
32
- },
31
+ const isSelected = useSelect(
32
+ ( select ) => select( blockEditorStore ).isBlockSelected( clientId ),
33
33
  [ clientId ]
34
34
  );
35
- const { replaceBlocks } = useDispatch( blockEditorStore );
35
+
36
+ // We rely on the logic related to the Group/Ungroup buttons used in the block options to
37
+ // determine whether to use the Ungroup action.
38
+ const convertToGroupButtonProps = useConvertToGroupButtonProps( [
39
+ clientId,
40
+ ] );
41
+ const { isUngroupable } = convertToGroupButtonProps;
42
+ const convertToGroupButtons = useConvertToGroupButtons( {
43
+ ...convertToGroupButtonProps,
44
+ } );
45
+ const onUngroup = convertToGroupButtons.ungroup.onSelect;
36
46
 
37
47
  const {
38
48
  isUnsupportedBlockEditorSupported,
39
49
  canEnableUnsupportedBlockEditor,
40
50
  } = useUnsupportedBlockEditor( clientId );
41
51
 
42
- const onUngroup = () => {
43
- if ( ! innerBlocks.length ) {
44
- return;
45
- }
46
-
47
- replaceBlocks( clientId, innerBlocks );
48
- };
49
-
50
- let description;
51
- // When UBE can't be used, the description mentions using the web browser to edit the block.
52
+ /* translators: Warning related to having blocks deeply nested. %d: The deepest nesting level. */
53
+ const descriptionFormat = __(
54
+ 'Blocks nested deeper than %d levels may not render properly in the mobile editor.'
55
+ );
56
+ let description = sprintf( descriptionFormat, MAX_NESTING_DEPTH );
52
57
  if (
53
58
  ! isUnsupportedBlockEditorSupported &&
54
59
  ! canEnableUnsupportedBlockEditor
55
60
  ) {
56
- /* translators: Warning related to having blocks deeply nested. %d: The deepest nesting level. */
57
- const descriptionFormat = __(
58
- 'Blocks nested deeper than %d levels may not render properly in the mobile editor. For this reason, we recommend flattening the content by ungrouping the block or editing the block using your web browser.'
59
- );
60
- description = sprintf( descriptionFormat, MAX_NESTING_DEPTH );
61
+ // When UBE can't be used, the description mentions using the web browser to edit the block.
62
+ description +=
63
+ ' ' +
64
+ /* translators: Recommendation included in a warning related to having blocks deeply nested. */
65
+ __(
66
+ 'For this reason, we recommend editing the block using your web browser.'
67
+ );
61
68
  }
62
69
  // Otherwise, the description mentions using the web editor (i.e. UBE).
63
70
  else {
64
- /* translators: Warning related to having blocks deeply nested. %d: The deepest nesting level. */
65
- const descriptionFormat = __(
66
- 'Blocks nested deeper than %d levels may not render properly in the mobile editor. For this reason, we recommend flattening the content by ungrouping the block or editing the block using the web editor.'
67
- );
68
- description = sprintf( descriptionFormat, MAX_NESTING_DEPTH );
71
+ description +=
72
+ ' ' +
73
+ /* translators: Recommendation included in a warning related to having blocks deeply nested. */
74
+ __(
75
+ 'For this reason, we recommend editing the block using the web editor.'
76
+ );
77
+ }
78
+ // If the block can be flattened, we also suggest to ungroup the block.
79
+ if ( isUngroupable ) {
80
+ description +=
81
+ ' ' +
82
+ /* translators: Alternative option included in a warning related to having blocks deeply nested. */
83
+ __(
84
+ 'Alternatively, you can flatten the content by ungrouping the block.'
85
+ );
69
86
  }
70
87
 
71
88
  return (
@@ -88,9 +105,16 @@ const WarningMaxDepthExceeded = ( { clientId } ) => {
88
105
  onCloseSheet={ () => setShowDetails( false ) }
89
106
  title={ __( 'Deeply nested block' ) }
90
107
  description={ description }
91
- customActions={ [
92
- { label: __( 'Ungroup block' ), onPress: onUngroup },
93
- ] }
108
+ customActions={
109
+ isUngroupable
110
+ ? [
111
+ {
112
+ label: __( 'Ungroup block' ),
113
+ onPress: onUngroup,
114
+ },
115
+ ]
116
+ : EMPTY_ARRAY
117
+ }
94
118
  />
95
119
  </View>
96
120
  </TouchableWithoutFeedback>
@@ -18,6 +18,7 @@ import { searchItems } from '../search-items';
18
18
  import BlockPatternsPaging from '../../block-patterns-paging';
19
19
  import usePatternsPaging from '../hooks/use-patterns-paging';
20
20
  import {
21
+ PATTERN_TYPES,
21
22
  allPatternsCategory,
22
23
  myPatternsCategory,
23
24
  } from '../block-patterns-tab/utils';
@@ -70,7 +71,10 @@ function PatternList( { searchValue, selectedCategory, patternCategories } ) {
70
71
  if ( selectedCategory === allPatternsCategory.name ) {
71
72
  return true;
72
73
  }
73
- if ( selectedCategory === myPatternsCategory.name && pattern.id ) {
74
+ if (
75
+ selectedCategory === myPatternsCategory.name &&
76
+ pattern.type === PATTERN_TYPES.user
77
+ ) {
74
78
  return true;
75
79
  }
76
80
  if ( selectedCategory === 'uncategorized' ) {
@@ -22,7 +22,7 @@ import {
22
22
  * Internal dependencies
23
23
  */
24
24
  import usePatternsState from '../hooks/use-patterns-state';
25
- import BlockPatternList from '../../block-patterns-list';
25
+ import BlockPatternsList from '../../block-patterns-list';
26
26
  import usePatternsPaging from '../hooks/use-patterns-paging';
27
27
  import { PatternsFilter } from './patterns-filter';
28
28
  import { usePatternCategories } from './use-pattern-categories';
@@ -30,6 +30,7 @@ import {
30
30
  isPatternFiltered,
31
31
  allPatternsCategory,
32
32
  myPatternsCategory,
33
+ PATTERN_TYPES,
33
34
  } from './utils';
34
35
 
35
36
  const noop = () => {};
@@ -69,7 +70,10 @@ export function PatternCategoryPreviews( {
69
70
  if ( category.name === allPatternsCategory.name ) {
70
71
  return true;
71
72
  }
72
- if ( category.name === myPatternsCategory.name && pattern.id ) {
73
+ if (
74
+ category.name === myPatternsCategory.name &&
75
+ pattern.type === PATTERN_TYPES.user
76
+ ) {
73
77
  return true;
74
78
  }
75
79
  if ( category.name !== 'uncategorized' ) {
@@ -155,7 +159,7 @@ export function PatternCategoryPreviews( {
155
159
  </VStack>
156
160
 
157
161
  { currentCategoryPatterns.length > 0 && (
158
- <BlockPatternList
162
+ <BlockPatternsList
159
163
  ref={ scrollContainerRef }
160
164
  shownPatterns={ pagingProps.categoryPatternsAsyncList }
161
165
  blockPatterns={ pagingProps.categoryPatterns }
@@ -14,6 +14,7 @@ import {
14
14
  isPatternFiltered,
15
15
  allPatternsCategory,
16
16
  myPatternsCategory,
17
+ PATTERN_TYPES,
17
18
  } from './utils';
18
19
 
19
20
  export function usePatternCategories( rootClientId, sourceFilter = 'all' ) {
@@ -69,7 +70,11 @@ export function usePatternCategories( rootClientId, sourceFilter = 'all' ) {
69
70
  label: _x( 'Uncategorized' ),
70
71
  } );
71
72
  }
72
- if ( filteredPatterns.some( ( pattern ) => pattern.id ) ) {
73
+ if (
74
+ filteredPatterns.some(
75
+ ( pattern ) => pattern.type === PATTERN_TYPES.user
76
+ )
77
+ ) {
73
78
  categories.unshift( myPatternsCategory );
74
79
  }
75
80
  if ( filteredPatterns.length > 0 ) {
@@ -21,7 +21,7 @@ export const SYNC_TYPES = {
21
21
 
22
22
  export const allPatternsCategory = {
23
23
  name: 'allPatterns',
24
- label: __( 'All patterns' ),
24
+ label: __( 'All' ),
25
25
  };
26
26
 
27
27
  export const myPatternsCategory = {
@@ -53,9 +53,11 @@ export function isPatternFiltered( pattern, sourceFilter, syncFilter ) {
53
53
  return true;
54
54
  }
55
55
 
56
- // If user source selected, filter out theme patterns. Any pattern without
57
- // an id wasn't created by a user.
58
- if ( sourceFilter === PATTERN_TYPES.user && ! pattern.id ) {
56
+ // If user source selected, filter out theme patterns.
57
+ if (
58
+ sourceFilter === PATTERN_TYPES.user &&
59
+ pattern.type !== PATTERN_TYPES.user
60
+ ) {
59
61
  return true;
60
62
  }
61
63
 
@@ -11,6 +11,7 @@ import { store as noticesStore } from '@wordpress/notices';
11
11
  * Internal dependencies
12
12
  */
13
13
  import { store as blockEditorStore } from '../../../store';
14
+ import { PATTERN_TYPES } from '../block-patterns-tab/utils';
14
15
 
15
16
  /**
16
17
  * Retrieves the block patterns inserter state.
@@ -57,7 +58,8 @@ const usePatternsState = ( onInsert, rootClientId ) => {
57
58
  const onClickPattern = useCallback(
58
59
  ( pattern, blocks ) => {
59
60
  const patternBlocks =
60
- pattern.id && pattern.syncStatus !== 'unsynced'
61
+ pattern.type === PATTERN_TYPES.user &&
62
+ pattern.syncStatus !== 'unsynced'
61
63
  ? [ createBlock( 'core/block', { ref: pattern.id } ) ]
62
64
  : blocks;
63
65
  onInsert(
@@ -1,26 +1,30 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { __unstableUseCompositeState as useCompositeState } from '@wordpress/components';
4
+ import { privateApis as componentsPrivateApis } from '@wordpress/components';
5
5
 
6
6
  /**
7
7
  * Internal dependencies
8
8
  */
9
- import InserterListboxContext from './context';
9
+ import { unlock } from '../../lock-unlock';
10
10
 
11
11
  export { default as InserterListboxGroup } from './group';
12
12
  export { default as InserterListboxRow } from './row';
13
13
  export { default as InserterListboxItem } from './item';
14
14
 
15
+ const { CompositeV2: Composite, useCompositeStoreV2: useCompositeStore } =
16
+ unlock( componentsPrivateApis );
17
+
15
18
  function InserterListbox( { children } ) {
16
- const compositeState = useCompositeState( {
17
- shift: true,
18
- wrap: 'horizontal',
19
+ const store = useCompositeStore( {
20
+ focusShift: true,
21
+ focusWrap: 'horizontal',
19
22
  } );
23
+
20
24
  return (
21
- <InserterListboxContext.Provider value={ compositeState }>
25
+ <Composite store={ store } render={ <></> }>
22
26
  { children }
23
- </InserterListboxContext.Provider>
27
+ </Composite>
24
28
  );
25
29
  }
26
30
 
@@ -3,32 +3,31 @@
3
3
  */
4
4
  import {
5
5
  Button,
6
- __unstableCompositeItem as CompositeItem,
6
+ privateApis as componentsPrivateApis,
7
7
  } from '@wordpress/components';
8
- import { forwardRef, useContext } from '@wordpress/element';
8
+ import { forwardRef } from '@wordpress/element';
9
9
 
10
10
  /**
11
11
  * Internal dependencies
12
12
  */
13
- import InserterListboxContext from './context';
13
+ import { unlock } from '../../lock-unlock';
14
+
15
+ const { CompositeItemV2: CompositeItem } = unlock( componentsPrivateApis );
14
16
 
15
17
  function InserterListboxItem(
16
18
  { isFirst, as: Component, children, ...props },
17
19
  ref
18
20
  ) {
19
- const state = useContext( InserterListboxContext );
20
21
  return (
21
22
  <CompositeItem
22
23
  ref={ ref }
23
- state={ state }
24
24
  role="option"
25
- // Use the CompositeItem `focusable` prop over Button's
26
- // isFocusable. The latter was shown to cause an issue
27
- // with tab order in the inserter list.
28
- focusable
25
+ // Use the CompositeItem `accessibleWhenDisabled` prop
26
+ // over Button's `isFocusable`. The latter was shown to
27
+ // cause an issue with tab order in the inserter list.
28
+ accessibleWhenDisabled
29
29
  { ...props }
30
- >
31
- { ( htmlProps ) => {
30
+ render={ ( htmlProps ) => {
32
31
  const propsWithTabIndex = {
33
32
  ...htmlProps,
34
33
  tabIndex: isFirst ? 0 : htmlProps.tabIndex,
@@ -45,7 +44,7 @@ function InserterListboxItem(
45
44
  }
46
45
  return <Button { ...propsWithTabIndex }>{ children }</Button>;
47
46
  } }
48
- </CompositeItem>
47
+ />
49
48
  );
50
49
  }
51
50
 
@@ -1,24 +1,18 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { forwardRef, useContext } from '@wordpress/element';
5
- import { __unstableCompositeGroup as CompositeGroup } from '@wordpress/components';
4
+ import { forwardRef } from '@wordpress/element';
5
+ import { privateApis as componentsPrivateApis } from '@wordpress/components';
6
6
 
7
7
  /**
8
8
  * Internal dependencies
9
9
  */
10
- import InserterListboxContext from './context';
10
+ import { unlock } from '../../lock-unlock';
11
+
12
+ const { CompositeGroupV2: CompositeGroup } = unlock( componentsPrivateApis );
11
13
 
12
14
  function InserterListboxRow( props, ref ) {
13
- const state = useContext( InserterListboxContext );
14
- return (
15
- <CompositeGroup
16
- state={ state }
17
- role="presentation"
18
- ref={ ref }
19
- { ...props }
20
- />
21
- );
15
+ return <CompositeGroup role="presentation" ref={ ref } { ...props } />;
22
16
  }
23
17
 
24
18
  export default forwardRef( InserterListboxRow );
@@ -27,12 +27,6 @@ export default function useListViewExpandSelectedItem( {
27
27
  [ firstSelectedBlockClientId ]
28
28
  );
29
29
 
30
- const parentClientIds =
31
- Array.isArray( selectedBlockParentClientIds ) &&
32
- selectedBlockParentClientIds.length
33
- ? selectedBlockParentClientIds
34
- : null;
35
-
36
30
  // Expand tree when a block is selected.
37
31
  useEffect( () => {
38
32
  // If the selectedTreeId is the same as the selected block,
@@ -42,7 +36,7 @@ export default function useListViewExpandSelectedItem( {
42
36
  }
43
37
 
44
38
  // If the selected block has parents, get the top-level parent.
45
- if ( parentClientIds ) {
39
+ if ( selectedBlockParentClientIds?.length ) {
46
40
  // If the selected block has parents,
47
41
  // expand the tree branch.
48
42
  setExpandedState( {
@@ -50,7 +44,12 @@ export default function useListViewExpandSelectedItem( {
50
44
  clientIds: selectedBlockParentClientIds,
51
45
  } );
52
46
  }
53
- }, [ firstSelectedBlockClientId ] );
47
+ }, [
48
+ firstSelectedBlockClientId,
49
+ selectedBlockParentClientIds,
50
+ selectedTreeId,
51
+ setExpandedState,
52
+ ] );
54
53
 
55
54
  return {
56
55
  setSelectedTreeId,
@@ -20,33 +20,6 @@ _Optional._ The component forwards the `ref` property to the `TextareaAutosize`
20
20
 
21
21
  ## Example
22
22
 
23
- {% codetabs %}
24
- {% ES5 %}
25
-
26
- ```js
27
- wp.blocks.registerBlockType( /* ... */, {
28
- // ...
29
-
30
- attributes: {
31
- content: {
32
- type: 'string',
33
- },
34
- },
35
-
36
- edit: function( props ) {
37
- return React.createElement( wp.blockEditor.PlainText, {
38
- className: props.className,
39
- value: props.attributes.content,
40
- onChange: function( content ) {
41
- props.setAttributes( { content: content } );
42
- },
43
- } );
44
- },
45
- } );
46
- ```
47
-
48
- {% ESNext %}
49
-
50
23
  ```js
51
24
  import { registerBlockType } from '@wordpress/blocks';
52
25
  import { PlainText } from '@wordpress/block-editor';
@@ -72,4 +45,3 @@ registerBlockType( /* ... */, {
72
45
  } );
73
46
  ```
74
47
 
75
- {% end %}
@@ -19,6 +19,7 @@ export default function PreviewOptions( {
19
19
  deviceType,
20
20
  setDeviceType,
21
21
  label,
22
+ showIconLabels,
22
23
  } ) {
23
24
  const isMobile = useViewportMatch( 'small', '<' );
24
25
  if ( isMobile ) return null;
@@ -35,6 +36,7 @@ export default function PreviewOptions( {
35
36
  disabled: ! isEnabled,
36
37
  __experimentalIsFocusable: ! isEnabled,
37
38
  children: viewLabel,
39
+ showTooltip: ! showIconLabels,
38
40
  };
39
41
  const menuProps = {
40
42
  'aria-label': __( 'View options' ),
@@ -80,41 +80,6 @@ trimmed.
80
80
 
81
81
  ## Example
82
82
 
83
- {% codetabs %}
84
- {% ES5 %}
85
-
86
- ```js
87
- wp.blocks.registerBlockType( /* ... */, {
88
- // ...
89
-
90
- attributes: {
91
- content: {
92
- source: 'html',
93
- selector: 'h2',
94
- },
95
- },
96
-
97
- edit: function( props ) {
98
- return React.createElement( wp.blockEditor.RichText, {
99
- tagName: 'h2',
100
- className: props.className,
101
- value: props.attributes.content,
102
- onChange: function( content ) {
103
- props.setAttributes( { content: content } );
104
- }
105
- } );
106
- },
107
-
108
- save: function( props ) {
109
- return React.createElement( wp.blockEditor.RichText.Content, {
110
- tagName: 'h2', value: props.attributes.content
111
- } );
112
- }
113
- } );
114
- ```
115
-
116
- {% ESNext %}
117
-
118
83
  ```js
119
84
  import { registerBlockType } from '@wordpress/blocks';
120
85
  import { RichText } from '@wordpress/block-editor';
@@ -146,7 +111,6 @@ registerBlockType( /* ... */, {
146
111
  } );
147
112
  ```
148
113
 
149
- {% end %}
150
114
 
151
115
  ## RichTextToolbarButton
152
116
 
@@ -154,26 +118,6 @@ Slot to extend the format toolbar. Use it in the edit function of a `registerFor
154
118
 
155
119
  ### Example
156
120
 
157
- {% codetabs %}
158
- {% ES5 %}
159
-
160
- ```js
161
- wp.richText.registerFormatType( /* ... */, {
162
- /* ... */
163
- edit: function( props ) {
164
- return React.createElement(
165
- wp.blockEditor.RichTextToolbarButton, {
166
- icon: 'editor-code',
167
- title: 'My formatting button',
168
- onClick: function() { /* ... */ }
169
- isActive: props.isActive,
170
- } );
171
- },
172
- /* ... */
173
- } );
174
- ```
175
-
176
- {% ESNext %}
177
121
 
178
122
  ```js
179
123
  import { registerFormatType } from '@wordpress/rich-text';
@@ -194,5 +138,3 @@ registerFormatType( /* ... */, {
194
138
  /* ... */
195
139
  } );
196
140
  ```
197
-
198
- {% end %}
@@ -223,7 +223,7 @@ function RichTextWrapper(
223
223
  // an intentional user interaction distinguishing between Backspace and
224
224
  // Delete to remove the empty field, but also to avoid merge & remove
225
225
  // causing destruction of two fields (merge, then removed merged).
226
- if ( onRemove && isEmpty( value ) && isReverse ) {
226
+ else if ( onRemove && isEmpty( value ) && isReverse ) {
227
227
  onRemove( ! isReverse );
228
228
  }
229
229
  },
@@ -650,6 +650,40 @@ export class RichText extends Component {
650
650
  return shouldDrop;
651
651
  }
652
652
 
653
+ /**
654
+ * Determines whether the text input should receive focus after an update.
655
+ * For cases where a RichText with a value is merged with an empty one.
656
+ *
657
+ * @param {Object} prevProps - The previous props of the component.
658
+ * @return {boolean} True if the text input should receive focus, false otherwise.
659
+ */
660
+ shouldFocusTextInputAfterMerge( prevProps ) {
661
+ const {
662
+ __unstableIsSelected: isSelected,
663
+ blockIsSelected,
664
+ selectionStart,
665
+ selectionEnd,
666
+ __unstableMobileNoFocusOnMount,
667
+ } = this.props;
668
+
669
+ const {
670
+ __unstableIsSelected: prevIsSelected,
671
+ blockIsSelected: prevBlockIsSelected,
672
+ } = prevProps;
673
+
674
+ const noSelectionValues =
675
+ selectionStart === undefined && selectionEnd === undefined;
676
+ const textInputWasNotFocused = ! prevIsSelected && ! isSelected;
677
+
678
+ return (
679
+ ! __unstableMobileNoFocusOnMount &&
680
+ noSelectionValues &&
681
+ textInputWasNotFocused &&
682
+ ! prevBlockIsSelected &&
683
+ blockIsSelected
684
+ );
685
+ }
686
+
653
687
  onSelectionChangeFromAztec( start, end, text, event ) {
654
688
  if ( this.shouldDropEventFromAztec( event, 'onSelectionChange' ) ) {
655
689
  return;
@@ -843,9 +877,8 @@ export class RichText extends Component {
843
877
  if ( this.props.value !== this.value ) {
844
878
  this.value = this.props.value;
845
879
  }
846
- const { __unstableIsSelected: isSelected } = this.props;
847
-
848
880
  const { __unstableIsSelected: prevIsSelected } = prevProps;
881
+ const { __unstableIsSelected: isSelected } = this.props;
849
882
 
850
883
  if ( isSelected && ! prevIsSelected ) {
851
884
  this._editor.focus();
@@ -855,6 +888,16 @@ export class RichText extends Component {
855
888
  this.props.selectionStart || 0,
856
889
  this.props.selectionEnd || 0
857
890
  );
891
+ } else if ( this.shouldFocusTextInputAfterMerge( prevProps ) ) {
892
+ // Since this is happening when merging blocks, the selection should be at the last character position.
893
+ // As a fallback the internal selectionEnd value is used.
894
+ const lastCharacterPosition =
895
+ this.value?.length ?? this.selectionEnd;
896
+ this._editor.focus();
897
+ this.props.onSelectionChange(
898
+ lastCharacterPosition,
899
+ lastCharacterPosition
900
+ );
858
901
  } else if ( ! isSelected && prevIsSelected ) {
859
902
  this._editor.blur();
860
903
  }