@wordpress/components 22.1.0 → 23.0.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 (530) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/build/alignment-matrix-control/cell.js.map +1 -1
  3. package/build/alignment-matrix-control/icon.js +4 -2
  4. package/build/alignment-matrix-control/icon.js.map +1 -1
  5. package/build/alignment-matrix-control/index.js +25 -1
  6. package/build/alignment-matrix-control/index.js.map +1 -1
  7. package/build/alignment-matrix-control/styles/alignment-matrix-control-icon-styles.js +13 -13
  8. package/build/alignment-matrix-control/styles/alignment-matrix-control-icon-styles.js.map +1 -1
  9. package/build/alignment-matrix-control/styles/alignment-matrix-control-styles.js +16 -16
  10. package/build/alignment-matrix-control/styles/alignment-matrix-control-styles.js.map +1 -1
  11. package/build/alignment-matrix-control/types.js +6 -0
  12. package/build/alignment-matrix-control/types.js.map +1 -0
  13. package/build/alignment-matrix-control/utils.js +9 -8
  14. package/build/alignment-matrix-control/utils.js.map +1 -1
  15. package/build/angle-picker-control/styles/angle-picker-control-styles.js +9 -9
  16. package/build/angle-picker-control/styles/angle-picker-control-styles.js.map +1 -1
  17. package/build/autocomplete/index.js +38 -9
  18. package/build/autocomplete/index.js.map +1 -1
  19. package/build/base-control/hooks.js +52 -0
  20. package/build/base-control/hooks.js.map +1 -0
  21. package/build/base-control/index.js +24 -7
  22. package/build/base-control/index.js.map +1 -1
  23. package/build/base-field/hook.js +0 -14
  24. package/build/base-field/hook.js.map +1 -1
  25. package/build/base-field/index.js.map +1 -1
  26. package/build/base-field/styles.js +5 -5
  27. package/build/base-field/styles.js.map +1 -1
  28. package/build/base-field/types.js +6 -0
  29. package/build/base-field/types.js.map +1 -0
  30. package/build/border-control/border-control/component.js +1 -0
  31. package/build/border-control/border-control/component.js.map +1 -1
  32. package/build/border-control/styles.js +16 -16
  33. package/build/border-control/styles.js.map +1 -1
  34. package/build/box-control/linked-button.js +3 -4
  35. package/build/box-control/linked-button.js.map +1 -1
  36. package/build/color-palette/index.js +2 -7
  37. package/build/color-palette/index.js.map +1 -1
  38. package/build/color-picker/input-with-slider.js +1 -0
  39. package/build/color-picker/input-with-slider.js.map +1 -1
  40. package/build/color-picker/styles.js +8 -8
  41. package/build/color-picker/styles.js.map +1 -1
  42. package/build/custom-select-control/index.js +14 -2
  43. package/build/custom-select-control/index.js.map +1 -1
  44. package/build/dashicon/index.js +1 -4
  45. package/build/dashicon/index.js.map +1 -1
  46. package/build/date-time/date-time/index.js +4 -4
  47. package/build/date-time/date-time/index.js.map +1 -1
  48. package/build/duotone-picker/duotone-picker.js +2 -2
  49. package/build/duotone-picker/duotone-picker.js.map +1 -1
  50. package/build/gradient-picker/index.js +3 -9
  51. package/build/gradient-picker/index.js.map +1 -1
  52. package/build/higher-order/with-fallback-styles/index.js +2 -2
  53. package/build/higher-order/with-fallback-styles/index.js.map +1 -1
  54. package/build/index.js +13 -1
  55. package/build/index.js.map +1 -1
  56. package/build/input-control/index.js +17 -5
  57. package/build/input-control/index.js.map +1 -1
  58. package/build/input-control/input-base.js +2 -0
  59. package/build/input-control/input-base.js.map +1 -1
  60. package/build/mobile/bottom-sheet/cell.native.js +1 -1
  61. package/build/mobile/bottom-sheet/cell.native.js.map +1 -1
  62. package/build/mobile/bottom-sheet/switch-cell.native.js +1 -3
  63. package/build/mobile/bottom-sheet/switch-cell.native.js.map +1 -1
  64. package/build/mobile/global-styles-context/index.native.js +8 -8
  65. package/build/mobile/global-styles-context/index.native.js.map +1 -1
  66. package/build/mobile/keyboard-aware-flat-list/index.ios.js +4 -2
  67. package/build/mobile/keyboard-aware-flat-list/index.ios.js.map +1 -1
  68. package/build/modal/index.js +8 -0
  69. package/build/modal/index.js.map +1 -1
  70. package/build/navigator/navigator-provider/component.js +12 -8
  71. package/build/navigator/navigator-provider/component.js.map +1 -1
  72. package/build/number-control/styles/number-control-styles.js +8 -8
  73. package/build/number-control/styles/number-control-styles.js.map +1 -1
  74. package/build/palette-edit/index.js +72 -33
  75. package/build/palette-edit/index.js.map +1 -1
  76. package/build/popover/index.js +10 -2
  77. package/build/popover/index.js.map +1 -1
  78. package/build/query-controls/index.js +1 -0
  79. package/build/query-controls/index.js.map +1 -1
  80. package/build/snackbar/index.js +35 -24
  81. package/build/snackbar/index.js.map +1 -1
  82. package/build/snackbar/list.js +14 -19
  83. package/build/snackbar/list.js.map +1 -1
  84. package/build/snackbar/types.js +6 -0
  85. package/build/snackbar/types.js.map +1 -0
  86. package/build/tab-panel/index.js +10 -5
  87. package/build/tab-panel/index.js.map +1 -1
  88. package/build/theme/color-algorithms.js +118 -0
  89. package/build/theme/color-algorithms.js.map +1 -0
  90. package/build/theme/index.js +21 -18
  91. package/build/theme/index.js.map +1 -1
  92. package/build/theme/styles.js +10 -7
  93. package/build/theme/styles.js.map +1 -1
  94. package/build/toggle-control/index.js +5 -2
  95. package/build/toggle-control/index.js.map +1 -1
  96. package/build/ui/context/context-system-provider.js +3 -1
  97. package/build/ui/context/context-system-provider.js.map +1 -1
  98. package/build/unit-control/index.js +5 -2
  99. package/build/unit-control/index.js.map +1 -1
  100. package/build/utils/colors-values.js +1 -1
  101. package/build/utils/colors-values.js.map +1 -1
  102. package/build/utils/config-values.js +0 -2
  103. package/build/utils/config-values.js.map +1 -1
  104. package/build/utils/hooks/use-controlled-value.js.map +1 -1
  105. package/build-module/alignment-matrix-control/cell.js.map +1 -1
  106. package/build-module/alignment-matrix-control/icon.js +4 -2
  107. package/build-module/alignment-matrix-control/icon.js.map +1 -1
  108. package/build-module/alignment-matrix-control/index.js +23 -1
  109. package/build-module/alignment-matrix-control/index.js.map +1 -1
  110. package/build-module/alignment-matrix-control/styles/alignment-matrix-control-icon-styles.js +13 -13
  111. package/build-module/alignment-matrix-control/styles/alignment-matrix-control-icon-styles.js.map +1 -1
  112. package/build-module/alignment-matrix-control/styles/alignment-matrix-control-styles.js +16 -16
  113. package/build-module/alignment-matrix-control/styles/alignment-matrix-control-styles.js.map +1 -1
  114. package/build-module/alignment-matrix-control/types.js +2 -0
  115. package/build-module/alignment-matrix-control/types.js.map +1 -0
  116. package/build-module/alignment-matrix-control/utils.js +13 -8
  117. package/build-module/alignment-matrix-control/utils.js.map +1 -1
  118. package/build-module/angle-picker-control/styles/angle-picker-control-styles.js +9 -9
  119. package/build-module/angle-picker-control/styles/angle-picker-control-styles.js.map +1 -1
  120. package/build-module/autocomplete/index.js +38 -9
  121. package/build-module/autocomplete/index.js.map +1 -1
  122. package/build-module/base-control/hooks.js +41 -0
  123. package/build-module/base-control/hooks.js.map +1 -0
  124. package/build-module/base-control/index.js +18 -8
  125. package/build-module/base-control/index.js.map +1 -1
  126. package/build-module/base-field/hook.js +0 -14
  127. package/build-module/base-field/hook.js.map +1 -1
  128. package/build-module/base-field/index.js.map +1 -1
  129. package/build-module/base-field/styles.js +5 -5
  130. package/build-module/base-field/styles.js.map +1 -1
  131. package/build-module/base-field/types.js +2 -0
  132. package/build-module/base-field/types.js.map +1 -0
  133. package/build-module/border-control/border-control/component.js +1 -0
  134. package/build-module/border-control/border-control/component.js.map +1 -1
  135. package/build-module/border-control/styles.js +17 -17
  136. package/build-module/border-control/styles.js.map +1 -1
  137. package/build-module/box-control/linked-button.js +3 -4
  138. package/build-module/box-control/linked-button.js.map +1 -1
  139. package/build-module/color-palette/index.js +2 -7
  140. package/build-module/color-palette/index.js.map +1 -1
  141. package/build-module/color-picker/input-with-slider.js +1 -0
  142. package/build-module/color-picker/input-with-slider.js.map +1 -1
  143. package/build-module/color-picker/styles.js +8 -8
  144. package/build-module/color-picker/styles.js.map +1 -1
  145. package/build-module/custom-select-control/index.js +14 -2
  146. package/build-module/custom-select-control/index.js.map +1 -1
  147. package/build-module/dashicon/index.js +1 -4
  148. package/build-module/dashicon/index.js.map +1 -1
  149. package/build-module/date-time/date-time/index.js +4 -4
  150. package/build-module/date-time/date-time/index.js.map +1 -1
  151. package/build-module/duotone-picker/duotone-picker.js +2 -2
  152. package/build-module/duotone-picker/duotone-picker.js.map +1 -1
  153. package/build-module/gradient-picker/index.js +3 -8
  154. package/build-module/gradient-picker/index.js.map +1 -1
  155. package/build-module/higher-order/with-fallback-styles/index.js +2 -2
  156. package/build-module/higher-order/with-fallback-styles/index.js.map +1 -1
  157. package/build-module/index.js +2 -2
  158. package/build-module/index.js.map +1 -1
  159. package/build-module/input-control/index.js +16 -5
  160. package/build-module/input-control/index.js.map +1 -1
  161. package/build-module/input-control/input-base.js +2 -0
  162. package/build-module/input-control/input-base.js.map +1 -1
  163. package/build-module/mobile/bottom-sheet/cell.native.js +1 -1
  164. package/build-module/mobile/bottom-sheet/cell.native.js.map +1 -1
  165. package/build-module/mobile/bottom-sheet/switch-cell.native.js +1 -2
  166. package/build-module/mobile/bottom-sheet/switch-cell.native.js.map +1 -1
  167. package/build-module/mobile/global-styles-context/index.native.js +8 -7
  168. package/build-module/mobile/global-styles-context/index.native.js.map +1 -1
  169. package/build-module/mobile/keyboard-aware-flat-list/index.ios.js +2 -2
  170. package/build-module/mobile/keyboard-aware-flat-list/index.ios.js.map +1 -1
  171. package/build-module/modal/index.js +8 -0
  172. package/build-module/modal/index.js.map +1 -1
  173. package/build-module/navigator/navigator-provider/component.js +12 -8
  174. package/build-module/navigator/navigator-provider/component.js.map +1 -1
  175. package/build-module/number-control/styles/number-control-styles.js +8 -10
  176. package/build-module/number-control/styles/number-control-styles.js.map +1 -1
  177. package/build-module/palette-edit/index.js +73 -34
  178. package/build-module/palette-edit/index.js.map +1 -1
  179. package/build-module/popover/index.js +10 -2
  180. package/build-module/popover/index.js.map +1 -1
  181. package/build-module/query-controls/index.js +1 -0
  182. package/build-module/query-controls/index.js.map +1 -1
  183. package/build-module/snackbar/index.js +33 -23
  184. package/build-module/snackbar/index.js.map +1 -1
  185. package/build-module/snackbar/list.js +14 -22
  186. package/build-module/snackbar/list.js.map +1 -1
  187. package/build-module/snackbar/types.js +2 -0
  188. package/build-module/snackbar/types.js.map +1 -0
  189. package/build-module/tab-panel/index.js +10 -5
  190. package/build-module/tab-panel/index.js.map +1 -1
  191. package/build-module/theme/color-algorithms.js +105 -0
  192. package/build-module/theme/color-algorithms.js.map +1 -0
  193. package/build-module/theme/index.js +21 -17
  194. package/build-module/theme/index.js.map +1 -1
  195. package/build-module/theme/styles.js +8 -6
  196. package/build-module/theme/styles.js.map +1 -1
  197. package/build-module/toggle-control/index.js +4 -2
  198. package/build-module/toggle-control/index.js.map +1 -1
  199. package/build-module/ui/context/context-system-provider.js +3 -2
  200. package/build-module/ui/context/context-system-provider.js.map +1 -1
  201. package/build-module/unit-control/index.js +5 -2
  202. package/build-module/unit-control/index.js.map +1 -1
  203. package/build-module/utils/colors-values.js +1 -1
  204. package/build-module/utils/colors-values.js.map +1 -1
  205. package/build-module/utils/config-values.js +0 -2
  206. package/build-module/utils/config-values.js.map +1 -1
  207. package/build-module/utils/hooks/use-controlled-value.js.map +1 -1
  208. package/build-style/style-rtl.css +92 -75
  209. package/build-style/style.css +92 -75
  210. package/build-types/alignment-matrix-control/cell.d.ts +5 -0
  211. package/build-types/alignment-matrix-control/cell.d.ts.map +1 -0
  212. package/build-types/alignment-matrix-control/icon.d.ts +6 -0
  213. package/build-types/alignment-matrix-control/icon.d.ts.map +1 -0
  214. package/build-types/alignment-matrix-control/index.d.ts +30 -0
  215. package/build-types/alignment-matrix-control/index.d.ts.map +1 -0
  216. package/build-types/alignment-matrix-control/stories/index.d.ts +14 -0
  217. package/build-types/alignment-matrix-control/stories/index.d.ts.map +1 -0
  218. package/build-types/alignment-matrix-control/styles/alignment-matrix-control-icon-styles.d.ts +19 -0
  219. package/build-types/alignment-matrix-control/styles/alignment-matrix-control-icon-styles.d.ts.map +1 -0
  220. package/build-types/alignment-matrix-control/styles/alignment-matrix-control-styles.d.ts +23 -0
  221. package/build-types/alignment-matrix-control/styles/alignment-matrix-control-styles.d.ts.map +1 -0
  222. package/build-types/alignment-matrix-control/test/index.d.ts +2 -0
  223. package/build-types/alignment-matrix-control/test/index.d.ts.map +1 -0
  224. package/build-types/alignment-matrix-control/types.d.ts +39 -0
  225. package/build-types/alignment-matrix-control/types.d.ts.map +1 -0
  226. package/build-types/alignment-matrix-control/utils.d.ts +33 -0
  227. package/build-types/alignment-matrix-control/utils.d.ts.map +1 -0
  228. package/build-types/base-control/hooks.d.ts +23 -0
  229. package/build-types/base-control/hooks.d.ts.map +1 -0
  230. package/build-types/base-control/index.d.ts +17 -7
  231. package/build-types/base-control/index.d.ts.map +1 -1
  232. package/build-types/base-control/stories/index.d.ts.map +1 -1
  233. package/build-types/base-control/test/index.d.ts +2 -0
  234. package/build-types/base-control/test/index.d.ts.map +1 -0
  235. package/build-types/base-control/types.d.ts +8 -2
  236. package/build-types/base-control/types.d.ts.map +1 -1
  237. package/build-types/base-field/hook.d.ts +7 -31
  238. package/build-types/base-field/hook.d.ts.map +1 -1
  239. package/build-types/base-field/index.d.ts +1 -1
  240. package/build-types/base-field/index.d.ts.map +1 -1
  241. package/build-types/base-field/styles.d.ts +5 -5
  242. package/build-types/base-field/styles.d.ts.map +1 -1
  243. package/build-types/base-field/test/index.d.ts +2 -0
  244. package/build-types/base-field/test/index.d.ts.map +1 -0
  245. package/build-types/base-field/types.d.ts +29 -0
  246. package/build-types/base-field/types.d.ts.map +1 -0
  247. package/build-types/border-box-control/border-box-control/hook.d.ts +2 -2
  248. package/build-types/border-box-control/border-box-control-linked-button/hook.d.ts +2 -2
  249. package/build-types/border-box-control/border-box-control-split-controls/hook.d.ts +2 -2
  250. package/build-types/border-box-control/border-box-control-visualizer/hook.d.ts +2 -2
  251. package/build-types/border-control/border-control/component.d.ts.map +1 -1
  252. package/build-types/border-control/border-control/hook.d.ts +2 -2
  253. package/build-types/border-control/border-control-dropdown/hook.d.ts +2 -2
  254. package/build-types/border-control/border-control-style-picker/hook.d.ts +2 -2
  255. package/build-types/border-control/styles.d.ts.map +1 -1
  256. package/build-types/card/card/hook.d.ts +2 -2
  257. package/build-types/card/card-body/hook.d.ts +2 -2
  258. package/build-types/card/card-divider/hook.d.ts +2 -2
  259. package/build-types/card/card-footer/hook.d.ts +2 -2
  260. package/build-types/card/card-header/hook.d.ts +2 -2
  261. package/build-types/card/card-media/hook.d.ts +2 -2
  262. package/build-types/color-palette/index.d.ts +2 -2
  263. package/build-types/color-palette/index.d.ts.map +1 -1
  264. package/build-types/color-palette/stories/index.d.ts +6 -7
  265. package/build-types/color-palette/stories/index.d.ts.map +1 -1
  266. package/build-types/color-palette/styles.d.ts +1 -1
  267. package/build-types/color-palette/types.d.ts +1 -1
  268. package/build-types/color-palette/types.d.ts.map +1 -1
  269. package/build-types/color-picker/input-with-slider.d.ts.map +1 -1
  270. package/build-types/color-picker/styles.d.ts +5 -5
  271. package/build-types/color-picker/styles.d.ts.map +1 -1
  272. package/build-types/custom-select-control/index.d.ts.map +1 -1
  273. package/build-types/dashicon/index.d.ts +6 -20
  274. package/build-types/dashicon/index.d.ts.map +1 -1
  275. package/build-types/dashicon/types.d.ts +14 -0
  276. package/build-types/dashicon/types.d.ts.map +1 -1
  277. package/build-types/date-time/date/styles.d.ts +3 -3
  278. package/build-types/date-time/date-time/styles.d.ts +3 -3
  279. package/build-types/date-time/time/styles.d.ts +8 -8
  280. package/build-types/elevation/hook.d.ts +2 -2
  281. package/build-types/external-link/styles/external-link-styles.d.ts +1 -1
  282. package/build-types/flex/flex/hook.d.ts +2 -2
  283. package/build-types/flex/flex-block/hook.d.ts +2 -2
  284. package/build-types/flex/flex-item/hook.d.ts +2 -2
  285. package/build-types/focal-point-picker/styles/focal-point-picker-style.d.ts +2 -5
  286. package/build-types/focal-point-picker/styles/focal-point-picker-style.d.ts.map +1 -1
  287. package/build-types/grid/hook.d.ts +2 -2
  288. package/build-types/h-stack/component.d.ts +1 -1
  289. package/build-types/h-stack/hook.d.ts +2 -2
  290. package/build-types/heading/hook.d.ts +2 -2
  291. package/build-types/input-control/index.d.ts +1 -1
  292. package/build-types/input-control/index.d.ts.map +1 -1
  293. package/build-types/input-control/input-base.d.ts.map +1 -1
  294. package/build-types/input-control/stories/index.d.ts +1 -0
  295. package/build-types/input-control/stories/index.d.ts.map +1 -1
  296. package/build-types/input-control/types.d.ts +2 -1
  297. package/build-types/input-control/types.d.ts.map +1 -1
  298. package/build-types/item-group/item/hook.d.ts +2 -2
  299. package/build-types/item-group/item-group/hook.d.ts +2 -2
  300. package/build-types/modal/index.d.ts.map +1 -1
  301. package/build-types/modal/stories/index.d.ts.map +1 -1
  302. package/build-types/navigator/navigator-back-button/hook.d.ts +3 -3
  303. package/build-types/navigator/navigator-button/hook.d.ts +3 -3
  304. package/build-types/navigator/navigator-provider/component.d.ts.map +1 -1
  305. package/build-types/number-control/index.d.ts +2 -2
  306. package/build-types/number-control/index.d.ts.map +1 -1
  307. package/build-types/number-control/stories/index.d.ts +25 -0
  308. package/build-types/number-control/stories/index.d.ts.map +1 -0
  309. package/build-types/number-control/styles/number-control-styles.d.ts +6 -6
  310. package/build-types/number-control/styles/number-control-styles.d.ts.map +1 -1
  311. package/build-types/number-control/test/index.d.ts +2 -0
  312. package/build-types/number-control/test/index.d.ts.map +1 -0
  313. package/build-types/popover/index.d.ts +1 -1
  314. package/build-types/popover/index.d.ts.map +1 -1
  315. package/build-types/popover/stories/e2e/index.d.ts +1 -1
  316. package/build-types/range-control/index.d.ts +1 -1
  317. package/build-types/range-control/styles/range-control-styles.d.ts +2 -2
  318. package/build-types/resizable-box/resize-tooltip/index.d.ts +15 -19
  319. package/build-types/resizable-box/resize-tooltip/index.d.ts.map +1 -1
  320. package/build-types/resizable-box/resize-tooltip/label.d.ts +4 -3
  321. package/build-types/resizable-box/resize-tooltip/label.d.ts.map +1 -1
  322. package/build-types/scrollable/hook.d.ts +2 -2
  323. package/build-types/search-control/index.d.ts +1 -1
  324. package/build-types/search-control/stories/index.d.ts +2 -2
  325. package/build-types/snackbar/index.d.ts +19 -0
  326. package/build-types/snackbar/index.d.ts.map +1 -0
  327. package/build-types/snackbar/list.d.ts +18 -0
  328. package/build-types/snackbar/list.d.ts.map +1 -0
  329. package/build-types/snackbar/stories/index.d.ts +16 -0
  330. package/build-types/snackbar/stories/index.d.ts.map +1 -0
  331. package/build-types/snackbar/stories/list.d.ts +12 -0
  332. package/build-types/snackbar/stories/list.d.ts.map +1 -0
  333. package/build-types/snackbar/types.d.ts +111 -0
  334. package/build-types/snackbar/types.d.ts.map +1 -0
  335. package/build-types/spacer/hook.d.ts +2 -2
  336. package/build-types/spinner/index.d.ts +1 -1
  337. package/build-types/surface/hook.d.ts +2 -2
  338. package/build-types/tab-panel/index.d.ts +1 -1
  339. package/build-types/tab-panel/index.d.ts.map +1 -1
  340. package/build-types/tab-panel/types.d.ts +19 -1
  341. package/build-types/tab-panel/types.d.ts.map +1 -1
  342. package/build-types/text/hook.d.ts +2 -2
  343. package/build-types/text-control/index.d.ts +2 -2
  344. package/build-types/text-control/stories/index.d.ts.map +1 -1
  345. package/build-types/text-control/types.d.ts +1 -5
  346. package/build-types/text-control/types.d.ts.map +1 -1
  347. package/build-types/theme/color-algorithms.d.ts +20 -0
  348. package/build-types/theme/color-algorithms.d.ts.map +1 -0
  349. package/build-types/theme/index.d.ts +1 -1
  350. package/build-types/theme/index.d.ts.map +1 -1
  351. package/build-types/theme/stories/index.d.ts +4 -0
  352. package/build-types/theme/stories/index.d.ts.map +1 -1
  353. package/build-types/theme/styles.d.ts +3 -2
  354. package/build-types/theme/styles.d.ts.map +1 -1
  355. package/build-types/theme/test/color-algorithms.d.ts +2 -0
  356. package/build-types/theme/test/color-algorithms.d.ts.map +1 -0
  357. package/build-types/theme/types.d.ts +41 -3
  358. package/build-types/theme/types.d.ts.map +1 -1
  359. package/build-types/toggle-control/index.d.ts.map +1 -1
  360. package/build-types/toggle-group-control/toggle-group-control/as-button-group.d.ts +2 -2
  361. package/build-types/toggle-group-control/toggle-group-control/as-radio-group.d.ts +2 -2
  362. package/build-types/toggle-group-control/toggle-group-control-option/component.d.ts +1 -1
  363. package/build-types/toggle-group-control/toggle-group-control-option-icon/component.d.ts +1 -1
  364. package/build-types/tools-panel/tools-panel/hook.d.ts +2 -2
  365. package/build-types/tools-panel/tools-panel-header/hook.d.ts +2 -2
  366. package/build-types/tools-panel/tools-panel-item/hook.d.ts +2 -2
  367. package/build-types/truncate/hook.d.ts +2 -2
  368. package/build-types/ui/context/context-system-provider.d.ts.map +1 -1
  369. package/build-types/ui/control-group/hook.d.ts +2 -2
  370. package/build-types/ui/control-label/hook.d.ts +2 -2
  371. package/build-types/ui/form-group/form-group.d.ts +2 -2
  372. package/build-types/ui/form-group/use-form-group.d.ts +5 -5
  373. package/build-types/unit-control/index.d.ts +2 -1
  374. package/build-types/unit-control/index.d.ts.map +1 -1
  375. package/build-types/unit-control/styles/unit-control-styles.d.ts +2 -2
  376. package/build-types/unit-control/types.d.ts +4 -0
  377. package/build-types/unit-control/types.d.ts.map +1 -1
  378. package/build-types/utils/config-values.d.ts +0 -2
  379. package/build-types/utils/hooks/use-controlled-value.d.ts +2 -1
  380. package/build-types/utils/hooks/use-controlled-value.d.ts.map +1 -1
  381. package/build-types/v-stack/component.d.ts +2 -2
  382. package/build-types/v-stack/hook.d.ts +2 -2
  383. package/build-types/v-stack/stories/index.d.ts +2 -2
  384. package/package.json +21 -20
  385. package/src/alignment-matrix-control/README.md +7 -7
  386. package/src/alignment-matrix-control/{cell.js → cell.tsx} +7 -1
  387. package/src/alignment-matrix-control/{icon.js → icon.tsx} +6 -3
  388. package/src/alignment-matrix-control/{index.js → index.tsx} +31 -4
  389. package/src/alignment-matrix-control/stories/{index.js → index.tsx} +17 -9
  390. package/src/alignment-matrix-control/styles/{alignment-matrix-control-icon-styles.js → alignment-matrix-control-icon-styles.ts} +11 -3
  391. package/src/alignment-matrix-control/styles/{alignment-matrix-control-styles.js → alignment-matrix-control-styles.ts} +13 -3
  392. package/src/alignment-matrix-control/test/{index.js → index.tsx} +5 -5
  393. package/src/alignment-matrix-control/types.ts +54 -0
  394. package/src/alignment-matrix-control/{utils.js → utils.tsx} +24 -14
  395. package/src/angle-picker-control/styles/angle-picker-control-styles.js +4 -0
  396. package/src/autocomplete/index.js +43 -12
  397. package/src/base-control/README.md +21 -12
  398. package/src/base-control/hooks.ts +45 -0
  399. package/src/base-control/index.tsx +18 -7
  400. package/src/base-control/stories/index.tsx +8 -10
  401. package/src/base-control/test/index.tsx +52 -0
  402. package/src/base-control/types.ts +8 -2
  403. package/src/base-field/README.md +21 -22
  404. package/src/base-field/{hook.js → hook.ts} +5 -15
  405. package/src/base-field/{index.js → index.ts} +0 -0
  406. package/src/base-field/{styles.js → styles.ts} +2 -2
  407. package/src/base-field/test/__snapshots__/{index.js.snap → index.tsx.snap} +4 -4
  408. package/src/base-field/test/{index.js → index.tsx} +10 -5
  409. package/src/base-field/types.ts +29 -0
  410. package/src/border-box-control/border-box-control/README.md +1 -0
  411. package/src/border-box-control/test/index.js +3 -1
  412. package/src/border-control/border-control/component.tsx +1 -0
  413. package/src/border-control/styles.ts +1 -10
  414. package/src/box-control/linked-button.js +8 -11
  415. package/src/box-control/test/index.js +206 -135
  416. package/src/button/stories/index.js +30 -0
  417. package/src/button/style.scss +17 -14
  418. package/src/button/test/index.js +32 -15
  419. package/src/card/test/index.tsx +32 -20
  420. package/src/circular-option-picker/style.scss +1 -0
  421. package/src/color-palette/index.tsx +4 -6
  422. package/src/color-palette/stories/index.tsx +1 -5
  423. package/src/color-palette/test/__snapshots__/index.tsx.snap +4 -4
  424. package/src/color-palette/test/index.tsx +84 -36
  425. package/src/color-palette/types.ts +1 -1
  426. package/src/color-picker/README.md +1 -0
  427. package/src/color-picker/input-with-slider.tsx +1 -0
  428. package/src/color-picker/styles.ts +0 -4
  429. package/src/confirm-dialog/README.md +3 -2
  430. package/src/custom-select-control/README.md +14 -0
  431. package/src/custom-select-control/index.js +14 -2
  432. package/src/dashicon/{index.js → index.tsx} +10 -4
  433. package/src/dashicon/types.ts +17 -0
  434. package/src/date-time/date-time/index.tsx +2 -2
  435. package/src/dimension-control/test/__snapshots__/index.test.js.snap +4 -8
  436. package/src/disabled/test/index.tsx +21 -11
  437. package/src/dropdown/test/index.js +39 -49
  438. package/src/dropdown-menu/test/index.js +18 -12
  439. package/src/duotone-picker/duotone-picker.js +2 -2
  440. package/src/focal-point-picker/test/media.js +26 -21
  441. package/src/form-token-field/style.scss +1 -1
  442. package/src/gradient-picker/index.js +5 -8
  443. package/src/grid/test/grid.tsx +31 -31
  444. package/src/higher-order/navigate-regions/style.scss +2 -22
  445. package/src/higher-order/with-fallback-styles/index.js +4 -2
  446. package/src/higher-order/with-filters/test/index.js +94 -101
  447. package/src/higher-order/with-focus-return/test/index.js +1 -4
  448. package/src/index.js +2 -2
  449. package/src/input-control/index.tsx +42 -28
  450. package/src/input-control/input-base.tsx +8 -1
  451. package/src/input-control/stories/index.tsx +6 -0
  452. package/src/input-control/test/index.js +18 -0
  453. package/src/input-control/types.ts +2 -0
  454. package/src/mobile/bottom-sheet/cell.native.js +1 -1
  455. package/src/mobile/bottom-sheet/switch-cell.native.js +2 -2
  456. package/src/mobile/global-styles-context/index.native.js +9 -11
  457. package/src/mobile/keyboard-aware-flat-list/index.ios.js +2 -2
  458. package/src/mobile/link-settings/test/edit.native.js +68 -124
  459. package/src/modal/index.tsx +11 -0
  460. package/src/modal/stories/index.tsx +3 -0
  461. package/src/modal/test/index.tsx +15 -0
  462. package/src/navigation/stories/index.js +6 -6
  463. package/src/navigation/stories/{controlled-state.js → utils/controlled-state.js} +3 -3
  464. package/src/navigation/stories/{default.js → utils/default.js} +3 -3
  465. package/src/navigation/stories/{group.js → utils/group.js} +4 -4
  466. package/src/navigation/stories/{hide-if-empty.js → utils/hide-if-empty.js} +3 -3
  467. package/src/navigation/stories/{more-examples.js → utils/more-examples.js} +4 -4
  468. package/src/navigation/stories/{search.js → utils/search.js} +5 -5
  469. package/src/navigator/navigator-provider/component.tsx +13 -10
  470. package/src/notice/test/list.js +8 -5
  471. package/src/number-control/stories/{index.js → index.tsx} +24 -7
  472. package/src/number-control/styles/{number-control-styles.js → number-control-styles.ts} +5 -3
  473. package/src/number-control/test/index.tsx +600 -0
  474. package/src/palette-edit/index.js +88 -39
  475. package/src/palette-edit/test/index.js +25 -1
  476. package/src/popover/index.tsx +10 -2
  477. package/src/popover/style.scss +12 -11
  478. package/src/popover/test/index.tsx +25 -15
  479. package/src/query-controls/index.js +1 -0
  480. package/src/range-control/test/index.tsx +57 -60
  481. package/src/resizable-box/style.scss +1 -0
  482. package/src/sandbox/test/index.js +13 -11
  483. package/src/search-control/style.scss +4 -0
  484. package/src/snackbar/README.md +63 -8
  485. package/src/snackbar/{index.js → index.tsx} +46 -28
  486. package/src/snackbar/{list.js → list.tsx} +20 -21
  487. package/src/snackbar/stories/index.tsx +96 -0
  488. package/src/snackbar/stories/list.tsx +98 -0
  489. package/src/snackbar/types.ts +116 -0
  490. package/src/tab-panel/README.md +9 -0
  491. package/src/tab-panel/index.tsx +14 -3
  492. package/src/tab-panel/style.scss +46 -34
  493. package/src/tab-panel/test/index.tsx +111 -0
  494. package/src/tab-panel/types.ts +20 -1
  495. package/src/text/test/__snapshots__/index.tsx.snap +1 -0
  496. package/src/text/test/index.tsx +98 -46
  497. package/src/text-control/stories/index.tsx +0 -1
  498. package/src/text-control/types.ts +1 -6
  499. package/src/theme/README.md +32 -2
  500. package/src/theme/color-algorithms.ts +138 -0
  501. package/src/theme/index.tsx +23 -16
  502. package/src/theme/stories/index.tsx +67 -0
  503. package/src/theme/styles.ts +22 -17
  504. package/src/theme/test/color-algorithms.ts +100 -0
  505. package/src/theme/test/index.tsx +68 -35
  506. package/src/theme/types.ts +43 -3
  507. package/src/toggle-control/index.tsx +4 -2
  508. package/src/toggle-group-control/test/index.tsx +13 -2
  509. package/src/toolbar-group/test/index.js +8 -6
  510. package/src/tools-panel/stories/index.js +1 -1
  511. package/src/tools-panel/stories/{tools-panel-with-item-group-slot.js → utils/tools-panel-with-item-group-slot.js} +14 -11
  512. package/src/tools-panel/test/index.js +20 -14
  513. package/src/tooltip/README.md +7 -0
  514. package/src/tooltip/style.scss +2 -2
  515. package/src/tooltip/test/index.js +109 -18
  516. package/src/ui/context/context-system-provider.js +3 -2
  517. package/src/ui/context/test/context-system-provider.js +5 -4
  518. package/src/ui/control-label/test/index.js +3 -5
  519. package/src/unit-control/README.md +9 -1
  520. package/src/unit-control/index.tsx +3 -0
  521. package/src/unit-control/test/index.tsx +1 -0
  522. package/src/unit-control/types.ts +4 -0
  523. package/src/utils/colors-values.js +1 -1
  524. package/src/utils/config-values.js +0 -2
  525. package/src/utils/hooks/use-controlled-value.ts +2 -2
  526. package/src/utils/theme-variables.scss +20 -0
  527. package/tsconfig.json +2 -4
  528. package/tsconfig.tsbuildinfo +1 -1
  529. package/src/number-control/test/index.js +0 -478
  530. package/src/snackbar/stories/index.js +0 -89
