@wordpress/block-library 8.10.0 → 8.11.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 (278) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/block/edit.native.js +17 -10
  3. package/build/block/edit.native.js.map +1 -1
  4. package/build/code/index.js +1 -0
  5. package/build/code/index.js.map +1 -1
  6. package/build/column/index.js +1 -1
  7. package/build/columns/transforms.js +1 -5
  8. package/build/columns/transforms.js.map +1 -1
  9. package/build/cover/edit/resizable-cover-popover.js +3 -3
  10. package/build/cover/edit/resizable-cover-popover.js.map +1 -1
  11. package/build/file/interactivity.js +19 -0
  12. package/build/file/interactivity.js.map +1 -0
  13. package/build/file/{utils.js → utils/index.js} +1 -1
  14. package/build/file/utils/index.js.map +1 -0
  15. package/build/freeform/modal.js +20 -17
  16. package/build/freeform/modal.js.map +1 -1
  17. package/build/gallery/v1/edit.js +1 -7
  18. package/build/gallery/v1/edit.js.map +1 -1
  19. package/build/gallery/v1/gallery-image.native.js +1 -3
  20. package/build/gallery/v1/gallery-image.native.js.map +1 -1
  21. package/build/group/transforms.js +0 -5
  22. package/build/group/transforms.js.map +1 -1
  23. package/build/image/deprecated.js +2 -4
  24. package/build/image/deprecated.js.map +1 -1
  25. package/build/image/edit.js +13 -11
  26. package/build/image/edit.js.map +1 -1
  27. package/build/image/image.js +7 -12
  28. package/build/image/image.js.map +1 -1
  29. package/build/image/index.js +3 -0
  30. package/build/image/index.js.map +1 -1
  31. package/build/image/interactivity.js +102 -0
  32. package/build/image/interactivity.js.map +1 -0
  33. package/build/image/save.js +2 -4
  34. package/build/image/save.js.map +1 -1
  35. package/build/image/utils.js +10 -18
  36. package/build/image/utils.js.map +1 -1
  37. package/build/latest-posts/edit.native.js +1 -3
  38. package/build/latest-posts/edit.native.js.map +1 -1
  39. package/build/list/edit.js +1 -1
  40. package/build/list/edit.js.map +1 -1
  41. package/build/list-item/edit.native.js +1 -1
  42. package/build/list-item/edit.native.js.map +1 -1
  43. package/build/list-item/transforms.js +4 -1
  44. package/build/list-item/transforms.js.map +1 -1
  45. package/build/media-text/deprecated.js +4 -6
  46. package/build/media-text/deprecated.js.map +1 -1
  47. package/build/media-text/edit.js +13 -11
  48. package/build/media-text/edit.js.map +1 -1
  49. package/build/media-text/media-container.js +3 -3
  50. package/build/media-text/media-container.js.map +1 -1
  51. package/build/media-text/save.js +1 -3
  52. package/build/media-text/save.js.map +1 -1
  53. package/build/navigation/constants.js +3 -1
  54. package/build/navigation/constants.js.map +1 -1
  55. package/build/navigation/edit/inner-blocks.js +1 -0
  56. package/build/navigation/edit/inner-blocks.js.map +1 -1
  57. package/build/navigation/edit/leaf-more-menu.js +148 -0
  58. package/build/navigation/edit/leaf-more-menu.js.map +1 -0
  59. package/build/navigation/edit/menu-inspector-controls.js +53 -8
  60. package/build/navigation/edit/menu-inspector-controls.js.map +1 -1
  61. package/build/navigation/edit/navigation-menu-delete-control.js +6 -6
  62. package/build/navigation/edit/navigation-menu-delete-control.js.map +1 -1
  63. package/build/navigation/edit/unsaved-inner-blocks.js +8 -19
  64. package/build/navigation/edit/unsaved-inner-blocks.js.map +1 -1
  65. package/build/navigation/interactivity.js +24 -6
  66. package/build/navigation/interactivity.js.map +1 -1
  67. package/build/navigation-link/edit.js +6 -4
  68. package/build/navigation-link/edit.js.map +1 -1
  69. package/build/navigation-link/update-attributes.js +5 -5
  70. package/build/navigation-link/update-attributes.js.map +1 -1
  71. package/build/navigation-submenu/edit.js +6 -4
  72. package/build/navigation-submenu/edit.js.map +1 -1
  73. package/build/pattern/edit.js +42 -8
  74. package/build/pattern/edit.js.map +1 -1
  75. package/build/pattern/index.js +12 -5
  76. package/build/pattern/index.js.map +1 -1
  77. package/build/pattern/v1/edit.js +57 -0
  78. package/build/pattern/v1/edit.js.map +1 -0
  79. package/build/post-title/edit.js +10 -3
  80. package/build/post-title/edit.js.map +1 -1
  81. package/build/quote/transforms.js +9 -12
  82. package/build/quote/transforms.js.map +1 -1
  83. package/build/social-link/edit.js +21 -4
  84. package/build/social-link/edit.js.map +1 -1
  85. package/build/template-part/edit/index.js +1 -7
  86. package/build/template-part/edit/index.js.map +1 -1
  87. package/build/template-part/edit/utils/hooks.js +2 -2
  88. package/build/template-part/edit/utils/hooks.js.map +1 -1
  89. package/build/utils/interactivity/directives.js +50 -22
  90. package/build/utils/interactivity/directives.js.map +1 -1
  91. package/build/utils/interactivity/hooks.js +76 -12
  92. package/build/utils/interactivity/hooks.js.map +1 -1
  93. package/build/utils/interactivity/portals.js +108 -0
  94. package/build/utils/interactivity/portals.js.map +1 -0
  95. package/build-module/block/edit.native.js +7 -1
  96. package/build-module/block/edit.native.js.map +1 -1
  97. package/build-module/code/index.js +1 -0
  98. package/build-module/code/index.js.map +1 -1
  99. package/build-module/column/index.js +1 -1
  100. package/build-module/columns/transforms.js +1 -5
  101. package/build-module/columns/transforms.js.map +1 -1
  102. package/build-module/cover/edit/resizable-cover-popover.js +3 -3
  103. package/build-module/cover/edit/resizable-cover-popover.js.map +1 -1
  104. package/build-module/file/interactivity.js +15 -0
  105. package/build-module/file/interactivity.js.map +1 -0
  106. package/build-module/file/{utils.js → utils/index.js} +1 -1
  107. package/build-module/file/utils/index.js.map +1 -0
  108. package/build-module/freeform/modal.js +19 -18
  109. package/build-module/freeform/modal.js.map +1 -1
  110. package/build-module/gallery/v1/edit.js +1 -6
  111. package/build-module/gallery/v1/edit.js.map +1 -1
  112. package/build-module/gallery/v1/gallery-image.native.js +1 -2
  113. package/build-module/gallery/v1/gallery-image.native.js.map +1 -1
  114. package/build-module/group/transforms.js +0 -5
  115. package/build-module/group/transforms.js.map +1 -1
  116. package/build-module/image/deprecated.js +2 -3
  117. package/build-module/image/deprecated.js.map +1 -1
  118. package/build-module/image/edit.js +12 -11
  119. package/build-module/image/edit.js.map +1 -1
  120. package/build-module/image/image.js +7 -11
  121. package/build-module/image/image.js.map +1 -1
  122. package/build-module/image/index.js +3 -0
  123. package/build-module/image/index.js.map +1 -1
  124. package/build-module/image/interactivity.js +99 -0
  125. package/build-module/image/interactivity.js.map +1 -0
  126. package/build-module/image/save.js +2 -3
  127. package/build-module/image/save.js.map +1 -1
  128. package/build-module/image/utils.js +10 -17
  129. package/build-module/image/utils.js.map +1 -1
  130. package/build-module/latest-posts/edit.native.js +1 -2
  131. package/build-module/latest-posts/edit.native.js.map +1 -1
  132. package/build-module/list/edit.js +1 -1
  133. package/build-module/list/edit.js.map +1 -1
  134. package/build-module/list-item/edit.native.js +1 -1
  135. package/build-module/list-item/edit.native.js.map +1 -1
  136. package/build-module/list-item/transforms.js +5 -2
  137. package/build-module/list-item/transforms.js.map +1 -1
  138. package/build-module/media-text/deprecated.js +4 -5
  139. package/build-module/media-text/deprecated.js.map +1 -1
  140. package/build-module/media-text/edit.js +13 -12
  141. package/build-module/media-text/edit.js.map +1 -1
  142. package/build-module/media-text/media-container.js +3 -3
  143. package/build-module/media-text/media-container.js.map +1 -1
  144. package/build-module/media-text/save.js +1 -2
  145. package/build-module/media-text/save.js.map +1 -1
  146. package/build-module/navigation/constants.js +1 -0
  147. package/build-module/navigation/constants.js.map +1 -1
  148. package/build-module/navigation/edit/inner-blocks.js +2 -1
  149. package/build-module/navigation/edit/inner-blocks.js.map +1 -1
  150. package/build-module/navigation/edit/leaf-more-menu.js +132 -0
  151. package/build-module/navigation/edit/leaf-more-menu.js.map +1 -0
  152. package/build-module/navigation/edit/menu-inspector-controls.js +52 -9
  153. package/build-module/navigation/edit/menu-inspector-controls.js.map +1 -1
  154. package/build-module/navigation/edit/navigation-menu-delete-control.js +7 -7
  155. package/build-module/navigation/edit/navigation-menu-delete-control.js.map +1 -1
  156. package/build-module/navigation/edit/unsaved-inner-blocks.js +8 -16
  157. package/build-module/navigation/edit/unsaved-inner-blocks.js.map +1 -1
  158. package/build-module/navigation/interactivity.js +24 -6
  159. package/build-module/navigation/interactivity.js.map +1 -1
  160. package/build-module/navigation-link/edit.js +6 -4
  161. package/build-module/navigation-link/edit.js.map +1 -1
  162. package/build-module/navigation-link/update-attributes.js +4 -4
  163. package/build-module/navigation-link/update-attributes.js.map +1 -1
  164. package/build-module/navigation-submenu/edit.js +6 -4
  165. package/build-module/navigation-submenu/edit.js.map +1 -1
  166. package/build-module/pattern/edit.js +42 -9
  167. package/build-module/pattern/edit.js.map +1 -1
  168. package/build-module/pattern/index.js +12 -3
  169. package/build-module/pattern/index.js.map +1 -1
  170. package/build-module/pattern/v1/edit.js +48 -0
  171. package/build-module/pattern/v1/edit.js.map +1 -0
  172. package/build-module/post-title/edit.js +10 -3
  173. package/build-module/post-title/edit.js.map +1 -1
  174. package/build-module/quote/transforms.js +9 -12
  175. package/build-module/quote/transforms.js.map +1 -1
  176. package/build-module/social-link/edit.js +20 -5
  177. package/build-module/social-link/edit.js.map +1 -1
  178. package/build-module/template-part/edit/index.js +1 -6
  179. package/build-module/template-part/edit/index.js.map +1 -1
  180. package/build-module/template-part/edit/utils/hooks.js +1 -1
  181. package/build-module/template-part/edit/utils/hooks.js.map +1 -1
  182. package/build-module/utils/interactivity/directives.js +49 -22
  183. package/build-module/utils/interactivity/directives.js.map +1 -1
  184. package/build-module/utils/interactivity/hooks.js +77 -13
  185. package/build-module/utils/interactivity/hooks.js.map +1 -1
  186. package/build-module/utils/interactivity/portals.js +100 -0
  187. package/build-module/utils/interactivity/portals.js.map +1 -0
  188. package/build-style/common-rtl.css +1 -1
  189. package/build-style/common.css +1 -1
  190. package/build-style/cover/style-rtl.css +1 -2
  191. package/build-style/cover/style.css +1 -2
  192. package/build-style/editor-rtl.css +68 -0
  193. package/build-style/editor.css +68 -0
  194. package/build-style/file/editor-rtl.css +3 -0
  195. package/build-style/file/editor.css +3 -0
  196. package/build-style/freeform/editor-rtl.css +29 -0
  197. package/build-style/freeform/editor.css +29 -0
  198. package/build-style/gallery/style-rtl.css +2 -4
  199. package/build-style/gallery/style.css +2 -4
  200. package/build-style/image/style-rtl.css +98 -0
  201. package/build-style/image/style.css +98 -0
  202. package/build-style/navigation/editor-rtl.css +36 -0
  203. package/build-style/navigation/editor.css +36 -0
  204. package/build-style/post-comments-form/style-rtl.css +1 -1
  205. package/build-style/post-comments-form/style.css +1 -1
  206. package/build-style/style-rtl.css +103 -9
  207. package/build-style/style.css +103 -9
  208. package/build-style/video/style-rtl.css +1 -2
  209. package/build-style/video/style.css +1 -2
  210. package/package.json +32 -32
  211. package/src/block/edit.native.js +18 -4
  212. package/src/buttons/test/edit.native.js +0 -9
  213. package/src/code/block.json +1 -0
  214. package/src/column/block.json +1 -1
  215. package/src/columns/test/__snapshots__/transforms.native.js.snap +1 -1
  216. package/src/columns/test/transforms.native.js +3 -5
  217. package/src/columns/transforms.js +2 -8
  218. package/src/comments/index.php +1 -6
  219. package/src/cover/edit/resizable-cover-popover.js +2 -1
  220. package/src/file/editor.scss +4 -0
  221. package/src/file/interactivity.js +15 -0
  222. package/src/freeform/editor.scss +45 -0
  223. package/src/freeform/modal.js +22 -19
  224. package/src/gallery/v1/edit.js +1 -6
  225. package/src/gallery/v1/gallery-image.native.js +1 -2
  226. package/src/group/test/__snapshots__/transforms.native.js.snap +1 -1
  227. package/src/group/test/transforms.native.js +3 -5
  228. package/src/group/transforms.js +0 -7
  229. package/src/image/block.json +3 -0
  230. package/src/image/deprecated.js +2 -3
  231. package/src/image/edit.js +18 -18
  232. package/src/image/image.js +8 -11
  233. package/src/image/index.php +75 -2
  234. package/src/image/interactivity.js +113 -0
  235. package/src/image/save.js +4 -3
  236. package/src/image/style.scss +113 -0
  237. package/src/image/utils.js +11 -18
  238. package/src/latest-posts/edit.native.js +1 -4
  239. package/src/list/edit.js +1 -1
  240. package/src/list/test/edit.native.js +80 -1
  241. package/src/list-item/edit.native.js +1 -1
  242. package/src/list-item/transforms.js +4 -2
  243. package/src/media-text/deprecated.js +4 -5
  244. package/src/media-text/edit.js +12 -10
  245. package/src/media-text/media-container.js +3 -3
  246. package/src/media-text/save.js +1 -2
  247. package/src/navigation/constants.js +5 -0
  248. package/src/navigation/edit/inner-blocks.js +6 -1
  249. package/src/navigation/edit/leaf-more-menu.js +170 -0
  250. package/src/navigation/edit/menu-inspector-controls.js +78 -10
  251. package/src/navigation/edit/navigation-menu-delete-control.js +29 -29
  252. package/src/navigation/edit/unsaved-inner-blocks.js +11 -24
  253. package/src/navigation/editor.scss +10 -0
  254. package/src/navigation/index.php +4 -1
  255. package/src/navigation/interactivity.js +9 -2
  256. package/src/navigation-link/edit.js +8 -2
  257. package/src/navigation-link/update-attributes.js +2 -2
  258. package/src/navigation-submenu/edit.js +8 -2
  259. package/src/pattern/block.json +4 -0
  260. package/src/pattern/edit.js +53 -16
  261. package/src/pattern/index.js +5 -4
  262. package/src/pattern/index.php +14 -1
  263. package/src/pattern/v1/edit.js +57 -0
  264. package/src/post-comments-form/style.scss +3 -1
  265. package/src/post-title/edit.js +50 -44
  266. package/src/quote/test/__snapshots__/transforms.native.js.snap +1 -1
  267. package/src/quote/test/transforms.native.js +3 -5
  268. package/src/quote/transforms.js +9 -13
  269. package/src/social-link/edit.js +51 -26
  270. package/src/template-part/edit/index.js +4 -6
  271. package/src/template-part/edit/utils/hooks.js +1 -1
  272. package/src/template-part/index.php +2 -2
  273. package/src/utils/interactivity/directives.js +27 -6
  274. package/src/utils/interactivity/hooks.js +83 -14
  275. package/src/utils/interactivity/portals.js +98 -0
  276. package/build/file/utils.js.map +0 -1
  277. package/build-module/file/utils.js.map +0 -1
  278. /package/src/file/{utils.js → utils/index.js} +0 -0
