@wordpress/components 28.10.0 → 28.12.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 (680) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/build/autocomplete/autocompleter-ui.js +2 -6
  3. package/build/autocomplete/autocompleter-ui.js.map +1 -1
  4. package/build/autocomplete/autocompleter-ui.native.js +2 -4
  5. package/build/autocomplete/autocompleter-ui.native.js.map +1 -1
  6. package/build/autocomplete/index.js +4 -5
  7. package/build/autocomplete/index.js.map +1 -1
  8. package/build/base-control/types.js.map +1 -1
  9. package/build/border-box-control/border-box-control/component.js +1 -0
  10. package/build/border-box-control/border-box-control/component.js.map +1 -1
  11. package/build/border-box-control/border-box-control/hook.js +6 -0
  12. package/build/border-box-control/border-box-control/hook.js.map +1 -1
  13. package/build/border-control/border-control/component.js +1 -0
  14. package/build/border-control/border-control/component.js.map +1 -1
  15. package/build/border-control/border-control/hook.js +6 -0
  16. package/build/border-control/border-control/hook.js.map +1 -1
  17. package/build/border-control/border-control-dropdown/component.js +13 -13
  18. package/build/border-control/border-control-dropdown/component.js.map +1 -1
  19. package/build/color-palette/index.js +1 -1
  20. package/build/color-palette/index.js.map +1 -1
  21. package/build/color-palette/index.native.js +1 -2
  22. package/build/color-palette/index.native.js.map +1 -1
  23. package/build/color-picker/index.native.js +0 -1
  24. package/build/color-picker/index.native.js.map +1 -1
  25. package/build/composite/legacy/index.js +5 -2
  26. package/build/composite/legacy/index.js.map +1 -1
  27. package/build/custom-gradient-picker/gradient-bar/control-points.js +1 -1
  28. package/build/custom-gradient-picker/gradient-bar/control-points.js.map +1 -1
  29. package/build/date-time/date/index.js +0 -1
  30. package/build/date-time/date/index.js.map +1 -1
  31. package/build/font-size-picker/index.native.js +6 -6
  32. package/build/font-size-picker/index.native.js.map +1 -1
  33. package/build/form-file-upload/index.js +5 -1
  34. package/build/form-file-upload/index.js.map +1 -1
  35. package/build/form-token-field/index.js +0 -3
  36. package/build/form-token-field/index.js.map +1 -1
  37. package/build/form-token-field/suggestions-list.js +7 -3
  38. package/build/form-token-field/suggestions-list.js.map +1 -1
  39. package/build/form-token-field/token.js +1 -0
  40. package/build/form-token-field/token.js.map +1 -1
  41. package/build/guide/page-control.js +1 -0
  42. package/build/guide/page-control.js.map +1 -1
  43. package/build/{dropdown-menu-v2 → menu}/checkbox-item.js +8 -8
  44. package/build/menu/checkbox-item.js.map +1 -0
  45. package/build/{dropdown-menu-v2 → menu}/context.js +2 -2
  46. package/build/menu/context.js.map +1 -0
  47. package/build/{dropdown-menu-v2 → menu}/group-label.js +5 -5
  48. package/build/menu/group-label.js.map +1 -0
  49. package/build/{dropdown-menu-v2 → menu}/group.js +5 -5
  50. package/build/menu/group.js.map +1 -0
  51. package/build/{dropdown-menu-v2 → menu}/index.js +38 -38
  52. package/build/menu/index.js.map +1 -0
  53. package/build/{dropdown-menu-v2 → menu}/item-help-text.js +3 -3
  54. package/build/menu/item-help-text.js.map +1 -0
  55. package/build/{dropdown-menu-v2 → menu}/item-label.js +3 -3
  56. package/build/menu/item-label.js.map +1 -0
  57. package/build/{dropdown-menu-v2 → menu}/item.js +7 -7
  58. package/build/menu/item.js.map +1 -0
  59. package/build/{dropdown-menu-v2 → menu}/radio-item.js +8 -8
  60. package/build/menu/radio-item.js.map +1 -0
  61. package/build/{dropdown-menu-v2 → menu}/separator.js +6 -6
  62. package/build/menu/separator.js.map +1 -0
  63. package/build/menu/styles.js +150 -0
  64. package/build/menu/styles.js.map +1 -0
  65. package/build/menu/types.js.map +1 -0
  66. package/build/menu/use-temporary-focus-visible-fix.js.map +1 -0
  67. package/build/menu-item/index.js +1 -0
  68. package/build/menu-item/index.js.map +1 -1
  69. package/build/mobile/bottom-sheet/bottom-sheet-navigation/navigation-screen.native.js +3 -5
  70. package/build/mobile/bottom-sheet/bottom-sheet-navigation/navigation-screen.native.js.map +1 -1
  71. package/build/mobile/bottom-sheet/range-cell.native.js +1 -1
  72. package/build/mobile/bottom-sheet/range-cell.native.js.map +1 -1
  73. package/build/mobile/bottom-sheet/stepper-cell/index.native.js +1 -1
  74. package/build/mobile/bottom-sheet/stepper-cell/index.native.js.map +1 -1
  75. package/build/mobile/bottom-sheet/sub-sheet/index.native.js +1 -3
  76. package/build/mobile/bottom-sheet/sub-sheet/index.native.js.map +1 -1
  77. package/build/mobile/bottom-sheet-select-control/index.native.js +2 -2
  78. package/build/mobile/bottom-sheet-select-control/index.native.js.map +1 -1
  79. package/build/mobile/color-settings/index.native.js +1 -3
  80. package/build/mobile/color-settings/index.native.js.map +1 -1
  81. package/build/mobile/color-settings/picker-screen.native.js +1 -3
  82. package/build/mobile/color-settings/picker-screen.native.js.map +1 -1
  83. package/build/mobile/image/index.native.js +1 -3
  84. package/build/mobile/image/index.native.js.map +1 -1
  85. package/build/mobile/keyboard-avoiding-view/index.ios.js +1 -3
  86. package/build/mobile/keyboard-avoiding-view/index.ios.js.map +1 -1
  87. package/build/mobile/link-picker/link-picker-results.native.js +2 -5
  88. package/build/mobile/link-picker/link-picker-results.native.js.map +1 -1
  89. package/build/mobile/link-picker/link-picker-screen.native.js +1 -3
  90. package/build/mobile/link-picker/link-picker-screen.native.js.map +1 -1
  91. package/build/mobile/link-settings/index.native.js +6 -18
  92. package/build/mobile/link-settings/index.native.js.map +1 -1
  93. package/build/mobile/link-settings/link-settings-screen.native.js +1 -3
  94. package/build/mobile/link-settings/link-settings-screen.native.js.map +1 -1
  95. package/build/mobile/segmented-control/index.native.js +2 -6
  96. package/build/mobile/segmented-control/index.native.js.map +1 -1
  97. package/build/mobile/utils/use-unit-converter-to-mobile.native.js +2 -6
  98. package/build/mobile/utils/use-unit-converter-to-mobile.native.js.map +1 -1
  99. package/build/navigation/index.js +1 -2
  100. package/build/navigation/index.js.map +1 -1
  101. package/build/navigation/item/use-navigation-tree-item.js +2 -2
  102. package/build/navigation/item/use-navigation-tree-item.js.map +1 -1
  103. package/build/navigation/menu/menu-title-search.js +2 -2
  104. package/build/navigation/menu/menu-title-search.js.map +1 -1
  105. package/build/navigation/menu/use-navigation-tree-menu.js +2 -2
  106. package/build/navigation/menu/use-navigation-tree-menu.js.map +1 -1
  107. package/build/notice/index.js +2 -0
  108. package/build/notice/index.js.map +1 -1
  109. package/build/palette-edit/index.js +9 -2
  110. package/build/palette-edit/index.js.map +1 -1
  111. package/build/palette-edit/styles.js +13 -28
  112. package/build/palette-edit/styles.js.map +1 -1
  113. package/build/panel/body.js +1 -0
  114. package/build/panel/body.js.map +1 -1
  115. package/build/popover/index.js +4 -1
  116. package/build/popover/index.js.map +1 -1
  117. package/build/private-apis.js +4 -4
  118. package/build/private-apis.js.map +1 -1
  119. package/build/radio-group/index.js +3 -1
  120. package/build/radio-group/index.js.map +1 -1
  121. package/build/radio-group/radio.js +6 -0
  122. package/build/radio-group/radio.js.map +1 -1
  123. package/build/radio-group/types.js.map +1 -1
  124. package/build/sandbox/index.js +3 -6
  125. package/build/sandbox/index.js.map +1 -1
  126. package/build/sandbox/index.native.js +1 -3
  127. package/build/sandbox/index.native.js.map +1 -1
  128. package/build/search-control/index.native.js +1 -3
  129. package/build/search-control/index.native.js.map +1 -1
  130. package/build/slot-fill/bubbles-virtually/slot.js +1 -2
  131. package/build/slot-fill/bubbles-virtually/slot.js.map +1 -1
  132. package/build/slot-fill/fill.js +3 -6
  133. package/build/slot-fill/fill.js.map +1 -1
  134. package/build/snackbar/index.js +2 -1
  135. package/build/snackbar/index.js.map +1 -1
  136. package/build/spacer/hook.js +5 -3
  137. package/build/spacer/hook.js.map +1 -1
  138. package/build/tab-panel/index.js +4 -1
  139. package/build/tab-panel/index.js.map +1 -1
  140. package/build/tabs/index.js +48 -113
  141. package/build/tabs/index.js.map +1 -1
  142. package/build/tabs/styles.js +12 -12
  143. package/build/tabs/styles.js.map +1 -1
  144. package/build/tabs/tab.js +23 -6
  145. package/build/tabs/tab.js.map +1 -1
  146. package/build/tabs/tablist.js +37 -14
  147. package/build/tabs/tablist.js.map +1 -1
  148. package/build/tabs/types.js.map +1 -1
  149. package/build/toggle-group-control/toggle-group-control/component.js +3 -2
  150. package/build/toggle-group-control/toggle-group-control/component.js.map +1 -1
  151. package/build/toolbar/toolbar/index.js +3 -0
  152. package/build/toolbar/toolbar/index.js.map +1 -1
  153. package/build/tools-panel/tools-panel-header/component.js +1 -1
  154. package/build/tools-panel/tools-panel-header/component.js.map +1 -1
  155. package/build/tools-panel/tools-panel-item/hook.js +0 -2
  156. package/build/tools-panel/tools-panel-item/hook.js.map +1 -1
  157. package/build/tooltip/index.native.js +5 -15
  158. package/build/tooltip/index.native.js.map +1 -1
  159. package/build/unit-control/index.native.js +2 -6
  160. package/build/unit-control/index.native.js.map +1 -1
  161. package/build/utils/deprecated-36px-size.js +27 -0
  162. package/build/utils/deprecated-36px-size.js.map +1 -0
  163. package/build/utils/element-rect.js +13 -2
  164. package/build/utils/element-rect.js.map +1 -1
  165. package/build/utils/hooks/use-animated-offset-rect.js +3 -2
  166. package/build/utils/hooks/use-animated-offset-rect.js.map +1 -1
  167. package/build/utils/hooks/use-update-effect.js +0 -2
  168. package/build/utils/hooks/use-update-effect.js.map +1 -1
  169. package/build-module/autocomplete/autocompleter-ui.js +2 -6
  170. package/build-module/autocomplete/autocompleter-ui.js.map +1 -1
  171. package/build-module/autocomplete/autocompleter-ui.native.js +2 -4
  172. package/build-module/autocomplete/autocompleter-ui.native.js.map +1 -1
  173. package/build-module/autocomplete/index.js +4 -5
  174. package/build-module/autocomplete/index.js.map +1 -1
  175. package/build-module/base-control/types.js.map +1 -1
  176. package/build-module/border-box-control/border-box-control/component.js +1 -0
  177. package/build-module/border-box-control/border-box-control/component.js.map +1 -1
  178. package/build-module/border-box-control/border-box-control/hook.js +6 -0
  179. package/build-module/border-box-control/border-box-control/hook.js.map +1 -1
  180. package/build-module/border-control/border-control/component.js +1 -0
  181. package/build-module/border-control/border-control/component.js.map +1 -1
  182. package/build-module/border-control/border-control/hook.js +7 -0
  183. package/build-module/border-control/border-control/hook.js.map +1 -1
  184. package/build-module/border-control/border-control-dropdown/component.js +13 -13
  185. package/build-module/border-control/border-control-dropdown/component.js.map +1 -1
  186. package/build-module/color-palette/index.js +1 -1
  187. package/build-module/color-palette/index.js.map +1 -1
  188. package/build-module/color-palette/index.native.js +1 -2
  189. package/build-module/color-palette/index.native.js.map +1 -1
  190. package/build-module/color-picker/index.native.js +0 -1
  191. package/build-module/color-picker/index.native.js.map +1 -1
  192. package/build-module/composite/legacy/index.js +5 -2
  193. package/build-module/composite/legacy/index.js.map +1 -1
  194. package/build-module/custom-gradient-picker/gradient-bar/control-points.js +1 -1
  195. package/build-module/custom-gradient-picker/gradient-bar/control-points.js.map +1 -1
  196. package/build-module/date-time/date/index.js +0 -1
  197. package/build-module/date-time/date/index.js.map +1 -1
  198. package/build-module/font-size-picker/index.native.js +7 -7
  199. package/build-module/font-size-picker/index.native.js.map +1 -1
  200. package/build-module/form-file-upload/index.js +5 -1
  201. package/build-module/form-file-upload/index.js.map +1 -1
  202. package/build-module/form-token-field/index.js +0 -3
  203. package/build-module/form-token-field/index.js.map +1 -1
  204. package/build-module/form-token-field/suggestions-list.js +7 -3
  205. package/build-module/form-token-field/suggestions-list.js.map +1 -1
  206. package/build-module/form-token-field/token.js +1 -0
  207. package/build-module/form-token-field/token.js.map +1 -1
  208. package/build-module/guide/page-control.js +1 -0
  209. package/build-module/guide/page-control.js.map +1 -1
  210. package/build-module/{dropdown-menu-v2 → menu}/checkbox-item.js +8 -8
  211. package/build-module/menu/checkbox-item.js.map +1 -0
  212. package/build-module/{dropdown-menu-v2 → menu}/context.js +1 -1
  213. package/build-module/menu/context.js.map +1 -0
  214. package/build-module/{dropdown-menu-v2 → menu}/group-label.js +5 -5
  215. package/build-module/menu/group-label.js.map +1 -0
  216. package/build-module/menu/group.js +21 -0
  217. package/build-module/menu/group.js.map +1 -0
  218. package/build-module/{dropdown-menu-v2 → menu}/index.js +46 -46
  219. package/build-module/menu/index.js.map +1 -0
  220. package/build-module/{dropdown-menu-v2 → menu}/item-help-text.js +2 -2
  221. package/build-module/menu/item-help-text.js.map +1 -0
  222. package/build-module/{dropdown-menu-v2 → menu}/item-label.js +2 -2
  223. package/build-module/menu/item-label.js.map +1 -0
  224. package/build-module/{dropdown-menu-v2 → menu}/item.js +7 -7
  225. package/build-module/menu/item.js.map +1 -0
  226. package/build-module/{dropdown-menu-v2 → menu}/radio-item.js +8 -8
  227. package/build-module/menu/radio-item.js.map +1 -0
  228. package/build-module/menu/separator.js +22 -0
  229. package/build-module/menu/separator.js.map +1 -0
  230. package/build-module/menu/styles.js +143 -0
  231. package/build-module/menu/styles.js.map +1 -0
  232. package/build-module/menu/types.js.map +1 -0
  233. package/build-module/menu/use-temporary-focus-visible-fix.js.map +1 -0
  234. package/build-module/menu-item/index.js +1 -0
  235. package/build-module/menu-item/index.js.map +1 -1
  236. package/build-module/mobile/bottom-sheet/bottom-sheet-navigation/navigation-screen.native.js +3 -5
  237. package/build-module/mobile/bottom-sheet/bottom-sheet-navigation/navigation-screen.native.js.map +1 -1
  238. package/build-module/mobile/bottom-sheet/range-cell.native.js +1 -1
  239. package/build-module/mobile/bottom-sheet/range-cell.native.js.map +1 -1
  240. package/build-module/mobile/bottom-sheet/stepper-cell/index.native.js +1 -1
  241. package/build-module/mobile/bottom-sheet/stepper-cell/index.native.js.map +1 -1
  242. package/build-module/mobile/bottom-sheet/sub-sheet/index.native.js +1 -3
  243. package/build-module/mobile/bottom-sheet/sub-sheet/index.native.js.map +1 -1
  244. package/build-module/mobile/bottom-sheet-select-control/index.native.js +2 -2
  245. package/build-module/mobile/bottom-sheet-select-control/index.native.js.map +1 -1
  246. package/build-module/mobile/color-settings/index.native.js +1 -3
  247. package/build-module/mobile/color-settings/index.native.js.map +1 -1
  248. package/build-module/mobile/color-settings/picker-screen.native.js +1 -3
  249. package/build-module/mobile/color-settings/picker-screen.native.js.map +1 -1
  250. package/build-module/mobile/image/index.native.js +1 -3
  251. package/build-module/mobile/image/index.native.js.map +1 -1
  252. package/build-module/mobile/keyboard-avoiding-view/index.ios.js +1 -3
  253. package/build-module/mobile/keyboard-avoiding-view/index.ios.js.map +1 -1
  254. package/build-module/mobile/link-picker/link-picker-results.native.js +2 -5
  255. package/build-module/mobile/link-picker/link-picker-results.native.js.map +1 -1
  256. package/build-module/mobile/link-picker/link-picker-screen.native.js +1 -3
  257. package/build-module/mobile/link-picker/link-picker-screen.native.js.map +1 -1
  258. package/build-module/mobile/link-settings/index.native.js +6 -18
  259. package/build-module/mobile/link-settings/index.native.js.map +1 -1
  260. package/build-module/mobile/link-settings/link-settings-screen.native.js +1 -3
  261. package/build-module/mobile/link-settings/link-settings-screen.native.js.map +1 -1
  262. package/build-module/mobile/segmented-control/index.native.js +2 -6
  263. package/build-module/mobile/segmented-control/index.native.js.map +1 -1
  264. package/build-module/mobile/utils/use-unit-converter-to-mobile.native.js +2 -6
  265. package/build-module/mobile/utils/use-unit-converter-to-mobile.native.js.map +1 -1
  266. package/build-module/navigation/index.js +1 -2
  267. package/build-module/navigation/index.js.map +1 -1
  268. package/build-module/navigation/item/use-navigation-tree-item.js +2 -2
  269. package/build-module/navigation/item/use-navigation-tree-item.js.map +1 -1
  270. package/build-module/navigation/menu/menu-title-search.js +2 -2
  271. package/build-module/navigation/menu/menu-title-search.js.map +1 -1
  272. package/build-module/navigation/menu/use-navigation-tree-menu.js +2 -2
  273. package/build-module/navigation/menu/use-navigation-tree-menu.js.map +1 -1
  274. package/build-module/notice/index.js +2 -0
  275. package/build-module/notice/index.js.map +1 -1
  276. package/build-module/palette-edit/index.js +11 -4
  277. package/build-module/palette-edit/index.js.map +1 -1
  278. package/build-module/palette-edit/styles.js +13 -29
  279. package/build-module/palette-edit/styles.js.map +1 -1
  280. package/build-module/panel/body.js +1 -0
  281. package/build-module/panel/body.js.map +1 -1
  282. package/build-module/popover/index.js +4 -1
  283. package/build-module/popover/index.js.map +1 -1
  284. package/build-module/private-apis.js +3 -3
  285. package/build-module/private-apis.js.map +1 -1
  286. package/build-module/radio-group/index.js +3 -1
  287. package/build-module/radio-group/index.js.map +1 -1
  288. package/build-module/radio-group/radio.js +6 -0
  289. package/build-module/radio-group/radio.js.map +1 -1
  290. package/build-module/radio-group/types.js.map +1 -1
  291. package/build-module/sandbox/index.js +3 -6
  292. package/build-module/sandbox/index.js.map +1 -1
  293. package/build-module/sandbox/index.native.js +1 -3
  294. package/build-module/sandbox/index.native.js.map +1 -1
  295. package/build-module/search-control/index.native.js +1 -3
  296. package/build-module/search-control/index.native.js.map +1 -1
  297. package/build-module/slot-fill/bubbles-virtually/slot.js +1 -2
  298. package/build-module/slot-fill/bubbles-virtually/slot.js.map +1 -1
  299. package/build-module/slot-fill/fill.js +3 -6
  300. package/build-module/slot-fill/fill.js.map +1 -1
  301. package/build-module/snackbar/index.js +2 -1
  302. package/build-module/snackbar/index.js.map +1 -1
  303. package/build-module/spacer/hook.js +5 -3
  304. package/build-module/spacer/hook.js.map +1 -1
  305. package/build-module/tab-panel/index.js +4 -1
  306. package/build-module/tab-panel/index.js.map +1 -1
  307. package/build-module/tabs/index.js +47 -112
  308. package/build-module/tabs/index.js.map +1 -1
  309. package/build-module/tabs/styles.js +11 -11
  310. package/build-module/tabs/styles.js.map +1 -1
  311. package/build-module/tabs/tab.js +21 -6
  312. package/build-module/tabs/tab.js.map +1 -1
  313. package/build-module/tabs/tablist.js +37 -14
  314. package/build-module/tabs/tablist.js.map +1 -1
  315. package/build-module/tabs/types.js.map +1 -1
  316. package/build-module/toggle-group-control/toggle-group-control/component.js +3 -2
  317. package/build-module/toggle-group-control/toggle-group-control/component.js.map +1 -1
  318. package/build-module/toolbar/toolbar/index.js +3 -0
  319. package/build-module/toolbar/toolbar/index.js.map +1 -1
  320. package/build-module/tools-panel/tools-panel-header/component.js +1 -1
  321. package/build-module/tools-panel/tools-panel-header/component.js.map +1 -1
  322. package/build-module/tools-panel/tools-panel-item/hook.js +0 -2
  323. package/build-module/tools-panel/tools-panel-item/hook.js.map +1 -1
  324. package/build-module/tooltip/index.native.js +5 -15
  325. package/build-module/tooltip/index.native.js.map +1 -1
  326. package/build-module/unit-control/index.native.js +2 -6
  327. package/build-module/unit-control/index.native.js.map +1 -1
  328. package/build-module/utils/deprecated-36px-size.js +19 -0
  329. package/build-module/utils/deprecated-36px-size.js.map +1 -0
  330. package/build-module/utils/element-rect.js +13 -2
  331. package/build-module/utils/element-rect.js.map +1 -1
  332. package/build-module/utils/hooks/use-animated-offset-rect.js +3 -2
  333. package/build-module/utils/hooks/use-animated-offset-rect.js.map +1 -1
  334. package/build-module/utils/hooks/use-update-effect.js +0 -2
  335. package/build-module/utils/hooks/use-update-effect.js.map +1 -1
  336. package/build-style/style-rtl.css +21 -35
  337. package/build-style/style.css +21 -35
  338. package/build-types/animate/stories/index.story.d.ts.map +1 -1
  339. package/build-types/autocomplete/autocompleter-ui.d.ts.map +1 -1
  340. package/build-types/autocomplete/index.d.ts.map +1 -1
  341. package/build-types/base-control/stories/index.story.d.ts.map +1 -1
  342. package/build-types/base-control/types.d.ts +3 -0
  343. package/build-types/base-control/types.d.ts.map +1 -1
  344. package/build-types/border-box-control/border-box-control/component.d.ts +1 -0
  345. package/build-types/border-box-control/border-box-control/component.d.ts.map +1 -1
  346. package/build-types/border-box-control/border-box-control/hook.d.ts.map +1 -1
  347. package/build-types/border-control/border-control/component.d.ts +1 -0
  348. package/build-types/border-control/border-control/component.d.ts.map +1 -1
  349. package/build-types/border-control/border-control/hook.d.ts.map +1 -1
  350. package/build-types/border-control/border-control-dropdown/component.d.ts.map +1 -1
  351. package/build-types/border-control/stories/index.story.d.ts.map +1 -1
  352. package/build-types/button/stories/index.story.d.ts.map +1 -1
  353. package/build-types/card/stories/index.story.d.ts.map +1 -1
  354. package/build-types/composite/legacy/index.d.ts.map +1 -1
  355. package/build-types/composite/stories/index.story.d.ts.map +1 -1
  356. package/build-types/confirm-dialog/stories/index.story.d.ts.map +1 -1
  357. package/build-types/date-time/date/index.d.ts.map +1 -1
  358. package/build-types/disabled/stories/index.story.d.ts.map +1 -1
  359. package/build-types/draggable/stories/index.story.d.ts.map +1 -1
  360. package/build-types/dropdown/stories/index.story.d.ts.map +1 -1
  361. package/build-types/external-link/stories/index.story.d.ts.map +1 -1
  362. package/build-types/form-file-upload/index.d.ts.map +1 -1
  363. package/build-types/form-token-field/index.d.ts.map +1 -1
  364. package/build-types/form-token-field/suggestions-list.d.ts.map +1 -1
  365. package/build-types/form-token-field/token.d.ts.map +1 -1
  366. package/build-types/guide/page-control.d.ts.map +1 -1
  367. package/build-types/heading/stories/index.story.d.ts.map +1 -1
  368. package/build-types/item-group/stories/index.story.d.ts +1 -1
  369. package/build-types/item-group/stories/index.story.d.ts.map +1 -1
  370. package/build-types/keyboard-shortcuts/stories/index.story.d.ts.map +1 -1
  371. package/build-types/lock-unlock.d.ts +2 -2
  372. package/build-types/menu/checkbox-item.d.ts +3 -0
  373. package/build-types/menu/checkbox-item.d.ts.map +1 -0
  374. package/build-types/menu/context.d.ts +6 -0
  375. package/build-types/menu/context.d.ts.map +1 -0
  376. package/build-types/menu/group-label.d.ts +3 -0
  377. package/build-types/menu/group-label.d.ts.map +1 -0
  378. package/build-types/menu/group.d.ts +3 -0
  379. package/build-types/menu/group.d.ts.map +1 -0
  380. package/build-types/menu/index.d.ts +40 -0
  381. package/build-types/menu/index.d.ts.map +1 -0
  382. package/build-types/{dropdown-menu-v2 → menu}/item-help-text.d.ts +1 -1
  383. package/build-types/menu/item-help-text.d.ts.map +1 -0
  384. package/build-types/{dropdown-menu-v2 → menu}/item-label.d.ts +1 -1
  385. package/build-types/menu/item-label.d.ts.map +1 -0
  386. package/build-types/menu/item.d.ts +3 -0
  387. package/build-types/menu/item.d.ts.map +1 -0
  388. package/build-types/menu/radio-item.d.ts +3 -0
  389. package/build-types/menu/radio-item.d.ts.map +1 -0
  390. package/build-types/menu/separator.d.ts +3 -0
  391. package/build-types/menu/separator.d.ts.map +1 -0
  392. package/build-types/menu/stories/index.story.d.ts +16 -0
  393. package/build-types/menu/stories/index.story.d.ts.map +1 -0
  394. package/build-types/{dropdown-menu-v2 → menu}/styles.d.ts +13 -13
  395. package/build-types/menu/styles.d.ts.map +1 -0
  396. package/build-types/menu/test/index.d.ts.map +1 -0
  397. package/build-types/{dropdown-menu-v2 → menu}/types.d.ts +22 -21
  398. package/build-types/menu/types.d.ts.map +1 -0
  399. package/build-types/menu/use-temporary-focus-visible-fix.d.ts.map +1 -0
  400. package/build-types/menu-item/index.d.ts.map +1 -1
  401. package/build-types/modal/stories/index.story.d.ts.map +1 -1
  402. package/build-types/navigable-container/stories/navigable-menu.story.d.ts.map +1 -1
  403. package/build-types/navigable-container/stories/tabbable-container.story.d.ts.map +1 -1
  404. package/build-types/navigation/index.d.ts.map +1 -1
  405. package/build-types/navigator/stories/index.story.d.ts.map +1 -1
  406. package/build-types/notice/index.d.ts.map +1 -1
  407. package/build-types/notice/stories/index.story.d.ts.map +1 -1
  408. package/build-types/palette-edit/index.d.ts.map +1 -1
  409. package/build-types/palette-edit/styles.d.ts +0 -256
  410. package/build-types/palette-edit/styles.d.ts.map +1 -1
  411. package/build-types/panel/body.d.ts.map +1 -1
  412. package/build-types/panel/stories/index.story.d.ts.map +1 -1
  413. package/build-types/popover/index.d.ts.map +1 -1
  414. package/build-types/popover/stories/index.story.d.ts.map +1 -1
  415. package/build-types/progress-bar/stories/index.story.d.ts.map +1 -1
  416. package/build-types/radio-group/index.d.ts.map +1 -1
  417. package/build-types/radio-group/radio.d.ts +4 -2
  418. package/build-types/radio-group/radio.d.ts.map +1 -1
  419. package/build-types/radio-group/stories/index.story.d.ts.map +1 -1
  420. package/build-types/radio-group/types.d.ts +5 -1
  421. package/build-types/radio-group/types.d.ts.map +1 -1
  422. package/build-types/resizable-box/stories/index.story.d.ts.map +1 -1
  423. package/build-types/sandbox/index.d.ts.map +1 -1
  424. package/build-types/sandbox/stories/index.story.d.ts.map +1 -1
  425. package/build-types/scroll-lock/stories/index.story.d.ts.map +1 -1
  426. package/build-types/shortcut/stories/index.story.d.ts.map +1 -1
  427. package/build-types/slot-fill/bubbles-virtually/slot.d.ts.map +1 -1
  428. package/build-types/slot-fill/fill.d.ts.map +1 -1
  429. package/build-types/slot-fill/stories/index.story.d.ts.map +1 -1
  430. package/build-types/snackbar/index.d.ts.map +1 -1
  431. package/build-types/snackbar/stories/index.story.d.ts.map +1 -1
  432. package/build-types/snackbar/stories/list.story.d.ts.map +1 -1
  433. package/build-types/spacer/hook.d.ts.map +1 -1
  434. package/build-types/spinner/stories/index.story.d.ts.map +1 -1
  435. package/build-types/tab-panel/index.d.ts.map +1 -1
  436. package/build-types/tab-panel/stories/index.story.d.ts.map +1 -1
  437. package/build-types/tabs/index.d.ts +21 -8
  438. package/build-types/tabs/index.d.ts.map +1 -1
  439. package/build-types/tabs/stories/index.story.d.ts +1 -1
  440. package/build-types/tabs/stories/index.story.d.ts.map +1 -1
  441. package/build-types/tabs/styles.d.ts +6 -3
  442. package/build-types/tabs/styles.d.ts.map +1 -1
  443. package/build-types/tabs/tab.d.ts +0 -3
  444. package/build-types/tabs/tab.d.ts.map +1 -1
  445. package/build-types/tabs/tablist.d.ts.map +1 -1
  446. package/build-types/tabs/types.d.ts +85 -48
  447. package/build-types/tabs/types.d.ts.map +1 -1
  448. package/build-types/text/stories/index.story.d.ts.map +1 -1
  449. package/build-types/text-highlight/stories/index.story.d.ts.map +1 -1
  450. package/build-types/theme/stories/index.story.d.ts.map +1 -1
  451. package/build-types/tip/stories/index.story.d.ts.map +1 -1
  452. package/build-types/toggle-group-control/toggle-group-control/component.d.ts.map +1 -1
  453. package/build-types/toolbar/toolbar/index.d.ts.map +1 -1
  454. package/build-types/tools-panel/tools-panel-item/hook.d.ts.map +1 -1
  455. package/build-types/tooltip/stories/index.story.d.ts.map +1 -1
  456. package/build-types/tree-grid/stories/index.story.d.ts.map +1 -1
  457. package/build-types/truncate/stories/index.story.d.ts.map +1 -1
  458. package/build-types/utils/deprecated-36px-size.d.ts +6 -0
  459. package/build-types/utils/deprecated-36px-size.d.ts.map +1 -0
  460. package/build-types/utils/element-rect.d.ts +1 -1
  461. package/build-types/utils/element-rect.d.ts.map +1 -1
  462. package/build-types/utils/hooks/use-animated-offset-rect.d.ts +8 -1
  463. package/build-types/utils/hooks/use-animated-offset-rect.d.ts.map +1 -1
  464. package/build-types/utils/hooks/use-update-effect.d.ts.map +1 -1
  465. package/build-types/visually-hidden/stories/index.story.d.ts.map +1 -1
  466. package/package.json +21 -20
  467. package/src/alignment-matrix-control/README.md +1 -2
  468. package/src/angle-picker-control/README.md +1 -2
  469. package/src/animate/stories/index.story.tsx +2 -1
  470. package/src/autocomplete/autocompleter-ui.native.js +2 -4
  471. package/src/autocomplete/autocompleter-ui.tsx +2 -6
  472. package/src/autocomplete/index.tsx +4 -5
  473. package/src/base-control/README.md +58 -47
  474. package/src/base-control/docs-manifest.json +12 -0
  475. package/src/base-control/stories/index.story.tsx +4 -0
  476. package/src/base-control/types.ts +3 -0
  477. package/src/border-box-control/border-box-control/README.md +1 -0
  478. package/src/border-box-control/border-box-control/component.tsx +1 -0
  479. package/src/border-box-control/border-box-control/hook.ts +7 -0
  480. package/src/border-box-control/stories/index.story.tsx +1 -0
  481. package/src/border-box-control/test/index.tsx +1 -0
  482. package/src/border-control/border-control/README.md +1 -0
  483. package/src/border-control/border-control/component.tsx +1 -0
  484. package/src/border-control/border-control/hook.ts +7 -1
  485. package/src/border-control/border-control-dropdown/component.tsx +25 -13
  486. package/src/border-control/stories/index.story.tsx +1 -0
  487. package/src/border-control/test/index.js +1 -0
  488. package/src/button/stories/index.story.tsx +2 -1
  489. package/src/card/stories/index.story.tsx +2 -1
  490. package/src/color-palette/index.native.js +1 -2
  491. package/src/color-palette/index.tsx +1 -1
  492. package/src/color-palette/style.scss +2 -4
  493. package/src/color-picker/index.native.js +0 -1
  494. package/src/composite/legacy/index.tsx +5 -2
  495. package/src/composite/stories/index.story.tsx +2 -1
  496. package/src/confirm-dialog/stories/index.story.tsx +2 -1
  497. package/src/custom-gradient-picker/gradient-bar/control-points.tsx +1 -1
  498. package/src/date-time/date/index.tsx +0 -1
  499. package/src/disabled/stories/index.story.tsx +2 -1
  500. package/src/draggable/stories/index.story.tsx +2 -1
  501. package/src/dropdown/stories/index.story.tsx +2 -1
  502. package/src/external-link/stories/index.story.tsx +2 -1
  503. package/src/font-size-picker/index.native.js +7 -7
  504. package/src/form-file-upload/index.tsx +7 -1
  505. package/src/form-token-field/index.tsx +0 -3
  506. package/src/form-token-field/style.scss +12 -13
  507. package/src/form-token-field/suggestions-list.tsx +6 -0
  508. package/src/form-token-field/token.tsx +1 -0
  509. package/src/guide/page-control.tsx +1 -0
  510. package/src/guide/style.scss +4 -6
  511. package/src/heading/stories/index.story.tsx +2 -1
  512. package/src/item-group/stories/index.story.tsx +8 -4
  513. package/src/keyboard-shortcuts/stories/index.story.tsx +2 -1
  514. package/src/{dropdown-menu-v2 → menu}/README.md +34 -34
  515. package/src/{dropdown-menu-v2 → menu}/checkbox-item.tsx +14 -14
  516. package/src/menu/context.tsx +13 -0
  517. package/src/{dropdown-menu-v2 → menu}/group-label.tsx +8 -8
  518. package/src/menu/group.tsx +26 -0
  519. package/src/{dropdown-menu-v2 → menu}/index.tsx +65 -70
  520. package/src/{dropdown-menu-v2 → menu}/item-help-text.tsx +3 -7
  521. package/src/{dropdown-menu-v2 → menu}/item-label.tsx +3 -7
  522. package/src/{dropdown-menu-v2 → menu}/item.tsx +13 -13
  523. package/src/{dropdown-menu-v2 → menu}/radio-item.tsx +14 -14
  524. package/src/menu/separator.tsx +27 -0
  525. package/src/menu/stories/index.story.tsx +543 -0
  526. package/src/{dropdown-menu-v2 → menu}/styles.ts +17 -17
  527. package/src/{dropdown-menu-v2 → menu}/test/index.tsx +145 -225
  528. package/src/{dropdown-menu-v2 → menu}/types.ts +24 -23
  529. package/src/menu-item/index.tsx +1 -0
  530. package/src/menu-item/test/__snapshots__/index.js.snap +4 -4
  531. package/src/mobile/bottom-sheet/bottom-sheet-navigation/navigation-screen.native.js +3 -5
  532. package/src/mobile/bottom-sheet/range-cell.native.js +1 -1
  533. package/src/mobile/bottom-sheet/stepper-cell/index.native.js +1 -1
  534. package/src/mobile/bottom-sheet/sub-sheet/index.native.js +1 -3
  535. package/src/mobile/bottom-sheet-select-control/index.native.js +2 -2
  536. package/src/mobile/color-settings/index.native.js +1 -3
  537. package/src/mobile/color-settings/picker-screen.native.js +1 -3
  538. package/src/mobile/image/index.native.js +1 -3
  539. package/src/mobile/keyboard-avoiding-view/index.ios.js +1 -3
  540. package/src/mobile/link-picker/link-picker-results.native.js +2 -5
  541. package/src/mobile/link-picker/link-picker-screen.native.js +1 -3
  542. package/src/mobile/link-settings/index.native.js +6 -18
  543. package/src/mobile/link-settings/link-settings-screen.native.js +1 -3
  544. package/src/mobile/segmented-control/index.native.js +2 -6
  545. package/src/mobile/utils/use-unit-converter-to-mobile.native.js +2 -6
  546. package/src/modal/stories/index.story.tsx +2 -1
  547. package/src/navigable-container/stories/navigable-menu.story.tsx +2 -1
  548. package/src/navigable-container/stories/tabbable-container.story.tsx +2 -1
  549. package/src/navigation/index.tsx +1 -2
  550. package/src/navigation/item/use-navigation-tree-item.tsx +2 -2
  551. package/src/navigation/menu/menu-title-search.tsx +2 -2
  552. package/src/navigation/menu/use-navigation-tree-menu.tsx +2 -2
  553. package/src/navigator/stories/index.story.tsx +2 -1
  554. package/src/notice/index.tsx +2 -0
  555. package/src/notice/stories/index.story.tsx +7 -2
  556. package/src/notice/test/__snapshots__/index.tsx.snap +4 -4
  557. package/src/palette-edit/index.tsx +9 -5
  558. package/src/palette-edit/styles.ts +1 -67
  559. package/src/panel/body.tsx +1 -0
  560. package/src/panel/stories/index.story.tsx +2 -1
  561. package/src/popover/index.tsx +3 -0
  562. package/src/popover/stories/index.story.tsx +2 -1
  563. package/src/private-apis.ts +3 -3
  564. package/src/progress-bar/stories/index.story.tsx +2 -1
  565. package/src/radio-group/README.md +8 -8
  566. package/src/radio-group/index.tsx +2 -0
  567. package/src/radio-group/radio.tsx +7 -0
  568. package/src/radio-group/stories/index.story.tsx +16 -4
  569. package/src/radio-group/types.ts +6 -1
  570. package/src/resizable-box/stories/index.story.tsx +2 -1
  571. package/src/sandbox/index.native.js +1 -3
  572. package/src/sandbox/index.tsx +3 -6
  573. package/src/sandbox/stories/index.story.tsx +2 -1
  574. package/src/scroll-lock/stories/index.story.tsx +2 -1
  575. package/src/search-control/index.native.js +1 -3
  576. package/src/shortcut/stories/index.story.tsx +2 -1
  577. package/src/slot-fill/bubbles-virtually/slot.tsx +1 -2
  578. package/src/slot-fill/fill.ts +3 -6
  579. package/src/slot-fill/stories/index.story.tsx +2 -1
  580. package/src/snackbar/index.tsx +2 -1
  581. package/src/snackbar/stories/index.story.tsx +2 -1
  582. package/src/snackbar/stories/list.story.tsx +2 -1
  583. package/src/snackbar/style.scss +7 -16
  584. package/src/spacer/hook.ts +3 -2
  585. package/src/spinner/stories/index.story.tsx +2 -1
  586. package/src/tab-panel/index.tsx +3 -0
  587. package/src/tab-panel/stories/index.story.tsx +2 -1
  588. package/src/tab-panel/style.scss +1 -3
  589. package/src/tabs/README.md +63 -21
  590. package/src/tabs/index.tsx +112 -189
  591. package/src/tabs/stories/index.story.tsx +5 -2
  592. package/src/tabs/styles.ts +13 -5
  593. package/src/tabs/tab.tsx +23 -3
  594. package/src/tabs/tablist.tsx +44 -17
  595. package/src/tabs/test/index.tsx +131 -118
  596. package/src/tabs/types.ts +89 -49
  597. package/src/text/stories/index.story.tsx +2 -1
  598. package/src/text-highlight/stories/index.story.tsx +2 -1
  599. package/src/theme/stories/index.story.tsx +2 -1
  600. package/src/tip/stories/index.story.tsx +2 -1
  601. package/src/toggle-group-control/toggle-group-control/component.tsx +2 -1
  602. package/src/toolbar/toolbar/index.tsx +3 -0
  603. package/src/tools-panel/tools-panel-header/component.tsx +1 -1
  604. package/src/tools-panel/tools-panel-item/hook.ts +0 -2
  605. package/src/tooltip/index.native.js +5 -15
  606. package/src/tooltip/stories/index.story.tsx +2 -1
  607. package/src/tree-grid/stories/index.story.tsx +2 -1
  608. package/src/truncate/stories/index.story.tsx +2 -1
  609. package/src/unit-control/index.native.js +2 -6
  610. package/src/utils/deprecated-36px-size.ts +27 -0
  611. package/src/utils/element-rect.ts +14 -2
  612. package/src/utils/hooks/use-animated-offset-rect.ts +13 -1
  613. package/src/utils/hooks/use-update-effect.js +0 -2
  614. package/src/visually-hidden/stories/index.story.tsx +2 -1
  615. package/tsconfig.tsbuildinfo +1 -1
  616. package/build/dropdown-menu-v2/checkbox-item.js.map +0 -1
  617. package/build/dropdown-menu-v2/context.js.map +0 -1
  618. package/build/dropdown-menu-v2/group-label.js.map +0 -1
  619. package/build/dropdown-menu-v2/group.js.map +0 -1
  620. package/build/dropdown-menu-v2/index.js.map +0 -1
  621. package/build/dropdown-menu-v2/item-help-text.js.map +0 -1
  622. package/build/dropdown-menu-v2/item-label.js.map +0 -1
  623. package/build/dropdown-menu-v2/item.js.map +0 -1
  624. package/build/dropdown-menu-v2/radio-item.js.map +0 -1
  625. package/build/dropdown-menu-v2/separator.js.map +0 -1
  626. package/build/dropdown-menu-v2/styles.js +0 -150
  627. package/build/dropdown-menu-v2/styles.js.map +0 -1
  628. package/build/dropdown-menu-v2/types.js.map +0 -1
  629. package/build/dropdown-menu-v2/use-temporary-focus-visible-fix.js.map +0 -1
  630. package/build-module/dropdown-menu-v2/checkbox-item.js.map +0 -1
  631. package/build-module/dropdown-menu-v2/context.js.map +0 -1
  632. package/build-module/dropdown-menu-v2/group-label.js.map +0 -1
  633. package/build-module/dropdown-menu-v2/group.js +0 -21
  634. package/build-module/dropdown-menu-v2/group.js.map +0 -1
  635. package/build-module/dropdown-menu-v2/index.js.map +0 -1
  636. package/build-module/dropdown-menu-v2/item-help-text.js.map +0 -1
  637. package/build-module/dropdown-menu-v2/item-label.js.map +0 -1
  638. package/build-module/dropdown-menu-v2/item.js.map +0 -1
  639. package/build-module/dropdown-menu-v2/radio-item.js.map +0 -1
  640. package/build-module/dropdown-menu-v2/separator.js +0 -22
  641. package/build-module/dropdown-menu-v2/separator.js.map +0 -1
  642. package/build-module/dropdown-menu-v2/styles.js +0 -143
  643. package/build-module/dropdown-menu-v2/styles.js.map +0 -1
  644. package/build-module/dropdown-menu-v2/types.js.map +0 -1
  645. package/build-module/dropdown-menu-v2/use-temporary-focus-visible-fix.js.map +0 -1
  646. package/build-types/dropdown-menu-v2/checkbox-item.d.ts +0 -3
  647. package/build-types/dropdown-menu-v2/checkbox-item.d.ts.map +0 -1
  648. package/build-types/dropdown-menu-v2/context.d.ts +0 -6
  649. package/build-types/dropdown-menu-v2/context.d.ts.map +0 -1
  650. package/build-types/dropdown-menu-v2/group-label.d.ts +0 -3
  651. package/build-types/dropdown-menu-v2/group-label.d.ts.map +0 -1
  652. package/build-types/dropdown-menu-v2/group.d.ts +0 -3
  653. package/build-types/dropdown-menu-v2/group.d.ts.map +0 -1
  654. package/build-types/dropdown-menu-v2/index.d.ts +0 -40
  655. package/build-types/dropdown-menu-v2/index.d.ts.map +0 -1
  656. package/build-types/dropdown-menu-v2/item-help-text.d.ts.map +0 -1
  657. package/build-types/dropdown-menu-v2/item-label.d.ts.map +0 -1
  658. package/build-types/dropdown-menu-v2/item.d.ts +0 -3
  659. package/build-types/dropdown-menu-v2/item.d.ts.map +0 -1
  660. package/build-types/dropdown-menu-v2/radio-item.d.ts +0 -3
  661. package/build-types/dropdown-menu-v2/radio-item.d.ts.map +0 -1
  662. package/build-types/dropdown-menu-v2/separator.d.ts +0 -3
  663. package/build-types/dropdown-menu-v2/separator.d.ts.map +0 -1
  664. package/build-types/dropdown-menu-v2/stories/index.story.d.ts +0 -16
  665. package/build-types/dropdown-menu-v2/stories/index.story.d.ts.map +0 -1
  666. package/build-types/dropdown-menu-v2/styles.d.ts.map +0 -1
  667. package/build-types/dropdown-menu-v2/test/index.d.ts.map +0 -1
  668. package/build-types/dropdown-menu-v2/types.d.ts.map +0 -1
  669. package/build-types/dropdown-menu-v2/use-temporary-focus-visible-fix.d.ts.map +0 -1
  670. package/src/dropdown-menu-v2/context.tsx +0 -13
  671. package/src/dropdown-menu-v2/group.tsx +0 -26
  672. package/src/dropdown-menu-v2/separator.tsx +0 -27
  673. package/src/dropdown-menu-v2/stories/index.story.tsx +0 -639
  674. /package/build/{dropdown-menu-v2 → menu}/types.js +0 -0
  675. /package/build/{dropdown-menu-v2 → menu}/use-temporary-focus-visible-fix.js +0 -0
  676. /package/build-module/{dropdown-menu-v2 → menu}/types.js +0 -0
  677. /package/build-module/{dropdown-menu-v2 → menu}/use-temporary-focus-visible-fix.js +0 -0
  678. /package/build-types/{dropdown-menu-v2 → menu}/test/index.d.ts +0 -0
  679. /package/build-types/{dropdown-menu-v2 → menu}/use-temporary-focus-visible-fix.d.ts +0 -0
  680. /package/src/{dropdown-menu-v2 → menu}/use-temporary-focus-visible-fix.ts +0 -0