@@ -0,0 +1,116 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import type { MutableRefObject, ReactNode, SyntheticEvent } from 'react';
5
+
6
+ export type NoticeActionWithURL = {
7
+ label: string;
8
+ url: string;
9
+ onClick?: ( event: SyntheticEvent ) => void;
10
+ };
11
+
12
+ type NoticeActionWithOnClick = {
13
+ label: string;
14
+ url?: string;
15
+ onClick: ( event: SyntheticEvent ) => void;
16
+ };
17
+
18
+ // TODO: move this type to the Notice component once it gets typed.
19
+ export type NoticeAction = NoticeActionWithURL | NoticeActionWithOnClick;
20
+
21
+ export type Notice = {
22
+ id: string;
23
+ spokenMessage: string;
24
+ actions: NoticeAction[];
25
+ icon?: ReactNode;
26
+ onDismiss?: () => void;
27
+ content: string;
28
+ isDismissible: boolean;
29
+ explicitDismiss: boolean;
30
+ };
31
+
32
+ export type SnackbarProps = {
33
+ /**
34
+ * The displayed message of a notice.
35
+ *
36
+ * Also used as the spoken message for assistive technology,
37
+ * unless `spokenMessage` is provided as an alternative message.
38
+ */
39
+ children: string;
40
+ /**
41
+ * Used to provide a custom spoken message.
42
+ *
43
+ * @default children
44
+ */
45
+ spokenMessage?: Notice[ 'spokenMessage' ];
46
+ /**
47
+ * A politeness level for the notice's spoken message. Should be provided as
48
+ * one of the valid options for an `aria-live` attribute value. Note that this
49
+ * value should be considered a suggestion; assistive technologies may
50
+ * override it based on internal heuristics.
51
+ *
52
+ * A value of `'assertive'` is to be used for important, and usually
53
+ * time-sensitive, information. It will interrupt anything else the screen
54
+ * reader is announcing in that moment.
55
+ * A value of `'polite'` is to be used for advisory information. It should
56
+ * not interrupt what the screen reader is announcing in that moment
57
+ * (the "speech queue") or interrupt the current task.
58
+ *
59
+ * @see https://www.w3.org/TR/wai-aria-1.1/#aria-live
60
+ *
61
+ * @default 'polite'
62
+ */
63
+ politeness?: 'polite' | 'assertive';
64
+ /**
65
+ * An array of action objects.
66
+ *
67
+ * Each member object should contain
68
+ * a `label` and either a `url` link string or `onClick` callback function.
69
+ *
70
+ * @default []
71
+ */
72
+ actions?: Notice[ 'actions' ];
73
+ /**
74
+ * Called to remove the snackbar from the UI.
75
+ */
76
+ onRemove?: () => void;
77
+ /**
78
+ * The icon to render in the snackbar.
79
+ *
80
+ * @default null
81
+ */
82
+ icon?: Notice[ 'icon' ];
83
+ /**
84
+ * Whether to require user action to dismiss the snackbar.
85
+ * By default, this is dismissed on a timeout, without user interaction.
86
+ *
87
+ * @default false
88
+ */
89
+ explicitDismiss?: Notice[ 'explicitDismiss' ];
90
+ /**
91
+ * A callback executed when the snackbar is dismissed.
92
+ *
93
+ * It is distinct from onRemove, which _looks_ like a callback but is
94
+ * actually the function to call to remove the snackbar from the UI.
95
+ */
96
+ onDismiss?: Notice[ 'onDismiss' ];
97
+ /**
98
+ * A ref to the list that contains the snackbar.
99
+ */
100
+ listRef?: MutableRefObject< HTMLDivElement | null >;
101
+ };
102
+
103
+ export type SnackbarListProps = {
104
+ /**
105
+ * Array of notices to render.
106
+ */
107
+ notices: Notice[];
108
+ /**
109
+ * Children to be rendered inside the notice list.
110
+ */
111
+ children?: ReactNode;
112
+ /**
113
+ * Function called when a notice should be removed / dismissed.
114
+ */
115
+ onRemove?: ( id: Notice[ 'id' ] ) => void;
116
+ };
@@ -120,6 +120,7 @@ An array of objects containing the following properties:
120
120
  - `name`: `(string)` Defines the key for the tab.
