@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
@@ -8,12 +8,13 @@ import {
8
8
  __experimentalVStack as VStack,
9
9
  __experimentalToolsPanel as ToolsPanel,
10
10
  __experimentalToolsPanelItem as ToolsPanelItem,
11
+ ToggleControl,
11
12
  __experimentalToggleGroupControl as ToggleGroupControl,
12
13
  __experimentalToggleGroupControlOption as ToggleGroupControlOption,
13
14
  } from '@wordpress/components';
14
15
  import { useSelect } from '@wordpress/data';
15
16
  import { store as coreStore } from '@wordpress/core-data';
16
- import { __ } from '@wordpress/i18n';
17
+ import { __, sprintf } from '@wordpress/i18n';
17
18
  import { debounce } from '@wordpress/compose';
18
19
  import { useState, useMemo } from '@wordpress/element';
19
20
 
@@ -40,7 +41,8 @@ import {
40
41
  import { useToolsPanelDropdownMenuProps } from '../../../utils/hooks';
41
42
 
42
43
  export default function QueryInspectorControls( props ) {
43
- const { attributes, setQuery, isSingular } = props;
44
+ const { attributes, setQuery, isSingular, shouldExcludeCurrentPost } =
45
+ props;
44
46
  const { query } = attributes;
45
47
  const {
46
48
  order,
@@ -55,6 +57,7 @@ export default function QueryInspectorControls( props ) {
55
57
  taxQuery,
56
58
  parents,
57
59
  format,
60
+ excludeCurrent,
58
61
  } = query;
59
62
  const allowedControls = useAllowedControls( attributes );
60
63
  const showSticky = postType === 'post';
@@ -171,12 +174,22 @@ export default function QueryInspectorControls( props ) {
171
174
  [ allowedControls, postTypeHasFormatSupport ]
172
175
  );
173
176
 
177
+ const showExcludeCurrentControl =
178
+ shouldExcludeCurrentPost &&
179
+ isControlAllowed( allowedControls, 'excludeCurrent' );
180
+ const postTypeSingularName = useSelect(
181
+ ( select ) =>
182
+ select( coreStore ).getPostType( postType )?.labels.singular_name,
183
+ [ postType ]
184
+ );
185
+
174
186
  const showFiltersPanel =
175
187
  showTaxControl ||
176
188
  showAuthorControl ||
177
189
  showSearchControl ||
178
190
  showParentControl ||
179
- showFormatControl;
191
+ showFormatControl ||
192
+ showExcludeCurrentControl;
180
193
  const dropdownMenuProps = useToolsPanelDropdownMenuProps();
181
194
 
182
195
  const showPostCountControl = isControlAllowed(
@@ -383,6 +396,7 @@ export default function QueryInspectorControls( props ) {
383
396
  search: '',
384
397
  taxQuery: null,
385
398
  format: [],
399
+ excludeCurrent: null,
386
400
  } );
387
401
  setQuerySearch( '' );
388
402
  } }
@@ -463,6 +477,32 @@ export default function QueryInspectorControls( props ) {
463
477
  />
464
478
  </ToolsPanelItem>
465
479
  ) }
480
+ { showExcludeCurrentControl && (
481
+ <ToolsPanelItem
482
+ label={ __( 'Exclude' ) }
483
+ hasValue={ () => excludeCurrent !== null }
484
+ onDeselect={ () =>
485
+ setQuery( { excludeCurrent: null } )
486
+ }
487
+ >
488
+ <ToggleControl
489
+ label={ __( 'Exclude current' ) }
490
+ help={ sprintf(
491
+ /* translators: %s: the post type singular name */
492
+ __(
493
+ 'Exclude the current %s from the query.'
494
+ ),
495
+ postTypeSingularName
496
+ ) }
497
+ checked={ !! excludeCurrent }
498
+ onChange={ ( value ) => {
499
+ setQuery( {
500
+ excludeCurrent: !! value,
501
+ } );
502
+ } }
503
+ />
504
+ </ToolsPanelItem>
505
+ ) }
466
506
  </ToolsPanel>
467
507
  ) }
468
508
  </>
