@wordpress/block-library 10.1.1-next.v.202607070741.0 → 10.3.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 (580) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/build/accordion/block.json +1 -0
  3. package/build/accordion-panel/block.json +1 -0
  4. package/build/button/edit.cjs +18 -8
  5. package/build/button/edit.cjs.map +2 -2
  6. package/build/code/edit.cjs +3 -1
  7. package/build/code/edit.cjs.map +2 -2
  8. package/build/cover/block.json +12 -0
  9. package/build/cover/edit/block-controls.cjs +14 -5
  10. package/build/cover/edit/block-controls.cjs.map +2 -2
  11. package/build/cover/edit/embed-video-url-input.cjs +5 -3
  12. package/build/cover/edit/embed-video-url-input.cjs.map +3 -3
  13. package/build/cover/edit/index.cjs +76 -32
  14. package/build/cover/edit/index.cjs.map +2 -2
  15. package/build/cover/embed-video-utils.cjs +17 -7
  16. package/build/cover/embed-video-utils.cjs.map +2 -2
  17. package/build/details/transforms.cjs +1 -3
  18. package/build/details/transforms.cjs.map +2 -2
  19. package/build/embed/edit.cjs +1 -1
  20. package/build/embed/edit.cjs.map +2 -2
  21. package/build/embed/embed-placeholder.cjs +1 -2
  22. package/build/embed/embed-placeholder.cjs.map +2 -2
  23. package/build/file/edit.cjs +4 -3
  24. package/build/file/edit.cjs.map +2 -2
  25. package/build/file/transforms.cjs +25 -60
  26. package/build/file/transforms.cjs.map +2 -2
  27. package/build/gallery/block.json +4 -2
  28. package/build/gallery/dynamic-gallery.cjs +104 -61
  29. package/build/gallery/dynamic-gallery.cjs.map +3 -3
  30. package/build/gallery/edit.cjs +1 -1
  31. package/build/gallery/edit.cjs.map +3 -3
  32. package/build/gallery/gap-styles.cjs +49 -13
  33. package/build/gallery/gap-styles.cjs.map +3 -3
  34. package/build/gallery/use-dynamic-gallery.cjs +15 -8
  35. package/build/gallery/use-dynamic-gallery.cjs.map +2 -2
  36. package/build/group/transforms.cjs +1 -1
  37. package/build/group/transforms.cjs.map +2 -2
  38. package/build/heading/edit.cjs +1 -1
  39. package/build/heading/edit.cjs.map +2 -2
  40. package/build/html/modal.cjs +63 -54
  41. package/build/html/modal.cjs.map +3 -3
  42. package/build/icon/block.json +5 -3
  43. package/build/icon/components/custom-inserter/icon-grid.cjs +25 -12
  44. package/build/icon/components/custom-inserter/icon-grid.cjs.map +2 -2
  45. package/build/icon/components/custom-inserter/index.cjs +100 -31
  46. package/build/icon/components/custom-inserter/index.cjs.map +3 -3
  47. package/build/icon/edit.cjs +11 -12
  48. package/build/icon/edit.cjs.map +2 -2
  49. package/build/image/block.json +1 -1
  50. package/build/image/edit.cjs +1 -35
  51. package/build/image/edit.cjs.map +2 -2
  52. package/build/image/image.cjs +23 -18
  53. package/build/image/image.cjs.map +3 -3
  54. package/build/image/transforms.cjs +78 -0
  55. package/build/image/transforms.cjs.map +3 -3
  56. package/build/image/use-open-image-media-editor-modal.cjs +6 -2
  57. package/build/image/use-open-image-media-editor-modal.cjs.map +2 -2
  58. package/build/index.cjs +18 -8
  59. package/build/index.cjs.map +2 -2
  60. package/build/latest-posts/edit.cjs +5 -8
  61. package/build/latest-posts/edit.cjs.map +2 -2
  62. package/build/list-item/edit.cjs +1 -1
  63. package/build/list-item/edit.cjs.map +2 -2
  64. package/build/list-item/hooks/use-enter.cjs +14 -17
  65. package/build/list-item/hooks/use-enter.cjs.map +3 -3
  66. package/build/list-item/hooks/use-indent-list-item.cjs +10 -2
  67. package/build/list-item/hooks/use-indent-list-item.cjs.map +2 -2
  68. package/build/list-item/hooks/use-space.cjs +3 -2
  69. package/build/list-item/hooks/use-space.cjs.map +3 -3
  70. package/build/math/edit.cjs +39 -56
  71. package/build/math/edit.cjs.map +3 -3
  72. package/build/media-text/edit.cjs +2 -1
  73. package/build/media-text/edit.cjs.map +2 -2
  74. package/build/more/edit.cjs +2 -2
  75. package/build/more/edit.cjs.map +2 -2
  76. package/build/navigation/edit/index.cjs +30 -16
  77. package/build/navigation/edit/index.cjs.map +3 -3
  78. package/build/navigation/edit/use-layout-custom-properties.cjs +72 -0
  79. package/build/navigation/edit/use-layout-custom-properties.cjs.map +7 -0
  80. package/build/navigation/view.cjs +9 -6
  81. package/build/navigation/view.cjs.map +2 -2
  82. package/build/navigation-link/edit.cjs +3 -3
  83. package/build/navigation-link/edit.cjs.map +2 -2
  84. package/build/navigation-link/link-ui/index.cjs +2 -2
  85. package/build/navigation-link/link-ui/index.cjs.map +2 -2
  86. package/build/paragraph/edit.cjs +5 -2
  87. package/build/paragraph/edit.cjs.map +3 -3
  88. package/build/paragraph/index.cjs +4 -1
  89. package/build/paragraph/index.cjs.map +2 -2
  90. package/build/paragraph/use-enter.cjs +3 -7
  91. package/build/paragraph/use-enter.cjs.map +3 -3
  92. package/build/playlist/block.json +29 -10
  93. package/build/playlist/context.cjs +2 -1
  94. package/build/playlist/context.cjs.map +2 -2
  95. package/build/playlist/edit.cjs +328 -39
  96. package/build/playlist/edit.cjs.map +3 -3
  97. package/build/playlist/index.cjs +1 -1
  98. package/build/playlist/index.cjs.map +2 -2
  99. package/build/playlist/utils.cjs +37 -8
  100. package/build/playlist/utils.cjs.map +2 -2
  101. package/build/playlist/view.cjs +83 -13
  102. package/build/playlist/view.cjs.map +2 -2
  103. package/build/playlist-track/block.json +4 -2
  104. package/build/playlist-track/edit.cjs +115 -70
  105. package/build/playlist-track/edit.cjs.map +2 -2
  106. package/build/post-content/block.json +1 -0
  107. package/build/post-content/edit.cjs +36 -15
  108. package/build/post-content/edit.cjs.map +2 -2
  109. package/build/post-featured-image/edit.cjs +3 -2
  110. package/build/post-featured-image/edit.cjs.map +2 -2
  111. package/build/post-template/block.json +2 -1
  112. package/build/post-template/edit.cjs +10 -1
  113. package/build/post-template/edit.cjs.map +2 -2
  114. package/build/post-terms/edit.cjs +2 -2
  115. package/build/post-terms/edit.cjs.map +2 -2
  116. package/build/post-title/edit.cjs +2 -2
  117. package/build/post-title/edit.cjs.map +2 -2
  118. package/build/preformatted/edit.cjs +3 -1
  119. package/build/preformatted/edit.cjs.map +2 -2
  120. package/build/pullquote/block.json +3 -1
  121. package/build/pullquote/edit.cjs +5 -3
  122. package/build/pullquote/edit.cjs.map +2 -2
  123. package/build/query/block.json +3 -2
  124. package/build/query/edit/inspector-controls/index.cjs +42 -5
  125. package/build/query/edit/inspector-controls/index.cjs.map +2 -2
  126. package/build/query/edit/inspector-controls/offset-controls.cjs +1 -2
  127. package/build/query/edit/inspector-controls/offset-controls.cjs.map +2 -2
  128. package/build/query/edit/inspector-controls/pages-control.cjs +0 -1
  129. package/build/query/edit/inspector-controls/pages-control.cjs.map +2 -2
  130. package/build/query/edit/query-content.cjs +10 -3
  131. package/build/query/edit/query-content.cjs.map +2 -2
  132. package/build/query/index.cjs +2 -1
  133. package/build/query/index.cjs.map +2 -2
  134. package/build/quote/block.json +3 -1
  135. package/build/quote/transforms.cjs +1 -3
  136. package/build/quote/transforms.cjs.map +2 -2
  137. package/build/read-more/edit.cjs +3 -1
  138. package/build/read-more/edit.cjs.map +2 -2
  139. package/build/rss/edit.cjs +0 -1
  140. package/build/rss/edit.cjs.map +2 -2
  141. package/build/site-tagline/edit.cjs +3 -1
  142. package/build/site-tagline/edit.cjs.map +2 -2
  143. package/build/site-title/edit.cjs +3 -1
  144. package/build/site-title/edit.cjs.map +2 -2
  145. package/build/social-links/edit.cjs +11 -4
  146. package/build/social-links/edit.cjs.map +2 -2
  147. package/build/tab-list/block.json +4 -3
  148. package/build/tab-list/edit.cjs +67 -11
  149. package/build/tab-list/edit.cjs.map +3 -3
  150. package/build/tab-list/tab-movers.cjs +87 -0
  151. package/build/tab-list/tab-movers.cjs.map +7 -0
  152. package/build/tab-panel/block.json +1 -6
  153. package/build/tab-panel/edit.cjs +16 -24
  154. package/build/tab-panel/edit.cjs.map +2 -2
  155. package/build/tab-panels/block.json +0 -1
  156. package/build/table/edit.cjs +1 -1
  157. package/build/table/edit.cjs.map +2 -2
  158. package/build/tabs/block.json +0 -5
  159. package/build/tabs/edit.cjs +4 -39
  160. package/build/tabs/edit.cjs.map +3 -3
  161. package/build/tabs/use-tab-actions.cjs +23 -1
  162. package/build/tabs/use-tab-actions.cjs.map +2 -2
  163. package/build/tabs/use-tab-list-items-sync.cjs +19 -1
  164. package/build/tabs/use-tab-list-items-sync.cjs.map +2 -2
  165. package/build/term-name/block.json +1 -3
  166. package/build/term-name/deprecated.cjs +105 -0
  167. package/build/term-name/deprecated.cjs.map +7 -0
  168. package/build/term-name/edit.cjs +11 -37
  169. package/build/term-name/edit.cjs.map +3 -3
  170. package/build/term-name/index.cjs +3 -1
  171. package/build/term-name/index.cjs.map +3 -3
  172. package/build/utils/caption.cjs +2 -2
  173. package/build/utils/caption.cjs.map +2 -2
  174. package/build/utils/waveform-player.cjs +138 -22
  175. package/build/utils/waveform-player.cjs.map +2 -2
  176. package/build/utils/waveform-utils.cjs +315 -17
  177. package/build/utils/waveform-utils.cjs.map +2 -2
  178. package/build/verse/edit.cjs +3 -1
  179. package/build/verse/edit.cjs.map +2 -2
  180. package/build/video/edit.cjs +2 -11
  181. package/build/video/edit.cjs.map +3 -3
  182. package/build/video/tracks-editor.cjs +0 -1
  183. package/build/video/tracks-editor.cjs.map +2 -2
  184. package/build-module/accordion/block.json +1 -0
  185. package/build-module/accordion-panel/block.json +1 -0
  186. package/build-module/button/edit.mjs +19 -14
  187. package/build-module/button/edit.mjs.map +2 -2
  188. package/build-module/code/edit.mjs +3 -1
  189. package/build-module/code/edit.mjs.map +2 -2
  190. package/build-module/cover/block.json +12 -0
  191. package/build-module/cover/edit/block-controls.mjs +14 -5
  192. package/build-module/cover/edit/block-controls.mjs.map +2 -2
  193. package/build-module/cover/edit/embed-video-url-input.mjs +5 -4
  194. package/build-module/cover/edit/embed-video-url-input.mjs.map +2 -2
  195. package/build-module/cover/edit/index.mjs +79 -35
  196. package/build-module/cover/edit/index.mjs.map +2 -2
  197. package/build-module/cover/embed-video-utils.mjs +16 -7
  198. package/build-module/cover/embed-video-utils.mjs.map +2 -2
  199. package/build-module/details/transforms.mjs +2 -7
  200. package/build-module/details/transforms.mjs.map +2 -2
  201. package/build-module/embed/edit.mjs +1 -1
  202. package/build-module/embed/edit.mjs.map +2 -2
  203. package/build-module/embed/embed-placeholder.mjs +1 -2
  204. package/build-module/embed/embed-placeholder.mjs.map +2 -2
  205. package/build-module/file/edit.mjs +4 -3
  206. package/build-module/file/edit.mjs.map +2 -2
  207. package/build-module/file/transforms.mjs +25 -60
  208. package/build-module/file/transforms.mjs.map +2 -2
  209. package/build-module/gallery/block.json +4 -2
  210. package/build-module/gallery/dynamic-gallery.mjs +104 -61
  211. package/build-module/gallery/dynamic-gallery.mjs.map +2 -2
  212. package/build-module/gallery/edit.mjs +3 -3
  213. package/build-module/gallery/edit.mjs.map +2 -2
  214. package/build-module/gallery/gap-styles.mjs +53 -14
  215. package/build-module/gallery/gap-styles.mjs.map +2 -2
  216. package/build-module/gallery/use-dynamic-gallery.mjs +16 -9
  217. package/build-module/gallery/use-dynamic-gallery.mjs.map +2 -2
  218. package/build-module/group/transforms.mjs +2 -5
  219. package/build-module/group/transforms.mjs.map +2 -2
  220. package/build-module/heading/edit.mjs +1 -1
  221. package/build-module/heading/edit.mjs.map +2 -2
  222. package/build-module/html/modal.mjs +68 -55
  223. package/build-module/html/modal.mjs.map +2 -2
  224. package/build-module/icon/block.json +5 -3
  225. package/build-module/icon/components/custom-inserter/icon-grid.mjs +25 -12
  226. package/build-module/icon/components/custom-inserter/icon-grid.mjs.map +2 -2
  227. package/build-module/icon/components/custom-inserter/index.mjs +102 -33
  228. package/build-module/icon/components/custom-inserter/index.mjs.map +2 -2
  229. package/build-module/icon/edit.mjs +11 -12
  230. package/build-module/icon/edit.mjs.map +2 -2
  231. package/build-module/image/block.json +1 -1
  232. package/build-module/image/edit.mjs +1 -35
  233. package/build-module/image/edit.mjs.map +2 -2
  234. package/build-module/image/image.mjs +23 -18
  235. package/build-module/image/image.mjs.map +2 -2
  236. package/build-module/image/transforms.mjs +78 -0
  237. package/build-module/image/transforms.mjs.map +2 -2
  238. package/build-module/image/use-open-image-media-editor-modal.mjs +6 -2
  239. package/build-module/image/use-open-image-media-editor-modal.mjs.map +2 -2
  240. package/build-module/index.mjs +18 -8
  241. package/build-module/index.mjs.map +2 -2
  242. package/build-module/latest-posts/edit.mjs +5 -8
  243. package/build-module/latest-posts/edit.mjs.map +2 -2
  244. package/build-module/list-item/edit.mjs +1 -1
  245. package/build-module/list-item/edit.mjs.map +2 -2
  246. package/build-module/list-item/hooks/use-enter.mjs +15 -21
  247. package/build-module/list-item/hooks/use-enter.mjs.map +2 -2
  248. package/build-module/list-item/hooks/use-indent-list-item.mjs +10 -2
  249. package/build-module/list-item/hooks/use-indent-list-item.mjs.map +2 -2
  250. package/build-module/list-item/hooks/use-space.mjs +4 -6
  251. package/build-module/list-item/hooks/use-space.mjs.map +2 -2
  252. package/build-module/math/edit.mjs +41 -60
  253. package/build-module/math/edit.mjs.map +2 -2
  254. package/build-module/media-text/edit.mjs +2 -1
  255. package/build-module/media-text/edit.mjs.map +2 -2
  256. package/build-module/more/edit.mjs +2 -2
  257. package/build-module/more/edit.mjs.map +2 -2
  258. package/build-module/navigation/edit/index.mjs +30 -16
  259. package/build-module/navigation/edit/index.mjs.map +2 -2
  260. package/build-module/navigation/edit/use-layout-custom-properties.mjs +51 -0
  261. package/build-module/navigation/edit/use-layout-custom-properties.mjs.map +7 -0
  262. package/build-module/navigation/view.mjs +9 -6
  263. package/build-module/navigation/view.mjs.map +2 -2
  264. package/build-module/navigation-link/edit.mjs +3 -3
  265. package/build-module/navigation-link/edit.mjs.map +2 -2
  266. package/build-module/navigation-link/link-ui/index.mjs +2 -2
  267. package/build-module/navigation-link/link-ui/index.mjs.map +2 -2
  268. package/build-module/paragraph/edit.mjs +6 -2
  269. package/build-module/paragraph/edit.mjs.map +2 -2
  270. package/build-module/paragraph/index.mjs +4 -1
  271. package/build-module/paragraph/index.mjs.map +2 -2
  272. package/build-module/paragraph/use-enter.mjs +4 -11
  273. package/build-module/paragraph/use-enter.mjs.map +2 -2
  274. package/build-module/playlist/block.json +29 -10
  275. package/build-module/playlist/context.mjs +2 -1
  276. package/build-module/playlist/context.mjs.map +2 -2
  277. package/build-module/playlist/edit.mjs +331 -41
  278. package/build-module/playlist/edit.mjs.map +2 -2
  279. package/build-module/playlist/index.mjs +1 -1
  280. package/build-module/playlist/index.mjs.map +2 -2
  281. package/build-module/playlist/utils.mjs +35 -7
  282. package/build-module/playlist/utils.mjs.map +2 -2
  283. package/build-module/playlist/view.mjs +89 -14
  284. package/build-module/playlist/view.mjs.map +2 -2
  285. package/build-module/playlist-track/block.json +4 -2
  286. package/build-module/playlist-track/edit.mjs +117 -71
  287. package/build-module/playlist-track/edit.mjs.map +2 -2
  288. package/build-module/post-content/block.json +1 -0
  289. package/build-module/post-content/edit.mjs +37 -15
  290. package/build-module/post-content/edit.mjs.map +2 -2
  291. package/build-module/post-featured-image/edit.mjs +3 -2
  292. package/build-module/post-featured-image/edit.mjs.map +2 -2
  293. package/build-module/post-template/block.json +2 -1
  294. package/build-module/post-template/edit.mjs +10 -1
  295. package/build-module/post-template/edit.mjs.map +2 -2
  296. package/build-module/post-terms/edit.mjs +2 -2
  297. package/build-module/post-terms/edit.mjs.map +2 -2
  298. package/build-module/post-title/edit.mjs +2 -2
  299. package/build-module/post-title/edit.mjs.map +2 -2
  300. package/build-module/preformatted/edit.mjs +3 -1
  301. package/build-module/preformatted/edit.mjs.map +2 -2
  302. package/build-module/pullquote/block.json +3 -1
  303. package/build-module/pullquote/edit.mjs +5 -3
  304. package/build-module/pullquote/edit.mjs.map +2 -2
  305. package/build-module/query/block.json +3 -2
  306. package/build-module/query/edit/inspector-controls/index.mjs +44 -6
  307. package/build-module/query/edit/inspector-controls/index.mjs.map +2 -2
  308. package/build-module/query/edit/inspector-controls/offset-controls.mjs +2 -3
  309. package/build-module/query/edit/inspector-controls/offset-controls.mjs.map +2 -2
  310. package/build-module/query/edit/inspector-controls/pages-control.mjs +0 -1
  311. package/build-module/query/edit/inspector-controls/pages-control.mjs.map +2 -2
  312. package/build-module/query/edit/query-content.mjs +10 -3
  313. package/build-module/query/edit/query-content.mjs.map +2 -2
  314. package/build-module/query/index.mjs +2 -1
  315. package/build-module/query/index.mjs.map +2 -2
  316. package/build-module/quote/block.json +3 -1
  317. package/build-module/quote/transforms.mjs +2 -4
  318. package/build-module/quote/transforms.mjs.map +2 -2
  319. package/build-module/read-more/edit.mjs +3 -1
  320. package/build-module/read-more/edit.mjs.map +2 -2
  321. package/build-module/rss/edit.mjs +0 -1
  322. package/build-module/rss/edit.mjs.map +2 -2
  323. package/build-module/site-tagline/edit.mjs +3 -1
  324. package/build-module/site-tagline/edit.mjs.map +2 -2
  325. package/build-module/site-title/edit.mjs +3 -1
  326. package/build-module/site-title/edit.mjs.map +2 -2
  327. package/build-module/social-links/edit.mjs +11 -4
  328. package/build-module/social-links/edit.mjs.map +2 -2
  329. package/build-module/tab-list/block.json +4 -3
  330. package/build-module/tab-list/edit.mjs +74 -13
  331. package/build-module/tab-list/edit.mjs.map +2 -2
  332. package/build-module/tab-list/tab-movers.mjs +59 -0
  333. package/build-module/tab-list/tab-movers.mjs.map +7 -0
  334. package/build-module/tab-panel/block.json +1 -6
  335. package/build-module/tab-panel/edit.mjs +17 -25
  336. package/build-module/tab-panel/edit.mjs.map +2 -2
  337. package/build-module/tab-panels/block.json +0 -1
  338. package/build-module/table/edit.mjs +1 -1
  339. package/build-module/table/edit.mjs.map +2 -2
  340. package/build-module/tabs/block.json +0 -5
  341. package/build-module/tabs/edit.mjs +5 -45
  342. package/build-module/tabs/edit.mjs.map +2 -2
  343. package/build-module/tabs/use-tab-actions.mjs +23 -1
  344. package/build-module/tabs/use-tab-actions.mjs.map +2 -2
  345. package/build-module/tabs/use-tab-list-items-sync.mjs +19 -1
  346. package/build-module/tabs/use-tab-list-items-sync.mjs.map +2 -2
  347. package/build-module/term-name/block.json +1 -3
  348. package/build-module/term-name/deprecated.mjs +74 -0
  349. package/build-module/term-name/deprecated.mjs.map +7 -0
  350. package/build-module/term-name/edit.mjs +11 -28
  351. package/build-module/term-name/edit.mjs.map +2 -2
  352. package/build-module/term-name/index.mjs +3 -1
  353. package/build-module/term-name/index.mjs.map +2 -2
  354. package/build-module/utils/caption.mjs +2 -2
  355. package/build-module/utils/caption.mjs.map +2 -2
  356. package/build-module/utils/waveform-player.mjs +144 -23
  357. package/build-module/utils/waveform-player.mjs.map +2 -2
  358. package/build-module/utils/waveform-utils.mjs +310 -16
  359. package/build-module/utils/waveform-utils.mjs.map +2 -2
  360. package/build-module/verse/edit.mjs +3 -1
  361. package/build-module/verse/edit.mjs.map +2 -2
  362. package/build-module/video/edit.mjs +2 -11
  363. package/build-module/video/edit.mjs.map +2 -2
  364. package/build-module/video/tracks-editor.mjs +0 -1
  365. package/build-module/video/tracks-editor.mjs.map +2 -2
  366. package/build-style/cover/editor-rtl.css +3 -0
  367. package/build-style/cover/editor.css +3 -0
  368. package/build-style/editor-rtl.css +61 -59
  369. package/build-style/editor.css +61 -59
  370. package/build-style/icon/editor-rtl.css +80 -10
  371. package/build-style/icon/editor.css +80 -10
  372. package/build-style/image/editor-rtl.css +3 -32
  373. package/build-style/image/editor.css +3 -32
  374. package/build-style/more/editor-rtl.css +2 -2
  375. package/build-style/more/editor.css +2 -2
  376. package/build-style/navigation/editor-rtl.css +3 -4
  377. package/build-style/navigation/editor.css +3 -4
  378. package/build-style/navigation-link/editor-rtl.css +1 -1
  379. package/build-style/navigation-link/editor.css +1 -1
  380. package/build-style/nextpage/editor-rtl.css +2 -2
  381. package/build-style/nextpage/editor.css +2 -2
  382. package/build-style/playlist/editor-rtl.css +4 -3
  383. package/build-style/playlist/editor.css +4 -3
  384. package/build-style/playlist/style-rtl.css +81 -5
  385. package/build-style/playlist/style.css +81 -5
  386. package/build-style/playlist-track/style-rtl.css +10 -0
  387. package/build-style/playlist-track/style.css +10 -0
  388. package/build-style/pullquote/editor-rtl.css +4 -0
  389. package/build-style/pullquote/editor.css +4 -0
  390. package/build-style/style-rtl.css +91 -5
  391. package/build-style/style.css +91 -5
  392. package/build-style/tab-list/editor-rtl.css +101 -0
  393. package/build-style/tab-list/editor.css +101 -0
  394. package/build-style/video/editor-rtl.css +1 -1
  395. package/build-style/video/editor.css +1 -1
  396. package/build-types/table-of-contents/list.d.ts +1 -1
  397. package/build-types/table-of-contents/list.d.ts.map +1 -1
  398. package/package.json +47 -45
  399. package/src/accordion/README.md +1 -0
  400. package/src/accordion/block.json +1 -0
  401. package/src/accordion-panel/block.json +1 -0
  402. package/src/breadcrumbs/index.php +3 -1
  403. package/src/button/edit.js +21 -15
  404. package/src/button/index.php +1 -1
  405. package/src/code/edit.js +7 -2
  406. package/src/cover/README.md +60 -0
  407. package/src/cover/block.json +12 -0
  408. package/src/cover/edit/block-controls.js +26 -11
  409. package/src/cover/edit/embed-video-url-input.js +5 -4
  410. package/src/cover/edit/index.js +109 -46
  411. package/src/cover/editor.scss +6 -0
  412. package/src/cover/embed-video-utils.js +38 -13
  413. package/src/cover/index.php +9 -2
  414. package/src/details/transforms.js +2 -7
  415. package/src/editor.scss +1 -0
  416. package/src/embed/edit.js +3 -1
  417. package/src/embed/embed-placeholder.js +9 -8
  418. package/src/file/edit.js +8 -8
  419. package/src/file/transforms.js +28 -60
  420. package/src/form/index.php +6 -4
  421. package/src/gallery/README.md +1 -1
  422. package/src/gallery/block.json +4 -2
  423. package/src/gallery/dynamic-gallery.js +133 -74
  424. package/src/gallery/edit.js +3 -3
  425. package/src/gallery/gap-styles.js +79 -20
  426. package/src/gallery/index.php +103 -43
  427. package/src/gallery/use-dynamic-gallery.js +27 -12
  428. package/src/group/transforms.js +2 -5
  429. package/src/heading/edit.js +1 -1
  430. package/src/html/modal.js +13 -2
  431. package/src/icon/README.md +1 -3
  432. package/src/icon/block.json +5 -3
  433. package/src/icon/components/custom-inserter/icon-grid.js +40 -11
  434. package/src/icon/components/custom-inserter/index.js +98 -25
  435. package/src/icon/edit.js +11 -17
  436. package/src/icon/editor.scss +33 -11
  437. package/src/image/README.md +1 -1
  438. package/src/image/block.json +1 -1
  439. package/src/image/edit.js +1 -57
  440. package/src/image/editor.scss +6 -44
  441. package/src/image/image.js +56 -27
  442. package/src/image/test/use-open-image-media-editor-modal.js +37 -1
  443. package/src/image/transforms.js +128 -0
  444. package/src/image/use-open-image-media-editor-modal.js +8 -1
  445. package/src/index.js +19 -7
  446. package/src/latest-posts/edit.js +5 -8
  447. package/src/latest-posts/index.php +49 -18
  448. package/src/list-item/edit.js +1 -1
  449. package/src/list-item/hooks/use-enter.js +15 -22
  450. package/src/list-item/hooks/use-indent-list-item.js +10 -1
  451. package/src/list-item/hooks/use-space.js +4 -6
  452. package/src/math/edit.js +42 -59
  453. package/src/media-text/edit.js +1 -0
  454. package/src/media-text/editor.scss +1 -0
  455. package/src/media-text/index.php +11 -2
  456. package/src/more/edit.js +7 -4
  457. package/src/more/editor.scss +1 -1
  458. package/src/navigation/edit/index.js +52 -36
  459. package/src/navigation/edit/test/layout-custom-properties.js +138 -0
  460. package/src/navigation/edit/use-layout-custom-properties.js +84 -0
  461. package/src/navigation/editor.scss +1 -2
  462. package/src/navigation/index.php +123 -12
  463. package/src/navigation/test/view.js +51 -0
  464. package/src/navigation/view.js +15 -14
  465. package/src/navigation-link/edit.js +11 -7
  466. package/src/navigation-link/editor.scss +1 -1
  467. package/src/navigation-link/index.php +70 -3
  468. package/src/navigation-link/link-ui/index.js +2 -1
  469. package/src/navigation-link/test/__snapshots__/hooks.js.snap +1 -1
  470. package/src/navigation-submenu/index.php +6 -3
  471. package/src/nextpage/editor.scss +1 -1
  472. package/src/page-list/index.php +4 -3
  473. package/src/paragraph/edit.js +9 -2
  474. package/src/paragraph/index.js +4 -1
  475. package/src/paragraph/use-enter.js +4 -11
  476. package/src/pattern/index.php +5 -5
  477. package/src/playlist/README.md +17 -18
  478. package/src/playlist/block.json +29 -10
  479. package/src/playlist/context.js +1 -0
  480. package/src/playlist/edit.js +395 -59
  481. package/src/playlist/editor.scss +4 -5
  482. package/src/playlist/index.js +1 -1
  483. package/src/playlist/index.php +71 -22
  484. package/src/playlist/style.scss +54 -1
  485. package/src/playlist/test/edit-component.js +139 -0
  486. package/src/playlist/test/edit.js +43 -2
  487. package/src/playlist/utils.js +49 -10
  488. package/src/playlist/view.js +97 -16
  489. package/src/playlist-track/README.md +3 -3
  490. package/src/playlist-track/block.json +4 -2
  491. package/src/playlist-track/edit.js +116 -75
  492. package/src/playlist-track/index.php +26 -11
  493. package/src/playlist-track/style.scss +10 -0
  494. package/src/playlist-track/test/edit.js +253 -0
  495. package/src/post-content/README.md +1 -0
  496. package/src/post-content/block.json +1 -0
  497. package/src/post-content/edit.js +45 -16
  498. package/src/post-excerpt/index.php +4 -1
  499. package/src/post-featured-image/edit.js +3 -2
  500. package/src/post-featured-image/index.php +4 -1
  501. package/src/post-template/README.md +1 -0
  502. package/src/post-template/block.json +2 -1
  503. package/src/post-template/edit.js +9 -0
  504. package/src/post-terms/edit.js +7 -4
  505. package/src/post-title/edit.js +5 -3
  506. package/src/preformatted/edit.js +7 -2
  507. package/src/pullquote/README.md +1 -0
  508. package/src/pullquote/block.json +3 -1
  509. package/src/pullquote/edit.js +9 -4
  510. package/src/pullquote/editor.scss +6 -0
  511. package/src/query/README.md +2 -1
  512. package/src/query/block.json +3 -2
  513. package/src/query/edit/inspector-controls/index.js +47 -4
  514. package/src/query/edit/inspector-controls/offset-controls.js +2 -3
  515. package/src/query/edit/inspector-controls/pages-control.js +0 -1
  516. package/src/query/edit/query-content.js +19 -3
  517. package/src/query/index.js +1 -0
  518. package/src/quote/README.md +1 -0
  519. package/src/quote/block.json +3 -1
  520. package/src/quote/transforms.js +2 -4
  521. package/src/read-more/edit.js +7 -2
  522. package/src/rss/edit.js +0 -1
  523. package/src/rss/index.php +10 -4
  524. package/src/site-tagline/edit.js +7 -2
  525. package/src/site-title/edit.js +7 -2
  526. package/src/social-link/index.php +19 -9
  527. package/src/social-links/edit.js +21 -12
  528. package/src/tab-list/README.md +4 -5
  529. package/src/tab-list/block.json +4 -3
  530. package/src/tab-list/edit.js +92 -28
  531. package/src/tab-list/editor.scss +9 -0
  532. package/src/tab-list/index.php +9 -4
  533. package/src/tab-list/tab-movers.js +72 -0
  534. package/src/tab-panel/README.md +4 -6
  535. package/src/tab-panel/block.json +1 -6
  536. package/src/tab-panel/edit.js +20 -33
  537. package/src/tab-panels/README.md +5 -3
  538. package/src/tab-panels/block.json +0 -1
  539. package/src/table/edit.js +1 -1
  540. package/src/table-of-contents/index.php +386 -1
  541. package/src/tabs/README.md +18 -9
  542. package/src/tabs/block.json +0 -5
  543. package/src/tabs/edit.js +7 -64
  544. package/src/tabs/use-tab-actions.js +32 -3
  545. package/src/tabs/use-tab-list-items-sync.js +24 -4
  546. package/src/tag-cloud/index.php +3 -2
  547. package/src/template-part/index.php +3 -17
  548. package/src/term-name/README.md +1 -1
  549. package/src/term-name/block.json +1 -3
  550. package/src/term-name/deprecated.js +74 -0
  551. package/src/term-name/edit.js +2 -18
  552. package/src/term-name/index.js +2 -0
  553. package/src/utils/caption.js +7 -4
  554. package/src/utils/media-control.scss +1 -5
  555. package/src/utils/test/waveform-player.js +297 -34
  556. package/src/utils/test/waveform-utils.js +473 -5
  557. package/src/utils/waveform-player.js +189 -59
  558. package/src/utils/waveform-utils.js +443 -40
  559. package/src/verse/edit.js +7 -2
  560. package/src/video/edit.js +0 -8
  561. package/src/video/editor.scss +1 -1
  562. package/src/video/index.php +2 -2
  563. package/src/video/tracks-editor.js +0 -1
  564. package/build/image/animated-gif-convert-control.cjs +0 -105
  565. package/build/image/animated-gif-convert-control.cjs.map +0 -7
  566. package/build/utils/gif-conversion-attributes.cjs +0 -40
  567. package/build/utils/gif-conversion-attributes.cjs.map +0 -7
  568. package/build/video/gif-restore-control.cjs +0 -73
  569. package/build/video/gif-restore-control.cjs.map +0 -7
  570. package/build-module/image/animated-gif-convert-control.mjs +0 -87
  571. package/build-module/image/animated-gif-convert-control.mjs.map +0 -7
  572. package/build-module/utils/gif-conversion-attributes.mjs +0 -15
  573. package/build-module/utils/gif-conversion-attributes.mjs.map +0 -7
  574. package/build-module/video/gif-restore-control.mjs +0 -55
  575. package/build-module/video/gif-restore-control.mjs.map +0 -7
  576. package/src/image/animated-gif-convert-control.js +0 -135
  577. package/src/image/test/animated-gif-convert-control.js +0 -276
  578. package/src/utils/gif-conversion-attributes.js +0 -30
  579. package/src/utils/test/gif-conversion-attributes.js +0 -60
  580. package/src/video/gif-restore-control.js +0 -92
