@wordpress/components 25.12.0 → 25.14.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 (342) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/build/angle-picker-control/index.js +0 -1
  3. package/build/angle-picker-control/index.js.map +1 -1
  4. package/build/border-control/border-control-dropdown/component.js +4 -2
  5. package/build/border-control/border-control-dropdown/component.js.map +1 -1
  6. package/build/border-control/border-control-dropdown/hook.js +3 -2
  7. package/build/border-control/border-control-dropdown/hook.js.map +1 -1
  8. package/build/border-control/styles.js +17 -17
  9. package/build/border-control/styles.js.map +1 -1
  10. package/build/checkbox-control/index.js +1 -1
  11. package/build/checkbox-control/index.js.map +1 -1
  12. package/build/checkbox-control/types.js.map +1 -1
  13. package/build/custom-select-control-v2/index.js +87 -0
  14. package/build/custom-select-control-v2/index.js.map +1 -0
  15. package/build/custom-select-control-v2/styles.js +85 -0
  16. package/build/custom-select-control-v2/styles.js.map +1 -0
  17. package/build/custom-select-control-v2/types.js +6 -0
  18. package/build/custom-select-control-v2/types.js.map +1 -0
  19. package/build/date-time/time/timezone.js +11 -2
  20. package/build/date-time/time/timezone.js.map +1 -1
  21. package/build/dimension-control/index.js +2 -0
  22. package/build/dimension-control/index.js.map +1 -1
  23. package/build/dimension-control/types.js.map +1 -1
  24. package/build/dropdown-menu-v2-ariakit/index.js +49 -20
  25. package/build/dropdown-menu-v2-ariakit/index.js.map +1 -1
  26. package/build/dropdown-menu-v2-ariakit/styles.js +82 -59
  27. package/build/dropdown-menu-v2-ariakit/styles.js.map +1 -1
  28. package/build/dropdown-menu-v2-ariakit/types.js.map +1 -1
  29. package/build/focal-point-picker/controls.js +5 -1
  30. package/build/focal-point-picker/controls.js.map +1 -1
  31. package/build/focal-point-picker/index.js +2 -0
  32. package/build/focal-point-picker/index.js.map +1 -1
  33. package/build/focal-point-picker/styles/focal-point-picker-style.js +15 -15
  34. package/build/focal-point-picker/styles/focal-point-picker-style.js.map +1 -1
  35. package/build/focal-point-picker/types.js.map +1 -1
  36. package/build/font-size-picker/font-size-picker-select.js +2 -0
  37. package/build/font-size-picker/font-size-picker-select.js.map +1 -1
  38. package/build/font-size-picker/font-size-picker-toggle-group.js +2 -0
  39. package/build/font-size-picker/font-size-picker-toggle-group.js.map +1 -1
  40. package/build/font-size-picker/index.js +6 -1
  41. package/build/font-size-picker/index.js.map +1 -1
  42. package/build/font-size-picker/types.js.map +1 -1
  43. package/build/form-token-field/index.js +6 -2
  44. package/build/form-token-field/index.js.map +1 -1
  45. package/build/form-token-field/token-input.js.map +1 -1
  46. package/build/form-token-field/types.js.map +1 -1
  47. package/build/heading/hook.js +6 -3
  48. package/build/heading/hook.js.map +1 -1
  49. package/build/heading/types.js.map +1 -1
  50. package/build/index.native.js +0 -16
  51. package/build/index.native.js.map +1 -1
  52. package/build/mobile/global-styles-context/utils.native.js +13 -0
  53. package/build/mobile/global-styles-context/utils.native.js.map +1 -1
  54. package/build/mobile/utils/alignments.native.js +1 -1
  55. package/build/mobile/utils/alignments.native.js.map +1 -1
  56. package/build/palette-edit/index.js +21 -1
  57. package/build/palette-edit/index.js.map +1 -1
  58. package/build/private-apis.js +3 -2
  59. package/build/private-apis.js.map +1 -1
  60. package/build/query-controls/author-select.js +3 -1
  61. package/build/query-controls/author-select.js.map +1 -1
  62. package/build/query-controls/category-select.js +3 -1
  63. package/build/query-controls/category-select.js.map +1 -1
  64. package/build/query-controls/index.js +6 -1
  65. package/build/query-controls/index.js.map +1 -1
  66. package/build/query-controls/types.js.map +1 -1
  67. package/build/slot-fill/types.js.map +1 -1
  68. package/build/tabs/index.js +24 -5
  69. package/build/tabs/index.js.map +1 -1
  70. package/build/tabs/tab.js +4 -4
  71. package/build/tabs/tab.js.map +1 -1
  72. package/build/tabs/tabpanel.js +4 -3
  73. package/build/tabs/tabpanel.js.map +1 -1
  74. package/build/tabs/types.js.map +1 -1
  75. package/build/text/types.js.map +1 -1
  76. package/build/toggle-group-control/toggle-group-control/utils.js +17 -17
  77. package/build/toggle-group-control/toggle-group-control/utils.js.map +1 -1
  78. package/build/tools-panel/tools-panel-item/hook.js +16 -12
  79. package/build/tools-panel/tools-panel-item/hook.js.map +1 -1
  80. package/build-module/angle-picker-control/index.js +0 -1
  81. package/build-module/angle-picker-control/index.js.map +1 -1
  82. package/build-module/border-control/border-control-dropdown/component.js +4 -2
  83. package/build-module/border-control/border-control-dropdown/component.js.map +1 -1
  84. package/build-module/border-control/border-control-dropdown/hook.js +3 -2
  85. package/build-module/border-control/border-control-dropdown/hook.js.map +1 -1
  86. package/build-module/border-control/styles.js +17 -17
  87. package/build-module/border-control/styles.js.map +1 -1
  88. package/build-module/checkbox-control/index.js +1 -1
  89. package/build-module/checkbox-control/index.js.map +1 -1
  90. package/build-module/checkbox-control/types.js.map +1 -1
  91. package/build-module/custom-select-control-v2/index.js +74 -0
  92. package/build-module/custom-select-control-v2/index.js.map +1 -0
  93. package/build-module/custom-select-control-v2/styles.js +71 -0
  94. package/build-module/custom-select-control-v2/styles.js.map +1 -0
  95. package/build-module/custom-select-control-v2/types.js +2 -0
  96. package/build-module/custom-select-control-v2/types.js.map +1 -0
  97. package/build-module/date-time/time/timezone.js +11 -2
  98. package/build-module/date-time/time/timezone.js.map +1 -1
  99. package/build-module/dimension-control/index.js +2 -0
  100. package/build-module/dimension-control/index.js.map +1 -1
  101. package/build-module/dimension-control/types.js.map +1 -1
  102. package/build-module/dropdown-menu-v2-ariakit/index.js +46 -18
  103. package/build-module/dropdown-menu-v2-ariakit/index.js.map +1 -1
  104. package/build-module/dropdown-menu-v2-ariakit/styles.js +69 -40
  105. package/build-module/dropdown-menu-v2-ariakit/styles.js.map +1 -1
  106. package/build-module/dropdown-menu-v2-ariakit/types.js.map +1 -1
  107. package/build-module/focal-point-picker/controls.js +5 -1
  108. package/build-module/focal-point-picker/controls.js.map +1 -1
  109. package/build-module/focal-point-picker/index.js +2 -0
  110. package/build-module/focal-point-picker/index.js.map +1 -1
  111. package/build-module/focal-point-picker/styles/focal-point-picker-style.js +15 -15
  112. package/build-module/focal-point-picker/styles/focal-point-picker-style.js.map +1 -1
  113. package/build-module/focal-point-picker/types.js.map +1 -1
  114. package/build-module/font-size-picker/font-size-picker-select.js +2 -0
  115. package/build-module/font-size-picker/font-size-picker-select.js.map +1 -1
  116. package/build-module/font-size-picker/font-size-picker-toggle-group.js +2 -0
  117. package/build-module/font-size-picker/font-size-picker-toggle-group.js.map +1 -1
  118. package/build-module/font-size-picker/index.js +6 -1
  119. package/build-module/font-size-picker/index.js.map +1 -1
  120. package/build-module/font-size-picker/types.js.map +1 -1
  121. package/build-module/form-token-field/index.js +6 -2
  122. package/build-module/form-token-field/index.js.map +1 -1
  123. package/build-module/form-token-field/token-input.js.map +1 -1
  124. package/build-module/form-token-field/types.js.map +1 -1
  125. package/build-module/heading/hook.js +6 -3
  126. package/build-module/heading/hook.js.map +1 -1
  127. package/build-module/heading/types.js.map +1 -1
  128. package/build-module/index.native.js +0 -2
  129. package/build-module/index.native.js.map +1 -1
  130. package/build-module/mobile/global-styles-context/utils.native.js +13 -0
  131. package/build-module/mobile/global-styles-context/utils.native.js.map +1 -1
  132. package/build-module/mobile/utils/alignments.native.js +1 -1
  133. package/build-module/mobile/utils/alignments.native.js.map +1 -1
  134. package/build-module/palette-edit/index.js +20 -3
  135. package/build-module/palette-edit/index.js.map +1 -1
  136. package/build-module/private-apis.js +4 -3
  137. package/build-module/private-apis.js.map +1 -1
  138. package/build-module/query-controls/author-select.js +3 -1
  139. package/build-module/query-controls/author-select.js.map +1 -1
  140. package/build-module/query-controls/category-select.js +3 -1
  141. package/build-module/query-controls/category-select.js.map +1 -1
  142. package/build-module/query-controls/index.js +6 -1
  143. package/build-module/query-controls/index.js.map +1 -1
  144. package/build-module/query-controls/types.js.map +1 -1
  145. package/build-module/slot-fill/types.js.map +1 -1
  146. package/build-module/tabs/index.js +25 -6
  147. package/build-module/tabs/index.js.map +1 -1
  148. package/build-module/tabs/tab.js +6 -6
  149. package/build-module/tabs/tab.js.map +1 -1
  150. package/build-module/tabs/tabpanel.js +6 -5
  151. package/build-module/tabs/tabpanel.js.map +1 -1
  152. package/build-module/tabs/types.js.map +1 -1
  153. package/build-module/text/types.js.map +1 -1
  154. package/build-module/toggle-group-control/toggle-group-control/utils.js +17 -17
  155. package/build-module/toggle-group-control/toggle-group-control/utils.js.map +1 -1
  156. package/build-module/tools-panel/tools-panel-item/hook.js +17 -13
  157. package/build-module/tools-panel/tools-panel-item/hook.js.map +1 -1
  158. package/build-style/style-rtl.css +32 -6
  159. package/build-style/style.css +32 -6
  160. package/build-types/angle-picker-control/index.d.ts.map +1 -1
  161. package/build-types/border-control/border-control-dropdown/component.d.ts.map +1 -1
  162. package/build-types/border-control/border-control-dropdown/hook.d.ts +1 -0
  163. package/build-types/border-control/border-control-dropdown/hook.d.ts.map +1 -1
  164. package/build-types/border-control/styles.d.ts +1 -1
  165. package/build-types/border-control/styles.d.ts.map +1 -1
  166. package/build-types/box-control/stories/index.story.d.ts +1944 -0
  167. package/build-types/box-control/stories/index.story.d.ts.map +1 -0
  168. package/build-types/checkbox-control/index.d.ts.map +1 -1
  169. package/build-types/checkbox-control/types.d.ts +3 -2
  170. package/build-types/checkbox-control/types.d.ts.map +1 -1
  171. package/build-types/color-palette/styles.d.ts +4 -1
  172. package/build-types/color-palette/styles.d.ts.map +1 -1
  173. package/build-types/custom-select-control-v2/index.d.ts +6 -0
  174. package/build-types/custom-select-control-v2/index.d.ts.map +1 -0
  175. package/build-types/custom-select-control-v2/stories/index.story.d.ts +19 -0
  176. package/build-types/custom-select-control-v2/stories/index.story.d.ts.map +1 -0
  177. package/build-types/custom-select-control-v2/styles.d.ts +47 -0
  178. package/build-types/custom-select-control-v2/styles.d.ts.map +1 -0
  179. package/build-types/custom-select-control-v2/types.d.ts +57 -0
  180. package/build-types/custom-select-control-v2/types.d.ts.map +1 -0
  181. package/build-types/date-time/date/styles.d.ts +4 -1
  182. package/build-types/date-time/date/styles.d.ts.map +1 -1
  183. package/build-types/date-time/time/timezone.d.ts.map +1 -1
  184. package/build-types/dimension-control/index.d.ts.map +1 -1
  185. package/build-types/dimension-control/types.d.ts +6 -0
  186. package/build-types/dimension-control/types.d.ts.map +1 -1
  187. package/build-types/dropdown-menu-v2-ariakit/index.d.ts +11 -2
  188. package/build-types/dropdown-menu-v2-ariakit/index.d.ts.map +1 -1
  189. package/build-types/dropdown-menu-v2-ariakit/stories/index.story.d.ts.map +1 -1
  190. package/build-types/dropdown-menu-v2-ariakit/styles.d.ts +26 -18
  191. package/build-types/dropdown-menu-v2-ariakit/styles.d.ts.map +1 -1
  192. package/build-types/dropdown-menu-v2-ariakit/types.d.ts +0 -6
  193. package/build-types/dropdown-menu-v2-ariakit/types.d.ts.map +1 -1
  194. package/build-types/focal-point-picker/controls.d.ts +1 -1
  195. package/build-types/focal-point-picker/controls.d.ts.map +1 -1
  196. package/build-types/focal-point-picker/index.d.ts +1 -1
  197. package/build-types/focal-point-picker/index.d.ts.map +1 -1
  198. package/build-types/focal-point-picker/stories/index.story.d.ts +8 -4
  199. package/build-types/focal-point-picker/stories/index.story.d.ts.map +1 -1
  200. package/build-types/focal-point-picker/types.d.ts +7 -0
  201. package/build-types/focal-point-picker/types.d.ts.map +1 -1
  202. package/build-types/font-size-picker/font-size-picker-select.d.ts.map +1 -1
  203. package/build-types/font-size-picker/font-size-picker-toggle-group.d.ts.map +1 -1
  204. package/build-types/font-size-picker/index.d.ts.map +1 -1
  205. package/build-types/font-size-picker/types.d.ts +8 -1
  206. package/build-types/font-size-picker/types.d.ts.map +1 -1
  207. package/build-types/form-token-field/index.d.ts.map +1 -1
  208. package/build-types/form-token-field/token-input.d.ts.map +1 -1
  209. package/build-types/form-token-field/types.d.ts +1 -1
  210. package/build-types/form-token-field/types.d.ts.map +1 -1
  211. package/build-types/heading/component.d.ts +4 -1
  212. package/build-types/heading/component.d.ts.map +1 -1
  213. package/build-types/heading/hook.d.ts.map +1 -1
  214. package/build-types/heading/types.d.ts +20 -1
  215. package/build-types/heading/types.d.ts.map +1 -1
  216. package/build-types/navigation/styles/navigation-styles.d.ts +4 -1
  217. package/build-types/navigation/styles/navigation-styles.d.ts.map +1 -1
  218. package/build-types/palette-edit/index.d.ts +6 -1
  219. package/build-types/palette-edit/index.d.ts.map +1 -1
  220. package/build-types/palette-edit/styles.d.ts +4 -1
  221. package/build-types/palette-edit/styles.d.ts.map +1 -1
  222. package/build-types/private-apis.d.ts.map +1 -1
  223. package/build-types/query-controls/author-select.d.ts +1 -1
  224. package/build-types/query-controls/author-select.d.ts.map +1 -1
  225. package/build-types/query-controls/category-select.d.ts +1 -1
  226. package/build-types/query-controls/category-select.d.ts.map +1 -1
  227. package/build-types/query-controls/index.d.ts +1 -1
  228. package/build-types/query-controls/index.d.ts.map +1 -1
  229. package/build-types/query-controls/types.d.ts +9 -0
  230. package/build-types/query-controls/types.d.ts.map +1 -1
  231. package/build-types/slot-fill/bubbles-virtually/slot.d.ts +1 -1
  232. package/build-types/slot-fill/types.d.ts +16 -6
  233. package/build-types/slot-fill/types.d.ts.map +1 -1
  234. package/build-types/tabs/index.d.ts +3 -2
  235. package/build-types/tabs/index.d.ts.map +1 -1
  236. package/build-types/tabs/stories/index.story.d.ts.map +1 -1
  237. package/build-types/tabs/tab.d.ts +2 -1
  238. package/build-types/tabs/tab.d.ts.map +1 -1
  239. package/build-types/tabs/tabpanel.d.ts +2 -1
  240. package/build-types/tabs/tabpanel.d.ts.map +1 -1
  241. package/build-types/tabs/types.d.ts +8 -3
  242. package/build-types/tabs/types.d.ts.map +1 -1
  243. package/build-types/text/types.d.ts +15 -2
  244. package/build-types/text/types.d.ts.map +1 -1
  245. package/build-types/toggle-group-control/toggle-group-control/utils.d.ts.map +1 -1
  246. package/build-types/tools-panel/tools-panel-item/hook.d.ts.map +1 -1
  247. package/package.json +19 -19
  248. package/src/angle-picker-control/index.tsx +0 -1
  249. package/src/border-control/border-control-dropdown/component.tsx +3 -1
  250. package/src/border-control/border-control-dropdown/hook.ts +3 -2
  251. package/src/border-control/styles.ts +2 -9
  252. package/src/box-control/stories/index.story.tsx +82 -0
  253. package/src/button/style.scss +10 -2
  254. package/src/checkbox-control/README.md +2 -1
  255. package/src/checkbox-control/index.tsx +8 -6
  256. package/src/checkbox-control/test/__snapshots__/index.tsx.snap +3 -8
  257. package/src/checkbox-control/test/index.tsx +7 -0
  258. package/src/checkbox-control/types.ts +3 -2
  259. package/src/combobox-control/README.md +1 -3
  260. package/src/custom-select-control/test/index.js +367 -35
  261. package/src/custom-select-control-v2/README.md +73 -0
  262. package/src/custom-select-control-v2/index.tsx +99 -0
  263. package/src/custom-select-control-v2/stories/index.story.tsx +149 -0
  264. package/src/custom-select-control-v2/styles.ts +76 -0
  265. package/src/custom-select-control-v2/types.ts +63 -0
  266. package/src/date-time/time/timezone.tsx +15 -3
  267. package/src/dimension-control/index.tsx +2 -0
  268. package/src/dimension-control/test/__snapshots__/index.test.js.snap +2 -2
  269. package/src/dimension-control/types.ts +6 -0
  270. package/src/dropdown-menu-v2-ariakit/README.md +19 -5
  271. package/src/dropdown-menu-v2-ariakit/index.tsx +85 -36
  272. package/src/dropdown-menu-v2-ariakit/stories/index.story.tsx +204 -90
  273. package/src/dropdown-menu-v2-ariakit/styles.ts +165 -117
  274. package/src/dropdown-menu-v2-ariakit/test/index.tsx +5 -10
  275. package/src/dropdown-menu-v2-ariakit/types.ts +0 -7
  276. package/src/focal-point-picker/controls.tsx +4 -0
  277. package/src/focal-point-picker/index.tsx +2 -0
  278. package/src/focal-point-picker/styles/focal-point-picker-style.ts +1 -1
  279. package/src/focal-point-picker/types.ts +7 -0
  280. package/src/font-size-picker/font-size-picker-select.tsx +2 -0
  281. package/src/font-size-picker/font-size-picker-toggle-group.tsx +9 -1
  282. package/src/font-size-picker/index.tsx +11 -3
  283. package/src/font-size-picker/types.ts +8 -1
  284. package/src/form-toggle/style.scss +40 -8
  285. package/src/form-token-field/index.tsx +11 -3
  286. package/src/form-token-field/token-input.tsx +1 -3
  287. package/src/form-token-field/types.ts +1 -0
  288. package/src/heading/README.md +6 -1
  289. package/src/heading/hook.ts +6 -3
  290. package/src/heading/types.ts +23 -1
  291. package/src/index.native.js +0 -2
  292. package/src/mobile/global-styles-context/test/utils.native.js +22 -0
  293. package/src/mobile/global-styles-context/utils.native.js +14 -0
  294. package/src/mobile/link-settings/style.native.scss +0 -17
  295. package/src/mobile/utils/alignments.native.js +1 -0
  296. package/src/navigable-container/README.md +1 -1
  297. package/src/palette-edit/index.tsx +22 -8
  298. package/src/palette-edit/style.scss +2 -2
  299. package/src/palette-edit/test/index.tsx +75 -1
  300. package/src/private-apis.ts +4 -2
  301. package/src/query-controls/author-select.tsx +2 -0
  302. package/src/query-controls/category-select.tsx +2 -0
  303. package/src/query-controls/index.tsx +6 -1
  304. package/src/query-controls/types.ts +9 -0
  305. package/src/search-control/README.md +2 -0
  306. package/src/slot-fill/README.md +1 -1
  307. package/src/slot-fill/types.ts +18 -6
  308. package/src/spinner/README.md +2 -0
  309. package/src/tabs/README.md +4 -4
  310. package/src/tabs/index.tsx +34 -3
  311. package/src/tabs/stories/index.story.tsx +56 -48
  312. package/src/tabs/tab.tsx +7 -7
  313. package/src/tabs/tabpanel.tsx +10 -6
  314. package/src/tabs/test/index.tsx +180 -87
  315. package/src/tabs/types.ts +8 -3
  316. package/src/text/README.md +5 -1
  317. package/src/text/types.ts +15 -2
  318. package/src/toggle-control/README.md +2 -2
  319. package/src/toggle-group-control/test/index.tsx +54 -1
  320. package/src/toggle-group-control/toggle-group-control/utils.ts +15 -20
  321. package/src/tools-panel/tools-panel-item/hook.ts +21 -23
  322. package/tsconfig.tsbuildinfo +1 -1
  323. package/build/mobile/inserter-button/index.native.js +0 -98
  324. package/build/mobile/inserter-button/index.native.js.map +0 -1
  325. package/build/mobile/inserter-button/sparkles.js +0 -23
  326. package/build/mobile/inserter-button/sparkles.js.map +0 -1
  327. package/build/mobile/link-settings/image-link-destinations-screen.native.js +0 -119
  328. package/build/mobile/link-settings/image-link-destinations-screen.native.js.map +0 -1
  329. package/build-module/mobile/inserter-button/index.native.js +0 -89
  330. package/build-module/mobile/inserter-button/index.native.js.map +0 -1
  331. package/build-module/mobile/inserter-button/sparkles.js +0 -15
  332. package/build-module/mobile/inserter-button/sparkles.js.map +0 -1
  333. package/build-module/mobile/link-settings/image-link-destinations-screen.native.js +0 -110
  334. package/build-module/mobile/link-settings/image-link-destinations-screen.native.js.map +0 -1
  335. package/build-types/mobile/inserter-button/sparkles.d.ts +0 -3
  336. package/build-types/mobile/inserter-button/sparkles.d.ts.map +0 -1
  337. package/src/box-control/stories/index.story.js +0 -75
  338. package/src/mobile/inserter-button/README.md +0 -62
  339. package/src/mobile/inserter-button/index.native.js +0 -116
  340. package/src/mobile/inserter-button/sparkles.js +0 -15
  341. package/src/mobile/inserter-button/style.native.scss +0 -72
  342. package/src/mobile/link-settings/image-link-destinations-screen.native.js +0 -152
