@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
@@ -69,7 +69,6 @@ import {
69
69
  getStyleStateKey,
70
70
  } from '../utils/style-state';
71
71
  import { useOpenImageMediaEditorModal } from './use-open-image-media-editor-modal';
72
- import AnimatedGifConvertControl from './animated-gif-convert-control';
73
72
  import {
74
73
  MIN_SIZE,
75
74
  ALLOWED_MEDIA_TYPES,
@@ -854,21 +853,23 @@ export default function Image( {
854
853
 
855
854
  const showBlockControls = showUrlInput || allowCrop || showCoverControls;
856
855
 
857
- const mediaReplaceFlow = isSingleSelected && ! lockUrlControls && (
858
- // For contentOnly mode, put this button in its own area so it has borders around it.
859
- <BlockControls group={ isContentOnlyMode ? 'inline' : 'other' }>
860
- <MediaReplaceFlow
861
- mediaId={ id }
862
- mediaURL={ url }
863
- allowedTypes={ ALLOWED_MEDIA_TYPES }
864
- onSelect={ onSelectImage }
865
- onSelectURL={ onSelectURL }
866
- onError={ onUploadError }
867
- name={ ! url ? __( 'Add image' ) : __( 'Replace' ) }
868
- onReset={ () => onSelectImage( undefined ) }
869
- variant="toolbar"
870
- />
871
- </BlockControls>
856
+ const mediaControls = isSingleSelected && ! lockUrlControls && (
857
+ <>
858
+ { /* For contentOnly mode, put this button in its own area so it has borders around it. */ }
859
+ <BlockControls group={ isContentOnlyMode ? 'inline' : 'other' }>
860
+ <MediaReplaceFlow
861
+ mediaId={ id }
862
+ mediaURL={ url }
863
+ allowedTypes={ ALLOWED_MEDIA_TYPES }
864
+ onSelect={ onSelectImage }
865
+ onSelectURL={ onSelectURL }
866
+ onError={ onUploadError }
867
+ name={ ! url ? __( 'Add image' ) : __( 'Replace' ) }
868
+ onReset={ () => onSelectImage( undefined ) }
869
+ variant="toolbar"
870
+ />
871
+ </BlockControls>
872
+ </>
872
873
  );
873
874
 
874
875
  const hasDataFormBlockFields =
@@ -1355,7 +1356,7 @@ export default function Image( {
1355
1356
  if ( ! url && ! temporaryURL ) {
1356
1357
  return (
1357
1358
  <>
1358
- { mediaReplaceFlow }
1359
+ { mediaControls }
1359
1360
  { controls }
1360
1361
  </>
1361
1362
  );
@@ -1390,13 +1391,7 @@ export default function Image( {
1390
1391
 
1391
1392
  return (
1392
1393
  <>
1393
- { isSingleSelected && ! lockUrlControls && (
1394
- <AnimatedGifConvertControl
1395
- attributes={ attributes }
1396
- clientId={ clientId }
1397
- />
1398
- ) }
1399
- { mediaReplaceFlow }
1394
+ { mediaControls }
1400
1395
  { controls }
1401
1396
  { featuredImageControl }
1402
1397
  { img }
@@ -3,6 +3,95 @@
3
3
  */
4
4
  import { createBlobURL, isBlobURL } from '@wordpress/blob';
5
5
  import { createBlock, getBlockAttributes } from '@wordpress/blocks';
6
+ import { select } from '@wordpress/data';
7
+ import { store as coreStore } from '@wordpress/core-data';
8
+
9
+ /**
10
+ * Returns the subset of block attributes that should be carried over when
11
+ * converting an animated-GIF Image block into its converted Video block.
12
+ *
13
+ * The conversion swaps one block for another via `createBlock`, which would
14
+ * otherwise drop everything the author set on the original block. This carries
15
+ * the attributes both blocks support: block alignment, the HTML anchor, custom
16
+ * class names, and margin spacing.
17
+ *
18
+ * Image-only attributes such as links (`href`/`linkDestination`), sizing
19
+ * (`sizeSlug`/`scale`), and `border`/`shadow` styles are intentionally not
20
+ * carried: the Video block has no equivalent, so copying them would leave
21
+ * attributes the target block cannot represent.
22
+ *
23
+ * @param {Object} attributes Source block attributes.
24
+ * @return {Object} Attributes to spread into the converted block.
25
+ */
26
+ function getCarriedGifConversionAttributes( attributes ) {
27
+ const { align, anchor, className, style } = attributes;
28
+ const margin = style?.spacing?.margin;
29
+
30
+ return {
31
+ ...( align && { align } ),
32
+ ...( anchor && { anchor } ),
33
+ ...( className && { className } ),
34
+ ...( margin && { style: { spacing: { margin } } } ),
35
+ };
36
+ }
37
+
38
+ /**
39
+ * Returns the sideloaded video companion of an animated GIF image attachment,
40
+ * or `null` when the media is not a converted animated GIF.
41
+ *
42
+ * An animated GIF uploaded through the editor gets a muted, looping video
43
+ * transcode sideloaded next to it and recorded (as basenames) in the
44
+ * attachment's `media_details.animated_video` / `animated_video_poster`.
45
+ *
46
+ * Block transforms match and run synchronously, so this reads the attachment
47
+ * record straight from the core-data store: it only returns the companion once
48
+ * the record is resolved. The Image block resolves the record while the block
49
+ * is selected, which is also when the block switcher can offer the transform.
50
+ *
51
+ * @param {number} id Image attachment ID.
52
+ * @param {string} url Image block URL, used to cheaply skip non-GIF media.
53
+ * @return {Object|null} Companion details (absolute `src`/`poster` URLs and
54
+ * the GIF's intrinsic `width`/`height`), or `null`.
55
+ */
56
+ function getAnimatedGifVideoCompanion( id, url ) {
57
+ if ( ! id ) {
58
+ return null;
59
+ }
60
+ /*
61
+ * Only animated GIFs have a video companion. Gate on the `.gif` extension
62
+ * so an ordinary image never reaches into the attachment record just to
63
+ * discover it has no companion. Strip any query string or fragment first
64
+ * so a URL like `cat.gif?ver=2` still matches.
65
+ */
66
+ const urlPath = url?.split( /[?#]/ )[ 0 ];
67
+ if ( ! urlPath?.toLowerCase().endsWith( '.gif' ) ) {
68
+ return null;
69
+ }
70
+ const record = select( coreStore ).getEntityRecord(
71
+ 'postType',
72
+ 'attachment',
73
+ id,
74
+ { context: 'view' }
75
+ );
76
+ const details = record?.media_details;
77
+ if ( ! details?.animated_video || ! record?.source_url ) {
78
+ return null;
79
+ }
80
+ // Companion files are sideloaded next to the GIF, so they share its
81
+ // directory; build their URLs from the GIF's own source URL.
82
+ const dir = record.source_url.slice(
83
+ 0,
84
+ record.source_url.lastIndexOf( '/' ) + 1
85
+ );
86
+ return {
87
+ src: dir + details.animated_video,
88
+ poster: details.animated_video_poster
89
+ ? dir + details.animated_video_poster
90
+ : undefined,
91
+ width: details.width,
92
+ height: details.height,
93
+ };
94
+ }
6
95
 
7
96
  export function stripFirstImage( attributes, { shortcode } ) {
8
97
  const { body } = document.implementation.createHTMLDocument( '' );
@@ -253,6 +342,45 @@ const transforms = {
253
342
  },
254
343
  },
255
344
  ],
345
+ to: [
346
+ {
347
+ // Offer converting an animated GIF into the Video block's "GIF"
348
+ // variation: a muted, looping, autoplaying video transcoded from
349
+ // the GIF and sideloaded next to it when it was uploaded. Only
350
+ // matches when that companion video exists, so ordinary images
351
+ // never see this transform.
352
+ type: 'block',
353
+ blocks: [ 'core/video' ],
354
+ isMatch: ( { id, url } ) =>
355
+ !! getAnimatedGifVideoCompanion( id, url ),
356
+ transform( attributes ) {
357
+ const { id, url, caption } = attributes;
358
+ const companion = getAnimatedGifVideoCompanion( id, url );
359
+
360
+ return createBlock( 'core/video', {
361
+ ...getCarriedGifConversionAttributes( attributes ),
362
+ id,
363
+ src: companion.src,
364
+ poster: companion.poster,
365
+ caption,
366
+ controls: false,
367
+ loop: true,
368
+ autoplay: true,
369
+ muted: true,
370
+ playsInline: true,
371
+ /*
372
+ * Carry the GIF's intrinsic dimensions so the <video>
373
+ * keeps its aspect ratio from the first paint. Without
374
+ * them the element collapses to the browser-default size
375
+ * and then jumps once the poster/metadata load, which
376
+ * shows up as a brief duplicated image during the swap.
377
+ */
378
+ width: companion.width,
379
+ height: companion.height,
380
+ } );
381
+ },
382
+ },
383
+ ],
256
384
  };
257
385
 
258
386
  export default transforms;
package/src/index.js CHANGED
@@ -197,6 +197,8 @@ const getAllBlocks = () => {
197
197
  pageList,
198
198
  pageListItem,
199
199
  pattern,
200
+ playlist,
201
+ playlistTrack,
200
202
  preformatted,
201
203
  pullquote,
202
204
  reusableBlock,
@@ -208,6 +210,10 @@ const getAllBlocks = () => {
208
210
  socialLinks,
209
211
  spacer,
210
212
  table,
213
+ tabs,
214
+ tabList,
215
+ tabPanels,
216
+ tabPanel,
211
217
  tagCloud,
212
218
  textColumns,
213
219
  verse,
@@ -281,12 +287,8 @@ const getAllBlocks = () => {
281
287
  }
282
288
 
283
289
  if ( window?.__experimentalEnableBlockExperiments ) {
284
- blocks.push( tabList );
285
- blocks.push( tabs );
286
- blocks.push( tabPanel );
287
- blocks.push( tabPanels );
288
- blocks.push( playlist );
289
- blocks.push( playlistTrack );
290
+ // Blocks added here are only registered when the "Block experiments"
291
+ // option is enabled in the Gutenberg > Experiments settings page.
290
292
  }
291
293
 
292
294
  blocks.push( classic );
@@ -343,13 +345,23 @@ export const registerCoreBlocks = (
343
345
  ...( ( bootstrappedBlockType?.apiVersion ?? 0 ) < 3 && {
344
346
  apiVersion: 3,
345
347
  } ),
348
+ // Always pass the postId context so the server-side render can
349
+ // reproduce the same output as the front end, while preserving
350
+ // any context declared in the block's PHP registration.
351
+ usesContext: Array.from(
352
+ new Set( [
353
+ ...( bootstrappedBlockType?.usesContext ?? [] ),
354
+ 'postId',
355
+ ] )
356
+ ),
346
357
  // Inspector controls are rendered by the auto-register hook in block-editor
347
- edit: function Edit( { attributes } ) {
358
+ edit: function Edit( { attributes, context } ) {
348
359
  const disabledRef = useDisabled();
349
360
  const blockProps = useBlockProps( { ref: disabledRef } );
350
361
  const { content, status, error } = useServerSideRender( {
351
362
  block: blockName,
352
363
  attributes,
364
+ urlQueryArgs: { post_id: context?.postId },
353
365
  } );
354
366
 
355
367
  if ( status === 'loading' ) {
@@ -162,13 +162,10 @@ function Controls( { attributes, setAttributes } ) {
162
162
  label: name,
163
163
  } ) );
164
164
  const categorySuggestions =
165
- categoriesList?.reduce(
166
- ( accumulator, category ) => ( {
167
- ...accumulator,
168
- [ category.name ]: category,
169
- } ),
170
- {}
171
- ) ?? {};
165
+ categoriesList?.reduce( ( accumulator, category ) => {
166
+ accumulator[ category.name ] = category;
167
+ return accumulator;
168
+ }, {} ) ?? {};
172
169
  const selectCategories = ( tokens ) => {
173
170
  const hasNoSuggestion = tokens.some(
174
171
  ( token ) =>
@@ -807,7 +804,7 @@ export default function LatestPostsEdit( {
807
804
  <div
808
805
  className="wp-block-latest-posts__post-full-content"
809
806
  dangerouslySetInnerHTML={ {
810
- __html: post.content.raw.trim(),
807
+ __html: post.content.rendered.trim(),
811
808
  } }
812
809
  />
813
810
  ) }
@@ -44,6 +44,7 @@ function block_core_latest_posts_get_excerpt_length() {
44
44
  */
45
45
  function render_block_core_latest_posts( $attributes ) {
46
46
  global $post, $block_core_latest_posts_excerpt_length;
47
+ static $rendering_stack = array();
47
48
 
48
49
  $args = array(
49
50
  'posts_per_page' => $attributes['postsToShow'],
@@ -64,18 +65,23 @@ function render_block_core_latest_posts( $attributes ) {
64
65
  $args['author'] = $attributes['selectedAuthor'];
65
66
  }
66
67
 
67
- $query = new WP_Query();
68
- $recent_posts = $query->query( $args );
68
+ $query = new WP_Query( $args );
69
69
 
70
70
  if ( isset( $attributes['displayFeaturedImage'] ) && $attributes['displayFeaturedImage'] ) {
71
71
  update_post_thumbnail_cache( $query );
72
72
  }
73
73
 
74
74
  $list_items_markup = '';
75
+ // Snapshot the current global post so it can be restored after the loop.
76
+ // We use have_posts()/the_post() rather than foreach so that setup_postdata()
77
+ // is called for each post, establishing the correct global context for
78
+ // do_blocks() and other filters that run during full-content rendering.
79
+ $previous_post = $post ?? null;
75
80
 
76
- foreach ( $recent_posts as $post ) {
77
- $post_link = esc_url( get_permalink( $post ) );
78
- $title = get_the_title( $post );
81
+ while ( $query->have_posts() ) {
82
+ $query->the_post();
83
+ $post_link = esc_url( get_permalink() );
84
+ $title = get_the_title();
79
85
 
80
86
  if ( ! $title ) {
81
87
  $title = __( '(no title)' );
@@ -83,7 +89,7 @@ function render_block_core_latest_posts( $attributes ) {
83
89
 
84
90
  $list_items_markup .= '<li>';
85
91
 
86
- if ( $attributes['displayFeaturedImage'] && has_post_thumbnail( $post ) ) {
92
+ if ( $attributes['displayFeaturedImage'] && has_post_thumbnail() ) {
87
93
  $image_style = '';
88
94
  if ( isset( $attributes['featuredImageSizeWidth'] ) ) {
89
95
  $image_style .= sprintf( 'max-width:%spx;', $attributes['featuredImageSizeWidth'] );
@@ -98,7 +104,7 @@ function render_block_core_latest_posts( $attributes ) {
98
104
  }
99
105
 
100
106
  $featured_image = get_the_post_thumbnail(
101
- $post,
107
+ null,
102
108
  $attributes['featuredImageSizeSlug'],
103
109
  array(
104
110
  'style' => esc_attr( $image_style ),
@@ -126,7 +132,7 @@ function render_block_core_latest_posts( $attributes ) {
126
132
  );
127
133
 
128
134
  if ( isset( $attributes['displayAuthor'] ) && $attributes['displayAuthor'] ) {
129
- $author_display_name = get_the_author_meta( 'display_name', $post->post_author );
135
+ $author_display_name = get_the_author_meta( 'display_name' );
130
136
 
131
137
  /* translators: byline. %s: author. */
132
138
  $byline = sprintf( __( 'by %s' ), $author_display_name );
@@ -142,15 +148,15 @@ function render_block_core_latest_posts( $attributes ) {
142
148
  if ( isset( $attributes['displayPostDate'] ) && $attributes['displayPostDate'] ) {
143
149
  $list_items_markup .= sprintf(
144
150
  '<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>',
145
- esc_attr( get_the_date( 'c', $post ) ),
146
- get_the_date( '', $post )
151
+ esc_attr( get_the_date( 'c' ) ),
152
+ get_the_date( '' )
147
153
  );
148
154
  }
149
155
 
150
156
  if ( isset( $attributes['displayPostContent'] ) && $attributes['displayPostContent']
151
157
  && isset( $attributes['displayPostContentRadio'] ) && 'excerpt' === $attributes['displayPostContentRadio'] ) {
152
158
 
153
- $trimmed_excerpt = get_the_excerpt( $post );
159
+ $trimmed_excerpt = get_the_excerpt();
154
160
 
155
161
  /*
156
162
  * Adds a "Read more" link with screen reader text.
@@ -170,7 +176,7 @@ function render_block_core_latest_posts( $attributes ) {
170
176
  }
171
177
  }
172
178
 
173
- if ( post_password_required( $post ) ) {
179
+ if ( post_password_required() ) {
174
180
  $trimmed_excerpt = __( 'This content is password protected.' );
175
181
  }
176
182
 
@@ -183,21 +189,45 @@ function render_block_core_latest_posts( $attributes ) {
183
189
  if ( isset( $attributes['displayPostContent'] ) && $attributes['displayPostContent']
184
190
  && isset( $attributes['displayPostContentRadio'] ) && 'full_post' === $attributes['displayPostContentRadio'] ) {
185
191
 
186
- $post_content = html_entity_decode( $post->post_content, ENT_QUOTES, get_option( 'blog_charset' ) );
187
-
188
- if ( post_password_required( $post ) ) {
192
+ if ( post_password_required() ) {
189
193
  $post_content = __( 'This content is password protected.' );
194
+ } else {
195
+ $post_id = get_the_ID();
196
+ $post_content = get_post_field( 'post_content', $post_id, 'raw' );
197
+ // Check if we're already rendering this post to prevent infinite recursion.
198
+ if ( in_array( $post_id, $rendering_stack, true ) ) {
199
+ $post_content = '';
200
+ } else {
201
+ $rendering_stack[] = $post_id;
202
+
203
+ try {
204
+ // Run through the actions that are typically taken on the_content.
205
+ $post_content = _wp_apply_block_content_filters( $post_content, 'latest-posts' );
206
+ } finally {
207
+ array_pop( $rendering_stack );
208
+ }
209
+ }
190
210
  }
191
211
 
212
+ $post_content = str_replace( ']]>', ']]&gt;', $post_content );
192
213
  $list_items_markup .= sprintf(
193
214
  '<div class="wp-block-latest-posts__post-full-content">%1$s</div>',
194
- wp_kses_post( $post_content )
215
+ $post_content
195
216
  );
196
217
  }
197
218
 
198
219
  $list_items_markup .= "</li>\n";
199
220
  }
200
221
 
222
+ // Restore the post context that was active before this secondary query.
223
+ // wp_reset_postdata() is intentionally not used here: when this block is
224
+ // rendered inside another post's content (e.g. via do_blocks()), it would
225
+ // restore to the main query post rather than the outer rendering post.
226
+ $post = $previous_post;
227
+ if ( $previous_post instanceof WP_Post ) {
228
+ setup_postdata( $previous_post );
229
+ }
230
+
201
231
  remove_filter( 'excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20 );
202
232
 
203
233
  $layout = $attributes['layout'] ?? array();
@@ -83,7 +83,7 @@ export default function ListItemEdit( {
83
83
  renderAppender: false,
84
84
  __unstableDisableDropZone: true,
85
85
  } );
86
- const useEnterRef = useEnter( { content, clientId } );
86
+ const useEnterRef = useEnter( clientId );
87
87
  const useSpaceRef = useSpace( clientId );
88
88
  const onMerge = useMerge( clientId, mergeBlocks );
89
89
  return (
@@ -6,11 +6,8 @@ import {
6
6
  getDefaultBlockName,
7
7
  cloneBlock,
8
8
  } from '@wordpress/blocks';
9
- import { useRef } from '@wordpress/element';
10
- import {
11
- useRefEffect,
12
- privateApis as composePrivateApis,
13
- } from '@wordpress/compose';
9
+ import { useRefEffect } from '@wordpress/compose';
10
+ import { privateApis as richTextPrivateApis } from '@wordpress/rich-text';
14
11
  import { ENTER } from '@wordpress/keycodes';
15
12
  import { useSelect, useDispatch } from '@wordpress/data';
16
13
  import { store as blockEditorStore } from '@wordpress/block-editor';
@@ -21,30 +18,31 @@ import { store as blockEditorStore } from '@wordpress/block-editor';
21
18
  import useOutdentListItem from './use-outdent-list-item';
22
19
  import { unlock } from '../../lock-unlock';
23
20
 
24
- const { subscribeDelegatedListener } = unlock( composePrivateApis );
21
+ const { subscribeOwnedListener } = unlock( richTextPrivateApis );
25
22
 
26
- export default function useEnter( props ) {
23
+ export default function useEnter( clientId ) {
27
24
  const { replaceBlocks, selectionChange } = useDispatch( blockEditorStore );
28
- const { getBlock, getBlockRootClientId, getBlockIndex, getBlockName } =
29
- useSelect( blockEditorStore );
30
- const propsRef = useRef( props );
31
- propsRef.current = props;
25
+ const {
26
+ getBlock,
27
+ getBlockAttributes,
28
+ getBlockRootClientId,
29
+ getBlockIndex,
30
+ getBlockName,
31
+ } = useSelect( blockEditorStore );
32
32
  const outdentListItem = useOutdentListItem();
33
33
  return useRefEffect( ( element ) => {
34
34
  function onKeyDown( event ) {
35
35
  if ( event.defaultPrevented || event.keyCode !== ENTER ) {
36
36
  return;
37
37
  }
38
- const { content, clientId } = propsRef.current;
39
- if ( content.length ) {
38
+ const { content } = getBlockAttributes( clientId ) ?? {};
39
+ if ( content?.length ) {
40
40
  return;
41
41
  }
42
42
  event.preventDefault();
43
43
  const canOutdent =
44
44
  getBlockName(
45
- getBlockRootClientId(
46
- getBlockRootClientId( propsRef.current.clientId )
47
- )
45
+ getBlockRootClientId( getBlockRootClientId( clientId ) )
48
46
  ) === 'core/list-item';
49
47
  if ( canOutdent ) {
50
48
  outdentListItem();
@@ -90,11 +88,6 @@ export default function useEnter( props ) {
90
88
 
91
89
  // Capture phase so we run before writing-flow's ancestor-bubble
92
90
  // keydown handlers that gate on `event.defaultPrevented`.
93
- return subscribeDelegatedListener(
94
- element,
95
- 'keydown',
96
- onKeyDown,
97
- true
98
- );
91
+ return subscribeOwnedListener( element, 'keydown', onKeyDown, true );
99
92
  }, [] );
100
93
  }
@@ -1,10 +1,8 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import {
5
- useRefEffect,
6
- privateApis as composePrivateApis,
7
- } from '@wordpress/compose';
4
+ import { useRefEffect } from '@wordpress/compose';
5
+ import { privateApis as richTextPrivateApis } from '@wordpress/rich-text';
8
6
  import { SPACE, TAB } from '@wordpress/keycodes';
9
7
  import { store as blockEditorStore } from '@wordpress/block-editor';
10
8
  import { useSelect } from '@wordpress/data';
@@ -16,7 +14,7 @@ import useIndentListItem from './use-indent-list-item';
16
14
  import useOutdentListItem from './use-outdent-list-item';
17
15
  import { unlock } from '../../lock-unlock';
18
16
 
19
- const { subscribeDelegatedListener } = unlock( composePrivateApis );
17
+ const { subscribeOwnedListener } = unlock( richTextPrivateApis );
20
18
 
21
19
  export default function useSpace( clientId ) {
22
20
  const { getSelectionStart, getSelectionEnd, getBlockIndex } =
@@ -63,7 +61,7 @@ export default function useSpace( clientId ) {
63
61
 
64
62
  // Capture phase so we run before writing-flow's ancestor-bubble
65
63
  // keydown handlers that gate on `event.defaultPrevented`.
66
- return subscribeDelegatedListener(
64
+ return subscribeOwnedListener(
67
65
  element,
68
66
  'keydown',
69
67
  onKeyDown,
@@ -15,6 +15,7 @@
15
15
  }
16
16
  }
17
17
 
18
+ // stylelint-disable-next-line selector-class-pattern -- re-resizable library class name.
18
19
  .wp-block-media-text .__resizable_base__ {
19
20
  grid-column: 1 / span 2;
20
21
  grid-row: 2;
@@ -18,7 +18,7 @@
18
18
  position: relative;
19
19
  font-size: $default-font-size;
20
20
  text-transform: uppercase;
21
- font-weight: 600;
21
+ font-weight: var(--wpds-typography-font-weight-emphasis);
22
22
  font-family: $default-font;
23
23
  color: $gray-700;
24
24
  display: inline-flex;
@@ -576,8 +576,7 @@ body.editor-styles-wrapper .wp-block-navigation__responsive-container.is-menu-op
576
576
  grid-column: span 2;
577
577
 
578
578
  &.open {
579
- box-shadow: inset 0 0 0 $border-width $gray-200;
580
- outline: 1px solid transparent; // Box shadow is removed in high contrast mode, a transparent outline is made opaque.
579
+ border-color: $gray-200;
581
580
  background-color: $white;
582
581
  }
583
582
  }
@@ -110,7 +110,7 @@
110
110
  .link-control-transform__subheading {
111
111
  font-size: 11px;
112
112
  text-transform: uppercase;
113
- font-weight: $font-weight-medium;
113
+ font-weight: var(--wpds-typography-font-weight-emphasis);
114
114
  color: $gray-900;
115
115
  margin-bottom: 1.5em;
116
116
  }
@@ -127,9 +127,12 @@ function block_core_navigation_link_maybe_urldecode( $url ) {
127
127
  function render_block_core_navigation_link( $attributes, $content, $block ) {
128
128
  // Check if this navigation item should render based on post status.
129
129
  if ( defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN ) {
130
- if ( ! gutenberg_block_core_shared_navigation_item_should_render( $attributes, $block ) ) {
131
- return '';
132
- }
130
+ $should_render = gutenberg_block_core_shared_navigation_item_should_render( $attributes, $block );
131
+ } else {
132
+ $should_render = block_core_shared_navigation_item_should_render( $attributes, $block );
133
+ }
134
+ if ( ! $should_render ) {
135
+ return '';
133
136
  }
134
137
 
135
138
  // Don't render the block's subtree if it has no label.
@@ -76,9 +76,12 @@ function block_core_navigation_submenu_get_submenu_visibility( $context ) {
76
76
  function render_block_core_navigation_submenu( $attributes, $content, $block ) {
77
77
  // Check if this navigation item should render based on post status.
78
78
  if ( defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN ) {
79
- if ( ! gutenberg_block_core_shared_navigation_item_should_render( $attributes, $block ) ) {
80
- return '';
81
- }
79
+ $should_render = gutenberg_block_core_shared_navigation_item_should_render( $attributes, $block );
80
+ } else {
81
+ $should_render = block_core_shared_navigation_item_should_render( $attributes, $block );
82
+ }
83
+ if ( ! $should_render ) {
84
+ return '';
82
85
  }
83
86
 
84
87
  // Don't render the block's subtree if it has no label.
@@ -18,7 +18,7 @@
18
18
  font-size: $default-font-size;
19
19
  position: relative;
20
20
  text-transform: uppercase;
21
- font-weight: 600;
21
+ font-weight: var(--wpds-typography-font-weight-emphasis);
22
22
  font-family: $default-font;
23
23
  color: $gray-700;
24
24
  border-radius: 4px;
@@ -26,6 +26,7 @@ _Defined via the [`supports`](https://developer.wordpress.org/block-editor/refer
26
26
 
27
27
  - [`align`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#align): `"wide"`, `"full"`
28
28
  - [`splitting`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#splitting): `true`
29
+ - [`editableRoot`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#editableroot): `true`
29
30
  - [`anchor`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#anchor): `true`
30
31
  - [`className`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#classname): `false`
31
32
  - [`color`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#color):
@@ -29,6 +29,7 @@
29
29
  "supports": {
30
30
  "align": [ "wide", "full" ],
31
31
  "splitting": true,
32
+ "editableRoot": true,
32
33
  "anchor": true,
33
34
  "className": false,
34
35
  "__experimentalBorder": {