@@ -109,45 +109,81 @@ Tabs is comprised of four individual components:
109
109
 
110
110
  ###### `children`: `React.ReactNode`
111
111
 
112
- The children elements, which should be at least a `Tabs.Tablist` component and a series of `Tabs.TabPanel` components.
112
+ The children elements, which should include one instance of the `Tabs.Tablist` component and as many instances of the `Tabs.TabPanel` components as there are `Tabs.Tab` components.
113
113
 
114
114
  - Required: Yes
115
115
 
116
116
  ###### `selectOnMove`: `boolean`
117
117
 
118
- When `true`, the tab will be selected when receiving focus (automatic tab activation). When `false`, the tab will be selected only when clicked (manual tab activation). See the [official W3C docs](https://www.w3.org/WAI/ARIA/apg/patterns/tabpanel/) for more info.
118
+ Determines if the tab should be selected when it receives focus. If set to `false`, the tab will only be selected upon clicking, not when using arrow keys to shift focus (manual tab activation). See the [official W3C docs](https://www.w3.org/WAI/ARIA/apg/patterns/tabpanel/) for more info.
119
119
 
120
120
  - Required: No
121
121
  - Default: `true`
122
122
 
123
- ###### `defaultTabId`: `string`
123
+ ###### `selectedTabId`: `string | null`
124
+
125
+ The id of the tab whose panel is currently visible.
126
+
127
+ If left `undefined`, it will be automatically set to the first enabled tab, and the component assumes it is being used in "uncontrolled" mode.
128
+
129
+ Consequently, any value different than `undefined` will set the component in "controlled" mode. When in "controlled" mode, the `null` value will result in no tabs being selected, and the tablist becoming tabbable.
130
+
131
+ - Required: No
132
+
133
+ ###### `defaultTabId`: `string | null`
124
134
 
125
- The id of the tab to be selected upon mounting of component. If this prop is not set, the first tab will be selected by default. The id provided will be internally prefixed with a unique instance ID to avoid collisions.
135
+ The id of the tab whose panel is currently visible.
126
136
 
127
- _Note: this prop will be overridden by the `selectedTabId` prop if it is provided. (Controlled Mode)_
137
+ If left `undefined`, it will be automatically set to the first enabled tab. If set to `null`, no tab will be selected, and the tablist will be tabbable.
138
+
139
+ _Note: this prop will be overridden by the `selectedTabId` prop if it is provided (meaning the component will be used in "controlled" mode)._
128
140
 
129
141
  - Required: No
130
142
 
131
143
  ###### `onSelect`: `( ( selectedId: string | null | undefined ) => void )`
132
144
 
133
- The function called when a tab has been selected. It is passed the selected tab's ID as an argument.
145
+ The function called when the `selectedTabId` changes.
134
146
 
135
147
  - Required: No
136
148
  - Default: `noop`
137
149
 
138
- ###### `orientation`: `horizontal | vertical`
150
+ ###### `activeTabId`: `string | null`
151
+
152
+ The current active tab `id`. The active tab is the tab element within the tablist widget that has DOM focus.
153
+
154
+ - `null` represents the tablist (ie. the base composite element). Users
155
+ will be able to navigate out of it using arrow keys;
156
+ - If `activeTabId` is initially set to `null`, the base composite element
157
+ itself will have focus and users will be able to navigate to it using
158
+ arrow keys.
159
+
160
+ - Required: No
161
+
162
+ ###### `defaultActiveTabId`: `string | null`
163
+
164
+ The tab id that should be active by default when the composite widget is rendered. If `null`, the tablist element itself will have focus and users will be able to navigate to it using arrow keys. If `undefined`, the first enabled item will be focused.
139
165
 
140
- The orientation of the `tablist` (`vertical` or `horizontal`)
166
+ _Note: this prop will be overridden by the `activeTabId` prop if it is provided._
141
167
 
142
168
  - Required: No
143
- - Default: `horizontal`
144
169
 
145
- ###### `selectedTabId`: `string | null`
170
+ ###### `onActiveTabIdChange`: `( ( activeId: string | null | undefined ) => void )`
146
171
 
147
- The ID of the tab to display. This id is prepended with the `Tabs` instanceId internally.
148
- If left `undefined`, the component assumes it is being used in uncontrolled mode. Consequently, any value different than `undefined` will set the component in `controlled` mode. When in controlled mode, the `null` value will result in no tab being selected.
172
+ The function called when the `selectedTabId` changes.
149
173
 
150
- - Required: No
174
+ - Required: No
175
+ - Default: `noop`
176
+
177
+ ###### `orientation`: `'horizontal' | 'vertical' | 'both'`
178
+
179
+ Defines the orientation of the tablist and determines which arrow keys can be used to move focus:
180
+
181
+ - `both`: all arrow keys work;
182
+ - `horizontal`: only left and right arrow keys work;
183
+ - `vertical`: only up and down arrow keys work.
184
+
185
+ - Required: No
186
+ - Default: `horizontal`
151
187
 
152
188
  #### TabList
153
189
 
@@ -155,7 +191,7 @@ If left `undefined`, the component assumes it is being used in uncontrolled mode
155
191
 
156
192
  ###### `children`: `React.ReactNode`
157
193
 
158
- The children elements, which should be a series of `Tabs.TabPanel` components.
194
+ The children elements, which should include one or more instances of the `Tabs.Tab` component.
159
195
 
160
196
  - Required: No
161
197
 
@@ -165,26 +201,28 @@ The children elements, which should be a series of `Tabs.TabPanel` components.
165
201
 
166
202
  ###### `tabId`: `string`
167
203
 
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.
204
+ The unique ID of the tab. It will be used to register the tab and match it to a corresponding `Tabs.TabPanel` component. If not provided, a unique ID will be automatically generated.
169
205
 
170
206
  - Required: Yes
171
207
 
172
208
  ###### `children`: `React.ReactNode`
173
209
 
174
- The children elements, generally the text to display on the tab.
210
+ The contents of the tab.
175
211
 
176
212
  - Required: No
177
213
 
178
214
  ###### `disabled`: `boolean`
179
215
 
180
- Determines if the tab button should be disabled.
216
+ Determines if the tab should be disabled. Note that disabled tabs can still be accessed via the keyboard when navigating through the tablist.
181
217
 
182
218
  - Required: No
183
219
  - Default: `false`
184
220
 
185
221
  ###### `render`: `React.ReactNode`
186
222
 
187
- The type of component to render the tab button as. If this prop is not provided, the tab button will be rendered as a `button` element.
223
+ Allows the component to be rendered as a different HTML element or React component. The value can be a React element or a function that takes in the original component props and gives back a React element with the props merged.
224
+
225
+ By default, the tab will be rendered as a `button` element.
188
226
 
189
227
  - Required: No
190
228
 
@@ -194,19 +232,23 @@ The type of component to render the tab button as. If this prop is not provided,
194
232
 
195
233
  ###### `children`: `React.ReactNode`
196
234
 
197
- The children elements, generally the content to display on the tabpanel.
235
+ The contents of the tab panel.
198
236
 
199
237
  - Required: No
200
238
 
201
239
  ###### `tabId`: `string`
202
240
 
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.
241
+ The unique `id` of the `Tabs.Tab` component controlling this panel. This connection is used to assign the `aria-labelledby` attribute to the tab panel and to determine if the tab panel should be visible.
242
+
243
+ If not provided, this link is automatically established by matching the order of `Tabs.Tab` and `Tabs.TabPanel` elements in the DOM.
204
244
 
205
245
  - Required: Yes
206
246
 
207
247
  ###### `focusable`: `boolean`
208
248
 
209
- Determines whether or not the tabpanel element should be focusable. If `false`, pressing the tab key will skip over the tabpanel, and instead focus on the first focusable element in the panel (if there is one).
249
+ Determines whether or not the tabpanel element should be focusable.
250
+
251
+ If `false`, pressing the tab key will skip over the tabpanel, and instead focus on the first focusable element in the panel (if there is one).
210
252
 
211
253
  - Required: No
212
254
  - Default: `true`
@@ -2,18 +2,13 @@
2
2
  * External dependencies
3
3
  */
4
4
  import * as Ariakit from '@ariakit/react';
5
- import { useStoreState } from '@ariakit/react';
6
5
 
7
6
  /**
8
7
  * WordPress dependencies
9
8
  */
10
9
  import { useInstanceId } from '@wordpress/compose';
11
- import {
12
- useEffect,
13
- useLayoutEffect,
14
- useMemo,
15
- useRef,
16
- } from '@wordpress/element';
10
+ import { useEffect, useMemo } from '@wordpress/element';
11
+ import { isRTL } from '@wordpress/i18n';
17
12
 
18
13
  /**
19
14
  * Internal dependencies
@@ -24,191 +19,119 @@ import { Tab } from './tab';
24
19
  import { TabList } from './tablist';
25
20
  import { TabPanel } from './tabpanel';
26
21
 
27
- function Tabs( {
28
- selectOnMove = true,
29
- defaultTabId,
30
- orientation = 'horizontal',
31
- onSelect,
32
- children,
33
- selectedTabId,
34
- }: TabsProps ) {
35
- const instanceId = useInstanceId( Tabs, 'tabs' );
36
- const store = Ariakit.useTabStore( {
37
- selectOnMove,
38
- orientation,
39
- defaultSelectedId: defaultTabId && `${ instanceId }-${ defaultTabId }`,
40
- setSelectedId: ( selectedId ) => {
41
- const strippedDownId =
42
- typeof selectedId === 'string'
43
- ? selectedId.replace( `${ instanceId }-`, '' )
44
- : selectedId;
45
- onSelect?.( strippedDownId );
46
- },
47
- selectedId: selectedTabId && `${ instanceId }-${ selectedTabId }`,
48
- } );
49
-
50
- const isControlled = selectedTabId !== undefined;
51
-
52
- const { items, selectedId, activeId } = useStoreState( store );
53
- const { setSelectedId, setActiveId } = store;
54
-
55
- // Keep track of whether tabs have been populated. This is used to prevent
56
- // certain effects from firing too early while tab data and relevant
57
- // variables are undefined during the initial render.
58
- const tabsHavePopulatedRef = useRef( false );
59
- if ( items.length > 0 ) {
60
- tabsHavePopulatedRef.current = true;
61
- }
62
-
63
- const selectedTab = items.find( ( item ) => item.id === selectedId );
64
- const firstEnabledTab = items.find( ( item ) => {
65
- // Ariakit internally refers to disabled tabs as `dimmed`.
66
- return ! item.dimmed;
67
- } );
68
- const initialTab = items.find(
69
- ( item ) => item.id === `${ instanceId }-${ defaultTabId }`
70
- );
71
-
72
- // Handle selecting the initial tab.
73
- useLayoutEffect( () => {
74
- if ( isControlled ) {
75
- return;
76
- }
77
-
78
- // Wait for the denoted initial tab to be declared before making a
79
- // selection. This ensures that if a tab is declared lazily it can
80
- // still receive initial selection, as well as ensuring no tab is
81
- // selected if an invalid `defaultTabId` is provided.
82
- if ( defaultTabId && ! initialTab ) {
83
- return;
84
- }
22
+ function externalToInternalTabId(
23
+ externalId: string | undefined | null,
24
+ instanceId: string
25
+ ) {
26
+ return externalId && `${ instanceId }-${ externalId }`;
27
+ }
85
28
 
86
- // If the currently selected tab is missing (i.e. removed from the DOM),
87
- // fall back to the initial tab or the first enabled tab if there is
88
- // one. Otherwise, no tab should be selected.
89
- if ( ! items.find( ( item ) => item.id === selectedId ) ) {
90
- if ( initialTab && ! initialTab.dimmed ) {
91
- setSelectedId( initialTab?.id );
92
- return;
93
- }
29
+ function internalToExternalTabId(
30
+ internalId: string | undefined | null,
31
+ instanceId: string
32
+ ) {
33
+ return typeof internalId === 'string'
34
+ ? internalId.replace( `${ instanceId }-`, '' )
35
+ : internalId;
36
+ }
94
37
 
95
- if ( firstEnabledTab ) {
96
- setSelectedId( firstEnabledTab.id );
97
- } else if ( tabsHavePopulatedRef.current ) {
98
- setSelectedId( null );
99
- }
100
- }
101
- }, [
102
- firstEnabledTab,
103
- initialTab,
38
+ /**
39
+ * Display one panel of content at a time with a tabbed interface, based on the
40
+ * WAI-ARIA Tabs Pattern⁠.
41
+ *
42
+ * @see https://www.w3.org/WAI/ARIA/apg/patterns/tabs/
43
+ * ```
44
+ */
45
+ export const Tabs = Object.assign(
46
+ function Tabs( {
47
+ selectOnMove = true,
104
48
  defaultTabId,
105
- isControlled,
106
- items,
107
- selectedId,
108
- setSelectedId,
109
- ] );
110
-
111
- // Handle the currently selected tab becoming disabled.
112
- useLayoutEffect( () => {
113
- if ( ! selectedTab?.dimmed ) {
114
- return;
115
- }
116
-
117
- // In controlled mode, we trust that disabling tabs is done
118
- // intentionally, and don't select a new tab automatically.
119
- if ( isControlled ) {
120
- setSelectedId( null );
121
- return;
122
- }
123
-
124
- // If the currently selected tab becomes disabled, fall back to the
125
- // `defaultTabId` if possible. Otherwise select the first
126
- // enabled tab (if there is one).
127
- if ( initialTab && ! initialTab.dimmed ) {
128
- setSelectedId( initialTab.id );
129
- return;
130
- }
131
-
132
- if ( firstEnabledTab ) {
133
- setSelectedId( firstEnabledTab.id );
134
- }
135
- }, [
136
- firstEnabledTab,
137
- initialTab,
138
- isControlled,
139
- selectedTab?.dimmed,
140
- setSelectedId,
141
- ] );
142
-
143
- // Clear `selectedId` if the active tab is removed from the DOM in controlled mode.
144
- useLayoutEffect( () => {
145
- if ( ! isControlled ) {
146
- return;
147
- }
148
-
149
- // Once the tabs have populated, if the `selectedTabId` still can't be
150
- // found, clear the selection.
151
- if (
152
- tabsHavePopulatedRef.current &&
153
- !! selectedTabId &&
154
- ! selectedTab
155
- ) {
156
- setSelectedId( null );
157
- }
158
- }, [ isControlled, selectedTab, selectedTabId, setSelectedId ] );
159
-
160
- useEffect( () => {
161
- // If there is no active tab, fallback to place focus on the first enabled tab
162
- // so there is always an active element
163
- if ( selectedTabId === null && ! activeId && firstEnabledTab?.id ) {
164
- setActiveId( firstEnabledTab.id );
165
- }
166
- }, [ selectedTabId, activeId, firstEnabledTab?.id, setActiveId ] );
167
-
168
- useEffect( () => {
169
- if ( ! isControlled ) {
170
- return;
171
- }
172
-
173
- requestAnimationFrame( () => {
174
- const focusedElement =
175
- items?.[ 0 ]?.element?.ownerDocument.activeElement;
176
-
177
- if (
178
- ! focusedElement ||
179
- ! items.some( ( item ) => focusedElement === item.element )
180
- ) {
181
- return; // Return early if no tabs are focused.
182
- }
183
-
184
- // If, after ariakit re-computes the active tab, that tab doesn't match
185
- // the currently focused tab, then we force an update to ariakit to avoid
186
- // any mismatches, especially when navigating to previous/next tab with
187
- // arrow keys.
188
- if ( activeId !== focusedElement.id ) {
189
- setActiveId( focusedElement.id );
190
- }
49
+ orientation = 'horizontal',
50
+ onSelect,
51
+ children,
52
+ selectedTabId,
53
+ activeTabId,
54
+ defaultActiveTabId,
55
+ onActiveTabIdChange,
56
+ }: TabsProps ) {
57
+ const instanceId = useInstanceId( Tabs, 'tabs' );
58
+ const store = Ariakit.useTabStore( {
59
+ selectOnMove,
60
+ orientation,
61
+ defaultSelectedId: externalToInternalTabId(
62
+ defaultTabId,
63
+ instanceId
64
+ ),
65
+ setSelectedId: ( newSelectedId ) => {
66
+ onSelect?.(
67
+ internalToExternalTabId( newSelectedId, instanceId )
68
+ );
69
+ },
70
+ selectedId: externalToInternalTabId( selectedTabId, instanceId ),
71
+ defaultActiveId: externalToInternalTabId(
72
+ defaultActiveTabId,
73
+ instanceId
74
+ ),
75
+ setActiveId: ( newActiveId ) => {
76
+ onActiveTabIdChange?.(
77
+ internalToExternalTabId( newActiveId, instanceId )
78
+ );
79
+ },
80
+ activeId: externalToInternalTabId( activeTabId, instanceId ),
81
+ rtl: isRTL(),
191
82
  } );
192
- }, [ activeId, isControlled, items, setActiveId ] );
193
83
 
194
- const contextValue = useMemo(
195
- () => ( {
196
- store,
197
- instanceId,
84
+ const { items, activeId } = Ariakit.useStoreState( store );
85
+ const { setActiveId } = store;
86
+
87
+ useEffect( () => {
88
+ requestAnimationFrame( () => {
89
+ const focusedElement =
90
+ items?.[ 0 ]?.element?.ownerDocument.activeElement;
91
+
92
+ if (
93
+ ! focusedElement ||
94
+ ! items.some( ( item ) => focusedElement === item.element )
95
+ ) {
96
+ return; // Return early if no tabs are focused.
97
+ }
98
+
99
+ // If, after ariakit re-computes the active tab, that tab doesn't match
100
+ // the currently focused tab, then we force an update to ariakit to avoid
101
+ // any mismatches, especially when navigating to previous/next tab with
102
+ // arrow keys.
103
+ if ( activeId !== focusedElement.id ) {
104
+ setActiveId( focusedElement.id );
105
+ }
106
+ } );
107
+ }, [ activeId, items, setActiveId ] );
108
+
109
+ const contextValue = useMemo(
110
+ () => ( {
111
+ store,
112
+ instanceId,
113
+ } ),
114
+ [ store, instanceId ]
115
+ );
116
+
117
+ return (
118
+ <TabsContext.Provider value={ contextValue }>
119
+ { children }
120
+ </TabsContext.Provider>
121
+ );
122
+ },
123
+ {
124
+ Tab: Object.assign( Tab, {
125
+ displayName: 'Tabs.Tab',
198
126
  } ),
199
- [ store, instanceId ]
200
- );
201
-
202
- return (
203
- <TabsContext.Provider value={ contextValue }>
204
- { children }
205
- </TabsContext.Provider>
206
- );
207
- }
208
-
209
- Tabs.TabList = TabList;
210
- Tabs.Tab = Tab;
211
- Tabs.TabPanel = TabPanel;
212
- Tabs.Context = TabsContext;
213
-
214
- export default Tabs;
127
+ TabList: Object.assign( TabList, {
128
+ displayName: 'Tabs.TabList',
129
+ } ),
130
+ TabPanel: Object.assign( TabPanel, {
131
+ displayName: 'Tabs.TabPanel',
132
+ } ),
133
+ Context: Object.assign( TabsContext, {
134
+ displayName: 'Tabs.Context',
135
+ } ),
136
+ }
137
+ );
@@ -12,7 +12,7 @@ import { useState } from '@wordpress/element';
12
12
  /**
13
13
  * Internal dependencies
14
14
  */
15
- import Tabs from '..';
15
+ import { Tabs } from '..';
16
16
  import { Slot, Fill, Provider as SlotFillProvider } from '../../slot-fill';
17
17
  import DropdownMenu from '../../dropdown-menu';
18
18
  import Button from '../../button';
@@ -20,7 +20,8 @@ import Tooltip from '../../tooltip';
20
20
  import Icon from '../../icon';
21
21
 
22
22
  const meta: Meta< typeof Tabs > = {
23
- title: 'Components (Experimental)/Tabs',
23
+ title: 'Components/Containers/Tabs',
24
+ id: 'components-tabs',
24
25
  component: Tabs,
25
26
  subcomponents: {
26
27
  // @ts-expect-error - See https://github.com/storybookjs/storybook/issues/23170
@@ -29,6 +30,8 @@ const meta: Meta< typeof Tabs > = {
29
30
  'Tabs.Tab': Tabs.Tab,
30
31
  // @ts-expect-error - See https://github.com/storybookjs/storybook/issues/23170
31
32
  'Tabs.TabPanel': Tabs.TabPanel,
33
+ // @ts-expect-error - See https://github.com/storybookjs/storybook/issues/23170
34
+ 'Tabs.Context': Tabs.Context,
32
35
  },
33
36
  tags: [ 'status-private' ],
34
37
  parameters: {
@@ -11,7 +11,7 @@ import { COLORS, CONFIG } from '../utils';
11
11
  import { space } from '../utils/space';
12
12
  import Icon from '../icon';
13
13
 
14
- export const TabListWrapper = styled.div`
14
+ export const StyledTabList = styled( Ariakit.TabList )`
15
15
  display: flex;
16
16
  align-items: stretch;
17
17
  overflow-x: auto;
@@ -195,7 +195,7 @@ export const Tab = styled( Ariakit.Tab )`
195
195
  opacity: 0;
196
196
 
197
197
  @media not ( prefers-reduced-motion ) {
198
- transition: opacity 0.15s 0.15s linear;
198
+ transition: opacity 0.1s linear;
199
199
  }
200
200
  }
201
201
 
@@ -207,7 +207,6 @@ export const Tab = styled( Ariakit.Tab )`
207
207
  [aria-orientation='horizontal'] & {
208
208
  padding-inline: ${ space( 4 ) };
209
209
  height: ${ space( 12 ) };
210
- text-align: center;
211
210
  scroll-margin: 24px;
212
211
 
213
212
  &::after {
@@ -219,7 +218,6 @@ export const Tab = styled( Ariakit.Tab )`
219
218
  [aria-orientation='vertical'] & {
220
219
  padding: ${ space( 2 ) } ${ space( 3 ) };
221
220
  min-height: ${ space( 10 ) };
222
- text-align: start;
223
221
 
224
222
  &[aria-selected='true'] {
225
223
  color: ${ COLORS.theme.accent };
@@ -234,6 +232,16 @@ export const Tab = styled( Ariakit.Tab )`
234
232
 
235
233
  export const TabChildren = styled.span`
236
234
  flex-grow: 1;
235
+
236
+ display: flex;
237
+ align-items: center;
238
+
239
+ [aria-orientation='horizontal'] & {
240
+ justify-content: center;
241
+ }
242
+ [aria-orientation='vertical'] & {
243
+ justify-content: start;
244
+ }
237
245
  `;
238
246
 
239
247
  export const TabChevron = styled( Icon )`
@@ -253,7 +261,7 @@ export const TabChevron = styled( Icon )`
253
261
  [data-select-on-move='true']
254
262
  [role='tab']:is( [aria-selected='true'], )
255
263
  & {
256
- transition: opacity 0.3s ease-in;
264
+ transition: opacity 0.15s 0.15s linear;
257
265
  }
258
266
  }
259
267
  &:dir( rtl ) {
package/src/tabs/tab.tsx CHANGED
@@ -1,3 +1,8 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import * as Ariakit from '@ariakit/react';
5
+
1
6
  /**
2
7
  * WordPress dependencies
3
8
  */
@@ -22,13 +27,27 @@ export const Tab = forwardRef<
22
27
  HTMLButtonElement,
23
28
  Omit< WordPressComponentProps< TabProps, 'button', false >, 'id' >
24
29
  >( function Tab( { children, tabId, disabled, render, ...otherProps }, ref ) {
25
- const context = useTabsContext();
26
- if ( ! context ) {
30
+ const { store, instanceId } = useTabsContext() ?? {};
31
+
32
+ // If the active item is not connected, the tablist may end up in a state
33
+ // where none of the tabs are tabbable. In this case, we force all tabs to
34
+ // be tabbable, so that as soon as an item received focus, it becomes active
35
+ // and Tablist goes back to working as expected.
36
+ // eslint-disable-next-line @wordpress/no-unused-vars-before-return
37
+ const tabbable = Ariakit.useStoreState( store, ( state ) => {
38
+ return (
39
+ state?.activeId !== null &&
40
+ ! store?.item( state?.activeId )?.element?.isConnected
41
+ );
42
+ } );
43
+
44
+ if ( ! store ) {
27
45
  warning( '`Tabs.Tab` must be wrapped in a `Tabs` component.' );
28
46
  return null;
29
47
  }
30
- const { store, instanceId } = context;
48
+
31
49
  const instancedTabId = `${ instanceId }-${ tabId }`;
50
+
32
51
  return (
33
52
  <StyledTab
34
53
  ref={ ref }
@@ -36,6 +55,7 @@ export const Tab = forwardRef<
36
55
  id={ instancedTabId }
37
56
  disabled={ disabled }
38
57
  render={ render }
58
+ tabbable={ tabbable }
39
59
  { ...otherProps }
40
60
  >
41
61
  <StyledTabChildren>{ children }</StyledTabChildren>