@@ -17,3 +17,5 @@ function Example() {
17
17
  The spinner component should:
18
18
 
19
19
  - Signal to users that the processing of their request is underway and will soon complete.
20
+
21
+ Check out the [Storybook page](https://wordpress.github.io/gutenberg/?path=/docs/components-spinner--docs) for a visual exploration of this component.
@@ -163,9 +163,9 @@ The children elements, which should be a series of `Tabs.TabPanel` components.
163
163
 
164
164
  ##### Props
165
165
 
166
- ###### `id`: `string`
166
+ ###### `tabId`: `string`
167
167
 
168
- The id of the tab, which is prepended with the `Tabs` instance ID.
168
+ A unique identifier for the tab, which is used to generate a unique id for the underlying element. The value of this prop should match with the value of the `tabId` prop on the corresponding `Tabs.TabPanel` component.
169
169
 
170
170
  - Required: Yes
171
171
 
@@ -198,9 +198,9 @@ The children elements, generally the content to display on the tabpanel.
198
198
 
199
199
  - Required: No
200
200
 
201
- ###### `id`: `string`
201
+ ###### `tabId`: `string`
202
202
 
203
- The id of the tabpanel, which is combined with the `Tabs` instance ID and the suffix `-view`
203
+ A unique identifier for the tabpanel, which is used to generate an instanced id for the underlying element. The value of this prop should match with the value of the `tabId` prop on the corresponding `Tabs.Tab` component.
204
204
 
205
205
  - Required: Yes
206
206
 
@@ -8,7 +8,7 @@ import * as Ariakit from '@ariakit/react';
8
8
  * WordPress dependencies
9
9
  */
10
10
  import { useInstanceId } from '@wordpress/compose';
11
- import { useLayoutEffect, useRef } from '@wordpress/element';
11
+ import { useLayoutEffect, useMemo, useRef } from '@wordpress/element';
12
12
 
13
13
  /**
14
14
  * Internal dependencies
@@ -45,7 +45,7 @@ function Tabs( {
45
45
  const isControlled = selectedTabId !== undefined;
46
46
 
47
47
  const { items, selectedId } = store.useState();
48
- const { setSelectedId } = store;
48
+ const { setSelectedId, move } = store;
49
49
 
50
50
  // Keep track of whether tabs have been populated. This is used to prevent
51
51
  // certain effects from firing too early while tab data and relevant
@@ -154,8 +154,37 @@ function Tabs( {
154
154
  setSelectedId,
155
155
  ] );
156
156
 
157
+ // In controlled mode, make sure browser focus follows the selected tab if
158
+ // the selection is changed while a tab is already being focused.
159
+ useLayoutEffect( () => {
160
+ if ( ! isControlled || ! selectOnMove ) {
161
+ return;
162
+ }
163
+ const currentItem = items.find( ( item ) => item.id === selectedId );
164
+ const activeElement = currentItem?.element?.ownerDocument.activeElement;
165
+ const tabsHasFocus = items.some( ( item ) => {
166
+ return activeElement && activeElement === item.element;
167
+ } );
168
+
169
+ if (
170
+ activeElement &&
171
+ tabsHasFocus &&
172
+ selectedId !== activeElement.id
173
+ ) {
174
+ move( selectedId );
175
+ }
176
+ }, [ isControlled, items, move, selectOnMove, selectedId ] );
177
+
178
+ const contextValue = useMemo(
179
+ () => ( {
180
+ store,
181
+ instanceId,
182
+ } ),
183
+ [ store, instanceId ]
184
+ );
185
+
157
186
  return (
158
- <TabsContext.Provider value={ { store, instanceId } }>
187
+ <TabsContext.Provider value={ contextValue }>
159
188
  { children }
160
189
  </TabsContext.Provider>
161
190
  );
@@ -164,4 +193,6 @@ function Tabs( {
164
193
  Tabs.TabList = TabList;
165
194
  Tabs.Tab = Tab;
166
195
  Tabs.TabPanel = TabPanel;
196
+ Tabs.Context = TabsContext;
197
+
167
198
  export default Tabs;
@@ -20,6 +20,14 @@ import Button from '../../button';
20
20
  const meta: Meta< typeof Tabs > = {
21
21
  title: 'Components (Experimental)/Tabs',
22
22
  component: Tabs,
23
+ subcomponents: {
24
+ // @ts-expect-error - See https://github.com/storybookjs/storybook/issues/23170
25
+ 'Tabs.TabList': Tabs.TabList,
26
+ // @ts-expect-error - See https://github.com/storybookjs/storybook/issues/23170
27
+ 'Tabs.Tab': Tabs.Tab,
28
+ // @ts-expect-error - See https://github.com/storybookjs/storybook/issues/23170
29
+ 'Tabs.TabPanel': Tabs.TabPanel,
30
+ },
23
31
  parameters: {
24
32
  actions: { argTypesRegex: '^on.*' },
25
33
  controls: { expanded: true },
@@ -32,17 +40,17 @@ const Template: StoryFn< typeof Tabs > = ( props ) => {
32
40
  return (
33
41
  <Tabs { ...props }>
34
42
  <Tabs.TabList>
35
- <Tabs.Tab id={ 'tab1' }>Tab 1</Tabs.Tab>
36
- <Tabs.Tab id={ 'tab2' }>Tab 2</Tabs.Tab>
37
- <Tabs.Tab id={ 'tab3' }>Tab 3</Tabs.Tab>
43
+ <Tabs.Tab tabId="tab1">Tab 1</Tabs.Tab>
44
+ <Tabs.Tab tabId="tab2">Tab 2</Tabs.Tab>
45
+ <Tabs.Tab tabId="tab3">Tab 3</Tabs.Tab>
38
46
  </Tabs.TabList>
39
- <Tabs.TabPanel id={ 'tab1' }>
47
+ <Tabs.TabPanel tabId="tab1">
40
48
  <p>Selected tab: Tab 1</p>
41
49
  </Tabs.TabPanel>
42
- <Tabs.TabPanel id={ 'tab2' }>
50
+ <Tabs.TabPanel tabId="tab2">
43
51
  <p>Selected tab: Tab 2</p>
44
52
  </Tabs.TabPanel>
45
- <Tabs.TabPanel id={ 'tab3' } focusable={ false }>
53
+ <Tabs.TabPanel tabId="tab3" focusable={ false }>
46
54
  <p>Selected tab: Tab 3</p>
47
55
  <p>
48
56
  This tabpanel has its <code>focusable</code> prop set to
@@ -63,19 +71,19 @@ const DisabledTabTemplate: StoryFn< typeof Tabs > = ( props ) => {
63
71
  return (
64
72
  <Tabs { ...props }>
65
73
  <Tabs.TabList>
66
- <Tabs.Tab id={ 'tab1' } disabled={ true }>
74
+ <Tabs.Tab tabId="tab1" disabled={ true }>
67
75
  Tab 1
68
76
  </Tabs.Tab>
69
- <Tabs.Tab id={ 'tab2' }>Tab 2</Tabs.Tab>
70
- <Tabs.Tab id={ 'tab3' }>Tab 3</Tabs.Tab>
77
+ <Tabs.Tab tabId="tab2">Tab 2</Tabs.Tab>
78
+ <Tabs.Tab tabId="tab3">Tab 3</Tabs.Tab>
71
79
  </Tabs.TabList>
72
- <Tabs.TabPanel id={ 'tab1' }>
80
+ <Tabs.TabPanel tabId="tab1">
73
81
  <p>Selected tab: Tab 1</p>
74
82
  </Tabs.TabPanel>
75
- <Tabs.TabPanel id={ 'tab2' }>
83
+ <Tabs.TabPanel tabId="tab2">
76
84
  <p>Selected tab: Tab 2</p>
77
85
  </Tabs.TabPanel>
78
- <Tabs.TabPanel id={ 'tab3' }>
86
+ <Tabs.TabPanel tabId="tab3">
79
87
  <p>Selected tab: Tab 3</p>
80
88
  </Tabs.TabPanel>
81
89
  </Tabs>
@@ -88,31 +96,31 @@ const WithTabIconsAndTooltipsTemplate: StoryFn< typeof Tabs > = ( props ) => {
88
96
  <Tabs { ...props }>
89
97
  <Tabs.TabList>
90
98
  <Tabs.Tab
91
- id={ 'tab1' }
99
+ tabId="tab1"
92
100
  render={
93
101
  <Button icon={ wordpress } label="Tab 1" showTooltip />
94
102
  }
95
103
  />
96
104
  <Tabs.Tab
97
- id={ 'tab2' }
105
+ tabId="tab2"
98
106
  render={
99
107
  <Button icon={ link } label="Tab 2" showTooltip />
100
108
  }
101
109
  />
102
110
  <Tabs.Tab
103
- id={ 'tab3' }
111
+ tabId="tab3"
104
112
  render={
105
113
  <Button icon={ more } label="Tab 3" showTooltip />
106
114
  }
107
115
  />
108
116
  </Tabs.TabList>
109
- <Tabs.TabPanel id={ 'tab1' }>
117
+ <Tabs.TabPanel tabId="tab1">
110
118
  <p>Selected tab: Tab 1</p>
111
119
  </Tabs.TabPanel>
112
- <Tabs.TabPanel id={ 'tab2' }>
120
+ <Tabs.TabPanel tabId="tab2">
113
121
  <p>Selected tab: Tab 2</p>
114
122
  </Tabs.TabPanel>
115
- <Tabs.TabPanel id={ 'tab3' }>
123
+ <Tabs.TabPanel tabId="tab3">
116
124
  <p>Selected tab: Tab 3</p>
117
125
  </Tabs.TabPanel>
118
126
  </Tabs>
@@ -132,18 +140,18 @@ const UsingSlotFillTemplate: StoryFn< typeof Tabs > = ( props ) => {
132
140
  <SlotFillProvider>
133
141
  <Tabs { ...props }>
134
142
  <Tabs.TabList>
135
- <Tabs.Tab id={ 'tab1' }>Tab 1</Tabs.Tab>
136
- <Tabs.Tab id={ 'tab2' }>Tab 2</Tabs.Tab>
137
- <Tabs.Tab id={ 'tab3' }>Tab 3</Tabs.Tab>
143
+ <Tabs.Tab tabId="tab1">Tab 1</Tabs.Tab>
144
+ <Tabs.Tab tabId="tab2">Tab 2</Tabs.Tab>
145
+ <Tabs.Tab tabId="tab3">Tab 3</Tabs.Tab>
138
146
  </Tabs.TabList>
139
147
  <Fill name="tabs-are-fun">
140
- <Tabs.TabPanel id={ 'tab1' }>
148
+ <Tabs.TabPanel tabId="tab1">
141
149
  <p>Selected tab: Tab 1</p>
142
150
  </Tabs.TabPanel>
143
- <Tabs.TabPanel id={ 'tab2' }>
151
+ <Tabs.TabPanel tabId="tab2">
144
152
  <p>Selected tab: Tab 2</p>
145
153
  </Tabs.TabPanel>
146
- <Tabs.TabPanel id={ 'tab3' }>
154
+ <Tabs.TabPanel tabId="tab3">
147
155
  <p>Selected tab: Tab 3</p>
148
156
  </Tabs.TabPanel>
149
157
  </Fill>
@@ -188,9 +196,9 @@ const CloseButtonTemplate: StoryFn< typeof Tabs > = ( props ) => {
188
196
  } }
189
197
  >
190
198
  <Tabs.TabList>
191
- <Tabs.Tab id={ 'tab1' }>Tab 1</Tabs.Tab>
192
- <Tabs.Tab id={ 'tab2' }>Tab 2</Tabs.Tab>
193
- <Tabs.Tab id={ 'tab3' }>Tab 3</Tabs.Tab>
199
+ <Tabs.Tab tabId="tab1">Tab 1</Tabs.Tab>
200
+ <Tabs.Tab tabId="tab2">Tab 2</Tabs.Tab>
201
+ <Tabs.Tab tabId="tab3">Tab 3</Tabs.Tab>
194
202
  </Tabs.TabList>
195
203
  <Button
196
204
  variant={ 'tertiary' }
@@ -203,13 +211,13 @@ const CloseButtonTemplate: StoryFn< typeof Tabs > = ( props ) => {
203
211
  Close Tabs
204
212
  </Button>
205
213
  </div>
206
- <Tabs.TabPanel id={ 'tab1' }>
214
+ <Tabs.TabPanel tabId="tab1">
207
215
  <p>Selected tab: Tab 1</p>
208
216
  </Tabs.TabPanel>
209
- <Tabs.TabPanel id={ 'tab2' }>
217
+ <Tabs.TabPanel tabId="tab2">
210
218
  <p>Selected tab: Tab 2</p>
211
219
  </Tabs.TabPanel>
212
- <Tabs.TabPanel id={ 'tab3' }>
220
+ <Tabs.TabPanel tabId="tab3">
213
221
  <p>Selected tab: Tab 3</p>
214
222
  </Tabs.TabPanel>
215
223
  </Tabs>
@@ -243,19 +251,19 @@ const ControlledModeTemplate: StoryFn< typeof Tabs > = ( props ) => {
243
251
  } }
244
252
  >
245
253
  <Tabs.TabList>
246
- <Tabs.Tab id={ 'tab1' }>Tab 1</Tabs.Tab>
254
+ <Tabs.Tab tabId="tab1">Tab 1</Tabs.Tab>
247
255
 
248
- <Tabs.Tab id={ 'tab2' }>Tab 2</Tabs.Tab>
256
+ <Tabs.Tab tabId="tab2">Tab 2</Tabs.Tab>
249
257
 
250
- <Tabs.Tab id={ 'tab3' }>Tab 3</Tabs.Tab>
258
+ <Tabs.Tab tabId="tab3">Tab 3</Tabs.Tab>
251
259
  </Tabs.TabList>
252
- <Tabs.TabPanel id={ 'tab1' }>
260
+ <Tabs.TabPanel tabId="tab1">
253
261
  <p>Selected tab: Tab 1</p>
254
262
  </Tabs.TabPanel>
255
- <Tabs.TabPanel id={ 'tab2' }>
263
+ <Tabs.TabPanel tabId="tab2">
256
264
  <p>Selected tab: Tab 2</p>
257
265
  </Tabs.TabPanel>
258
- <Tabs.TabPanel id={ 'tab3' }>
266
+ <Tabs.TabPanel tabId="tab3">
259
267
  <p>Selected tab: Tab 3</p>
260
268
  </Tabs.TabPanel>
261
269
  </Tabs>
@@ -306,19 +314,19 @@ const TabBecomesDisabledTemplate: StoryFn< typeof Tabs > = ( props ) => {
306
314
  </Button>
307
315
  <Tabs { ...props }>
308
316
  <Tabs.TabList>
309
- <Tabs.Tab id={ 'tab1' }>Tab 1</Tabs.Tab>
310
- <Tabs.Tab id={ 'tab2' } disabled={ disableTab2 }>
317
+ <Tabs.Tab tabId="tab1">Tab 1</Tabs.Tab>
318
+ <Tabs.Tab tabId="tab2" disabled={ disableTab2 }>
311
319
  Tab 2
312
320
  </Tabs.Tab>
313
- <Tabs.Tab id={ 'tab3' }>Tab 3</Tabs.Tab>
321
+ <Tabs.Tab tabId="tab3">Tab 3</Tabs.Tab>
314
322
  </Tabs.TabList>
315
- <Tabs.TabPanel id={ 'tab1' }>
323
+ <Tabs.TabPanel tabId="tab1">
316
324
  <p>Selected tab: Tab 1</p>
317
325
  </Tabs.TabPanel>
318
- <Tabs.TabPanel id={ 'tab2' }>
326
+ <Tabs.TabPanel tabId="tab2">
319
327
  <p>Selected tab: Tab 2</p>
320
328
  </Tabs.TabPanel>
321
- <Tabs.TabPanel id={ 'tab3' }>
329
+ <Tabs.TabPanel tabId="tab3">
322
330
  <p>Selected tab: Tab 3</p>
323
331
  </Tabs.TabPanel>
324
332
  </Tabs>
@@ -340,17 +348,17 @@ const TabGetsRemovedTemplate: StoryFn< typeof Tabs > = ( props ) => {
340
348
  </Button>
341
349
  <Tabs { ...props }>
342
350
  <Tabs.TabList>
343
- { ! removeTab1 && <Tabs.Tab id={ 'tab1' }>Tab 1</Tabs.Tab> }
344
- <Tabs.Tab id={ 'tab2' }>Tab 2</Tabs.Tab>
345
- <Tabs.Tab id={ 'tab3' }>Tab 3</Tabs.Tab>
351
+ { ! removeTab1 && <Tabs.Tab tabId="tab1">Tab 1</Tabs.Tab> }
352
+ <Tabs.Tab tabId="tab2">Tab 2</Tabs.Tab>
353
+ <Tabs.Tab tabId="tab3">Tab 3</Tabs.Tab>
346
354
  </Tabs.TabList>
347
- <Tabs.TabPanel id={ 'tab1' }>
355
+ <Tabs.TabPanel tabId="tab1">
348
356
  <p>Selected tab: Tab 1</p>
349
357
  </Tabs.TabPanel>
350
- <Tabs.TabPanel id={ 'tab2' }>
358
+ <Tabs.TabPanel tabId="tab2">
351
359
  <p>Selected tab: Tab 2</p>
352
360
  </Tabs.TabPanel>
353
- <Tabs.TabPanel id={ 'tab3' }>
361
+ <Tabs.TabPanel tabId="tab3">
354
362
  <p>Selected tab: Tab 3</p>
355
363
  </Tabs.TabPanel>
356
364
  </Tabs>
package/src/tabs/tab.tsx CHANGED
@@ -2,28 +2,28 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
 
5
- import { useContext, forwardRef } from '@wordpress/element';
5
+ import { forwardRef } from '@wordpress/element';
6
6
 
7
7
  /**
8
8
  * Internal dependencies
9
9
  */
10
10
  import type { TabProps } from './types';
11
11
  import warning from '@wordpress/warning';
12
- import { TabsContext } from './context';
12
+ import { useTabsContext } from './context';
13
13
  import { Tab as StyledTab } from './styles';
14
14
  import type { WordPressComponentProps } from '../context';
15
15
 
16
16
  export const Tab = forwardRef<
17
17
  HTMLButtonElement,
18
- WordPressComponentProps< TabProps, 'button', false >
19
- >( function Tab( { children, id, disabled, render, ...otherProps }, ref ) {
20
- const context = useContext( TabsContext );
18
+ Omit< WordPressComponentProps< TabProps, 'button', false >, 'id' >
19
+ >( function Tab( { children, tabId, disabled, render, ...otherProps }, ref ) {
20
+ const context = useTabsContext();
21
21
  if ( ! context ) {
22
- warning( '`Tabs.TabList` must be wrapped in a `Tabs` component.' );
22
+ warning( '`Tabs.Tab` must be wrapped in a `Tabs` component.' );
23
23
  return null;
24
24
  }
25
25
  const { store, instanceId } = context;
26
- const instancedTabId = `${ instanceId }-${ id }`;
26
+ const instancedTabId = `${ instanceId }-${ tabId }`;
27
27
  return (
28
28
  <StyledTab
29
29
  ref={ ref }
@@ -6,7 +6,7 @@
6
6
  * WordPress dependencies
7
7
  */
8
8
 
9
- import { forwardRef, useContext } from '@wordpress/element';
9
+ import { forwardRef } from '@wordpress/element';
10
10
 
11
11
  /**
12
12
  * Internal dependencies
@@ -15,25 +15,29 @@ import type { TabPanelProps } from './types';
15
15
  import { TabPanel as StyledTabPanel } from './styles';
16
16
 
17
17
  import warning from '@wordpress/warning';
18
- import { TabsContext } from './context';
18
+ import { useTabsContext } from './context';
19
19
  import type { WordPressComponentProps } from '../context';
20
20
 
21
21
  export const TabPanel = forwardRef<
22
22
  HTMLDivElement,
23
- WordPressComponentProps< TabPanelProps, 'div', false >
24
- >( function TabPanel( { children, id, focusable = true, ...otherProps }, ref ) {
25
- const context = useContext( TabsContext );
23
+ Omit< WordPressComponentProps< TabPanelProps, 'div', false >, 'id' >
24
+ >( function TabPanel(
25
+ { children, tabId, focusable = true, ...otherProps },
26
+ ref
27
+ ) {
28
+ const context = useTabsContext();
26
29
  if ( ! context ) {
27
30
  warning( '`Tabs.TabPanel` must be wrapped in a `Tabs` component.' );
28
31
  return null;
29
32
  }
30
33
  const { store, instanceId } = context;
34
+ const instancedTabId = `${ instanceId }-${ tabId }`;
31
35
 
32
36
  return (
33
37
  <StyledTabPanel
34
38
  ref={ ref }
35
39
  store={ store }
36
- id={ `${ instanceId }-${ id }-view` }
40
+ id={ instancedTabId }
37
41
  focusable={ focusable }
38
42
  { ...otherProps }
39
43
  >