@wordpress/block-library 8.5.0 → 8.7.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 (427) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/build/buttons/edit.native.js +1 -1
  3. package/build/buttons/edit.native.js.map +1 -1
  4. package/build/buttons/index.js +1 -0
  5. package/build/buttons/index.js.map +1 -1
  6. package/build/buttons/transforms.js +1 -0
  7. package/build/buttons/transforms.js.map +1 -1
  8. package/build/columns/edit.js +14 -10
  9. package/build/columns/edit.js.map +1 -1
  10. package/build/columns/edit.native.js +1 -1
  11. package/build/columns/edit.native.js.map +1 -1
  12. package/build/columns/index.js +4 -0
  13. package/build/columns/index.js.map +1 -1
  14. package/build/comments/edit/placeholder.js +8 -5
  15. package/build/comments/edit/placeholder.js.map +1 -1
  16. package/build/cover/edit/inspector-controls.js +2 -2
  17. package/build/cover/edit/inspector-controls.js.map +1 -1
  18. package/build/cover/index.js +13 -4
  19. package/build/cover/index.js.map +1 -1
  20. package/build/cover/variations.js +29 -0
  21. package/build/cover/variations.js.map +1 -0
  22. package/build/embed/edit.js +13 -14
  23. package/build/embed/edit.js.map +1 -1
  24. package/build/embed/edit.native.js +18 -14
  25. package/build/embed/edit.native.js.map +1 -1
  26. package/build/embed/util.js +39 -12
  27. package/build/embed/util.js.map +1 -1
  28. package/build/gallery/edit.js +9 -5
  29. package/build/gallery/edit.js.map +1 -1
  30. package/build/gallery/use-image-sizes.js +1 -1
  31. package/build/gallery/use-image-sizes.js.map +1 -1
  32. package/build/group/deprecated.js +4 -2
  33. package/build/group/deprecated.js.map +1 -1
  34. package/build/group/edit.js +22 -5
  35. package/build/group/edit.js.map +1 -1
  36. package/build/group/placeholder.js +11 -1
  37. package/build/group/placeholder.js.map +1 -1
  38. package/build/group/variations.js +23 -3
  39. package/build/group/variations.js.map +1 -1
  40. package/build/image/edit.js +1 -1
  41. package/build/image/edit.js.map +1 -1
  42. package/build/image/edit.native.js +1 -1
  43. package/build/image/edit.native.js.map +1 -1
  44. package/build/image/image.js +8 -6
  45. package/build/image/image.js.map +1 -1
  46. package/build/image/index.js +7 -2
  47. package/build/image/index.js.map +1 -1
  48. package/build/latest-posts/edit.js +11 -10
  49. package/build/latest-posts/edit.js.map +1 -1
  50. package/build/latest-posts/edit.native.js +3 -3
  51. package/build/latest-posts/edit.native.js.map +1 -1
  52. package/build/media-text/constants.js +17 -1
  53. package/build/media-text/constants.js.map +1 -1
  54. package/build/media-text/deprecated.js +228 -18
  55. package/build/media-text/deprecated.js.map +1 -1
  56. package/build/media-text/edit.js +10 -22
  57. package/build/media-text/edit.js.map +1 -1
  58. package/build/media-text/edit.native.js +6 -5
  59. package/build/media-text/edit.native.js.map +1 -1
  60. package/build/media-text/index.js +1 -1
  61. package/build/media-text/transforms.js +32 -44
  62. package/build/media-text/transforms.js.map +1 -1
  63. package/build/navigation/edit/index.js +55 -96
  64. package/build/navigation/edit/index.js.map +1 -1
  65. package/build/navigation/edit/menu-inspector-controls.js +2 -5
  66. package/build/navigation/edit/menu-inspector-controls.js.map +1 -1
  67. package/build/navigation/edit/navigation-menu-selector.js +26 -22
  68. package/build/navigation/edit/navigation-menu-selector.js.map +1 -1
  69. package/build/navigation/edit/unsaved-inner-blocks.js +14 -1
  70. package/build/navigation/edit/unsaved-inner-blocks.js.map +1 -1
  71. package/build/navigation/edit/use-convert-classic-menu-to-block-menu.js +2 -4
  72. package/build/navigation/edit/use-convert-classic-menu-to-block-menu.js.map +1 -1
  73. package/build/navigation/edit/use-create-navigation-menu.js +1 -1
  74. package/build/navigation/edit/use-create-navigation-menu.js.map +1 -1
  75. package/build/navigation/edit/use-navigation-notice.js +1 -1
  76. package/build/navigation/edit/use-navigation-notice.js.map +1 -1
  77. package/build/navigation/index.js +0 -1
  78. package/build/navigation/index.js.map +1 -1
  79. package/build/navigation-link/edit.js +0 -11
  80. package/build/navigation-link/edit.js.map +1 -1
  81. package/build/navigation-link/link-ui.js +0 -1
  82. package/build/navigation-link/link-ui.js.map +1 -1
  83. package/build/navigation-submenu/edit.js +1 -13
  84. package/build/navigation-submenu/edit.js.map +1 -1
  85. package/build/page-list/edit.js +59 -45
  86. package/build/page-list/edit.js.map +1 -1
  87. package/build/page-list-item/edit.js +3 -2
  88. package/build/page-list-item/edit.js.map +1 -1
  89. package/build/post-content/edit.js +6 -1
  90. package/build/post-content/edit.js.map +1 -1
  91. package/build/post-date/edit.js +2 -1
  92. package/build/post-date/edit.js.map +1 -1
  93. package/build/post-date/index.js +4 -1
  94. package/build/post-date/index.js.map +1 -1
  95. package/build/post-date/variations.js +28 -0
  96. package/build/post-date/variations.js.map +1 -0
  97. package/build/post-excerpt/edit.js +39 -10
  98. package/build/post-excerpt/edit.js.map +1 -1
  99. package/build/post-featured-image/dimension-controls.js +2 -8
  100. package/build/post-featured-image/dimension-controls.js.map +1 -1
  101. package/build/post-featured-image/edit.js +1 -1
  102. package/build/post-featured-image/edit.js.map +1 -1
  103. package/build/post-template/index.js +1 -1
  104. package/build/post-time-to-read/index.js +17 -1
  105. package/build/post-time-to-read/index.js.map +1 -1
  106. package/build/pullquote/deprecated.js +3 -3
  107. package/build/pullquote/deprecated.js.map +1 -1
  108. package/build/query/edit/query-placeholder.js +3 -2
  109. package/build/query/edit/query-placeholder.js.map +1 -1
  110. package/build/query/utils.js +26 -9
  111. package/build/query/utils.js.map +1 -1
  112. package/build/quote/index.js +1 -0
  113. package/build/quote/index.js.map +1 -1
  114. package/build/spacer/edit.js +16 -6
  115. package/build/spacer/edit.js.map +1 -1
  116. package/build/table/state.js +12 -4
  117. package/build/table/state.js.map +1 -1
  118. package/build/template-part/edit/import-controls.js +4 -24
  119. package/build/template-part/edit/import-controls.js.map +1 -1
  120. package/build/template-part/edit/utils/transformers.js +69 -19
  121. package/build/template-part/edit/utils/transformers.js.map +1 -1
  122. package/build/text-columns/edit.js +3 -7
  123. package/build/text-columns/edit.js.map +1 -1
  124. package/build/text-columns/save.js +11 -13
  125. package/build/text-columns/save.js.map +1 -1
  126. package/build-module/buttons/edit.native.js +1 -1
  127. package/build-module/buttons/edit.native.js.map +1 -1
  128. package/build-module/buttons/index.js +1 -0
  129. package/build-module/buttons/index.js.map +1 -1
  130. package/build-module/buttons/transforms.js +1 -0
  131. package/build-module/buttons/transforms.js.map +1 -1
  132. package/build-module/columns/edit.js +14 -9
  133. package/build-module/columns/edit.js.map +1 -1
  134. package/build-module/columns/edit.native.js +1 -1
  135. package/build-module/columns/edit.native.js.map +1 -1
  136. package/build-module/columns/index.js +4 -0
  137. package/build-module/columns/index.js.map +1 -1
  138. package/build-module/comments/edit/placeholder.js +9 -5
  139. package/build-module/comments/edit/placeholder.js.map +1 -1
  140. package/build-module/cover/edit/inspector-controls.js +2 -2
  141. package/build-module/cover/edit/inspector-controls.js.map +1 -1
  142. package/build-module/cover/index.js +12 -4
  143. package/build-module/cover/index.js.map +1 -1
  144. package/build-module/cover/variations.js +19 -0
  145. package/build-module/cover/variations.js.map +1 -0
  146. package/build-module/embed/edit.js +14 -15
  147. package/build-module/embed/edit.js.map +1 -1
  148. package/build-module/embed/edit.native.js +19 -15
  149. package/build-module/embed/edit.native.js.map +1 -1
  150. package/build-module/embed/util.js +34 -10
  151. package/build-module/embed/util.js.map +1 -1
  152. package/build-module/gallery/edit.js +9 -5
  153. package/build-module/gallery/edit.js.map +1 -1
  154. package/build-module/gallery/use-image-sizes.js +1 -1
  155. package/build-module/gallery/use-image-sizes.js.map +1 -1
  156. package/build-module/group/deprecated.js +4 -2
  157. package/build-module/group/deprecated.js.map +1 -1
  158. package/build-module/group/edit.js +21 -5
  159. package/build-module/group/edit.js.map +1 -1
  160. package/build-module/group/placeholder.js +11 -1
  161. package/build-module/group/placeholder.js.map +1 -1
  162. package/build-module/group/variations.js +24 -1
  163. package/build-module/group/variations.js.map +1 -1
  164. package/build-module/image/edit.js +1 -1
  165. package/build-module/image/edit.js.map +1 -1
  166. package/build-module/image/edit.native.js +1 -1
  167. package/build-module/image/edit.native.js.map +1 -1
  168. package/build-module/image/image.js +8 -6
  169. package/build-module/image/image.js.map +1 -1
  170. package/build-module/image/index.js +7 -2
  171. package/build-module/image/index.js.map +1 -1
  172. package/build-module/latest-posts/edit.js +11 -9
  173. package/build-module/latest-posts/edit.js.map +1 -1
  174. package/build-module/latest-posts/edit.native.js +3 -3
  175. package/build-module/latest-posts/edit.native.js.map +1 -1
  176. package/build-module/media-text/constants.js +10 -0
  177. package/build-module/media-text/constants.js.map +1 -1
  178. package/build-module/media-text/deprecated.js +227 -18
  179. package/build-module/media-text/deprecated.js.map +1 -1
  180. package/build-module/media-text/edit.js +5 -17
  181. package/build-module/media-text/edit.js.map +1 -1
  182. package/build-module/media-text/edit.native.js +4 -3
  183. package/build-module/media-text/edit.native.js.map +1 -1
  184. package/build-module/media-text/index.js +1 -1
  185. package/build-module/media-text/transforms.js +32 -44
  186. package/build-module/media-text/transforms.js.map +1 -1
  187. package/build-module/navigation/edit/index.js +57 -98
  188. package/build-module/navigation/edit/index.js.map +1 -1
  189. package/build-module/navigation/edit/menu-inspector-controls.js +2 -5
  190. package/build-module/navigation/edit/menu-inspector-controls.js.map +1 -1
  191. package/build-module/navigation/edit/navigation-menu-selector.js +25 -22
  192. package/build-module/navigation/edit/navigation-menu-selector.js.map +1 -1
  193. package/build-module/navigation/edit/unsaved-inner-blocks.js +14 -1
  194. package/build-module/navigation/edit/unsaved-inner-blocks.js.map +1 -1
  195. package/build-module/navigation/edit/use-convert-classic-menu-to-block-menu.js +2 -4
  196. package/build-module/navigation/edit/use-convert-classic-menu-to-block-menu.js.map +1 -1
  197. package/build-module/navigation/edit/use-create-navigation-menu.js +1 -1
  198. package/build-module/navigation/edit/use-create-navigation-menu.js.map +1 -1
  199. package/build-module/navigation/edit/use-navigation-notice.js +1 -1
  200. package/build-module/navigation/edit/use-navigation-notice.js.map +1 -1
  201. package/build-module/navigation/index.js +0 -1
  202. package/build-module/navigation/index.js.map +1 -1
  203. package/build-module/navigation-link/edit.js +0 -11
  204. package/build-module/navigation-link/edit.js.map +1 -1
  205. package/build-module/navigation-link/link-ui.js +0 -1
  206. package/build-module/navigation-link/link-ui.js.map +1 -1
  207. package/build-module/navigation-submenu/edit.js +1 -13
  208. package/build-module/navigation-submenu/edit.js.map +1 -1
  209. package/build-module/page-list/edit.js +61 -47
  210. package/build-module/page-list/edit.js.map +1 -1
  211. package/build-module/page-list-item/edit.js +3 -2
  212. package/build-module/page-list-item/edit.js.map +1 -1
  213. package/build-module/post-content/edit.js +6 -1
  214. package/build-module/post-content/edit.js.map +1 -1
  215. package/build-module/post-date/edit.js +2 -1
  216. package/build-module/post-date/edit.js.map +1 -1
  217. package/build-module/post-date/index.js +3 -1
  218. package/build-module/post-date/index.js.map +1 -1
  219. package/build-module/post-date/variations.js +18 -0
  220. package/build-module/post-date/variations.js.map +1 -0
  221. package/build-module/post-excerpt/edit.js +38 -11
  222. package/build-module/post-excerpt/edit.js.map +1 -1
  223. package/build-module/post-featured-image/dimension-controls.js +2 -8
  224. package/build-module/post-featured-image/dimension-controls.js.map +1 -1
  225. package/build-module/post-featured-image/edit.js +1 -1
  226. package/build-module/post-featured-image/edit.js.map +1 -1
  227. package/build-module/post-template/index.js +1 -1
  228. package/build-module/post-time-to-read/index.js +17 -1
  229. package/build-module/post-time-to-read/index.js.map +1 -1
  230. package/build-module/pullquote/deprecated.js +3 -2
  231. package/build-module/pullquote/deprecated.js.map +1 -1
  232. package/build-module/query/edit/query-placeholder.js +4 -3
  233. package/build-module/query/edit/query-placeholder.js.map +1 -1
  234. package/build-module/query/utils.js +21 -6
  235. package/build-module/query/utils.js.map +1 -1
  236. package/build-module/quote/index.js +1 -0
  237. package/build-module/quote/index.js.map +1 -1
  238. package/build-module/spacer/edit.js +16 -6
  239. package/build-module/spacer/edit.js.map +1 -1
  240. package/build-module/table/state.js +13 -5
  241. package/build-module/table/state.js.map +1 -1
  242. package/build-module/template-part/edit/import-controls.js +4 -23
  243. package/build-module/template-part/edit/import-controls.js.map +1 -1
  244. package/build-module/template-part/edit/utils/transformers.js +69 -20
  245. package/build-module/template-part/edit/utils/transformers.js.map +1 -1
  246. package/build-module/text-columns/edit.js +3 -6
  247. package/build-module/text-columns/edit.js.map +1 -1
  248. package/build-module/text-columns/save.js +11 -12
  249. package/build-module/text-columns/save.js.map +1 -1
  250. package/build-style/categories/editor-rtl.css +5 -0
  251. package/build-style/categories/editor.css +5 -0
  252. package/build-style/categories/style-rtl.css +4 -0
  253. package/build-style/categories/style.css +4 -0
  254. package/build-style/cover/style-rtl.css +11 -5
  255. package/build-style/cover/style.css +11 -5
  256. package/build-style/editor-rtl.css +11 -1
  257. package/build-style/editor.css +11 -1
  258. package/build-style/navigation/editor-rtl.css +1 -1
  259. package/build-style/navigation/editor.css +1 -1
  260. package/build-style/navigation/style-rtl.css +2 -0
  261. package/build-style/navigation/style.css +2 -0
  262. package/build-style/page-list/editor-rtl.css +4 -0
  263. package/build-style/page-list/editor.css +4 -0
  264. package/build-style/post-featured-image/editor-rtl.css +1 -0
  265. package/build-style/post-featured-image/editor.css +1 -0
  266. package/build-style/post-featured-image/style-rtl.css +1 -0
  267. package/build-style/post-featured-image/style.css +1 -0
  268. package/build-style/post-template/style-rtl.css +1 -1
  269. package/build-style/post-template/style.css +1 -1
  270. package/build-style/post-time-to-read/style-rtl.css +91 -0
  271. package/build-style/post-time-to-read/style.css +91 -0
  272. package/build-style/search/style-rtl.css +8 -7
  273. package/build-style/search/style.css +8 -7
  274. package/build-style/style-rtl.css +31 -13
  275. package/build-style/style.css +31 -13
  276. package/package.json +31 -31
  277. package/src/audio/test/__snapshots__/edit.native.js.snap +44 -4
  278. package/src/audio/test/__snapshots__/transforms.native.js.snap +25 -0
  279. package/src/audio/test/transforms.native.js +42 -0
  280. package/src/block/test/__snapshots__/transforms.native.js.snap +15 -0
  281. package/src/block/test/transforms.native.js +40 -0
  282. package/src/buttons/block.json +1 -0
  283. package/src/buttons/edit.native.js +1 -1
  284. package/src/buttons/test/__snapshots__/transforms.native.js.snap +31 -0
  285. package/src/buttons/test/transforms.native.js +48 -0
  286. package/src/categories/editor.scss +5 -0
  287. package/src/categories/style.scss +4 -0
  288. package/src/columns/block.json +4 -0
  289. package/src/columns/edit.js +30 -18
  290. package/src/columns/edit.native.js +1 -1
  291. package/src/columns/test/__snapshots__/transforms.native.js.snap +61 -0
  292. package/src/columns/test/transforms.native.js +91 -0
  293. package/src/comment-template/index.php +1 -2
  294. package/src/comments/edit/placeholder.js +16 -4
  295. package/src/comments/index.php +1 -0
  296. package/src/cover/block.json +9 -3
  297. package/src/cover/edit/inspector-controls.js +4 -5
  298. package/src/cover/index.js +2 -0
  299. package/src/cover/style.scss +16 -7
  300. package/src/cover/test/__snapshots__/transforms.native.js.snap +73 -0
  301. package/src/cover/test/edit.js +324 -0
  302. package/src/cover/test/transforms.native.js +112 -0
  303. package/src/cover/variations.js +20 -0
  304. package/src/embed/edit.js +16 -12
  305. package/src/embed/edit.native.js +28 -18
  306. package/src/embed/test/__snapshots__/transforms.native.js.snap +23 -0
  307. package/src/embed/test/index.js +12 -0
  308. package/src/embed/test/transforms.native.js +44 -0
  309. package/src/embed/util.js +29 -8
  310. package/src/file/test/__snapshots__/edit.native.js.snap +18 -2
  311. package/src/file/test/__snapshots__/transforms.native.js.snap +19 -0
  312. package/src/file/test/transforms.native.js +42 -0
  313. package/src/freeform/test/__snapshots__/transforms.native.js.snap +19 -0
  314. package/src/freeform/test/transforms.native.js +39 -0
  315. package/src/gallery/edit.js +8 -2
  316. package/src/gallery/test/__snapshots__/transforms.native.js.snap +53 -0
  317. package/src/gallery/test/transforms.native.js +52 -0
  318. package/src/gallery/use-image-sizes.js +1 -1
  319. package/src/group/deprecated.js +4 -2
  320. package/src/group/edit.js +27 -9
  321. package/src/group/placeholder.js +13 -1
  322. package/src/group/test/__snapshots__/transforms.native.js.snap +35 -0
  323. package/src/group/test/transforms.native.js +75 -0
  324. package/src/group/variations.js +14 -1
  325. package/src/heading/test/__snapshots__/transforms.native.js.snap +47 -0
  326. package/src/heading/test/transforms.native.js +46 -0
  327. package/src/home-link/index.php +2 -2
  328. package/src/image/block.json +7 -2
  329. package/src/image/edit.js +1 -1
  330. package/src/image/edit.native.js +1 -1
  331. package/src/image/image.js +15 -7
  332. package/src/image/index.php +7 -2
  333. package/src/image/test/__snapshots__/transforms.native.js.snap +49 -0
  334. package/src/image/test/transforms.native.js +48 -0
  335. package/src/latest-comments/style.scss +1 -1
  336. package/src/latest-posts/edit.js +14 -16
  337. package/src/latest-posts/edit.native.js +3 -3
  338. package/src/latest-posts/test/__snapshots__/transforms.native.js.snap +15 -0
  339. package/src/latest-posts/test/transforms.native.js +61 -0
  340. package/src/list/test/__snapshots__/transforms.native.js.snap +85 -0
  341. package/src/list/test/transforms.native.js +56 -0
  342. package/src/media-text/block.json +1 -1
  343. package/src/media-text/constants.js +16 -0
  344. package/src/media-text/deprecated.js +235 -3
  345. package/src/media-text/edit.js +15 -24
  346. package/src/media-text/edit.native.js +3 -9
  347. package/src/media-text/test/__snapshots__/transforms.native.js.snap +73 -0
  348. package/src/media-text/test/transforms.native.js +112 -0
  349. package/src/media-text/transforms.js +24 -51
  350. package/src/missing/test/__snapshots__/edit.native.js.snap +20 -2
  351. package/src/more/test/__snapshots__/transforms.native.js.snap +19 -0
  352. package/src/more/test/transforms.native.js +42 -0
  353. package/src/navigation/block.json +0 -1
  354. package/src/navigation/edit/index.js +99 -115
  355. package/src/navigation/edit/menu-inspector-controls.js +2 -7
  356. package/src/navigation/edit/navigation-menu-selector.js +41 -25
  357. package/src/navigation/edit/unsaved-inner-blocks.js +46 -33
  358. package/src/navigation/edit/use-convert-classic-menu-to-block-menu.js +82 -83
  359. package/src/navigation/edit/use-create-navigation-menu.js +1 -1
  360. package/src/navigation/edit/use-navigation-notice.js +1 -1
  361. package/src/navigation/editor.scss +23 -20
  362. package/src/navigation/index.php +18 -39
  363. package/src/navigation/style.scss +6 -4
  364. package/src/navigation-link/edit.js +0 -9
  365. package/src/navigation-link/index.php +7 -9
  366. package/src/navigation-link/link-ui.js +0 -1
  367. package/src/navigation-submenu/edit.js +0 -10
  368. package/src/navigation-submenu/index.php +45 -74
  369. package/src/nextpage/test/__snapshots__/transforms.native.js.snap +19 -0
  370. package/src/nextpage/test/transforms.native.js +42 -0
  371. package/src/page-list/edit.js +78 -44
  372. package/src/page-list/editor.scss +6 -0
  373. package/src/page-list-item/edit.js +2 -3
  374. package/src/paragraph/test/__snapshots__/transforms.native.js.snap +59 -0
  375. package/src/paragraph/test/transforms.native.js +50 -0
  376. package/src/post-author/index.php +1 -1
  377. package/src/post-content/edit.js +5 -1
  378. package/src/post-date/edit.js +4 -1
  379. package/src/post-date/index.js +2 -0
  380. package/src/post-date/variations.js +20 -0
  381. package/src/post-excerpt/edit.js +48 -16
  382. package/src/post-excerpt/index.php +1 -2
  383. package/src/post-featured-image/dimension-controls.js +2 -10
  384. package/src/post-featured-image/edit.js +1 -1
  385. package/src/post-featured-image/editor.scss +1 -0
  386. package/src/post-featured-image/style.scss +1 -0
  387. package/src/post-template/block.json +1 -1
  388. package/src/post-template/style.scss +1 -1
  389. package/src/post-time-to-read/block.json +17 -1
  390. package/src/post-time-to-read/style.scss +4 -0
  391. package/src/preformatted/test/__snapshots__/transforms.native.js.snap +31 -0
  392. package/src/preformatted/test/transforms.native.js +42 -0
  393. package/src/pullquote/deprecated.js +2 -6
  394. package/src/pullquote/test/__snapshots__/transforms.native.js.snap +47 -0
  395. package/src/pullquote/test/transforms.native.js +46 -0
  396. package/src/query/edit/query-placeholder.js +10 -5
  397. package/src/query/test/utils.js +33 -1
  398. package/src/query/utils.js +19 -6
  399. package/src/query-title/index.php +2 -5
  400. package/src/quote/block.json +1 -0
  401. package/src/quote/test/__snapshots__/transforms.native.js.snap +39 -0
  402. package/src/quote/test/transforms.native.js +67 -0
  403. package/src/search/style.scss +16 -12
  404. package/src/search/test/__snapshots__/edit.native.js.snap +11 -1
  405. package/src/search/test/__snapshots__/transforms.native.js.snap +15 -0
  406. package/src/search/test/transforms.native.js +40 -0
  407. package/src/separator/test/__snapshots__/transforms.native.js.snap +19 -0
  408. package/src/separator/test/transforms.native.js +42 -0
  409. package/src/shortcode/test/__snapshots__/transforms.native.js.snap +19 -0
  410. package/src/shortcode/test/transforms.native.js +42 -0
  411. package/src/social-links/test/__snapshots__/transforms.native.js.snap +31 -0
  412. package/src/social-links/test/transforms.native.js +53 -0
  413. package/src/spacer/edit.js +18 -5
  414. package/src/spacer/test/__snapshots__/transforms.native.js.snap +19 -0
  415. package/src/spacer/test/transforms.native.js +42 -0
  416. package/src/style.scss +1 -0
  417. package/src/table/state.js +8 -17
  418. package/src/template-part/edit/import-controls.js +2 -29
  419. package/src/template-part/edit/utils/transformers.js +96 -19
  420. package/src/text-columns/edit.js +1 -6
  421. package/src/text-columns/save.js +1 -6
  422. package/src/verse/test/__snapshots__/transforms.native.js.snap +25 -0
  423. package/src/verse/test/transforms.native.js +42 -0
  424. package/src/video/test/__snapshots__/transforms.native.js.snap +41 -0
  425. package/src/video/test/transforms.native.js +48 -0
  426. package/tsconfig.tsbuildinfo +1 -1
  427. package/src/cover/test/block-controls.js +0 -62