@@ -151,3 +151,116 @@
151
151
  .wp-block-image figure {
152
152
  margin: 0;
153
153
  }
154
+
155
+ .wp-lightbox-container {
156
+
157
+ .img-container {
158
+ position: relative;
159
+ }
160
+
161
+ button {
162
+ border: none;
163
+ background: none;
164
+ cursor: zoom-in;
165
+ width: 100%;
166
+ height: 100%;
167
+ position: absolute;
168
+ z-index: 100;
169
+
170
+ &:focus-visible {
171
+ outline: 5px auto #212121;
172
+ outline: 5px auto -webkit-focus-ring-color;
173
+ outline-offset: 5px;
174
+ }
175
+ }
176
+ }
177
+
178
+ .wp-lightbox-overlay {
179
+ position: fixed;
180
+ top: 0;
181
+ left: 0;
182
+ z-index: 100000;
183
+ overflow: hidden;
184
+ width: 100vw;
185
+ height: 100vh;
186
+ visibility: hidden;
187
+
188
+ .close-button {
189
+ font-size: 40px;
190
+ position: absolute;
191
+ top: 20px;
192
+ right: 20px;
193
+ cursor: pointer;
194
+ z-index: 5000000;
195
+ }
196
+
197
+ .wp-block-image {
198
+ display: flex;
199
+ justify-content: center;
200
+ align-items: center;
201
+ width: 100%;
202
+ height: 100%;
203
+ z-index: 3000000;
204
+ position: absolute;
205
+ flex-direction: column;
206
+ }
207
+
208
+ button {
209
+ border: none;
210
+ background: none;
211
+ }
212
+
213
+ .scrim {
214
+ width: 100%;
215
+ height: 100%;
216
+ position: absolute;
217
+ z-index: 2000000;
218
+ background-color: rgb(255, 255, 255);
219
+ opacity: 0.9;
220
+ }
221
+
222
+ &.initialized {
223
+ animation: both turn-off-visibility 300ms;
224
+
225
+ img {
226
+ animation: both turn-off-visibility 250ms;
227
+ }
228
+
229
+ &.active {
230
+ visibility: visible;
231
+ animation: both turn-on-visibility 250ms;
232
+
233
+ img {
234
+ animation: both turn-on-visibility 300ms;
235
+ }
236
+ }
237
+ }
238
+ }
239
+
240
+ @keyframes turn-on-visibility {
241
+ 0% {
242
+ opacity: 0;
243
+ }
244
+ 100% {
245
+ opacity: 1;
246
+ }
247
+ }
248
+
249
+ @keyframes turn-off-visibility {
250
+ 0% {
251
+ opacity: 1;
252
+ visibility: visible;
253
+ }
254
+ 99% {
255
+ opacity: 0;
256
+ visibility: visible;
257
+ }
258
+ 100% {
259
+ opacity: 0;
260
+ visibility: hidden;
261
+ }
262
+ }
263
+
264
+ html.has-lightbox-open {
265
+ overflow: hidden;
266
+ }
@@ -1,8 +1,3 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { isEmpty } from 'lodash';
5
-
6
1
  /**
7
2
  * Internal dependencies
8
3
  */