@@ -13,6 +13,7 @@ import {
13
13
  useLayoutEffect,
14
14
  useMemo,
15
15
  useRef,
16
+ useState,
16
17
  } from '@wordpress/element';
17
18
  import { Placeholder, SandBox, Spinner } from '@wordpress/components';
18
19
  import { compose, useResizeObserver } from '@wordpress/compose';
@@ -20,7 +21,6 @@ import {
20
21
  withColors,
21
22
  ColorPalette,
22
23
  useBlockProps,
23
- useSettings,
24
24
  useInnerBlocksProps,
25
25
  __experimentalUseGradient,
26
26
  store as blockEditorStore,
@@ -28,7 +28,8 @@ import {
28
28
  privateApis as blockEditorPrivateApis,
29
29
  } from '@wordpress/block-editor';
30
30
  import { __ } from '@wordpress/i18n';
31
- import { useSelect, useDispatch } from '@wordpress/data';
31
+ import { useSelect, useDispatch, useRegistry } from '@wordpress/data';
32
+ import { createBlocksFromInnerBlocksTemplate } from '@wordpress/blocks';
32
33
  import { isBlobURL } from '@wordpress/blob';
33
34
  import { store as noticesStore } from '@wordpress/notices';
34
35
 
@@ -134,8 +135,9 @@ function CoverEdit( {
134
135
  []
135
136
  );
136
137
 
137
- const { __unstableMarkNextChangeAsNotPersistent } =
138
+ const { __unstableMarkNextChangeAsNotPersistent, replaceInnerBlocks } =
138
139
  useDispatch( blockEditorStore );
140
+ const registry = useRegistry();
139
141
 
140
142
  // Ref to access latest values after async operations (e.g. getMediaColor),
141
143
  // avoiding stale values that could overwrite concurrent remote changes.
@@ -225,6 +227,35 @@ function CoverEdit( {
225
227
  const { createErrorNotice } = useDispatch( noticesStore );
226
228
  const { gradientClass, gradientValue } = __experimentalUseGradient();
227
229
 
230
+ // Create the initial inner paragraph when the block gains a background
231
+ // and has no content yet.
232
+ const scaffoldInnerBlocks = () => {
233
+ const {
234
+ getBlocks,
235
+ isBlockSelected,
236
+ getSelectedBlocksInitialCaretPosition,
237
+ } = registry.select( blockEditorStore );
238
+ if ( getBlocks( clientId ).length > 0 ) {
239
+ return;
240
+ }
241
+ // Check for fontSize support before we pass a fontSize attribute to
242
+ // the innerBlocks.
243
+ const [ fontSizes ] = unlock(
244
+ registry.select( blockEditorStore )
245
+ ).getBlockSettings( clientId, 'typography.fontSizes' );
246
+ const hasFontSizes = fontSizes?.length > 0;
247
+ replaceInnerBlocks(
248
+ clientId,
249
+ createBlocksFromInnerBlocksTemplate(
250
+ getInnerBlocksTemplate( {
251
+ fontSize: hasFontSizes ? 'large' : undefined,
252
+ } )
253
+ ),
254
+ isBlockSelected( clientId ),
255
+ getSelectedBlocksInitialCaretPosition()
256
+ );
257
+ };
258
+
228
259
  const onSelectMedia = async ( newMedia ) => {
229
260
  const mediaAttributes = attributesFromMedia( newMedia );
230
261
  const isImage = [ newMedia?.type, newMedia?.media_type ].includes(
@@ -243,8 +274,7 @@ function CoverEdit( {
243
274
  if ( ! currentAttrs.isUserOverlayColor ) {
244
275
  newOverlayColor = averageBackgroundColor;
245
276
  setOverlayColor( newOverlayColor );
246
-
247
- // Make undo revert the next setAttributes and the previous setOverlayColor.
277
+ // Fold next attribute change into the same undo level as the setOverlayColor above.
248
278
  __unstableMarkNextChangeAsNotPersistent();
249
279
  }
250
280
 
@@ -290,23 +320,29 @@ function CoverEdit( {
290
320
  }
291
321
  }
292
322
 
293
- setAttributes( {
294
- ...mediaAttributes,
295
- focalPoint: undefined,
296
- useFeaturedImage: undefined,
297
- dimRatio: newDimRatio,
298
- isDark: newIsDark,
299
- isUserOverlayColor: currentAttrs.isUserOverlayColor || false,
323
+ registry.batch( () => {
324
+ setAttributes( {
325
+ ...mediaAttributes,
326
+ focalPoint: undefined,
327
+ useFeaturedImage: undefined,
328
+ dimRatio: newDimRatio,
329
+ isDark: newIsDark,
330
+ isUserOverlayColor: currentAttrs.isUserOverlayColor || false,
331
+ } );
332
+
333
+ scaffoldInnerBlocks();
300
334
  } );
301
335
  };
302
336
 
303
337
  const onClearMedia = () => {
304
338
  let newOverlayColor = overlayColor.color;
305
- if ( ! isUserOverlayColor ) {
339
+
340
+ // Skip for embeds, which never auto-assign an overlay color; otherwise
341
+ // the non-persistent flag lands on the media reset itself (unsaveable).
342
+ if ( ! isUserOverlayColor && overlayColor.color ) {
306
343
  newOverlayColor = DEFAULT_OVERLAY_COLOR;
307
344
  setOverlayColor( undefined );
308
-
309
- // Make undo revert the next setAttributes and the previous setOverlayColor.
345
+ // Fold next attribute change into the same undo level as the setOverlayColor above.
310
346
  __unstableMarkNextChangeAsNotPersistent();
311
347
  }
312
348
 
@@ -341,13 +377,20 @@ function CoverEdit( {
341
377
  );
342
378
 
343
379
  setOverlayColor( newOverlayColor );
344
-
345
- // Make undo revert the next setAttributes and the previous setOverlayColor.
380
+ // Fold next attribute change into the same undo level as the setOverlayColor above.
346
381
  __unstableMarkNextChangeAsNotPersistent();
347
382
 
348
- setAttributes( {
349
- isUserOverlayColor: true,
350
- isDark: newIsDark,
383
+ registry.batch( () => {
384
+ setAttributes( {
385
+ isUserOverlayColor: true,
386
+ isDark: newIsDark,
387
+ } );
388
+
389
+ // Skip when the color is cleared: that returns the block to its
390
+ // placeholder, which only renders while there is no content.
391
+ if ( newOverlayColor ) {
392
+ scaffoldInnerBlocks();
393
+ }
351
394
  } );
352
395
  };
353
396
 
@@ -424,6 +467,12 @@ function CoverEdit( {
424
467
  return getBackgroundEmbedHtml( embedPreview.html );
425
468
  }, [ embedPreview, backgroundType ] );
426
469
 
470
+ // Set while the media editor has pointed the cover at a freshly
471
+ // generated file the browser hasn't finished loading; cleared by the
472
+ // background <img> load/error handlers (or immediately after
473
+ // setAttributes for CSS backgrounds, which never fire load events).
474
+ const [ isSwappingMedia, setIsSwappingMedia ] = useState( false );
475
+
427
476
  const isUploadingMedia = isTemporaryMedia( id, url );
428
477
 
429
478
  const isImageBackground = IMAGE_BACKGROUND_TYPE === backgroundType;
@@ -477,22 +526,11 @@ function CoverEdit( {
477
526
  const ref = useRef();
478
527
  const blockProps = useBlockProps( { ref } );
479
528
 
480
- // Check for fontSize support before we pass a fontSize attribute to the innerBlocks.
481
- const [ fontSizes ] = useSettings( 'typography.fontSizes' );
482
- const hasFontSizes = fontSizes?.length > 0;
483
- const innerBlocksTemplate = getInnerBlocksTemplate( {
484
- fontSize: hasFontSizes ? 'large' : undefined,
485
- } );
486
-
487
529
  const innerBlocksProps = useInnerBlocksProps(
488
530
  {
489
531
  className: 'wp-block-cover__inner-container',
490
532
  },
491
533
  {
492
- // Avoid template sync when the `templateLock` value is `all` or `contentOnly`.
493
- // See: https://github.com/WordPress/gutenberg/pull/45632
494
- template: ! hasInnerBlocks ? innerBlocksTemplate : undefined,
495
- templateInsertUpdatesSelection: true,
496
534
  allowedBlocks,
497
535
  templateLock,
498
536
  dropZoneElement: ref.current,
@@ -526,6 +564,10 @@ function CoverEdit( {
526
564
  return;
527
565
  }
528
566
 
567
+ if ( newId !== id && newUrl ) {
568
+ setIsSwappingMedia( true );
569
+ }
570
+
529
571
  const nextAttributes = {
530
572
  id: newId,
531
573
  backgroundType: IMAGE_BACKGROUND_TYPE,
@@ -549,8 +591,7 @@ function CoverEdit( {
549
591
  if ( ! currentAttrs.isUserOverlayColor ) {
550
592
  newOverlayColor = averageBackgroundColor;
551
593
  setOverlayColor( newOverlayColor );
552
-
553
- // Make undo revert the next setAttributes and the previous setOverlayColor.
594
+ // Fold next attribute change into the same undo level as the setOverlayColor above.
554
595
  __unstableMarkNextChangeAsNotPersistent();
555
596
  }
556
597
 
@@ -564,6 +605,17 @@ function CoverEdit( {
564
605
  }
565
606
 
566
607
  setAttributes( nextAttributes );
608
+
609
+ // A CSS background (parallax/repeated) renders as a div and
610
+ // never fires a load event; getMediaColor already fetched
611
+ // the file, so the swap is done once attributes are set.
612
+ const {
613
+ hasParallax: currentHasParallax,
614
+ isRepeated: currentIsRepeated,
615
+ } = propsRef.current.attributes;
616
+ if ( currentHasParallax || currentIsRepeated ) {
617
+ setIsSwappingMedia( false );
618
+ }
567
619
  },
568
620
  } );
569
621
  }, [
@@ -604,8 +656,7 @@ function CoverEdit( {
604
656
  } else {
605
657
  setOverlayColor( undefined );
606
658
  }
607
-
608
- // Make undo revert the next setAttributes and the previous setOverlayColor.
659
+ // Fold next attribute change into the same undo level as the setOverlayColor above.
609
660
  __unstableMarkNextChangeAsNotPersistent();
610
661
  }
611
662
 
@@ -617,15 +668,24 @@ function CoverEdit( {
617
668
  averageBackgroundColor
618
669
  );
619
670
 
620
- setAttributes( {
621
- id: undefined,
622
- url: undefined,
623
- useFeaturedImage: newUseFeaturedImage,
624
- dimRatio: newDimRatio,
625
- backgroundType: useFeaturedImage
626
- ? IMAGE_BACKGROUND_TYPE
627
- : undefined,
628
- isDark: newIsDark,
671
+ registry.batch( () => {
672
+ setAttributes( {
673
+ id: undefined,
674
+ url: undefined,
675
+ useFeaturedImage: newUseFeaturedImage,
676
+ dimRatio: newDimRatio,
677
+ backgroundType: useFeaturedImage
678
+ ? IMAGE_BACKGROUND_TYPE
679
+ : undefined,
680
+ isDark: newIsDark,
681
+ } );
682
+
683
+ // Skip when the featured image is disabled: that can return the
684
+ // block to its placeholder, which only renders while there is no
685
+ // content.
686
+ if ( newUseFeaturedImage ) {
687
+ scaffoldInnerBlocks();
688
+ }
629
689
  } );
630
690
  };
631
691
 
@@ -642,6 +702,7 @@ function CoverEdit( {
642
702
  onEditMedia={ openCoverMediaEditorModal }
643
703
  editMediaButtonRef={ editMediaButtonRef }
644
704
  showEditMediaButton={ showEditMediaButton }
705
+ isEditMediaDisabled={ isSwappingMedia }
645
706
  />
646
707
  );
647
708
 
@@ -724,7 +785,7 @@ function CoverEdit( {
724
785
  {
725
786
  'is-dark-theme': isDark,
726
787
  'is-light': ! isDark,
727
- 'is-transient': isUploadingMedia,
788
+ 'is-transient': isUploadingMedia || isSwappingMedia,
728
789
  'has-parallax': hasParallax,
729
790
  'is-repeated': isRepeated,
730
791
  'has-custom-content-position':
@@ -764,6 +825,8 @@ function CoverEdit( {
764
825
  alt={ alt }
765
826
  src={ url }
766
827
  style={ mediaStyle }
828
+ onLoad={ () => setIsSwappingMedia( false ) }
829
+ onError={ () => setIsSwappingMedia( false ) }
767
830
  />
768
831
  ) : (
769
832
  <div
@@ -831,7 +894,7 @@ function CoverEdit( {
831
894
  />
832
895
  ) }
833
896
 
834
- { isUploadingMedia && <Spinner /> }
897
+ { ( isUploadingMedia || isSwappingMedia ) && <Spinner /> }
835
898
 
836
899
  <CoverPlaceholder
837
900
  disableMediaButtons
@@ -44,6 +44,12 @@
44
44
  .wp-block-cover__inner-container {
45
45
  z-index: 2;
46
46
  }
47
+
48
+ // Keep the loading spinner above the dim overlay (1) and the inner
49
+ // blocks (2) so it stays visible over child content while media loads.
50
+ .components-spinner {
51
+ z-index: 3;
52
+ }
47
53
  }
48
54
 
49
55
  // Shown while media is being uploaded
@@ -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
  }
@@ -134,8 +134,15 @@ function render_block_core_cover( $attributes, $content ) {
134
134
  return $content;
135
135
  }
136
136
 
137
- $object_position = isset( $attributes['focalPoint'] )
138
- ? round( $attributes['focalPoint']['x'] * 100 ) . '% ' . round( $attributes['focalPoint']['y'] * 100 ) . '%'
137
+ $cover_focal_point = $attributes['focalPoint'] ?? null;
138
+ $focal_point_x = null;
139
+ $focal_point_y = null;
140
+ if ( is_array( $cover_focal_point ) ) {
141
+ $focal_point_x = isset( $cover_focal_point['x'] ) && is_numeric( $cover_focal_point['x'] ) ? $cover_focal_point['x'] : null;
142
+ $focal_point_y = isset( $cover_focal_point['y'] ) && is_numeric( $cover_focal_point['y'] ) ? $cover_focal_point['y'] : null;
143
+ }
144
+ $object_position = null !== $focal_point_x && null !== $focal_point_y
145
+ ? round( $focal_point_x * 100 ) . '% ' . round( $focal_point_y * 100 ) . '%'
139
146
  : null;
140
147
 
141
148
  if ( ! ( $attributes['hasParallax'] || $attributes['isRepeated'] ) ) {
@@ -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
  },
package/src/editor.scss CHANGED
@@ -48,6 +48,7 @@
48
48
  @use "./social-link/editor.scss" as *;
49
49
  @use "./social-links/editor.scss" as *;
50
50
  @use "./spacer/editor.scss" as *;
51
+ @use "./tab-list/editor.scss" as *;
51
52
  @use "./table/editor.scss" as *;
52
53
  @use "./template-part/editor.scss" as *;
53
54
  @use "./term-template/editor.scss" as *;
package/src/embed/edit.js CHANGED
@@ -239,7 +239,9 @@ const EmbedEdit = ( props ) => {
239
239
  value={ url }
240
240
  cannotEmbed={ cannotEmbed }
241
241
  onChange={ ( value ) => setURL( value ) }
242
- fallback={ () => fallback( url, onReplace ) }
242
+ fallback={
243
+ onReplace ? () => fallback( url, onReplace ) : undefined
244
+ }
243
245
  tryAgain={ () => {
244
246
  invalidateResolution( 'getEmbedPreview', [ url ] );
245
247
  } }
@@ -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"
@@ -71,13 +70,15 @@ export default function EmbedPlaceholder( {
71
70
  >
72
71
  { _x( 'Try again', 'button label' ) }
73
72
  </Button>
74
- <Button
75
- __next40pxDefaultSize
76
- variant="secondary"
77
- onClick={ fallback }
78
- >
79
- { _x( 'Convert to link', 'button label' ) }
80
- </Button>
73
+ { fallback && (
74
+ <Button
75
+ __next40pxDefaultSize
76
+ variant="secondary"
77
+ onClick={ fallback }
78
+ >
79
+ { _x( 'Convert to link', 'button label' ) }
80
+ </Button>
81
+ ) }
81
82
  </Stack>
82
83
  </Stack>
83
84
  ) }
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
 
@@ -20,12 +20,13 @@ function render_block_core_form( $attributes, $content ) {
20
20
  $processed_content->next_tag( 'form' );
21
21
 
22
22
  // Get the action for this form.
23
- $action = '';
24
- if ( isset( $attributes['action'] ) ) {
23
+ $action = '';
24
+ $form_action = $attributes['action'] ?? null;
25
+ if ( is_string( $form_action ) ) {
25
26
  $action = str_replace(
26
27
  array( '{SITE_URL}', '{ADMIN_URL}' ),
27
28
  array( site_url(), admin_url() ),
28
- $attributes['action']
29
+ $form_action
29
30
  );
30
31
  }
31
32
  $processed_content->set_attribute( 'action', esc_attr( $action ) );
@@ -55,7 +56,8 @@ function render_block_core_form( $attributes, $content ) {
55
56
  * @return string The extra fields.
56
57
  */
57
58
  function block_core_form_extra_fields_comment_form( $extra_fields, $attributes ) {
58
- if ( ! empty( $attributes['action'] ) && str_ends_with( $attributes['action'], '/wp-comments-post.php' ) ) {
59
+ $form_action = $attributes['action'] ?? null;
60
+ if ( ! empty( $form_action ) && is_string( $form_action ) && str_ends_with( $form_action, '/wp-comments-post.php' ) ) {
59
61
  $extra_fields .= '<input type="hidden" name="comment_post_ID" value="' . get_the_ID() . '" id="comment_post_ID">';
60
62
  }
61
63
  return $extra_fields;
@@ -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,