@wordpress/block-library 11.0.2-next.v.202609171837.0 → 11.2.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 (686) hide show
  1. package/CHANGELOG.md +44 -1
  2. package/build/accordion/block.json +4 -1
  3. package/build/accordion-heading/block.json +1 -0
  4. package/build/accordion-item/block.json +7 -1
  5. package/build/accordion-panel/block.json +9 -1
  6. package/build/archives/block.json +12 -0
  7. package/build/audio/block.json +8 -0
  8. package/build/audio/edit.cjs +2 -1
  9. package/build/audio/edit.cjs.map +2 -2
  10. package/build/avatar/block.json +4 -0
  11. package/build/avatar/edit.cjs +31 -1
  12. package/build/avatar/edit.cjs.map +3 -3
  13. package/build/breadcrumbs/block.json +3 -0
  14. package/build/breadcrumbs/edit.cjs.map +3 -3
  15. package/build/button/block.json +6 -0
  16. package/build/button/edit.cjs +9 -6
  17. package/build/button/edit.cjs.map +2 -2
  18. package/build/buttons/block.json +15 -1
  19. package/build/categories/block.json +12 -1
  20. package/build/code/block.json +13 -0
  21. package/build/column/block.json +9 -0
  22. package/build/column/edit.cjs +5 -0
  23. package/build/column/edit.cjs.map +2 -2
  24. package/build/columns/block.json +13 -0
  25. package/build/columns/edit.cjs +21 -112
  26. package/build/columns/edit.cjs.map +3 -3
  27. package/build/comment-author-name/block.json +3 -0
  28. package/build/comment-content/block.json +5 -0
  29. package/build/comment-date/block.json +3 -0
  30. package/build/comment-edit-link/block.json +3 -0
  31. package/build/comment-reply-link/block.json +3 -0
  32. package/build/comments/block.json +10 -0
  33. package/build/comments/edit/placeholder.cjs +95 -87
  34. package/build/comments/edit/placeholder.cjs.map +2 -2
  35. package/build/comments-pagination/block.json +14 -0
  36. package/build/comments-pagination-next/block.json +3 -0
  37. package/build/comments-pagination-numbers/block.json +3 -0
  38. package/build/comments-pagination-previous/block.json +6 -0
  39. package/build/comments-title/block.json +3 -0
  40. package/build/cover/block.json +2 -1
  41. package/build/cover/edit/index.cjs +30 -6
  42. package/build/cover/edit/index.cjs.map +2 -2
  43. package/build/cover/edit/inspector-controls.cjs +56 -14
  44. package/build/cover/edit/inspector-controls.cjs.map +2 -2
  45. package/build/cover/embed-video-utils.cjs +9 -8
  46. package/build/cover/embed-video-utils.cjs.map +2 -2
  47. package/build/cover/view.cjs +21 -0
  48. package/build/cover/view.cjs.map +7 -0
  49. package/build/details/block.json +14 -0
  50. package/build/embed/block.json +6 -1
  51. package/build/file/block.json +14 -0
  52. package/build/footnotes/block.json +13 -0
  53. package/build/gallery/block.json +22 -0
  54. package/build/gallery/dynamic-gallery.cjs +32 -93
  55. package/build/gallery/dynamic-gallery.cjs.map +3 -3
  56. package/build/gallery/edit.cjs +104 -42
  57. package/build/gallery/edit.cjs.map +2 -2
  58. package/build/gallery/order-controls.cjs +107 -0
  59. package/build/gallery/order-controls.cjs.map +7 -0
  60. package/build/gallery/order-images.cjs +92 -0
  61. package/build/gallery/order-images.cjs.map +7 -0
  62. package/build/gallery/order-options.cjs +62 -0
  63. package/build/gallery/order-options.cjs.map +7 -0
  64. package/build/gallery/use-dynamic-gallery.cjs +1 -7
  65. package/build/gallery/use-dynamic-gallery.cjs.map +2 -2
  66. package/build/gallery/use-get-media.cjs +2 -3
  67. package/build/gallery/use-get-media.cjs.map +2 -2
  68. package/build/group/block.json +1 -0
  69. package/build/group/edit.cjs +3 -3
  70. package/build/group/edit.cjs.map +2 -2
  71. package/build/heading/block.json +14 -0
  72. package/build/home-link/block.json +30 -0
  73. package/build/home-link/edit.cjs.map +3 -3
  74. package/build/icon/components/custom-inserter/index.cjs +3 -1
  75. package/build/icon/components/custom-inserter/index.cjs.map +2 -2
  76. package/build/icon/edit.cjs +49 -5
  77. package/build/icon/edit.cjs.map +2 -2
  78. package/build/image/image.cjs +10 -8
  79. package/build/image/image.cjs.map +3 -3
  80. package/build/image/use-open-image-media-editor-modal.cjs +32 -8
  81. package/build/image/use-open-image-media-editor-modal.cjs.map +2 -2
  82. package/build/image/view.cjs +44 -50
  83. package/build/image/view.cjs.map +2 -2
  84. package/build/latest-comments/block.json +20 -0
  85. package/build/latest-posts/block.json +14 -0
  86. package/build/list/block.json +12 -1
  87. package/build/list-item/block.json +8 -1
  88. package/build/list-item/index.cjs +4 -0
  89. package/build/list-item/index.cjs.map +3 -3
  90. package/build/loginout/block.json +14 -0
  91. package/build/math/block.json +14 -0
  92. package/build/media-text/block.json +19 -0
  93. package/build/navigation/edit/index.cjs +1 -4
  94. package/build/navigation/edit/index.cjs.map +2 -2
  95. package/build/navigation-link/link-ui/index.cjs +33 -19
  96. package/build/navigation-link/link-ui/index.cjs.map +2 -2
  97. package/build/navigation-link/link-ui/page-creator.cjs.map +3 -3
  98. package/build/navigation-link/shared/controls.cjs.map +3 -3
  99. package/build/navigation-link/shared/index.cjs +5 -0
  100. package/build/navigation-link/shared/index.cjs.map +2 -2
  101. package/build/navigation-link/shared/use-block-suggestions.cjs +141 -0
  102. package/build/navigation-link/shared/use-block-suggestions.cjs.map +7 -0
  103. package/build/navigation-link/shared/use-link-preview.cjs +13 -13
  104. package/build/navigation-link/shared/use-link-preview.cjs.map +2 -2
  105. package/build/navigation-overlay-close/block.json +7 -0
  106. package/build/navigation-submenu/block.json +6 -0
  107. package/build/navigation-submenu/edit.cjs +9 -1
  108. package/build/navigation-submenu/edit.cjs.map +3 -3
  109. package/build/page-list/block.json +14 -0
  110. package/build/paragraph/block.json +1 -0
  111. package/build/paragraph/edit.cjs +1 -2
  112. package/build/paragraph/edit.cjs.map +2 -2
  113. package/build/playlist/block.json +1 -0
  114. package/build/post-author-biography/block.json +5 -0
  115. package/build/post-author-name/block.json +5 -0
  116. package/build/post-comments-count/block.json +3 -0
  117. package/build/post-comments-form/block.json +15 -0
  118. package/build/post-content/block.json +4 -1
  119. package/build/post-date/block.json +3 -0
  120. package/build/post-excerpt/block.json +9 -0
  121. package/build/post-featured-image/block.json +1 -0
  122. package/build/post-featured-image/edit.cjs +12 -10
  123. package/build/post-featured-image/edit.cjs.map +2 -2
  124. package/build/post-navigation-link/block.json +30 -0
  125. package/build/post-navigation-link/edit.cjs +13 -2
  126. package/build/post-navigation-link/edit.cjs.map +3 -3
  127. package/build/post-template/block.json +13 -1
  128. package/build/post-terms/block.json +10 -0
  129. package/build/post-time-to-read/block.json +10 -0
  130. package/build/post-title/block.json +14 -0
  131. package/build/preformatted/block.json +11 -0
  132. package/build/pullquote/block.json +3 -1
  133. package/build/query-no-results/block.json +14 -2
  134. package/build/query-pagination/block.json +20 -0
  135. package/build/query-pagination-next/block.json +3 -0
  136. package/build/query-pagination-numbers/block.json +3 -0
  137. package/build/query-pagination-previous/block.json +3 -0
  138. package/build/query-title/block.json +3 -0
  139. package/build/query-total/block.json +10 -0
  140. package/build/quote/block.json +3 -0
  141. package/build/read-more/block.json +11 -0
  142. package/build/rss/block.json +10 -0
  143. package/build/search/block.json +2 -1
  144. package/build/site-tagline/block.json +12 -1
  145. package/build/site-title/block.json +11 -1
  146. package/build/social-links/block.json +4 -0
  147. package/build/social-links/edit.cjs +2 -3
  148. package/build/social-links/edit.cjs.map +2 -2
  149. package/build/tab-list/block.json +4 -0
  150. package/build/tab-list/edit.cjs +3 -1
  151. package/build/tab-list/edit.cjs.map +3 -3
  152. package/build/tab-list/save.cjs +3 -1
  153. package/build/tab-list/save.cjs.map +3 -3
  154. package/build/tab-panel/block.json +25 -0
  155. package/build/tab-panel/controls.cjs.map +3 -3
  156. package/build/tab-panels/block.json +21 -1
  157. package/build/table-of-contents/block.json +7 -0
  158. package/build/tabs/block.json +27 -1
  159. package/build/tag-cloud/block.json +19 -0
  160. package/build/template-part/edit/selection-modal.cjs.map +1 -1
  161. package/build/term-count/block.json +12 -0
  162. package/build/term-description/block.json +13 -0
  163. package/build/term-name/block.json +16 -1
  164. package/build/term-template/block.json +14 -1
  165. package/build/utils/search-patterns.cjs +7 -43
  166. package/build/utils/search-patterns.cjs.map +3 -3
  167. package/build/utils/style-state.cjs +4 -6
  168. package/build/utils/style-state.cjs.map +2 -2
  169. package/build/utils/waveform-utils.cjs +2 -2
  170. package/build/utils/waveform-utils.cjs.map +2 -2
  171. package/build/verse/block.json +4 -0
  172. package/build/video/block.json +12 -0
  173. package/build/video/edit.cjs +30 -14
  174. package/build/video/edit.cjs.map +3 -3
  175. package/build/video/index.cjs +0 -2
  176. package/build/video/index.cjs.map +3 -3
  177. package/build/video/save.cjs +5 -1
  178. package/build/video/save.cjs.map +3 -3
  179. package/build-module/accordion/block.json +4 -1
  180. package/build-module/accordion-heading/block.json +1 -0
  181. package/build-module/accordion-item/block.json +7 -1
  182. package/build-module/accordion-panel/block.json +9 -1
  183. package/build-module/archives/block.json +12 -0
  184. package/build-module/audio/block.json +8 -0
  185. package/build-module/audio/edit.mjs +2 -1
  186. package/build-module/audio/edit.mjs.map +2 -2
  187. package/build-module/avatar/block.json +4 -0
  188. package/build-module/avatar/edit.mjs +33 -2
  189. package/build-module/avatar/edit.mjs.map +2 -2
  190. package/build-module/breadcrumbs/block.json +3 -0
  191. package/build-module/breadcrumbs/edit.mjs +3 -3
  192. package/build-module/breadcrumbs/edit.mjs.map +2 -2
  193. package/build-module/button/block.json +6 -0
  194. package/build-module/button/edit.mjs +11 -7
  195. package/build-module/button/edit.mjs.map +2 -2
  196. package/build-module/buttons/block.json +15 -1
  197. package/build-module/categories/block.json +12 -1
  198. package/build-module/code/block.json +13 -0
  199. package/build-module/column/block.json +9 -0
  200. package/build-module/column/edit.mjs +5 -0
  201. package/build-module/column/edit.mjs.map +2 -2
  202. package/build-module/columns/block.json +13 -0
  203. package/build-module/columns/edit.mjs +22 -122
  204. package/build-module/columns/edit.mjs.map +2 -2
  205. package/build-module/comment-author-name/block.json +3 -0
  206. package/build-module/comment-content/block.json +5 -0
  207. package/build-module/comment-date/block.json +3 -0
  208. package/build-module/comment-edit-link/block.json +3 -0
  209. package/build-module/comment-reply-link/block.json +3 -0
  210. package/build-module/comments/block.json +10 -0
  211. package/build-module/comments/edit/placeholder.mjs +95 -87
  212. package/build-module/comments/edit/placeholder.mjs.map +2 -2
  213. package/build-module/comments-pagination/block.json +14 -0
  214. package/build-module/comments-pagination-next/block.json +3 -0
  215. package/build-module/comments-pagination-numbers/block.json +3 -0
  216. package/build-module/comments-pagination-previous/block.json +6 -0
  217. package/build-module/comments-title/block.json +3 -0
  218. package/build-module/cover/block.json +2 -1
  219. package/build-module/cover/edit/index.mjs +36 -7
  220. package/build-module/cover/edit/index.mjs.map +2 -2
  221. package/build-module/cover/edit/inspector-controls.mjs +62 -16
  222. package/build-module/cover/edit/inspector-controls.mjs.map +2 -2
  223. package/build-module/cover/embed-video-utils.mjs +9 -8
  224. package/build-module/cover/embed-video-utils.mjs.map +2 -2
  225. package/build-module/cover/view.mjs +19 -0
  226. package/build-module/cover/view.mjs.map +7 -0
  227. package/build-module/details/block.json +14 -0
  228. package/build-module/embed/block.json +6 -1
  229. package/build-module/file/block.json +14 -0
  230. package/build-module/footnotes/block.json +13 -0
  231. package/build-module/gallery/block.json +22 -0
  232. package/build-module/gallery/dynamic-gallery.mjs +33 -97
  233. package/build-module/gallery/dynamic-gallery.mjs.map +2 -2
  234. package/build-module/gallery/edit.mjs +111 -44
  235. package/build-module/gallery/edit.mjs.map +2 -2
  236. package/build-module/gallery/order-controls.mjs +87 -0
  237. package/build-module/gallery/order-controls.mjs.map +7 -0
  238. package/build-module/gallery/order-images.mjs +66 -0
  239. package/build-module/gallery/order-images.mjs.map +7 -0
  240. package/build-module/gallery/order-options.mjs +33 -0
  241. package/build-module/gallery/order-options.mjs.map +7 -0
  242. package/build-module/gallery/use-dynamic-gallery.mjs +1 -7
  243. package/build-module/gallery/use-dynamic-gallery.mjs.map +2 -2
  244. package/build-module/gallery/use-get-media.mjs +2 -3
  245. package/build-module/gallery/use-get-media.mjs.map +2 -2
  246. package/build-module/group/block.json +1 -0
  247. package/build-module/group/edit.mjs +4 -4
  248. package/build-module/group/edit.mjs.map +2 -2
  249. package/build-module/heading/block.json +14 -0
  250. package/build-module/home-link/block.json +30 -0
  251. package/build-module/home-link/edit.mjs +2 -2
  252. package/build-module/home-link/edit.mjs.map +2 -2
  253. package/build-module/icon/components/custom-inserter/index.mjs +3 -1
  254. package/build-module/icon/components/custom-inserter/index.mjs.map +2 -2
  255. package/build-module/icon/edit.mjs +50 -6
  256. package/build-module/icon/edit.mjs.map +2 -2
  257. package/build-module/image/image.mjs +12 -10
  258. package/build-module/image/image.mjs.map +2 -2
  259. package/build-module/image/use-open-image-media-editor-modal.mjs +32 -8
  260. package/build-module/image/use-open-image-media-editor-modal.mjs.map +2 -2
  261. package/build-module/image/view.mjs +44 -50
  262. package/build-module/image/view.mjs.map +2 -2
  263. package/build-module/latest-comments/block.json +20 -0
  264. package/build-module/latest-posts/block.json +14 -0
  265. package/build-module/list/block.json +12 -1
  266. package/build-module/list-item/block.json +8 -1
  267. package/build-module/list-item/index.mjs +4 -0
  268. package/build-module/list-item/index.mjs.map +2 -2
  269. package/build-module/loginout/block.json +14 -0
  270. package/build-module/math/block.json +14 -0
  271. package/build-module/media-text/block.json +19 -0
  272. package/build-module/navigation/edit/index.mjs +1 -4
  273. package/build-module/navigation/edit/index.mjs.map +2 -2
  274. package/build-module/navigation-link/link-ui/index.mjs +39 -20
  275. package/build-module/navigation-link/link-ui/index.mjs.map +2 -2
  276. package/build-module/navigation-link/link-ui/page-creator.mjs +2 -2
  277. package/build-module/navigation-link/link-ui/page-creator.mjs.map +2 -2
  278. package/build-module/navigation-link/shared/controls.mjs +2 -2
  279. package/build-module/navigation-link/shared/controls.mjs.map +2 -2
  280. package/build-module/navigation-link/shared/index.mjs +6 -0
  281. package/build-module/navigation-link/shared/index.mjs.map +2 -2
  282. package/build-module/navigation-link/shared/use-block-suggestions.mjs +120 -0
  283. package/build-module/navigation-link/shared/use-block-suggestions.mjs.map +7 -0
  284. package/build-module/navigation-link/shared/use-link-preview.mjs +13 -13
  285. package/build-module/navigation-link/shared/use-link-preview.mjs.map +2 -2
  286. package/build-module/navigation-overlay-close/block.json +7 -0
  287. package/build-module/navigation-submenu/block.json +6 -0
  288. package/build-module/navigation-submenu/edit.mjs +11 -2
  289. package/build-module/navigation-submenu/edit.mjs.map +2 -2
  290. package/build-module/page-list/block.json +14 -0
  291. package/build-module/paragraph/block.json +1 -0
  292. package/build-module/paragraph/edit.mjs +1 -2
  293. package/build-module/paragraph/edit.mjs.map +2 -2
  294. package/build-module/playlist/block.json +1 -0
  295. package/build-module/post-author-biography/block.json +5 -0
  296. package/build-module/post-author-name/block.json +5 -0
  297. package/build-module/post-comments-count/block.json +3 -0
  298. package/build-module/post-comments-form/block.json +15 -0
  299. package/build-module/post-content/block.json +4 -1
  300. package/build-module/post-date/block.json +3 -0
  301. package/build-module/post-excerpt/block.json +9 -0
  302. package/build-module/post-featured-image/block.json +1 -0
  303. package/build-module/post-featured-image/edit.mjs +12 -10
  304. package/build-module/post-featured-image/edit.mjs.map +2 -2
  305. package/build-module/post-navigation-link/block.json +30 -0
  306. package/build-module/post-navigation-link/edit.mjs +17 -3
  307. package/build-module/post-navigation-link/edit.mjs.map +2 -2
  308. package/build-module/post-template/block.json +13 -1
  309. package/build-module/post-terms/block.json +10 -0
  310. package/build-module/post-time-to-read/block.json +10 -0
  311. package/build-module/post-title/block.json +14 -0
  312. package/build-module/preformatted/block.json +11 -0
  313. package/build-module/pullquote/block.json +3 -1
  314. package/build-module/query-no-results/block.json +14 -2
  315. package/build-module/query-pagination/block.json +20 -0
  316. package/build-module/query-pagination-next/block.json +3 -0
  317. package/build-module/query-pagination-numbers/block.json +3 -0
  318. package/build-module/query-pagination-previous/block.json +3 -0
  319. package/build-module/query-title/block.json +3 -0
  320. package/build-module/query-total/block.json +10 -0
  321. package/build-module/quote/block.json +3 -0
  322. package/build-module/read-more/block.json +11 -0
  323. package/build-module/rss/block.json +10 -0
  324. package/build-module/search/block.json +2 -1
  325. package/build-module/site-tagline/block.json +12 -1
  326. package/build-module/site-title/block.json +11 -1
  327. package/build-module/social-links/block.json +4 -0
  328. package/build-module/social-links/edit.mjs +2 -3
  329. package/build-module/social-links/edit.mjs.map +2 -2
  330. package/build-module/tab-list/block.json +4 -0
  331. package/build-module/tab-list/edit.mjs +4 -1
  332. package/build-module/tab-list/edit.mjs.map +2 -2
  333. package/build-module/tab-list/save.mjs +4 -1
  334. package/build-module/tab-list/save.mjs.map +2 -2
  335. package/build-module/tab-panel/block.json +25 -0
  336. package/build-module/tab-panel/controls.mjs +2 -2
  337. package/build-module/tab-panel/controls.mjs.map +2 -2
  338. package/build-module/tab-panels/block.json +21 -1
  339. package/build-module/table-of-contents/block.json +7 -0
  340. package/build-module/tabs/block.json +27 -1
  341. package/build-module/tag-cloud/block.json +19 -0
  342. package/build-module/template-part/edit/selection-modal.mjs.map +1 -1
  343. package/build-module/term-count/block.json +12 -0
  344. package/build-module/term-description/block.json +13 -0
  345. package/build-module/term-name/block.json +16 -1
  346. package/build-module/term-template/block.json +14 -1
  347. package/build-module/utils/search-patterns.mjs +7 -32
  348. package/build-module/utils/search-patterns.mjs.map +2 -2
  349. package/build-module/utils/style-state.mjs +6 -4
  350. package/build-module/utils/style-state.mjs.map +2 -2
  351. package/build-module/utils/waveform-utils.mjs +1 -1
  352. package/build-module/utils/waveform-utils.mjs.map +1 -1
  353. package/build-module/verse/block.json +4 -0
  354. package/build-module/video/block.json +12 -0
  355. package/build-module/video/edit.mjs +32 -15
  356. package/build-module/video/edit.mjs.map +2 -2
  357. package/build-module/video/index.mjs +0 -2
  358. package/build-module/video/index.mjs.map +2 -2
  359. package/build-module/video/save.mjs +7 -2
  360. package/build-module/video/save.mjs.map +2 -2
  361. package/build-style/avatar/editor-rtl.css +4 -0
  362. package/build-style/avatar/editor.css +4 -0
  363. package/build-style/comments-pagination/style-rtl.css +3 -0
  364. package/build-style/comments-pagination/style.css +3 -0
  365. package/build-style/common-rtl.css +32 -1
  366. package/build-style/common.css +35 -2
  367. package/build-style/editor-rtl.css +23 -6
  368. package/build-style/editor.css +23 -6
  369. package/build-style/embed/style-rtl.css +4 -1
  370. package/build-style/embed/style.css +4 -1
  371. package/build-style/gallery/editor-rtl.css +1 -3
  372. package/build-style/gallery/editor.css +1 -3
  373. package/build-style/image/editor-rtl.css +6 -0
  374. package/build-style/image/editor.css +6 -0
  375. package/build-style/image/style-rtl.css +11 -2
  376. package/build-style/image/style.css +11 -2
  377. package/build-style/media-text/style-rtl.css +4 -1
  378. package/build-style/media-text/style.css +4 -1
  379. package/build-style/navigation/style-rtl.css +18 -3
  380. package/build-style/navigation/style.css +18 -3
  381. package/build-style/navigation-link/editor-rtl.css +3 -1
  382. package/build-style/navigation-link/editor.css +3 -1
  383. package/build-style/navigation-overlay-close/style-rtl.css +1 -1
  384. package/build-style/navigation-overlay-close/style.css +1 -1
  385. package/build-style/navigation-submenu/editor-rtl.css +3 -1
  386. package/build-style/navigation-submenu/editor.css +3 -1
  387. package/build-style/post-navigation-link/style-rtl.css +3 -0
  388. package/build-style/post-navigation-link/style.css +3 -0
  389. package/build-style/query-pagination/style-rtl.css +3 -0
  390. package/build-style/query-pagination/style.css +3 -0
  391. package/build-style/style-rtl.css +94 -13
  392. package/build-style/style.css +97 -14
  393. package/build-style/tab-panel/style-rtl.css +2 -0
  394. package/build-style/tab-panel/style.css +2 -0
  395. package/build-style/table/editor-rtl.css +6 -1
  396. package/build-style/table/editor.css +6 -1
  397. package/build-style/table/style-rtl.css +4 -2
  398. package/build-style/table/style.css +4 -2
  399. package/build-style/tag-cloud/style-rtl.css +1 -1
  400. package/build-style/tag-cloud/style.css +1 -1
  401. package/build-style/verse/style-rtl.css +8 -1
  402. package/build-style/verse/style.css +8 -1
  403. package/build-types/gallery/order-controls.d.ts +58 -0
  404. package/build-types/gallery/order-controls.d.ts.map +1 -0
  405. package/build-types/gallery/order-options.d.ts +67 -0
  406. package/build-types/gallery/order-options.d.ts.map +1 -0
  407. package/package.json +46 -44
  408. package/src/accordion/README.md +3 -0
  409. package/src/accordion/block.json +4 -1
  410. package/src/accordion-heading/README.md +1 -0
  411. package/src/accordion-heading/block.json +1 -0
  412. package/src/accordion-item/README.md +5 -0
  413. package/src/accordion-item/block.json +7 -1
  414. package/src/accordion-panel/README.md +7 -0
  415. package/src/accordion-panel/block.json +9 -1
  416. package/src/archives/README.md +6 -0
  417. package/src/archives/block.json +12 -0
  418. package/src/audio/README.md +4 -0
  419. package/src/audio/block.json +8 -0
  420. package/src/audio/edit.jsx +2 -1
  421. package/src/avatar/README.md +2 -0
  422. package/src/avatar/block.json +4 -0
  423. package/src/avatar/edit.jsx +48 -2
  424. package/src/avatar/editor.scss +4 -0
  425. package/src/avatar/index.php +5 -3
  426. package/src/breadcrumbs/README.md +2 -0
  427. package/src/breadcrumbs/block.json +3 -0
  428. package/src/breadcrumbs/edit.jsx +3 -3
  429. package/src/breadcrumbs/index.php +1 -1
  430. package/src/button/README.md +4 -0
  431. package/src/button/block.json +6 -0
  432. package/src/button/edit.jsx +47 -52
  433. package/src/button/index.php +47 -0
  434. package/src/buttons/README.md +8 -0
  435. package/src/buttons/block.json +15 -1
  436. package/src/categories/README.md +6 -0
  437. package/src/categories/block.json +12 -1
  438. package/src/code/README.md +7 -0
  439. package/src/code/block.json +13 -0
  440. package/src/column/README.md +4 -0
  441. package/src/column/block.json +9 -0
  442. package/src/column/edit.jsx +6 -0
  443. package/src/columns/README.md +7 -0
  444. package/src/columns/block.json +13 -0
  445. package/src/columns/edit.jsx +1 -131
  446. package/src/comment-author-name/README.md +2 -0
  447. package/src/comment-author-name/block.json +3 -0
  448. package/src/comment-content/README.md +4 -0
  449. package/src/comment-content/block.json +5 -0
  450. package/src/comment-date/README.md +2 -0
  451. package/src/comment-date/block.json +3 -0
  452. package/src/comment-edit-link/README.md +2 -0
  453. package/src/comment-edit-link/block.json +3 -0
  454. package/src/comment-reply-link/README.md +2 -0
  455. package/src/comment-reply-link/block.json +3 -0
  456. package/src/comments/README.md +5 -0
  457. package/src/comments/block.json +10 -0
  458. package/src/comments/edit/placeholder.jsx +5 -1
  459. package/src/comments-pagination/README.md +6 -0
  460. package/src/comments-pagination/block.json +14 -0
  461. package/src/comments-pagination/style.scss +3 -0
  462. package/src/comments-pagination-next/README.md +2 -0
  463. package/src/comments-pagination-next/block.json +3 -0
  464. package/src/comments-pagination-numbers/README.md +2 -0
  465. package/src/comments-pagination-numbers/block.json +3 -0
  466. package/src/comments-pagination-previous/README.md +2 -0
  467. package/src/comments-pagination-previous/block.json +6 -0
  468. package/src/comments-title/README.md +2 -0
  469. package/src/comments-title/block.json +3 -0
  470. package/src/common.scss +38 -0
  471. package/src/cover/README.md +1 -0
  472. package/src/cover/block.json +2 -1
  473. package/src/cover/edit/index.jsx +41 -6
  474. package/src/cover/edit/inspector-controls.jsx +74 -14
  475. package/src/cover/embed-video-utils.js +18 -10
  476. package/src/cover/index.php +44 -15
  477. package/src/cover/test/edit.browser.test.js +200 -4
  478. package/src/cover/test/embed-video-utils.test.js +48 -0
  479. package/src/cover/view.js +22 -0
  480. package/src/details/README.md +8 -0
  481. package/src/details/block.json +14 -0
  482. package/src/embed/README.md +4 -0
  483. package/src/embed/block.json +6 -1
  484. package/src/embed/style.scss +7 -1
  485. package/src/file/README.md +8 -0
  486. package/src/file/block.json +14 -0
  487. package/src/footnotes/README.md +7 -0
  488. package/src/footnotes/block.json +13 -0
  489. package/src/gallery/README.md +17 -0
  490. package/src/gallery/block.json +22 -0
  491. package/src/gallery/dynamic-gallery.jsx +11 -91
  492. package/src/gallery/edit.jsx +147 -49
  493. package/src/gallery/editor.scss +5 -9
  494. package/src/gallery/order-controls.tsx +143 -0
  495. package/src/gallery/order-images.js +111 -0
  496. package/src/gallery/order-options.ts +75 -0
  497. package/src/gallery/test/edit.jsdom.test.js +87 -10
  498. package/src/gallery/test/order-images.js +162 -0
  499. package/src/gallery/use-dynamic-gallery.js +1 -9
  500. package/src/gallery/use-get-media.js +7 -2
  501. package/src/group/README.md +1 -0
  502. package/src/group/block.json +1 -0
  503. package/src/group/edit.jsx +5 -5
  504. package/src/heading/README.md +8 -0
  505. package/src/heading/block.json +14 -0
  506. package/src/home-link/README.md +11 -0
  507. package/src/home-link/block.json +30 -0
  508. package/src/home-link/edit.jsx +2 -2
  509. package/src/icon/components/custom-inserter/index.jsx +5 -1
  510. package/src/icon/edit.jsx +68 -7
  511. package/src/icon/index.php +10 -1
  512. package/src/image/editor.scss +8 -0
  513. package/src/image/image.jsx +13 -11
  514. package/src/image/index.php +3 -4
  515. package/src/image/style.scss +14 -2
  516. package/src/image/test/use-open-image-media-editor-modal.jsdom.test.js +201 -0
  517. package/src/image/use-open-image-media-editor-modal.js +37 -4
  518. package/src/image/view.js +64 -68
  519. package/src/latest-comments/README.md +8 -0
  520. package/src/latest-comments/block.json +20 -0
  521. package/src/latest-posts/README.md +8 -0
  522. package/src/latest-posts/block.json +14 -0
  523. package/src/list/README.md +6 -0
  524. package/src/list/block.json +12 -1
  525. package/src/list-item/README.md +6 -0
  526. package/src/list-item/block.json +8 -1
  527. package/src/list-item/index.js +5 -0
  528. package/src/loginout/README.md +8 -0
  529. package/src/loginout/block.json +14 -0
  530. package/src/math/README.md +8 -0
  531. package/src/math/block.json +14 -0
  532. package/src/media-text/README.md +18 -0
  533. package/src/media-text/block.json +19 -0
  534. package/src/media-text/style.scss +5 -1
  535. package/src/navigation/edit/index.jsx +2 -4
  536. package/src/navigation/style.scss +40 -4
  537. package/src/navigation/test/use-navigation-menu.jsdom.test.js +1 -1
  538. package/src/navigation-link/README.md +1 -1
  539. package/src/navigation-link/editor.scss +6 -1
  540. package/src/navigation-link/link-ui/index.jsx +60 -27
  541. package/src/navigation-link/link-ui/page-creator.jsx +2 -2
  542. package/src/navigation-link/link-ui/test/get-suggestions-query.jsdom.test.js +67 -0
  543. package/src/navigation-link/shared/controls.jsx +2 -2
  544. package/src/navigation-link/shared/index.js +4 -0
  545. package/src/navigation-link/shared/test/use-block-suggestions.jsdom.test.js +158 -0
  546. package/src/navigation-link/shared/test/use-entity-binding.jsdom.test.js +1 -7
  547. package/src/navigation-link/shared/test/use-link-preview.jsdom.test.js +22 -22
  548. package/src/navigation-link/shared/use-block-suggestions.js +192 -0
  549. package/src/navigation-link/shared/use-link-preview.js +15 -14
  550. package/src/navigation-overlay-close/README.md +1 -0
  551. package/src/navigation-overlay-close/block.json +7 -0
  552. package/src/navigation-overlay-close/style.scss +1 -1
  553. package/src/navigation-submenu/README.md +7 -0
  554. package/src/navigation-submenu/block.json +6 -0
  555. package/src/navigation-submenu/edit.jsx +11 -1
  556. package/src/navigation-submenu/editor.scss +6 -1
  557. package/src/navigation-submenu/index.php +11 -0
  558. package/src/page-list/README.md +8 -0
  559. package/src/page-list/block.json +14 -0
  560. package/src/paragraph/README.md +1 -0
  561. package/src/paragraph/block.json +1 -0
  562. package/src/paragraph/edit.jsx +1 -3
  563. package/src/playlist/README.md +1 -0
  564. package/src/playlist/block.json +1 -0
  565. package/src/playlist/test/edit-component.jsdom.test.jsx +11 -11
  566. package/src/playlist-track/test/edit.jsdom.test.jsx +3 -3
  567. package/src/post-author-biography/README.md +4 -0
  568. package/src/post-author-biography/block.json +5 -0
  569. package/src/post-author-name/README.md +4 -0
  570. package/src/post-author-name/block.json +5 -0
  571. package/src/post-comments-count/README.md +2 -0
  572. package/src/post-comments-count/block.json +3 -0
  573. package/src/post-comments-form/README.md +8 -0
  574. package/src/post-comments-form/block.json +15 -0
  575. package/src/post-content/README.md +3 -0
  576. package/src/post-content/block.json +4 -1
  577. package/src/post-date/README.md +2 -0
  578. package/src/post-date/block.json +3 -0
  579. package/src/post-excerpt/README.md +7 -0
  580. package/src/post-excerpt/block.json +9 -0
  581. package/src/post-featured-image/block.json +1 -0
  582. package/src/post-featured-image/edit.jsx +13 -11
  583. package/src/post-navigation-link/README.md +12 -0
  584. package/src/post-navigation-link/block.json +30 -0
  585. package/src/post-navigation-link/edit.jsx +23 -2
  586. package/src/post-navigation-link/index.php +94 -5
  587. package/src/post-navigation-link/style.scss +2 -0
  588. package/src/post-template/README.md +7 -0
  589. package/src/post-template/block.json +13 -1
  590. package/src/post-terms/README.md +8 -0
  591. package/src/post-terms/block.json +10 -0
  592. package/src/post-time-to-read/README.md +8 -0
  593. package/src/post-time-to-read/block.json +10 -0
  594. package/src/post-title/README.md +8 -0
  595. package/src/post-title/block.json +14 -0
  596. package/src/preformatted/README.md +9 -0
  597. package/src/preformatted/block.json +11 -0
  598. package/src/pullquote/README.md +2 -0
  599. package/src/pullquote/block.json +3 -1
  600. package/src/query-no-results/README.md +10 -0
  601. package/src/query-no-results/block.json +14 -2
  602. package/src/query-pagination/README.md +6 -0
  603. package/src/query-pagination/block.json +20 -0
  604. package/src/query-pagination/style.scss +3 -0
  605. package/src/query-pagination-next/README.md +2 -0
  606. package/src/query-pagination-next/block.json +3 -0
  607. package/src/query-pagination-numbers/README.md +2 -0
  608. package/src/query-pagination-numbers/block.json +3 -0
  609. package/src/query-pagination-previous/README.md +2 -0
  610. package/src/query-pagination-previous/block.json +3 -0
  611. package/src/query-title/README.md +2 -0
  612. package/src/query-title/block.json +3 -0
  613. package/src/query-total/README.md +8 -0
  614. package/src/query-total/block.json +10 -0
  615. package/src/quote/README.md +3 -0
  616. package/src/quote/block.json +3 -0
  617. package/src/read-more/README.md +8 -0
  618. package/src/read-more/block.json +11 -0
  619. package/src/rss/README.md +8 -0
  620. package/src/rss/block.json +10 -0
  621. package/src/search/README.md +1 -0
  622. package/src/search/block.json +2 -1
  623. package/src/site-tagline/README.md +9 -0
  624. package/src/site-tagline/block.json +12 -1
  625. package/src/site-title/README.md +8 -0
  626. package/src/site-title/block.json +11 -1
  627. package/src/social-links/README.md +3 -0
  628. package/src/social-links/block.json +4 -0
  629. package/src/social-links/edit.jsx +2 -3
  630. package/src/tab-list/README.md +2 -0
  631. package/src/tab-list/block.json +4 -0
  632. package/src/tab-list/edit.jsx +3 -0
  633. package/src/tab-list/save.jsx +3 -0
  634. package/src/tab-panel/README.md +9 -0
  635. package/src/tab-panel/block.json +25 -0
  636. package/src/tab-panel/controls.jsx +2 -2
  637. package/src/tab-panel/style.scss +5 -2
  638. package/src/tab-panels/README.md +9 -0
  639. package/src/tab-panels/block.json +21 -1
  640. package/src/table/editor.scss +8 -2
  641. package/src/table/style.scss +4 -4
  642. package/src/table-of-contents/README.md +6 -0
  643. package/src/table-of-contents/block.json +7 -0
  644. package/src/tabs/README.md +11 -0
  645. package/src/tabs/block.json +27 -1
  646. package/src/tag-cloud/README.md +9 -0
  647. package/src/tag-cloud/block.json +19 -0
  648. package/src/tag-cloud/style.scss +1 -1
  649. package/src/template-part/edit/selection-modal.jsx +1 -1
  650. package/src/template-part/index.php +16 -3
  651. package/src/term-count/README.md +10 -0
  652. package/src/term-count/block.json +12 -0
  653. package/src/term-description/README.md +8 -0
  654. package/src/term-description/block.json +13 -0
  655. package/src/term-name/README.md +9 -0
  656. package/src/term-name/block.json +16 -1
  657. package/src/term-name/index.php +1 -1
  658. package/src/term-template/README.md +8 -0
  659. package/src/term-template/block.json +14 -1
  660. package/src/utils/search-patterns.js +9 -53
  661. package/src/utils/style-state.js +6 -4
  662. package/src/utils/test/{search-patterns.js → search-patterns.jsdom.test.js} +1 -22
  663. package/src/utils/test/waveform-player-auto-init.jsdom.test.js +25 -0
  664. package/src/utils/test/waveform-player-dependency.jsdom.test.js +7 -60
  665. package/src/utils/test/waveform-utils.browser.test.js +3 -15
  666. package/src/utils/waveform-utils.js +1 -1
  667. package/src/verse/README.md +4 -0
  668. package/src/verse/block.json +4 -0
  669. package/src/verse/style.scss +11 -2
  670. package/src/video/README.md +11 -0
  671. package/src/video/block.json +12 -0
  672. package/src/video/edit.jsx +65 -49
  673. package/src/video/index.js +0 -2
  674. package/src/video/save.jsx +10 -1
  675. package/build/columns/utils.cjs +0 -112
  676. package/build/columns/utils.cjs.map +0 -7
  677. package/build/video/variations.cjs +0 -75
  678. package/build/video/variations.cjs.map +0 -7
  679. package/build-module/columns/utils.mjs +0 -78
  680. package/build-module/columns/utils.mjs.map +0 -7
  681. package/build-module/video/variations.mjs +0 -50
  682. package/build-module/video/variations.mjs.map +0 -7
  683. package/src/columns/test/utils.js +0 -331
  684. package/src/columns/utils.js +0 -176
  685. package/src/video/test/variations.js +0 -63
  686. package/src/video/variations.js +0 -62