@@ -11,21 +6,19 @@ import { NEW_TAB_REL } from './constants';
11
6
  export function removeNewTabRel( currentRel ) {
12
7
  let newRel = currentRel;
13
8
 
14
- if ( currentRel !== undefined && ! isEmpty( newRel ) ) {
15
- if ( ! isEmpty( newRel ) ) {
16
- NEW_TAB_REL.forEach( ( relVal ) => {
17
- const regExp = new RegExp( '\\b' + relVal + '\\b', 'gi' );
18
- newRel = newRel.replace( regExp, '' );
19
- } );
9
+ if ( currentRel !== undefined && newRel ) {
10
+ NEW_TAB_REL.forEach( ( relVal ) => {
11
+ const regExp = new RegExp( '\\b' + relVal + '\\b', 'gi' );
12
+ newRel = newRel.replace( regExp, '' );
13
+ } );
20
14
 
21
- // Only trim if NEW_TAB_REL values was replaced.
22
- if ( newRel !== currentRel ) {
23
- newRel = newRel.trim();
24
- }
15
+ // Only trim if NEW_TAB_REL values was replaced.
16
+ if ( newRel !== currentRel ) {
17
+ newRel = newRel.trim();
18
+ }
25
19
 
26
- if ( isEmpty( newRel ) ) {
27
- newRel = undefined;
28
- }
20
+ if ( ! newRel ) {
21
+ newRel = undefined;
29
22
  }
30
23
  }
31
24
 
@@ -2,7 +2,6 @@
2
2
  * External dependencies
3
3
  */
4
4
  import { TouchableWithoutFeedback, View, Text } from 'react-native';
5
- import { isEmpty } from 'lodash';
6
5
 
7
6
  /**
8
7
  * WordPress dependencies
@@ -63,9 +62,7 @@ class LatestPostsEdit extends Component {
63
62
  .then( ( categoriesList ) => {
64
63
  if ( this.isStillMounted ) {
65
64
  this.setState( {
66
- categoriesList: isEmpty( categoriesList )
67
- ? []
68
- : categoriesList,
65
+ categoriesList,
69
66
  } );
70
67
  }
71
68
  } )
package/src/list/edit.js CHANGED
@@ -135,7 +135,7 @@ export default function Edit( { attributes, setAttributes, clientId, style } ) {
135
135
  ...( Platform.isNative && {
136
136
  marginVertical: NATIVE_MARGIN_SPACING,
137
137
  marginHorizontal: NATIVE_MARGIN_SPACING,
138
- useCompactList: true,
138
+ renderAppender: false,
139
139
  } ),
140
140
  } );
141
141
  useMigrateOnLoad( attributes, clientId );
@@ -70,6 +70,7 @@ describe( 'List block', () => {
70
70
  // Select List block
71
71
  const [ listBlock ] = screen.getAllByLabelText( /List Block\. Row 1/ );
72
72
  fireEvent.press( listBlock );
73
+ await triggerBlockListLayout( listBlock );
73
74
 
74
75
  // Select List Item block
75
76
  const [ listItemBlock ] = screen.getAllByLabelText(
@@ -117,14 +118,15 @@ describe( 'List block', () => {
117
118
 
118
119
  // Select List block
119
120
  const [ listBlock ] = screen.getAllByLabelText( /List Block\. Row 1/ );
120
-
121
121
  fireEvent.press( listBlock );
122
+ await triggerBlockListLayout( listBlock );
122
123
 
123
124
  // Select List Item block
124
125
  const [ firstNestedLevelBlock ] = within( listBlock ).getAllByLabelText(
125
126
  /List item Block\. Row 2/
126
127
  );
127
128
  fireEvent.press( firstNestedLevelBlock );
129
+ await triggerBlockListLayout( firstNestedLevelBlock );
128
130
 
129
131
  // Select second level list
130
132
  const [ secondNestedLevelBlock ] = within(
@@ -152,6 +154,7 @@ describe( 'List block', () => {
152
154
  // Select List block
153
155
  const [ listBlock ] = screen.getAllByLabelText( /List Block\. Row 1/ );
154
156
  fireEvent.press( listBlock );
157
+ await triggerBlockListLayout( listBlock );
155
158
 
156
159
  // Select Secont List Item block
157
160
  const [ listItemBlock ] = screen.getAllByLabelText(
@@ -163,6 +166,12 @@ describe( 'List block', () => {
163
166
  const indentButton = screen.getByLabelText( 'Indent' );
164
167
  fireEvent.press( indentButton );
165
168
 
169
+ // Await recently indented list item layout
170
+ const [ listItemBlock1 ] = screen.getAllByLabelText(
171
+ /List item Block\. Row 1/
172
+ );
173
+ await triggerBlockListLayout( listItemBlock1 );
174
+
166
175
  expect( getEditorHtml() ).toMatchSnapshot();
167
176
  } );
168
177
 
@@ -184,17 +193,21 @@ describe( 'List block', () => {
184
193
  // Select List block
185
194
  const [ listBlock ] = screen.getAllByLabelText( /List Block\. Row 1/ );
186
195
  fireEvent.press( listBlock );
196
+ await triggerBlockListLayout( listBlock );
187
197
 
188
198
  // Select List Item block
189
199
  const [ firstNestedLevelBlock ] = within( listBlock ).getAllByLabelText(
190
200
  /List item Block\. Row 1/
191
201
  );
192
202
  fireEvent.press( firstNestedLevelBlock );
203
+ await triggerBlockListLayout( firstNestedLevelBlock );
193
204
 
194
205
  // Select Inner block List
195
206
  const [ innerBlockList ] = within(
196
207
  firstNestedLevelBlock
197
208
  ).getAllByLabelText( /List Block\. Row 1/ );
209
+ fireEvent.press( innerBlockList );
210
+ await triggerBlockListLayout( innerBlockList );
198
211
 
199
212
  // Select nested List Item block
200
213
  const [ listItemBlock ] = within( innerBlockList ).getAllByLabelText(
@@ -336,6 +349,7 @@ describe( 'List block', () => {
336
349
  // Select List block
337
350
  const [ listBlock ] = screen.getAllByLabelText( /List Block\. Row 2/ );
338
351
  fireEvent.press( listBlock );
352
+ await triggerBlockListLayout( listBlock );
339
353
 
340
354
  // Select List Item block
341
355
  const [ listItemBlock ] = within( listBlock ).getAllByLabelText(
@@ -384,6 +398,7 @@ describe( 'List block', () => {
384
398
  // Select List block
385
399
  const [ listBlock ] = screen.getAllByLabelText( /List Block\. Row 2/ );
386
400
  fireEvent.press( listBlock );
401
+ await triggerBlockListLayout( listBlock );
387
402
 
388
403
  // Select List Item block
389
404
  const [ listItemBlock ] = within( listBlock ).getAllByLabelText(
@@ -418,4 +433,68 @@ describe( 'List block', () => {
418
433
  <!-- /wp:list -->"
419
434
  ` );
420
435
  } );
436
+
437
+ it( 'merges first item into its own paragraph block and keeps its nested items', async () => {
438
+ const initialHtml = `<!-- wp:paragraph -->
439
+ <p>A quick brown fox.</p>
440
+ <!-- /wp:paragraph -->
441
+ <!-- wp:list -->
442
+ <ul><!-- wp:list-item -->
443
+ <li>One<!-- wp:list -->
444
+ <ul><!-- wp:list-item -->
445
+ <li>Two</li>
446
+ <!-- /wp:list-item -->
447
+ <!-- wp:list-item -->
448
+ <li>Three</li>
449
+ <!-- /wp:list-item --></ul>
450
+ <!-- /wp:list --></li>
451
+ <!-- /wp:list-item --></ul>
452
+ <!-- /wp:list -->`;
453
+
454
+ const screen = await initializeEditor( {
455
+ initialHtml,
456
+ } );
457
+
458
+ // Select List block
459
+ const [ listBlock ] = screen.getAllByLabelText( /List Block\. Row 2/ );
460
+ fireEvent.press( listBlock );
461
+ await triggerBlockListLayout( listBlock );
462
+
463
+ // Select List Item block
464
+ const [ listItemBlock ] = within( listBlock ).getAllByLabelText(
465
+ /List item Block\. Row 1/
466
+ );
467
+ fireEvent.press( listItemBlock );
468
+
469
+ // With cursor positioned at the beginning of the first List Item, press
470
+ // backward delete
471
+ const listItemField =
472
+ within( listItemBlock ).getByLabelText( /Text input. .*One.*/ );
473
+ selectRangeInRichText( listItemField, 0 );
474
+ fireEvent( listItemField, 'onKeyDown', {
475
+ nativeEvent: {},
476
+ preventDefault() {},
477
+ keyCode: BACKSPACE,
478
+ } );
479
+
480
+ expect( getEditorHtml() ).toMatchInlineSnapshot( `
481
+ "<!-- wp:paragraph -->
482
+ <p>A quick brown fox.</p>
483
+ <!-- /wp:paragraph -->
484
+
485
+ <!-- wp:paragraph -->
486
+ <p>One</p>
487
+ <!-- /wp:paragraph -->
488
+
489
+ <!-- wp:list -->
490
+ <ul><!-- wp:list-item -->
491
+ <li>Two</li>
492
+ <!-- /wp:list-item -->
493
+
494
+ <!-- wp:list-item -->
495
+ <li>Three</li>
496
+ <!-- /wp:list-item --></ul>
497
+ <!-- /wp:list -->"
498
+ ` );
499
+ } );
421
500
  } );