121
121
  - `title`:`(string)` Defines the translated text for the tab.
122
122
  - `className`:`(string)` Optional. Defines the class to put on the tab.
123
+ - `icon`:`(ReactNode)` Optional. When set, displays the icon in place of the tab title. The title is then rendered as an aria-label and tooltip.
123
124
 
124
125
  > > **Note:** Other fields may be added to the object and accessed from the child function if desired.
125
126
 
@@ -142,6 +143,14 @@ The name of the tab to be selected upon mounting of component. If this prop is n
142
143
  - Required: No
143
144
  - Default: none
144
145
 
146
+ #### selectOnMove
147
+
148
+ 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.
149
+
150
+ - Type: `boolean`
151
+ - Required: No
152
+ - Default: `true`
153
+
145
154
  #### children
146
155
 
147
156
  A function which renders the tabviews given the selected tab. The function is passed the active tab object as an argument as defined the tabs prop.
@@ -77,6 +77,7 @@ export function TabPanel( {
77
77
  className,
78
78
  children,
79
79
  tabs,
80
+ selectOnMove = true,
80
81
  initialTabName,
81
82
  orientation = 'horizontal',
82
83
  activeClass = 'is-active',
@@ -93,7 +94,12 @@ export function TabPanel( {
93
94
  [ onSelect ]
94
95
  );
95
96
 
96
- const onNavigate = ( _childIndex: number, child: HTMLButtonElement ) => {
97
+ // Simulate a click on the newly focused tab, which causes the component
98
+ // to show the `tab-panel` associated with the clicked tab.
99
+ const activateTabAutomatically = (
100
+ _childIndex: number,
101
+ child: HTMLButtonElement
102
+ ) => {
97
103
  child.click();
98
104
  };
99
105
  const selectedTab = find( tabs, { name: selected } );
@@ -110,7 +116,9 @@ export function TabPanel( {
110
116
  <NavigableMenu
111
117
  role="tablist"
112
118
  orientation={ orientation }
113
- onNavigate={ onNavigate }
119
+ onNavigate={
120
+ selectOnMove ? activateTabAutomatically : undefined
121
+ }
114
122
  className="components-tab-panel__tabs"
115
123
  >
116
124
  { tabs.map( ( tab ) => (
@@ -127,8 +135,11 @@ export function TabPanel( {
127
135
  selected={ tab.name === selected }
128
136
  key={ tab.name }
129
137
  onClick={ () => handleTabSelection( tab.name ) }
138
+ label={ tab.icon && tab.title }
139
+ icon={ tab.icon }
140
+ showTooltip={ !! tab.icon }
130
141
  >
131
- { tab.title }
142
+ { ! tab.icon && tab.title }
132
143
  </TabButton>
133
144
  ) ) }
134
145
  </NavigableMenu>
@@ -7,57 +7,69 @@
7
7
  }
8
8
  }
9
9
 
10
+ // This tab style CSS is duplicated verbatim in
11
+ // /packages/edit-post/src/components/sidebar/settings-header/style.scss
10
12
  .components-tab-panel__tabs-item {
13
+ position: relative;
14
+ border-radius: 0;
15
+ height: $grid-unit-60;
11
16
  background: transparent;
12
17
  border: none;
13
18
  box-shadow: none;
14
- border-radius: 0;
15
19
  cursor: pointer;
16
- height: $grid-unit-60;
17
20
  padding: 3px $grid-unit-20; // Use padding to offset the is-active border, this benefits Windows High Contrast mode
18
21
  margin-left: 0;
19
22
  font-weight: 500;
20
- transition: box-shadow 0.1s linear;
21
- box-sizing: border-box;
22
23
 
23
- // This pseudo-element "duplicates" the tab label and sets the text to bold.
24
- // This ensures that the tab doesn't change width when selected.
25
- // See: https://github.com/WordPress/gutenberg/pull/9793
24
+ &:focus:not(:disabled) {
25
+ position: relative;
26
+ box-shadow: none;
27
+ }
28
+
29
+ // Tab indicator
26
30
  &::after {
27
- content: attr(data-label);
28
- display: block;
29
- height: 0;
30
- overflow: hidden;
31
- speak: none;
32
- visibility: hidden;
31
+ content: "";
32
+ position: absolute;
33
+ right: 0;
34
+ bottom: 0;
35
+ left: 0;
36
+ pointer-events: none;
37
+
38
+ // Draw the indicator.
39
+ background: $components-color-accent;
40
+ height: calc(0 * var(--wp-admin-border-width-focus));
41
+ border-radius: 0;
42
+
43
+ // Animation
44
+ transition: all 0.1s linear;
45
+ @include reduce-motion("transition");
33
46
  }
34
47
 
35
- &:focus:not(:disabled) {
36
- box-shadow: inset 0 var(--wp-admin-border-width-focus) $components-color-accent;
48
+ // Active.
49
+ &.is-active::after {
50
+ height: calc(1 * var(--wp-admin-border-width-focus));
37
51
  }
38
52
 
39
- &.is-active {
40
- // The transparent shadow ensures no jumpiness when focus animates on an active tab.
41
- box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) transparent, inset 0 0 -$border-width-tab 0 0 $components-color-accent;
42
- position: relative;
53
+ // Focus.
54
+ &::before {
55
+ content: "";
56
+ position: absolute;
57
+ top: $grid-unit-15;
58
+ right: $grid-unit-15;
59
+ bottom: $grid-unit-15;
60
+ left: $grid-unit-15;
61
+ pointer-events: none;
43
62
 
44
- // This border appears in Windows High Contrast mode instead of the box-shadow.
45
- &::before {
46
- content: "";
47
- position: absolute;
48
- top: 0;
49
- bottom: 1px;
50
- right: 0;
51
- left: 0;
52
- border-bottom: $border-width-tab solid transparent;
53
- }
54
- }
63
+ // Draw the indicator.
64
+ box-shadow: 0 0 0 0 transparent;
65
+ border-radius: $radius-block-ui;
55
66
 
56
- &:focus {
57
- box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) $components-color-accent;
67
+ // Animation
68
+ transition: all 0.1s linear;
69
+ @include reduce-motion("transition");
58
70
  }
59
71
 
60
- &.is-active:focus {
61
- box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) $components-color-accent, inset 0 -#{$border-width-tab * 2} 0 0 $components-color-accent;
72
+ &:focus-visible::before {
73
+ box-shadow: 0 0 0 var(--wp-admin-border-width-focus) $components-color-accent;
62
74
  }
63
75
  }
@@ -34,7 +34,24 @@ const TABS = [
34
34
 
35
35
  const getSelectedTab = () => screen.getByRole( 'tab', { selected: true } );
36
36
 
37
+ let originalGetClientRects: () => DOMRectList;
38
+
37
39
  describe( 'TabPanel', () => {
40
+ beforeAll( () => {
41
+ originalGetClientRects = window.HTMLElement.prototype.getClientRects;
42
+ // Mocking `getClientRects()` is necessary to pass a check performed by
43
+ // the `focus.tabbable.find()` and by the `focus.focusable.find()` functions
44
+ // from the `@wordpress/dom` package.
45
+ // @ts-expect-error We're not trying to comply to the DOM spec, only mocking
46
+ window.HTMLElement.prototype.getClientRects = function () {
47
+ return [ 'trick-jsdom-into-having-size-for-element-rect' ];
48
+ };
49
+ } );
50
+
51
+ afterAll( () => {
52
+ window.HTMLElement.prototype.getClientRects = originalGetClientRects;
53
+ } );
54
+
38
55
  it( 'should render a tabpanel, and clicking should change tabs', async () => {
39
56
  const user = setupUser();
40
57
  const panelRenderFunction = jest.fn();
@@ -194,4 +211,98 @@ describe( 'TabPanel', () => {
194
211
  expect( mockOnSelect ).toHaveBeenLastCalledWith( 'beta' );
195
212
  } );
196
213
  } );
214
+
215
+ describe( 'tab activation', () => {
216
+ it( 'defaults to automatic tab activation', async () => {
217
+ const user = setupUser();
218
+ const mockOnSelect = jest.fn();
219
+
220
+ render(
221
+ <TabPanel
222
+ tabs={ TABS }
223
+ children={ () => undefined }
224
+ onSelect={ mockOnSelect }
225
+ />
226
+ );
227
+
228
+ // onSelect gets called on the initial render.
229
+ expect( mockOnSelect ).toHaveBeenCalledTimes( 1 );
230
+
231
+ // Click on Alpha, make sure Alpha is selected
232
+ await user.click( screen.getByRole( 'tab', { name: 'Alpha' } ) );
233
+ expect( mockOnSelect ).toHaveBeenCalledTimes( 2 );
234
+ expect( mockOnSelect ).toHaveBeenLastCalledWith( 'alpha' );
235
+
236
+ // Navigate forward with arrow keys,
237
+ // make sure Beta is selected automatically.
238
+ await user.keyboard( '[ArrowRight]' );
239
+ expect( mockOnSelect ).toHaveBeenCalledTimes( 3 );
240
+ expect( mockOnSelect ).toHaveBeenLastCalledWith( 'beta' );
241
+
242
+ // Navigate forward with arrow keys,
243
+ // make sure Gamma (last tab) is selected automatically.
244
+ await user.keyboard( '[ArrowRight]' );
245
+ expect( mockOnSelect ).toHaveBeenCalledTimes( 4 );
246
+ expect( mockOnSelect ).toHaveBeenLastCalledWith( 'gamma' );
247
+
248
+ // Navigate forward with arrow keys,
249
+ // make sure Alpha (first tab) is selected automatically.
250
+ await user.keyboard( '[ArrowRight]' );
251
+ expect( mockOnSelect ).toHaveBeenCalledTimes( 5 );
252
+ expect( mockOnSelect ).toHaveBeenLastCalledWith( 'alpha' );
253
+
254
+ // Navigate backwards with arrow keys,
255
+ // make sure Gamma (last tab) is selected automatically
256
+ await user.keyboard( '[ArrowLeft]' );
257
+ expect( mockOnSelect ).toHaveBeenCalledTimes( 6 );
258
+ expect( mockOnSelect ).toHaveBeenLastCalledWith( 'gamma' );
259
+ } );
260
+
261
+ it( 'switches to manual tab activation when the `selectOnMove` prop is set to `false`', async () => {
262
+ const user = setupUser();
263
+ const mockOnSelect = jest.fn();
264
+
265
+ render(
266
+ <TabPanel
267
+ tabs={ TABS }
268
+ children={ () => undefined }
269
+ onSelect={ mockOnSelect }
270
+ selectOnMove={ false }
271
+ />
272
+ );
273
+
274
+ // onSelect gets called on the initial render.
275
+ expect( mockOnSelect ).toHaveBeenCalledTimes( 1 );
276
+
277
+ // Click on Alpha, make sure Alpha is selected
278
+ await user.click( screen.getByRole( 'tab', { name: 'Alpha' } ) );
279
+ expect( mockOnSelect ).toHaveBeenCalledTimes( 2 );
280
+ expect( mockOnSelect ).toHaveBeenLastCalledWith( 'alpha' );
281
+
282
+ // Navigate forward with arrow keys.
283
+ // Make sure Beta is focused, but that the tab selection happens only when
284
+ // pressing the spacebar or the enter key.
285
+ await user.keyboard( '[ArrowRight]' );
286
+ expect( mockOnSelect ).toHaveBeenCalledTimes( 2 );
287
+ expect( screen.getByRole( 'tab', { name: 'Beta' } ) ).toHaveFocus();
288
+ await user.keyboard( '[Enter]' );
289
+ expect( mockOnSelect ).toHaveBeenCalledTimes( 3 );
290
+ expect( mockOnSelect ).toHaveBeenLastCalledWith( 'beta' );
291
+
292
+ // Navigate forward with arrow keys.
293
+ // Make sure Gamma (last tab) is focused, but that the tab selection
294
+ // happens only when pressing the spacebar or the enter key.
295
+ await user.keyboard( '[ArrowRight]' );
296
+ expect( mockOnSelect ).toHaveBeenCalledTimes( 3 );
297
+ expect(
298
+ screen.getByRole( 'tab', { name: 'Gamma' } )
299
+ ).toHaveFocus();
300
+ await user.keyboard( '[Space]' );
301
+ expect( mockOnSelect ).toHaveBeenCalledTimes( 4 );
302
+ expect( mockOnSelect ).toHaveBeenLastCalledWith( 'gamma' );
303
+
304
+ // No need to test the "wrap-around" behavior, as it's being tested in the
305
+ // "automatic tab activation" test above.
306
+ } );
307
+ } );
197
308
  } );
@@ -3,6 +3,11 @@
3
3
  */
4
4
  import type { ReactNode } from 'react';
5
5
 
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import type { IconType } from '../icon';
10
+
6
11
  type Tab = {
7
12
  /**
8
13
  * The key of the tab.
@@ -18,11 +23,14 @@ type Tab = {
18
23
  className?: string;
19
24
  } & Record< any, any >;
20
25
 
21
- export type TabButtonProps = {
26
+ export type TabButtonProps< IconProps = unknown > = {
22
27
  children: ReactNode;
23
28
  className?: string;
29
+ icon?: IconType< IconProps >;
30
+ label?: string;
24
31
  onClick: ( event: MouseEvent ) => void;
25
32
  selected: boolean;
33
+ showTooltip?: boolean;
26
34
  tabId: string;
27
35
  };
28
36
 
@@ -62,4 +70,15 @@ export type TabPanelProps = {
62
70
  * Array of tab objects. Each tab object should contain at least a `name` and a `title`.
63
71
  */
64
72
  tabs: Tab[];
73
+ /**
74
+ * When `true`, the tab will be selected when receiving focus (automatic tab
75
+ * activation). When `false`, the tab will be selected only when clicked
76
+ * (manual tab activation). See the official W3C docs for more info.
77
+ * .
78
+ *
79
+ * @default true
80
+ *
81
+ * @see https://www.w3.org/WAI/ARIA/apg/patterns/tabpanel/
82
+ */
83
+ selectOnMove?: boolean;
65
84
  };
@@ -36,6 +36,7 @@ exports[`Text should render highlighted words with highlightCaseSensitive 1`] =
36
36
  class="components-truncate components-text emotion-0 emotion-1"
37
37
  data-wp-c16t="true"
38
38
  data-wp-component="Text"
39
+ role="heading"
39
40
  >
40
41
  <span
41
42
  class=""