@wordpress/block-library 10.4.0 → 10.5.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 (239) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/build/accordion/view.cjs +2 -5
  3. package/build/accordion/view.cjs.map +2 -2
  4. package/build/accordion-heading/block.json +1 -0
  5. package/build/audio/edit.cjs.map +2 -2
  6. package/build/avatar/edit.cjs.map +2 -2
  7. package/build/block/block.json +2 -1
  8. package/build/column/edit.cjs +1 -1
  9. package/build/column/edit.cjs.map +2 -2
  10. package/build/columns/edit.cjs.map +2 -2
  11. package/build/columns/transforms.cjs +161 -2
  12. package/build/columns/transforms.cjs.map +2 -2
  13. package/build/cover/edit/block-controls.cjs +1 -1
  14. package/build/cover/edit/block-controls.cjs.map +2 -2
  15. package/build/cover/edit/index.cjs +1 -1
  16. package/build/cover/edit/index.cjs.map +2 -2
  17. package/build/cover/edit/inspector-controls.cjs.map +3 -3
  18. package/build/embed/embed-placeholder.cjs.map +2 -2
  19. package/build/gallery/transforms.cjs +8 -0
  20. package/build/gallery/transforms.cjs.map +2 -2
  21. package/build/group/block.json +1 -1
  22. package/build/heading/transforms.cjs +36 -0
  23. package/build/heading/transforms.cjs.map +2 -2
  24. package/build/heading/variations.cjs +13 -1
  25. package/build/heading/variations.cjs.map +2 -2
  26. package/build/home-link/edit.cjs.map +3 -3
  27. package/build/icon/edit.cjs +7 -1
  28. package/build/icon/edit.cjs.map +2 -2
  29. package/build/image/image.cjs +1 -1
  30. package/build/image/image.cjs.map +3 -3
  31. package/build/list/block.json +1 -0
  32. package/build/math/edit.cjs +4 -5
  33. package/build/math/edit.cjs.map +3 -3
  34. package/build/media-text/edit.cjs.map +3 -3
  35. package/build/more/block.json +1 -1
  36. package/build/navigation-link/shared/controls.cjs.map +3 -3
  37. package/build/playlist/block.json +0 -1
  38. package/build/playlist/edit.cjs +46 -22
  39. package/build/playlist/edit.cjs.map +2 -2
  40. package/build/playlist-track/block.json +16 -8
  41. package/build/playlist-track/edit.cjs +74 -67
  42. package/build/playlist-track/edit.cjs.map +3 -3
  43. package/build/post-template/edit.cjs +5 -1
  44. package/build/post-template/edit.cjs.map +2 -2
  45. package/build/post-title/edit.cjs +3 -8
  46. package/build/post-title/edit.cjs.map +2 -2
  47. package/build/private-apis.cjs +0 -12
  48. package/build/private-apis.cjs.map +3 -3
  49. package/build/query/block.json +3 -0
  50. package/build/query-no-results/block.json +16 -1
  51. package/build/rss/edit.cjs.map +2 -2
  52. package/build/site-logo/edit.cjs +1 -1
  53. package/build/site-logo/edit.cjs.map +2 -2
  54. package/build/site-title/edit.cjs +2 -6
  55. package/build/site-title/edit.cjs.map +2 -2
  56. package/build/table-of-contents/block.json +2 -1
  57. package/build/table-of-contents/deprecated.cjs +165 -0
  58. package/build/table-of-contents/deprecated.cjs.map +7 -0
  59. package/build/table-of-contents/index.cjs +2 -2
  60. package/build/table-of-contents/index.cjs.map +3 -3
  61. package/build/tabs/view.cjs +32 -2
  62. package/build/tabs/view.cjs.map +2 -2
  63. package/build/term-template/edit.cjs +5 -1
  64. package/build/term-template/edit.cjs.map +2 -2
  65. package/build-module/accordion/view.mjs +2 -5
  66. package/build-module/accordion/view.mjs.map +2 -2
  67. package/build-module/accordion-heading/block.json +1 -0
  68. package/build-module/audio/edit.mjs.map +2 -2
  69. package/build-module/avatar/edit.mjs.map +2 -2
  70. package/build-module/block/block.json +2 -1
  71. package/build-module/column/edit.mjs +1 -1
  72. package/build-module/column/edit.mjs.map +2 -2
  73. package/build-module/columns/edit.mjs.map +2 -2
  74. package/build-module/columns/transforms.mjs +164 -3
  75. package/build-module/columns/transforms.mjs.map +2 -2
  76. package/build-module/cover/edit/block-controls.mjs +1 -1
  77. package/build-module/cover/edit/block-controls.mjs.map +2 -2
  78. package/build-module/cover/edit/index.mjs +1 -1
  79. package/build-module/cover/edit/index.mjs.map +2 -2
  80. package/build-module/cover/edit/inspector-controls.mjs +2 -2
  81. package/build-module/cover/edit/inspector-controls.mjs.map +2 -2
  82. package/build-module/embed/embed-placeholder.mjs +2 -2
  83. package/build-module/embed/embed-placeholder.mjs.map +1 -1
  84. package/build-module/gallery/transforms.mjs +8 -0
  85. package/build-module/gallery/transforms.mjs.map +2 -2
  86. package/build-module/group/block.json +1 -1
  87. package/build-module/heading/transforms.mjs +36 -0
  88. package/build-module/heading/transforms.mjs.map +2 -2
  89. package/build-module/heading/variations.mjs +13 -1
  90. package/build-module/heading/variations.mjs.map +2 -2
  91. package/build-module/home-link/edit.mjs +2 -2
  92. package/build-module/home-link/edit.mjs.map +2 -2
  93. package/build-module/icon/edit.mjs +7 -1
  94. package/build-module/icon/edit.mjs.map +2 -2
  95. package/build-module/image/image.mjs +4 -4
  96. package/build-module/image/image.mjs.map +2 -2
  97. package/build-module/list/block.json +1 -0
  98. package/build-module/math/edit.mjs +4 -8
  99. package/build-module/math/edit.mjs.map +2 -2
  100. package/build-module/media-text/edit.mjs +2 -2
  101. package/build-module/media-text/edit.mjs.map +2 -2
  102. package/build-module/more/block.json +1 -1
  103. package/build-module/navigation-link/shared/controls.mjs +2 -2
  104. package/build-module/navigation-link/shared/controls.mjs.map +2 -2
  105. package/build-module/playlist/block.json +0 -1
  106. package/build-module/playlist/edit.mjs +46 -22
  107. package/build-module/playlist/edit.mjs.map +2 -2
  108. package/build-module/playlist-track/block.json +16 -8
  109. package/build-module/playlist-track/edit.mjs +76 -69
  110. package/build-module/playlist-track/edit.mjs.map +2 -2
  111. package/build-module/post-template/edit.mjs +5 -1
  112. package/build-module/post-template/edit.mjs.map +2 -2
  113. package/build-module/post-title/edit.mjs +3 -8
  114. package/build-module/post-title/edit.mjs.map +2 -2
  115. package/build-module/private-apis.mjs +0 -2
  116. package/build-module/private-apis.mjs.map +2 -2
  117. package/build-module/query/block.json +3 -0
  118. package/build-module/query-no-results/block.json +16 -1
  119. package/build-module/rss/edit.mjs +2 -2
  120. package/build-module/rss/edit.mjs.map +1 -1
  121. package/build-module/site-logo/edit.mjs +1 -1
  122. package/build-module/site-logo/edit.mjs.map +2 -2
  123. package/build-module/site-title/edit.mjs +2 -6
  124. package/build-module/site-title/edit.mjs.map +2 -2
  125. package/build-module/table-of-contents/block.json +2 -1
  126. package/build-module/table-of-contents/deprecated.mjs +144 -0
  127. package/build-module/table-of-contents/deprecated.mjs.map +7 -0
  128. package/build-module/table-of-contents/index.mjs +2 -2
  129. package/build-module/table-of-contents/index.mjs.map +2 -2
  130. package/build-module/tabs/view.mjs +32 -2
  131. package/build-module/tabs/view.mjs.map +2 -2
  132. package/build-module/term-template/edit.mjs +5 -1
  133. package/build-module/term-template/edit.mjs.map +2 -2
  134. package/build-style/categories/style-rtl.css +2 -1
  135. package/build-style/categories/style.css +2 -1
  136. package/build-style/comments/editor-rtl.css +8 -10
  137. package/build-style/comments/editor.css +8 -10
  138. package/build-style/comments/style-rtl.css +8 -7
  139. package/build-style/comments/style.css +8 -7
  140. package/build-style/editor-rtl.css +8 -10
  141. package/build-style/editor.css +8 -10
  142. package/build-style/form-input/style-rtl.css +7 -7
  143. package/build-style/form-input/style.css +7 -7
  144. package/build-style/post-comments-form/style-rtl.css +7 -6
  145. package/build-style/post-comments-form/style.css +7 -6
  146. package/build-style/query-no-results/style-rtl.css +3 -0
  147. package/build-style/query-no-results/style.css +3 -0
  148. package/build-style/search/style-rtl.css +1 -1
  149. package/build-style/search/style.css +1 -1
  150. package/build-style/search/theme-rtl.css +1 -1
  151. package/build-style/search/theme.css +1 -1
  152. package/build-style/style-rtl.css +34 -23
  153. package/build-style/style.css +34 -23
  154. package/build-style/tab-panel/style-rtl.css +5 -1
  155. package/build-style/tab-panel/style.css +5 -1
  156. package/build-style/theme-rtl.css +1 -1
  157. package/build-style/theme.css +1 -1
  158. package/package.json +43 -43
  159. package/src/accordion/view.js +2 -5
  160. package/src/accordion-heading/README.md +1 -0
  161. package/src/accordion-heading/block.json +1 -0
  162. package/src/audio/edit.js +13 -0
  163. package/src/avatar/edit.js +78 -0
  164. package/src/block/README.md +1 -0
  165. package/src/block/block.json +2 -1
  166. package/src/categories/style.scss +4 -4
  167. package/src/column/edit.js +15 -1
  168. package/src/columns/edit.js +18 -0
  169. package/src/columns/test/transforms.js +517 -1
  170. package/src/columns/transforms.js +207 -2
  171. package/src/comments/style.scss +7 -10
  172. package/src/cover/edit/block-controls.js +1 -1
  173. package/src/cover/edit/index.js +1 -1
  174. package/src/cover/edit/inspector-controls.js +2 -2
  175. package/src/embed/embed-placeholder.js +2 -2
  176. package/src/form-input/style.scss +2 -2
  177. package/src/gallery/test/edit.js +57 -0
  178. package/src/gallery/test/transforms.js +57 -0
  179. package/src/gallery/transforms.js +8 -0
  180. package/src/group/README.md +1 -1
  181. package/src/group/block.json +1 -1
  182. package/src/heading/transforms.js +36 -0
  183. package/src/heading/variations.js +12 -0
  184. package/src/home-link/edit.js +2 -2
  185. package/src/icon/edit.js +9 -1
  186. package/src/image/image.js +4 -4
  187. package/src/list/README.md +1 -0
  188. package/src/list/block.json +1 -0
  189. package/src/math/edit.js +4 -9
  190. package/src/media-text/edit.js +2 -2
  191. package/src/more/README.md +1 -1
  192. package/src/more/block.json +1 -1
  193. package/src/navigation/index.php +8 -2
  194. package/src/navigation-link/shared/controls.js +2 -2
  195. package/src/playlist/block.json +0 -1
  196. package/src/playlist/edit.js +54 -21
  197. package/src/playlist/test/edit-component.js +78 -27
  198. package/src/playlist-track/README.md +8 -8
  199. package/src/playlist-track/block.json +16 -8
  200. package/src/playlist-track/edit.js +56 -27
  201. package/src/playlist-track/test/edit.js +145 -41
  202. package/src/post-comments-form/style.scss +7 -9
  203. package/src/post-template/edit.js +10 -1
  204. package/src/post-title/edit.js +2 -9
  205. package/src/private-apis.js +0 -2
  206. package/src/query/README.md +2 -0
  207. package/src/query/block.json +3 -0
  208. package/src/query-no-results/README.md +3 -0
  209. package/src/query-no-results/block.json +16 -1
  210. package/src/query-no-results/style.scss +5 -0
  211. package/src/rss/edit.js +2 -2
  212. package/src/search/style.scss +1 -1
  213. package/src/search/theme.scss +2 -4
  214. package/src/site-logo/edit.js +1 -1
  215. package/src/site-title/edit.js +1 -10
  216. package/src/social-link/index.php +6 -13
  217. package/src/style.scss +1 -0
  218. package/src/tab-panel/index.php +14 -5
  219. package/src/tab-panel/style.scss +7 -1
  220. package/src/table-of-contents/README.md +6 -6
  221. package/src/table-of-contents/block.json +2 -1
  222. package/src/table-of-contents/deprecated.js +173 -0
  223. package/src/table-of-contents/index.js +2 -2
  224. package/src/table-of-contents/index.php +16 -3
  225. package/src/tabs/index.php +5 -5
  226. package/src/tabs/view.js +32 -2
  227. package/src/term-description/index.php +1 -1
  228. package/src/term-template/edit.js +10 -1
  229. package/src/utils/test/waveform-player-dependency.js +0 -74
  230. package/build/block-keyboard-shortcuts/index.cjs +0 -131
  231. package/build/block-keyboard-shortcuts/index.cjs.map +0 -7
  232. package/build/table-of-contents/save.cjs +0 -55
  233. package/build/table-of-contents/save.cjs.map +0 -7
  234. package/build-module/block-keyboard-shortcuts/index.mjs +0 -113
  235. package/build-module/block-keyboard-shortcuts/index.mjs.map +0 -7
  236. package/build-module/table-of-contents/save.mjs +0 -24
  237. package/build-module/table-of-contents/save.mjs.map +0 -7
  238. package/src/block-keyboard-shortcuts/index.js +0 -135
  239. package/src/table-of-contents/save.js +0 -22
