@wordpress/block-library 8.5.0 → 8.6.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 (287) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/buttons/edit.native.js +1 -1
  3. package/build/buttons/edit.native.js.map +1 -1
  4. package/build/columns/edit.js +10 -8
  5. package/build/columns/edit.js.map +1 -1
  6. package/build/columns/edit.native.js +1 -1
  7. package/build/columns/edit.native.js.map +1 -1
  8. package/build/comments/edit/placeholder.js +8 -5
  9. package/build/comments/edit/placeholder.js.map +1 -1
  10. package/build/cover/index.js +13 -4
  11. package/build/cover/index.js.map +1 -1
  12. package/build/cover/variations.js +29 -0
  13. package/build/cover/variations.js.map +1 -0
  14. package/build/embed/edit.js +13 -14
  15. package/build/embed/edit.js.map +1 -1
  16. package/build/embed/edit.native.js +18 -14
  17. package/build/embed/edit.native.js.map +1 -1
  18. package/build/embed/util.js +39 -12
  19. package/build/embed/util.js.map +1 -1
  20. package/build/gallery/edit.js +1 -0
  21. package/build/gallery/edit.js.map +1 -1
  22. package/build/latest-posts/edit.js +10 -10
  23. package/build/latest-posts/edit.js.map +1 -1
  24. package/build/latest-posts/edit.native.js +3 -3
  25. package/build/latest-posts/edit.native.js.map +1 -1
  26. package/build/media-text/constants.js +17 -1
  27. package/build/media-text/constants.js.map +1 -1
  28. package/build/media-text/edit.js +7 -19
  29. package/build/media-text/edit.js.map +1 -1
  30. package/build/media-text/edit.native.js +6 -5
  31. package/build/media-text/edit.native.js.map +1 -1
  32. package/build/media-text/transforms.js +32 -44
  33. package/build/media-text/transforms.js.map +1 -1
  34. package/build/navigation/edit/index.js +56 -86
  35. package/build/navigation/edit/index.js.map +1 -1
  36. package/build/navigation/edit/inner-blocks.js +4 -1
  37. package/build/navigation/edit/inner-blocks.js.map +1 -1
  38. package/build/navigation/edit/menu-inspector-controls.js +2 -5
  39. package/build/navigation/edit/menu-inspector-controls.js.map +1 -1
  40. package/build/navigation/edit/navigation-menu-selector.js +26 -22
  41. package/build/navigation/edit/navigation-menu-selector.js.map +1 -1
  42. package/build/navigation/edit/unsaved-inner-blocks.js +14 -1
  43. package/build/navigation/edit/unsaved-inner-blocks.js.map +1 -1
  44. package/build/navigation/edit/use-convert-classic-menu-to-block-menu.js +2 -4
  45. package/build/navigation/edit/use-convert-classic-menu-to-block-menu.js.map +1 -1
  46. package/build/navigation/edit/use-create-navigation-menu.js +1 -1
  47. package/build/navigation/edit/use-create-navigation-menu.js.map +1 -1
  48. package/build/navigation/edit/use-navigation-notice.js +1 -1
  49. package/build/navigation/edit/use-navigation-notice.js.map +1 -1
  50. package/build/navigation-link/edit.js +0 -11
  51. package/build/navigation-link/edit.js.map +1 -1
  52. package/build/navigation-link/link-ui.js +0 -1
  53. package/build/navigation-link/link-ui.js.map +1 -1
  54. package/build/navigation-submenu/edit.js +1 -13
  55. package/build/navigation-submenu/edit.js.map +1 -1
  56. package/build/page-list/edit.js +59 -45
  57. package/build/page-list/edit.js.map +1 -1
  58. package/build/page-list-item/edit.js +3 -2
  59. package/build/page-list-item/edit.js.map +1 -1
  60. package/build/post-content/edit.js +6 -1
  61. package/build/post-content/edit.js.map +1 -1
  62. package/build/post-featured-image/dimension-controls.js +0 -6
  63. package/build/post-featured-image/dimension-controls.js.map +1 -1
  64. package/build/post-featured-image/edit.js +1 -1
  65. package/build/post-featured-image/edit.js.map +1 -1
  66. package/build/pullquote/deprecated.js +3 -3
  67. package/build/pullquote/deprecated.js.map +1 -1
  68. package/build/query/edit/query-placeholder.js +3 -2
  69. package/build/query/edit/query-placeholder.js.map +1 -1
  70. package/build/query/utils.js +26 -9
  71. package/build/query/utils.js.map +1 -1
  72. package/build/table/state.js +12 -4
  73. package/build/table/state.js.map +1 -1
  74. package/build/template-part/edit/import-controls.js +4 -24
  75. package/build/template-part/edit/import-controls.js.map +1 -1
  76. package/build/template-part/edit/utils/transformers.js +69 -19
  77. package/build/template-part/edit/utils/transformers.js.map +1 -1
  78. package/build/text-columns/edit.js +3 -7
  79. package/build/text-columns/edit.js.map +1 -1
  80. package/build/text-columns/save.js +11 -13
  81. package/build/text-columns/save.js.map +1 -1
  82. package/build-module/buttons/edit.native.js +1 -1
  83. package/build-module/buttons/edit.native.js.map +1 -1
  84. package/build-module/columns/edit.js +10 -7
  85. package/build-module/columns/edit.js.map +1 -1
  86. package/build-module/columns/edit.native.js +1 -1
  87. package/build-module/columns/edit.native.js.map +1 -1
  88. package/build-module/comments/edit/placeholder.js +9 -5
  89. package/build-module/comments/edit/placeholder.js.map +1 -1
  90. package/build-module/cover/index.js +12 -4
  91. package/build-module/cover/index.js.map +1 -1
  92. package/build-module/cover/variations.js +19 -0
  93. package/build-module/cover/variations.js.map +1 -0
  94. package/build-module/embed/edit.js +14 -15
  95. package/build-module/embed/edit.js.map +1 -1
  96. package/build-module/embed/edit.native.js +19 -15
  97. package/build-module/embed/edit.native.js.map +1 -1
  98. package/build-module/embed/util.js +34 -10
  99. package/build-module/embed/util.js.map +1 -1
  100. package/build-module/gallery/edit.js +1 -0
  101. package/build-module/gallery/edit.js.map +1 -1
  102. package/build-module/latest-posts/edit.js +10 -9
  103. package/build-module/latest-posts/edit.js.map +1 -1
  104. package/build-module/latest-posts/edit.native.js +3 -3
  105. package/build-module/latest-posts/edit.native.js.map +1 -1
  106. package/build-module/media-text/constants.js +10 -0
  107. package/build-module/media-text/constants.js.map +1 -1
  108. package/build-module/media-text/edit.js +2 -14
  109. package/build-module/media-text/edit.js.map +1 -1
  110. package/build-module/media-text/edit.native.js +4 -3
  111. package/build-module/media-text/edit.native.js.map +1 -1
  112. package/build-module/media-text/transforms.js +32 -44
  113. package/build-module/media-text/transforms.js.map +1 -1
  114. package/build-module/navigation/edit/index.js +58 -88
  115. package/build-module/navigation/edit/index.js.map +1 -1
  116. package/build-module/navigation/edit/inner-blocks.js +4 -1
  117. package/build-module/navigation/edit/inner-blocks.js.map +1 -1
  118. package/build-module/navigation/edit/menu-inspector-controls.js +2 -5
  119. package/build-module/navigation/edit/menu-inspector-controls.js.map +1 -1
  120. package/build-module/navigation/edit/navigation-menu-selector.js +25 -22
  121. package/build-module/navigation/edit/navigation-menu-selector.js.map +1 -1
  122. package/build-module/navigation/edit/unsaved-inner-blocks.js +14 -1
  123. package/build-module/navigation/edit/unsaved-inner-blocks.js.map +1 -1
  124. package/build-module/navigation/edit/use-convert-classic-menu-to-block-menu.js +2 -4
  125. package/build-module/navigation/edit/use-convert-classic-menu-to-block-menu.js.map +1 -1
  126. package/build-module/navigation/edit/use-create-navigation-menu.js +1 -1
  127. package/build-module/navigation/edit/use-create-navigation-menu.js.map +1 -1
  128. package/build-module/navigation/edit/use-navigation-notice.js +1 -1
  129. package/build-module/navigation/edit/use-navigation-notice.js.map +1 -1
  130. package/build-module/navigation-link/edit.js +0 -11
  131. package/build-module/navigation-link/edit.js.map +1 -1
  132. package/build-module/navigation-link/link-ui.js +0 -1
  133. package/build-module/navigation-link/link-ui.js.map +1 -1
  134. package/build-module/navigation-submenu/edit.js +1 -13
  135. package/build-module/navigation-submenu/edit.js.map +1 -1
  136. package/build-module/page-list/edit.js +61 -47
  137. package/build-module/page-list/edit.js.map +1 -1
  138. package/build-module/page-list-item/edit.js +3 -2
  139. package/build-module/page-list-item/edit.js.map +1 -1
  140. package/build-module/post-content/edit.js +6 -1
  141. package/build-module/post-content/edit.js.map +1 -1
  142. package/build-module/post-featured-image/dimension-controls.js +0 -6
  143. package/build-module/post-featured-image/dimension-controls.js.map +1 -1
  144. package/build-module/post-featured-image/edit.js +1 -1
  145. package/build-module/post-featured-image/edit.js.map +1 -1
  146. package/build-module/pullquote/deprecated.js +3 -2
  147. package/build-module/pullquote/deprecated.js.map +1 -1
  148. package/build-module/query/edit/query-placeholder.js +4 -3
  149. package/build-module/query/edit/query-placeholder.js.map +1 -1
  150. package/build-module/query/utils.js +21 -6
  151. package/build-module/query/utils.js.map +1 -1
  152. package/build-module/table/state.js +13 -5
  153. package/build-module/table/state.js.map +1 -1
  154. package/build-module/template-part/edit/import-controls.js +4 -23
  155. package/build-module/template-part/edit/import-controls.js.map +1 -1
  156. package/build-module/template-part/edit/utils/transformers.js +69 -20
  157. package/build-module/template-part/edit/utils/transformers.js.map +1 -1
  158. package/build-module/text-columns/edit.js +3 -6
  159. package/build-module/text-columns/edit.js.map +1 -1
  160. package/build-module/text-columns/save.js +11 -12
  161. package/build-module/text-columns/save.js.map +1 -1
  162. package/build-style/cover/style-rtl.css +11 -5
  163. package/build-style/cover/style.css +11 -5
  164. package/build-style/editor-rtl.css +5 -1
  165. package/build-style/editor.css +5 -1
  166. package/build-style/navigation/editor-rtl.css +1 -1
  167. package/build-style/navigation/editor.css +1 -1
  168. package/build-style/page-list/editor-rtl.css +4 -0
  169. package/build-style/page-list/editor.css +4 -0
  170. package/build-style/post-featured-image/style-rtl.css +1 -0
  171. package/build-style/post-featured-image/style.css +1 -0
  172. package/build-style/style-rtl.css +12 -5
  173. package/build-style/style.css +12 -5
  174. package/package.json +31 -31
  175. package/src/audio/test/__snapshots__/edit.native.js.snap +44 -4
  176. package/src/audio/test/__snapshots__/transforms.native.js.snap +25 -0
  177. package/src/audio/test/transforms.native.js +42 -0
  178. package/src/block/test/__snapshots__/transforms.native.js.snap +15 -0
  179. package/src/block/test/transforms.native.js +40 -0
  180. package/src/buttons/edit.native.js +1 -1
  181. package/src/buttons/test/__snapshots__/transforms.native.js.snap +31 -0
  182. package/src/buttons/test/transforms.native.js +48 -0
  183. package/src/columns/edit.js +28 -17
  184. package/src/columns/edit.native.js +1 -1
  185. package/src/columns/test/__snapshots__/transforms.native.js.snap +61 -0
  186. package/src/columns/test/transforms.native.js +91 -0
  187. package/src/comment-template/index.php +1 -2
  188. package/src/comments/edit/placeholder.js +16 -4
  189. package/src/cover/block.json +9 -3
  190. package/src/cover/index.js +2 -0
  191. package/src/cover/style.scss +16 -7
  192. package/src/cover/test/__snapshots__/transforms.native.js.snap +73 -0
  193. package/src/cover/test/transforms.native.js +112 -0
  194. package/src/cover/variations.js +20 -0
  195. package/src/embed/edit.js +16 -12
  196. package/src/embed/edit.native.js +28 -18
  197. package/src/embed/test/__snapshots__/transforms.native.js.snap +23 -0
  198. package/src/embed/test/index.js +12 -0
  199. package/src/embed/test/transforms.native.js +44 -0
  200. package/src/embed/util.js +29 -8
  201. package/src/file/test/__snapshots__/edit.native.js.snap +18 -2
  202. package/src/file/test/__snapshots__/transforms.native.js.snap +19 -0
  203. package/src/file/test/transforms.native.js +42 -0
  204. package/src/freeform/test/__snapshots__/transforms.native.js.snap +19 -0
  205. package/src/freeform/test/transforms.native.js +39 -0
  206. package/src/gallery/edit.js +3 -0
  207. package/src/gallery/test/__snapshots__/transforms.native.js.snap +53 -0
  208. package/src/gallery/test/transforms.native.js +52 -0
  209. package/src/group/test/__snapshots__/transforms.native.js.snap +35 -0
  210. package/src/group/test/transforms.native.js +75 -0
  211. package/src/heading/test/__snapshots__/transforms.native.js.snap +47 -0
  212. package/src/heading/test/transforms.native.js +46 -0
  213. package/src/image/test/__snapshots__/transforms.native.js.snap +49 -0
  214. package/src/image/test/transforms.native.js +48 -0
  215. package/src/latest-posts/edit.js +11 -16
  216. package/src/latest-posts/edit.native.js +3 -3
  217. package/src/latest-posts/test/__snapshots__/transforms.native.js.snap +15 -0
  218. package/src/latest-posts/test/transforms.native.js +61 -0
  219. package/src/list/test/__snapshots__/transforms.native.js.snap +85 -0
  220. package/src/list/test/transforms.native.js +56 -0
  221. package/src/media-text/constants.js +16 -0
  222. package/src/media-text/edit.js +8 -18
  223. package/src/media-text/edit.native.js +3 -9
  224. package/src/media-text/test/__snapshots__/transforms.native.js.snap +73 -0
  225. package/src/media-text/test/transforms.native.js +112 -0
  226. package/src/media-text/transforms.js +24 -51
  227. package/src/missing/test/__snapshots__/edit.native.js.snap +20 -2
  228. package/src/more/test/__snapshots__/transforms.native.js.snap +19 -0
  229. package/src/more/test/transforms.native.js +42 -0
  230. package/src/navigation/edit/index.js +104 -107
  231. package/src/navigation/edit/inner-blocks.js +3 -0
  232. package/src/navigation/edit/menu-inspector-controls.js +2 -7
  233. package/src/navigation/edit/navigation-menu-selector.js +41 -25
  234. package/src/navigation/edit/unsaved-inner-blocks.js +46 -33
  235. package/src/navigation/edit/use-convert-classic-menu-to-block-menu.js +82 -83
  236. package/src/navigation/edit/use-create-navigation-menu.js +1 -1
  237. package/src/navigation/edit/use-navigation-notice.js +1 -1
  238. package/src/navigation/editor.scss +23 -20
  239. package/src/navigation/index.php +18 -39
  240. package/src/navigation-link/edit.js +0 -9
  241. package/src/navigation-link/index.php +5 -8
  242. package/src/navigation-link/link-ui.js +0 -1
  243. package/src/navigation-submenu/edit.js +0 -10
  244. package/src/navigation-submenu/index.php +23 -6
  245. package/src/nextpage/test/__snapshots__/transforms.native.js.snap +19 -0
  246. package/src/nextpage/test/transforms.native.js +42 -0
  247. package/src/page-list/edit.js +78 -44
  248. package/src/page-list/editor.scss +6 -0
  249. package/src/page-list-item/edit.js +2 -3
  250. package/src/paragraph/test/__snapshots__/transforms.native.js.snap +59 -0
  251. package/src/paragraph/test/transforms.native.js +50 -0
  252. package/src/post-content/edit.js +5 -1
  253. package/src/post-excerpt/index.php +1 -2
  254. package/src/post-featured-image/dimension-controls.js +0 -8
  255. package/src/post-featured-image/edit.js +1 -1
  256. package/src/post-featured-image/style.scss +1 -0
  257. package/src/preformatted/test/__snapshots__/transforms.native.js.snap +31 -0
  258. package/src/preformatted/test/transforms.native.js +42 -0
  259. package/src/pullquote/deprecated.js +2 -6
  260. package/src/pullquote/test/__snapshots__/transforms.native.js.snap +47 -0
  261. package/src/pullquote/test/transforms.native.js +46 -0
  262. package/src/query/edit/query-placeholder.js +10 -5
  263. package/src/query/test/utils.js +33 -1
  264. package/src/query/utils.js +19 -6
  265. package/src/quote/test/__snapshots__/transforms.native.js.snap +39 -0
  266. package/src/quote/test/transforms.native.js +67 -0
  267. package/src/search/test/__snapshots__/edit.native.js.snap +11 -1
  268. package/src/search/test/__snapshots__/transforms.native.js.snap +15 -0
  269. package/src/search/test/transforms.native.js +40 -0
  270. package/src/separator/test/__snapshots__/transforms.native.js.snap +19 -0
  271. package/src/separator/test/transforms.native.js +42 -0
  272. package/src/shortcode/test/__snapshots__/transforms.native.js.snap +19 -0
  273. package/src/shortcode/test/transforms.native.js +42 -0
  274. package/src/social-links/test/__snapshots__/transforms.native.js.snap +31 -0
  275. package/src/social-links/test/transforms.native.js +53 -0
  276. package/src/spacer/test/__snapshots__/transforms.native.js.snap +19 -0
  277. package/src/spacer/test/transforms.native.js +42 -0
  278. package/src/table/state.js +8 -17
  279. package/src/template-part/edit/import-controls.js +2 -29
  280. package/src/template-part/edit/utils/transformers.js +96 -19
  281. package/src/text-columns/edit.js +1 -6
  282. package/src/text-columns/save.js +1 -6
  283. package/src/verse/test/__snapshots__/transforms.native.js.snap +25 -0
  284. package/src/verse/test/transforms.native.js +42 -0
  285. package/src/video/test/__snapshots__/transforms.native.js.snap +41 -0
  286. package/src/video/test/transforms.native.js +48 -0
  287. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,112 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import {
5
+ getEditorHtml,
6
+ initializeEditor,
7
+ setupCoreBlocks,
8
+ transformBlock,
9
+ getBlockTransformOptions,
10
+ } from 'test/helpers';
11
+
12
+ const block = 'Cover';
13
+ const initialHtmlWithImage = `
14
+ <!-- wp:cover {"url":"https://cldup.com/cXyG__fTLN.jpg","id":890,"dimRatio":20,"overlayColor":"luminous-vivid-orange","focalPoint":{"x":"0.63","y":"0.83"},"minHeight":219} -->
15
+ <div class="wp-block-cover" style="min-height:219px"><span aria-hidden="true" class="wp-block-cover__background has-luminous-vivid-orange-background-color has-background-dim-20 has-background-dim"></span><img class="wp-block-cover__image-background wp-image-890" alt="" src="https://cldup.com/cXyG__fTLN.jpg" style="object-position:63% 83%" data-object-fit="cover" data-object-position="63% 83%"/><div class="wp-block-cover__inner-container"><!-- wp:paragraph {"align":"center","placeholder":"Write title…","className":"has-text-color has-very-light-gray-color","fontSize":"large"} -->
16
+ <p class="has-text-align-center has-text-color has-very-light-gray-color has-large-font-size">Cool cover</p>
17
+ <!-- /wp:paragraph --></div></div>
18
+ <!-- /wp:cover -->`;
19
+ const initialHtmlWithVideo = `
20
+ <!-- wp:cover {"url":"https://i.cloudup.com/YtZFJbuQCE.mov","id":891,"dimRatio":20,"overlayColor":"luminous-vivid-orange","backgroundType":"video","focalPoint":{"x":"0.63","y":"0.83"},"minHeight":219,"isDark":false} -->
21
+ <div class="wp-block-cover is-light" style="min-height:219px"><span aria-hidden="true" class="wp-block-cover__background has-luminous-vivid-orange-background-color has-background-dim-20 has-background-dim"></span><video class="wp-block-cover__video-background intrinsic-ignore" autoplay muted loop playsinline src="https://i.cloudup.com/YtZFJbuQCE.mov" style="object-position:63% 83%" data-object-fit="cover" data-object-position="63% 83%"></video><div class="wp-block-cover__inner-container"><!-- wp:paragraph {"align":"center","placeholder":"Write title…","className":"has-text-color has-very-light-gray-color","fontSize":"large"} -->
22
+ <p class="has-text-align-center has-text-color has-very-light-gray-color has-large-font-size">Cool cover</p>
23
+ <!-- /wp:paragraph --></div></div>
24
+ <!-- /wp:cover -->`;
25
+
26
+ const tranformsWithInnerBlocks = [ 'Columns', 'Group' ];
27
+ const blockTransformsWithImage = [
28
+ 'Image',
29
+ 'Media & Text',
30
+ ...tranformsWithInnerBlocks,
31
+ ];
32
+ const blockTransformsWithVideo = [
33
+ 'Video',
34
+ 'Media & Text',
35
+ ...tranformsWithInnerBlocks,
36
+ ];
37
+
38
+ setupCoreBlocks();
39
+
40
+ describe( `${ block } block transformations`, () => {
41
+ describe( 'with Image', () => {
42
+ test.each( blockTransformsWithImage )(
43
+ 'to %s block',
44
+ async ( blockTransform ) => {
45
+ const screen = await initializeEditor( {
46
+ initialHtml: initialHtmlWithImage,
47
+ } );
48
+ const newBlock = await transformBlock(
49
+ screen,
50
+ block,
51
+ blockTransform,
52
+ {
53
+ isMediaBlock: true,
54
+ hasInnerBlocks:
55
+ tranformsWithInnerBlocks.includes( blockTransform ),
56
+ }
57
+ );
58
+ expect( newBlock ).toBeVisible();
59
+ expect( getEditorHtml() ).toMatchSnapshot();
60
+ }
61
+ );
62
+
63
+ it( 'matches expected transformation options', async () => {
64
+ const screen = await initializeEditor( {
65
+ initialHtml: initialHtmlWithImage,
66
+ } );
67
+ const transformOptions = await getBlockTransformOptions(
68
+ screen,
69
+ block
70
+ );
71
+ expect( transformOptions ).toHaveLength(
72
+ blockTransformsWithImage.length
73
+ );
74
+ } );
75
+ } );
76
+
77
+ describe( 'with Video', () => {
78
+ test.each( blockTransformsWithVideo )(
79
+ 'to %s block',
80
+ async ( blockTransform ) => {
81
+ const screen = await initializeEditor( {
82
+ initialHtml: initialHtmlWithVideo,
83
+ } );
84
+ const newBlock = await transformBlock(
85
+ screen,
86
+ block,
87
+ blockTransform,
88
+ {
89
+ isMediaBlock: true,
90
+ hasInnerBlocks:
91
+ tranformsWithInnerBlocks.includes( blockTransform ),
92
+ }
93
+ );
94
+ expect( newBlock ).toBeVisible();
95
+ expect( getEditorHtml() ).toMatchSnapshot();
96
+ }
97
+ );
98
+
99
+ it( 'matches expected transformation options', async () => {
100
+ const screen = await initializeEditor( {
101
+ initialHtml: initialHtmlWithVideo,
102
+ } );
103
+ const transformOptions = await getBlockTransformOptions(
104
+ screen,
105
+ block
106
+ );
107
+ expect( transformOptions ).toHaveLength(
108
+ blockTransformsWithVideo.length
109
+ );
110
+ } );
111
+ } );
112
+ } );
@@ -0,0 +1,20 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import { cover } from '@wordpress/icons';
6
+
7
+ const variations = [
8
+ {
9
+ name: 'cover',
10
+ title: __( 'Cover' ),
11
+ description: __(
12
+ 'Add an image or video with a text overlay — great for headers.'
13
+ ),
14
+ attributes: { layout: { type: 'constrained' } },
15
+ isDefault: true,
16
+ icon: cover,
17
+ },
18
+ ];
19
+
20
+ export default variations;
package/src/embed/edit.js CHANGED
@@ -4,6 +4,7 @@
4
4
  import {
5
5
  createUpgradedEmbedBlock,
6
6
  getClassNames,
7
+ removeAspectRatioClasses,
7
8
  fallback,
8
9
  getEmbedInfoByProvider,
9
10
  getMergedAttributesWithPreview,
@@ -99,16 +100,14 @@ const EmbedEdit = ( props ) => {
99
100
  /**
100
101
  * Returns the attributes derived from the preview, merged with the current attributes.
101
102
  *
102
- * @param {boolean} ignorePreviousClassName Determines if the previous className attribute should be ignored when merging.
103
103
  * @return {Object} Merged attributes.
104
104
  */
105
- const getMergedAttributes = ( ignorePreviousClassName = false ) =>
105
+ const getMergedAttributes = () =>
106
106
  getMergedAttributesWithPreview(
107
107
  attributes,
108
108
  preview,
109
109
  title,
110
- responsive,
111
- ignorePreviousClassName
110
+ responsive
112
111
  );
113
112
 
114
113
  const toggleResponsive = () => {
@@ -136,21 +135,20 @@ const EmbedEdit = ( props ) => {
136
135
  setURL( newURL );
137
136
  setIsEditingURL( false );
138
137
  setAttributes( { url: newURL } );
139
- }, [ preview?.html, attributesUrl ] );
138
+ }, [ preview?.html, attributesUrl, cannotEmbed, fetching ] );
140
139
 
