@wordpress/block-library 9.44.0 → 9.45.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 (367) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/accordion/edit.cjs +0 -2
  3. package/build/accordion/edit.cjs.map +2 -2
  4. package/build/accordion-item/block.json +1 -0
  5. package/build/button/constants.cjs +1 -1
  6. package/build/button/constants.cjs.map +1 -1
  7. package/build/categories/edit.cjs +5 -1
  8. package/build/categories/edit.cjs.map +2 -2
  9. package/build/embed/edit.cjs +38 -34
  10. package/build/embed/edit.cjs.map +3 -3
  11. package/build/embed/transforms.cjs +3 -1
  12. package/build/embed/transforms.cjs.map +2 -2
  13. package/build/embed/util.cjs +13 -2
  14. package/build/embed/util.cjs.map +2 -2
  15. package/build/form/block.json +1 -1
  16. package/build/form-input/block.json +1 -1
  17. package/build/form-submission-notification/block.json +1 -1
  18. package/build/form-submit-button/block.json +1 -1
  19. package/build/group/block.json +2 -1
  20. package/build/image/constants.cjs +1 -1
  21. package/build/image/constants.cjs.map +2 -2
  22. package/build/image/edit.cjs +2 -4
  23. package/build/image/edit.cjs.map +2 -2
  24. package/build/image/image.cjs +49 -19
  25. package/build/image/image.cjs.map +3 -3
  26. package/build/index.cjs +4 -4
  27. package/build/index.cjs.map +2 -2
  28. package/build/latest-posts/edit.cjs +1 -1
  29. package/build/latest-posts/edit.cjs.map +1 -1
  30. package/build/math/edit.cjs +2 -2
  31. package/build/math/edit.cjs.map +2 -2
  32. package/build/navigation/edit/accessible-description.cjs +2 -2
  33. package/build/navigation/edit/accessible-description.cjs.map +2 -2
  34. package/build/navigation/edit/overlay-template-part-selector.cjs.map +2 -2
  35. package/build/navigation-link/edit.cjs +2 -1
  36. package/build/navigation-link/edit.cjs.map +2 -2
  37. package/build/navigation-link/link-ui/dialog-wrapper.cjs +2 -1
  38. package/build/navigation-link/link-ui/dialog-wrapper.cjs.map +2 -2
  39. package/build/navigation-link/link-ui/index.cjs +2 -1
  40. package/build/navigation-link/link-ui/index.cjs.map +2 -2
  41. package/build/paragraph/use-enter.cjs +12 -23
  42. package/build/paragraph/use-enter.cjs.map +2 -2
  43. package/build/post-author/edit.cjs.map +3 -3
  44. package/build/post-comments-form/edit.cjs +2 -2
  45. package/build/post-comments-form/edit.cjs.map +2 -2
  46. package/build/post-featured-image/edit.cjs +2 -5
  47. package/build/post-featured-image/edit.cjs.map +2 -2
  48. package/build/post-template/edit.cjs +8 -2
  49. package/build/post-template/edit.cjs.map +2 -2
  50. package/build/pullquote/block.json +1 -4
  51. package/build/query/edit/inspector-controls/author-control.cjs +1 -1
  52. package/build/query/edit/inspector-controls/author-control.cjs.map +2 -2
  53. package/build/query/edit/inspector-controls/format-controls.cjs +1 -1
  54. package/build/query/edit/inspector-controls/format-controls.cjs.map +2 -2
  55. package/build/query/edit/inspector-controls/parent-control.cjs +1 -1
  56. package/build/query/edit/inspector-controls/parent-control.cjs.map +2 -2
  57. package/build/query/edit/inspector-controls/taxonomy-controls.cjs +1 -1
  58. package/build/query/edit/inspector-controls/taxonomy-controls.cjs.map +2 -2
  59. package/build/site-logo/edit.cjs +34 -20
  60. package/build/site-logo/edit.cjs.map +2 -2
  61. package/build/tab/block.json +23 -23
  62. package/build/tab/controls.cjs +5 -48
  63. package/build/tab/controls.cjs.map +3 -3
  64. package/build/tab/edit.cjs +76 -92
  65. package/build/tab/edit.cjs.map +3 -3
  66. package/build/tab/save.cjs +3 -3
  67. package/build/tab/save.cjs.map +2 -2
  68. package/{src/tabs-menu → build/tab-list}/block.json +4 -4
  69. package/build/{tabs-menu → tab-list}/edit.cjs +9 -14
  70. package/build/tab-list/edit.cjs.map +7 -0
  71. package/build/{tabs-menu → tab-list}/index.cjs +5 -5
  72. package/build/tab-list/index.cjs.map +7 -0
  73. package/build/{tabs-menu → tab-list}/save.cjs +1 -1
  74. package/build/{tabs-menu → tab-list}/save.cjs.map +1 -1
  75. package/build/{tab → tab-panel}/add-tab-toolbar-control.cjs +16 -16
  76. package/build/tab-panel/add-tab-toolbar-control.cjs.map +7 -0
  77. package/build/tab-panel/block.json +27 -37
  78. package/build/tab-panel/controls.cjs +89 -0
  79. package/build/tab-panel/controls.cjs.map +7 -0
  80. package/build/tab-panel/edit.cjs +88 -18
  81. package/build/tab-panel/edit.cjs.map +3 -3
  82. package/build/tab-panel/index.cjs +1 -1
  83. package/build/tab-panel/index.cjs.map +1 -1
  84. package/build/{tab → tab-panel}/init.cjs +1 -1
  85. package/build/{tab → tab-panel}/init.cjs.map +1 -1
  86. package/build/{tab → tab-panel}/remove-tab-toolbar-control.cjs +16 -16
  87. package/build/tab-panel/remove-tab-toolbar-control.cjs.map +7 -0
  88. package/build/tab-panel/save.cjs +4 -2
  89. package/build/tab-panel/save.cjs.map +2 -2
  90. package/build/tab-panels/block.json +66 -0
  91. package/build/{tabs-menu-item/controls.cjs → tab-panels/edit.cjs} +25 -11
  92. package/build/tab-panels/edit.cjs.map +7 -0
  93. package/build/{tabs-menu-item → tab-panels}/index.cjs +5 -5
  94. package/build/{tabs-menu → tab-panels}/index.cjs.map +2 -2
  95. package/build/{tabs-menu-item → tab-panels}/save.cjs +4 -6
  96. package/build/tab-panels/save.cjs.map +7 -0
  97. package/build/tabs/block.json +1 -2
  98. package/build/tabs/controls.cjs +2 -2
  99. package/build/tabs/controls.cjs.map +1 -1
  100. package/build/tabs/edit.cjs +29 -100
  101. package/build/tabs/edit.cjs.map +3 -3
  102. package/build/tabs/index.cjs +5 -5
  103. package/build/tabs/index.cjs.map +1 -1
  104. package/build/tabs/use-tab-list-sync.cjs +190 -0
  105. package/build/tabs/use-tab-list-sync.cjs.map +7 -0
  106. package/build/terms-query/edit/inspector-controls/include-control.cjs +1 -1
  107. package/build/terms-query/edit/inspector-controls/include-control.cjs.map +2 -2
  108. package/build/video/tracks-editor.cjs +2 -2
  109. package/build/video/tracks-editor.cjs.map +2 -2
  110. package/build-module/accordion/edit.mjs +0 -2
  111. package/build-module/accordion/edit.mjs.map +2 -2
  112. package/build-module/accordion-item/block.json +1 -0
  113. package/build-module/button/constants.mjs +1 -1
  114. package/build-module/button/constants.mjs.map +1 -1
  115. package/build-module/categories/edit.mjs +5 -2
  116. package/build-module/categories/edit.mjs.map +2 -2
  117. package/build-module/embed/edit.mjs +45 -36
  118. package/build-module/embed/edit.mjs.map +2 -2
  119. package/build-module/embed/transforms.mjs +8 -2
  120. package/build-module/embed/transforms.mjs.map +2 -2
  121. package/build-module/embed/util.mjs +11 -1
  122. package/build-module/embed/util.mjs.map +2 -2
  123. package/build-module/form/block.json +1 -1
  124. package/build-module/form-input/block.json +1 -1
  125. package/build-module/form-submission-notification/block.json +1 -1
  126. package/build-module/form-submit-button/block.json +1 -1
  127. package/build-module/group/block.json +2 -1
  128. package/build-module/image/constants.mjs +1 -1
  129. package/build-module/image/constants.mjs.map +2 -2
  130. package/build-module/image/edit.mjs +2 -4
  131. package/build-module/image/edit.mjs.map +2 -2
  132. package/build-module/image/image.mjs +49 -19
  133. package/build-module/image/image.mjs.map +3 -3
  134. package/build-module/index.mjs +4 -4
  135. package/build-module/index.mjs.map +2 -2
  136. package/build-module/latest-posts/edit.mjs +1 -1
  137. package/build-module/latest-posts/edit.mjs.map +1 -1
  138. package/build-module/math/edit.mjs +2 -2
  139. package/build-module/math/edit.mjs.map +2 -2
  140. package/build-module/navigation/edit/accessible-description.mjs +1 -1
  141. package/build-module/navigation/edit/accessible-description.mjs.map +1 -1
  142. package/build-module/navigation/edit/overlay-template-part-selector.mjs +2 -2
  143. package/build-module/navigation/edit/overlay-template-part-selector.mjs.map +1 -1
  144. package/build-module/navigation-link/edit.mjs +2 -5
  145. package/build-module/navigation-link/edit.mjs.map +2 -2
  146. package/build-module/navigation-link/link-ui/dialog-wrapper.mjs +2 -1
  147. package/build-module/navigation-link/link-ui/dialog-wrapper.mjs.map +2 -2
  148. package/build-module/navigation-link/link-ui/index.mjs +1 -1
  149. package/build-module/navigation-link/link-ui/index.mjs.map +2 -2
  150. package/build-module/paragraph/use-enter.mjs +13 -23
  151. package/build-module/paragraph/use-enter.mjs.map +2 -2
  152. package/build-module/post-author/edit.mjs +2 -2
  153. package/build-module/post-author/edit.mjs.map +2 -2
  154. package/build-module/post-comments-form/edit.mjs +1 -1
  155. package/build-module/post-comments-form/edit.mjs.map +2 -2
  156. package/build-module/post-featured-image/edit.mjs +2 -5
  157. package/build-module/post-featured-image/edit.mjs.map +2 -2
  158. package/build-module/post-template/edit.mjs +8 -2
  159. package/build-module/post-template/edit.mjs.map +2 -2
  160. package/build-module/pullquote/block.json +1 -4
  161. package/build-module/query/edit/inspector-controls/author-control.mjs +1 -1
  162. package/build-module/query/edit/inspector-controls/author-control.mjs.map +2 -2
  163. package/build-module/query/edit/inspector-controls/format-controls.mjs +1 -1
  164. package/build-module/query/edit/inspector-controls/format-controls.mjs.map +2 -2
  165. package/build-module/query/edit/inspector-controls/parent-control.mjs +1 -1
  166. package/build-module/query/edit/inspector-controls/parent-control.mjs.map +2 -2
  167. package/build-module/query/edit/inspector-controls/taxonomy-controls.mjs +1 -1
  168. package/build-module/query/edit/inspector-controls/taxonomy-controls.mjs.map +2 -2
  169. package/build-module/site-logo/edit.mjs +34 -20
  170. package/build-module/site-logo/edit.mjs.map +2 -2
  171. package/build-module/tab/block.json +23 -23
  172. package/build-module/tab/controls.mjs +7 -57
  173. package/build-module/tab/controls.mjs.map +2 -2
  174. package/build-module/tab/edit.mjs +80 -96
  175. package/build-module/tab/edit.mjs.map +3 -3
  176. package/build-module/tab/save.mjs +4 -4
  177. package/build-module/tab/save.mjs.map +2 -2
  178. package/build-module/{tabs-menu → tab-list}/block.json +4 -4
  179. package/build-module/{tabs-menu → tab-list}/edit.mjs +9 -14
  180. package/build-module/tab-list/edit.mjs.map +7 -0
  181. package/build-module/{tabs-menu → tab-list}/index.mjs +2 -2
  182. package/build-module/tab-list/index.mjs.map +7 -0
  183. package/build-module/{tabs-menu → tab-list}/save.mjs +1 -1
  184. package/build-module/{tabs-menu → tab-list}/save.mjs.map +1 -1
  185. package/build-module/{tab → tab-panel}/add-tab-toolbar-control.mjs +16 -16
  186. package/build-module/tab-panel/add-tab-toolbar-control.mjs.map +7 -0
  187. package/build-module/tab-panel/block.json +27 -37
  188. package/build-module/tab-panel/controls.mjs +65 -0
  189. package/build-module/tab-panel/controls.mjs.map +7 -0
  190. package/build-module/tab-panel/edit.mjs +90 -20
  191. package/build-module/tab-panel/edit.mjs.map +2 -2
  192. package/build-module/tab-panel/index.mjs +1 -1
  193. package/build-module/tab-panel/index.mjs.map +1 -1
  194. package/build-module/{tab → tab-panel}/init.mjs +1 -1
  195. package/build-module/{tab → tab-panel}/init.mjs.map +1 -1
  196. package/build-module/{tab → tab-panel}/remove-tab-toolbar-control.mjs +16 -16
  197. package/build-module/tab-panel/remove-tab-toolbar-control.mjs.map +7 -0
  198. package/build-module/tab-panel/save.mjs +4 -2
  199. package/build-module/tab-panel/save.mjs.map +2 -2
  200. package/build-module/tab-panels/block.json +66 -0
  201. package/build-module/tab-panels/edit.mjs +33 -0
  202. package/build-module/tab-panels/edit.mjs.map +7 -0
  203. package/build-module/{tabs-menu-item → tab-panels}/index.mjs +2 -2
  204. package/build-module/{tabs-menu → tab-panels}/index.mjs.map +2 -2
  205. package/build-module/tab-panels/save.mjs +12 -0
  206. package/build-module/tab-panels/save.mjs.map +7 -0
  207. package/build-module/tabs/block.json +1 -2
  208. package/build-module/tabs/controls.mjs +2 -2
  209. package/build-module/tabs/controls.mjs.map +1 -1
  210. package/build-module/tabs/edit.mjs +31 -102
  211. package/build-module/tabs/edit.mjs.map +2 -2
  212. package/build-module/tabs/index.mjs +5 -5
  213. package/build-module/tabs/index.mjs.map +1 -1
  214. package/build-module/tabs/use-tab-list-sync.mjs +169 -0
  215. package/build-module/tabs/use-tab-list-sync.mjs.map +7 -0
  216. package/build-module/terms-query/edit/inspector-controls/include-control.mjs +1 -1
  217. package/build-module/terms-query/edit/inspector-controls/include-control.mjs.map +2 -2
  218. package/build-module/video/tracks-editor.mjs +2 -2
  219. package/build-module/video/tracks-editor.mjs.map +2 -2
  220. package/build-style/classic-rtl.css +14 -0
  221. package/build-style/classic.css +14 -0
  222. package/build-style/editor-rtl.css +9 -5
  223. package/build-style/editor.css +9 -5
  224. package/build-style/latest-comments/style-rtl.css +4 -4
  225. package/build-style/latest-comments/style.css +4 -4
  226. package/build-style/post-template/style-rtl.css +1 -1
  227. package/build-style/post-template/style.css +1 -1
  228. package/build-style/style-rtl.css +45 -48
  229. package/build-style/style.css +45 -48
  230. package/build-style/tab/editor-rtl.css +11 -0
  231. package/build-style/tab/editor.css +11 -0
  232. package/build-style/tab/style-rtl.css +29 -16
  233. package/build-style/tab/style.css +29 -16
  234. package/build-style/tab-list/editor-rtl.css +6 -0
  235. package/build-style/tab-list/editor.css +6 -0
  236. package/build-style/tab-panel/style-rtl.css +17 -1
  237. package/build-style/tab-panel/style.css +17 -1
  238. package/build-style/tab-panels/style-rtl.css +4 -0
  239. package/build-style/tab-panels/style.css +4 -0
  240. package/build-style/tabs/style-rtl.css +0 -3
  241. package/build-style/tabs/style.css +0 -3
  242. package/build-style/video/editor-rtl.css +4 -0
  243. package/build-style/video/editor.css +4 -0
  244. package/package.json +39 -38
  245. package/src/accordion/edit.js +0 -2
  246. package/src/accordion-item/block.json +1 -0
  247. package/src/block/test/edit.native.js +1 -1
  248. package/src/button/constants.js +1 -1
  249. package/src/button/test/get-updated-link-attributes.js +6 -10
  250. package/src/categories/edit.js +3 -2
  251. package/src/classic.scss +25 -0
  252. package/src/editor.scss +2 -2
  253. package/src/embed/edit.js +61 -52
  254. package/src/embed/edit.native.js +71 -57
  255. package/src/embed/transforms.js +8 -2
  256. package/src/embed/util.js +17 -0
  257. package/src/form/block.json +1 -1
  258. package/src/form-input/block.json +1 -1
  259. package/src/form-submission-notification/block.json +1 -1
  260. package/src/form-submit-button/block.json +1 -1
  261. package/src/group/block.json +2 -1
  262. package/src/image/constants.js +1 -1
  263. package/src/image/edit.js +5 -3
  264. package/src/image/edit.native.js +3 -3
  265. package/src/image/image.js +63 -27
  266. package/src/image/test/edit.native.js +2 -2
  267. package/src/index.js +4 -4
  268. package/src/latest-comments/style.scss +7 -7
  269. package/src/latest-posts/edit.js +1 -1
  270. package/src/latest-posts/index.php +1 -1
  271. package/src/math/edit.js +3 -3
  272. package/src/navigation/edit/accessible-description.js +1 -1
  273. package/src/navigation/edit/overlay-template-part-selector.js +3 -3
  274. package/src/navigation/edit/test/overlay-template-part-selector.js +1 -0
  275. package/src/navigation-link/edit.js +2 -5
  276. package/src/navigation-link/link-ui/dialog-wrapper.js +2 -1
  277. package/src/navigation-link/link-ui/index.js +1 -1
  278. package/src/paragraph/use-enter.js +18 -24
  279. package/src/post-author/edit.js +3 -5
  280. package/src/post-comments-form/edit.js +1 -1
  281. package/src/post-featured-image/edit.js +2 -9
  282. package/src/post-template/edit.js +7 -1
  283. package/src/post-template/index.php +3 -0
  284. package/src/post-template/style.scss +2 -2
  285. package/src/pullquote/block.json +1 -4
  286. package/src/query/edit/inspector-controls/author-control.js +1 -1
  287. package/src/query/edit/inspector-controls/format-controls.js +1 -1
  288. package/src/query/edit/inspector-controls/parent-control.js +1 -1
  289. package/src/query/edit/inspector-controls/taxonomy-controls.js +1 -1
  290. package/src/site-logo/edit.js +40 -20
  291. package/src/style.scss +1 -1
  292. package/src/tab/block.json +23 -23
  293. package/src/tab/controls.js +6 -52
  294. package/src/tab/edit.js +94 -123
  295. package/src/{tabs-menu-item → tab}/editor.scss +3 -3
  296. package/src/tab/index.php +32 -51
  297. package/src/tab/save.js +4 -4
  298. package/src/tab/style.scss +34 -17
  299. package/{build/tabs-menu → src/tab-list}/block.json +4 -4
  300. package/src/{tabs-menu → tab-list}/edit.js +9 -18
  301. package/src/{tabs-menu → tab-list}/editor.scss +2 -2
  302. package/src/{tabs-menu → tab-list}/index.js +1 -1
  303. package/src/tab-list/index.php +80 -0
  304. package/src/{tab → tab-panel}/add-tab-toolbar-control.js +19 -19
  305. package/src/tab-panel/block.json +27 -37
  306. package/src/tab-panel/controls.js +65 -0
  307. package/src/tab-panel/edit.js +121 -20
  308. package/src/tab-panel/index.js +1 -1
  309. package/src/tab-panel/index.php +88 -0
  310. package/src/{tab → tab-panel}/remove-tab-toolbar-control.js +20 -19
  311. package/src/tab-panel/save.js +4 -2
  312. package/src/tab-panel/style.scss +20 -1
  313. package/src/tab-panels/block.json +66 -0
  314. package/src/tab-panels/edit.js +42 -0
  315. package/src/{tabs-menu-item → tab-panels}/index.js +1 -1
  316. package/src/tab-panels/save.js +11 -0
  317. package/src/tab-panels/style.scss +4 -0
  318. package/src/tabs/block.json +1 -2
  319. package/src/tabs/controls.js +2 -2
  320. package/src/tabs/edit.js +32 -150
  321. package/src/tabs/index.js +5 -5
  322. package/src/tabs/index.php +5 -5
  323. package/src/tabs/style.scss +0 -3
  324. package/src/tabs/use-tab-list-sync.js +237 -0
  325. package/src/terms-query/edit/inspector-controls/include-control.js +1 -1
  326. package/src/video/editor.scss +5 -0
  327. package/src/video/tracks-editor.js +2 -2
  328. package/build/tab/add-tab-toolbar-control.cjs.map +0 -7
  329. package/build/tab/remove-tab-toolbar-control.cjs.map +0 -7
  330. package/build/tab/slug-from-label.cjs +0 -37
  331. package/build/tab/slug-from-label.cjs.map +0 -7
  332. package/build/tabs-menu/edit.cjs.map +0 -7
  333. package/build/tabs-menu-item/block.json +0 -59
  334. package/build/tabs-menu-item/controls.cjs.map +0 -7
  335. package/build/tabs-menu-item/edit.cjs +0 -144
  336. package/build/tabs-menu-item/edit.cjs.map +0 -7
  337. package/build/tabs-menu-item/index.cjs.map +0 -7
  338. package/build/tabs-menu-item/save.cjs.map +0 -7
  339. package/build-module/tab/add-tab-toolbar-control.mjs.map +0 -7
  340. package/build-module/tab/remove-tab-toolbar-control.mjs.map +0 -7
  341. package/build-module/tab/slug-from-label.mjs +0 -16
  342. package/build-module/tab/slug-from-label.mjs.map +0 -7
  343. package/build-module/tabs-menu/edit.mjs.map +0 -7
  344. package/build-module/tabs-menu-item/block.json +0 -59
  345. package/build-module/tabs-menu-item/controls.mjs +0 -15
  346. package/build-module/tabs-menu-item/controls.mjs.map +0 -7
  347. package/build-module/tabs-menu-item/edit.mjs +0 -117
  348. package/build-module/tabs-menu-item/edit.mjs.map +0 -7
  349. package/build-module/tabs-menu-item/index.mjs.map +0 -7
  350. package/build-module/tabs-menu-item/save.mjs +0 -14
  351. package/build-module/tabs-menu-item/save.mjs.map +0 -7
  352. package/build-style/tabs-menu/editor-rtl.css +0 -6
  353. package/build-style/tabs-menu/editor.css +0 -6
  354. package/build-style/tabs-menu-item/editor-rtl.css +0 -11
  355. package/build-style/tabs-menu-item/editor.css +0 -11
  356. package/build-style/tabs-menu-item/style-rtl.css +0 -33
  357. package/build-style/tabs-menu-item/style.css +0 -33
  358. package/src/tab/slug-from-label.js +0 -26
  359. package/src/tabs-menu/index.php +0 -80
  360. package/src/tabs-menu-item/block.json +0 -59
  361. package/src/tabs-menu-item/controls.js +0 -19
  362. package/src/tabs-menu-item/edit.js +0 -150
  363. package/src/tabs-menu-item/index.php +0 -70
  364. package/src/tabs-menu-item/save.js +0 -13
  365. package/src/tabs-menu-item/style.scss +0 -40
  366. /package/src/{tabs-menu → tab-list}/save.js +0 -0
  367. /package/src/{tab → tab-panel}/init.js +0 -0