@@ -10,7 +10,6 @@ const MAX_OFFSET = 100;
10
10
  export const OffsetControl = ( { offset = 0, onChange } ) => {
11
11
  return (
12
12
  <NumberControl
13
- __next40pxDefaultSize
14
13
  label={ __( 'Offset' ) }
15
14
  value={ offset }
16
15
  min={ MIN_OFFSET }
@@ -7,7 +7,6 @@ import { __ } from '@wordpress/i18n';
7
7
  export const PagesControl = ( { pages, onChange } ) => {
8
8
  return (
9
9
  <NumberControl
10
- __next40pxDefaultSize
11
10
  label={ __( 'Max pages to show' ) }
12
11
  value={ pages }
13
12
  min={ 0 }
@@ -44,8 +44,9 @@ export default function QueryContent( {
44
44
  tagName: TagName = 'div',
45
45
  query: { inherit } = {},
46
46
  } = attributes;
47
- const { templateSlug } = context;
48
- const { isSingular } = getQueryContextFromTemplate( templateSlug );
47
+ const { templateSlug, postType } = context;
48
+ const { isSingular, templateType } =
49
+ getQueryContextFromTemplate( templateSlug );
49
50
  const { __unstableMarkNextChangeAsNotPersistent } =
50
51
  useDispatch( blockEditorStore );
51
52
  const instanceId = useInstanceId( QueryContent );
@@ -77,6 +78,14 @@ export default function QueryContent( {
77
78
  DEFAULTS_POSTS_PER_PAGE,
78
79
  };
79
80
  }, [] );
81
+
82
+ // Whether the "exclude current" filter applies: we're in a singular template
83
+ // and the post type matches the query.
84
+ const shouldExcludeCurrentPost =
85
+ isSingular &&
86
+ ! inherit &&
87
+ ( query.postType === postType || query.postType === templateType );
88
+
80
89
  // There are some effects running where some initialization logic is
81
90
  // happening and setting some values to some attributes (ex. queryId).
82
91
  // These updates can cause an `undo trap` where undoing will result in
@@ -102,15 +111,21 @@ export default function QueryContent( {
102
111
  } else if ( ! query.perPage && postsPerPage ) {
103
112
  newQuery.perPage = postsPerPage;
104
113
  }
105
-
114
+ // Remove the exclusion when it no longer applies, so the filters stay
115
+ // clean. We never force it on: enabling the exclusion is left to the user.
116
+ if ( ! shouldExcludeCurrentPost && query.excludeCurrent !== null ) {
117
+ newQuery.excludeCurrent = null;
118
+ }
106
119
  if ( !! Object.keys( newQuery ).length ) {
107
120
  __unstableMarkNextChangeAsNotPersistent();
108
121
  updateQuery( newQuery );
109
122
  }
110
123
  }, [
111
124
  query.perPage,
125
+ query.excludeCurrent,
112
126
  inherit,
113
127
  postsPerPage,
128
+ shouldExcludeCurrentPost,
114
129
  __unstableMarkNextChangeAsNotPersistent,
115
130
  updateQuery,
116
131
  ] );
@@ -150,6 +165,7 @@ export default function QueryContent( {
150
165
  setAttributes={ setAttributes }
151
166
  clientId={ clientId }
152
167
  isSingular={ isSingular }
168
+ shouldExcludeCurrentPost={ shouldExcludeCurrentPost }
153
169
  />
154
170
  </InspectorControls>
155
171
  <InspectorControls group="advanced">
@@ -34,6 +34,7 @@ export const settings = {
34
34
  search: '',
35
35
  sticky: 'exclude',
36
36
  inherit: false,
37
+ excludeCurrent: null,
37
38
  },
38
39
  },
39
40
  innerBlocks: [
@@ -29,6 +29,7 @@ _Defined via the [`supports`](https://developer.wordpress.org/block-editor/refer
29
29
  - [`background`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#background):
30
30
  - `backgroundImage`: `true`
31
31
  - `backgroundSize`: `true`
32
+ - `gradient`: `true`
32
33
  - [`dimensions`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#dimensions):
33
34
  - `minHeight`: `true`
34
35
  - [`typography`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#typography):
@@ -33,8 +33,10 @@
33
33
  "background": {
34
34
  "backgroundImage": true,
35
35
  "backgroundSize": true,
36
+ "gradient": true,
36
37
  "__experimentalDefaultControls": {
37
- "backgroundImage": true
38
+ "backgroundImage": true,
39
+ "gradient": true
38
40
  }
39
41
  },
40
42
  "__experimentalBorder": {
@@ -4,7 +4,7 @@
4
4
  import { RichText } from '@wordpress/block-editor';
5
5
  import {
6
6
  createBlock,
7
- __experimentalCloneSanitizedBlock,
7
+ cloneSanitizedBlock,
8
8
  switchToBlockType,
9
9
  } from '@wordpress/blocks';
10
10
 
@@ -96,9 +96,7 @@ const transforms = {
96
96
  createBlock(
97
97
  'core/quote',
98
98
  {},
99
- blocks.map( ( block ) =>
100
- __experimentalCloneSanitizedBlock( block )
101
- )
99
+ blocks.map( ( block ) => cloneSanitizedBlock( block ) )
102
100
  ),
103
101
  },
104
102
  ],
package/src/rss/edit.js CHANGED
@@ -96,7 +96,6 @@ export default function RSSEdit( { attributes, setAttributes, name } ) {
96
96
  className="wp-block-rss__placeholder-form"
97
97
  >
98
98
  <InputControl
99
- __next40pxDefaultSize
100
99
  label={ label }
101
100
  type="url"
102
101
  hideLabelFromVision
package/src/rss/index.php CHANGED
@@ -97,7 +97,7 @@ function render_block_core_rss( $attributes ) {
97
97
  $excerpt = esc_attr( wp_trim_words( $excerpt, $attributes['excerptLength'], ' [&hellip;]' ) );
98
98
 
99
99
  // Change existing [...] to [&hellip;].
100
- if ( '[...]' === substr( $excerpt, -5 ) ) {
100
+ if ( str_ends_with( $excerpt, '[...]' ) ) {
101
101
  $excerpt = substr( $excerpt, 0, -5 ) . '[&hellip;]';
102
102
  }
103
103
 
@@ -1,8 +1,6 @@
1
1
  # Tab List
2
2
 
3
3
  <!-- START TOKEN(Autogenerated block API docs) -->
4
- <div class="callout callout-warning">This block is <strong>experimental</strong> and may change or be removed without notice.</div>
5
-
6
4
  Display the tab buttons for a tabbed interface.
7
5
 
8
6
  - **Name:** `core/tab-list`
@@ -28,6 +26,7 @@ _Defined via the [`attributes`](https://developer.wordpress.org/block-editor/ref
28
26
  _Defined via the [`supports`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/) property in block.json._
29
27
 
30
28
  - [`html`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#html): `false`
29
+ - [`ariaLabel`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#arialabel): `true`
31
30
  - [`visibility`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#visibility): `false`
32
31
  - [`lock`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#lock): `false`
33
32
  - [`color`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#color):
@@ -36,7 +35,7 @@ _Defined via the [`supports`](https://developer.wordpress.org/block-editor/refer
36
35
  - [`typography`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#typography):
37
36
  - [`fontSize`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#typography-fontsize): `true`
38
37
  - [`layout`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#layout):
39
- - [`default`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#layout-default): `{"type":"flex","flexWrap":"nowrap"}`
38
+ - [`default`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#layout-default): `{"type":"flex","flexWrap":"wrap"}`
40
39
  - [`allowVerticalAlignment`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#layout-allowverticalalignment): `false`
41
40
  - [`allowOrientation`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#layout-alloworientation): `false`
42
41
  - [`allowWrap`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#layout-allowwrap): `false`
@@ -68,8 +67,8 @@ _Defined via the [`selectors`](https://developer.wordpress.org/block-editor/refe
68
67
  This is a [**hybrid block**](https://developer.wordpress.org/block-editor/getting-started/fundamentals/static-dynamic-rendering/). It saves static markup that the server may enhance during rendering.
69
68
 
70
69
  ```html
71
- <!-- wp:tab-list {"tabs":[]} -->
72
- <!-- Content... -->
70
+ <!-- wp:tab-list -->
71
+ <div role="tablist" class="wp-block-tab-list"><button type="button" role="tab">Tab 1</button><button type="button" role="tab">Tab 2</button></div>
73
72
  <!-- /wp:tab-list -->
74
73
  ```
75
74
 
@@ -1,6 +1,5 @@
1
1
  {
2
2
  "$schema": "https://schemas.wp.org/trunk/block.json",
3
- "__experimental": true,
4
3
  "apiVersion": 3,
5
4
  "name": "core/tab-list",
6
5
  "title": "Tab List",
@@ -26,6 +25,7 @@
26
25
  },
27
26
  "supports": {
28
27
  "html": false,
28
+ "ariaLabel": true,
29
29
  "visibility": false,
30
30
  "lock": false,
31
31
  "color": {
@@ -51,7 +51,7 @@
51
51
  "layout": {
52
52
  "default": {
53
53
  "type": "flex",
54
- "flexWrap": "nowrap"
54
+ "flexWrap": "wrap"
55
55
  },
56
56
  "allowVerticalAlignment": false,
57
57
  "allowOrientation": false,
@@ -8,6 +8,7 @@ import clsx from 'clsx';
8
8
  */
9
9
  import { __ } from '@wordpress/i18n';
10
10
  import {
11
+ InspectorControls,
11
12
  useBlockProps,
12
13
  store as blockEditorStore,
13
14
  RichText,
@@ -15,60 +16,88 @@ import {
15
16
  __experimentalUseColorProps as useColorProps,
16
17
  __experimentalGetSpacingClassesAndStyles as getSpacingClassesAndStyles,
17
18
  } from '@wordpress/block-editor';
18
- import { useSelect, useDispatch } from '@wordpress/data';
19
- import { useEffect, useRef } from '@wordpress/element';
19
+ import {
20
+ TextControl,
21
+ __experimentalToolsPanel as ToolsPanel,
22
+ __experimentalToolsPanelItem as ToolsPanelItem,
23
+ } from '@wordpress/components';
24
+ import { useSelect, useDispatch, useRegistry } from '@wordpress/data';
25
+ import { useEffect, useMemo, useRef } from '@wordpress/element';
20
26
 
21
27
  /**
22
28
  * Internal dependencies
23
29
  */
24
30
  import TabToolbarControls from '../tabs/tab-toolbar-controls';
25
31
  import useTabActions from '../tabs/use-tab-actions';
32
+ import { useToolsPanelDropdownMenuProps } from '../utils/hooks';
26
33
 
27
34
  const EMPTY_ARRAY = [];
28
35
 
29
36
  function Edit( {
30
37
  attributes,
31
38
  clientId,
32
- context,
39
+ setAttributes,
33
40
  __unstableLayoutClassNames: layoutClassNames,
34
41
  } ) {
35
- const tabsList = context[ 'core/tabs-list' ] || EMPTY_ARRAY;
42
+ const { ariaLabel } = attributes;
36
43
 
37
44
  const colorProps = useColorProps( attributes );
38
45
  const borderProps = useBorderProps( attributes );
39
46
  const spacingProps = getSpacingClassesAndStyles( attributes );
40
-
41
- const { tabsClientId, editorActiveTabIndex, activeTabIndex } = useSelect(
42
- ( select ) => {
43
- const { getBlockRootClientId, getBlockAttributes } =
44
- select( blockEditorStore );
45
-
46
- const _tabsClientId = getBlockRootClientId( clientId );
47
- const tabsAttributes = _tabsClientId
48
- ? getBlockAttributes( _tabsClientId )
49
- : {};
50
-
51
- return {
52
- tabsClientId: _tabsClientId,
53
- editorActiveTabIndex: tabsAttributes?.editorActiveTabIndex,
54
- activeTabIndex: tabsAttributes?.activeTabIndex ?? 0,
55
- };
56
- },
57
- [ clientId ]
58
- );
47
+ const dropdownMenuProps = useToolsPanelDropdownMenuProps();
48
+
49
+ const { tabsClientId, tabPanels, editorActiveTabIndex, activeTabIndex } =
50
+ useSelect(
51
+ ( select ) => {
52
+ const { getBlockRootClientId, getBlockAttributes, getBlocks } =
53
+ select( blockEditorStore );
54
+
55
+ const rootClientId = getBlockRootClientId( clientId );
56
+ const tabsAttributes = getBlockAttributes( rootClientId );
57
+ const tabPanelsBlock = getBlocks( rootClientId )?.find(
58
+ ( block ) => block.name === 'core/tab-panels'
59
+ );
60
+
61
+ return {
62
+ tabsClientId: rootClientId,
63
+ tabPanels: tabPanelsBlock?.innerBlocks ?? EMPTY_ARRAY,
64
+ editorActiveTabIndex: tabsAttributes?.editorActiveTabIndex,
65
+ activeTabIndex: tabsAttributes?.activeTabIndex ?? 0,
66
+ };
67
+ },
68
+ [ clientId ]
69
+ );
70
+ const registry = useRegistry();
59
71
  const { isBlockSelected, hasSelectedInnerBlock } =
60
72
  useSelect( blockEditorStore );
61
- const { updateBlockAttributes, __unstableMarkNextChangeAsNotPersistent } =
62
- useDispatch( blockEditorStore );
73
+ const {
74
+ updateBlockAttributes,
75
+ selectBlock,
76
+ __unstableMarkNextChangeAsNotPersistent,
77
+ } = useDispatch( blockEditorStore );
63
78
  const { insertTab, removeTab } = useTabActions( tabsClientId );
64
79
 
65
80
  const effectiveActiveIndex = editorActiveTabIndex ?? activeTabIndex;
81
+ const tabsList = useMemo(
82
+ () =>
83
+ tabPanels.map( ( tab ) => ( {
84
+ label: tab.attributes.label || '',
85
+ clientId: tab.clientId,
86
+ } ) ),
87
+ [ tabPanels ]
88
+ );
66
89
 
67
90
  function selectTabPanel( tabIndex ) {
68
91
  if ( tabsClientId && tabIndex !== effectiveActiveIndex ) {
69
- __unstableMarkNextChangeAsNotPersistent();
70
- updateBlockAttributes( tabsClientId, {
71
- editorActiveTabIndex: tabIndex,
92
+ // Batch the selection and index update so the sync effect in
93
+ // the tab-panel block can't revert the switch from a stale
94
+ // inner-block selection in the previously active panel.
95
+ registry.batch( () => {
96
+ selectBlock( clientId );
97
+ __unstableMarkNextChangeAsNotPersistent();
98
+ updateBlockAttributes( tabsClientId, {
99
+ editorActiveTabIndex: tabIndex,
100
+ } );
72
101
  } );
73
102
  }
74
103
  }
@@ -137,6 +166,39 @@ function Edit( {
137
166
 
138
167
  return (
139
168
  <>
169
+ <InspectorControls group="settings">
170
+ <ToolsPanel
171
+ label={ __( 'Settings' ) }
172
+ resetAll={ () =>
173
+ setAttributes( {
174
+ ariaLabel: undefined,
175
+ } )
176
+ }
177
+ dropdownMenuProps={ dropdownMenuProps }
178
+ >
179
+ <ToolsPanelItem
180
+ label={ __( 'Label' ) }
181
+ isShownByDefault
182
+ hasValue={ () => !! ariaLabel }
183
+ onDeselect={ () =>
184
+ setAttributes( { ariaLabel: undefined } )
185
+ }
186
+ >
187
+ <TextControl
188
+ label={ __( 'Label' ) }
189
+ help={ __(
190
+ 'Briefly describe this tab section for screen reader users. Examples: Event information, Product details, and Account settings.'
191
+ ) }
192
+ value={ ariaLabel || '' }
193
+ onChange={ ( value ) =>
194
+ setAttributes( {
195
+ ariaLabel: value || undefined,
196
+ } )
197
+ }
198
+ />
199
+ </ToolsPanelItem>
200
+ </ToolsPanel>
201
+ </InspectorControls>
140
202
  <TabToolbarControls tabsClientId={ tabsClientId } />
141
203
  <div { ...blockProps }>
142
204
  { tabsList.map( ( tab, index ) => {
@@ -22,14 +22,19 @@
22
22
  * @return string Updated HTML.
23
23
  */
24
24
  function block_core_tab_list_render_callback( array $attributes, string $content, \WP_Block $block ): string {
25
- $tabs_list = $block->context['core/tabs-list'] ?? array();
25
+ $tabs_list = $block->context['core/tabs-list'] ?? array();
26
+ $aria_label = empty( $attributes['ariaLabel'] ) ? __( 'Tabbed content' ) : wp_strip_all_tags( $attributes['ariaLabel'] );
27
+
28
+ $tag_processor = new WP_HTML_Tag_Processor( $content );
29
+ if ( $tag_processor->next_tag( array( 'class_name' => 'wp-block-tab-list' ) ) ) {
30
+ $tag_processor->set_attribute( 'aria-label', $aria_label );
31
+ }
26
32
 
27
33
  if ( empty( $tabs_list ) ) {
28
- return $content;
34
+ return $tag_processor->get_updated_html();
29
35
  }
30
36
 
31
- $tag_processor = new WP_HTML_Tag_Processor( $content );
32
- $tab_index = 0;
37
+ $tab_index = 0;
33
38
 
34
39
  while ( $tag_processor->next_tag( 'button' ) ) {
35
40
  $tab_id = $tabs_list[ $tab_index ] ?? null;
@@ -1,8 +1,6 @@
1
1
  # Tab Panel
2
2
 
3
3
  <!-- START TOKEN(Autogenerated block API docs) -->
4
- <div class="callout callout-warning">This block is <strong>experimental</strong> and may change or be removed without notice.</div>
5
-
6
4
  Content for a tab in a tabbed interface.
7
5
 
8
6
  - **Name:** `core/tab-panel`
@@ -46,8 +44,6 @@ _Defined via the [`usesContext` and `providesContext`](https://developer.wordpre
46
44
 
47
45
  **Uses context:**
48
46
 
49
- - `core/tabs-activeTabIndex`
50
- - `core/tabs-editorActiveTabIndex`
51
47
  - `core/tabs-id`
52
48
 
53
49
  **Provides context:**
@@ -59,8 +55,10 @@ _Defined via the [`usesContext` and `providesContext`](https://developer.wordpre
59
55
  This is a [**hybrid block**](https://developer.wordpress.org/block-editor/getting-started/fundamentals/static-dynamic-rendering/). It saves static markup that the server may enhance during rendering.
60
56
 
61
57
  ```html
62
- <!-- wp:tab-panel {"label":""} -->
63
- <!-- Content... -->
58
+ <!-- wp:tab-panel {"label":"Tab 1"} -->
59
+ <section role="tabpanel" tabindex="0" class="wp-block-tab-panel"><!-- wp:paragraph -->
60
+ <p>Panel 1</p>
61
+ <!-- /wp:paragraph --></section>
64
62
  <!-- /wp:tab-panel -->
65
63
  ```
66
64
 
@@ -1,6 +1,5 @@
1
1
  {
2
2
  "$schema": "https://schemas.wp.org/trunk/block.json",
3
- "__experimental": true,
4
3
  "apiVersion": 3,
5
4
  "name": "core/tab-panel",
6
5
  "title": "Tab Panel",
@@ -14,11 +13,7 @@
14
13
  }
15
14
  },
16
15
  "parent": [ "core/tab-panels" ],
17
- "usesContext": [
18
- "core/tabs-activeTabIndex",
19
- "core/tabs-editorActiveTabIndex",
20
- "core/tabs-id"
21
- ],
16
+ "usesContext": [ "core/tabs-id" ],
22
17
  "supports": {
23
18
  "anchor": true,
24
19
  "html": false,
@@ -8,7 +8,7 @@ import {
8
8
  store as blockEditorStore,
9
9
  } from '@wordpress/block-editor';
10
10
  import { useSelect, useDispatch } from '@wordpress/data';
11
- import { useMemo, useEffect } from '@wordpress/element';
11
+ import { useEffect } from '@wordpress/element';
12
12
 
13
13
  /**
14
14
  * Internal dependencies
@@ -24,18 +24,20 @@ const TEMPLATE = [
24
24
  ],
25
25
  ];
26
26
 
27
- export default function Edit( { clientId, context, isSelected } ) {
28
- // Consume tab indices from context
29
- const activeTabIndex = context[ 'core/tabs-activeTabIndex' ];
30
- const editorActiveTabIndex = context[ 'core/tabs-editorActiveTabIndex' ];
31
- const effectiveActiveIndex = editorActiveTabIndex ?? activeTabIndex;
32
-
33
- const { blockIndex, hasInnerBlocksSelected, tabsClientId } = useSelect(
27
+ export default function Edit( { clientId, isSelected } ) {
28
+ const {
29
+ activeTabIndex,
30
+ editorActiveTabIndex,
31
+ blockIndex,
32
+ hasInnerBlocksSelected,
33
+ tabsClientId,
34
+ } = useSelect(
34
35
  ( select ) => {
35
36
  const {
36
37
  getBlockRootClientId,
37
38
  getBlockIndex,
38
39
  hasSelectedInnerBlock,
40
+ getBlockAttributes,
39
41
  } = select( blockEditorStore );
40
42
 
41
43
  // Get the tab-panel parent first
@@ -43,6 +45,9 @@ export default function Edit( { clientId, context, isSelected } ) {
43
45
  // Then get the tabs parent
44
46
  const _tabsClientId = getBlockRootClientId( tabPanelsClientId );
45
47
 
48
+ // Read the active tab indices directly from the tabs block.
49
+ const tabsAttributes = getBlockAttributes( _tabsClientId ) ?? {};
50
+
46
51
  // Get data about this instance of core/tab.
47
52
  const _blockIndex = getBlockIndex( clientId );
48
53
  const _hasInnerBlocksSelected = hasSelectedInnerBlock(
@@ -51,6 +56,8 @@ export default function Edit( { clientId, context, isSelected } ) {
51
56
  );
52
57
 
53
58
  return {
59
+ activeTabIndex: tabsAttributes.activeTabIndex,
60
+ editorActiveTabIndex: tabsAttributes.editorActiveTabIndex,
54
61
  blockIndex: _blockIndex,
55
62
  hasInnerBlocksSelected: _hasInnerBlocksSelected,
56
63
  tabsClientId: _tabsClientId,
@@ -59,6 +66,8 @@ export default function Edit( { clientId, context, isSelected } ) {
59
66
  [ clientId ]
60
67
  );
61
68
 
69
+ const effectiveActiveIndex = editorActiveTabIndex ?? activeTabIndex;
70
+
62
71
  const { updateBlockAttributes, __unstableMarkNextChangeAsNotPersistent } =
63
72
  useDispatch( blockEditorStore );
64
73
 
@@ -93,22 +102,8 @@ export default function Edit( { clientId, context, isSelected } ) {
93
102
  // Determine if this is the default tab (for the "Default Tab" toggle in controls)
94
103
  const isDefaultTab = activeTabIndex === blockIndex;
95
104
 
96
- /**
97
- * This hook determines if the current tab panel should be visible.
98
- * This is true if it is the editor active tab, or if it is selected directly.
99
- */
100
- const isSelectedTab = useMemo( () => {
101
- // Show if this tab is directly selected or has selected inner blocks
102
- if ( isSelected || hasInnerBlocksSelected ) {
103
- return true;
104
- }
105
- // Always show the active tab (at effectiveActiveIndex) regardless of other selection state.
106
- // This ensures the tab panel remains visible when editing labels in tab-list.
107
- if ( isActiveTab ) {
108
- return true;
109
- }
110
- return false;
111
- }, [ isSelected, hasInnerBlocksSelected, isActiveTab ] );
105
+ // Visible when selected, containing the selection, or the active tab.
106
+ const isSelectedTab = isSelected || hasInnerBlocksSelected || isActiveTab;
112
107
 
113
108
  const blockProps = useBlockProps( {
114
109
  hidden: ! isSelectedTab,
@@ -1,8 +1,6 @@
1
1
  # Tab Panels
2
2
 
3
3
  <!-- START TOKEN(Autogenerated block API docs) -->
4
- <div class="callout callout-warning">This block is <strong>experimental</strong> and may change or be removed without notice.</div>
5
-
6
4
  Container for tab panel content in a tabbed interface.
7
5
 
8
6
  - **Name:** `core/tab-panels`
@@ -47,7 +45,11 @@ This is a [**static block**](https://developer.wordpress.org/block-editor/gettin
47
45
 
48
46
  ```html
49
47
  <!-- wp:tab-panels -->
50
- <!-- Content... -->
48
+ <div class="wp-block-tab-panels"><!-- wp:tab-panel {"label":"Tab 1"} -->
49
+ <section role="tabpanel" tabindex="0" class="wp-block-tab-panel"><!-- wp:paragraph -->
50
+ <p>Panel 1</p>
51
+ <!-- /wp:paragraph --></section>
52
+ <!-- /wp:tab-panel --></div>
51
53
  <!-- /wp:tab-panels -->
52
54
  ```
53
55
 
@@ -1,6 +1,5 @@
1
1
  {
2
2
  "$schema": "https://schemas.wp.org/trunk/block.json",
3
- "__experimental": true,
4
3
  "apiVersion": 3,
5
4
  "name": "core/tab-panels",
6
5
  "title": "Tab Panels",