@wordpress/components 28.4.0 → 28.5.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 (250) hide show
  1. package/CHANGELOG.md +31 -1
  2. package/build/autocomplete/autocompleter-ui.js +2 -0
  3. package/build/autocomplete/autocompleter-ui.js.map +1 -1
  4. package/build/base-control/styles/base-control-styles.js +8 -8
  5. package/build/base-control/styles/base-control-styles.js.map +1 -1
  6. package/build/border-control/styles.js +18 -24
  7. package/build/border-control/styles.js.map +1 -1
  8. package/build/color-palette/index.js +1 -1
  9. package/build/color-palette/index.js.map +1 -1
  10. package/build/custom-select-control/index.js +37 -14
  11. package/build/custom-select-control/index.js.map +1 -1
  12. package/build/custom-select-control/types.js.map +1 -1
  13. package/build/custom-select-control-v2/styles.js +9 -9
  14. package/build/custom-select-control-v2/styles.js.map +1 -1
  15. package/build/date-time/index.js +0 -7
  16. package/build/date-time/index.js.map +1 -1
  17. package/build/date-time/time/index.js +66 -38
  18. package/build/date-time/time/index.js.map +1 -1
  19. package/build/date-time/time/styles.js +11 -11
  20. package/build/date-time/time/styles.js.map +1 -1
  21. package/build/date-time/{time-input → time/time-input}/index.js +7 -7
  22. package/build/date-time/time/time-input/index.js.map +1 -0
  23. package/build/dropdown-menu-v2/styles.js +14 -14
  24. package/build/dropdown-menu-v2/styles.js.map +1 -1
  25. package/build/form-toggle/index.js +24 -24
  26. package/build/form-toggle/index.js.map +1 -1
  27. package/build/guide/index.js +2 -0
  28. package/build/guide/index.js.map +1 -1
  29. package/build/heading/types.js.map +1 -1
  30. package/build/modal/index.js +18 -11
  31. package/build/modal/index.js.map +1 -1
  32. package/build/query-controls/index.js +1 -1
  33. package/build/query-controls/index.js.map +1 -1
  34. package/build/radio-control/index.js +35 -8
  35. package/build/radio-control/index.js.map +1 -1
  36. package/build/radio-control/types.js.map +1 -1
  37. package/build/select-control/index.js +20 -8
  38. package/build/select-control/index.js.map +1 -1
  39. package/build/select-control/types.js.map +1 -1
  40. package/build/text-control/index.js +1 -0
  41. package/build/text-control/index.js.map +1 -1
  42. package/build/toggle-control/index.js +27 -25
  43. package/build/toggle-control/index.js.map +1 -1
  44. package/build/toggle-group-control/toggle-group-control/component.js +6 -1
  45. package/build/toggle-group-control/toggle-group-control/component.js.map +1 -1
  46. package/build/toggle-group-control/toggle-group-control-option/component.js +6 -1
  47. package/build/toggle-group-control/toggle-group-control-option/component.js.map +1 -1
  48. package/build/toggle-group-control/toggle-group-control-option-icon/component.js +14 -14
  49. package/build/toggle-group-control/toggle-group-control-option-icon/component.js.map +1 -1
  50. package/build/tooltip/index.js +12 -1
  51. package/build/tooltip/index.js.map +1 -1
  52. package/build/tree-select/index.js +1 -2
  53. package/build/tree-select/index.js.map +1 -1
  54. package/build/utils/config-values.js +6 -0
  55. package/build/utils/config-values.js.map +1 -1
  56. package/build-module/autocomplete/autocompleter-ui.js +2 -0
  57. package/build-module/autocomplete/autocompleter-ui.js.map +1 -1
  58. package/build-module/base-control/styles/base-control-styles.js +8 -8
  59. package/build-module/base-control/styles/base-control-styles.js.map +1 -1
  60. package/build-module/border-control/styles.js +13 -23
  61. package/build-module/border-control/styles.js.map +1 -1
  62. package/build-module/color-palette/index.js +1 -1
  63. package/build-module/color-palette/index.js.map +1 -1
  64. package/build-module/custom-select-control/index.js +38 -14
  65. package/build-module/custom-select-control/index.js.map +1 -1
  66. package/build-module/custom-select-control/types.js.map +1 -1
  67. package/build-module/custom-select-control-v2/styles.js +9 -9
  68. package/build-module/custom-select-control-v2/styles.js.map +1 -1
  69. package/build-module/date-time/index.js +1 -2
  70. package/build-module/date-time/index.js.map +1 -1
  71. package/build-module/date-time/time/index.js +66 -38
  72. package/build-module/date-time/time/index.js.map +1 -1
  73. package/build-module/date-time/time/styles.js +11 -11
  74. package/build-module/date-time/time/styles.js.map +1 -1
  75. package/build-module/date-time/{time-input → time/time-input}/index.js +7 -7
  76. package/build-module/date-time/time/time-input/index.js.map +1 -0
  77. package/build-module/dropdown-menu-v2/styles.js +14 -14
  78. package/build-module/dropdown-menu-v2/styles.js.map +1 -1
  79. package/build-module/form-toggle/index.js +23 -22
  80. package/build-module/form-toggle/index.js.map +1 -1
  81. package/build-module/guide/index.js +2 -0
  82. package/build-module/guide/index.js.map +1 -1
  83. package/build-module/heading/types.js.map +1 -1
  84. package/build-module/modal/index.js +17 -11
  85. package/build-module/modal/index.js.map +1 -1
  86. package/build-module/query-controls/index.js +1 -1
  87. package/build-module/query-controls/index.js.map +1 -1
  88. package/build-module/radio-control/index.js +36 -10
  89. package/build-module/radio-control/index.js.map +1 -1
  90. package/build-module/radio-control/types.js.map +1 -1
  91. package/build-module/select-control/index.js +20 -8
  92. package/build-module/select-control/index.js.map +1 -1
  93. package/build-module/select-control/types.js.map +1 -1
  94. package/build-module/text-control/index.js +1 -0
  95. package/build-module/text-control/index.js.map +1 -1
  96. package/build-module/toggle-control/index.js +26 -24
  97. package/build-module/toggle-control/index.js.map +1 -1
  98. package/build-module/toggle-group-control/toggle-group-control/component.js +6 -1
  99. package/build-module/toggle-group-control/toggle-group-control/component.js.map +1 -1
  100. package/build-module/toggle-group-control/toggle-group-control-option/component.js +6 -1
  101. package/build-module/toggle-group-control/toggle-group-control-option/component.js.map +1 -1
  102. package/build-module/toggle-group-control/toggle-group-control-option-icon/component.js +14 -14
  103. package/build-module/toggle-group-control/toggle-group-control-option-icon/component.js.map +1 -1
  104. package/build-module/tooltip/index.js +13 -2
  105. package/build-module/tooltip/index.js.map +1 -1
  106. package/build-module/tree-select/index.js +1 -2
  107. package/build-module/tree-select/index.js.map +1 -1
  108. package/build-module/utils/config-values.js +6 -0
  109. package/build-module/utils/config-values.js.map +1 -1
  110. package/build-style/style-rtl.css +60 -24
  111. package/build-style/style.css +60 -24
  112. package/build-types/autocomplete/autocompleter-ui.d.ts.map +1 -1
  113. package/build-types/border-control/styles.d.ts.map +1 -1
  114. package/build-types/button/stories/e2e/index.story.d.ts.map +1 -1
  115. package/build-types/color-palette/index.d.ts.map +1 -1
  116. package/build-types/color-palette/styles.d.ts +2 -2
  117. package/build-types/color-picker/styles.d.ts +3 -1
  118. package/build-types/color-picker/styles.d.ts.map +1 -1
  119. package/build-types/custom-select-control/index.d.ts +2 -2
  120. package/build-types/custom-select-control/index.d.ts.map +1 -1
  121. package/build-types/custom-select-control/stories/index.story.d.ts +3 -3
  122. package/build-types/custom-select-control/stories/index.story.d.ts.map +1 -1
  123. package/build-types/custom-select-control/types.d.ts +7 -7
  124. package/build-types/custom-select-control/types.d.ts.map +1 -1
  125. package/build-types/custom-select-control-v2/styles.d.ts +16 -28
  126. package/build-types/custom-select-control-v2/styles.d.ts.map +1 -1
  127. package/build-types/date-time/date/styles.d.ts +2 -2
  128. package/build-types/date-time/index.d.ts +1 -2
  129. package/build-types/date-time/index.d.ts.map +1 -1
  130. package/build-types/date-time/stories/time.story.d.ts +5 -0
  131. package/build-types/date-time/stories/time.story.d.ts.map +1 -1
  132. package/build-types/date-time/time/index.d.ts +3 -0
  133. package/build-types/date-time/time/index.d.ts.map +1 -1
  134. package/build-types/date-time/time/styles.d.ts.map +1 -1
  135. package/build-types/date-time/{time-input → time/time-input}/index.d.ts +1 -1
  136. package/build-types/date-time/time/time-input/index.d.ts.map +1 -0
  137. package/build-types/date-time/time/time-input/test/index.d.ts.map +1 -0
  138. package/build-types/dropdown-menu-v2/styles.d.ts +24 -42
  139. package/build-types/dropdown-menu-v2/styles.d.ts.map +1 -1
  140. package/build-types/form-toggle/index.d.ts +2 -5
  141. package/build-types/form-toggle/index.d.ts.map +1 -1
  142. package/build-types/guide/index.d.ts.map +1 -1
  143. package/build-types/heading/component.d.ts +1 -1
  144. package/build-types/heading/types.d.ts +1 -1
  145. package/build-types/heading/types.d.ts.map +1 -1
  146. package/build-types/modal/index.d.ts.map +1 -1
  147. package/build-types/navigation/styles/navigation-styles.d.ts +2 -2
  148. package/build-types/palette-edit/styles.d.ts +2 -2
  149. package/build-types/query-controls/index.d.ts.map +1 -1
  150. package/build-types/radio-control/index.d.ts.map +1 -1
  151. package/build-types/radio-control/stories/index.story.d.ts +1 -0
  152. package/build-types/radio-control/stories/index.story.d.ts.map +1 -1
  153. package/build-types/radio-control/test/index.d.ts +2 -0
  154. package/build-types/radio-control/test/index.d.ts.map +1 -0
  155. package/build-types/radio-control/types.d.ts +4 -0
  156. package/build-types/radio-control/types.d.ts.map +1 -1
  157. package/build-types/select-control/index.d.ts +4 -1
  158. package/build-types/select-control/index.d.ts.map +1 -1
  159. package/build-types/select-control/stories/index.story.d.ts +9 -3
  160. package/build-types/select-control/stories/index.story.d.ts.map +1 -1
  161. package/build-types/select-control/types.d.ts +27 -27
  162. package/build-types/select-control/types.d.ts.map +1 -1
  163. package/build-types/tabs/styles.d.ts +8 -14
  164. package/build-types/tabs/styles.d.ts.map +1 -1
  165. package/build-types/text-control/index.d.ts +1 -0
  166. package/build-types/text-control/index.d.ts.map +1 -1
  167. package/build-types/toggle-control/index.d.ts +3 -9
  168. package/build-types/toggle-control/index.d.ts.map +1 -1
  169. package/build-types/toggle-group-control/toggle-group-control/component.d.ts +6 -1
  170. package/build-types/toggle-group-control/toggle-group-control/component.d.ts.map +1 -1
  171. package/build-types/toggle-group-control/toggle-group-control-option/component.d.ts +6 -1
  172. package/build-types/toggle-group-control/toggle-group-control-option/component.d.ts.map +1 -1
  173. package/build-types/toggle-group-control/toggle-group-control-option-icon/component.d.ts +14 -14
  174. package/build-types/tooltip/index.d.ts.map +1 -1
  175. package/build-types/tooltip/test/utils/index.d.ts +1 -5
  176. package/build-types/tooltip/test/utils/index.d.ts.map +1 -1
  177. package/build-types/tree-select/index.d.ts +1 -1
  178. package/build-types/tree-select/index.d.ts.map +1 -1
  179. package/build-types/utils/config-values.d.ts +6 -0
  180. package/package.json +20 -20
  181. package/src/alignment-matrix-control/test/index.tsx +1 -3
  182. package/src/autocomplete/autocompleter-ui.tsx +2 -0
  183. package/src/autocomplete/style.scss +0 -6
  184. package/src/base-control/styles/base-control-styles.ts +1 -1
  185. package/src/border-control/styles.ts +0 -5
  186. package/src/button/stories/e2e/index.story.tsx +103 -21
  187. package/src/button/style.scss +49 -21
  188. package/src/button/test/index.tsx +18 -40
  189. package/src/circular-option-picker/test/index.tsx +1 -4
  190. package/src/color-palette/index.tsx +22 -20
  191. package/src/composite/legacy/test/index.tsx +2 -18
  192. package/src/custom-select-control/index.tsx +55 -25
  193. package/src/custom-select-control/test/index.tsx +47 -30
  194. package/src/custom-select-control/types.ts +7 -7
  195. package/src/custom-select-control-v2/styles.ts +7 -6
  196. package/src/custom-select-control-v2/test/index.tsx +15 -19
  197. package/src/date-time/index.ts +1 -2
  198. package/src/date-time/stories/time.story.tsx +17 -0
  199. package/src/date-time/time/index.tsx +46 -16
  200. package/src/date-time/time/styles.ts +1 -0
  201. package/src/date-time/{time-input → time/time-input}/index.tsx +9 -9
  202. package/src/dropdown-menu-v2/styles.ts +18 -17
  203. package/src/dropdown-menu-v2/test/index.tsx +1 -4
  204. package/src/font-size-picker/test/index.tsx +50 -43
  205. package/src/form-toggle/index.tsx +23 -21
  206. package/src/guide/index.tsx +2 -0
  207. package/src/heading/types.ts +1 -4
  208. package/src/modal/index.tsx +21 -20
  209. package/src/placeholder/style.scss +11 -2
  210. package/src/query-controls/index.tsx +5 -1
  211. package/src/radio-control/index.tsx +48 -7
  212. package/src/radio-control/stories/index.story.tsx +23 -0
  213. package/src/radio-control/style.scss +26 -2
  214. package/src/radio-control/test/index.tsx +274 -0
  215. package/src/radio-control/types.ts +4 -0
  216. package/src/select-control/README.md +8 -1
  217. package/src/select-control/index.tsx +33 -22
  218. package/src/select-control/test/select-control.tsx +148 -4
  219. package/src/select-control/types.ts +70 -65
  220. package/src/tab-panel/test/index.tsx +1 -8
  221. package/src/tabs/test/index.tsx +68 -84
  222. package/src/text-control/README.md +1 -0
  223. package/src/text-control/index.tsx +1 -0
  224. package/src/text-control/style.scss +5 -0
  225. package/src/toggle-control/README.md +9 -0
  226. package/src/toggle-control/index.tsx +25 -22
  227. package/src/toggle-control/style.scss +2 -1
  228. package/src/toggle-group-control/test/__snapshots__/index.tsx.snap +6 -6
  229. package/src/toggle-group-control/test/index.tsx +0 -6
  230. package/src/toggle-group-control/toggle-group-control/README.md +13 -1
  231. package/src/toggle-group-control/toggle-group-control/component.tsx +6 -1
  232. package/src/toggle-group-control/toggle-group-control-option/README.md +6 -1
  233. package/src/toggle-group-control/toggle-group-control-option/component.tsx +6 -1
  234. package/src/toggle-group-control/toggle-group-control-option-icon/README.md +1 -1
  235. package/src/toggle-group-control/toggle-group-control-option-icon/component.tsx +14 -14
  236. package/src/tooltip/index.tsx +15 -2
  237. package/src/tooltip/test/index.tsx +0 -5
  238. package/src/tooltip/test/utils/index.tsx +5 -5
  239. package/src/tree-select/index.tsx +1 -2
  240. package/src/utils/config-values.js +6 -0
  241. package/tsconfig.tsbuildinfo +1 -1
  242. package/build/date-time/time-input/index.js.map +0 -1
  243. package/build-module/date-time/time-input/index.js.map +0 -1
  244. package/build-types/date-time/stories/time-input.story.d.ts +0 -12
  245. package/build-types/date-time/stories/time-input.story.d.ts.map +0 -1
  246. package/build-types/date-time/time-input/index.d.ts.map +0 -1
  247. package/build-types/date-time/time-input/test/index.d.ts.map +0 -1
  248. package/src/date-time/stories/time-input.story.tsx +0 -36
  249. /package/build-types/date-time/{time-input → time/time-input}/test/index.d.ts +0 -0
  250. /package/src/date-time/{time-input → time/time-input}/test/index.tsx +0 -0