141
140
  // Handle incoming preview.
142
141
  useEffect( () => {
143
142
  if ( preview && ! isEditingURL ) {
144
- // When obtaining an incoming preview, we set the attributes derived from
145
- // the preview data. In this case when getting the merged attributes,
146
- // we ignore the previous classname because it might not match the expected
147
- // classes by the new preview.
148
- setAttributes( getMergedAttributes( true ) );
143
+ // When obtaining an incoming preview,
144
+ // we set the attributes derived from the preview data.
145
+ const mergedAttributes = getMergedAttributes();
146
+ setAttributes( mergedAttributes );
149
147
 
150
148
  if ( onReplace ) {
151
149
  const upgradedBlock = createUpgradedEmbedBlock(
152
150
  props,
153
- getMergedAttributes()
151
+ mergedAttributes
154
152
  );
155
153
 
156
154
  if ( upgradedBlock ) {
@@ -188,8 +186,14 @@ const EmbedEdit = ( props ) => {
188
186
  event.preventDefault();
189
187
  }
190
188
 
189
+ // If the embed URL was changed, we need to reset the aspect ratio class.
190
+ // To do this we have to remove the existing ratio class so it can be recalculated.
191
+ const blockClass = removeAspectRatioClasses(
192
+ attributes.className
193
+ );
194
+
191
195
  setIsEditingURL( false );
192
- setAttributes( { url } );
196
+ setAttributes( { url, className: blockClass } );
193
197
  } }
194
198
  value={ url }
195
199
  cannotEmbed={ cannotEmbed }
@@ -4,6 +4,7 @@
4
4
  import {
5
5
  createUpgradedEmbedBlock,
6
6
  getClassNames,
7
+ removeAspectRatioClasses,
7
8
  fallback,
8
9
  getEmbedInfoByProvider,
9
10
  getMergedAttributesWithPreview,
@@ -123,16 +124,14 @@ const EmbedEdit = ( props ) => {
123
124
  /**
124
125
  * Returns the attributes derived from the preview, merged with the current attributes.
125
126
  *
126
- * @param {boolean} ignorePreviousClassName Determines if the previous className attribute should be ignored when merging.
127
127
  * @return {Object} Merged attributes.
128
128
  */
129
- const getMergedAttributes = ( ignorePreviousClassName = false ) =>
129
+ const getMergedAttributes = () =>
130
130
  getMergedAttributesWithPreview(
131
131
  attributes,
132
132
  preview,
133
133
  title,
134
- responsive,
135
- ignorePreviousClassName
134
+ responsive
136
135
  );
137
136
 
138
137
  const toggleResponsive = () => {
@@ -159,21 +158,20 @@ const EmbedEdit = ( props ) => {
159
158
  const newURL = url.replace( /\/$/, '' );
160
159
  setIsEditingURL( false );
161
160
  setAttributes( { url: newURL } );
162
- }, [ preview?.html, url ] );
161
+ }, [ preview?.html, url, cannotEmbed, fetching ] );
163
162
 
164
163
  // Handle incoming preview.
165
164
  useEffect( () => {
166
165
  if ( preview && ! isEditingURL ) {
167
- // When obtaining an incoming preview, we set the attributes derived from
168
- // the preview data. In this case when getting the merged attributes,
169
- // we ignore the previous classname because it might not match the expected
170
- // classes by the new preview.
171
- setAttributes( getMergedAttributes( true ) );
166
+ // When obtaining an incoming preview,
167
+ // we set the attributes derived from the preview data.
168
+ const mergedAttributes = getMergedAttributes();
169
+ setAttributes( mergedAttributes );
172
170
 
173
171
  if ( onReplace ) {
174
172
  const upgradedBlock = createUpgradedEmbedBlock(
175
173
  props,
176
- getMergedAttributes()
174
+ mergedAttributes
177
175
  );
178
176
 
179
177
  if ( upgradedBlock ) {
@@ -188,13 +186,25 @@ const EmbedEdit = ( props ) => {
188
186
  [ isEditingURL ]
189
187
  );
190
188
 
191
- const onEditURL = useCallback( ( value ) => {
192
- // The order of the following calls is important, we need to update the URL attribute before changing `isEditingURL`,
193
- // otherwise the side-effect that potentially replaces the block when updating the local state won't use the new URL
194
- // for creating the new block.
195
- setAttributes( { url: value } );
196
- setIsEditingURL( false );
197
- }, [] );
189
+ const onEditURL = useCallback(
190
+ ( value ) => {
191
+ // If the embed URL was changed, we need to reset the aspect ratio class.
192
+ // To do this we have to remove the existing ratio class so it can be recalculated.
193
+ if ( attributes.url !== value ) {
194
+ const blockClass = removeAspectRatioClasses(
195
+ attributes.className
196
+ );
197
+ setAttributes( { className: blockClass } );
198
+ }
199
+
200
+ // The order of the following calls is important, we need to update the URL attribute before changing `isEditingURL`,
201
+ // otherwise the side-effect that potentially replaces the block when updating the local state won't use the new URL
202
+ // for creating the new block.
203
+ setAttributes( { url: value } );
204
+ setIsEditingURL( false );
205
+ },
206
+ [ attributes, setAttributes ]
207
+ );
198
208
 
199
209
  const blockProps = useBlockProps();
200
210
 
@@ -0,0 +1,23 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Embed block transforms to Columns block 1`] = `
4
+ "<!-- wp:columns -->
5
+ <div class="wp-block-columns"><!-- wp:column {"width":"100%"} -->
6
+ <div class="wp-block-column" style="flex-basis:100%"><!-- wp:embed {"url":"https://twitter.com/notnownikki","type":"rich","providerNameSlug":"twitter","responsive":true} -->
7
+ <figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
8
+ https://twitter.com/notnownikki
9
+ </div></figure>
10
+ <!-- /wp:embed --></div>
11
+ <!-- /wp:column --></div>
12
+ <!-- /wp:columns -->"
13
+ `;
14
+
15
+ exports[`Embed block transforms to Group block 1`] = `
16
+ "<!-- wp:group {"layout":{"type":"constrained"}} -->
17
+ <div class="wp-block-group"><!-- wp:embed {"url":"https://twitter.com/notnownikki","type":"rich","providerNameSlug":"twitter","responsive":true} -->
18
+ <figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
19
+ https://twitter.com/notnownikki
20
+ </div></figure>
21
+ <!-- /wp:embed --></div>
22
+ <!-- /wp:group -->"
23
+ `;
@@ -17,6 +17,7 @@ import {
17
17
  createUpgradedEmbedBlock,
18
18
  getEmbedInfoByProvider,
19
19
  removeAspectRatioClasses,
20
+ hasAspectRatioClass,
20
21
  } from '../util';
21
22
  import { embedInstagramIcon } from '../icons';
22
23
  import variations from '../variations';
@@ -101,6 +102,17 @@ describe( 'utils', () => {
101
102
  ).toEqual( expected );
102
103
  } );
103
104
  } );
105
+ describe( 'hasAspectRatioClass', () => {
106
+ it( 'should return false if an aspect ratio class does not exist', () => {
107
+ const existingClassNames = 'wp-block-embed is-type-video';
108
+ expect( hasAspectRatioClass( existingClassNames ) ).toBe( false );
109
+ } );
110
+ it( 'should return true if an aspect ratio class exists', () => {
111
+ const existingClassNames =
112
+ 'wp-block-embed is-type-video wp-embed-aspect-16-9 wp-has-aspect-ratio';
113
+ expect( hasAspectRatioClass( existingClassNames ) ).toBe( true );
114
+ } );
115
+ } );
104
116
  describe( 'removeAspectRatioClasses', () => {
105
117
  it( 'should return the same falsy value as received', () => {
106
118
  const existingClassNames = undefined;
@@ -0,0 +1,44 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import {
5
+ getEditorHtml,
6
+ initializeEditor,
7
+ setupCoreBlocks,
8
+ transformBlock,
9
+ getBlockTransformOptions,
10
+ } from 'test/helpers';
11
+
12
+ const block = 'Embed';
13
+ const initialHtml = `
14
+ <!-- wp:embed {"url":"https://twitter.com/notnownikki","type":"rich","providerNameSlug":"twitter","responsive":true} -->
15
+ <figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
16
+ https://twitter.com/notnownikki
17
+ </div></figure>
18
+ <!-- /wp:embed -->`;
19
+
20
+ const transformsWithInnerBlocks = [ 'Columns', 'Group' ];
21
+ const blockTransforms = [ ...transformsWithInnerBlocks ];
22
+
23
+ setupCoreBlocks();
24
+
25
+ describe( `${ block } block transforms`, () => {
26
+ test.each( blockTransforms )( 'to %s block', async ( blockTransform ) => {
27
+ const screen = await initializeEditor( { initialHtml } );
28
+ const newBlock = await transformBlock( screen, block, blockTransform, {
29
+ hasInnerBlocks:
30
+ transformsWithInnerBlocks.includes( blockTransform ),
31
+ } );
32
+ expect( newBlock ).toBeVisible();
33
+ expect( getEditorHtml() ).toMatchSnapshot();
34
+ } );
35
+
36
+ it( 'matches expected transformation options', async () => {
37
+ const screen = await initializeEditor( { initialHtml } );
38
+ const transformOptions = await getBlockTransformOptions(
39
+ screen,
40
+ block
41
+ );
42
+ expect( transformOptions ).toHaveLength( blockTransforms.length );
43
+ } );
44
+ } );
package/src/embed/util.js CHANGED
@@ -152,6 +152,21 @@ export const createUpgradedEmbedBlock = (
152
152
  } );
153
153
  };
154
154
 
155
+ /**
156
+ * Determine if the block already has an aspect ratio class applied.
157
+ *
158
+ * @param {string} existingClassNames Existing block classes.
159
+ * @return {boolean} True or false if the classnames contain an aspect ratio class.
160
+ */
161
+ export const hasAspectRatioClass = ( existingClassNames ) => {
162
+ if ( ! existingClassNames ) {
163
+ return false;
164
+ }
165
+ return ASPECT_RATIOS.some( ( { className } ) =>
166
+ existingClassNames.includes( className )
167
+ );
168
+ };
169
+
155
170
  /**
156
171
  * Removes all previously set aspect ratio related classes and return the rest
157
172
  * existing class names.
@@ -283,6 +298,13 @@ export const getAttributesFromPreview = memoize(
283
298
  attributes.providerNameSlug = providerNameSlug;
284
299
  }
285
300
 
301
+ // Aspect ratio classes are removed when the embed URL is updated.
302
+ // If the embed already has an aspect ratio class, that means the URL has not changed.
303
+ // Which also means no need to regenerate it with getClassNames.
304
+ if ( hasAspectRatioClass( currentClassNames ) ) {
305
+ return attributes;
306
+ }
307
+
286
308
  attributes.className = getClassNames(
287
309
  html,
288
310
  currentClassNames,
@@ -296,27 +318,26 @@ export const getAttributesFromPreview = memoize(
296
318
  /**
297
319
  * Returns the attributes derived from the preview, merged with the current attributes.
298
320
  *
299
- * @param {Object} currentAttributes The current attributes of the block.
300
- * @param {Object} preview The preview data.
301
- * @param {string} title The block's title, e.g. Twitter.
302
- * @param {boolean} isResponsive Boolean indicating if the block supports responsive content.
303
- * @param {boolean} ignorePreviousClassName Determines if the previous className attribute should be ignored when merging.
321
+ * @param {Object} currentAttributes The current attributes of the block.
322
+ * @param {Object} preview The preview data.
323
+ * @param {string} title The block's title, e.g. Twitter.
324
+ * @param {boolean} isResponsive Boolean indicating if the block supports responsive content.
304
325
  * @return {Object} Merged attributes.
305
326
  */
306
327
  export const getMergedAttributesWithPreview = (
307
328
  currentAttributes,
308
329
  preview,
309
330
  title,
310
- isResponsive,
311
- ignorePreviousClassName = false
331
+ isResponsive
312
332
  ) => {
313
333
  const { allowResponsive, className } = currentAttributes;
334
+
314
335
  return {
315
336
  ...currentAttributes,
316
337
  ...getAttributesFromPreview(
317
338
  preview,
318
339
  title,
319
- ignorePreviousClassName ? undefined : className,
340
+ className,
320
341
  isResponsive,
321
342
  allowResponsive
322
343
  ),
@@ -115,7 +115,15 @@ exports[`File block renders file error state without crashing 1`] = `
115
115
  />
116
116
  </View>
117
117
  <View>
118
- Svg
118
+ <Svg
119
+ height={24}
120
+ style={{}}
121
+ viewBox="-2 -2 24 24"
122
+ width={24}
123
+ xmlns="http://www.w3.org/2000/svg"
124
+ >
125
+ Path
126
+ </Svg>
119
127
  <TextInput
120
128
  editable={false}
121
129
  fontFamily="serif"
@@ -464,7 +472,15 @@ exports[`File block renders placeholder without crashing 1`] = `
464
472
  <View
465
473
  style={{}}
466
474
  >
467
- Svg
475
+ <Svg
476
+ height={24}
477
+ style={{}}
478
+ viewBox="0 0 24 24"
479
+ width={24}
480
+ xmlns="http://www.w3.org/2000/svg"
481
+ >
482
+ Path
483
+ </Svg>
468
484
  </View>
469
485
  </View>
470
486
  <Text>
@@ -0,0 +1,19 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`File block transformations to Columns block 1`] = `
4
+ "<!-- wp:columns -->
5
+ <div class="wp-block-columns"><!-- wp:column {"width":"100%"} -->
6
+ <div class="wp-block-column" style="flex-basis:100%"><!-- wp:file {"id":3,"href":"https://wordpress.org/latest.zip"} -->
7
+ <div class="wp-block-file"><a href="https://wordpress.org/latest.zip">WordPress.zip</a><a href="https://wordpress.org/latest.zip" class="wp-block-file__button wp-element-button" download>Download</a></div>
8
+ <!-- /wp:file --></div>
9
+ <!-- /wp:column --></div>
10
+ <!-- /wp:columns -->"
11
+ `;
12
+
13
+ exports[`File block transformations to Group block 1`] = `
14
+ "<!-- wp:group {"layout":{"type":"constrained"}} -->
15
+ <div class="wp-block-group"><!-- wp:file {"id":3,"href":"https://wordpress.org/latest.zip"} -->
16
+ <div class="wp-block-file"><a href="https://wordpress.org/latest.zip">WordPress.zip</a><a href="https://wordpress.org/latest.zip" class="wp-block-file__button wp-element-button" download>Download</a></div>
17
+ <!-- /wp:file --></div>
18
+ <!-- /wp:group -->"
19
+ `;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import {
5
+ getEditorHtml,
6
+ initializeEditor,
7
+ setupCoreBlocks,
8
+ transformBlock,
9
+ getBlockTransformOptions,
10
+ } from 'test/helpers';
11
+
12
+ const block = 'File';
13
+ const initialHtml = `
14
+ <!-- wp:file {"id":3,"href":"https://wordpress.org/latest.zip"} -->
15
+ <div class="wp-block-file"><a href="https://wordpress.org/latest.zip">WordPress.zip</a><a href="https://wordpress.org/latest.zip" class="wp-block-file__button wp-element-button" download>Download</a></div>
16
+ <!-- /wp:file -->`;
17
+
18
+ const tranformsWithInnerBlocks = [ 'Columns', 'Group' ];
19
+ const blockTransforms = [ ...tranformsWithInnerBlocks ];
20
+
21
+ setupCoreBlocks();
22
+
23
+ describe( `${ block } block transformations`, () => {
24
+ test.each( blockTransforms )( 'to %s block', async ( blockTransform ) => {
25
+ const screen = await initializeEditor( { initialHtml } );
26
+ const newBlock = await transformBlock( screen, block, blockTransform, {
27
+ isMediaBlock: false,
28
+ hasInnerBlocks: tranformsWithInnerBlocks.includes( blockTransform ),
29
+ } );
30
+ expect( newBlock ).toBeVisible();
31
+ expect( getEditorHtml() ).toMatchSnapshot();
32
+ } );
33
+
34
+ it( 'matches expected transformation options', async () => {
35
+ const screen = await initializeEditor( { initialHtml } );
36
+ const transformOptions = await getBlockTransformOptions(
37
+ screen,
38
+ block
39
+ );
40
+ expect( transformOptions ).toHaveLength( blockTransforms.length );
41
+ } );
42
+ } );
@@ -0,0 +1,19 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Classic block transforms to Columns block 1`] = `
4
+ "<!-- wp:columns -->
5
+ <div class="wp-block-columns"><!-- wp:column {"width":"100%"} -->
6
+ <div class="wp-block-column" style="flex-basis:100%"><!-- wp:freeform -->
7
+ <p>Classic block</p>
8
+ <!-- /wp:freeform --></div>
9
+ <!-- /wp:column --></div>
10
+ <!-- /wp:columns -->"
11
+ `;
12
+
13
+ exports[`Classic block transforms to Group block 1`] = `
14
+ "<!-- wp:group {"layout":{"type":"constrained"}} -->
15
+ <div class="wp-block-group"><!-- wp:freeform -->
16
+ <p>Classic block</p>
17
+ <!-- /wp:freeform --></div>
18
+ <!-- /wp:group -->"
19
+ `;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import {
5
+ getEditorHtml,
6
+ initializeEditor,
7
+ setupCoreBlocks,
8
+ transformBlock,
9
+ getBlockTransformOptions,
10
+ } from 'test/helpers';
11
+
12
+ const block = 'Classic';
13
+ const initialHtml = `Classic block`;
14
+
15
+ const transformsWithInnerBlocks = [ 'Columns', 'Group' ];
16
+ const blockTransforms = [ ...transformsWithInnerBlocks ];
17
+
18
+ setupCoreBlocks();
19
+
20
+ describe( `${ block } block transforms`, () => {
21
+ test.each( blockTransforms )( 'to %s block', async ( blockTransform ) => {
22
+ const screen = await initializeEditor( { initialHtml } );
23
+ const newBlock = await transformBlock( screen, block, blockTransform, {
24
+ hasInnerBlocks:
25
+ transformsWithInnerBlocks.includes( blockTransform ),
26
+ } );
27
+ expect( newBlock ).toBeVisible();
28
+ expect( getEditorHtml() ).toMatchSnapshot();
29
+ } );
30
+
31
+ it( 'matches expected transformation options', async () => {
32
+ const screen = await initializeEditor( { initialHtml } );
33
+ const transformOptions = await getBlockTransformOptions(
34
+ screen,
35
+ block
36
+ );
37
+ expect( transformOptions ).toHaveLength( blockTransforms.length );
38
+ } );
39
+ } );
@@ -591,6 +591,9 @@ function GalleryEdit( props ) {
591
591
  <SelectControl
592
592
  __nextHasNoMarginBottom
593
593
  label={ __( 'Image size' ) }
594
+ help={ __(
595
+ 'Select the size of the source images.'
596
+ ) }
594
597
  value={ sizeSlug }
595
598
  options={ imageSizeOptions }
596
599
  onChange={ updateImagesSize }