@@ -11,9 +11,9 @@ import { ToolbarGroup, ToolbarButton } from '@wordpress/components';
11
11
  import { useDispatch, useSelect } from '@wordpress/data';
12
12
 
13
13
  /**
14
- * "Add tab" button in the block toolbar for the tab block.
15
- * Inserts a new core/tab into the tab-panel and a new core/tabs-menu-item
16
- * into the tabs-menu, keeping both in sync.
14
+ * "Add tab" button in the block toolbar for the tabs block.
15
+ * Inserts a new core/tab-panel into the tab-panels and a new core/tab
16
+ * into the tab-list, keeping both in sync.
17
17
  *
18
18
  * @param {Object} props
19
19
  * @param {string} props.tabsClientId The client ID of the parent tabs block.
@@ -22,44 +22,44 @@ import { useDispatch, useSelect } from '@wordpress/data';
22
22
  export default function AddTabToolbarControl( { tabsClientId } ) {
23
23
  const { insertBlock } = useDispatch( blockEditorStore );
24
24
 
25
- const { tabPanelClientId, tabsMenuClientId } = useSelect(
25
+ const { tabPanelsClientId, tabsListClientId } = useSelect(
26
26
  ( select ) => {
27
27
  if ( ! tabsClientId ) {
28
28
  return {
29
- tabPanelClientId: null,
30
- tabsMenuClientId: null,
29
+ tabPanelsClientId: null,
30
+ tabsListClientId: null,
31
31
  };
32
32
  }
33
33
  const { getBlocks } = select( blockEditorStore );
34
34
  const innerBlocks = getBlocks( tabsClientId );
35
- const tabPanel = innerBlocks.find(
36
- ( block ) => block.name === 'core/tab-panel'
35
+ const tabPanels = innerBlocks.find(
36
+ ( block ) => block.name === 'core/tab-panels'
37
37
  );
38
- const tabsMenu = innerBlocks.find(
39
- ( block ) => block.name === 'core/tabs-menu'
38
+ const tabList = innerBlocks.find(
39
+ ( block ) => block.name === 'core/tab-list'
40
40
  );
41
41
  return {
42
- tabPanelClientId: tabPanel?.clientId || null,
43
- tabsMenuClientId: tabsMenu?.clientId || null,
42
+ tabPanelsClientId: tabPanels?.clientId || null,
43
+ tabsListClientId: tabList?.clientId || null,
44
44
  };
45
45
  },
46
46
  [ tabsClientId ]
47
47
  );
48
48
 
49
49
  const addTab = () => {
50
- if ( ! tabPanelClientId ) {
50
+ if ( ! tabPanelsClientId ) {
51
51
  return;
52
52
  }
53
53
 
54
- const newTabBlock = createBlock( 'core/tab', {
54
+ const newTabPanelBlock = createBlock( 'core/tab-panel', {
55
55
  label: __( 'Tab' ),
56
56
  } );
57
- insertBlock( newTabBlock, undefined, tabPanelClientId );
57
+ insertBlock( newTabPanelBlock, undefined, tabPanelsClientId );
58
58
 
59
- // Insert a corresponding menu item into the tabs-menu.
60
- if ( tabsMenuClientId ) {
61
- const newMenuItemBlock = createBlock( 'core/tabs-menu-item', {} );
62
- insertBlock( newMenuItemBlock, undefined, tabsMenuClientId );
59
+ // Insert a corresponding tab into the tab-list.
60
+ if ( tabsListClientId ) {
61
+ const newTabBlock = createBlock( 'core/tab', {} );
62
+ insertBlock( newTabBlock, undefined, tabsListClientId );
63
63
  }
64
64
  };
65
65
 
@@ -4,62 +4,52 @@
4
4
  "apiVersion": 3,
5
5
  "name": "core/tab-panel",
6
6
  "title": "Tab Panel",
7
- "description": "Container for tab panel content in a tabbed interface.",
8
- "version": "1.0.0",
7
+ "description": "Content for a tab in a tabbed interface.",
9
8
  "category": "design",
10
9
  "textdomain": "default",
11
- "parent": [ "core/tabs" ],
12
- "allowedBlocks": [ "core/tab" ],
13
- "attributes": {},
10
+ "attributes": {
11
+ "label": {
12
+ "type": "string",
13
+ "default": ""
14
+ }
15
+ },
16
+ "parent": [ "core/tab-panels" ],
17
+ "usesContext": [
18
+ "core/tabs-activeTabIndex",
19
+ "core/tabs-editorActiveTabIndex",
20
+ "core/tabs-id"
21
+ ],
14
22
  "supports": {
15
- "anchor": false,
23
+ "anchor": true,
16
24
  "html": false,
17
25
  "reusable": false,
18
- "lock": false,
19
- "dimensions": {
20
- "aspectRatio": false,
21
- "height": false,
22
- "minHeight": false,
23
- "width": false
24
- },
25
26
  "color": {
26
27
  "background": true,
27
28
  "text": true,
28
- "heading": true,
29
- "link": true,
30
29
  "__experimentalDefaultControls": {
31
30
  "background": true,
32
31
  "text": true
33
32
  }
34
33
  },
34
+ "layout": true,
35
35
  "spacing": {
36
- "blockGap": false,
36
+ "blockGap": true,
37
37
  "padding": true,
38
- "margin": true
38
+ "margin": false
39
39
  },
40
40
  "typography": {
41
41
  "fontSize": true,
42
- "__experimentalFontFamily": true
43
- },
44
- "layout": {
45
- "default": {
46
- "type": "flex",
47
- "flexWrap": "nowrap",
48
- "justifyContent": "stretch",
49
- "orientation": "vertical"
50
- },
51
- "allowSwitching": false,
52
- "allowVerticalAlignment": false,
53
- "allowOrientation": false,
54
- "allowJustification": true,
55
- "allowSizingOnChildren": false
42
+ "__experimentalFontFamily": true,
43
+ "__experimentalDefaultControls": {
44
+ "fontSize": true,
45
+ "__experimentalFontFamily": true
46
+ }
56
47
  },
57
- "__experimentalBorder": {
58
- "radius": true,
59
- "color": true,
60
- "width": true,
61
- "style": true
62
- }
48
+ "renaming": true,
49
+ "visibility": false
50
+ },
51
+ "providesContext": {
52
+ "core/tab-label": "label"
63
53
  },
64
54
  "editorScript": "file:./index.js",
65
55
  "style": "file:./style-index.css"
@@ -0,0 +1,65 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import {
5
+ InspectorControls,
6
+ store as blockEditorStore,
7
+ } from '@wordpress/block-editor';
8
+ import {
9
+ CheckboxControl,
10
+ __experimentalToolsPanel as ToolsPanel,
11
+ __experimentalToolsPanelItem as ToolsPanelItem,
12
+ } from '@wordpress/components';
13
+ import { __ } from '@wordpress/i18n';
14
+ import { useDispatch } from '@wordpress/data';
15
+
16
+ /**
17
+ * Internal dependencies
18
+ */
19
+ import AddTabToolbarControl from './add-tab-toolbar-control';
20
+ import RemoveTabToolbarControl from './remove-tab-toolbar-control';
21
+ import { useToolsPanelDropdownMenuProps } from '../utils/hooks';
22
+
23
+ export default function Controls( { tabsClientId, blockIndex, isDefaultTab } ) {
24
+ const { updateBlockAttributes } = useDispatch( blockEditorStore );
25
+ const dropdownMenuProps = useToolsPanelDropdownMenuProps();
26
+
27
+ return (
28
+ <>
29
+ <AddTabToolbarControl tabsClientId={ tabsClientId } />
30
+ <RemoveTabToolbarControl tabsClientId={ tabsClientId } />
31
+ <InspectorControls>
32
+ <ToolsPanel
33
+ label={ __( 'Settings' ) }
34
+ resetAll={ () => {
35
+ updateBlockAttributes( tabsClientId, {
36
+ activeTabIndex: 0,
37
+ } );
38
+ } }
39
+ dropdownMenuProps={ dropdownMenuProps }
40
+ >
41
+ <ToolsPanelItem
42
+ label={ __( 'Default tab' ) }
43
+ hasValue={ () => isDefaultTab && blockIndex !== 0 }
44
+ onDeselect={ () => {
45
+ updateBlockAttributes( tabsClientId, {
46
+ activeTabIndex: 0,
47
+ } );
48
+ } }
49
+ isShownByDefault
50
+ >
51
+ <CheckboxControl
52
+ label={ __( 'Default tab' ) }
53
+ checked={ isDefaultTab }
54
+ onChange={ ( value ) => {
55
+ updateBlockAttributes( tabsClientId, {
56
+ activeTabIndex: value ? blockIndex : 0,
57
+ } );
58
+ } }
59
+ />
60
+ </ToolsPanelItem>
61
+ </ToolsPanel>
62
+ </InspectorControls>
63
+ </>
64
+ );
65
+ }
@@ -1,44 +1,145 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
+ import { __ } from '@wordpress/i18n';
4
5
  import {
5
6
  useBlockProps,
6
7
  useInnerBlocksProps,
7
8
  store as blockEditorStore,
8
9
  } from '@wordpress/block-editor';