@@ -17,8 +17,8 @@ describe( 'SelectControl', () => {
17
17
  expect( screen.queryByRole( 'combobox' ) ).not.toBeInTheDocument();
18
18
  } );
19
19
 
20
- it( 'should not render its children', async () => {
21
- const user = await userEvent.setup();
20
+ it( 'should render its children', async () => {
21
+ const user = userEvent.setup();
22
22
  const handleChangeMock = jest.fn();
23
23
 
24
24
  render(
@@ -46,8 +46,8 @@ describe( 'SelectControl', () => {
46
46
  );
47
47
  } );
48
48
 
49
- it( 'should not render its options', async () => {
50
- const user = await userEvent.setup();
49
+ it( 'should render its options', async () => {
50
+ const user = userEvent.setup();
51
51
  const handleChangeMock = jest.fn();
52
52
 
53
53
  render(
@@ -81,4 +81,148 @@ describe( 'SelectControl', () => {
81
81
  expect.anything()
82
82
  );
83
83
  } );
84
+
85
+ it( 'should pass through options props', () => {
86
+ render(
87
+ <SelectControl
88
+ label="Select"
89
+ options={ [
90
+ {
91
+ value: 'value',
92
+ label: 'label',
93
+ 'aria-label': 'Aria label',
94
+ },
95
+ ] }
96
+ />
97
+ );
98
+
99
+ expect(
100
+ screen.getByRole( 'option', { name: 'Aria label' } )
101
+ ).toBeInTheDocument();
102
+ } );
103
+
104
+ /* eslint-disable jest/expect-expect */
105
+ describe( 'static typing', () => {
106
+ describe( 'single', () => {
107
+ it( 'should infer the value type from available `options`, but not the `value` or `onChange` prop', () => {
108
+ const onChange: ( value: 'foo' | 'bar' ) => void = () => {};
109
+
110
+ <SelectControl
111
+ value="narrow"
112
+ options={ [
113
+ {
114
+ value: 'narrow',
115
+ label: 'Narrow',
116
+ },
117
+ {
118
+ value: 'value',
119
+ label: 'Value',
120
+ },
121
+ ] }
122
+ // @ts-expect-error onChange type is not compatible with inferred value type
123
+ onChange={ onChange }
124
+ />;
125
+
126
+ <SelectControl
127
+ // @ts-expect-error "string" is not "narrow" or "value"
128
+ value="string"
129
+ options={ [
130
+ {
131
+ value: 'narrow',
132
+ label: 'Narrow',
133
+ },
134
+ {
135
+ value: 'value',
136
+ label: 'Value',
137
+ },
138
+ ] }
139
+ // @ts-expect-error "string" is not "narrow" or "value"
140
+ onChange={ ( value ) => value === 'string' }
141
+ />;
142
+ } );
143
+
144
+ it( 'should accept an explicit type argument', () => {
145
+ <SelectControl< 'narrow' | 'value' >
146
+ // @ts-expect-error "string" is not "narrow" or "value"
147
+ value="string"
148
+ options={ [
149
+ {
150
+ value: 'narrow',
151
+ label: 'Narrow',
152
+ },
153
+ {
154
+ // @ts-expect-error "string" is not "narrow" or "value"
155
+ value: 'string',
156
+ label: 'String',
157
+ },
158
+ ] }
159
+ />;
160
+ } );
161
+ } );
162
+
163
+ describe( 'multiple', () => {
164
+ it( 'should infer the value type from available `options`, but not the `value` or `onChange` prop', () => {
165
+ const onChange: (
166
+ value: ( 'foo' | 'bar' )[]
167
+ ) => void = () => {};
168
+
169
+ <SelectControl
170
+ multiple
171
+ value={ [ 'narrow' ] }
172
+ options={ [
173
+ {
174
+ value: 'narrow',
175
+ label: 'Narrow',
176
+ },
177
+ {
178
+ value: 'value',
179
+ label: 'Value',
180
+ },
181
+ ] }
182
+ // @ts-expect-error onChange type is not compatible with inferred value type
183
+ onChange={ onChange }
184
+ />;
185
+
186
+ <SelectControl
187
+ multiple
188
+ // @ts-expect-error "string" is not "narrow" or "value"
189
+ value={ [ 'string' ] }
190
+ options={ [
191
+ {
192
+ value: 'narrow',
193
+ label: 'Narrow',
194
+ },
195
+ {
196
+ value: 'value',
197
+ label: 'Value',
198
+ },
199
+ ] }
200
+ onChange={ ( value ) =>
201
+ // @ts-expect-error "string" is not "narrow" or "value"
202
+ value.forEach( ( v ) => v === 'string' )
203
+ }
204
+ />;
205
+ } );
206
+
207
+ it( 'should accept an explicit type argument', () => {
208
+ <SelectControl< 'narrow' | 'value' >
209
+ multiple
210
+ // @ts-expect-error "string" is not "narrow" or "value"
211
+ value={ [ 'string' ] }
212
+ options={ [
213
+ {
214
+ value: 'narrow',
215
+ label: 'Narrow',
216
+ },
217
+ {
218
+ // @ts-expect-error "string" is not "narrow" or "value"
219
+ value: 'string',
220
+ label: 'String',
221
+ },
222
+ ] }
223
+ />;
224
+ } );
225
+ } );
226
+ } );
227
+ /* eslint-enable jest/expect-expect */
84
228
  } );
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import type { ChangeEvent, FocusEvent, ReactNode } from 'react';
4
+ import type { ChangeEvent, ReactNode } from 'react';
5
5
 
6
6
  /**
7
7
  * Internal dependencies
@@ -9,7 +9,7 @@ import type { ChangeEvent, FocusEvent, ReactNode } from 'react';
9
9
  import type { InputBaseProps } from '../input-control/types';
10
10
  import type { BaseControlProps } from '../base-control/types';
11
11
 
12
- type SelectControlBaseProps = Pick<
12
+ type SelectControlBaseProps< V extends string > = Pick<
13
13
  InputBaseProps,
14
14
  | '__next36pxDefaultSize'
15
15
  | '__next40pxDefaultSize'
@@ -22,9 +22,12 @@ type SelectControlBaseProps = Pick<
22
22
  | 'suffix'
23
23
  > &
24
24
  Pick< BaseControlProps, 'help' | '__nextHasNoMarginBottom' > & {
25
- onBlur?: ( event: FocusEvent< HTMLSelectElement > ) => void;
26
- onFocus?: ( event: FocusEvent< HTMLSelectElement > ) => void;
27
- options?: {
25
+ /**
26
+ * An array of option property objects to be rendered,
27
+ * each with a `label` and `value` property, as well as any other
28
+ * `<option>` attributes.
29
+ */
30
+ options?: readonly ( {
28
31
  /**
29
32
  * The label to be shown to the user.
30
33
  */
@@ -33,21 +36,11 @@ type SelectControlBaseProps = Pick<
33
36
  * The internal value used to choose the selected value.
34
37
  * This is also the value passed to `onChange` when the option is selected.
35
38
  */
36
- value: string;
37
- id?: string;
38
- /**
39
- * Whether or not the option should have the disabled attribute.
40
- *
41
- * @default false
42
- */
43
- disabled?: boolean;
44
- /**
45
- * Whether or not the option should be hidden.
46
- *
47
- * @default false
48
- */
49
- hidden?: boolean;
50
- }[];
39
+ value: V;
40
+ } & Omit<
41
+ React.OptionHTMLAttributes< HTMLOptionElement >,
42
+ 'label' | 'value'
43
+ > )[];
51
44
  /**
52
45
  * As an alternative to the `options` prop, `optgroup`s and `options` can be
53
46
  * passed in as `children` for more customizability.
@@ -61,50 +54,62 @@ type SelectControlBaseProps = Pick<
61
54
  variant?: 'default' | 'minimal';
62
55
  };
63
56
 
64
- export type SelectControlSingleSelectionProps = SelectControlBaseProps & {
65
- /**
66
- * If this property is added, multiple values can be selected. The `value` passed should be an array.
67
- *
68
- * In most cases, it is preferable to use the `FormTokenField` or `CheckboxControl` components instead.
69
- *
70
- * @default false
71
- */
72
- multiple?: false;
73
- value?: string;
74
- /**
75
- * A function that receives the value of the new option that is being selected as input.
76
- *
77
- * If `multiple` is `true`, the value received is an array of the selected value.
78
- * Otherwise, the value received is a single value with the new selected value.
79
- */
80
- onChange?: (
81
- value: string,
82
- extra?: { event?: ChangeEvent< HTMLSelectElement > }
83
- ) => void;
84
- };
57
+ export type SelectControlSingleSelectionProps< V extends string = string > =
58
+ SelectControlBaseProps< V > & {
59
+ /**
60
+ * If this property is added, multiple values can be selected. The `value` passed should be an array.
61
+ *
62
+ * In most cases, it is preferable to use the `FormTokenField` or `CheckboxControl` components instead.
63
+ *
64
+ * @default false
65
+ */
66
+ multiple?: false;
67
+ /**
68
+ * The value of the selected option.
69
+ *
70
+ * If `multiple` is true, the `value` should be an array with the values of the selected options.
71
+ */
72
+ value?: NoInfer< V >;
73
+ /**
74
+ * A function that receives the value of the new option that is being selected as input.
75
+ *
76
+ * If `multiple` is `true`, the value received is an array of the selected value.
77
+ * Otherwise, the value received is a single value with the new selected value.
78
+ */
79
+ onChange?: (
80
+ value: NoInfer< V >,
81
+ extra?: { event?: ChangeEvent< HTMLSelectElement > }
82
+ ) => void;
83
+ };
85
84
 
86
- export type SelectControlMultipleSelectionProps = SelectControlBaseProps & {
87
- /**
88
- * If this property is added, multiple values can be selected. The `value` passed should be an array.
89
- *
90
- * In most cases, it is preferable to use the `FormTokenField` or `CheckboxControl` components instead.
91
- *
92
- * @default false
93
- */
94
- multiple: true;
95
- value?: string[];
96
- /**
97
- * A function that receives the value of the new option that is being selected as input.
98
- *
99
- * If `multiple` is `true`, the value received is an array of the selected value.
100
- * Otherwise, the value received is a single value with the new selected value.
101
- */
102
- onChange?: (
103
- value: string[],
104
- extra?: { event?: ChangeEvent< HTMLSelectElement > }
105
- ) => void;
106
- };
85
+ export type SelectControlMultipleSelectionProps< V extends string > =
86
+ SelectControlBaseProps< V > & {
87
+ /**
88
+ * If this property is added, multiple values can be selected. The `value` passed should be an array.
89
+ *
90
+ * In most cases, it is preferable to use the `FormTokenField` or `CheckboxControl` components instead.
91
+ *
92
+ * @default false
93
+ */
94
+ multiple: true;
95
+ /**
96
+ * The value of the selected option.
97
+ *
98
+ * If `multiple` is true, the `value` should be an array with the values of the selected options.
99
+ */
100
+ value?: NoInfer< V >[];
101
+ /**
102
+ * A function that receives the value of the new option that is being selected as input.
103
+ *
104
+ * If `multiple` is `true`, the value received is an array of the selected value.
105
+ * Otherwise, the value received is a single value with the new selected value.
106
+ */
107
+ onChange?: (
108
+ value: NoInfer< V >[],
109
+ extra?: { event?: ChangeEvent< HTMLSelectElement > }
110
+ ) => void;
111
+ };
107
112
 
108
- export type SelectControlProps =
109
- | SelectControlSingleSelectionProps
110
- | SelectControlMultipleSelectionProps;
113
+ export type SelectControlProps< V extends string = string > =
114
+ | SelectControlSingleSelectionProps< V >
115
+ | SelectControlMultipleSelectionProps< V >;
@@ -2,7 +2,7 @@
2
2
  * External dependencies
3
3
  */
4
4
  import { render, screen, waitFor } from '@testing-library/react';
5
- import { press, hover, click, sleep } from '@ariakit/test';
5
+ import { press, hover, click } from '@ariakit/test';
6
6
 
7
7
  /**
8
8
  * WordPress dependencies
@@ -155,7 +155,6 @@ describe.each( [
155
155
  // Tab to focus the tablist. Make sure alpha is focused, and that the
156
156
  // corresponding tooltip is shown.
157
157
  expect( screen.queryByText( 'Alpha' ) ).not.toBeInTheDocument();
158
- await sleep();
159
158
  await press.Tab();
160
159
  expect( mockOnSelect ).toHaveBeenCalledTimes( 1 );
161
160
  expect( screen.getByText( 'Alpha' ) ).toBeInTheDocument();
@@ -627,7 +626,6 @@ describe.each( [
627
626
  // Tab to focus the tablist. Make sure alpha is focused.
628
627
  expect( await getSelectedTab() ).toHaveTextContent( 'Alpha' );
629
628
  expect( await getSelectedTab() ).not.toHaveFocus();
630
- await sleep();
631
629
  await press.Tab();
632
630
  expect( await getSelectedTab() ).toHaveFocus();
633
631
 
@@ -665,7 +663,6 @@ describe.each( [
665
663
  // Tab to focus the tablist. Make sure Alpha is focused.
666
664
  expect( await getSelectedTab() ).toHaveTextContent( 'Alpha' );
667
665
  expect( await getSelectedTab() ).not.toHaveFocus();
668
- await sleep();
669
666
  await press.Tab();
670
667
  expect( await getSelectedTab() ).toHaveFocus();
671
668
 
@@ -703,7 +700,6 @@ describe.each( [
703
700
  // Tab to focus the tablist. Make sure alpha is focused.
704
701
  expect( await getSelectedTab() ).toHaveTextContent( 'Alpha' );
705
702
  expect( await getSelectedTab() ).not.toHaveFocus();
706
- await sleep();
707
703
  await press.Tab();
708
704
  expect( await getSelectedTab() ).toHaveFocus();
709
705
 
@@ -799,7 +795,6 @@ describe.each( [
799
795
  // Tab to focus the tablist. Make sure Alpha is focused.
800
796
  expect( await getSelectedTab() ).toHaveTextContent( 'Alpha' );
801
797
  expect( await getSelectedTab() ).not.toHaveFocus();
802
- await sleep();
803
798
  await press.Tab();
804
799
  expect( await getSelectedTab() ).toHaveFocus();
805
800
  expect( mockOnSelect ).toHaveBeenCalledTimes( 1 );
@@ -841,7 +836,6 @@ describe.each( [
841
836
 
842
837
  // Tab should initially focus the first tab in the tablist, which
843
838
  // is Alpha.
844
- await sleep();
845
839
  await press.Tab();
846
840
  expect(
847
841
  await screen.findByRole( 'tab', { name: 'Alpha' } )
@@ -849,7 +843,6 @@ describe.each( [
849
843
 
850
844
  // Because all other tabs should have `tabindex=-1`, pressing Tab
851
845
  // should NOT move the focus to the next tab, which is Beta.
852
- await sleep();
853
846
  await press.Tab();
854
847
  expect(
855
848
  await screen.findByRole( 'tab', { name: 'Beta' } )