@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
@@ -5,42 +5,35 @@ import {
5
5
  BlockContextProvider,
6
6
  store as blockEditorStore
7
7
  } from "@wordpress/block-editor";
8
- import { useSelect, useDispatch } from "@wordpress/data";
9
- import { useMemo, useEffect, useRef } from "@wordpress/element";
8
+ import { useSelect } from "@wordpress/data";
9
+ import { useMemo, useEffect } from "@wordpress/element";
10
10
  import { __ } from "@wordpress/i18n";
11
11
  import Controls from "./controls.mjs";
12
+ import useTabListSync from "./use-tab-list-sync.mjs";
12
13
  import { jsx, jsxs } from "react/jsx-runtime";
13
14
  var EMPTY_ARRAY = [];
14
15
  var TABS_TEMPLATE = [
15
16
  [
16
- "core/tabs-menu",
17
- {
18
- lock: {
19
- remove: true
20
- }
21
- },
17
+ "core/tab-list",
18
+ {},
22
19
  [
23
- ["core/tabs-menu-item", {}],
24
- ["core/tabs-menu-item", {}]
20
+ ["core/tab", {}],
21
+ ["core/tab", {}]
25
22
  ]
26
23
  ],
27
24
  [
28
- "core/tab-panel",
29
- {
30
- lock: {
31
- remove: true
32
- }
33
- },
25
+ "core/tab-panels",
26
+ {},
34
27
  [
35
28
  [
36
- "core/tab",
29
+ "core/tab-panel",
37
30
  {
38
31
  label: __("Tab")
39
32
  },
40
33
  [["core/paragraph"]]
41
34
  ],
42
35
  [
43
- "core/tab",
36
+ "core/tab-panel",
44
37
  {
45
38
  label: __("Tab")
46
39
  },
@@ -49,102 +42,40 @@ var TABS_TEMPLATE = [
49
42
  ]
50
43
  ]
51
44
  ];
52
- function Edit({
53
- clientId,
54
- attributes,
55
- setAttributes,
56
- __unstableLayoutClassNames: layoutClassNames
57
- }) {
45
+ function Edit({ clientId, attributes, setAttributes }) {
58
46
  const { anchor, activeTabIndex, editorActiveTabIndex } = attributes;
59
47
  useEffect(() => {
60
48
  if (editorActiveTabIndex === void 0) {
61
49
  setAttributes({ editorActiveTabIndex: activeTabIndex });
62
50
  }
63
51
  }, []);
64
- const { removeBlock, replaceInnerBlocks } = useDispatch(blockEditorStore);
65
- const { tabs, tabPanelClientId, menuItems } = useSelect(
52
+ const { tabPanels, tabPanelsClientId, tabs, tabListClientId } = useSelect(
66
53
  (select) => {
67
54
  const { getBlocks } = select(blockEditorStore);
68
55
  const innerBlocks = getBlocks(clientId);
69
- const tabPanel = innerBlocks.find(
70
- (block) => block.name === "core/tab-panel"
56
+ const tabPanelBlocks = innerBlocks.find(
57
+ (block) => block.name === "core/tab-panels"
71
58
  );
72
- const tabsMenu = innerBlocks.find(
73
- (block) => block.name === "core/tabs-menu"
59
+ const tabList = innerBlocks.find(
60
+ (block) => block.name === "core/tab-list"
74
61
  );
75
62
  return {
76
- tabs: tabPanel?.innerBlocks ?? EMPTY_ARRAY,
77
- tabPanelClientId: tabPanel?.clientId ?? null,
78
- menuItems: tabsMenu?.innerBlocks ?? EMPTY_ARRAY
63
+ tabPanels: tabPanelBlocks?.innerBlocks ?? EMPTY_ARRAY,
64
+ tabPanelsClientId: tabPanelBlocks?.clientId ?? null,
65
+ tabs: tabList?.innerBlocks ?? EMPTY_ARRAY,
66
+ tabListClientId: tabList?.clientId ?? null
79
67
  };
80
68
  },
81
69
  [clientId]
82
70
  );
83
- const prevSyncStateRef = useRef(null);
84
- useEffect(() => {
85
- const currentTabs = tabs.map((tab) => ({
86
- clientId: tab.clientId
87
- }));
88
- if (prevSyncStateRef.current === null) {
89
- prevSyncStateRef.current = {
90
- tabs: currentTabs,
91
- menuItems: [...menuItems]
92
- };
93
- return;
94
- }
95
- const { tabs: prevTabs, menuItems: prevMenuItems } = prevSyncStateRef.current;
96
- const tabsRemoved = currentTabs.length < prevTabs.length;
97
- const menuItemsRemoved = menuItems.length < prevMenuItems.length;
98
- const menuItemsReordered = !tabsRemoved && !menuItemsRemoved && menuItems.length === prevMenuItems.length && menuItems.some(
99
- (m, i) => m.clientId !== prevMenuItems[i]?.clientId
100
- );
101
- prevSyncStateRef.current = {
102
- tabs: currentTabs,
103
- menuItems: [...menuItems]
104
- };
105
- if (menuItemsReordered && tabPanelClientId) {
106
- const reorderedTabs = menuItems.map((menuItem) => {
107
- const oldIndex = prevMenuItems.findIndex(
108
- (pm) => pm.clientId === menuItem.clientId
109
- );
110
- return oldIndex !== -1 ? tabs[oldIndex] : null;
111
- }).filter(Boolean);
112
- if (reorderedTabs.length === tabs.length) {
113
- replaceInnerBlocks(tabPanelClientId, reorderedTabs, false);
114
- }
115
- return;
116
- }
117
- if (!tabsRemoved && !menuItemsRemoved || tabsRemoved && menuItemsRemoved) {
118
- return;
119
- }
120
- const currentTabIds = new Set(currentTabs.map((t) => t.clientId));
121
- const currentMenuItemIds = new Set(
122
- menuItems.map((m) => m.clientId)
123
- );
124
- if (tabsRemoved) {
125
- const removedIndex = prevTabs.findIndex(
126
- (t) => !currentTabIds.has(t.clientId)
127
- );
128
- if (removedIndex >= 0 && menuItems[removedIndex]) {
129
- removeBlock(menuItems[removedIndex].clientId, false);
130
- prevSyncStateRef.current.menuItems = prevSyncStateRef.current.menuItems.filter(
131
- (_, i) => i !== removedIndex
132
- );
133
- }
134
- } else {
135
- const removedIndex = prevMenuItems.findIndex(
136
- (m) => !currentMenuItemIds.has(m.clientId)
137
- );
138
- if (removedIndex >= 0 && tabs[removedIndex]) {
139
- removeBlock(tabs[removedIndex].clientId, false);
140
- prevSyncStateRef.current.tabs = prevSyncStateRef.current.tabs.filter(
141
- (_, i) => i !== removedIndex
142
- );
143
- }
144
- }
145
- }, [tabs, tabPanelClientId, menuItems, removeBlock, replaceInnerBlocks]);
71
+ useTabListSync({
72
+ tabPanels,
73
+ tabs,
74
+ tabPanelsClientId,
75
+ tabListClientId
76
+ });
146
77
  const contextValue = useMemo(() => {
147
- const tabList = tabs.map((tab, index) => ({
78
+ const tabList = tabPanels.map((tab, index) => ({
148
79
  id: tab.attributes.anchor || `tab-${index}`,
149
80
  label: tab.attributes.label || "",
150
81
  clientId: tab.clientId,
@@ -156,14 +87,12 @@ function Edit({
156
87
  "core/tabs-activeTabIndex": activeTabIndex,
157
88
  "core/tabs-editorActiveTabIndex": editorActiveTabIndex
158
89
  };
159
- }, [tabs, anchor, activeTabIndex, editorActiveTabIndex]);
160
- const blockProps = useBlockProps({
161
- className: layoutClassNames
162
- });
90
+ }, [tabPanels, anchor, activeTabIndex, editorActiveTabIndex]);
91
+ const blockProps = useBlockProps();
163
92
  const innerBlockProps = useInnerBlocksProps(blockProps, {
164
93
  __experimentalCaptureToolbars: true,
165
94
  template: TABS_TEMPLATE,
166
- templateLock: false,
95
+ templateLock: "all",
167
96
  renderAppender: false
168
97
  });
169
98
  return /* @__PURE__ */ jsx(BlockContextProvider, { value: contextValue, children: /* @__PURE__ */ jsxs("div", { ...innerBlockProps, children: [
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/tabs/edit.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\tuseBlockProps,\n\tuseInnerBlocksProps,\n\tBlockContextProvider,\n\tstore as blockEditorStore,\n} from '@wordpress/block-editor';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { useMemo, useEffect, useRef } from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport Controls from './controls';\n\nconst EMPTY_ARRAY = [];\n\nconst TABS_TEMPLATE = [\n\t[\n\t\t'core/tabs-menu',\n\t\t{\n\t\t\tlock: {\n\t\t\t\tremove: true,\n\t\t\t},\n\t\t},\n\t\t[\n\t\t\t[ 'core/tabs-menu-item', {} ],\n\t\t\t[ 'core/tabs-menu-item', {} ],\n\t\t],\n\t],\n\t[\n\t\t'core/tab-panel',\n\t\t{\n\t\t\tlock: {\n\t\t\t\tremove: true,\n\t\t\t},\n\t\t},\n\t\t[\n\t\t\t[\n\t\t\t\t'core/tab',\n\t\t\t\t{\n\t\t\t\t\tlabel: __( 'Tab' ),\n\t\t\t\t},\n\t\t\t\t[ [ 'core/paragraph' ] ],\n\t\t\t],\n\t\t\t[\n\t\t\t\t'core/tab',\n\t\t\t\t{\n\t\t\t\t\tlabel: __( 'Tab' ),\n\t\t\t\t},\n\t\t\t\t[ [ 'core/paragraph' ] ],\n\t\t\t],\n\t\t],\n\t],\n];\n\nfunction Edit( {\n\tclientId,\n\tattributes,\n\tsetAttributes,\n\t__unstableLayoutClassNames: layoutClassNames,\n} ) {\n\tconst { anchor, activeTabIndex, editorActiveTabIndex } = attributes;\n\n\t/**\n\t * Initialize editorActiveTabIndex to activeTabIndex on mount.\n\t * This ensures the ephemeral editor state starts at the persisted default.\n\t */\n\tuseEffect( () => {\n\t\tif ( editorActiveTabIndex === undefined ) {\n\t\t\tsetAttributes( { editorActiveTabIndex: activeTabIndex } );\n\t\t}\n\t}, [] ); // eslint-disable-line react-hooks/exhaustive-deps\n\n\tconst { removeBlock, replaceInnerBlocks } = useDispatch( blockEditorStore );\n\n\tconst { tabs, tabPanelClientId, menuItems } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getBlocks } = select( blockEditorStore );\n\t\t\tconst innerBlocks = getBlocks( clientId );\n\n\t\t\tconst tabPanel = innerBlocks.find(\n\t\t\t\t( block ) => block.name === 'core/tab-panel'\n\t\t\t);\n\t\t\tconst tabsMenu = innerBlocks.find(\n\t\t\t\t( block ) => block.name === 'core/tabs-menu'\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\ttabs: tabPanel?.innerBlocks ?? EMPTY_ARRAY,\n\t\t\t\ttabPanelClientId: tabPanel?.clientId ?? null,\n\t\t\t\tmenuItems: tabsMenu?.innerBlocks ?? EMPTY_ARRAY,\n\t\t\t};\n\t\t},\n\t\t[ clientId ]\n\t);\n\n\t/**\n\t * Keep tabs and menu items in sync when either is deleted directly (e.g.\n\t * via the Backspace key or List View).\n\t *\n\t * TODO: This effect only handles deletions. The two lists can get out of\n\t * sync in other cases: if a user pastes a core/tab block into the tab-panel\n\t * (or duplicates one), no corresponding tabs-menu-item is created; if a\n\t * user drags and drops a tabs-menu-item, the tab panel is not copied with\n\t * it. We should extend this effect to handle insertions, detecting when\n\t * tabs.length > menuItems.length and inserting the missing menu\n\t * item(s) at the correct index.\n\t */\n\tconst prevSyncStateRef = useRef( null );\n\tuseEffect( () => {\n\t\tconst currentTabs = tabs.map( ( tab ) => ( {\n\t\t\tclientId: tab.clientId,\n\t\t} ) );\n\n\t\tif ( prevSyncStateRef.current === null ) {\n\t\t\tprevSyncStateRef.current = {\n\t\t\t\ttabs: currentTabs,\n\t\t\t\tmenuItems: [ ...menuItems ],\n\t\t\t};\n\t\t\treturn;\n\t\t}\n\n\t\tconst { tabs: prevTabs, menuItems: prevMenuItems } =\n\t\t\tprevSyncStateRef.current;\n\n\t\tconst tabsRemoved = currentTabs.length < prevTabs.length;\n\t\tconst menuItemsRemoved = menuItems.length < prevMenuItems.length;\n\t\tconst menuItemsReordered =\n\t\t\t! tabsRemoved &&\n\t\t\t! menuItemsRemoved &&\n\t\t\tmenuItems.length === prevMenuItems.length &&\n\t\t\tmenuItems.some(\n\t\t\t\t( m, i ) => m.clientId !== prevMenuItems[ i ]?.clientId\n\t\t\t);\n\n\t\t// Update snapshot to the current state.\n\t\t// Snapshot is updated eagerly; post-removal mutations keep it consistent\n\t\t// so the next effect invocation sees a stable baseline.\n\t\tprevSyncStateRef.current = {\n\t\t\ttabs: currentTabs,\n\t\t\tmenuItems: [ ...menuItems ],\n\t\t};\n\n\t\t// When menu items are reordered, move the corresponding tab content\n\t\t// blocks to match the new order.\n\t\tif ( menuItemsReordered && tabPanelClientId ) {\n\t\t\tconst reorderedTabs = menuItems\n\t\t\t\t.map( ( menuItem ) => {\n\t\t\t\t\tconst oldIndex = prevMenuItems.findIndex(\n\t\t\t\t\t\t( pm ) => pm.clientId === menuItem.clientId\n\t\t\t\t\t);\n\t\t\t\t\treturn oldIndex !== -1 ? tabs[ oldIndex ] : null;\n\t\t\t\t} )\n\t\t\t\t.filter( Boolean );\n\t\t\tif ( reorderedTabs.length === tabs.length ) {\n\t\t\t\treplaceInnerBlocks( tabPanelClientId, reorderedTabs, false );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Lists are in sync, nothing changed, or toolbar already removed both.\n\t\tif (\n\t\t\t( ! tabsRemoved && ! menuItemsRemoved ) ||\n\t\t\t( tabsRemoved && menuItemsRemoved )\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentTabIds = new Set( currentTabs.map( ( t ) => t.clientId ) );\n\t\tconst currentMenuItemIds = new Set(\n\t\t\tmenuItems.map( ( m ) => m.clientId )\n\t\t);\n\n\t\tif ( tabsRemoved ) {\n\t\t\t// Remove the menu item at the same position.\n\t\t\tconst removedIndex = prevTabs.findIndex(\n\t\t\t\t( t ) => ! currentTabIds.has( t.clientId )\n\t\t\t);\n\t\t\tif ( removedIndex >= 0 && menuItems[ removedIndex ] ) {\n\t\t\t\tremoveBlock( menuItems[ removedIndex ].clientId, false );\n\t\t\t\tprevSyncStateRef.current.menuItems =\n\t\t\t\t\tprevSyncStateRef.current.menuItems.filter(\n\t\t\t\t\t\t( _, i ) => i !== removedIndex\n\t\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\t// Remove the tab at the same position.\n\t\t\tconst removedIndex = prevMenuItems.findIndex(\n\t\t\t\t( m ) => ! currentMenuItemIds.has( m.clientId )\n\t\t\t);\n\t\t\tif ( removedIndex >= 0 && tabs[ removedIndex ] ) {\n\t\t\t\tremoveBlock( tabs[ removedIndex ].clientId, false );\n\t\t\t\tprevSyncStateRef.current.tabs =\n\t\t\t\t\tprevSyncStateRef.current.tabs.filter(\n\t\t\t\t\t\t( _, i ) => i !== removedIndex\n\t\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}, [ tabs, tabPanelClientId, menuItems, removeBlock, replaceInnerBlocks ] );\n\n\t/**\n\t * Memoize context value to prevent unnecessary re-renders.\n\t */\n\tconst contextValue = useMemo( () => {\n\t\t/**\n\t\t * Compute tabs list from innerblocks to provide via context.\n\t\t * This traverses the tab-panel block to find all tab blocks\n\t\t * and extracts their label and anchor for the tabs-menu to consume.\n\t\t */\n\t\tconst tabList = tabs.map( ( tab, index ) => ( {\n\t\t\tid: tab.attributes.anchor || `tab-${ index }`,\n\t\t\tlabel: tab.attributes.label || '',\n\t\t\tclientId: tab.clientId,\n\t\t\tindex,\n\t\t} ) );\n\n\t\treturn {\n\t\t\t'core/tabs-list': tabList,\n\t\t\t'core/tabs-id': anchor,\n\t\t\t'core/tabs-activeTabIndex': activeTabIndex,\n\t\t\t'core/tabs-editorActiveTabIndex': editorActiveTabIndex,\n\t\t};\n\t}, [ tabs, anchor, activeTabIndex, editorActiveTabIndex ] );\n\n\t/**\n\t * Block props for the tabs container.\n\t */\n\tconst blockProps = useBlockProps( {\n\t\tclassName: layoutClassNames,\n\t} );\n\n\t/**\n\t * Innerblocks props for the tabs container.\n\t */\n\tconst innerBlockProps = useInnerBlocksProps( blockProps, {\n\t\t__experimentalCaptureToolbars: true,\n\t\ttemplate: TABS_TEMPLATE,\n\t\ttemplateLock: false,\n\t\trenderAppender: false,\n\t} );\n\n\treturn (\n\t\t<BlockContextProvider value={ contextValue }>\n\t\t\t<div { ...innerBlockProps }>\n\t\t\t\t<Controls\n\t\t\t\t\tclientId={ clientId }\n\t\t\t\t\tattributes={ attributes }\n\t\t\t\t\tsetAttributes={ setAttributes }\n\t\t\t\t/>\n\t\t\t\t{ innerBlockProps.children }\n\t\t\t</div>\n\t\t</BlockContextProvider>\n\t);\n}\n\nexport default Edit;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\tuseBlockProps,\n\tuseInnerBlocksProps,\n\tBlockContextProvider,\n\tstore as blockEditorStore,\n} from '@wordpress/block-editor';\nimport { useSelect } from '@wordpress/data';\nimport { useMemo, useEffect } from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport Controls from './controls';\nimport useTabListSync from './use-tab-list-sync';\n\nconst EMPTY_ARRAY = [];\n\nconst TABS_TEMPLATE = [\n\t[\n\t\t'core/tab-list',\n\t\t{},\n\t\t[\n\t\t\t[ 'core/tab', {} ],\n\t\t\t[ 'core/tab', {} ],\n\t\t],\n\t],\n\t[\n\t\t'core/tab-panels',\n\t\t{},\n\t\t[\n\t\t\t[\n\t\t\t\t'core/tab-panel',\n\t\t\t\t{\n\t\t\t\t\tlabel: __( 'Tab' ),\n\t\t\t\t},\n\t\t\t\t[ [ 'core/paragraph' ] ],\n\t\t\t],\n\t\t\t[\n\t\t\t\t'core/tab-panel',\n\t\t\t\t{\n\t\t\t\t\tlabel: __( 'Tab' ),\n\t\t\t\t},\n\t\t\t\t[ [ 'core/paragraph' ] ],\n\t\t\t],\n\t\t],\n\t],\n];\n\nfunction Edit( { clientId, attributes, setAttributes } ) {\n\tconst { anchor, activeTabIndex, editorActiveTabIndex } = attributes;\n\n\t/**\n\t * Initialize editorActiveTabIndex to activeTabIndex on mount.\n\t * This ensures the ephemeral editor state starts at the persisted default.\n\t */\n\tuseEffect( () => {\n\t\tif ( editorActiveTabIndex === undefined ) {\n\t\t\tsetAttributes( { editorActiveTabIndex: activeTabIndex } );\n\t\t}\n\t}, [] ); // eslint-disable-line react-hooks/exhaustive-deps\n\n\tconst { tabPanels, tabPanelsClientId, tabs, tabListClientId } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getBlocks } = select( blockEditorStore );\n\t\t\tconst innerBlocks = getBlocks( clientId );\n\n\t\t\tconst tabPanelBlocks = innerBlocks.find(\n\t\t\t\t( block ) => block.name === 'core/tab-panels'\n\t\t\t);\n\t\t\tconst tabList = innerBlocks.find(\n\t\t\t\t( block ) => block.name === 'core/tab-list'\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\ttabPanels: tabPanelBlocks?.innerBlocks ?? EMPTY_ARRAY,\n\t\t\t\ttabPanelsClientId: tabPanelBlocks?.clientId ?? null,\n\t\t\t\ttabs: tabList?.innerBlocks ?? EMPTY_ARRAY,\n\t\t\t\ttabListClientId: tabList?.clientId ?? null,\n\t\t\t};\n\t\t},\n\t\t[ clientId ]\n\t);\n\n\tuseTabListSync( {\n\t\ttabPanels,\n\t\ttabs,\n\t\ttabPanelsClientId,\n\t\ttabListClientId,\n\t} );\n\n\t/**\n\t * Memoize context value to prevent unnecessary re-renders.\n\t */\n\tconst contextValue = useMemo( () => {\n\t\t/**\n\t\t * Compute tabs list from innerblocks to provide via context.\n\t\t * This traverses the tab-panel block to find all tab blocks\n\t\t * and extracts their label and anchor for the tab-list to consume.\n\t\t */\n\t\tconst tabList = tabPanels.map( ( tab, index ) => ( {\n\t\t\tid: tab.attributes.anchor || `tab-${ index }`,\n\t\t\tlabel: tab.attributes.label || '',\n\t\t\tclientId: tab.clientId,\n\t\t\tindex,\n\t\t} ) );\n\n\t\treturn {\n\t\t\t'core/tabs-list': tabList,\n\t\t\t'core/tabs-id': anchor,\n\t\t\t'core/tabs-activeTabIndex': activeTabIndex,\n\t\t\t'core/tabs-editorActiveTabIndex': editorActiveTabIndex,\n\t\t};\n\t}, [ tabPanels, anchor, activeTabIndex, editorActiveTabIndex ] );\n\n\tconst blockProps = useBlockProps();\n\n\tconst innerBlockProps = useInnerBlocksProps( blockProps, {\n\t\t__experimentalCaptureToolbars: true,\n\t\ttemplate: TABS_TEMPLATE,\n\t\ttemplateLock: 'all',\n\t\trenderAppender: false,\n\t} );\n\n\treturn (\n\t\t<BlockContextProvider value={ contextValue }>\n\t\t\t<div { ...innerBlockProps }>\n\t\t\t\t<Controls\n\t\t\t\t\tclientId={ clientId }\n\t\t\t\t\tattributes={ attributes }\n\t\t\t\t\tsetAttributes={ setAttributes }\n\t\t\t\t/>\n\t\t\t\t{ innerBlockProps.children }\n\t\t\t</div>\n\t\t</BlockContextProvider>\n\t);\n}\n\nexport default Edit;\n"],
5
+ "mappings": ";AAGA;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,OACH;AACP,SAAS,iBAAiB;AAC1B,SAAS,SAAS,iBAAiB;AACnC,SAAS,UAAU;AAKnB,OAAO,cAAc;AACrB,OAAO,oBAAoB;AAgHxB,SACC,KADD;AA9GH,IAAM,cAAc,CAAC;AAErB,IAAM,gBAAgB;AAAA,EACrB;AAAA,IACC;AAAA,IACA,CAAC;AAAA,IACD;AAAA,MACC,CAAE,YAAY,CAAC,CAAE;AAAA,MACjB,CAAE,YAAY,CAAC,CAAE;AAAA,IAClB;AAAA,EACD;AAAA,EACA;AAAA,IACC;AAAA,IACA,CAAC;AAAA,IACD;AAAA,MACC;AAAA,QACC;AAAA,QACA;AAAA,UACC,OAAO,GAAI,KAAM;AAAA,QAClB;AAAA,QACA,CAAE,CAAE,gBAAiB,CAAE;AAAA,MACxB;AAAA,MACA;AAAA,QACC;AAAA,QACA;AAAA,UACC,OAAO,GAAI,KAAM;AAAA,QAClB;AAAA,QACA,CAAE,CAAE,gBAAiB,CAAE;AAAA,MACxB;AAAA,IACD;AAAA,EACD;AACD;AAEA,SAAS,KAAM,EAAE,UAAU,YAAY,cAAc,GAAI;AACxD,QAAM,EAAE,QAAQ,gBAAgB,qBAAqB,IAAI;AAMzD,YAAW,MAAM;AAChB,QAAK,yBAAyB,QAAY;AACzC,oBAAe,EAAE,sBAAsB,eAAe,CAAE;AAAA,IACzD;AAAA,EACD,GAAG,CAAC,CAAE;AAEN,QAAM,EAAE,WAAW,mBAAmB,MAAM,gBAAgB,IAAI;AAAA,IAC/D,CAAE,WAAY;AACb,YAAM,EAAE,UAAU,IAAI,OAAQ,gBAAiB;AAC/C,YAAM,cAAc,UAAW,QAAS;AAExC,YAAM,iBAAiB,YAAY;AAAA,QAClC,CAAE,UAAW,MAAM,SAAS;AAAA,MAC7B;AACA,YAAM,UAAU,YAAY;AAAA,QAC3B,CAAE,UAAW,MAAM,SAAS;AAAA,MAC7B;AAEA,aAAO;AAAA,QACN,WAAW,gBAAgB,eAAe;AAAA,QAC1C,mBAAmB,gBAAgB,YAAY;AAAA,QAC/C,MAAM,SAAS,eAAe;AAAA,QAC9B,iBAAiB,SAAS,YAAY;AAAA,MACvC;AAAA,IACD;AAAA,IACA,CAAE,QAAS;AAAA,EACZ;AAEA,iBAAgB;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAE;AAKF,QAAM,eAAe,QAAS,MAAM;AAMnC,UAAM,UAAU,UAAU,IAAK,CAAE,KAAK,WAAa;AAAA,MAClD,IAAI,IAAI,WAAW,UAAU,OAAQ,KAAM;AAAA,MAC3C,OAAO,IAAI,WAAW,SAAS;AAAA,MAC/B,UAAU,IAAI;AAAA,MACd;AAAA,IACD,EAAI;AAEJ,WAAO;AAAA,MACN,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,MAChB,4BAA4B;AAAA,MAC5B,kCAAkC;AAAA,IACnC;AAAA,EACD,GAAG,CAAE,WAAW,QAAQ,gBAAgB,oBAAqB,CAAE;AAE/D,QAAM,aAAa,cAAc;AAEjC,QAAM,kBAAkB,oBAAqB,YAAY;AAAA,IACxD,+BAA+B;AAAA,IAC/B,UAAU;AAAA,IACV,cAAc;AAAA,IACd,gBAAgB;AAAA,EACjB,CAAE;AAEF,SACC,oBAAC,wBAAqB,OAAQ,cAC7B,+BAAC,SAAM,GAAG,iBACT;AAAA;AAAA,MAAC;AAAA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACD;AAAA,IACE,gBAAgB;AAAA,KACnB,GACD;AAEF;AAEA,IAAO,eAAQ;",
6
6
  "names": []
7
7
  }
@@ -11,22 +11,22 @@ var settings = {
11
11
  example: {
12
12
  innerBlocks: [
13
13
  {
14
- name: "core/tabs-menu",
14
+ name: "core/tab-list",
15
15
  innerBlocks: [
16
16
  {
17
- name: "core/tabs-menu-item",
17
+ name: "core/tab",
18
18
  attributes: { anchor: "tab-1-button" }
19
19
  },
20
20
  {
21
- name: "core/tabs-menu-item",
21
+ name: "core/tab",
22
22
  attributes: { anchor: "tab-2-button" }
23
23
  }
24
24
  ]
25
25
  },
26
26
  {
27
- name: "core/tab-panel",
27
+ name: "core/tab-panels",
28
28
  innerBlocks: [1, 2].map((index) => ({
29
- name: "core/tab",
29
+ name: "core/tab-panel",
30
30
  attributes: {
31
31
  anchor: `tab-${index}`,
32
32
  label: sprintf(
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/tabs/index.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { __, sprintf } from '@wordpress/i18n';\nimport { tabs as icon } from '@wordpress/icons';\n\n/**\n * Internal dependencies\n */\nimport initBlock from '../utils/init-block';\nimport edit from './edit';\nimport save from './save';\nimport metadata from './block.json';\n\nconst { name } = metadata;\n\nexport { metadata, name };\n\nexport const settings = {\n\ticon,\n\texample: {\n\t\tinnerBlocks: [\n\t\t\t{\n\t\t\t\tname: 'core/tabs-menu',\n\t\t\t\tinnerBlocks: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'core/tabs-menu-item',\n\t\t\t\t\t\tattributes: { anchor: 'tab-1-button' },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'core/tabs-menu-item',\n\t\t\t\t\t\tattributes: { anchor: 'tab-2-button' },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'core/tab-panel',\n\t\t\t\tinnerBlocks: [ 1, 2 ].map( ( index ) => ( {\n\t\t\t\t\tname: 'core/tab',\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\tanchor: `tab-${ index }`,\n\t\t\t\t\t\tlabel: sprintf(\n\t\t\t\t\t\t\t/** translators: %s: tab index number */\n\t\t\t\t\t\t\t__( 'Tab %s' ),\n\t\t\t\t\t\t\tindex\n\t\t\t\t\t\t),\n\t\t\t\t\t},\n\t\t\t\t\tinnerBlocks: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: 'core/paragraph',\n\t\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\t\tcontent: __(\n\t\t\t\t\t\t\t\t\t'In a village of La Mancha, the name of which I have no desire to call to mind, there lived not long since one of those gentlemen that keep a lance in the lance-rack, an old buckler, a lean hack, and a greyhound for coursing.'\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t} ) ),\n\t\t\t},\n\t\t],\n\t},\n\tedit,\n\tsave,\n};\n\nexport const init = () => initBlock( { name, metadata, settings } );\n"],
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { __, sprintf } from '@wordpress/i18n';\nimport { tabs as icon } from '@wordpress/icons';\n\n/**\n * Internal dependencies\n */\nimport initBlock from '../utils/init-block';\nimport edit from './edit';\nimport save from './save';\nimport metadata from './block.json';\n\nconst { name } = metadata;\n\nexport { metadata, name };\n\nexport const settings = {\n\ticon,\n\texample: {\n\t\tinnerBlocks: [\n\t\t\t{\n\t\t\t\tname: 'core/tab-list',\n\t\t\t\tinnerBlocks: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'core/tab',\n\t\t\t\t\t\tattributes: { anchor: 'tab-1-button' },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'core/tab',\n\t\t\t\t\t\tattributes: { anchor: 'tab-2-button' },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'core/tab-panels',\n\t\t\t\tinnerBlocks: [ 1, 2 ].map( ( index ) => ( {\n\t\t\t\t\tname: 'core/tab-panel',\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\tanchor: `tab-${ index }`,\n\t\t\t\t\t\tlabel: sprintf(\n\t\t\t\t\t\t\t/** translators: %s: tab index number */\n\t\t\t\t\t\t\t__( 'Tab %s' ),\n\t\t\t\t\t\t\tindex\n\t\t\t\t\t\t),\n\t\t\t\t\t},\n\t\t\t\t\tinnerBlocks: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: 'core/paragraph',\n\t\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\t\tcontent: __(\n\t\t\t\t\t\t\t\t\t'In a village of La Mancha, the name of which I have no desire to call to mind, there lived not long since one of those gentlemen that keep a lance in the lance-rack, an old buckler, a lean hack, and a greyhound for coursing.'\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t} ) ),\n\t\t\t},\n\t\t],\n\t},\n\tedit,\n\tsave,\n};\n\nexport const init = () => initBlock( { name, metadata, settings } );\n"],
5
5
  "mappings": ";AAGA,SAAS,IAAI,eAAe;AAC5B,SAAS,QAAQ,YAAY;AAK7B,OAAO,eAAe;AACtB,OAAO,UAAU;AACjB,OAAO,UAAU;AACjB,OAAO,cAAc;AAErB,IAAM,EAAE,KAAK,IAAI;AAIV,IAAM,WAAW;AAAA,EACvB;AAAA,EACA,SAAS;AAAA,IACR,aAAa;AAAA,MACZ;AAAA,QACC,MAAM;AAAA,QACN,aAAa;AAAA,UACZ;AAAA,YACC,MAAM;AAAA,YACN,YAAY,EAAE,QAAQ,eAAe;AAAA,UACtC;AAAA,UACA;AAAA,YACC,MAAM;AAAA,YACN,YAAY,EAAE,QAAQ,eAAe;AAAA,UACtC;AAAA,QACD;AAAA,MACD;AAAA,MACA;AAAA,QACC,MAAM;AAAA,QACN,aAAa,CAAE,GAAG,CAAE,EAAE,IAAK,CAAE,WAAa;AAAA,UACzC,MAAM;AAAA,UACN,YAAY;AAAA,YACX,QAAQ,OAAQ,KAAM;AAAA,YACtB,OAAO;AAAA;AAAA,cAEN,GAAI,QAAS;AAAA,cACb;AAAA,YACD;AAAA,UACD;AAAA,UACA,aAAa;AAAA,YACZ;AAAA,cACC,MAAM;AAAA,cACN,YAAY;AAAA,gBACX,SAAS;AAAA,kBACR;AAAA,gBACD;AAAA,cACD;AAAA,YACD;AAAA,UACD;AAAA,QACD,EAAI;AAAA,MACL;AAAA,IACD;AAAA,EACD;AAAA,EACA;AAAA,EACA;AACD;AAEO,IAAM,OAAO,MAAM,UAAW,EAAE,MAAM,UAAU,SAAS,CAAE;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,169 @@
1
+ // packages/block-library/src/tabs/use-tab-list-sync.js
2
+ import { createBlock } from "@wordpress/blocks";
3
+ import { store as blockEditorStore } from "@wordpress/block-editor";
4
+ import { useDispatch } from "@wordpress/data";
5
+ import { useEffect, useRef } from "@wordpress/element";
6
+ function useTabListSync({
7
+ tabPanels,
8
+ tabs,
9
+ tabPanelsClientId,
10
+ tabsListClientId
11
+ }) {
12
+ const {
13
+ removeBlock,
14
+ insertBlocks,
15
+ replaceInnerBlocks,
16
+ __unstableMarkNextChangeAsNotPersistent
17
+ } = useDispatch(blockEditorStore);
18
+ const prevSyncStateRef = useRef(null);
19
+ useEffect(() => {
20
+ if (prevSyncStateRef.current === null) {
21
+ prevSyncStateRef.current = {
22
+ tabPanels: [...tabPanels],
23
+ tabs: [...tabs]
24
+ };
25
+ return;
26
+ }
27
+ const { tabPanels: prevTabPanels, tabs: prevTabs } = prevSyncStateRef.current;
28
+ const tabPanelCountChange = tabPanels.length - prevTabPanels.length;
29
+ const tabCountChange = tabs.length - prevTabs.length;
30
+ const tabPanelsInserted = tabPanelCountChange > 0;
31
+ const tabsInserted = tabCountChange > 0;
32
+ if (tabPanelCountChange === tabCountChange) {
33
+ if (tabPanelCountChange === 0 && tabPanelsClientId && tabs.some((m, i) => m.clientId !== prevTabs[i]?.clientId)) {
34
+ const reorderedTabPanels = tabs.map((tab) => {
35
+ const oldIndex = prevTabs.findIndex(
36
+ (pm) => pm.clientId === tab.clientId
37
+ );
38
+ return oldIndex !== -1 ? tabPanels[oldIndex] : null;
39
+ }).filter(Boolean);
40
+ if (reorderedTabPanels.length === tabPanels.length) {
41
+ __unstableMarkNextChangeAsNotPersistent();
42
+ replaceInnerBlocks(
43
+ tabPanelsClientId,
44
+ reorderedTabPanels,
45
+ false
46
+ );
47
+ }
48
+ }
49
+ prevSyncStateRef.current = {
50
+ tabPanels: [...tabPanels],
51
+ tabs: [...tabs]
52
+ };
53
+ return;
54
+ }
55
+ if (tabPanelCountChange > 0 && tabCountChange > 0 || tabPanelCountChange < 0 && tabCountChange < 0) {
56
+ prevSyncStateRef.current = {
57
+ tabPanels: [...tabPanels],
58
+ tabs: [...tabs]
59
+ };
60
+ return;
61
+ }
62
+ if (tabPanelsInserted && !tabsListClientId) {
63
+ return;
64
+ }
65
+ if (tabsInserted && !tabPanelsClientId) {
66
+ return;
67
+ }
68
+ prevSyncStateRef.current = {
69
+ tabPanels: [...tabPanels],
70
+ tabs: [...tabs]
71
+ };
72
+ const currentTabPanelIds = new Set(
73
+ tabPanels.map((t) => t.clientId)
74
+ );
75
+ const currentTabIds = new Set(tabs.map((m) => m.clientId));
76
+ if (tabPanelCountChange < 0) {
77
+ const removedIndices = prevTabPanels.map(
78
+ (t, i) => !currentTabPanelIds.has(t.clientId) ? i : -1
79
+ ).filter((i) => i !== -1);
80
+ const removedSet = new Set(removedIndices);
81
+ removedIndices.forEach((removedIndex) => {
82
+ if (tabs[removedIndex]) {
83
+ __unstableMarkNextChangeAsNotPersistent();
84
+ removeBlock(tabs[removedIndex].clientId, false);
85
+ }
86
+ });
87
+ prevSyncStateRef.current.tabs = prevSyncStateRef.current.tabs.filter(
88
+ (_, i) => !removedSet.has(i)
89
+ );
90
+ } else if (tabCountChange < 0) {
91
+ const removedIndices = prevTabs.map(
92
+ (m, i) => !currentTabIds.has(m.clientId) ? i : -1
93
+ ).filter((i) => i !== -1);
94
+ const removedSet = new Set(removedIndices);
95
+ removedIndices.forEach((removedIndex) => {
96
+ if (tabPanels[removedIndex]) {
97
+ __unstableMarkNextChangeAsNotPersistent();
98
+ removeBlock(tabPanels[removedIndex].clientId, false);
99
+ }
100
+ });
101
+ prevSyncStateRef.current.tabPanels = prevSyncStateRef.current.tabPanels.filter(
102
+ (_, i) => !removedSet.has(i)
103
+ );
104
+ } else if (tabPanelsInserted) {
105
+ const prevTabPanelIds = new Set(
106
+ prevTabPanels.map((t) => t.clientId)
107
+ );
108
+ const newTabs = tabPanels.map(
109
+ (tabPanel, tabPanelIndex) => !prevTabPanelIds.has(tabPanel.clientId) ? {
110
+ tabPanelIndex,
111
+ block: createBlock("core/tab", {})
112
+ } : null
113
+ ).filter(Boolean);
114
+ if (newTabs.length > 0) {
115
+ __unstableMarkNextChangeAsNotPersistent();
116
+ insertBlocks(
117
+ newTabs.map(({ block }) => block),
118
+ newTabs[0].tabPanelIndex,
119
+ tabsListClientId,
120
+ false
121
+ );
122
+ newTabs.forEach(({ tabPanelIndex, block }) => {
123
+ prevSyncStateRef.current.tabs.splice(tabPanelIndex, 0, {
124
+ clientId: block.clientId
125
+ });
126
+ });
127
+ }
128
+ } else if (tabsInserted) {
129
+ const prevTabIds = new Set(prevTabs.map((m) => m.clientId));
130
+ const newTabPanels = tabs.map((tab, tabIndex) => {
131
+ if (prevTabIds.has(tab.clientId)) {
132
+ return null;
133
+ }
134
+ const label = tabPanels[tabIndex - 1]?.attributes?.label ?? tabPanels[tabIndex]?.attributes?.label ?? "";
135
+ return {
136
+ tabIndex,
137
+ block: createBlock("core/tab-panel", { label })
138
+ };
139
+ }).filter(Boolean);
140
+ if (newTabPanels.length > 0) {
141
+ __unstableMarkNextChangeAsNotPersistent();
142
+ insertBlocks(
143
+ newTabPanels.map(({ block }) => block),
144
+ newTabPanels[0].tabIndex,
145
+ tabPanelsClientId,
146
+ false
147
+ );
148
+ newTabPanels.forEach(({ tabIndex, block }) => {
149
+ prevSyncStateRef.current.tabPanels.splice(tabIndex, 0, {
150
+ clientId: block.clientId
151
+ });
152
+ });
153
+ }
154
+ }
155
+ }, [
156
+ tabPanels,
157
+ tabs,
158
+ removeBlock,
159
+ insertBlocks,
160
+ replaceInnerBlocks,
161
+ __unstableMarkNextChangeAsNotPersistent,
162
+ tabsListClientId,
163
+ tabPanelsClientId
164
+ ]);
165
+ }
166
+ export {
167
+ useTabListSync as default
168
+ };
169
+ //# sourceMappingURL=use-tab-list-sync.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/tabs/use-tab-list-sync.js"],
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { createBlock } from '@wordpress/blocks';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport { useDispatch } from '@wordpress/data';\nimport { useEffect, useRef } from '@wordpress/element';\n\n/**\n * Keep tabs and tab panels in sync when the lists change due to direct\n * user actions (deletion, paste, duplicate, drag-and-drop).\n *\n * Deletion: when one side shrinks, remove the counterpart at the same index.\n * Insertion: when one side grows without the other, insert the missing\n * counterpart at the matching index.\n *\n * When both lists change simultaneously (e.g. the \"Add Tab\" toolbar button,\n * which inserts both at once), no action is needed and the effect exits early.\n *\n * @param {Object} props\n * @param {Array} props.tabs Raw core/tab block objects.\n * @param {Array} props.tabPanels Raw core/tab-panel block objects.\n * @param {string|null} props.tabPanelsClientId Client ID of the core/tab-panels block.\n * @param {string|null} props.tabsListClientId Client ID of the core/tab-list block.\n */\nexport default function useTabListSync( {\n\ttabPanels,\n\ttabs,\n\ttabPanelsClientId,\n\ttabsListClientId,\n} ) {\n\tconst {\n\t\tremoveBlock,\n\t\tinsertBlocks,\n\t\treplaceInnerBlocks,\n\t\t__unstableMarkNextChangeAsNotPersistent,\n\t} = useDispatch( blockEditorStore );\n\n\tconst prevSyncStateRef = useRef( null );\n\tuseEffect( () => {\n\t\tif ( prevSyncStateRef.current === null ) {\n\t\t\tprevSyncStateRef.current = {\n\t\t\t\ttabPanels: [ ...tabPanels ],\n\t\t\t\ttabs: [ ...tabs ],\n\t\t\t};\n\t\t\treturn;\n\t\t}\n\n\t\tconst { tabPanels: prevTabPanels, tabs: prevTabs } =\n\t\t\tprevSyncStateRef.current;\n\n\t\tconst tabPanelCountChange = tabPanels.length - prevTabPanels.length;\n\t\tconst tabCountChange = tabs.length - prevTabs.length;\n\n\t\tconst tabPanelsInserted = tabPanelCountChange > 0;\n\t\tconst tabsInserted = tabCountChange > 0;\n\n\t\t// Both sides changed by the same amount.\n\t\t// Covers: no-op re-renders, \"Add Tab\" toolbar, and toolbar-remove.\n\t\t// Also handles drag-and-drop reordering of tabs.\n\t\tif ( tabPanelCountChange === tabCountChange ) {\n\t\t\t// When lengths are equal but order changed, the user reordered tabs\n\t\t\t// via drag-and-drop. Reorder the tab panel blocks to match.\n\t\t\tif (\n\t\t\t\ttabPanelCountChange === 0 &&\n\t\t\t\ttabPanelsClientId &&\n\t\t\t\ttabs.some( ( m, i ) => m.clientId !== prevTabs[ i ]?.clientId )\n\t\t\t) {\n\t\t\t\tconst reorderedTabPanels = tabs\n\t\t\t\t\t.map( ( tab ) => {\n\t\t\t\t\t\tconst oldIndex = prevTabs.findIndex(\n\t\t\t\t\t\t\t( pm ) => pm.clientId === tab.clientId\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn oldIndex !== -1 ? tabPanels[ oldIndex ] : null;\n\t\t\t\t\t} )\n\t\t\t\t\t.filter( Boolean );\n\t\t\t\tif ( reorderedTabPanels.length === tabPanels.length ) {\n\t\t\t\t\t__unstableMarkNextChangeAsNotPersistent();\n\t\t\t\t\treplaceInnerBlocks(\n\t\t\t\t\t\ttabPanelsClientId,\n\t\t\t\t\t\treorderedTabPanels,\n\t\t\t\t\t\tfalse\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tprevSyncStateRef.current = {\n\t\t\t\ttabPanels: [ ...tabPanels ],\n\t\t\t\ttabs: [ ...tabs ],\n\t\t\t};\n\t\t\treturn;\n\t\t}\n\n\t\t// Both sides changed in the same direction but by different amounts.\n\t\t// Bail without making a partial fix.\n\t\tif (\n\t\t\t( tabPanelCountChange > 0 && tabCountChange > 0 ) ||\n\t\t\t( tabPanelCountChange < 0 && tabCountChange < 0 )\n\t\t) {\n\t\t\tprevSyncStateRef.current = {\n\t\t\t\ttabPanels: [ ...tabPanels ],\n\t\t\t\ttabs: [ ...tabs ],\n\t\t\t};\n\t\t\treturn;\n\t\t}\n\n\t\t// If the required container block isn't available yet, bail without\n\t\t// updating the snapshot so the next render re-evaluates the same count change.\n\t\tif ( tabPanelsInserted && ! tabsListClientId ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( tabsInserted && ! tabPanelsClientId ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Update snapshot to the current state.\n\t\tprevSyncStateRef.current = {\n\t\t\ttabPanels: [ ...tabPanels ],\n\t\t\ttabs: [ ...tabs ],\n\t\t};\n\n\t\tconst currentTabPanelIds = new Set(\n\t\t\ttabPanels.map( ( t ) => t.clientId )\n\t\t);\n\t\tconst currentTabIds = new Set( tabs.map( ( m ) => m.clientId ) );\n\n\t\tif ( tabPanelCountChange < 0 ) {\n\t\t\t// Remove the tab at the same position as each deleted tab panel.\n\t\t\tconst removedIndices = prevTabPanels\n\t\t\t\t.map( ( t, i ) =>\n\t\t\t\t\t! currentTabPanelIds.has( t.clientId ) ? i : -1\n\t\t\t\t)\n\t\t\t\t.filter( ( i ) => i !== -1 );\n\t\t\tconst removedSet = new Set( removedIndices );\n\t\t\tremovedIndices.forEach( ( removedIndex ) => {\n\t\t\t\tif ( tabs[ removedIndex ] ) {\n\t\t\t\t\t__unstableMarkNextChangeAsNotPersistent();\n\t\t\t\t\tremoveBlock( tabs[ removedIndex ].clientId, false );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tprevSyncStateRef.current.tabs =\n\t\t\t\tprevSyncStateRef.current.tabs.filter(\n\t\t\t\t\t( _, i ) => ! removedSet.has( i )\n\t\t\t\t);\n\t\t} else if ( tabCountChange < 0 ) {\n\t\t\t// Remove the tab panel at the same position as each deleted tab.\n\t\t\tconst removedIndices = prevTabs\n\t\t\t\t.map( ( m, i ) =>\n\t\t\t\t\t! currentTabIds.has( m.clientId ) ? i : -1\n\t\t\t\t)\n\t\t\t\t.filter( ( i ) => i !== -1 );\n\t\t\tconst removedSet = new Set( removedIndices );\n\t\t\tremovedIndices.forEach( ( removedIndex ) => {\n\t\t\t\tif ( tabPanels[ removedIndex ] ) {\n\t\t\t\t\t__unstableMarkNextChangeAsNotPersistent();\n\t\t\t\t\tremoveBlock( tabPanels[ removedIndex ].clientId, false );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tprevSyncStateRef.current.tabPanels =\n\t\t\t\tprevSyncStateRef.current.tabPanels.filter(\n\t\t\t\t\t( _, i ) => ! removedSet.has( i )\n\t\t\t\t);\n\t\t} else if ( tabPanelsInserted ) {\n\t\t\t// A tab panel was pasted or duplicated \u2014 insert a matching tab.\n\t\t\tconst prevTabPanelIds = new Set(\n\t\t\t\tprevTabPanels.map( ( t ) => t.clientId )\n\t\t\t);\n\t\t\tconst newTabs = tabPanels\n\t\t\t\t.map( ( tabPanel, tabPanelIndex ) =>\n\t\t\t\t\t! prevTabPanelIds.has( tabPanel.clientId )\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\ttabPanelIndex,\n\t\t\t\t\t\t\t\tblock: createBlock( 'core/tab', {} ),\n\t\t\t\t\t\t }\n\t\t\t\t\t\t: null\n\t\t\t\t)\n\t\t\t\t.filter( Boolean );\n\n\t\t\tif ( newTabs.length > 0 ) {\n\t\t\t\t__unstableMarkNextChangeAsNotPersistent();\n\t\t\t\tinsertBlocks(\n\t\t\t\t\tnewTabs.map( ( { block } ) => block ),\n\t\t\t\t\tnewTabs[ 0 ].tabPanelIndex,\n\t\t\t\t\ttabsListClientId,\n\t\t\t\t\tfalse\n\t\t\t\t);\n\t\t\t\tnewTabs.forEach( ( { tabPanelIndex, block } ) => {\n\t\t\t\t\tprevSyncStateRef.current.tabs.splice( tabPanelIndex, 0, {\n\t\t\t\t\t\tclientId: block.clientId,\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t}\n\t\t} else if ( tabsInserted ) {\n\t\t\t// A tab was pasted or duplicated \u2014 insert a matching tab panels,\n\t\t\t// copying the label from the adjacent tab panel.\n\t\t\tconst prevTabIds = new Set( prevTabs.map( ( m ) => m.clientId ) );\n\t\t\tconst newTabPanels = tabs\n\t\t\t\t.map( ( tab, tabIndex ) => {\n\t\t\t\t\tif ( prevTabIds.has( tab.clientId ) ) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tconst label =\n\t\t\t\t\t\ttabPanels[ tabIndex - 1 ]?.attributes?.label ??\n\t\t\t\t\t\ttabPanels[ tabIndex ]?.attributes?.label ??\n\t\t\t\t\t\t'';\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttabIndex,\n\t\t\t\t\t\tblock: createBlock( 'core/tab-panel', { label } ),\n\t\t\t\t\t};\n\t\t\t\t} )\n\t\t\t\t.filter( Boolean );\n\n\t\t\tif ( newTabPanels.length > 0 ) {\n\t\t\t\t__unstableMarkNextChangeAsNotPersistent();\n\t\t\t\tinsertBlocks(\n\t\t\t\t\tnewTabPanels.map( ( { block } ) => block ),\n\t\t\t\t\tnewTabPanels[ 0 ].tabIndex,\n\t\t\t\t\ttabPanelsClientId,\n\t\t\t\t\tfalse\n\t\t\t\t);\n\t\t\t\tnewTabPanels.forEach( ( { tabIndex, block } ) => {\n\t\t\t\t\tprevSyncStateRef.current.tabPanels.splice( tabIndex, 0, {\n\t\t\t\t\t\tclientId: block.clientId,\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t}, [\n\t\ttabPanels,\n\t\ttabs,\n\t\tremoveBlock,\n\t\tinsertBlocks,\n\t\treplaceInnerBlocks,\n\t\t__unstableMarkNextChangeAsNotPersistent,\n\t\ttabsListClientId,\n\t\ttabPanelsClientId,\n\t] );\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -123,7 +123,7 @@ function IncludeControl({
123
123
  onInputChange: debouncedSearch,
124
124
  suggestions,
125
125
  onChange: onTermChange,
126
- __experimentalShowHowTo: false,
126
+ help: "",
127
127
  ...props
128
128
  }
129
129
  );
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/terms-query/edit/inspector-controls/include-control.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { FormTokenField } from '@wordpress/components';\nimport { useSelect } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data';\nimport { useState, useEffect, useMemo } from '@wordpress/element';\nimport { useDebounce } from '@wordpress/compose';\nimport { decodeEntities } from '@wordpress/html-entities';\n\nconst EMPTY_ARRAY = [];\nconst BASE_QUERY = {\n\torder: 'asc',\n\t_fields: 'id,name',\n\tcontext: 'view',\n};\n\nexport default function IncludeControl( {\n\tvalue: include,\n\ttaxonomy,\n\tonChange,\n\t...props\n} ) {\n\tconst [ search, setSearch ] = useState( '' );\n\tconst [ value, setValue ] = useState( EMPTY_ARRAY );\n\tconst [ suggestions, setSuggestions ] = useState( EMPTY_ARRAY );\n\tconst debouncedSearch = useDebounce( setSearch, 250 );\n\n\tconst { searchResults, searchHasResolved } = useSelect(\n\t\t( select ) => {\n\t\t\tif ( ! search ) {\n\t\t\t\treturn { searchResults: EMPTY_ARRAY, searchHasResolved: true };\n\t\t\t}\n\t\t\tconst { getEntityRecords, hasFinishedResolution } =\n\t\t\t\tselect( coreStore );\n\t\t\tconst selectorArgs = [\n\t\t\t\t'taxonomy',\n\t\t\t\ttaxonomy,\n\t\t\t\t{\n\t\t\t\t\t...BASE_QUERY,\n\t\t\t\t\tsearch,\n\t\t\t\t\torderby: 'name',\n\t\t\t\t\texclude: include,\n\t\t\t\t\tper_page: 20,\n\t\t\t\t},\n\t\t\t];\n\t\t\treturn {\n\t\t\t\tsearchResults: getEntityRecords( ...selectorArgs ),\n\t\t\t\tsearchHasResolved: hasFinishedResolution(\n\t\t\t\t\t'getEntityRecords',\n\t\t\t\t\tselectorArgs\n\t\t\t\t),\n\t\t\t};\n\t\t},\n\t\t[ search, taxonomy, include ]\n\t);\n\n\tconst currentTerms = useSelect(\n\t\t( select ) => {\n\t\t\tif ( ! include?.length ) {\n\t\t\t\treturn EMPTY_ARRAY;\n\t\t\t}\n\t\t\tconst { getEntityRecords } = select( coreStore );\n\t\t\treturn getEntityRecords( 'taxonomy', taxonomy, {\n\t\t\t\t...BASE_QUERY,\n\t\t\t\tinclude,\n\t\t\t\tper_page: include.length,\n\t\t\t} );\n\t\t},\n\t\t[ include, taxonomy ]\n\t);\n\n\t// Update the `value` state only after the selectors are resolved\n\t// to avoid emptying the input when we're changing terms.\n\tuseEffect( () => {\n\t\tif ( ! include?.length ) {\n\t\t\tsetValue( EMPTY_ARRAY );\n\t\t}\n\t\tif ( ! currentTerms?.length ) {\n\t\t\treturn;\n\t\t}\n\t\t// Returns only the existing entity ids. This prevents the component\n\t\t// from crashing in the editor, when non existing ids are provided.\n\t\tconst sanitizedValue = include.reduce( ( accumulator, id ) => {\n\t\t\tconst entity = currentTerms.find( ( term ) => term.id === id );\n\t\t\tif ( entity ) {\n\t\t\t\taccumulator.push( {\n\t\t\t\t\tid,\n\t\t\t\t\tvalue: decodeEntities( entity.name ),\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn accumulator;\n\t\t}, [] );\n\t\tsetValue( sanitizedValue );\n\t}, [ include, currentTerms ] );\n\n\tconst entitiesInfo = useMemo( () => {\n\t\tif ( ! searchResults?.length ) {\n\t\t\treturn { names: EMPTY_ARRAY, mapByName: {} };\n\t\t}\n\t\tconst names = [];\n\t\tconst mapByName = {};\n\t\tsearchResults.forEach( ( result ) => {\n\t\t\tconst decodedName = decodeEntities( result.name );\n\t\t\tnames.push( decodedName );\n\t\t\tmapByName[ decodedName ] = result;\n\t\t} );\n\t\treturn { names, mapByName };\n\t}, [ searchResults ] );\n\n\t// Update suggestions only when the query has resolved.\n\tuseEffect( () => {\n\t\tif ( ! searchHasResolved ) {\n\t\t\treturn;\n\t\t}\n\t\tsetSuggestions( entitiesInfo.names );\n\t}, [ entitiesInfo.names, searchHasResolved ] );\n\n\tconst getIdByValue = ( entitiesMappedByName, entity ) =>\n\t\tentity?.id || entitiesMappedByName?.[ entity ]?.id;\n\n\tconst onTermChange = ( newValue ) => {\n\t\tconst ids = Array.from(\n\t\t\tnewValue.reduce( ( accumulator, entity ) => {\n\t\t\t\t// Verify that new values point to existing entities.\n\t\t\t\tconst id = getIdByValue( entitiesInfo.mapByName, entity );\n\t\t\t\tif ( id ) {\n\t\t\t\t\taccumulator.add( id );\n\t\t\t\t}\n\t\t\t\treturn accumulator;\n\t\t\t}, new Set() )\n\t\t);\n\t\tsetSuggestions( EMPTY_ARRAY );\n\t\tonChange( ids );\n\t};\n\n\treturn (\n\t\t<FormTokenField\n\t\t\t__next40pxDefaultSize\n\t\t\tvalue={ value }\n\t\t\tonInputChange={ debouncedSearch }\n\t\t\tsuggestions={ suggestions }\n\t\t\tonChange={ onTermChange }\n\t\t\t__experimentalShowHowTo={ false }\n\t\t\t{ ...props }\n\t\t/>\n\t);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { FormTokenField } from '@wordpress/components';\nimport { useSelect } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data';\nimport { useState, useEffect, useMemo } from '@wordpress/element';\nimport { useDebounce } from '@wordpress/compose';\nimport { decodeEntities } from '@wordpress/html-entities';\n\nconst EMPTY_ARRAY = [];\nconst BASE_QUERY = {\n\torder: 'asc',\n\t_fields: 'id,name',\n\tcontext: 'view',\n};\n\nexport default function IncludeControl( {\n\tvalue: include,\n\ttaxonomy,\n\tonChange,\n\t...props\n} ) {\n\tconst [ search, setSearch ] = useState( '' );\n\tconst [ value, setValue ] = useState( EMPTY_ARRAY );\n\tconst [ suggestions, setSuggestions ] = useState( EMPTY_ARRAY );\n\tconst debouncedSearch = useDebounce( setSearch, 250 );\n\n\tconst { searchResults, searchHasResolved } = useSelect(\n\t\t( select ) => {\n\t\t\tif ( ! search ) {\n\t\t\t\treturn { searchResults: EMPTY_ARRAY, searchHasResolved: true };\n\t\t\t}\n\t\t\tconst { getEntityRecords, hasFinishedResolution } =\n\t\t\t\tselect( coreStore );\n\t\t\tconst selectorArgs = [\n\t\t\t\t'taxonomy',\n\t\t\t\ttaxonomy,\n\t\t\t\t{\n\t\t\t\t\t...BASE_QUERY,\n\t\t\t\t\tsearch,\n\t\t\t\t\torderby: 'name',\n\t\t\t\t\texclude: include,\n\t\t\t\t\tper_page: 20,\n\t\t\t\t},\n\t\t\t];\n\t\t\treturn {\n\t\t\t\tsearchResults: getEntityRecords( ...selectorArgs ),\n\t\t\t\tsearchHasResolved: hasFinishedResolution(\n\t\t\t\t\t'getEntityRecords',\n\t\t\t\t\tselectorArgs\n\t\t\t\t),\n\t\t\t};\n\t\t},\n\t\t[ search, taxonomy, include ]\n\t);\n\n\tconst currentTerms = useSelect(\n\t\t( select ) => {\n\t\t\tif ( ! include?.length ) {\n\t\t\t\treturn EMPTY_ARRAY;\n\t\t\t}\n\t\t\tconst { getEntityRecords } = select( coreStore );\n\t\t\treturn getEntityRecords( 'taxonomy', taxonomy, {\n\t\t\t\t...BASE_QUERY,\n\t\t\t\tinclude,\n\t\t\t\tper_page: include.length,\n\t\t\t} );\n\t\t},\n\t\t[ include, taxonomy ]\n\t);\n\n\t// Update the `value` state only after the selectors are resolved\n\t// to avoid emptying the input when we're changing terms.\n\tuseEffect( () => {\n\t\tif ( ! include?.length ) {\n\t\t\tsetValue( EMPTY_ARRAY );\n\t\t}\n\t\tif ( ! currentTerms?.length ) {\n\t\t\treturn;\n\t\t}\n\t\t// Returns only the existing entity ids. This prevents the component\n\t\t// from crashing in the editor, when non existing ids are provided.\n\t\tconst sanitizedValue = include.reduce( ( accumulator, id ) => {\n\t\t\tconst entity = currentTerms.find( ( term ) => term.id === id );\n\t\t\tif ( entity ) {\n\t\t\t\taccumulator.push( {\n\t\t\t\t\tid,\n\t\t\t\t\tvalue: decodeEntities( entity.name ),\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn accumulator;\n\t\t}, [] );\n\t\tsetValue( sanitizedValue );\n\t}, [ include, currentTerms ] );\n\n\tconst entitiesInfo = useMemo( () => {\n\t\tif ( ! searchResults?.length ) {\n\t\t\treturn { names: EMPTY_ARRAY, mapByName: {} };\n\t\t}\n\t\tconst names = [];\n\t\tconst mapByName = {};\n\t\tsearchResults.forEach( ( result ) => {\n\t\t\tconst decodedName = decodeEntities( result.name );\n\t\t\tnames.push( decodedName );\n\t\t\tmapByName[ decodedName ] = result;\n\t\t} );\n\t\treturn { names, mapByName };\n\t}, [ searchResults ] );\n\n\t// Update suggestions only when the query has resolved.\n\tuseEffect( () => {\n\t\tif ( ! searchHasResolved ) {\n\t\t\treturn;\n\t\t}\n\t\tsetSuggestions( entitiesInfo.names );\n\t}, [ entitiesInfo.names, searchHasResolved ] );\n\n\tconst getIdByValue = ( entitiesMappedByName, entity ) =>\n\t\tentity?.id || entitiesMappedByName?.[ entity ]?.id;\n\n\tconst onTermChange = ( newValue ) => {\n\t\tconst ids = Array.from(\n\t\t\tnewValue.reduce( ( accumulator, entity ) => {\n\t\t\t\t// Verify that new values point to existing entities.\n\t\t\t\tconst id = getIdByValue( entitiesInfo.mapByName, entity );\n\t\t\t\tif ( id ) {\n\t\t\t\t\taccumulator.add( id );\n\t\t\t\t}\n\t\t\t\treturn accumulator;\n\t\t\t}, new Set() )\n\t\t);\n\t\tsetSuggestions( EMPTY_ARRAY );\n\t\tonChange( ids );\n\t};\n\n\treturn (\n\t\t<FormTokenField\n\t\t\t__next40pxDefaultSize\n\t\t\tvalue={ value }\n\t\t\tonInputChange={ debouncedSearch }\n\t\t\tsuggestions={ suggestions }\n\t\t\tonChange={ onTermChange }\n\t\t\thelp=\"\"\n\t\t\t{ ...props }\n\t\t/>\n\t);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -28,7 +28,7 @@ import { useState, useRef, useEffect } from "@wordpress/element";
28
28
  import { getFilename } from "@wordpress/url";
29
29
  import { unlock } from "../lock-unlock.mjs";
30
30
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
31
- var { Badge } = unlock(componentsPrivateApis);
31
+ var { Badge: WCBadge } = unlock(componentsPrivateApis);
32
32
  var ALLOWED_TYPES = ["text/vtt"];
33
33
  var DEFAULT_KIND = "subtitles";
34
34
  var KIND_OPTIONS = [
@@ -54,7 +54,7 @@ function TrackList({ tracks, onEditPress }) {
54
54
  children: [
55
55
  /* @__PURE__ */ jsx("span", { children: track.label }),
56
56
  /* @__PURE__ */ jsxs(HStack, { justify: "flex-end", children: [
57
- track.default && /* @__PURE__ */ jsx(Badge, { children: __("Default") }),
57
+ track.default && /* @__PURE__ */ jsx(WCBadge, { children: __("Default") }),
58
58
  /* @__PURE__ */ jsx(
59
59
  Button,
60
60
  {