9
- import { useSelect } from '@wordpress/data';
10
+ import { useSelect, useDispatch } from '@wordpress/data';
11
+ import { useMemo, useRef, useEffect } from '@wordpress/element';
10
12
 
11
13
  /**
12
14
  * Internal dependencies
13
15
  */
14
- import AddTabToolbarControl from '../tab/add-tab-toolbar-control';
15
- import RemoveTabToolbarControl from '../tab/remove-tab-toolbar-control';
16
+ import Controls from './controls';
16
17
 
17
- const TAB_PANELS_TEMPLATE = [ [ 'core/tab', {} ] ];
18
+ const TEMPLATE = [
19
+ [
20
+ 'core/paragraph',
21
+ {
22
+ placeholder: __( 'Type / to choose a block' ),
23
+ },
24
+ ],
25
+ ];
18
26
 
19
- export default function Edit( { clientId } ) {
20
- const blockProps = useBlockProps();
27
+ const { cancelAnimationFrame } = window;
21
28
 
22
- const innerBlocksProps = useInnerBlocksProps( blockProps, {
23
- template: TAB_PANELS_TEMPLATE,
24
- templateLock: false,
25
- renderAppender: false, // Appender handled by individual tab blocks
26
- } );
29
+ export default function Edit( { clientId, context, isSelected } ) {
30
+ const focusRef = useRef();
31
+
32
+ // Consume tab indices from context
33
+ const activeTabIndex = context[ 'core/tabs-activeTabIndex' ];
34
+ const editorActiveTabIndex = context[ 'core/tabs-editorActiveTabIndex' ];
35
+ const effectiveActiveIndex = editorActiveTabIndex ?? activeTabIndex;
36
+
37
+ // Clean up animation frames on unmount.
38
+ useEffect( () => {
39
+ return () => {
40
+ if ( focusRef.current ) {
41
+ cancelAnimationFrame( focusRef.current );
42
+ }
43
+ };
44
+ }, [] );
27
45
 
28
- // Get the parent tabs block clientId
29
- const tabsClientId = useSelect(
46
+ const { blockIndex, hasInnerBlocksSelected, tabsClientId } = useSelect(
30
47
  ( select ) => {
31
- const { getBlockRootClientId } = select( blockEditorStore );
32
- return getBlockRootClientId( clientId );
48
+ const {
49
+ getBlockRootClientId,
50
+ getBlockIndex,
51
+ hasSelectedInnerBlock,
52
+ } = select( blockEditorStore );
53
+
54
+ // Get the tab-panel parent first
55
+ const tabPanelsClientId = getBlockRootClientId( clientId );
56
+ // Then get the tabs parent
57
+ const _tabsClientId = getBlockRootClientId( tabPanelsClientId );
58
+
59
+ // Get data about this instance of core/tab.
60
+ const _blockIndex = getBlockIndex( clientId );
61
+ const _hasInnerBlocksSelected = hasSelectedInnerBlock(
62
+ clientId,
63
+ true
64
+ );
65
+
66
+ return {
67
+ blockIndex: _blockIndex,
68
+ hasInnerBlocksSelected: _hasInnerBlocksSelected,
69
+ tabsClientId: _tabsClientId,
70
+ };
33
71
  },
34
72
  [ clientId ]
35
73
  );
36
74
 
75
+ const { updateBlockAttributes, __unstableMarkNextChangeAsNotPersistent } =
76
+ useDispatch( blockEditorStore );
77
+
78
+ // Sync editorActiveTabIndex when this tab is selected directly
79
+ useEffect( () => {
80
+ // Only update if this tab is selected and not already the active index
81
+ const isTabSelected = isSelected || hasInnerBlocksSelected;
82
+ if (
83
+ isTabSelected &&
84
+ tabsClientId &&
85
+ effectiveActiveIndex !== blockIndex
86
+ ) {
87
+ // Mark as non-persistent so it doesn't add to undo history
88
+ __unstableMarkNextChangeAsNotPersistent();
89
+ updateBlockAttributes( tabsClientId, {
90
+ editorActiveTabIndex: blockIndex,
91
+ } );
92
+ }
93
+ }, [
94
+ isSelected,
95
+ hasInnerBlocksSelected,
96
+ tabsClientId,
97
+ effectiveActiveIndex,
98
+ blockIndex,
99
+ updateBlockAttributes,
100
+ __unstableMarkNextChangeAsNotPersistent,
101
+ ] );
102
+
103
+ // Determine if this is the currently active tab (for editor visibility)
104
+ const isActiveTab = effectiveActiveIndex === blockIndex;
105
+
106
+ // Determine if this is the default tab (for the "Default Tab" toggle in controls)
107
+ const isDefaultTab = activeTabIndex === blockIndex;
108
+
109
+ /**
110
+ * This hook determines if the current tab panel should be visible.
111
+ * This is true if it is the editor active tab, or if it is selected directly.
112
+ */
113
+ const isSelectedTab = useMemo( () => {
114
+ // Show if this tab is directly selected or has selected inner blocks
115
+ if ( isSelected || hasInnerBlocksSelected ) {
116
+ return true;
117
+ }
118
+ // Always show the active tab (at effectiveActiveIndex) regardless of other selection state.
119
+ // This ensures the tab panel remains visible when editing labels in tab-list.
120
+ if ( isActiveTab ) {
121
+ return true;
122
+ }
123
+ return false;
124
+ }, [ isSelected, hasInnerBlocksSelected, isActiveTab ] );
125
+
126
+ const blockProps = useBlockProps( {
127
+ hidden: ! isSelectedTab,
128
+ tabIndex: isSelectedTab ? 0 : -1,
129
+ } );
130
+
131
+ const innerBlocksProps = useInnerBlocksProps( blockProps, {
132
+ template: TEMPLATE,
133
+ } );
134
+
37
135
  return (
38
- <>
39
- <AddTabToolbarControl tabsClientId={ tabsClientId } />
40
- <RemoveTabToolbarControl tabsClientId={ tabsClientId } />
41
- <div { ...innerBlocksProps } />
42
- </>
136
+ <section { ...innerBlocksProps }>
137
+ <Controls
138
+ tabsClientId={ tabsClientId }
139
+ blockIndex={ blockIndex }
140
+ isDefaultTab={ isDefaultTab }
141
+ />
142
+ { isSelectedTab && innerBlocksProps.children }
143
+ </section>
43
144
  );
44
145
  }
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { contents as icon } from '@wordpress/icons';
4
+ import { tabPanel as icon } from '@wordpress/icons';
5
5
 
6
6
  /**
7
7
  * Internal dependencies
@@ -0,0 +1,88 @@
1
+ <?php
2
+ /**
3
+ * Tab Panel Block
4
+ *
5
+ * @package WordPress
6
+ */
7
+
8
+ /**
9
+ * Render callback for core/tab-panel.
10
+ *
11
+ * @since 7.0.0
12
+ *
13
+ * @param array $attributes Block attributes.
14
+ * @param string $content Block content.
15
+ * @param \WP_Block $block Block instance.
16
+ *
17
+ * @return string Updated HTML.
18
+ */
19
+ function block_core_tab_panel_render( array $attributes, string $content, \WP_Block $block ): string {
20
+ $tabs_id = $block->context['core/tabs-id'] ?? '';
21
+
22
+ static $tab_counters = array();
23
+
24
+ if ( ! isset( $tab_counters[ $tabs_id ] ) ) {
25
+ $tab_counters[ $tabs_id ] = 0;
26
+ }
27
+
28
+ $tab_index = $tab_counters[ $tabs_id ];
29
+ ++$tab_counters[ $tabs_id ];
30
+
31
+ $tag_processor = new WP_HTML_Tag_Processor( $content );
32
+ $tag_processor->next_tag( array( 'class_name' => 'wp-block-tab-panel' ) );
33
+
34
+ // Use the user's custom anchor if present, otherwise fall back to
35
+ // the generated position-based ID.
36
+ $tab_id = (string) $tag_processor->get_attribute( 'id' );
37
+ if ( empty( $tab_id ) ) {
38
+ $tab_id = ! empty( $tabs_id )
39
+ ? $tabs_id . '-tab-' . $tab_index
40
+ : 'tab-' . $tab_index;
41
+ $tag_processor->set_attribute( 'id', $tab_id );
42
+ }
43
+
44
+ /**
45
+ * Add interactivity to the tab element.
46
+ */
47
+ $tag_processor->set_attribute(
48
+ 'data-wp-interactive',
49
+ 'core/tabs/private'
50
+ );
51
+ $tag_processor->set_attribute(
52
+ 'data-wp-context',
53
+ wp_json_encode(
54
+ array(
55
+ 'tab' => array(
56
+ 'id' => $tab_id,
57
+ ),
58
+ )
59
+ )
60
+ );
61
+
62
+ /**
63
+ * Process accessibility and interactivity attributes.
64
+ */
65
+ $tag_processor->set_attribute( 'role', 'tabpanel' );
66
+ $tag_processor->set_attribute( 'aria-labelledby', 'tab__' . $tab_id );
67
+ $tag_processor->set_attribute( 'data-wp-bind--hidden', '!state.isActiveTab' );
68
+ $tag_processor->set_attribute( 'tabindex', 0 );
69
+
70
+ return (string) $tag_processor->get_updated_html();
71
+ }
72
+
73
+ /**
74
+ * Registers the `core/tab-panel` block on the server.
75
+ *
76
+ * @hook init
77
+ *
78
+ * @since 7.0.0
79
+ */
80
+ function register_block_core_tab_panel() {
81
+ register_block_type_from_metadata(
82
+ __DIR__ . '/tab-panel',
83
+ array(
84
+ 'render_callback' => 'block_core_tab_panel_render',
85
+ )
86
+ );
87
+ }
88
+ add_action( 'init', 'register_block_core_tab_panel' );
@@ -10,9 +10,9 @@ import { __ } from '@wordpress/i18n';
10
10
  import { useDispatch, useSelect } from '@wordpress/data';
11
11
 
12
12
  /**
13
- * "Remove Tab" button in the block toolbar for the tab block.
14
- * Removes the currently active core/tab and its corresponding
15
- * core/tabs-menu-item, keeping both in sync.
13
+ * "Remove Tab" button in the block toolbar for the tabs block.
14
+ * Removes the currently active core/tab-panel and its corresponding
15
+ * core/tab, keeping both in sync.
16
16
  *
17
17
  * @param {Object} props
18
18
  * @param {string} props.tabsClientId The client ID of the parent tabs block.
@@ -27,16 +27,16 @@ export default function RemoveTabToolbarControl( { tabsClientId } ) {
27
27
  } = useDispatch( blockEditorStore );
28
28
 
29
29
  const {
30
+ activeTabPanelClientId,
30
31
  activeTabClientId,
31
- activeMenuItemClientId,
32
32
  tabCount,
33
33
  editorActiveTabIndex,
34
34
  } = useSelect(
35
35
  ( select ) => {
36
36
  if ( ! tabsClientId ) {
37
37
  return {
38
+ activeTabPanelClientId: null,
38
39
  activeTabClientId: null,
39
- activeMenuItemClientId: null,
40
40
  tabCount: 0,
41
41
  editorActiveTabIndex: 0,
42
42
  };
@@ -49,19 +49,20 @@ export default function RemoveTabToolbarControl( { tabsClientId } ) {
49
49
  tabsAttributes?.activeTabIndex ??
50
50
  0;
51
51
  const innerBlocks = getBlocks( tabsClientId );
52
- const tabPanel = innerBlocks.find(
53
- ( block ) => block.name === 'core/tab-panel'
52
+ const tabPanels = innerBlocks.find(
53
+ ( block ) => block.name === 'core/tab-panels'
54
54
  );
55
- const tabsMenu = innerBlocks.find(
56
- ( block ) => block.name === 'core/tabs-menu'
55
+ const tabList = innerBlocks.find(
56
+ ( block ) => block.name === 'core/tab-list'
57
57
  );
58
- const tabs = tabPanel?.innerBlocks || [];
59
- const menuItems = tabsMenu?.innerBlocks || [];
58
+ const tabPanelBlocks = tabPanels?.innerBlocks || [];
59
+ const tabs = tabList?.innerBlocks || [];
60
+ const activeTabPanel = tabPanelBlocks[ activeIndex ];
60
61
  const activeTab = tabs[ activeIndex ];
61
- const activeMenuItem = menuItems[ activeIndex ];
62
+
62
63
  return {
64
+ activeTabPanelClientId: activeTabPanel?.clientId || null,
63
65
  activeTabClientId: activeTab?.clientId || null,
64
- activeMenuItemClientId: activeMenuItem?.clientId || null,
65
66
  tabCount: tabs.length,
66
67
  editorActiveTabIndex: activeIndex,
67
68
  };
@@ -70,7 +71,7 @@ export default function RemoveTabToolbarControl( { tabsClientId } ) {
70
71
  );
71
72
 
72
73
  const removeTab = () => {
73
- if ( ! activeTabClientId || tabCount <= 1 ) {
74
+ if ( ! activeTabPanelClientId || tabCount <= 1 ) {
74
75
  return;
75
76
  }
76
77
 
@@ -85,10 +86,10 @@ export default function RemoveTabToolbarControl( { tabsClientId } ) {
85
86
  editorActiveTabIndex: newActiveIndex,
86
87
  } );
87
88
 
88
- // Remove the tab content block and the corresponding menu item.
89
- removeBlock( activeTabClientId, false );
90
- if ( activeMenuItemClientId ) {
91
- removeBlock( activeMenuItemClientId, false );
89
+ // Remove the tab panel and corresponding tab
90
+ removeBlock( activeTabPanelClientId, false );
91
+ if ( activeTabClientId ) {
92
+ removeBlock( activeTabClientId, false );
92
93
  }
93
94
 
94
95
  if ( tabsClientId ) {
@@ -96,7 +97,7 @@ export default function RemoveTabToolbarControl( { tabsClientId } ) {
96
97
  }
97
98
  };
98
99
 
99
- const isDisabled = tabCount <= 1 || ! activeTabClientId;
100
+ const isDisabled = tabCount <= 1 || ! activeTabPanelClientId;
100
101
 
101
102
  return (
102
103
  <BlockControls group="other">
@@ -4,8 +4,10 @@
4
4
  import { useBlockProps, useInnerBlocksProps } from '@wordpress/block-editor';
5
5
 
6
6
  export default function save() {
7
- const blockProps = useBlockProps.save();
7
+ const blockProps = useBlockProps.save( {
8
+ role: 'tabpanel',
9
+ } );
8
10
  const innerBlocksProps = useInnerBlocksProps.save( blockProps );
9
11
 
10
- return <div { ...innerBlocksProps } />;
12
+ return <section { ...innerBlocksProps } />;
11
13
  }
@@ -1,4 +1,23 @@
1
1
  .wp-block-tab-panel {
2
+ max-width: 100%;
3
+ flex-basis: 100%;
2
4
  flex-grow: 1;
3
- min-width: 0;
5
+ box-sizing: border-box;
6
+
7
+ & > *:first-child {
8
+ margin-top: 0;
9
+ }
10
+ & > *:last-child {
11
+ margin-bottom: 0;
12
+ }
13
+
14
+ &[hidden],
15
+ &:empty {
16
+ display: none !important;
17
+ }
18
+ }
19
+
20
+ .wp-block-tab-panel.wp-block.has-background,
21
+ .wp-block-tab-panel:not(.wp-block).has-background {
22
+ padding: var(--wp--preset--spacing--30);
4
23
  }