@@ -0,0 +1,324 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { screen, fireEvent, act, within } from '@testing-library/react';
5
+ import userEvent from '@testing-library/user-event';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import {
11
+ initializeEditor,
12
+ selectBlock,
13
+ } from 'test/integration/helpers/integration-test-editor';
14
+
15
+ async function setup( attributes ) {
16
+ const testBlock = { name: 'core/cover', attributes };
17
+ return initializeEditor( testBlock );
18
+ }
19
+
20
+ async function createAndSelectBlock() {
21
+ await userEvent.click(
22
+ screen.getByRole( 'button', {
23
+ name: 'Color: Black',
24
+ } )
25
+ );
26
+ await userEvent.click(
27
+ screen.getByRole( 'button', {
28
+ name: 'Select Cover',
29
+ } )
30
+ );
31
+ }
32
+
33
+ describe( 'Cover block', () => {
34
+ describe( 'Editor canvas', () => {
35
+ test( 'shows placeholder if background image and color not set', async () => {
36
+ await setup();
37
+
38
+ expect(
39
+ screen.getByRole( 'group', {
40
+ name: 'To edit this block, you need permission to upload media.',
41
+ } )
42
+ ).toBeInTheDocument();
43
+ } );
44
+
45
+ test( 'can set overlay color using color picker on block placeholder', async () => {
46
+ const { container } = await setup();
47
+ const colorPicker = screen.getByRole( 'button', {
48
+ name: 'Color: Black',
49
+ } );
50
+ await userEvent.click( colorPicker );
51
+ const color = colorPicker.style.backgroundColor;
52
+ expect(
53
+ screen.queryByRole( 'group', {
54
+ name: 'To edit this block, you need permission to upload media.',
55
+ } )
56
+ ).not.toBeInTheDocument();
57
+
58
+ // eslint-disable-next-line testing-library/no-node-access
59
+ const overlay = container.getElementsByClassName(
60
+ 'wp-block-cover__background'
61
+ );
62
+ expect( overlay[ 0 ] ).toHaveStyle(
63
+ `background-color: ${ color }`
64
+ );
65
+ } );
66
+
67
+ test( 'can have the title edited', async () => {
68
+ await setup();
69
+
70
+ await userEvent.click(
71
+ screen.getByRole( 'button', {
72
+ name: 'Color: Black',
73
+ } )
74
+ );
75
+
76
+ const title = screen.getByLabelText( 'Empty block;', {
77
+ exact: false,
78
+ } );
79
+ await userEvent.click( title );
80
+ await userEvent.keyboard( 'abc' );
81
+ expect( title ).toHaveTextContent( 'abc' );
82
+ } );
83
+ } );
84
+
85
+ describe( 'Block toolbar', () => {
86
+ test( 'full height toggle sets minHeight style attribute to 100vh when clicked', async () => {
87
+ await setup();
88
+ await createAndSelectBlock();
89
+
90
+ expect( screen.getByLabelText( 'Block: Cover' ) ).not.toHaveStyle(
91
+ 'min-height: 100vh;'
92
+ );
93
+
94
+ await userEvent.click(
95
+ screen.getByLabelText( 'Toggle full height' )
96
+ );
97
+
98
+ expect( screen.getByLabelText( 'Block: Cover' ) ).toHaveStyle(
99
+ 'min-height: 100vh;'
100
+ );
101
+ } );
102
+
103
+ test( 'content position button sets content position', async () => {
104
+ await setup();
105
+ await createAndSelectBlock();
106
+
107
+ await userEvent.click(
108
+ screen.getByLabelText( 'Change content position' )
109
+ );
110
+
111
+ expect( screen.getByLabelText( 'Block: Cover' ) ).not.toHaveClass(
112
+ 'has-custom-content-position'
113
+ );
114
+
115
+ await act( async () =>
116
+ within( screen.getByRole( 'grid' ) )
117
+ .getByRole( 'gridcell', {
118
+ name: 'top left',
119
+ } )
120
+ .focus()
121
+ );
122
+
123
+ expect( screen.getByLabelText( 'Block: Cover' ) ).toHaveClass(
124
+ 'has-custom-content-position'
125
+ );
126
+ expect( screen.getByLabelText( 'Block: Cover' ) ).toHaveClass(
127
+ 'is-position-top-left'
128
+ );
129
+ } );
130
+ } );
131
+
132
+ describe( 'Inspector controls', () => {
133
+ describe( 'Media settings', () => {
134
+ test( 'does not display media settings panel if url is not set', async () => {
135
+ await setup();
136
+ expect(
137
+ screen.queryByRole( 'button', {
138
+ name: 'Media settings',
139
+ } )
140
+ ).not.toBeInTheDocument();
141
+ } );
142
+ test( 'displays media settings panel if url is set', async () => {
143
+ await setup( {
144
+ url: 'http://localhost/my-image.jpg',
145
+ } );
146
+
147
+ await selectBlock( 'Block: Cover' );
148
+ expect(
149
+ screen.getByRole( 'button', {
150
+ name: 'Media settings',
151
+ } )
152
+ ).toBeInTheDocument();
153
+ } );
154
+ } );
155
+
156
+ test( 'sets hasParallax attribute to true if fixed background toggled', async () => {
157
+ await setup( {
158
+ url: 'http://localhost/my-image.jpg',
159
+ } );
160
+ expect( screen.getByLabelText( 'Block: Cover' ) ).not.toHaveClass(
161
+ 'has-parallax'
162
+ );
163
+ await selectBlock( 'Block: Cover' );
164
+ await userEvent.click(
165
+ screen.getByLabelText( 'Fixed background' )
166
+ );
167
+ expect( screen.getByLabelText( 'Block: Cover' ) ).toHaveClass(
168
+ 'has-parallax'
169
+ );
170
+ } );
171
+
172
+ test( 'sets isRepeated attribute to true if repeated background toggled', async () => {
173
+ await setup( {
174
+ url: 'http://localhost/my-image.jpg',
175
+ } );
176
+ expect( screen.getByLabelText( 'Block: Cover' ) ).not.toHaveClass(
177
+ 'is-repeated'
178
+ );
179
+ await selectBlock( 'Block: Cover' );
180
+ await userEvent.click(
181
+ screen.getByLabelText( 'Repeated background' )
182
+ );
183
+ expect( screen.getByLabelText( 'Block: Cover' ) ).toHaveClass(
184
+ 'is-repeated'
185
+ );
186
+ } );
187
+
188
+ test( 'sets left focalPoint attribute when focal point values changed', async () => {
189
+ await setup( {
190
+ url: 'http://localhost/my-image.jpg',
191
+ } );
192
+
193
+ await selectBlock( 'Block: Cover' );
194
+ await userEvent.clear( screen.getByLabelText( 'Left' ) );
195
+ await userEvent.type( screen.getByLabelText( 'Left' ), '100' );
196
+
197
+ expect(
198
+ within( screen.getByLabelText( 'Block: Cover' ) ).getByRole(
199
+ 'img'
200
+ )
201
+ ).toHaveStyle( 'object-position: 100% 50%;' );
202
+ } );
203
+
204
+ test( 'sets alt attribute if text entered in alt text box', async () => {
205
+ await setup( {
206
+ url: 'http://localhost/my-image.jpg',
207
+ } );
208
+
209
+ await selectBlock( 'Block: Cover' );
210
+ await userEvent.type(
211
+ screen.getByLabelText( 'Alt text (alternative text)' ),
212
+ 'Me'
213
+ );
214
+ expect( screen.getByAltText( 'Me' ) ).toBeInTheDocument();
215
+ } );
216
+
217
+ test( 'clears media when clear media button clicked', async () => {
218
+ await setup( {
219
+ url: 'http://localhost/my-image.jpg',
220
+ } );
221
+
222
+ await selectBlock( 'Block: Cover' );
223
+ expect(
224
+ within( screen.getByLabelText( 'Block: Cover' ) ).getByRole(
225
+ 'img'
226
+ )
227
+ ).toBeInTheDocument();
228
+
229
+ await userEvent.click(
230
+ screen.getByRole( 'button', {
231
+ name: 'Clear Media',
232
+ } )
233
+ );
234
+ expect(
235
+ within( screen.queryByLabelText( 'Block: Cover' ) ).queryByRole(
236
+ 'img'
237
+ )
238
+ ).not.toBeInTheDocument();
239
+ } );
240
+
241
+ describe( 'Color panel', () => {
242
+ test( 'applies selected opacity to block when number control value changed', async () => {
243
+ const { container } = await setup();
244
+
245
+ await createAndSelectBlock();
246
+
247
+ // eslint-disable-next-line testing-library/no-node-access
248
+ const overlay = container.getElementsByClassName(
249
+ 'wp-block-cover__background'
250
+ );
251
+
252
+ expect( overlay[ 0 ] ).toHaveClass( 'has-background-dim-100' );
253
+
254
+ await userEvent.click(
255
+ screen.getByRole( 'tab', {
256
+ name: 'Styles',
257
+ } )
258
+ );
259
+
260
+ fireEvent.change(
261
+ screen.getByRole( 'spinbutton', {
262
+ name: 'Overlay opacity',
263
+ } ),
264
+ {
265
+ target: { value: '40' },
266
+ }
267
+ );
268
+
269
+ expect( overlay[ 0 ] ).toHaveClass( 'has-background-dim-40' );
270
+ } );
271
+
272
+ test( 'applies selected opacity to block when slider moved', async () => {
273
+ const { container } = await setup();
274
+
275
+ await createAndSelectBlock();
276
+
277
+ // eslint-disable-next-line testing-library/no-node-access
278
+ const overlay = container.getElementsByClassName(
279
+ 'wp-block-cover__background'
280
+ );
281
+
282
+ expect( overlay[ 0 ] ).toHaveClass( 'has-background-dim-100' );
283
+
284
+ await userEvent.click(
285
+ screen.getByRole( 'tab', {
286
+ name: 'Styles',
287
+ } )
288
+ );
289
+
290
+ fireEvent.change(
291
+ screen.getByRole( 'slider', {
292
+ name: 'Overlay opacity',
293
+ } ),
294
+ { target: { value: 30 } }
295
+ );
296
+
297
+ expect( overlay[ 0 ] ).toHaveClass( 'has-background-dim-30' );
298
+ } );
299
+ } );
300
+
301
+ describe( 'Dimensions panel', () => {
302
+ test( 'sets minHeight attribute when number control value changed', async () => {
303
+ await setup();
304
+ await createAndSelectBlock();
305
+ await userEvent.click(
306
+ screen.getByRole( 'tab', {
307
+ name: 'Styles',
308
+ } )
309
+ );
310
+ await userEvent.clear(
311
+ screen.getByLabelText( 'Minimum height of cover' )
312
+ );
313
+ await userEvent.type(
314
+ screen.getByLabelText( 'Minimum height of cover' ),
315
+ '300'
316
+ );
317
+
318
+ expect( screen.getByLabelText( 'Block: Cover' ) ).toHaveStyle(
319
+ 'min-height: 300px;'
320
+ );
321
+ } );
322
+ } );
323
+ } );
324
+ } );
@@ -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;