@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
@@ -3,7 +3,7 @@
3
3
  */
4
4
  import { useRef } from '@wordpress/element';
5
5
  import { useRefEffect } from '@wordpress/compose';
6
- import { insert, toHTMLString } from '@wordpress/rich-text';
6
+ import { insert, isCollapsed, toHTMLString } from '@wordpress/rich-text';
7
7
  import { getBlockTransforms, findTransform } from '@wordpress/blocks';
8
8
  import { useDispatch } from '@wordpress/data';
9
9
 
@@ -42,6 +42,34 @@ function findSelection( blocks ) {
42
42
  return [];
43
43
  }
44
44
 
45
+ /**
46
+ * An input rule that replaces two spaces with an en space, and an en space
47
+ * followed by a space with an em space.
48
+ *
49
+ * @param {Object} value Value to replace spaces in.
50
+ *
51
+ * @return {Object} Value with spaces replaced.
52
+ */
53
+ function replacePrecedingSpaces( value ) {
54
+ if ( ! isCollapsed( value ) ) {
55
+ return value;
56
+ }
57
+
58
+ const { text, start } = value;
59
+ const lastTwoCharacters = text.slice( start - 2, start );
60
+
61
+ // Replace two spaces with an em space.
62
+ if ( lastTwoCharacters === ' ' ) {
63
+ return insert( value, '\u2002', start - 2, start );
64
+ }
65
+ // Replace an en space followed by a space with an em space.
66
+ else if ( lastTwoCharacters === '\u2002 ' ) {
67
+ return insert( value, '\u2003', start - 2, start );
68
+ }
69
+
70
+ return value;
71
+ }
72
+
45
73
  export function useInputRules( props ) {
46
74
  const {
47
75
  __unstableMarkLastChangeAsPersistent,
@@ -122,7 +150,7 @@ export function useInputRules( props ) {
122
150
 
123
151
  return accumlator;
124
152
  },
125
- preventEventDiscovery( value )
153
+ preventEventDiscovery( replacePrecedingSpaces( value ) )
126
154
  );
127
155
 
128
156
  if ( transformed !== value ) {
@@ -139,7 +139,7 @@ export default function SpacingInputControl( {
139
139
  useMemo(
140
140
  () => parseQuantityAndUnitFromRawValue( currentValue ),
141
141
  [ currentValue ]
142
- )[ 1 ] || units[ 0 ].value;
142
+ )[ 1 ] || units[ 0 ]?.value;
143
143
 
144
144
  const setInitialValue = () => {
145
145
  if ( value === undefined ) {
@@ -36,41 +36,6 @@ This prop is passed directly to the `URLInput` component.
36
36
 
37
37
  ## Example
38
38
 
39
- {% codetabs %}
40
- {% ES5 %}
41
-
42
- ```js
43
- wp.blocks.registerBlockType( /* ... */, {
44
- // ...
45
-
46
- attributes: {
47
- url: {
48
- type: 'string'
49
- },
50
- text: {
51
- type: 'string'
52
- }
53
- },
54
-
55
- edit: function( props ) {
56
- return React.createElement( wp.blockEditor.URLInputButton, {
57
- className: props.className,
58
- url: props.attributes.url,
59
- onChange: function( url, post ) {
60
- props.setAttributes( { url: url, text: (post && post.title) || 'Click here' } );
61
- }
62
- } );
63
- },
64
-
65
- save: function( props ) {
66
- return React.createElement( 'a', {
67
- href: props.attributes.url,
68
- }, props.attributes.text );
69
- }
70
- } );
71
- ```
72
-
73
- {% ESNext %}
74
39
 
75
40
  ```js
76
41
  import { registerBlockType } from '@wordpress/blocks';
@@ -103,7 +68,6 @@ registerBlockType( /* ... */, {
103
68
  } );
104
69
  ```
105
70
 
106
- {% end %}
107
71
 
108
72
  # `URLInput`
109
73
 
@@ -139,7 +103,7 @@ _Required._ Called when the value changes. The second parameter is `null` unless
139
103
  }
140
104
  ```
141
105
 
142
- ### `onKeydown`: `( event: KeyboardEvent ) => void`
106
+ ### `onKeyDown`: `( event: KeyboardEvent ) => void`
143
107
 
144
108
  A callback invoked on the keydown event.
145
109
 
@@ -172,41 +136,6 @@ Start opting into the new margin-free styles that will become the default in a f
172
136
 
173
137
  ## Example
174
138
 
175
- {% codetabs %}
176
- {% ES5 %}
177
-
178
- ```js
179
- wp.blocks.registerBlockType( /* ... */, {
180
- // ...
181
-
182
- attributes: {
183
- url: {
184
- type: 'string'
185
- },
186
- text: {
187
- type: 'string'
188
- }
189
- },
190
-
191
- edit: function( props ) {
192
- return React.createElement( wp.blockEditor.URLInput, {
193
- className: props.className,
194
- value: props.attributes.url,
195
- onChange: function( url, post ) {
196
- props.setAttributes( { url: url, text: (post && post.title) || 'Click here' } );
197
- }
198
- } );
199
- },
200
-
201
- save: function( props ) {
202
- return React.createElement( 'a', {
203
- href: props.attributes.url,
204
- }, props.attributes.text );
205
- }
206
- } );
207
- ```
208
-
209
- {% ESNext %}
210
139
 
211
140
  ```js
212
141
  import { registerBlockType } from '@wordpress/blocks';
@@ -240,5 +169,3 @@ registerBlockType( /* ... */, {
240
169
  }
241
170
  } );
242
171
  ```
243
-
244
- {% end %}
@@ -127,7 +127,8 @@ export function getDropTargetPosition(
127
127
 
128
128
  /**
129
129
  * @typedef {Object} WPBlockDropZoneConfig
130
- * @property {string} rootClientId The root client id for the block list.
130
+ * @property {?HTMLElement} dropZoneElement Optional element to be used as the drop zone.
131
+ * @property {string} rootClientId The root client id for the block list.
131
132
  */
132
133
 
133
134
  /**
@@ -136,6 +137,7 @@ export function getDropTargetPosition(
136
137
  * @param {WPBlockDropZoneConfig} dropZoneConfig configuration data for the drop zone.
137
138
  */
138
139
  export default function useBlockDropZone( {
140
+ dropZoneElement,
139
141
  // An undefined value represents a top-level block. Default to an empty
140
142
  // string for this so that `targetRootClientId` can be easily compared to
141
143
  // values returned by the `getRootBlockClientId` selector, which also uses
@@ -235,6 +237,7 @@ export default function useBlockDropZone( {
235
237
  );
236
238
 
237
239
  return useDropZone( {
240
+ dropZoneElement,
238
241
  isDisabled,
239
242
  onDrop: onBlockDrop,
240
243
  onDragOver( event ) {
@@ -129,7 +129,7 @@ function useMovingAnimation( {
129
129
  const finishedMoving = x === 0 && y === 0;
130
130
  ref.current.style.transformOrigin = 'center center';
131
131
  ref.current.style.transform = finishedMoving
132
- ? undefined
132
+ ? null // Set to `null` to explicitly remove the transform.
133
133
  : `translate3d(${ x }px,${ y }px,0)`;
134
134
  ref.current.style.zIndex = isSelected ? '1' : '';
135
135
 
@@ -254,7 +254,7 @@ export function useSettings( ...paths ) {
254
254
  *
255
255
  * @param {string} path The path to the setting.
256
256
  * @return {any} Returns the value defined for the setting.
257
- * @deprecated 6.4.0 Use useSettings instead.
257
+ * @deprecated 6.5.0 Use useSettings instead.
258
258
  * @example
259
259
  * ```js
260
260
  * const isEnabled = useSetting( 'typography.dropCap' );
@@ -262,7 +262,7 @@ export function useSettings( ...paths ) {
262
262
  */
263
263
  export function useSetting( path ) {
264
264
  deprecated( 'wp.blockEditor.useSetting', {
265
- since: '6.4',
265
+ since: '6.5',
266
266
  alternative: 'wp.blockEditor.useSettings',
267
267
  note: 'The new useSettings function can retrieve multiple settings at once, with better performance.',
268
268
  } );
@@ -135,7 +135,7 @@ describe( 'useSettings', () => {
135
135
  const result = runHook( () => useSetting( 'layout.contentSize' ) );
136
136
  expect( result ).toBe( '840px' );
137
137
  expect( console ).toHaveWarnedWith(
138
- 'wp.blockEditor.useSetting is deprecated since version 6.4. Please use wp.blockEditor.useSettings instead.'
138
+ 'wp.blockEditor.useSetting is deprecated since version 6.5. Please use wp.blockEditor.useSettings instead.'
139
139
  );
140
140
  } );
141
141
  } );
@@ -3,6 +3,15 @@
3
3
  */
4
4
  import { addFilter } from '@wordpress/hooks';
5
5
  import { hasBlockSupport } from '@wordpress/blocks';
6
+ import { createHigherOrderComponent } from '@wordpress/compose';
7
+ import { __ } from '@wordpress/i18n';
8
+ import { TextControl } from '@wordpress/components';
9
+
10
+ /**
11
+ * Internal dependencies
12
+ */
13
+ import { InspectorControls } from '../components';
14
+ import { useBlockRename } from '../components/block-rename';
6
15
 
7
16
  /**
8
17
  * Filters registered block settings, adding an `__experimentalLabel` callback if one does not already exist.
@@ -38,6 +47,44 @@ export function addLabelCallback( settings ) {
38
47
  return settings;
39
48
  }
40
49
 
50
+ export const withBlockRenameControl = createHigherOrderComponent(
51
+ ( BlockEdit ) => ( props ) => {
52
+ const { name, attributes, setAttributes, isSelected } = props;
53
+
54
+ const { canRename } = useBlockRename( name );
55
+
56
+ return (
57
+ <>
58
+ { isSelected && canRename && (
59
+ <InspectorControls group="advanced">
60
+ <TextControl
61
+ __nextHasNoMarginBottom
62
+ label={ __( 'Block name' ) }
63
+ value={ attributes?.metadata?.name || '' }
64
+ onChange={ ( newName ) => {
65
+ setAttributes( {
66
+ metadata: {
67
+ ...attributes?.metadata,
68
+ name: newName,
69
+ },
70
+ } );
71
+ } }
72
+ />
73
+ </InspectorControls>
74
+ ) }
75
+ <BlockEdit key="edit" { ...props } />
76
+ </>
77
+ );
78
+ },
79
+ 'withToolbarControls'
80
+ );
81
+
82
+ addFilter(
83
+ 'editor.BlockEdit',
84
+ 'core/block-rename-ui/with-block-rename-control',
85
+ withBlockRenameControl
86
+ );
87
+
41
88
  addFilter(
42
89
  'blocks.registerBlockType',
43
90
  'core/metadata/addLabelCallback',
@@ -34,6 +34,65 @@ function addAttribute( settings ) {
34
34
  return settings;
35
35
  }
36
36
 
37
+ function CustomFieldsControl( props ) {
38
+ const blockEditingMode = useBlockEditingMode();
39
+ if ( blockEditingMode !== 'default' ) {
40
+ return null;
41
+ }
42
+
43
+ // If the block is a paragraph or image block, we need to know which
44
+ // attribute to use for the connection. Only the `content` attribute
45
+ // of the paragraph block and the `url` attribute of the image block are supported.
46
+ let attributeName;
47
+ if ( props.name === 'core/paragraph' ) attributeName = 'content';
48
+ if ( props.name === 'core/image' ) attributeName = 'url';
49
+
50
+ return (
51
+ <InspectorControls>
52
+ <PanelBody title={ __( 'Connections' ) } initialOpen={ true }>
53
+ <TextControl
54
+ __nextHasNoMarginBottom
55
+ autoComplete="off"
56
+ label={ __( 'Custom field meta_key' ) }
57
+ value={
58
+ props.attributes?.connections?.attributes?.[
59
+ attributeName
60
+ ]?.value || ''
61
+ }
62
+ onChange={ ( nextValue ) => {
63
+ if ( nextValue === '' ) {
64
+ props.setAttributes( {
65
+ connections: undefined,
66
+ [ attributeName ]: undefined,
67
+ placeholder: undefined,
68
+ } );
69
+ } else {
70
+ props.setAttributes( {
71
+ connections: {
72
+ attributes: {
73
+ // The attributeName will be either `content` or `url`.
74
+ [ attributeName ]: {
75
+ // Source will be variable, could be post_meta, user_meta, term_meta, etc.
76
+ // Could even be a custom source like a social media attribute.
77
+ source: 'meta_fields',
78
+ value: nextValue,
79
+ },
80
+ },
81
+ },
82
+ [ attributeName ]: undefined,
83
+ placeholder: sprintf(
84
+ 'This content will be replaced on the frontend by the value of "%s" custom field.',
85
+ nextValue
86
+ ),
87
+ } );
88
+ }
89
+ } }
90
+ />
91
+ </PanelBody>
92
+ </InspectorControls>
93
+ );
94
+ }
95
+
37
96
  /**
38
97
  * Override the default edit UI to include a new block inspector control for
39
98
  * assigning a connection to blocks that has support for connections.
@@ -46,7 +105,6 @@ function addAttribute( settings ) {
46
105
  */
47
106
  const withCustomFieldsControls = createHigherOrderComponent( ( BlockEdit ) => {
48
107
  return ( props ) => {
49
- const blockEditingMode = useBlockEditingMode();
50
108
  const hasCustomFieldsSupport = hasBlockSupport(
51
109
  props.name,
52
110
  '__experimentalConnections',
@@ -56,72 +114,17 @@ const withCustomFieldsControls = createHigherOrderComponent( ( BlockEdit ) => {
56
114
  // Check if the current block is a paragraph or image block.
57
115
  // Currently, only these two blocks are supported.
58
116
  if ( ! [ 'core/paragraph', 'core/image' ].includes( props.name ) ) {
59
- return <BlockEdit { ...props } />;
117
+ return <BlockEdit key="edit" { ...props } />;
60
118
  }
61
119
 
62
- // If the block is a paragraph or image block, we need to know which
63
- // attribute to use for the connection. Only the `content` attribute
64
- // of the paragraph block and the `url` attribute of the image block are supported.
65
- let attributeName;
66
- if ( props.name === 'core/paragraph' ) attributeName = 'content';
67
- if ( props.name === 'core/image' ) attributeName = 'url';
68
-
69
- if ( hasCustomFieldsSupport && props.isSelected ) {
70
- return (
71
- <>
72
- <BlockEdit { ...props } />
73
- { blockEditingMode === 'default' && (
74
- <InspectorControls>
75
- <PanelBody
76
- title={ __( 'Connections' ) }
77
- initialOpen={ true }
78
- >
79
- <TextControl
80
- __nextHasNoMarginBottom
81
- autoComplete="off"
82
- label={ __( 'Custom field meta_key' ) }
83
- value={
84
- props.attributes?.connections
85
- ?.attributes?.[ attributeName ]
86
- ?.value || ''
87
- }
88
- onChange={ ( nextValue ) => {
89
- if ( nextValue === '' ) {
90
- props.setAttributes( {
91
- connections: undefined,
92
- [ attributeName ]: undefined,
93
- placeholder: undefined,
94
- } );
95
- } else {
96
- props.setAttributes( {
97
- connections: {
98
- attributes: {
99
- // The attributeName will be either `content` or `url`.
100
- [ attributeName ]: {
101
- // Source will be variable, could be post_meta, user_meta, term_meta, etc.
102
- // Could even be a custom source like a social media attribute.
103
- source: 'meta_fields',
104
- value: nextValue,
105
- },
106
- },
107
- },
108
- [ attributeName ]: undefined,
109
- placeholder: sprintf(
110
- 'This content will be replaced on the frontend by the value of "%s" custom field.',
111
- nextValue
112
- ),
113
- } );
114
- }
115
- } }
116
- />
117
- </PanelBody>
118
- </InspectorControls>
119
- ) }
120
- </>
121
- );
122
- }
123
-
124
- return <BlockEdit { ...props } />;
120
+ return (
121
+ <>
122
+ <BlockEdit key="edit" { ...props } />
123
+ { hasCustomFieldsSupport && props.isSelected && (
124
+ <CustomFieldsControl { ...props } />
125
+ ) }
126
+ </>
127
+ );
125
128
  };
126
129
  }, 'withCustomFieldsControls' );
127
130
 
@@ -22,7 +22,6 @@ import './metadata';
22
22
  import './custom-fields';
23
23
  import './block-hooks';
24
24
  import './block-renaming';
25
- import './block-rename-ui';
26
25
 
27
26
  export { useCustomSides } from './dimensions';
28
27
  export { useLayoutClasses, useLayoutStyles } from './layout';
@@ -135,10 +135,9 @@ export function useLayoutStyles( blockAttributes = {}, blockName, selector ) {
135
135
 
136
136
  function LayoutPanel( { setAttributes, attributes, name: blockName } ) {
137
137
  const settings = useBlockSettings( blockName );
138
- const {
139
- layout: { allowEditing: allowEditingSetting },
140
- } = settings;
141
-
138
+ // Block settings come from theme.json under settings.[blockName].
139
+ const { layout: layoutSettings } = settings;
140
+ // Layout comes from block attributes.
142
141
  const { layout } = attributes;
143
142
  const [ defaultThemeLayout ] = useSettings( 'layout' );
144
143
  const { themeSupportsLayout } = useSelect( ( select ) => {
@@ -153,17 +152,22 @@ function LayoutPanel( { setAttributes, attributes, name: blockName } ) {
153
152
  return null;
154
153
  }
155
154
 
155
+ // Layout block support comes from the block's block.json.
156
156
  const layoutBlockSupport = getBlockSupport(
157
157
  blockName,
158
158
  layoutBlockSupportKey,
159
159
  {}
160
160
  );
161
+ const blockSupportAndThemeSettings = {
162
+ ...layoutSettings,
163
+ ...layoutBlockSupport,
164
+ };
161
165
  const {
162
166
  allowSwitching,
163
- allowEditing = allowEditingSetting ?? true,
167
+ allowEditing = true,
164
168
  allowInheriting = true,
165
169
  default: defaultBlockLayout,
166
- } = layoutBlockSupport;
170
+ } = blockSupportAndThemeSettings;
167
171
 
168
172
  if ( ! allowEditing ) {
169
173
  return null;
@@ -260,14 +264,14 @@ function LayoutPanel( { setAttributes, attributes, name: blockName } ) {
260
264
  <layoutType.inspectorControls
261
265
  layout={ usedLayout }
262
266
  onChange={ onChangeLayout }
263
- layoutBlockSupport={ layoutBlockSupport }
267
+ layoutBlockSupport={ blockSupportAndThemeSettings }
264
268
  />
265
269
  ) }
266
270
  { constrainedType && displayControlsForLegacyLayouts && (
267
271
  <constrainedType.inspectorControls
268
272
  layout={ usedLayout }
269
273
  onChange={ onChangeLayout }
270
- layoutBlockSupport={ layoutBlockSupport }
274
+ layoutBlockSupport={ blockSupportAndThemeSettings }
271
275
  />
272
276
  ) }
273
277
  </PanelBody>
@@ -19,25 +19,25 @@ exports[`Align options for group block sets Wide width option 1`] = `
19
19
  `;
20
20
 
21
21
  exports[`Align options for media block sets Align center option 1`] = `
22
- "<!-- wp:image {"align":"center","id":1,"sizeSlug":"large","linkDestination":"none"} -->
22
+ "<!-- wp:image {"id":1,"sizeSlug":"large","linkDestination":"none","align":"center"} -->
23
23
  <figure class="wp-block-image aligncenter size-large"><img src="https://test-site.files.wordpress.com/local-image-1.jpeg" alt="" class="wp-image-1"/></figure>
24
24
  <!-- /wp:image -->"
25
25
  `;
26
26
 
27
27
  exports[`Align options for media block sets Align left option 1`] = `
28
- "<!-- wp:image {"align":"left","id":1,"sizeSlug":"large","linkDestination":"none"} -->
28
+ "<!-- wp:image {"id":1,"sizeSlug":"large","linkDestination":"none","align":"left"} -->
29
29
  <figure class="wp-block-image alignleft size-large"><img src="https://test-site.files.wordpress.com/local-image-1.jpeg" alt="" class="wp-image-1"/></figure>
30
30
  <!-- /wp:image -->"
31
31
  `;
32
32
 
33
33
  exports[`Align options for media block sets Align right option 1`] = `
34
- "<!-- wp:image {"align":"right","id":1,"sizeSlug":"large","linkDestination":"none"} -->
34
+ "<!-- wp:image {"id":1,"sizeSlug":"large","linkDestination":"none","align":"right"} -->
35
35
  <figure class="wp-block-image alignright size-large"><img src="https://test-site.files.wordpress.com/local-image-1.jpeg" alt="" class="wp-image-1"/></figure>
36
36
  <!-- /wp:image -->"
37
37
  `;
38
38
 
39
39
  exports[`Align options for media block sets Full width option 1`] = `
40
- "<!-- wp:image {"align":"full","id":1,"sizeSlug":"large","linkDestination":"none"} -->
40
+ "<!-- wp:image {"id":1,"sizeSlug":"large","linkDestination":"none","align":"full"} -->
41
41
  <figure class="wp-block-image alignfull size-large"><img src="https://test-site.files.wordpress.com/local-image-1.jpeg" alt="" class="wp-image-1"/></figure>
42
42
  <!-- /wp:image -->"
43
43
  `;
@@ -49,7 +49,7 @@ exports[`Align options for media block sets None option 1`] = `
49
49
  `;
50
50
 
51
51
  exports[`Align options for media block sets Wide width option 1`] = `
52
- "<!-- wp:image {"align":"wide","id":1,"sizeSlug":"large","linkDestination":"none"} -->
52
+ "<!-- wp:image {"id":1,"sizeSlug":"large","linkDestination":"none","align":"wide"} -->
53
53
  <figure class="wp-block-image alignwide size-large"><img src="https://test-site.files.wordpress.com/local-image-1.jpeg" alt="" class="wp-image-1"/></figure>
54
54
  <!-- /wp:image -->"
55
55
  `;
@@ -36,7 +36,10 @@ export default {
36
36
  layoutBlockSupport = {},
37
37
  } ) {
38
38
  const { wideSize, contentSize, justifyContent = 'center' } = layout;
39
- const { allowJustification = true } = layoutBlockSupport;
39
+ const {
40
+ allowJustification = true,
41
+ allowCustomContentAndWideSize = true,
42
+ } = layoutBlockSupport;
40
43
  const onJustificationChange = ( value ) => {
41
44
  onChange( {
42
45
  ...layout,
@@ -66,55 +69,59 @@ export default {
66
69
  } );
67
70
  return (
68
71
  <>
69
- <div className="block-editor-hooks__layout-controls">
70
- <div className="block-editor-hooks__layout-controls-unit">
71
- <UnitControl
72
- className="block-editor-hooks__layout-controls-unit-input"
73
- label={ __( 'Content' ) }
74
- labelPosition="top"
75
- __unstableInputWidth="80px"
76
- value={ contentSize || wideSize || '' }
77
- onChange={ ( nextWidth ) => {
78
- nextWidth =
79
- 0 > parseFloat( nextWidth )
80
- ? '0'
81
- : nextWidth;
82
- onChange( {
83
- ...layout,
84
- contentSize: nextWidth,
85
- } );
86
- } }
87
- units={ units }
88
- />
89
- <Icon icon={ positionCenter } />
90
- </div>
91
- <div className="block-editor-hooks__layout-controls-unit">
92
- <UnitControl
93
- className="block-editor-hooks__layout-controls-unit-input"
94
- label={ __( 'Wide' ) }
95
- labelPosition="top"
96
- __unstableInputWidth="80px"
97
- value={ wideSize || contentSize || '' }
98
- onChange={ ( nextWidth ) => {
99
- nextWidth =
100
- 0 > parseFloat( nextWidth )
101
- ? '0'
102
- : nextWidth;
103
- onChange( {
104
- ...layout,
105
- wideSize: nextWidth,
106
- } );
107
- } }
108
- units={ units }
109
- />
110
- <Icon icon={ stretchWide } />
111
- </div>
112
- </div>
113
- <p className="block-editor-hooks__layout-controls-helptext">
114
- { __(
115
- 'Customize the width for all elements that are assigned to the center or wide columns.'
116
- ) }
117
- </p>
72
+ { allowCustomContentAndWideSize && (
73
+ <>
74
+ <div className="block-editor-hooks__layout-controls">
75
+ <div className="block-editor-hooks__layout-controls-unit">
76
+ <UnitControl
77
+ className="block-editor-hooks__layout-controls-unit-input"
78
+ label={ __( 'Content' ) }
79
+ labelPosition="top"
80
+ __unstableInputWidth="80px"
81
+ value={ contentSize || wideSize || '' }
82
+ onChange={ ( nextWidth ) => {
83
+ nextWidth =
84
+ 0 > parseFloat( nextWidth )
85
+ ? '0'
86
+ : nextWidth;
87
+ onChange( {
88
+ ...layout,
89
+ contentSize: nextWidth,
90
+ } );
91
+ } }
92
+ units={ units }
93
+ />
94
+ <Icon icon={ positionCenter } />
95
+ </div>
96
+ <div className="block-editor-hooks__layout-controls-unit">
97
+ <UnitControl
98
+ className="block-editor-hooks__layout-controls-unit-input"
99
+ label={ __( 'Wide' ) }
100
+ labelPosition="top"
101
+ __unstableInputWidth="80px"
102
+ value={ wideSize || contentSize || '' }
103
+ onChange={ ( nextWidth ) => {
104
+ nextWidth =
105
+ 0 > parseFloat( nextWidth )
106
+ ? '0'
107
+ : nextWidth;
108
+ onChange( {
109
+ ...layout,
110
+ wideSize: nextWidth,
111
+ } );
112
+ } }
113
+ units={ units }
114
+ />
115
+ <Icon icon={ stretchWide } />
116
+ </div>
117
+ </div>
118
+ <p className="block-editor-hooks__layout-controls-helptext">
119
+ { __(
120
+ 'Customize the width for all elements that are assigned to the center or wide columns.'
121
+ ) }
122
+ </p>
123
+ </>
124
+ ) }
118
125
  { allowJustification && (
119
126
  <ToggleGroupControl
120
127
  __nextHasNoMarginBottom