@@ -94,17 +94,19 @@ function findVideoEmbedProvider(
94
94
  /**
95
95
  * Modifies embed HTML to use background video parameters.
96
96
  *
97
- * @param {string} html The original embed HTML.
97
+ * @param {string} html The original embed HTML.
98
+ * @param {Object} options Options.
99
+ * @param {boolean} options.autoplay Whether the video should start playing on load.
98
100
  * @return {string|null} The modified embed HTML, or null if not possible.
99
101
  */
100
- export function getBackgroundEmbedHtml( html ) {
102
+ export function getBackgroundEmbedHtml( html, { autoplay = true } = {} ) {
101
103
  const srcMatch = html?.match( /src=["']([^"']+)["']/ );
102
104
  if ( ! srcMatch ) {
103
105
  return null;
104
106
  }
105
107
 
106
108
  const iframeSrc = srcMatch[ 1 ];
107
- const backgroundSrc = getBackgroundVideoSrc( iframeSrc );
109
+ const backgroundSrc = getBackgroundVideoSrc( iframeSrc, { autoplay } );
108
110
  return html.replace( iframeSrc, backgroundSrc );
109
111
  }
110
112
 
@@ -150,10 +152,12 @@ export function detectProviderFromSrc( src ) {
150
152
  * Modifies an iframe src URL to add background video parameters.
151
153
  * Automatically detects the provider from the URL.
152
154
  *
153
- * @param {string} src The iframe src URL.
155
+ * @param {string} src The iframe src URL.
156
+ * @param {Object} options Options.
157
+ * @param {boolean} options.autoplay Whether the video should start playing on load.
154
158
  * @return {string} The modified URL.
155
159
  */
156
- export function getBackgroundVideoSrc( src ) {
160
+ export function getBackgroundVideoSrc( src, { autoplay = true } = {} ) {
157
161
  if ( ! src ) {
158
162
  return src;
159
163
  }
@@ -164,11 +168,14 @@ export function getBackgroundVideoSrc( src ) {
164
168
  // Detect provider from the iframe src URL
165
169
  const provider = detectProviderFromSrc( src );
166
170
 
171
+ if ( autoplay ) {
172
+ url.searchParams.set( 'autoplay', '1' );
173
+ }
174
+
167
175
  // Add provider-specific parameters for background video behavior
168
176
  switch ( provider ) {
169
177
  case 'youtube':
170
178
  // YouTube parameters for background video
171
- url.searchParams.set( 'autoplay', '1' );
172
179
  url.searchParams.set( 'mute', '1' );
173
180
  url.searchParams.set( 'loop', '1' );
174
181
  url.searchParams.set( 'controls', '0' );
@@ -185,24 +192,25 @@ export function getBackgroundVideoSrc( src ) {
185
192
 
186
193
  case 'vimeo':
187
194
  // Vimeo parameters for background video
188
- url.searchParams.set( 'autoplay', '1' );
189
195
  url.searchParams.set( 'muted', '1' );
190
196
  url.searchParams.set( 'loop', '1' );
191
- url.searchParams.set( 'background', '1' );
197
+ // Vimeo's background mode always autoplays, so it can only be
198
+ // used when autoplay is allowed.
199
+ if ( autoplay ) {
200
+ url.searchParams.set( 'background', '1' );
201
+ }
192
202
  url.searchParams.set( 'controls', '0' );
193
203
  break;
194
204
 
195
205
  case 'videopress':
196
206
  case 'wordpress-tv':
197
207
  // VideoPress parameters
198
- url.searchParams.set( 'autoplay', '1' );
199
208
  url.searchParams.set( 'loop', '1' );
200
209
  url.searchParams.set( 'muted', '1' );
201
210
  break;
202
211
 
203
212
  default:
204
213
  // Generic parameters that might work for other providers
205
- url.searchParams.set( 'autoplay', '1' );
206
214
  url.searchParams.set( 'muted', '1' );
207
215
  url.searchParams.set( 'loop', '1' );
208
216
  break;
@@ -26,6 +26,10 @@ function render_block_core_cover( $attributes, $content ) {
26
26
  ) {
27
27
  $url = $attributes['url'];
28
28
 
29
+ // The view script decides whether the embed may autoplay, so it is only
30
+ // needed for embed backgrounds.
31
+ wp_enqueue_script_module( '@wordpress/block-library/cover/view' );
32
+
29
33
  // Use WordPress's native oEmbed processing (includes caching).
30
34
  $oembed_html = wp_oembed_get( $url );
31
35
 
@@ -50,7 +54,8 @@ function render_block_core_cover( $attributes, $content ) {
50
54
  }
51
55
 
52
56
  // Modify iframe src to add background video parameters based on provider.
53
- $parsed_url = wp_parse_url( $iframe_src );
57
+ $parsed_url = wp_parse_url( $iframe_src );
58
+ $reduced_motion_src = null;
54
59
  if ( $parsed_url && isset( $parsed_url['host'] ) ) {
55
60
  // Parse existing query parameters.
56
61
  $query_params = array();
@@ -58,9 +63,12 @@ function render_block_core_cover( $attributes, $content ) {
58
63
  parse_str( $parsed_url['query'], $query_params );
59
64
  }
60
65
 
61
- // Add background video parameters based on provider.
66
+ // Add background video parameters based on provider. The
67
+ // autoplay parameters are kept separate so a source without
68
+ // them can also be built, which the view script swaps in for
69
+ // a visitor who has asked for reduced motion.
70
+ $autoplay_params = array();
62
71
  if ( 'youtube' === $provider ) {
63
- $query_params['autoplay'] = '1';
64
72
  $query_params['mute'] = '1';
65
73
  $query_params['loop'] = '1';
66
74
  $query_params['controls'] = '0';
@@ -74,32 +82,53 @@ function render_block_core_cover( $attributes, $content ) {
74
82
  if ( $video_id ) {
75
83
  $query_params['playlist'] = $video_id;
76
84
  }
85
+
86
+ $autoplay_params['autoplay'] = '1';
77
87
  } elseif ( 'vimeo' === $provider ) {
78
- $query_params['autoplay'] = '1';
79
88
  $query_params['muted'] = '1';
80
89
  $query_params['loop'] = '1';
81
- $query_params['background'] = '1';
82
90
  $query_params['controls'] = '0';
83
91
  $query_params['transparent'] = '0';
92
+
93
+ // Vimeo's background mode always autoplays, so it can only
94
+ // be used when autoplay is allowed.
95
+ $autoplay_params['autoplay'] = '1';
96
+ $autoplay_params['background'] = '1';
84
97
  } elseif ( 'videopress' === $provider || 'wordpress-tv' === $provider ) {
85
- $query_params['autoplay'] = '1';
86
- $query_params['loop'] = '1';
87
- $query_params['muted'] = '1';
98
+ $query_params['loop'] = '1';
99
+ $query_params['muted'] = '1';
100
+
101
+ $autoplay_params['autoplay'] = '1';
88
102
  }
89
103
 
90
104
  // Rebuild the URL with new parameters.
91
- $iframe_src = $parsed_url['scheme'] . '://' . $parsed_url['host'];
105
+ $iframe_base = $parsed_url['scheme'] . '://' . $parsed_url['host'];
92
106
  if ( isset( $parsed_url['path'] ) ) {
93
- $iframe_src .= $parsed_url['path'];
94
- }
95
- if ( ! empty( $query_params ) ) {
96
- $iframe_src .= '?' . http_build_query( $query_params );
107
+ $iframe_base .= $parsed_url['path'];
97
108
  }
109
+
110
+ $reduced_motion_src = empty( $query_params )
111
+ ? $iframe_base
112
+ : $iframe_base . '?' . http_build_query( $query_params );
113
+
114
+ $iframe_src = empty( $autoplay_params )
115
+ ? $reduced_motion_src
116
+ : $iframe_base . '?' . http_build_query( array_merge( $query_params, $autoplay_params ) );
98
117
  }
99
118
 
100
- // Build the iframe HTML that will replace the figure.
119
+ // Build the iframe HTML that will replace the figure. The server
120
+ // renders the autoplaying source, and the view script swaps in the
121
+ // one without autoplay for a visitor who prefers reduced motion.
101
122
  $iframe_html = sprintf(
102
- '<div class="wp-block-cover__video-background wp-block-cover__embed-background"><iframe src="%s" title="Background video" frameborder="0" allow="autoplay; fullscreen"></iframe></div>',
123
+ '<div class="wp-block-cover__video-background wp-block-cover__embed-background" data-wp-interactive="core/cover" data-wp-context=\'%s\'><iframe src="%s" data-wp-bind--src="state.videoSrc" title="Background video" frameborder="0" allow="autoplay; fullscreen"></iframe></div>',
124
+ esc_attr(
125
+ wp_json_encode(
126
+ array(
127
+ 'src' => $iframe_src,
128
+ 'reducedMotionSrc' => $reduced_motion_src,
129
+ )
130
+ )
131
+ ),
103
132
  esc_url( $iframe_src )
104
133
  );
105
134
 
@@ -1,12 +1,44 @@
1
- import { beforeEach, describe, expect, test } from 'vitest';
1
+ import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest';
2
2
  import { userEvent } from 'vitest/browser';
3
+ import {
4
+ cleanup as cleanupBrowser,
5
+ render as renderBrowser,
6
+ } from 'vitest-browser-react';
3
7
  import { screen, act, within, waitFor } from '@testing-library/react';
4
- import { createBlock } from '@wordpress/blocks';
8
+ import {
9
+ createBlock,
10
+ getBlockTypes,
11
+ unregisterBlockType,
12
+ } from '@wordpress/blocks';
13
+ import { createElement, useState } from '@wordpress/element';
14
+ import { dispatch, select } from '@wordpress/data';
15
+ import {
16
+ store as richTextStore,
17
+ unregisterFormatType,
18
+ } from '@wordpress/rich-text';
19
+ import {
20
+ BlockInspector,
21
+ privateApis as blockEditorPrivateApis,
22
+ store as blockEditorStore,
23
+ } from '@wordpress/block-editor';
5
24
  import {
6
25
  initializeEditor,
7
26
  selectBlock,
8
27
  } from '@wordpress/integration-tests/helpers/integration-test-editor';
9
28
  import { registerCoreBlocks } from '@wordpress/block-library';
29
+ // Keep the matrix popover above the block toolbar, as in the editor.
30
+ import '../../../../block-editor/src/components/block-popover/style.scss';
31
+ import '../../../../components/src/popover/style.scss';
32
+ import { unlock } from '../../lock-unlock';
33
+ import { getMediaColor } from '../edit/color-utils';
34
+
35
+ vi.mock( import( '../edit/color-utils' ), { spy: true } );
36
+
37
+ const {
38
+ ExperimentalBlockCanvas: BlockCanvas,
39
+ ExperimentalBlockEditorProvider: BlockEditorProvider,
40
+ openMediaEditorModalKey,
41
+ } = unlock( blockEditorPrivateApis );
10
42
  const defaultSettings = {
11
43
  __experimentalFeatures: {
12
44
  color: {
@@ -66,6 +98,16 @@ async function openStylesTabIfAvailable() {
66
98
  }
67
99
  }
68
100
 
101
+ async function openSettingsTabIfAvailable() {
102
+ const settingsTab = screen.queryByRole( 'tab', {
103
+ name: 'Settings',
104
+ } );
105
+
106
+ if ( settingsTab ) {
107
+ await userEvent.click( settingsTab );
108
+ }
109
+ }
110
+
69
111
  describe( 'Cover block', () => {
70
112
  beforeEach( () => registerCoreBlocks() );
71
113
 
@@ -197,6 +239,154 @@ describe( 'Cover block', () => {
197
239
  } );
198
240
  } );
199
241
 
242
+ describe( 'media editor Undo', () => {
243
+ const originalUrl =
244
+ 'data:image/svg+xml,' +
245
+ encodeURIComponent(
246
+ '<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10"><rect width="10" height="10" fill="black"/></svg>'
247
+ );
248
+ const updatedImage = { id: 11, url: `${ originalUrl }#edited` };
249
+
250
+ beforeEach( () => {
251
+ vi.mocked( getMediaColor ).mockResolvedValue( '#ffffff' );
252
+ } );
253
+
254
+ afterEach( async () => {
255
+ await cleanupBrowser();
256
+ getBlockTypes().forEach( ( { name } ) =>
257
+ unregisterBlockType( name )
258
+ );
259
+ select( richTextStore )
260
+ .getFormatTypes()
261
+ .forEach( ( { name } ) => unregisterFormatType( name ) );
262
+ } );
263
+
264
+ async function openMediaEditor( initialAttributes = {} ) {
265
+ const openModal = vi.fn();
266
+ const block = createBlock( 'core/cover', {
267
+ id: 10,
268
+ url: originalUrl,
269
+ backgroundType: 'image',
270
+ sizeSlug: 'medium',
271
+ overlayColor: 'black',
272
+ isDark: true,
273
+ isUserOverlayColor: false,
274
+ ...initialAttributes,
275
+ } );
276
+ function TestEditor() {
277
+ const [ blocks, setBlocks ] = useState( [ block ] );
278
+ return createElement(
279
+ BlockEditorProvider,
280
+ {
281
+ value: blocks,
282
+ onInput: setBlocks,
283
+ onChange: setBlocks,
284
+ useSubRegistry: false,
285
+ settings: {
286
+ ...defaultSettings,
287
+ [ openMediaEditorModalKey ]: openModal,
288
+ },
289
+ },
290
+ createElement( BlockInspector ),
291
+ createElement( BlockCanvas, {
292
+ height: '100%',
293
+ shouldIframe: false,
294
+ } )
295
+ );
296
+ }
297
+ await renderBrowser( createElement( TestEditor ) );
298
+ await userEvent.click( screen.getByLabelText( 'Block: Cover' ) );
299
+ await userEvent.click(
300
+ screen.getByRole( 'button', { name: 'Edit image' } )
301
+ );
302
+ const { clientId } = select( blockEditorStore ).getBlocks()[ 0 ];
303
+ return {
304
+ ...openModal.mock.calls[ 0 ][ 0 ],
305
+ getAttributes: () =>
306
+ select( blockEditorStore ).getBlockAttributes( clientId ),
307
+ editAttributes: ( attributes ) =>
308
+ dispatch( blockEditorStore ).updateBlockAttributes(
309
+ clientId,
310
+ attributes
311
+ ),
312
+ };
313
+ }
314
+
315
+ test( 'restores only the previous image without reverting Cover settings', async () => {
316
+ const { onUpdate, onUndo, getAttributes, editAttributes } =
317
+ await openMediaEditor();
318
+ await act( () => onUpdate( updatedImage ) );
319
+ expect( getAttributes() ).toMatchObject( {
320
+ id: 11,
321
+ sizeSlug: 'full',
322
+ overlayColor: 'white',
323
+ isDark: false,
324
+ } );
325
+ await act( () =>
326
+ editAttributes( { dimRatio: 75, sizeSlug: 'large' } )
327
+ );
328
+ const beforeUndo = getAttributes();
329
+
330
+ act( () => onUndo() );
331
+
332
+ expect( getAttributes() ).toEqual( {
333
+ ...beforeUndo,
334
+ id: 10,
335
+ url: originalUrl,
336
+ } );
337
+ } );
338
+
339
+ test( 'preserves an overlay chosen after saving when undoing the media update', async () => {
340
+ const { onUpdate, onUndo, getAttributes, editAttributes } =
341
+ await openMediaEditor();
342
+ await act( () => onUpdate( updatedImage ) );
343
+ await act( () =>
344
+ editAttributes( {
345
+ overlayColor: undefined,
346
+ customOverlayColor: '#000000',
347
+ isUserOverlayColor: true,
348
+ dimRatio: 90,
349
+ isDark: true,
350
+ } )
351
+ );
352
+
353
+ const beforeUndo = getAttributes();
354
+ act( () => onUndo() );
355
+
356
+ expect( getAttributes() ).toEqual( {
357
+ ...beforeUndo,
358
+ id: 10,
359
+ url: originalUrl,
360
+ } );
361
+ } );
362
+
363
+ test( 'does not reapply a media update when Undo runs before its color loads', async () => {
364
+ const { onUpdate, onUndo, getAttributes } = await openMediaEditor();
365
+ const previous = getAttributes();
366
+ let resolveColor;
367
+ vi.mocked( getMediaColor ).mockReturnValueOnce(
368
+ new Promise( ( resolve ) => {
369
+ resolveColor = resolve;
370
+ } )
371
+ );
372
+ let updatePromise;
373
+ act( () => {
374
+ updatePromise = onUpdate( updatedImage );
375
+ } );
376
+
377
+ act( () => onUndo() );
378
+ await act( async () => {
379
+ resolveColor( '#ffffff' );
380
+ await updatePromise;
381
+ } );
382
+
383
+ expect( getAttributes() ).toEqual( previous );
384
+ expect(
385
+ screen.getByRole( 'button', { name: 'Edit image' } )
386
+ ).toBeEnabled();
387
+ } );
388
+ } );
389
+
200
390
  describe( 'Inspector controls', () => {
201
391
  describe( 'Media settings', () => {
202
392
  test( 'does not display media settings panel if url is not set', async () => {
@@ -207,11 +397,12 @@ describe( 'Cover block', () => {
207
397
  } )
208
398
  ).not.toBeInTheDocument();
209
399
  } );
210
- test( 'does not display settings tab when media settings are empty', async () => {
400
+ test( 'does not display settings panel in the settings tab when the block has no media', async () => {
211
401
  await createAndSelectBlock();
212
402
 
403
+ await openSettingsTabIfAvailable();
213
404
  expect(
214
- screen.queryByRole( 'tab', {
405
+ screen.queryByRole( 'heading', {
215
406
  name: 'Settings',
216
407
  } )
217
408
  ).not.toBeInTheDocument();
@@ -227,6 +418,7 @@ describe( 'Cover block', () => {
227
418
  } );
228
419
 
229
420
  await selectBlock( 'Block: Cover' );
421
+ await openSettingsTabIfAvailable();
230
422
  expect(
231
423
  await screen.findByRole( 'heading', { name: 'Settings' } )
232
424
  ).toBeInTheDocument();
@@ -241,6 +433,7 @@ describe( 'Cover block', () => {
241
433
  'has-parallax'
242
434
  );
243
435
  await selectBlock( 'Block: Cover' );
436
+ await openSettingsTabIfAvailable();
244
437
  await userEvent.click(
245
438
  await screen.findByLabelText( 'Fixed background' )
246
439
  );
@@ -257,6 +450,7 @@ describe( 'Cover block', () => {
257
450
  'is-repeated'
258
451
  );
259
452
  await selectBlock( 'Block: Cover' );
453
+ await openSettingsTabIfAvailable();
260
454
  await userEvent.click(
261
455
  await screen.findByLabelText( 'Repeated background' )
262
456
  );
@@ -271,6 +465,7 @@ describe( 'Cover block', () => {
271
465
  } );
272
466
 
273
467
  await selectBlock( 'Block: Cover' );
468
+ await openSettingsTabIfAvailable();
274
469
  await userEvent.clear( await screen.findByLabelText( 'Left' ) );
275
470
  await userEvent.type( screen.getByLabelText( 'Left' ), '100' );
276
471
 
@@ -288,6 +483,7 @@ describe( 'Cover block', () => {
288
483
  } );
289
484
 
290
485
  await selectBlock( 'Block: Cover' );
486
+ await openSettingsTabIfAvailable();
291
487
  await userEvent.type(
292
488
  await screen.findByLabelText( 'Alternative text' ),
293
489
  'Me'
@@ -0,0 +1,48 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import {
3
+ getBackgroundEmbedHtml,
4
+ getBackgroundVideoSrc,
5
+ } from '../embed-video-utils';
6
+
7
+ const YOUTUBE_SRC = 'https://www.youtube.com/embed/abc123?feature=oembed';
8
+ const VIMEO_SRC = 'https://player.vimeo.com/video/123456';
9
+
10
+ describe( 'getBackgroundVideoSrc', () => {
11
+ it( 'adds autoplay by default', () => {
12
+ const url = new URL( getBackgroundVideoSrc( YOUTUBE_SRC ) );
13
+
14
+ expect( url.searchParams.get( 'autoplay' ) ).toBe( '1' );
15
+ expect( url.searchParams.get( 'loop' ) ).toBe( '1' );
16
+ } );
17
+
18
+ it( 'leaves out autoplay when autoplay is disabled', () => {
19
+ const url = new URL(
20
+ getBackgroundVideoSrc( YOUTUBE_SRC, { autoplay: false } )
21
+ );
22
+
23
+ expect( url.searchParams.has( 'autoplay' ) ).toBe( false );
24
+ expect( url.searchParams.get( 'loop' ) ).toBe( '1' );
25
+ } );
26
+
27
+ it( 'uses Vimeo background mode only when autoplay is enabled', () => {
28
+ const autoplayUrl = new URL( getBackgroundVideoSrc( VIMEO_SRC ) );
29
+ const pausedUrl = new URL(
30
+ getBackgroundVideoSrc( VIMEO_SRC, { autoplay: false } )
31
+ );
32
+
33
+ expect( autoplayUrl.searchParams.get( 'background' ) ).toBe( '1' );
34
+ expect( pausedUrl.searchParams.has( 'background' ) ).toBe( false );
35
+ expect( pausedUrl.searchParams.has( 'autoplay' ) ).toBe( false );
36
+ } );
37
+ } );
38
+
39
+ describe( 'getBackgroundEmbedHtml', () => {
40
+ it( 'passes the autoplay option through to the iframe src', () => {
41
+ const html = `<iframe src="${ YOUTUBE_SRC }"></iframe>`;
42
+
43
+ expect( getBackgroundEmbedHtml( html ) ).toContain( 'autoplay=1' );
44
+ expect(
45
+ getBackgroundEmbedHtml( html, { autoplay: false } )
46
+ ).not.toContain( 'autoplay' );
47
+ } );
48
+ } );
@@ -0,0 +1,22 @@
1
+ import { getContext, store } from '@wordpress/interactivity';
2
+ import { prefersReducedMotion } from '@wordpress/a11y';
3
+
4
+ store(
5
+ 'core/cover',
6
+ {
7
+ state: {
8
+ get videoSrc() {
9
+ const { src, reducedMotionSrc } = getContext();
10
+
11
+ // The server renders the autoplaying source, so it is only
12
+ // replaced for a visitor who has asked for reduced motion.
13
+ if ( reducedMotionSrc && prefersReducedMotion() ) {
14
+ return reducedMotionSrc;
15
+ }
16
+
17
+ return src;
18
+ },
19
+ },
20
+ },
21
+ { lock: true }
22
+ );
@@ -26,15 +26,23 @@ _Defined via the [`supports`](https://developer.wordpress.org/block-editor/refer
26
26
 
27
27
  - [`align`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#align): `"wide"`, `"full"`
28
28
  - [`anchor`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#anchor): `true`
29
+ - [`background`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#background):
30
+ - `backgroundImage`: `true`
31
+ - `backgroundSize`: `true`
32
+ - `gradient`: `true`
29
33
  - [`color`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#color):
30
34
  - [`gradients`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#color-gradients): `true`
31
35
  - [`link`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#color-link): `true`
36
+ - [`heading`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#color-heading): `true`
37
+ - [`button`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#color-button): `true`
32
38
  - [`html`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#html): `false`
33
39
  - [`shadow`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#shadow): `true`
34
40
  - [`spacing`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#spacing):
35
41
  - `margin`: `true`
36
42
  - `padding`: `true`
37
43
  - `blockGap`: `true`
44
+ - [`dimensions`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#dimensions):
45
+ - `minWidth`: `true`
38
46
  - [`typography`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#typography):
39
47
  - [`fontSize`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#typography-fontsize): `true`
40
48
  - [`lineHeight`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#typography-lineheight): `true`
@@ -32,9 +32,20 @@
32
32
  "__experimentalOnEnter": true,
33
33
  "align": [ "wide", "full" ],
34
34
  "anchor": true,
35
+ "background": {
36
+ "backgroundImage": true,
37
+ "backgroundSize": true,
38
+ "gradient": true,
39
+ "__experimentalDefaultControls": {
40
+ "backgroundImage": true,
41
+ "gradient": true
42
+ }
43
+ },
35
44
  "color": {
36
45
  "gradients": true,
37
46
  "link": true,
47
+ "heading": true,
48
+ "button": true,
38
49
  "__experimentalDefaultControls": {
39
50
  "background": true,
40
51
  "text": true
@@ -56,6 +67,9 @@
56
67
  "padding": false
57
68
  }
58
69
  },
70
+ "dimensions": {
71
+ "minWidth": true
72
+ },
59
73
  "typography": {
60
74
  "fontSize": true,
61
75
  "lineHeight": true,
@@ -28,8 +28,12 @@ _Defined via the [`supports`](https://developer.wordpress.org/block-editor/refer
28
28
 
29
29
  - [`anchor`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#anchor): `true`
30
30
  - [`align`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#align): `true`
31
+ - [`dimensions`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#dimensions):
32
+ - `minHeight`: `true`
33
+ - `minWidth`: `true`
31
34
  - [`spacing`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#spacing):
32
35
  - `margin`: `true`
36
+ - `padding`: `true`
33
37
  - [`interactivity`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#interactivity):
34
38
  - `clientNavigation`: `true`
35
39
 
@@ -43,8 +43,13 @@
43
43
  "supports": {
44
44
  "anchor": true,
45
45
  "align": true,
46
+ "dimensions": {
47
+ "minHeight": true,
48
+ "minWidth": true
49
+ },
46
50
  "spacing": {
47
- "margin": true
51
+ "margin": true,
52
+ "padding": true
48
53
  },
49
54
  "interactivity": {
50
55
  "clientNavigation": true
@@ -17,7 +17,9 @@
17
17
  }
18
18
 
19
19
  // Supply a min-width when inside a cover block, to prevent it from collapsing.
20
- .wp-block-cover .wp-block-embed {
20
+ // :root :where() matches Global Styles specificity so a minimum set there can
21
+ // win, since block library styles load first.
22
+ :root :where(.wp-block-cover .wp-block-embed) {
21
23
  min-width: 320px;
22
24
  min-height: 240px;
23
25
  }
@@ -25,6 +27,10 @@
25
27
  // Allow embeds to grow and shrink inside flex group blocks (Stack/Row), preventing collapse while fitting available space.
26
28
  .wp-block-group.is-layout-flex .wp-block-embed {
27
29
  flex: 1 1 0%;
30
+ }
31
+
32
+ // Lowered like the cover minimums above.
33
+ :root :where(.wp-block-group.is-layout-flex .wp-block-embed) {
28
34
  min-width: 0;
29
35
  }
30
36
 
@@ -33,13 +33,21 @@ _Defined via the [`supports`](https://developer.wordpress.org/block-editor/refer
33
33
 
34
34
  - [`anchor`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#anchor): `true`
35
35
  - [`align`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#align): `true`
36
+ - [`background`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#background):
37
+ - `backgroundImage`: `true`
38
+ - `backgroundSize`: `true`
39
+ - `gradient`: `true`
36
40
  - [`spacing`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#spacing):
37
41
  - `margin`: `true`
38
42
  - `padding`: `true`
43
+ - [`dimensions`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#dimensions):
44
+ - `minHeight`: `true`
45
+ - `minWidth`: `true`
39
46
  - [`color`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#color):
40
47
  - [`gradients`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#color-gradients): `true`
41
48
  - [`link`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#color-link): `true`
42
49
  - [`text`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#color-text): `false`
50
+ - [`shadow`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#shadow): `true`
43
51
  - [`interactivity`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#interactivity): `true`
44
52
 
45
53
  ## Block Markup