@@ -91,7 +91,7 @@ export default function ListItemEdit( {
91
91
 
92
92
  const innerBlocksProps = useInnerBlocksProps( blockProps, {
93
93
  allowedBlocks: [ 'core/list' ],
94
- useCompactList: true,
94
+ renderAppender: false,
95
95
  } );
96
96
 
97
97
  // Set default placeholder text color from light/dark scheme or base colors
@@ -1,15 +1,17 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { createBlock } from '@wordpress/blocks';
4
+ import { createBlock, cloneBlock } from '@wordpress/blocks';
5
5
 
6
6
  const transforms = {
7
7
  to: [
8
8
  {
9
9
  type: 'block',
10
10
  blocks: [ 'core/paragraph' ],
11
- transform: ( attributes ) =>
11
+ transform: ( attributes, innerBlocks = [] ) => [
12
12
  createBlock( 'core/paragraph', attributes ),
13
+ ...innerBlocks.map( ( block ) => cloneBlock( block ) ),
14
+ ],
13
15
  },
14
16
  ],
15
17
  };
@@ -2,7 +2,6 @@
2
2
  * External dependencies
3
3
  */
4
4
  import classnames from 'classnames';
5
- import { isEmpty } from 'lodash';
6
5
 
7
6
  /**
8
7
  * WordPress dependencies
@@ -258,7 +257,7 @@ const v6 = {
258
257
  } = attributes;
259
258
  const mediaSizeSlug =
260
259
  attributes.mediaSizeSlug || DEFAULT_MEDIA_SIZE_SLUG;
261
- const newRel = isEmpty( rel ) ? undefined : rel;
260
+ const newRel = ! rel ? undefined : rel;
262
261
 
263
262
  const imageClasses = classnames( {
264
263
  [ `wp-image-${ mediaId }` ]: mediaId && mediaType === 'image',
@@ -387,7 +386,7 @@ const v5 = {
387
386
  } = attributes;
388
387
  const mediaSizeSlug =
389
388
  attributes.mediaSizeSlug || DEFAULT_MEDIA_SIZE_SLUG;
390
- const newRel = isEmpty( rel ) ? undefined : rel;
389
+ const newRel = ! rel ? undefined : rel;
391
390
 
392
391
  const imageClasses = classnames( {
393
392
  [ `wp-image-${ mediaId }` ]: mediaId && mediaType === 'image',
@@ -501,7 +500,7 @@ const v4 = {
501
500
  } = attributes;
502
501
  const mediaSizeSlug =
503
502
  attributes.mediaSizeSlug || DEFAULT_MEDIA_SIZE_SLUG;
504
- const newRel = isEmpty( rel ) ? undefined : rel;
503
+ const newRel = ! rel ? undefined : rel;
505
504
 
506
505
  const imageClasses = classnames( {
507
506
  [ `wp-image-${ mediaId }` ]: mediaId && mediaType === 'image',
@@ -646,7 +645,7 @@ const v3 = {
646
645
  linkTarget,
647
646
  rel,
648
647
  } = attributes;
649
- const newRel = isEmpty( rel ) ? undefined : rel;
648
+ const newRel = ! rel ? undefined : rel;
650
649
 
651
650
  let image = (
652
651
  <img
@@ -18,6 +18,7 @@ import {
18
18
  __experimentalImageURLInputUI as ImageURLInputUI,
19
19
  __experimentalImageSizeControl as ImageSizeControl,
20
20
  store as blockEditorStore,
21
+ privateApis as blockEditorPrivateApis,
21
22
  } from '@wordpress/block-editor';
22
23
  import {
23
24
  PanelBody,
@@ -43,6 +44,9 @@ import {
43
44
  LINK_DESTINATION_ATTACHMENT,
44
45
  TEMPLATE,
45
46
  } from './constants';
47
+ import { unlock } from '../private-apis';
48
+
49
+ const { useBlockEditingMode } = unlock( blockEditorPrivateApis );
46
50
 
47
51
  // this limits the resize to a safe zone to avoid making broken layouts
48
52
  const applyWidthConstraints = ( width ) =>
@@ -126,7 +130,7 @@ function attributesFromMedia( {
126
130
  };
127
131
  }
128
132
 
129
- function MediaTextEdit( { attributes, isSelected, setAttributes, clientId } ) {
133
+ function MediaTextEdit( { attributes, isSelected, setAttributes } ) {
130
134
  const {
131
135
  focalPoint,
132
136
  href,
@@ -147,13 +151,10 @@ function MediaTextEdit( { attributes, isSelected, setAttributes, clientId } ) {
147
151
  } = attributes;
148
152
  const mediaSizeSlug = attributes.mediaSizeSlug || DEFAULT_MEDIA_SIZE_SLUG;
149
153
 
150
- const { imageSizes, image, isContentLocked } = useSelect(
154
+ const { imageSizes, image } = useSelect(
151
155
  ( select ) => {
152
- const { __unstableGetContentLockingParent, getSettings } =
153
- select( blockEditorStore );
156
+ const { getSettings } = select( blockEditorStore );
154
157
  return {
155
- isContentLocked:
156
- !! __unstableGetContentLockingParent( clientId ),
157
158
  image:
158
159
  mediaId && isSelected
159
160
  ? select( coreStore ).getMedia( mediaId, {
@@ -163,8 +164,7 @@ function MediaTextEdit( { attributes, isSelected, setAttributes, clientId } ) {
163
164
  imageSizes: getSettings()?.imageSizes,
164
165
  };
165
166
  },
166
-
167
- [ isSelected, mediaId, clientId ]
167
+ [ isSelected, mediaId ]
168
168
  );
169
169
 
170
170
  const refMediaContainer = useRef();
@@ -319,11 +319,13 @@ function MediaTextEdit( { attributes, isSelected, setAttributes, clientId } ) {
319
319
  { template: TEMPLATE, allowedBlocks }
320
320
  );
321
321
 
322
+ const blockEditingMode = useBlockEditingMode();
323
+
322
324
  return (
323
325
  <>
324
326
  <InspectorControls>{ mediaTextGeneralSettings }</InspectorControls>
325
327
  <BlockControls group="block">
326
- { ! isContentLocked && (
328
+ { blockEditingMode === 'default' && (
327
329
  <>
328
330
  <BlockVerticalAlignmentControl
329
331
  onChange={ onVerticalAlignmentChange }
@@ -370,6 +372,7 @@ function MediaTextEdit( { attributes, isSelected, setAttributes, clientId } ) {
370
372
  onWidthChange={ onWidthChange }
371
373
  commitWidthChange={ commitWidthChange }
372
374
  ref={ refMediaContainer }
375
+ enableResize={ blockEditingMode === 'default' }
373
376
  { ...{
374
377
  focalPoint,
375
378
  imageFill,
@@ -381,7 +384,6 @@ function MediaTextEdit( { attributes, isSelected, setAttributes, clientId } ) {
381
384
  mediaType,
382
385
  mediaUrl,
383
386
  mediaWidth,
384
- isContentLocked,
385
387
  } }
386
388
  />
387
389
  { mediaPosition !== 'right' && <div { ...innerBlocksProps } /> }
@@ -109,7 +109,7 @@ function MediaContainer( props, ref ) {
109
109
  mediaWidth,
110
110
  onSelectMedia,
111
111
  onWidthChange,
112
- isContentLocked,
112
+ enableResize,
113
113
  } = props;
114
114
 
115
115
  const isTemporaryMedia = ! mediaId && isBlobURL( mediaUrl );
@@ -128,8 +128,8 @@ function MediaContainer( props, ref ) {
128
128
  commitWidthChange( parseInt( elt.style.width ) );
129
129
  };
130
130
  const enablePositions = {
131
- right: ! isContentLocked && mediaPosition === 'left',
132
- left: ! isContentLocked && mediaPosition === 'right',
131
+ right: enableResize && mediaPosition === 'left',
132
+ left: enableResize && mediaPosition === 'right',
133
133
  };
134
134
 
135
135
  const backgroundStyles =
@@ -2,7 +2,6 @@
2
2
  * External dependencies
3
3
  */
4
4
  import classnames from 'classnames';
5
- import { isEmpty } from 'lodash';
6
5
 
7
6
  /**
8
7
  * WordPress dependencies
@@ -36,7 +35,7 @@ export default function save( { attributes } ) {
36
35
  rel,
37
36
  } = attributes;
38
37
  const mediaSizeSlug = attributes.mediaSizeSlug || DEFAULT_MEDIA_SIZE_SLUG;
39
- const newRel = isEmpty( rel ) ? undefined : rel;
38
+ const newRel = ! rel ? undefined : rel;
40
39
 
41
40
  const imageClasses = classnames( {
42
41
  [ `wp-image-${ mediaId }` ]: mediaId && mediaType === 'image',
@@ -14,3 +14,8 @@ export const ALLOWED_BLOCKS = [
14
14
  'core/navigation-submenu',
15
15
  'core/loginout',
16
16
  ];
17
+
18
+ export const PRIORITIZED_INSERTER_BLOCKS = [
19
+ 'core/navigation-link/page',
20
+ 'core/navigation-link',
21
+ ];
@@ -14,7 +14,11 @@ import { useMemo } from '@wordpress/element';
14
14
  * Internal dependencies
15
15
  */
16
16
  import PlaceholderPreview from './placeholder/placeholder-preview';
17
- import { DEFAULT_BLOCK, ALLOWED_BLOCKS } from '../constants';
17
+ import {
18
+ DEFAULT_BLOCK,
19
+ ALLOWED_BLOCKS,
20
+ PRIORITIZED_INSERTER_BLOCKS,
21
+ } from '../constants';
18
22
 
19
23
  export default function NavigationInnerBlocks( {
20
24
  clientId,
@@ -93,6 +97,7 @@ export default function NavigationInnerBlocks( {
93
97
  onInput,
94
98
  onChange,
95
99
  allowedBlocks: ALLOWED_BLOCKS,
100
+ prioritizedInserterBlocks: PRIORITIZED_INSERTER_BLOCKS,
96
101
  __experimentalDefaultBlock: DEFAULT_BLOCK,
97
102
  __experimentalDirectInsert: shouldDirectInsert,
98
103
  orientation,