@wordpress/block-library 10.1.1-next.v.202607070741.0 → 10.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 (371) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/build/accordion/block.json +1 -0
  3. package/build/button/edit.cjs +18 -8
  4. package/build/button/edit.cjs.map +2 -2
  5. package/build/cover/block.json +11 -0
  6. package/build/cover/edit/block-controls.cjs +11 -4
  7. package/build/cover/edit/block-controls.cjs.map +2 -2
  8. package/build/cover/edit/embed-video-url-input.cjs +5 -3
  9. package/build/cover/edit/embed-video-url-input.cjs.map +3 -3
  10. package/build/cover/edit/index.cjs +1 -1
  11. package/build/cover/edit/index.cjs.map +2 -2
  12. package/build/cover/embed-video-utils.cjs +17 -7
  13. package/build/cover/embed-video-utils.cjs.map +2 -2
  14. package/build/details/transforms.cjs +1 -3
  15. package/build/details/transforms.cjs.map +2 -2
  16. package/build/embed/embed-placeholder.cjs +0 -1
  17. package/build/embed/embed-placeholder.cjs.map +2 -2
  18. package/build/file/edit.cjs +4 -3
  19. package/build/file/edit.cjs.map +2 -2
  20. package/build/file/transforms.cjs +25 -60
  21. package/build/file/transforms.cjs.map +2 -2
  22. package/build/gallery/block.json +4 -2
  23. package/build/gallery/edit.cjs +1 -1
  24. package/build/gallery/edit.cjs.map +3 -3
  25. package/build/gallery/gap-styles.cjs +49 -13
  26. package/build/gallery/gap-styles.cjs.map +3 -3
  27. package/build/group/transforms.cjs +1 -1
  28. package/build/group/transforms.cjs.map +2 -2
  29. package/build/icon/components/custom-inserter/icon-grid.cjs +25 -12
  30. package/build/icon/components/custom-inserter/icon-grid.cjs.map +2 -2
  31. package/build/icon/components/custom-inserter/index.cjs +100 -31
  32. package/build/icon/components/custom-inserter/index.cjs.map +3 -3
  33. package/build/icon/edit.cjs +11 -12
  34. package/build/icon/edit.cjs.map +2 -2
  35. package/build/image/block.json +1 -1
  36. package/build/image/edit.cjs +0 -34
  37. package/build/image/edit.cjs.map +2 -2
  38. package/build/image/image.cjs +4 -23
  39. package/build/image/image.cjs.map +3 -3
  40. package/build/image/transforms.cjs +78 -0
  41. package/build/image/transforms.cjs.map +3 -3
  42. package/build/index.cjs +18 -8
  43. package/build/index.cjs.map +2 -2
  44. package/build/latest-posts/edit.cjs +5 -8
  45. package/build/latest-posts/edit.cjs.map +2 -2
  46. package/build/list-item/edit.cjs +1 -1
  47. package/build/list-item/edit.cjs.map +2 -2
  48. package/build/list-item/hooks/use-enter.cjs +14 -17
  49. package/build/list-item/hooks/use-enter.cjs.map +3 -3
  50. package/build/list-item/hooks/use-space.cjs +3 -2
  51. package/build/list-item/hooks/use-space.cjs.map +3 -3
  52. package/build/paragraph/block.json +1 -0
  53. package/build/paragraph/use-enter.cjs +3 -7
  54. package/build/paragraph/use-enter.cjs.map +3 -3
  55. package/build/playlist/block.json +29 -10
  56. package/build/playlist/edit.cjs +216 -14
  57. package/build/playlist/edit.cjs.map +3 -3
  58. package/build/playlist/index.cjs +1 -1
  59. package/build/playlist/index.cjs.map +2 -2
  60. package/build/playlist/utils.cjs +19 -5
  61. package/build/playlist/utils.cjs.map +2 -2
  62. package/build/playlist/view.cjs +83 -13
  63. package/build/playlist/view.cjs.map +2 -2
  64. package/build/playlist-track/block.json +4 -2
  65. package/build/playlist-track/edit.cjs +94 -64
  66. package/build/playlist-track/edit.cjs.map +2 -2
  67. package/build/post-content/block.json +1 -0
  68. package/build/post-template/block.json +2 -1
  69. package/build/post-template/edit.cjs +10 -1
  70. package/build/post-template/edit.cjs.map +2 -2
  71. package/build/pullquote/block.json +3 -1
  72. package/build/query/block.json +3 -2
  73. package/build/query/edit/inspector-controls/index.cjs +38 -4
  74. package/build/query/edit/inspector-controls/index.cjs.map +2 -2
  75. package/build/query/edit/inspector-controls/offset-controls.cjs +0 -1
  76. package/build/query/edit/inspector-controls/offset-controls.cjs.map +2 -2
  77. package/build/query/edit/inspector-controls/pages-control.cjs +0 -1
  78. package/build/query/edit/inspector-controls/pages-control.cjs.map +2 -2
  79. package/build/query/edit/query-content.cjs +10 -3
  80. package/build/query/edit/query-content.cjs.map +2 -2
  81. package/build/query/index.cjs +2 -1
  82. package/build/query/index.cjs.map +2 -2
  83. package/build/quote/block.json +3 -1
  84. package/build/quote/transforms.cjs +1 -3
  85. package/build/quote/transforms.cjs.map +2 -2
  86. package/build/rss/edit.cjs +0 -1
  87. package/build/rss/edit.cjs.map +2 -2
  88. package/build/tab-list/block.json +2 -2
  89. package/build/tab-list/edit.cjs +65 -11
  90. package/build/tab-list/edit.cjs.map +3 -3
  91. package/build/tab-panel/block.json +1 -6
  92. package/build/tab-panel/edit.cjs +15 -15
  93. package/build/tab-panel/edit.cjs.map +2 -2
  94. package/build/tab-panels/block.json +0 -1
  95. package/build/tabs/block.json +0 -5
  96. package/build/tabs/edit.cjs +4 -39
  97. package/build/tabs/edit.cjs.map +3 -3
  98. package/build/tabs/use-tab-list-items-sync.cjs +19 -1
  99. package/build/tabs/use-tab-list-items-sync.cjs.map +2 -2
  100. package/build/term-name/block.json +1 -3
  101. package/build/term-name/deprecated.cjs +105 -0
  102. package/build/term-name/deprecated.cjs.map +7 -0
  103. package/build/term-name/edit.cjs +11 -37
  104. package/build/term-name/edit.cjs.map +3 -3
  105. package/build/term-name/index.cjs +3 -1
  106. package/build/term-name/index.cjs.map +3 -3
  107. package/build/utils/waveform-player.cjs +138 -22
  108. package/build/utils/waveform-player.cjs.map +2 -2
  109. package/build/utils/waveform-utils.cjs +315 -17
  110. package/build/utils/waveform-utils.cjs.map +2 -2
  111. package/build/video/edit.cjs +2 -11
  112. package/build/video/edit.cjs.map +3 -3
  113. package/build-module/accordion/block.json +1 -0
  114. package/build-module/button/edit.mjs +19 -14
  115. package/build-module/button/edit.mjs.map +2 -2
  116. package/build-module/cover/block.json +11 -0
  117. package/build-module/cover/edit/block-controls.mjs +11 -4
  118. package/build-module/cover/edit/block-controls.mjs.map +2 -2
  119. package/build-module/cover/edit/embed-video-url-input.mjs +5 -4
  120. package/build-module/cover/edit/embed-video-url-input.mjs.map +2 -2
  121. package/build-module/cover/edit/index.mjs +1 -1
  122. package/build-module/cover/edit/index.mjs.map +2 -2
  123. package/build-module/cover/embed-video-utils.mjs +16 -7
  124. package/build-module/cover/embed-video-utils.mjs.map +2 -2
  125. package/build-module/details/transforms.mjs +2 -7
  126. package/build-module/details/transforms.mjs.map +2 -2
  127. package/build-module/embed/embed-placeholder.mjs +0 -1
  128. package/build-module/embed/embed-placeholder.mjs.map +2 -2
  129. package/build-module/file/edit.mjs +4 -3
  130. package/build-module/file/edit.mjs.map +2 -2
  131. package/build-module/file/transforms.mjs +25 -60
  132. package/build-module/file/transforms.mjs.map +2 -2
  133. package/build-module/gallery/block.json +4 -2
  134. package/build-module/gallery/edit.mjs +3 -3
  135. package/build-module/gallery/edit.mjs.map +2 -2
  136. package/build-module/gallery/gap-styles.mjs +53 -14
  137. package/build-module/gallery/gap-styles.mjs.map +2 -2
  138. package/build-module/group/transforms.mjs +2 -5
  139. package/build-module/group/transforms.mjs.map +2 -2
  140. package/build-module/icon/components/custom-inserter/icon-grid.mjs +25 -12
  141. package/build-module/icon/components/custom-inserter/icon-grid.mjs.map +2 -2
  142. package/build-module/icon/components/custom-inserter/index.mjs +102 -33
  143. package/build-module/icon/components/custom-inserter/index.mjs.map +2 -2
  144. package/build-module/icon/edit.mjs +11 -12
  145. package/build-module/icon/edit.mjs.map +2 -2
  146. package/build-module/image/block.json +1 -1
  147. package/build-module/image/edit.mjs +0 -34
  148. package/build-module/image/edit.mjs.map +2 -2
  149. package/build-module/image/image.mjs +4 -13
  150. package/build-module/image/image.mjs.map +2 -2
  151. package/build-module/image/transforms.mjs +78 -0
  152. package/build-module/image/transforms.mjs.map +2 -2
  153. package/build-module/index.mjs +18 -8
  154. package/build-module/index.mjs.map +2 -2
  155. package/build-module/latest-posts/edit.mjs +5 -8
  156. package/build-module/latest-posts/edit.mjs.map +2 -2
  157. package/build-module/list-item/edit.mjs +1 -1
  158. package/build-module/list-item/edit.mjs.map +2 -2
  159. package/build-module/list-item/hooks/use-enter.mjs +15 -21
  160. package/build-module/list-item/hooks/use-enter.mjs.map +2 -2
  161. package/build-module/list-item/hooks/use-space.mjs +4 -6
  162. package/build-module/list-item/hooks/use-space.mjs.map +2 -2
  163. package/build-module/paragraph/block.json +1 -0
  164. package/build-module/paragraph/use-enter.mjs +4 -11
  165. package/build-module/paragraph/use-enter.mjs.map +2 -2
  166. package/build-module/playlist/block.json +29 -10
  167. package/build-module/playlist/edit.mjs +220 -16
  168. package/build-module/playlist/edit.mjs.map +2 -2
  169. package/build-module/playlist/index.mjs +1 -1
  170. package/build-module/playlist/index.mjs.map +2 -2
  171. package/build-module/playlist/utils.mjs +17 -4
  172. package/build-module/playlist/utils.mjs.map +2 -2
  173. package/build-module/playlist/view.mjs +89 -14
  174. package/build-module/playlist/view.mjs.map +2 -2
  175. package/build-module/playlist-track/block.json +4 -2
  176. package/build-module/playlist-track/edit.mjs +96 -65
  177. package/build-module/playlist-track/edit.mjs.map +2 -2
  178. package/build-module/post-content/block.json +1 -0
  179. package/build-module/post-template/block.json +2 -1
  180. package/build-module/post-template/edit.mjs +10 -1
  181. package/build-module/post-template/edit.mjs.map +2 -2
  182. package/build-module/pullquote/block.json +3 -1
  183. package/build-module/query/block.json +3 -2
  184. package/build-module/query/edit/inspector-controls/index.mjs +40 -5
  185. package/build-module/query/edit/inspector-controls/index.mjs.map +2 -2
  186. package/build-module/query/edit/inspector-controls/offset-controls.mjs +0 -1
  187. package/build-module/query/edit/inspector-controls/offset-controls.mjs.map +2 -2
  188. package/build-module/query/edit/inspector-controls/pages-control.mjs +0 -1
  189. package/build-module/query/edit/inspector-controls/pages-control.mjs.map +2 -2
  190. package/build-module/query/edit/query-content.mjs +10 -3
  191. package/build-module/query/edit/query-content.mjs.map +2 -2
  192. package/build-module/query/index.mjs +2 -1
  193. package/build-module/query/index.mjs.map +2 -2
  194. package/build-module/quote/block.json +3 -1
  195. package/build-module/quote/transforms.mjs +2 -4
  196. package/build-module/quote/transforms.mjs.map +2 -2
  197. package/build-module/rss/edit.mjs +0 -1
  198. package/build-module/rss/edit.mjs.map +2 -2
  199. package/build-module/tab-list/block.json +2 -2
  200. package/build-module/tab-list/edit.mjs +72 -13
  201. package/build-module/tab-list/edit.mjs.map +2 -2
  202. package/build-module/tab-panel/block.json +1 -6
  203. package/build-module/tab-panel/edit.mjs +16 -16
  204. package/build-module/tab-panel/edit.mjs.map +2 -2
  205. package/build-module/tab-panels/block.json +0 -1
  206. package/build-module/tabs/block.json +0 -5
  207. package/build-module/tabs/edit.mjs +5 -45
  208. package/build-module/tabs/edit.mjs.map +2 -2
  209. package/build-module/tabs/use-tab-list-items-sync.mjs +19 -1
  210. package/build-module/tabs/use-tab-list-items-sync.mjs.map +2 -2
  211. package/build-module/term-name/block.json +1 -3
  212. package/build-module/term-name/deprecated.mjs +74 -0
  213. package/build-module/term-name/deprecated.mjs.map +7 -0
  214. package/build-module/term-name/edit.mjs +11 -28
  215. package/build-module/term-name/edit.mjs.map +2 -2
  216. package/build-module/term-name/index.mjs +3 -1
  217. package/build-module/term-name/index.mjs.map +2 -2
  218. package/build-module/utils/waveform-player.mjs +144 -23
  219. package/build-module/utils/waveform-player.mjs.map +2 -2
  220. package/build-module/utils/waveform-utils.mjs +310 -16
  221. package/build-module/utils/waveform-utils.mjs.map +2 -2
  222. package/build-module/video/edit.mjs +2 -11
  223. package/build-module/video/edit.mjs.map +2 -2
  224. package/build-style/editor-rtl.css +46 -21
  225. package/build-style/editor.css +46 -21
  226. package/build-style/icon/editor-rtl.css +80 -7
  227. package/build-style/icon/editor.css +80 -7
  228. package/build-style/more/editor-rtl.css +2 -2
  229. package/build-style/more/editor.css +2 -2
  230. package/build-style/navigation/editor-rtl.css +3 -4
  231. package/build-style/navigation/editor.css +3 -4
  232. package/build-style/navigation-link/editor-rtl.css +1 -1
  233. package/build-style/navigation-link/editor.css +1 -1
  234. package/build-style/nextpage/editor-rtl.css +2 -2
  235. package/build-style/nextpage/editor.css +2 -2
  236. package/build-style/playlist/editor-rtl.css +6 -0
  237. package/build-style/playlist/editor.css +6 -0
  238. package/build-style/playlist/style-rtl.css +37 -1
  239. package/build-style/playlist/style.css +37 -1
  240. package/build-style/playlist-track/style-rtl.css +10 -0
  241. package/build-style/playlist-track/style.css +10 -0
  242. package/build-style/style-rtl.css +47 -1
  243. package/build-style/style.css +47 -1
  244. package/build-style/video/editor-rtl.css +1 -1
  245. package/build-style/video/editor.css +1 -1
  246. package/build-types/table-of-contents/list.d.ts +1 -1
  247. package/build-types/table-of-contents/list.d.ts.map +1 -1
  248. package/package.json +46 -44
  249. package/src/accordion/README.md +1 -0
  250. package/src/accordion/block.json +1 -0
  251. package/src/button/edit.js +21 -15
  252. package/src/cover/README.md +60 -0
  253. package/src/cover/block.json +11 -0
  254. package/src/cover/edit/block-controls.js +21 -11
  255. package/src/cover/edit/embed-video-url-input.js +5 -4
  256. package/src/cover/edit/index.js +9 -11
  257. package/src/cover/embed-video-utils.js +38 -13
  258. package/src/details/transforms.js +2 -7
  259. package/src/embed/embed-placeholder.js +0 -1
  260. package/src/file/edit.js +8 -8
  261. package/src/file/transforms.js +28 -60
  262. package/src/gallery/README.md +1 -1
  263. package/src/gallery/block.json +4 -2
  264. package/src/gallery/edit.js +3 -3
  265. package/src/gallery/gap-styles.js +79 -20
  266. package/src/gallery/index.php +103 -43
  267. package/src/group/transforms.js +2 -5
  268. package/src/icon/components/custom-inserter/icon-grid.js +40 -11
  269. package/src/icon/components/custom-inserter/index.js +98 -25
  270. package/src/icon/edit.js +11 -17
  271. package/src/icon/editor.scss +33 -8
  272. package/src/image/README.md +1 -1
  273. package/src/image/block.json +1 -1
  274. package/src/image/edit.js +0 -52
  275. package/src/image/editor.scss +2 -0
  276. package/src/image/image.js +19 -24
  277. package/src/image/transforms.js +128 -0
  278. package/src/index.js +19 -7
  279. package/src/latest-posts/edit.js +5 -8
  280. package/src/latest-posts/index.php +46 -16
  281. package/src/list-item/edit.js +1 -1
  282. package/src/list-item/hooks/use-enter.js +15 -22
  283. package/src/list-item/hooks/use-space.js +4 -6
  284. package/src/media-text/editor.scss +1 -0
  285. package/src/more/editor.scss +1 -1
  286. package/src/navigation/editor.scss +1 -2
  287. package/src/navigation-link/editor.scss +1 -1
  288. package/src/navigation-link/index.php +6 -3
  289. package/src/navigation-submenu/index.php +6 -3
  290. package/src/nextpage/editor.scss +1 -1
  291. package/src/paragraph/README.md +1 -0
  292. package/src/paragraph/block.json +1 -0
  293. package/src/paragraph/use-enter.js +4 -11
  294. package/src/playlist/README.md +17 -18
  295. package/src/playlist/block.json +29 -10
  296. package/src/playlist/edit.js +247 -15
  297. package/src/playlist/editor.scss +6 -0
  298. package/src/playlist/index.js +1 -1
  299. package/src/playlist/index.php +58 -14
  300. package/src/playlist/style.scss +51 -1
  301. package/src/playlist/test/edit.js +13 -2
  302. package/src/playlist/utils.js +25 -7
  303. package/src/playlist/view.js +97 -16
  304. package/src/playlist-track/README.md +3 -3
  305. package/src/playlist-track/block.json +4 -2
  306. package/src/playlist-track/edit.js +94 -70
  307. package/src/playlist-track/index.php +20 -6
  308. package/src/playlist-track/style.scss +10 -0
  309. package/src/playlist-track/test/edit.js +169 -0
  310. package/src/post-content/README.md +1 -0
  311. package/src/post-content/block.json +1 -0
  312. package/src/post-template/README.md +1 -0
  313. package/src/post-template/block.json +2 -1
  314. package/src/post-template/edit.js +9 -0
  315. package/src/pullquote/README.md +1 -0
  316. package/src/pullquote/block.json +3 -1
  317. package/src/query/README.md +2 -1
  318. package/src/query/block.json +3 -2
  319. package/src/query/edit/inspector-controls/index.js +43 -3
  320. package/src/query/edit/inspector-controls/offset-controls.js +0 -1
  321. package/src/query/edit/inspector-controls/pages-control.js +0 -1
  322. package/src/query/edit/query-content.js +19 -3
  323. package/src/query/index.js +1 -0
  324. package/src/quote/README.md +1 -0
  325. package/src/quote/block.json +3 -1
  326. package/src/quote/transforms.js +2 -4
  327. package/src/rss/edit.js +0 -1
  328. package/src/rss/index.php +1 -1
  329. package/src/tab-list/README.md +4 -5
  330. package/src/tab-list/block.json +2 -2
  331. package/src/tab-list/edit.js +90 -28
  332. package/src/tab-list/index.php +9 -4
  333. package/src/tab-panel/README.md +4 -6
  334. package/src/tab-panel/block.json +1 -6
  335. package/src/tab-panel/edit.js +19 -24
  336. package/src/tab-panels/README.md +5 -3
  337. package/src/tab-panels/block.json +0 -1
  338. package/src/tabs/README.md +18 -9
  339. package/src/tabs/block.json +0 -5
  340. package/src/tabs/edit.js +7 -64
  341. package/src/tabs/use-tab-list-items-sync.js +24 -4
  342. package/src/template-part/index.php +1 -16
  343. package/src/term-name/README.md +1 -1
  344. package/src/term-name/block.json +1 -3
  345. package/src/term-name/deprecated.js +74 -0
  346. package/src/term-name/edit.js +2 -18
  347. package/src/term-name/index.js +2 -0
  348. package/src/utils/media-control.scss +1 -5
  349. package/src/utils/test/waveform-player.js +297 -34
  350. package/src/utils/test/waveform-utils.js +410 -5
  351. package/src/utils/waveform-player.js +189 -59
  352. package/src/utils/waveform-utils.js +443 -40
  353. package/src/video/edit.js +0 -8
  354. package/src/video/editor.scss +1 -1
  355. package/build/image/animated-gif-convert-control.cjs +0 -105
  356. package/build/image/animated-gif-convert-control.cjs.map +0 -7
  357. package/build/utils/gif-conversion-attributes.cjs +0 -40
  358. package/build/utils/gif-conversion-attributes.cjs.map +0 -7
  359. package/build/video/gif-restore-control.cjs +0 -73
  360. package/build/video/gif-restore-control.cjs.map +0 -7
  361. package/build-module/image/animated-gif-convert-control.mjs +0 -87
  362. package/build-module/image/animated-gif-convert-control.mjs.map +0 -7
  363. package/build-module/utils/gif-conversion-attributes.mjs +0 -15
  364. package/build-module/utils/gif-conversion-attributes.mjs.map +0 -7
  365. package/build-module/video/gif-restore-control.mjs +0 -55
  366. package/build-module/video/gif-restore-control.mjs.map +0 -7
  367. package/src/image/animated-gif-convert-control.js +0 -135
  368. package/src/image/test/animated-gif-convert-control.js +0 -276
  369. package/src/utils/gif-conversion-attributes.js +0 -30
  370. package/src/utils/test/gif-conversion-attributes.js +0 -60
  371. package/src/video/gif-restore-control.js +0 -92