@@ -87,7 +87,7 @@ describe( 'transforms', () => {
87
87
  } );
88
88
  expect( transformedBlocks[ 0 ].innerBlocks[ 1 ] ).toMatchObject( {
89
89
  name: 'core/group',
90
- attributes: { layout: { type: 'constrained' } },
90
+ attributes: { layout: { type: 'default' } },
91
91
  innerBlocks: [
92
92
  expect.objectContaining( {
93
93
  name: 'core/paragraph',
@@ -101,6 +101,522 @@ describe( 'transforms', () => {
101
101
  } );
102
102
  } );
103
103
 
104
+ it( "preserves each Column block's styles when transforming Columns to Grid", () => {
105
+ const block = createBlock( 'core/columns', {}, [
106
+ createBlock(
107
+ 'core/column',
108
+ { style: { color: { background: '#123456' } } },
109
+ [ createBlock( 'core/paragraph', { content: 'One' } ) ]
110
+ ),
111
+ createBlock(
112
+ 'core/column',
113
+ { style: { spacing: { padding: { top: '10px' } } } },
114
+ [
115
+ createBlock( 'core/paragraph', { content: 'Two' } ),
116
+ createBlock( 'core/paragraph', { content: 'Three' } ),
117
+ ]
118
+ ),
119
+ ] );
120
+
121
+ const transformedBlocks = switchToBlockType(
122
+ block,
123
+ 'core/group',
124
+ 'group-grid'
125
+ );
126
+
127
+ expect(
128
+ transformedBlocks[ 0 ].innerBlocks.map( ( innerBlock ) => ( {
129
+ name: innerBlock.name,
130
+ style: innerBlock.attributes.style,
131
+ } ) )
132
+ ).toEqual( [
133
+ {
134
+ name: 'core/group',
135
+ style: { color: { background: '#123456' } },
136
+ },
137
+ {
138
+ name: 'core/group',
139
+ style: { spacing: { padding: { top: '10px' } } },
140
+ },
141
+ ] );
142
+ } );
143
+
144
+ it( 'transforms Columns to the Row variation of Group with one child for each column', () => {
145
+ const block = createBlock(
146
+ 'core/columns',
147
+ {
148
+ align: 'wide',
149
+ isStackedOnMobile: true,
150
+ verticalAlignment: 'center',
151
+ },
152
+ [
153
+ createBlock( 'core/column', {}, [
154
+ createBlock( 'core/paragraph', { content: 'One' } ),
155
+ ] ),
156
+ createBlock( 'core/column', {}, [
157
+ createBlock( 'core/paragraph', { content: 'Two' } ),
158
+ createBlock( 'core/paragraph', { content: 'Three' } ),
159
+ ] ),
160
+ createBlock( 'core/column' ),
161
+ ]
162
+ );
163
+
164
+ const transformedBlocks = switchToBlockType(
165
+ block,
166
+ 'core/group',
167
+ 'group-row'
168
+ );
169
+
170
+ expect( transformedBlocks[ 0 ] ).toMatchObject( {
171
+ name: 'core/group',
172
+ attributes: {
173
+ align: 'wide',
174
+ layout: {
175
+ type: 'flex',
176
+ flexWrap: 'nowrap',
177
+ verticalAlignment: 'center',
178
+ },
179
+ },
180
+ } );
181
+ expect( transformedBlocks[ 0 ].attributes ).not.toHaveProperty(
182
+ 'isStackedOnMobile'
183
+ );
184
+ expect( transformedBlocks[ 0 ].attributes ).not.toHaveProperty(
185
+ 'verticalAlignment'
186
+ );
187
+ expect( transformedBlocks[ 0 ].innerBlocks ).toHaveLength( 3 );
188
+ expect( transformedBlocks[ 0 ].innerBlocks[ 0 ] ).toMatchObject( {
189
+ name: 'core/paragraph',
190
+ attributes: { content: 'One' },
191
+ } );
192
+ expect( transformedBlocks[ 0 ].innerBlocks[ 1 ] ).toMatchObject( {
193
+ name: 'core/group',
194
+ attributes: { layout: { type: 'default' } },
195
+ innerBlocks: [
196
+ expect.objectContaining( {
197
+ name: 'core/paragraph',
198
+ attributes: { content: 'Two' },
199
+ } ),
200
+ expect.objectContaining( {
201
+ name: 'core/paragraph',
202
+ attributes: { content: 'Three' },
203
+ } ),
204
+ ],
205
+ } );
206
+ expect( transformedBlocks[ 0 ].innerBlocks[ 2 ] ).toMatchObject( {
207
+ name: 'core/group',
208
+ attributes: { layout: { type: 'default' } },
209
+ innerBlocks: [],
210
+ } );
211
+ } );
212
+
213
+ it( "preserves each Column block's styles when transforming Columns to Row", () => {
214
+ const block = createBlock( 'core/columns', {}, [
215
+ createBlock(
216
+ 'core/column',
217
+ {
218
+ width: '320px',
219
+ style: {
220
+ color: { background: '#123456' },
221
+ layout: { columnSpan: 2 },
222
+ },
223
+ },
224
+ [ createBlock( 'core/paragraph', { content: 'One' } ) ]
225
+ ),
226
+ createBlock(
227
+ 'core/column',
228
+ {
229
+ width: '50%',
230
+ style: { spacing: { padding: { top: '10px' } } },
231
+ },
232
+ [
233
+ createBlock( 'core/paragraph', { content: 'Two' } ),
234
+ createBlock( 'core/paragraph', { content: 'Three' } ),
235
+ ]
236
+ ),
237
+ ] );
238
+
239
+ const transformedBlocks = switchToBlockType(
240
+ block,
241
+ 'core/group',
242
+ 'group-row'
243
+ );
244
+
245
+ expect(
246
+ transformedBlocks[ 0 ].innerBlocks.map( ( innerBlock ) => ( {
247
+ name: innerBlock.name,
248
+ style: innerBlock.attributes.style,
249
+ } ) )
250
+ ).toEqual( [
251
+ {
252
+ name: 'core/group',
253
+ style: {
254
+ color: { background: '#123456' },
255
+ layout: {
256
+ columnSpan: 2,
257
+ selfStretch: 'fixed',
258
+ flexSize: '320px',
259
+ },
260
+ },
261
+ },
262
+ {
263
+ name: 'core/group',
264
+ style: {
265
+ spacing: { padding: { top: '10px' } },
266
+ layout: {
267
+ selfStretch: 'fixed',
268
+ flexSize: '50%',
269
+ },
270
+ },
271
+ },
272
+ ] );
273
+ } );
274
+
275
+ it.each( [
276
+ [ 'Grid', 'group-grid' ],
277
+ [ 'Row', 'group-row' ],
278
+ ] )(
279
+ "preserves each Column block's layout attributes when transforming Columns to %s",
280
+ ( _variationTitle, variationName ) => {
281
+ const columnLayouts = [
282
+ {
283
+ type: 'constrained',
284
+ contentSize: '640px',
285
+ wideSize: '1200px',
286
+ },
287
+ {
288
+ type: 'flex',
289
+ orientation: 'vertical',
290
+ justifyContent: 'center',
291
+ },
292
+ ];
293
+ const block = createBlock(
294
+ 'core/columns',
295
+ {},
296
+ columnLayouts.map( ( layout ) =>
297
+ createBlock( 'core/column', { layout }, [
298
+ createBlock( 'core/paragraph' ),
299
+ ] )
300
+ )
301
+ );
302
+
303
+ const transformedBlocks = switchToBlockType(
304
+ block,
305
+ 'core/group',
306
+ variationName
307
+ );
308
+
309
+ expect(
310
+ transformedBlocks[ 0 ].innerBlocks.map( ( innerBlock ) => ( {
311
+ name: innerBlock.name,
312
+ layout: innerBlock.attributes.layout,
313
+ } ) )
314
+ ).toEqual(
315
+ columnLayouts.map( ( layout ) => ( {
316
+ name: 'core/group',
317
+ layout,
318
+ } ) )
319
+ );
320
+ }
321
+ );
322
+
323
+ it.each( [
324
+ [ 'Grid', 'group-grid' ],
325
+ [ 'Row', 'group-row' ],
326
+ ] )(
327
+ 'transforms an implicitly flow-layout Column to a flow Group in %s',
328
+ ( _variationTitle, variationName ) => {
329
+ const block = createBlock( 'core/columns', {}, [
330
+ createBlock( 'core/column', {}, [
331
+ createBlock( 'core/paragraph', { content: 'One' } ),
332
+ createBlock( 'core/paragraph', { content: 'Two' } ),
333
+ ] ),
334
+ ] );
335
+
336
+ const transformedBlocks = switchToBlockType(
337
+ block,
338
+ 'core/group',
339
+ variationName
340
+ );
341
+
342
+ expect( transformedBlocks[ 0 ].innerBlocks[ 0 ] ).toMatchObject( {
343
+ name: 'core/group',
344
+ attributes: { layout: { type: 'default' } },
345
+ } );
346
+ }
347
+ );
348
+
349
+ it.each( [
350
+ [ 'Grid', 'group-grid' ],
351
+ [ 'Row', 'group-row' ],
352
+ ] )(
353
+ 'preserves root-level style attributes when transforming Columns to %s',
354
+ ( _variationTitle, variationName ) => {
355
+ const rootStyleAttributes = {
356
+ backgroundColor: 'primary',
357
+ borderColor: 'accent',
358
+ className: 'is-style-example custom-class',
359
+ fontFamily: 'heading',
360
+ fontSize: 'large',
361
+ gradient: 'vivid-cyan-blue-to-vivid-purple',
362
+ textColor: 'contrast',
363
+ };
364
+ const block = createBlock( 'core/columns', {}, [
365
+ createBlock( 'core/column', rootStyleAttributes, [
366
+ createBlock( 'core/paragraph' ),
367
+ ] ),
368
+ ] );
369
+
370
+ const transformedBlocks = switchToBlockType(
371
+ block,
372
+ 'core/group',
373
+ variationName
374
+ );
375
+
376
+ expect( transformedBlocks[ 0 ].innerBlocks[ 0 ] ).toMatchObject( {
377
+ name: 'core/group',
378
+ attributes: rootStyleAttributes,
379
+ } );
380
+ }
381
+ );
382
+
383
+ it.each( [
384
+ [ 'Grid', 'group-grid' ],
385
+ [ 'Row', 'group-row' ],
386
+ ] )(
387
+ 'preserves Group-supported Column attributes when transforming Columns to %s',
388
+ ( _variationTitle, variationName ) => {
389
+ const block = createBlock( 'core/columns', {}, [
390
+ createBlock(
391
+ 'core/column',
392
+ {
393
+ anchor: 'column-anchor',
394
+ lock: { move: true, remove: true },
395
+ templateLock: 'insert',
396
+ verticalAlignment: 'center',
397
+ width: '320px',
398
+ },
399
+ [ createBlock( 'core/paragraph' ) ]
400
+ ),
401
+ ] );
402
+
403
+ const transformedBlocks = switchToBlockType(
404
+ block,
405
+ 'core/group',
406
+ variationName
407
+ );
408
+ const transformedColumn = transformedBlocks[ 0 ].innerBlocks[ 0 ];
409
+
410
+ expect( transformedColumn ).toMatchObject( {
411
+ name: 'core/group',
412
+ attributes: {
413
+ anchor: 'column-anchor',
414
+ lock: { move: true, remove: true },
415
+ templateLock: 'insert',
416
+ },
417
+ } );
418
+ expect( transformedColumn.attributes ).not.toHaveProperty(
419
+ 'verticalAlignment'
420
+ );
421
+ expect( transformedColumn.attributes ).not.toHaveProperty(
422
+ 'width'
423
+ );
424
+ }
425
+ );
426
+
427
+ it( 'migrates Column widths to Row child sizing controls', () => {
428
+ const block = createBlock( 'core/columns', {}, [
429
+ createBlock( 'core/column', { width: '320px' }, [
430
+ createBlock( 'core/paragraph', {
431
+ content: 'One',
432
+ style: {
433
+ color: { text: '#123456' },
434
+ layout: { columnSpan: 2 },
435
+ },
436
+ } ),
437
+ ] ),
438
+ createBlock( 'core/column', { width: '50%' }, [
439
+ createBlock( 'core/paragraph', { content: 'Two' } ),
440
+ ] ),
441
+ createBlock( 'core/column', {}, [
442
+ createBlock( 'core/paragraph', { content: 'Three' } ),
443
+ ] ),
444
+ ] );
445
+
446
+ const transformedBlocks = switchToBlockType(
447
+ block,
448
+ 'core/group',
449
+ 'group-row'
450
+ );
451
+
452
+ expect(
453
+ transformedBlocks[ 0 ].innerBlocks.map(
454
+ ( innerBlock ) => innerBlock.attributes.style.layout
455
+ )
456
+ ).toEqual( [
457
+ {
458
+ columnSpan: 2,
459
+ selfStretch: 'fixed',
460
+ flexSize: '320px',
461
+ },
462
+ { selfStretch: 'fixed', flexSize: '50%' },
463
+ { selfStretch: 'fill' },
464
+ ] );
465
+ expect(
466
+ transformedBlocks[ 0 ].innerBlocks[ 0 ].attributes.style.color
467
+ ).toEqual( { text: '#123456' } );
468
+ } );
469
+
470
+ it( 'sets equal fixed widths when no Column widths are set', () => {
471
+ const block = createBlock( 'core/columns', {}, [
472
+ createBlock( 'core/column', {}, [
473
+ createBlock( 'core/paragraph', { content: 'One' } ),
474
+ ] ),
475
+ createBlock( 'core/column', {}, [
476
+ createBlock( 'core/paragraph', { content: 'Two' } ),
477
+ ] ),
478
+ createBlock( 'core/column', {}, [
479
+ createBlock( 'core/paragraph', { content: 'Three' } ),
480
+ ] ),
481
+ ] );
482
+
483
+ const transformedBlocks = switchToBlockType(
484
+ block,
485
+ 'core/group',
486
+ 'group-row'
487
+ );
488
+
489
+ expect(
490
+ transformedBlocks[ 0 ].innerBlocks.map(
491
+ ( innerBlock ) => innerBlock.attributes.style.layout
492
+ )
493
+ ).toEqual( [
494
+ { selfStretch: 'fixed', flexSize: '33.33%' },
495
+ { selfStretch: 'fixed', flexSize: '33.33%' },
496
+ { selfStretch: 'fixed', flexSize: '33.33%' },
497
+ ] );
498
+ } );
499
+
500
+ it( 'transforms the Row variation of Group to Columns with one Column per Row child', () => {
501
+ const block = createBlock(
502
+ 'core/group',
503
+ {
504
+ align: 'wide',
505
+ layout: {
506
+ type: 'flex',
507
+ flexWrap: 'nowrap',
508
+ verticalAlignment: 'center',
509
+ },
510
+ },
511
+ [
512
+ createBlock( 'core/paragraph', { content: 'One' } ),
513
+ createBlock(
514
+ 'core/group',
515
+ { layout: { type: 'constrained' } },
516
+ [
517
+ createBlock( 'core/paragraph', { content: 'Two' } ),
518
+ createBlock( 'core/paragraph', { content: 'Three' } ),
519
+ ]
520
+ ),
521
+ ]
522
+ );
523
+
524
+ const transformedBlocks = switchToBlockType( block, 'core/columns' );
525
+
526
+ expect( transformedBlocks[ 0 ] ).toMatchObject( {
527
+ name: 'core/columns',
528
+ attributes: {
529
+ align: 'wide',
530
+ verticalAlignment: 'center',
531
+ },
532
+ } );
533
+ expect( transformedBlocks[ 0 ].attributes ).not.toHaveProperty(
534
+ 'layout'
535
+ );
536
+ expect( transformedBlocks[ 0 ].innerBlocks ).toHaveLength( 2 );
537
+ expect( transformedBlocks[ 0 ].innerBlocks[ 0 ] ).toMatchObject( {
538
+ name: 'core/column',
539
+ innerBlocks: [
540
+ {
541
+ name: 'core/paragraph',
542
+ attributes: { content: 'One' },
543
+ },
544
+ ],
545
+ } );
546
+ expect( transformedBlocks[ 0 ].innerBlocks[ 1 ] ).toMatchObject( {
547
+ name: 'core/column',
548
+ innerBlocks: [
549
+ {
550
+ name: 'core/group',
551
+ attributes: { layout: { type: 'constrained' } },
552
+ innerBlocks: [
553
+ { attributes: { content: 'Two' } },
554
+ { attributes: { content: 'Three' } },
555
+ ],
556
+ },
557
+ ],
558
+ } );
559
+ } );
560
+
561
+ it( 'migrates fixed Row child sizes to Column widths', () => {
562
+ const block = createBlock(
563
+ 'core/group',
564
+ { layout: { type: 'flex', flexWrap: 'nowrap' } },
565
+ [
566
+ createBlock( 'core/paragraph', {
567
+ content: 'One',
568
+ style: {
569
+ color: { text: '#123456' },
570
+ layout: {
571
+ columnSpan: 2,
572
+ selfStretch: 'fixed',
573
+ flexSize: '320px',
574
+ },
575
+ },
576
+ } ),
577
+ createBlock( 'core/paragraph', {
578
+ content: 'Two',
579
+ style: {
580
+ layout: {
581
+ selfStretch: 'fixedNoShrink',
582
+ flexSize: '50%',
583
+ },
584
+ },
585
+ } ),
586
+ createBlock( 'core/paragraph', {
587
+ content: 'Three',
588
+ style: {
589
+ layout: {
590
+ selfStretch: 'fill',
591
+ flexSize: '25%',
592
+ },
593
+ },
594
+ } ),
595
+ ]
596
+ );
597
+
598
+ const transformedBlocks = switchToBlockType( block, 'core/columns' );
599
+
600
+ expect(
601
+ transformedBlocks[ 0 ].innerBlocks.map(
602
+ ( column ) => column.attributes.width
603
+ )
604
+ ).toEqual( [ '320px', '50%', undefined ] );
605
+ expect(
606
+ transformedBlocks[ 0 ].innerBlocks[ 0 ].innerBlocks[ 0 ].attributes
607
+ .style
608
+ ).toEqual( {
609
+ color: { text: '#123456' },
610
+ layout: { columnSpan: 2 },
611
+ } );
612
+ expect(
613
+ transformedBlocks[ 0 ].innerBlocks[ 1 ].innerBlocks[ 0 ].attributes
614
+ ).not.toHaveProperty( 'style' );
615
+ expect(
616
+ transformedBlocks[ 0 ].innerBlocks[ 2 ].innerBlocks[ 0 ].attributes
617
+ ).not.toHaveProperty( 'style' );
618
+ } );
619
+
104
620
  it( 'transforms Grid variation of Group to Columns using the explicit grid column count', () => {
105
621
  const block = createBlock(
106
622
  'core/group',