@@ -20,6 +20,7 @@ import { crop, link } from '@wordpress/icons';
20
20
  import { ALLOWED_MEDIA_TYPES, EMBED_VIDEO_BACKGROUND_TYPE } from '../shared';
21
21
  import { unlock } from '../../lock-unlock';
22
22
  import EmbedVideoUrlInput from './embed-video-url-input';
23
+ import { getAllowedVideoProviders } from '../embed-video-utils';
23
24
 
24
25
  const { cleanEmptyObject } = unlock( blockEditorPrivateApis );
25
26
 
@@ -43,9 +44,15 @@ export default function CoverBlockControls( {
43
44
  minHeight,
44
45
  minHeightUnit,
45
46
  backgroundType,
47
+ allowedVideoProviders,
46
48
  } = attributes;
47
49
  const { hasInnerBlocks, url } = currentSettings;
48
50
 
51
+ const filteredVideoProviders = getAllowedVideoProviders(
52
+ allowedVideoProviders
53
+ );
54
+ const hasAllowedVideoProviders = filteredVideoProviders.length > 0;
55
+
49
56
  const [ prevMinHeightValue, setPrevMinHeightValue ] = useState( minHeight );
50
57
  const [ prevMinHeightUnit, setPrevMinHeightUnit ] =
51
58
  useState( minHeightUnit );
@@ -132,17 +139,19 @@ export default function CoverBlockControls( {
132
139
  onReset={ onClearMedia }
133
140
  variant="toolbar"
134
141
  >
135
- { ( { onClose } ) => (
136
- <MenuItem
137
- icon={ link }
138
- onClick={ () => {
139
- setIsEmbedUrlInputOpen( true );
140
- onClose();
141
- } }
142
- >
143
- { __( 'Embed video from URL' ) }
144
- </MenuItem>
145
- ) }
142
+ { ( { onClose } ) =>
143
+ hasAllowedVideoProviders ? (
144
+ <MenuItem
145
+ icon={ link }
146
+ onClick={ () => {
147
+ setIsEmbedUrlInputOpen( true );
148
+ onClose();
149
+ } }
150
+ >
151
+ { __( 'Embed video from URL' ) }
152
+ </MenuItem>
153
+ ) : null
154
+ }
146
155
  </MediaReplaceFlow>
147
156
  </BlockControls>
148
157
  { isEmbedUrlInputOpen && (
@@ -156,6 +165,7 @@ export default function CoverBlockControls( {
156
165
  ? url
157
166
  : ''
158
167
  }
168
+ allowedVideoProviders={ filteredVideoProviders }
159
169
  />
160
170
  ) }
161
171
  </>
@@ -4,11 +4,11 @@
4
4
  import { useState } from '@wordpress/element';
5
5
  import {
6
6
  __experimentalConfirmDialog as ConfirmDialog,
7
- __experimentalVStack as VStack,
8
7
  TextControl,
9
8
  Notice,
10
9
  } from '@wordpress/components';
11
10
  import { __ } from '@wordpress/i18n';
11
+ import { Stack } from '@wordpress/ui';
12
12
 
13
13
  /**
14
14
  * Internal dependencies
@@ -19,6 +19,7 @@ export default function EmbedVideoUrlInput( {
19
19
  onSubmit,
20
20
  onClose,
21
21
  initialUrl = '',
22
+ allowedVideoProviders,
22
23
  } ) {
23
24
  const [ url, setUrl ] = useState( initialUrl );
24
25
  const [ error, setError ] = useState( '' );
@@ -29,7 +30,7 @@ export default function EmbedVideoUrlInput( {
29
30
  return;
30
31
  }
31
32
 
32
- if ( ! isValidVideoEmbedUrl( url ) ) {
33
+ if ( ! isValidVideoEmbedUrl( url, allowedVideoProviders ) ) {
33
34
  setError(
34
35
  __(
35
36
  'This URL is not supported. Please enter a valid video link from a supported provider.'
@@ -50,7 +51,7 @@ export default function EmbedVideoUrlInput( {
50
51
  confirmButtonText={ __( 'Add video' ) }
51
52
  size="medium"
52
53
  >
53
- <VStack spacing={ 4 }>
54
+ <Stack direction="column" gap="lg">
54
55
  { error && (
55
56
  <Notice status="error" isDismissible={ false }>
56
57
  { error }
@@ -71,7 +72,7 @@ export default function EmbedVideoUrlInput( {
71
72
  'Add a background video to the cover block that will autoplay in a loop.'
72
73
  ) }
73
74
  />
74
- </VStack>
75
+ </Stack>
75
76
  </ConfirmDialog>
76
77
  );
77
78
  }
@@ -243,8 +243,7 @@ function CoverEdit( {
243
243
  if ( ! currentAttrs.isUserOverlayColor ) {
244
244
  newOverlayColor = averageBackgroundColor;
245
245
  setOverlayColor( newOverlayColor );
246
-
247
- // Make undo revert the next setAttributes and the previous setOverlayColor.
246
+ // Fold next attribute change into the same undo level as the setOverlayColor above.
248
247
  __unstableMarkNextChangeAsNotPersistent();
249
248
  }
250
249
 
@@ -302,11 +301,13 @@ function CoverEdit( {
302
301
 
303
302
  const onClearMedia = () => {
304
303
  let newOverlayColor = overlayColor.color;
305
- if ( ! isUserOverlayColor ) {
304
+
305
+ // Skip for embeds, which never auto-assign an overlay color; otherwise
306
+ // the non-persistent flag lands on the media reset itself (unsaveable).
307
+ if ( ! isUserOverlayColor && overlayColor.color ) {
306
308
  newOverlayColor = DEFAULT_OVERLAY_COLOR;
307
309
  setOverlayColor( undefined );
308
-
309
- // Make undo revert the next setAttributes and the previous setOverlayColor.
310
+ // Fold next attribute change into the same undo level as the setOverlayColor above.
310
311
  __unstableMarkNextChangeAsNotPersistent();
311
312
  }
312
313
 
@@ -341,8 +342,7 @@ function CoverEdit( {
341
342
  );
342
343
 
343
344
  setOverlayColor( newOverlayColor );
344
-
345
- // Make undo revert the next setAttributes and the previous setOverlayColor.
345
+ // Fold next attribute change into the same undo level as the setOverlayColor above.
346
346
  __unstableMarkNextChangeAsNotPersistent();
347
347
 
348
348
  setAttributes( {
@@ -549,8 +549,7 @@ function CoverEdit( {
549
549
  if ( ! currentAttrs.isUserOverlayColor ) {
550
550
  newOverlayColor = averageBackgroundColor;
551
551
  setOverlayColor( newOverlayColor );
552
-
553
- // Make undo revert the next setAttributes and the previous setOverlayColor.
552
+ // Fold next attribute change into the same undo level as the setOverlayColor above.
554
553
  __unstableMarkNextChangeAsNotPersistent();
555
554
  }
556
555
 
@@ -604,8 +603,7 @@ function CoverEdit( {
604
603
  } else {
605
604
  setOverlayColor( undefined );
606
605
  }
607
-
608
- // Make undo revert the next setAttributes and the previous setOverlayColor.
606
+ // Fold next attribute change into the same undo level as the setOverlayColor above.
609
607
  __unstableMarkNextChangeAsNotPersistent();
610
608
  }
611
609
 
@@ -11,7 +11,7 @@ import { matchesPatterns } from '../embed/util';
11
11
  const DEFAULT_EMBED_BLOCK = 'core/embed';
12
12
 
13
13
  // List of supported video providers for cover block backgrounds
14
- const VIDEO_PROVIDERS = [
14
+ const DEFAULT_VIDEO_PROVIDERS = [
15
15
  'youtube',
16
16
  'vimeo',
17
17
  'videopress',
@@ -21,38 +21,63 @@ const VIDEO_PROVIDERS = [
21
21
  ];
22
22
 
23
23
  /**
24
- * Checks if a URL is a valid video embed URL from supported providers.
24
+ * Resolves the list of providers that are actually allowed.
25
25
  *
26
- * @param {string} url The URL to validate.
27
- * @return {boolean} True if the URL matches a supported video provider pattern.
26
+ * @param {string[]} [allowedVideoProviders] The providers configured via the block attribute.
27
+ * @return {string[]} The supported providers that remain allowed.
28
28
  */
29
- export function isValidVideoEmbedUrl( url ) {
29
+ export function getAllowedVideoProviders( allowedVideoProviders ) {
30
+ if ( ! Array.isArray( allowedVideoProviders ) ) {
31
+ return [];
32
+ }
33
+
34
+ return DEFAULT_VIDEO_PROVIDERS.filter( ( provider ) =>
35
+ allowedVideoProviders.includes( provider )
36
+ );
37
+ }
38
+
39
+ /**
40
+ * Checks if a URL is a valid video embed URL from allowed providers.
41
+ *
42
+ * @param {string} url The URL to validate.
43
+ * @param {string[]} [allowedProviders] The allowed providers, Defaults to all
44
+ * supported providers.
45
+ * @return {boolean} True if the URL matches an allowed video provider pattern.
46
+ */
47
+ export function isValidVideoEmbedUrl( url, allowedProviders ) {
30
48
  if ( ! url ) {
31
49
  return false;
32
50
  }
33
51
 
34
- const embedBlock = findVideoEmbedProvider( url );
52
+ const embedBlock = findVideoEmbedProvider( url, allowedProviders );
35
53
  return embedBlock !== null;
36
54
  }
37
55
 
38
56
  /**
39
- * Finds the embed provider for a given URL if it's a supported video provider.
57
+ * Finds the embed provider for a given URL if it's an allowed video provider.
40
58
  *
41
- * @param {string} url The URL to check.
59
+ * @param {string} url The URL to check.
60
+ * @param {string[]} [allowedProviders] The allowed providers, Defaults to all
61
+ * supported providers.
42
62
  * @return {string|null} The provider name slug (e.g., 'youtube') or null if not found.
43
63
  */
44
- export function getVideoEmbedProvider( url ) {
45
- const embedBlock = findVideoEmbedProvider( url );
64
+ export function getVideoEmbedProvider( url, allowedProviders ) {
65
+ const embedBlock = findVideoEmbedProvider( url, allowedProviders );
46
66
  return embedBlock ? embedBlock.name : null;
47
67
  }
48
68
 
49
69
  /**
50
70
  * Finds a matching video embed block variation for the given URL.
51
71
  *
52
- * @param {string} url The URL to match against provider patterns.
72
+ * @param {string} url The URL to match against provider patterns.
73
+ * @param {string[]} [allowedProviders] The allowed providers, Defaults to all
74
+ * supported providers.
53
75
  * @return {Object|null} The matching block variation or null if not found.
54
76
  */
55
- function findVideoEmbedProvider( url ) {
77
+ function findVideoEmbedProvider(
78
+ url,
79
+ allowedProviders = DEFAULT_VIDEO_PROVIDERS
80
+ ) {
56
81
  const embedVariations = getBlockVariations( DEFAULT_EMBED_BLOCK );
57
82
 
58
83
  if ( ! embedVariations ) {
@@ -65,7 +90,7 @@ function findVideoEmbedProvider( url ) {
65
90
 
66
91
  if (
67
92
  ! matchingVariation ||
68
- ! VIDEO_PROVIDERS.includes( matchingVariation.name )
93
+ ! allowedProviders.includes( matchingVariation.name )
69
94
  ) {
70
95
  return null;
71
96
  }
@@ -1,10 +1,7 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import {
5
- createBlock,
6
- __experimentalCloneSanitizedBlock,
7
- } from '@wordpress/blocks';
4
+ import { createBlock, cloneSanitizedBlock } from '@wordpress/blocks';
8
5
 
9
6
  export default {
10
7
  from: [
@@ -21,9 +18,7 @@ export default {
21
18
  return createBlock(
22
19
  'core/details',
23
20
  {},
24
- blocks.map( ( block ) =>
25
- __experimentalCloneSanitizedBlock( block )
26
- )
21
+ blocks.map( ( block ) => cloneSanitizedBlock( block ) )
27
22
  );
28
23
  },
29
24
  },
@@ -31,7 +31,6 @@ export default function EmbedPlaceholder( {
31
31
  >
32
32
  <form onSubmit={ onSubmit }>
33
33
  <InputControl
34
- __next40pxDefaultSize
35
34
  type="url"
36
35
  value={ value || '' }
37
36
  className="wp-block-embed__placeholder-input"
package/src/file/edit.js CHANGED
@@ -77,14 +77,14 @@ function FileEdit( { attributes, isSelected, setAttributes, clientId } ) {
77
77
  const [ temporaryURL, setTemporaryURL ] = useState( attributes.blob );
78
78
  const { media } = useSelect(
79
79
  ( select ) => ( {
80
- media:
81
- id === undefined
82
- ? undefined
83
- : select( coreStore ).getEntityRecord(
84
- 'postType',
85
- 'attachment',
86
- id
87
- ),
80
+ media: !! id
81
+ ? select( coreStore ).getEntityRecord(
82
+ 'postType',
83
+ 'attachment',
84
+ id,
85
+ { context: 'view' }
86
+ )
87
+ : undefined,
88
88
  } ),
89
89
  [ id ]
90
90
  );
@@ -11,6 +11,31 @@ import { getFilename } from '@wordpress/url';
11
11
  // Transforms bypass the default variation, so set the localized default here.
12
12
  const downloadButtonText = _x( 'Download', 'button label' );
13
13
 
14
+ // The File → audio/video/image transforms are identical apart from the target
15
+ // block, its media MIME type, and the src attribute name (image uses `url`).
16
+ const toMediaTransform = ( blockName, mediaType, srcAttribute ) => ( {
17
+ type: 'block',
18
+ blocks: [ blockName ],
19
+ isMatch: ( { id } ) => {
20
+ if ( ! id ) {
21
+ return false;
22
+ }
23
+ const { getEntityRecord } = select( coreStore );
24
+ const media = getEntityRecord( 'postType', 'attachment', id, {
25
+ context: 'view',
26
+ } );
27
+ return !! media && media.mime_type.includes( mediaType );
28
+ },
29
+ transform: ( attributes ) => {
30
+ return createBlock( blockName, {
31
+ [ srcAttribute ]: attributes.href,
32
+ caption: attributes.fileName,
33
+ id: attributes.id,
34
+ anchor: attributes.anchor,
35
+ } );
36
+ },
37
+ } );
38
+
14
39
  const transforms = {
15
40
  from: [
16
41
  {
@@ -78,66 +103,9 @@ const transforms = {
78
103
  },
79
104
  ],
80
105
  to: [
81
- {
82
- type: 'block',
83
- blocks: [ 'core/audio' ],
84
- isMatch: ( { id } ) => {
85
- if ( ! id ) {
86
- return false;
87
- }
88
- const { getEntityRecord } = select( coreStore );
89
- const media = getEntityRecord( 'postType', 'attachment', id );
90
- return !! media && media.mime_type.includes( 'audio' );
91
- },
92
- transform: ( attributes ) => {
93
- return createBlock( 'core/audio', {
94
- src: attributes.href,
95
- caption: attributes.fileName,
96
- id: attributes.id,
97
- anchor: attributes.anchor,
98
- } );
99
- },
100
- },
101
- {
102
- type: 'block',
103
- blocks: [ 'core/video' ],
104
- isMatch: ( { id } ) => {
105
- if ( ! id ) {
106
- return false;
107
- }
108
- const { getEntityRecord } = select( coreStore );
109
- const media = getEntityRecord( 'postType', 'attachment', id );
110
- return !! media && media.mime_type.includes( 'video' );
111
- },
112
- transform: ( attributes ) => {
113
- return createBlock( 'core/video', {
114
- src: attributes.href,
115
- caption: attributes.fileName,
116
- id: attributes.id,
117
- anchor: attributes.anchor,
118
- } );
119
- },
120
- },
121
- {
122
- type: 'block',
123
- blocks: [ 'core/image' ],
124
- isMatch: ( { id } ) => {
125
- if ( ! id ) {
126
- return false;
127
- }
128
- const { getEntityRecord } = select( coreStore );
129
- const media = getEntityRecord( 'postType', 'attachment', id );
130
- return !! media && media.mime_type.includes( 'image' );
131
- },
132
- transform: ( attributes ) => {
133
- return createBlock( 'core/image', {
134
- url: attributes.href,
135
- caption: attributes.fileName,
136
- id: attributes.id,
137
- anchor: attributes.anchor,
138
- } );
139
- },
140
- },
106
+ toMediaTransform( 'core/audio', 'audio', 'src' ),
107
+ toMediaTransform( 'core/video', 'video', 'src' ),
108
+ toMediaTransform( 'core/image', 'image', 'url' ),
141
109
  ],
142
110
  };
143
111
 
@@ -47,7 +47,7 @@ _Defined via the [`supports`](https://developer.wordpress.org/block-editor/refer
47
47
  - [`spacing`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#spacing):
48
48
  - `margin`: `true`
49
49
  - `padding`: `true`
50
- - `blockGap`: `["horizontal","vertical"]`
50
+ - `blockGap`: `{"sides":["horizontal","vertical"],"__experimentalDefault":"var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) )"}`
51
51
  - [`color`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#color):
52
52
  - [`text`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#color-text): `false`
53
53
  - [`background`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#color-background): `true`
@@ -142,8 +142,10 @@
142
142
  "spacing": {
143
143
  "margin": true,
144
144
  "padding": true,
145
- "blockGap": [ "horizontal", "vertical" ],
146
- "__experimentalSkipSerialization": [ "blockGap" ],
145
+ "blockGap": {
146
+ "sides": [ "horizontal", "vertical" ],
147
+ "__experimentalDefault": "var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) )"
148
+ },
147
149
  "__experimentalDefaultControls": {
148
150
  "blockGap": true,
149
151
  "margin": false,
@@ -66,7 +66,7 @@ import {
66
66
  import useImageSizes from './use-image-sizes';
67
67
  import useGetNewImages from './use-get-new-images';
68
68
  import useGetMedia from './use-get-media';
69
- import GapStyles from './gap-styles';
69
+ import GalleryGapCustomProperties from './gap-styles';
70
70
  import useDynamicGallery from './use-dynamic-gallery';
71
71
  import { GallerySourcePanel, GalleryDynamicView } from './dynamic-gallery';
72
72
  import { getDynamicSource, ATTACHED_MEDIA } from './dynamic-source';
@@ -941,8 +941,8 @@ export default function GalleryEdit( props ) {
941
941
  />
942
942
  </BlockControls>
943
943
  ) }
944
- <GapStyles
945
- blockGap={ attributes.style?.spacing?.blockGap }
944
+ <GalleryGapCustomProperties
945
+ style={ attributes.style }
946
946
  clientId={ clientId }
947
947
  />
948
948
  </>
@@ -3,35 +3,94 @@
3
3
  */
4
4
  import {
5
5
  __experimentalGetGapCSSValue as getGapCSSValue,
6
+ privateApis as blockEditorPrivateApis,
7
+ store as blockEditorStore,
6
8
  useStyleOverride,
9
+ useSettings,
7
10
  } from '@wordpress/block-editor';
11
+ import { useSelect } from '@wordpress/data';
12
+ import { privateApis as globalStylesEnginePrivateApis } from '@wordpress/global-styles-engine';
8
13
 
9
- export default function GapStyles( { blockGap, clientId } ) {
10
- // --gallery-block--gutter-size is deprecated. --wp--style--gallery-gap-default should be used by themes that want to set a default
11
- // gap on the gallery.
12
- const fallbackValue = `var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) )`;
13
- let gapValue = fallbackValue;
14
- let column = fallbackValue;
15
- let row;
16
-
17
- // Check for the possibility of split block gap values. See: https://github.com/WordPress/gutenberg/pull/37736
18
- if ( !! blockGap ) {
19
- row =
20
- typeof blockGap === 'string'
21
- ? getGapCSSValue( blockGap )
22
- : getGapCSSValue( blockGap?.top ) || fallbackValue;
14
+ /**
15
+ * Internal dependencies
16
+ */
17
+ import { unlock } from '../lock-unlock';
18
+
19
+ const { getResponsiveMediaQueries } = unlock( globalStylesEnginePrivateApis );
20
+ const { globalStylesDataKey } = unlock( blockEditorPrivateApis );
21
+ const GALLERY_BLOCK_NAME = 'core/gallery';
22
+
23
+ // --gallery-block--gutter-size is deprecated. --wp--style--gallery-gap-default should be used by themes that want to set a default
24
+ // gap on the gallery.
25
+ const FALLBACK_VALUE = `var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) )`;
26
+
27
+ function getGalleryGapCustomPropertyStyle( selector, blockGap ) {
28
+ let column = FALLBACK_VALUE;
29
+ if ( blockGap ) {
23
30
  column =
24
31
  typeof blockGap === 'string'
25
- ? getGapCSSValue( blockGap )
26
- : getGapCSSValue( blockGap?.left ) || fallbackValue;
27
- gapValue = row === column ? row : `${ row } ${ column }`;
32
+ ? getGapCSSValue( blockGap ) || FALLBACK_VALUE
33
+ : getGapCSSValue( blockGap?.left ) || FALLBACK_VALUE;
28
34
  }
29
35
 
30
36
  // The unstable gallery gap calculation requires a real value (such as `0px`) and not `0`.
31
- const gap = `#block-${ clientId } {
32
- --wp--style--unstable-gallery-gap: ${ column === '0' ? '0px' : column };
33
- gap: ${ gapValue }
37
+ return `${ selector } {
38
+ --wp--style--unstable-gallery-gap: ${ column === '0' ? '0px' : column }
34
39
  }`;
40
+ }
41
+
42
+ function getBlockGapValue( style ) {
43
+ if ( ! Object.hasOwn( style?.spacing || {}, 'blockGap' ) ) {
44
+ return undefined;
45
+ }
46
+
47
+ return style.spacing.blockGap;
48
+ }
49
+
50
+ export default function GalleryGapCustomProperties( { style, clientId } ) {
51
+ const selector = `#block-${ clientId }`;
52
+ const [ viewportSettings ] = useSettings( 'viewport' );
53
+ const globalStyles = useSelect(
54
+ ( select ) =>
55
+ select( blockEditorStore ).getSettings()?.[ globalStylesDataKey ],
56
+ []
57
+ );
58
+ const globalGalleryStyles =
59
+ globalStyles?.blocks?.[ GALLERY_BLOCK_NAME ] || {};
60
+ const styleBlockGap = getBlockGapValue( style );
61
+ const globalGalleryBlockGap =
62
+ globalGalleryStyles?.spacing?.blockGap ?? FALLBACK_VALUE;
63
+ // Prefer the block's own gap value, then Gallery global styles. Missing
64
+ // values fall back to the Gallery blockGap default.
65
+ const blockGap =
66
+ styleBlockGap === undefined ? globalGalleryBlockGap : styleBlockGap;
67
+ let gap = getGalleryGapCustomPropertyStyle( selector, blockGap );
68
+
69
+ Object.entries( getResponsiveMediaQueries( viewportSettings ) ).forEach(
70
+ ( [ viewport, mediaQuery ] ) => {
71
+ const styleViewportBlockGap = getBlockGapValue(
72
+ style?.[ viewport ]
73
+ );
74
+ // Viewport-specific block values win. Gallery global viewport values
75
+ // only apply when the block has no base gap, so they do not override an instance value.
76
+ const globalViewportBlockGap =
77
+ styleBlockGap === undefined
78
+ ? globalGalleryStyles?.[ viewport ]?.spacing?.blockGap
79
+ : undefined;
80
+ const viewportBlockGap =
81
+ styleViewportBlockGap === undefined
82
+ ? globalViewportBlockGap
83
+ : styleViewportBlockGap;
84
+ if ( viewportBlockGap === undefined || viewportBlockGap === null ) {
85
+ return;
86
+ }
87
+
88
+ gap += `${ mediaQuery }{${ getGalleryGapCustomPropertyStyle(
89
+ selector,
90
+ viewportBlockGap
91
+ ) }}`;
92
+ }
93
+ );
35
94
 
36
95
  useStyleOverride( { css: gap } );
37
96