@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
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { render } from '@testing-library/react';
4
+ import { render, screen } from '@testing-library/react';
5
5
 
6
6
  /**
7
7
  * Internal dependencies
@@ -10,11 +10,14 @@ import NoticeList from '../list';
10
10
 
11
11
  describe( 'NoticeList', () => {
12
12
  it( 'should merge className', () => {
13
- const { container } = render(
14
- <NoticeList notices={ [] } className="is-ok" />
13
+ render(
14
+ <NoticeList notices={ [] } className="is-ok">
15
+ List of notices
16
+ </NoticeList>
15
17
  );
16
18
 
17
- expect( container.firstChild ).toHaveClass( 'is-ok' );
18
- expect( container.firstChild ).toHaveClass( 'components-notice-list' );
19
+ const noticeList = screen.getByText( 'List of notices' );
20
+ expect( noticeList ).toHaveClass( 'is-ok' );
21
+ expect( noticeList ).toHaveClass( 'components-notice-list' );
19
22
  } );
20
23
  } );
@@ -1,3 +1,8 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import type { ComponentMeta, ComponentStory } from '@storybook/react';
5
+
1
6
  /**
2
7
  * WordPress dependencies
3
8
  */
@@ -6,9 +11,9 @@ import { useState } from '@wordpress/element';
6
11
  /**
7
12
  * Internal dependencies
8
13
  */
9
- import NumberControl from '../';
14
+ import NumberControl from '..';
10
15
 
11
- export default {
16
+ const meta: ComponentMeta< typeof NumberControl > = {
12
17
  title: 'Components (Experimental)/NumberControl',
13
18
  component: NumberControl,
14
19
  argTypes: {
@@ -19,10 +24,19 @@ export default {
19
24
  type: { control: { type: 'text' } },
20
25
  value: { control: null },
21
26
  },
27
+ parameters: {
28
+ controls: { expanded: true },
29
+ docs: { source: { state: 'open' } },
30
+ },
22
31
  };
23
32
 
24
- function Template( { onChange, ...props } ) {
25
- const [ value, setValue ] = useState( '0' );
33
+ export default meta;
34
+
35
+ const Template: ComponentStory< typeof NumberControl > = ( {
36
+ onChange,
37
+ ...props
38
+ } ) => {
39
+ const [ value, setValue ] = useState< string | undefined >( '0' );
26
40
  const [ isValidValue, setIsValidValue ] = useState( true );
27
41
 
28
42
  return (
@@ -32,14 +46,17 @@ function Template( { onChange, ...props } ) {
32
46
  value={ value }
33
47
  onChange={ ( v, extra ) => {
34
48
  setValue( v );
35
- setIsValidValue( extra.event.target.validity.valid );
36
- onChange( v, extra );
49
+ setIsValidValue(
50
+ ( extra.event.target as HTMLInputElement ).validity
51
+ .valid
52
+ );
53
+ onChange?.( v, extra );
37
54
  } }
38
55
  />
39
56
  <p>Is valid? { isValidValue ? 'Yes' : 'No' }</p>
40
57
  </>
41
58
  );
42
- }
59
+ };
43
60
 
44
61
  export const Default = Template.bind( {} );
45
62
  Default.args = {
@@ -1,4 +1,3 @@
1
- // @ts-nocheck
2
1
  /**
3
2
  * External dependencies
4
3
  */
@@ -12,8 +11,9 @@ import InputControl from '../../input-control';
12
11
  import { COLORS } from '../../utils';
13
12
  import Button from '../../button';
14
13
  import { space } from '../../ui/utils/space';
14
+ import type { NumberControlProps } from '../types';
15
15
 
16
- const htmlArrowStyles = ( { hideHTMLArrows } ) => {
16
+ const htmlArrowStyles = ( { hideHTMLArrows }: { hideHTMLArrows: boolean } ) => {
17
17
  if ( ! hideHTMLArrows ) {
18
18
  return ``;
19
19
  }
@@ -35,7 +35,9 @@ export const Input = styled( InputControl )`
35
35
  ${ htmlArrowStyles };
36
36
  `;
37
37
 
38
- const spinButtonSizeStyles = ( { size } ) => {
38
+ const spinButtonSizeStyles = ( {
39
+ size,
40
+ }: Pick< NumberControlProps, 'size' > ) => {
39
41
  if ( size !== 'small' ) {
40
42
  return ``;
41
43
  }
@@ -0,0 +1,600 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { render, screen } from '@testing-library/react';
5
+ import userEvent from '@testing-library/user-event';
6
+
7
+ /**
8
+ * WordPress dependencies
9
+ */
10
+ import { useState } from '@wordpress/element';
11
+
12
+ /**
13
+ * Internal dependencies
14
+ */
15
+ import NumberControl from '..';
16
+ import type { NumberControlProps } from '../types';
17
+
18
+ function StatefulNumberControl( props: NumberControlProps ) {
19
+ const [ value, setValue ] = useState( props.value );
20
+ const handleOnChange = ( v: string | undefined ) => setValue( v );
21
+
22
+ return (
23
+ <NumberControl
24
+ { ...props }
25
+ value={ value }
26
+ onChange={ handleOnChange }
27
+ />
28
+ );
29
+ }
30
+
31
+ describe( 'NumberControl', () => {
32
+ describe( 'Basic rendering', () => {
33
+ it( 'should render', () => {
34
+ render( <NumberControl /> );
35
+ expect( screen.getByRole( 'spinbutton' ) ).toBeVisible();
36
+ } );
37
+
38
+ it( 'should render custom className', () => {
39
+ render( <NumberControl className="hello" /> );
40
+ expect( screen.getByRole( 'spinbutton' ) ).toBeVisible();
41
+ } );
42
+ } );
43
+
44
+ describe( 'onChange handling', () => {
45
+ it( 'should provide onChange callback with number value', async () => {
46
+ const user = userEvent.setup( {
47
+ advanceTimers: jest.advanceTimersByTime,
48
+ } );
49
+ const spy = jest.fn();
50
+
51
+ render(
52
+ <NumberControl value={ 5 } onChange={ ( v ) => spy( v ) } />
53
+ );
54
+
55
+ const input = screen.getByRole( 'spinbutton' );
56
+ await user.clear( input );
57
+ await user.type( input, '10' );
58
+
59
+ expect( spy ).toHaveBeenCalledWith( '10' );
60
+ } );
61
+
62
+ it( 'should call onChange callback when value is clamped on blur', async () => {
63
+ const user = userEvent.setup( {
64
+ advanceTimers: jest.advanceTimersByTime,
65
+ } );
66
+ const onChangeSpy = jest.fn();
67
+
68
+ render(
69
+ <NumberControl
70
+ value={ 5 }
71
+ min={ 4 }
72
+ max={ 10 }
73
+ onChange={ ( v, extra ) =>
74
+ onChangeSpy(
75
+ v,
76
+ ( extra.event.target as HTMLInputElement ).validity
77
+ .valid
78
+ )
79
+ }
80
+ />
81
+ );
82
+
83
+ const input = screen.getByRole( 'spinbutton' );
84
+
85
+ await user.clear( input );
86
+ await user.type( input, '1' );
87
+
88
+ // Before blurring, the value is still un-clamped
89
+ expect( input ).toHaveValue( 1 );
90
+
91
+ // Blur the input
92
+ await user.keyboard( '[Tab]' );
93
+
94
+ // After blur, value is clamped
95
+ expect( input ).toHaveValue( 4 );
96
+
97
+ expect( onChangeSpy ).toHaveBeenCalledTimes( 3 );
98
+
99
+ // First call: clear the input
100
+ expect( onChangeSpy ).toHaveBeenNthCalledWith( 1, '', true );
101
+ // Second call: type '1'
102
+ expect( onChangeSpy ).toHaveBeenNthCalledWith( 2, '1', false );
103
+ // Third call: clamp value
104
+ expect( onChangeSpy ).toHaveBeenNthCalledWith( 3, 4, true );
105
+ } );
106
+
107
+ it( 'should call onChange callback when value is not valid', async () => {
108
+ const user = userEvent.setup( {
109
+ advanceTimers: jest.advanceTimersByTime,
110
+ } );
111
+ const onChangeSpy = jest.fn();
112
+
113
+ render(
114
+ <NumberControl
115
+ value={ 5 }
116
+ min={ 1 }
117
+ max={ 10 }
118
+ onChange={ ( v, extra ) =>
119
+ onChangeSpy(
120
+ v,
121
+ ( extra.event.target as HTMLInputElement ).validity
122
+ .valid
123
+ )
124
+ }
125
+ />
126
+ );
127
+
128
+ const input = screen.getByRole( 'spinbutton' );
129
+
130
+ await user.clear( input );
131
+ await user.type( input, '14' );
132
+
133
+ expect( input ).toHaveValue( 14 );
134
+
135
+ await user.keyboard( '[Enter]' );
136
+
137
+ expect( input ).toHaveValue( 10 );
138
+
139
+ expect( onChangeSpy ).toHaveBeenCalledTimes( 4 );
140
+
141
+ // First call: clear value
142
+ expect( onChangeSpy ).toHaveBeenNthCalledWith( 1, '', true );
143
+ // Second call: valid, unclamped value
144
+ expect( onChangeSpy ).toHaveBeenNthCalledWith( 2, '1', true );
145
+ // Third call: invalid, unclamped value
146
+ expect( onChangeSpy ).toHaveBeenNthCalledWith( 3, '14', false );
147
+ // Fourth call: valid, clamped value
148
+ expect( onChangeSpy ).toHaveBeenNthCalledWith( 4, 10, true );
149
+ } );
150
+ } );
151
+
152
+ describe( 'Validation', () => {
153
+ it( 'should clamp value within range on ENTER keypress', async () => {
154
+ const user = userEvent.setup( {
155
+ advanceTimers: jest.advanceTimersByTime,
156
+ } );
157
+
158
+ render( <NumberControl value={ 5 } min={ 0 } max={ 10 } /> );
159
+
160
+ const input = screen.getByRole( 'spinbutton' );
161
+
162
+ await user.clear( input );
163
+ await user.type( input, '-100' );
164
+ await user.keyboard( '[Enter]' );
165
+
166
+ /**
167
+ * This is zero because the value has been adjusted to
168
+ * respect the min/max range of the input.
169
+ */
170
+ expect( input ).toHaveValue( 0 );
171
+ } );
172
+
173
+ it( 'should clamp value within range on blur', async () => {
174
+ const user = userEvent.setup( {
175
+ advanceTimers: jest.advanceTimersByTime,
176
+ } );
177
+
178
+ render( <NumberControl value={ 5 } min={ 0 } max={ 10 } /> );
179
+
180
+ const input = screen.getByRole( 'spinbutton' );
181
+ await user.clear( input );
182
+ await user.type( input, '41' );
183
+
184
+ // Before blurring, the value is still un-clamped
185
+ expect( input ).toHaveValue( 41 );
186
+
187
+ // Blur the input
188
+ await user.click( document.body );
189
+
190
+ // After blur, value is clamped
191
+ expect( input ).toHaveValue( 10 );
192
+ } );
193
+
194
+ it( 'should parse non-numeric values to a number on ENTER keypress when required', async () => {
195
+ const user = userEvent.setup( {
196
+ advanceTimers: jest.advanceTimersByTime,
197
+ } );
198
+
199
+ render( <NumberControl value={ 5 } required /> );
200
+
201
+ const input = screen.getByRole( 'spinbutton' );
202
+ await user.clear( input );
203
+ await user.type( input, 'abc' );
204
+ await user.keyboard( '[Enter]' );
205
+
206
+ expect( input ).toHaveValue( 0 );
207
+ } );
208
+
209
+ it( 'should parse non-numeric values to empty string on ENTER keypress when not required', async () => {
210
+ const user = userEvent.setup( {
211
+ advanceTimers: jest.advanceTimersByTime,
212
+ } );
213
+
214
+ render( <NumberControl value={ 5 } required={ false } /> );
215
+
216
+ const input = screen.getByRole( 'spinbutton' );
217
+ await user.clear( input );
218
+ await user.type( input, 'abc' );
219
+ await user.keyboard( '[Enter]' );
220
+
221
+ // Note: the `input` field may still visually show the invalid input,
222
+ // while internally parsing the value as an empty string.
223
+ //
224
+ // React Testing Library associates `null` to empty string types for
225
+ // numeric `input` elements
226
+ // (see https://github.com/testing-library/jest-dom/blob/v5.16.5/src/utils.js#L191-L192)
227
+ expect( input ).toHaveValue( null );
228
+ } );
229
+
230
+ it( 'should not enforce numerical value for empty string when required is omitted', async () => {
231
+ const user = userEvent.setup( {
232
+ advanceTimers: jest.advanceTimersByTime,
233
+ } );
234
+
235
+ render( <NumberControl value={ 5 } /> );
236
+
237
+ const input = screen.getByRole( 'spinbutton' );
238
+ await user.clear( input );
239
+ await user.keyboard( '[Enter]' );
240
+
241
+ // React Testing Library associates `null` to empty string types for
242
+ // numeric `input` elements
243
+ // (see https://github.com/testing-library/jest-dom/blob/v5.16.5/src/utils.js#L191-L192)
244
+ expect( input ).toHaveValue( null );
245
+ } );
246
+
247
+ it( 'should enforce numerical value for empty string when required', async () => {
248
+ const user = userEvent.setup( {
249
+ advanceTimers: jest.advanceTimersByTime,
250
+ } );
251
+
252
+ render( <NumberControl value={ 5 } required /> );
253
+
254
+ const input = screen.getByRole( 'spinbutton' );
255
+ await user.clear( input );
256
+ await user.keyboard( '[Enter]' );
257
+
258
+ expect( input ).toHaveValue( 0 );
259
+ } );
260
+ } );
261
+
262
+ describe( 'Key UP interactions', () => {
263
+ it( 'should fire onKeyDown callback', async () => {
264
+ const user = userEvent.setup( {
265
+ advanceTimers: jest.advanceTimersByTime,
266
+ } );
267
+
268
+ const spy = jest.fn();
269
+
270
+ render( <StatefulNumberControl value={ 5 } onKeyDown={ spy } /> );
271
+
272
+ const input = screen.getByRole( 'spinbutton' );
273
+ await user.click( input );
274
+ await user.keyboard( '[ArrowUp]' );
275
+
276
+ expect( spy ).toHaveBeenCalled();
277
+ } );
278
+
279
+ it( 'should increment by step on key UP press', async () => {
280
+ const user = userEvent.setup( {
281
+ advanceTimers: jest.advanceTimersByTime,
282
+ } );
283
+
284
+ render( <StatefulNumberControl value={ 5 } /> );
285
+
286
+ const input = screen.getByRole( 'spinbutton' );
287
+ await user.click( input );
288
+ await user.keyboard( '[ArrowUp]' );
289
+
290
+ expect( input ).toHaveValue( 6 );
291
+ } );
292
+
293
+ it( 'should increment from a negative value', async () => {
294
+ const user = userEvent.setup( {
295
+ advanceTimers: jest.advanceTimersByTime,
296
+ } );
297
+
298
+ render( <StatefulNumberControl value={ -5 } /> );
299
+
300
+ const input = screen.getByRole( 'spinbutton' );
301
+ await user.click( input );
302
+ await user.keyboard( '[ArrowUp]' );
303
+
304
+ expect( input ).toHaveValue( -4 );
305
+ } );
306
+
307
+ it( 'should increment while preserving the decimal value when `step` is “any”', async () => {
308
+ const user = userEvent.setup( {
309
+ advanceTimers: jest.advanceTimersByTime,
310
+ } );
311
+
312
+ render( <StatefulNumberControl value={ 866.5309 } step="any" /> );
313
+
314
+ const input = screen.getByRole( 'spinbutton' );
315
+ await user.click( input );
316
+ await user.keyboard( '[ArrowUp]' );
317
+
318
+ expect( input ).toHaveValue( 867.5309 );
319
+ } );
320
+
321
+ it( 'should increment by shiftStep on key UP + shift press', async () => {
322
+ const user = userEvent.setup( {
323
+ advanceTimers: jest.advanceTimersByTime,
324
+ } );
325
+
326
+ render( <StatefulNumberControl value={ 5 } shiftStep={ 10 } /> );
327
+
328
+ const input = screen.getByRole( 'spinbutton' );
329
+ await user.click( input );
330
+ await user.keyboard( '{Shift>}[ArrowUp]{/Shift}' );
331
+
332
+ expect( input ).toHaveValue( 20 );
333
+ } );
334
+
335
+ it( 'should increment by shiftStep while preserving the decimal value when `step` is “any”', async () => {
336
+ const user = userEvent.setup( {
337
+ advanceTimers: jest.advanceTimersByTime,
338
+ } );
339
+
340
+ render( <StatefulNumberControl value={ 857.5309 } step="any" /> );
341
+
342
+ const input = screen.getByRole( 'spinbutton' );
343
+ await user.click( input );
344
+ await user.keyboard( '{Shift>}[ArrowUp]{/Shift}' );
345
+
346
+ expect( input ).toHaveValue( 867.5309 );
347
+ } );
348
+
349
+ it( 'should increment by custom shiftStep on key UP + shift press', async () => {
350
+ const user = userEvent.setup( {
351
+ advanceTimers: jest.advanceTimersByTime,
352
+ } );
353
+
354
+ render( <StatefulNumberControl value={ 5 } shiftStep={ 100 } /> );
355
+
356
+ const input = screen.getByRole( 'spinbutton' );
357
+ await user.click( input );
358
+ await user.keyboard( '{Shift>}[ArrowUp]{/Shift}' );
359
+
360
+ expect( input ).toHaveValue( 100 );
361
+ } );
362
+
363
+ it( 'should increment but be limited by max on shiftStep', async () => {
364
+ const user = userEvent.setup( {
365
+ advanceTimers: jest.advanceTimersByTime,
366
+ } );
367
+
368
+ render(
369
+ <StatefulNumberControl
370
+ value={ 5 }
371
+ shiftStep={ 100 }
372
+ max={ 99 }
373
+ />
374
+ );
375
+
376
+ const input = screen.getByRole( 'spinbutton' );
377
+ await user.click( input );
378
+ await user.keyboard( '{Shift>}[ArrowUp]{/Shift}' );
379
+
380
+ expect( input ).toHaveValue( 99 );
381
+ } );
382
+
383
+ it( 'should not increment by shiftStep if disabled', async () => {
384
+ const user = userEvent.setup( {
385
+ advanceTimers: jest.advanceTimersByTime,
386
+ } );
387
+
388
+ render(
389
+ <StatefulNumberControl
390
+ value={ 5 }
391
+ shiftStep={ 100 }
392
+ isShiftStepEnabled={ false }
393
+ />
394
+ );
395
+
396
+ const input = screen.getByRole( 'spinbutton' );
397
+ await user.click( input );
398
+ await user.keyboard( '{Shift>}[ArrowUp]{/Shift}' );
399
+
400
+ expect( input ).toHaveValue( 6 );
401
+ } );
402
+ } );
403
+
404
+ describe( 'Key DOWN interactions', () => {
405
+ it( 'should fire onKeyDown callback', async () => {
406
+ const user = userEvent.setup( {
407
+ advanceTimers: jest.advanceTimersByTime,
408
+ } );
409
+ const spy = jest.fn();
410
+
411
+ render( <StatefulNumberControl value={ 5 } onKeyDown={ spy } /> );
412
+
413
+ const input = screen.getByRole( 'spinbutton' );
414
+ await user.click( input );
415
+ await user.keyboard( '[ArrowDown]' );
416
+
417
+ expect( spy ).toHaveBeenCalled();
418
+ } );
419
+
420
+ it( 'should decrement by step on key DOWN press', async () => {
421
+ const user = userEvent.setup( {
422
+ advanceTimers: jest.advanceTimersByTime,
423
+ } );
424
+
425
+ render( <StatefulNumberControl value={ 5 } /> );
426
+
427
+ const input = screen.getByRole( 'spinbutton' );
428
+ await user.click( input );
429
+ await user.keyboard( '[ArrowDown]' );
430
+
431
+ expect( input ).toHaveValue( 4 );
432
+ } );
433
+
434
+ it( 'should decrement from a negative value', async () => {
435
+ const user = userEvent.setup( {
436
+ advanceTimers: jest.advanceTimersByTime,
437
+ } );
438
+
439
+ render( <StatefulNumberControl value={ -5 } /> );
440
+
441
+ const input = screen.getByRole( 'spinbutton' );
442
+ await user.click( input );
443
+ await user.keyboard( '[ArrowDown]' );
444
+
445
+ expect( input ).toHaveValue( -6 );
446
+ } );
447
+
448
+ it( 'should decrement while preserving the decimal value when `step` is “any”', async () => {
449
+ const user = userEvent.setup( {
450
+ advanceTimers: jest.advanceTimersByTime,
451
+ } );
452
+
453
+ render( <StatefulNumberControl value={ 868.5309 } step="any" /> );
454
+
455
+ const input = screen.getByRole( 'spinbutton' );
456
+ await user.click( input );
457
+ await user.keyboard( '[ArrowDown]' );
458
+
459
+ expect( input ).toHaveValue( 867.5309 );
460
+ } );
461
+
462
+ it( 'should decrement by shiftStep on key DOWN + shift press', async () => {
463
+ const user = userEvent.setup( {
464
+ advanceTimers: jest.advanceTimersByTime,
465
+ } );
466
+
467
+ render( <StatefulNumberControl value={ 5 } /> );
468
+
469
+ const input = screen.getByRole( 'spinbutton' );
470
+ await user.click( input );
471
+ await user.keyboard( '{Shift>}[ArrowDown]{/Shift}' );
472
+
473
+ expect( input ).toHaveValue( 0 );
474
+ } );
475
+
476
+ it( 'should decrement by shiftStep while preserving the decimal value when `step` is “any”', async () => {
477
+ const user = userEvent.setup( {
478
+ advanceTimers: jest.advanceTimersByTime,
479
+ } );
480
+
481
+ render( <StatefulNumberControl value={ 877.5309 } step="any" /> );
482
+
483
+ const input = screen.getByRole( 'spinbutton' );
484
+ await user.click( input );
485
+ await user.keyboard( '{Shift>}[ArrowDown]{/Shift}' );
486
+
487
+ expect( input ).toHaveValue( 867.5309 );
488
+ } );
489
+
490
+ it( 'should decrement by custom shiftStep on key DOWN + shift press', async () => {
491
+ const user = userEvent.setup( {
492
+ advanceTimers: jest.advanceTimersByTime,
493
+ } );
494
+
495
+ render( <StatefulNumberControl value={ 5 } shiftStep={ 100 } /> );
496
+
497
+ const input = screen.getByRole( 'spinbutton' );
498
+ await user.click( input );
499
+ await user.keyboard( '{Shift>}[ArrowDown]{/Shift}' );
500
+
501
+ expect( input ).toHaveValue( -100 );
502
+ } );
503
+
504
+ it( 'should decrement but be limited by min on shiftStep', async () => {
505
+ const user = userEvent.setup( {
506
+ advanceTimers: jest.advanceTimersByTime,
507
+ } );
508
+
509
+ render(
510
+ <StatefulNumberControl
511
+ value={ 5 }
512
+ shiftStep={ 100 }
513
+ min={ 4 }
514
+ />
515
+ );
516
+
517
+ const input = screen.getByRole( 'spinbutton' );
518
+ await user.click( input );
519
+ await user.keyboard( '{Shift>}[ArrowDown]{/Shift}' );
520
+
521
+ expect( input ).toHaveValue( 4 );
522
+ } );
523
+
524
+ it( 'should not decrement by shiftStep if disabled', async () => {
525
+ const user = userEvent.setup( {
526
+ advanceTimers: jest.advanceTimersByTime,
527
+ } );
528
+
529
+ render(
530
+ <StatefulNumberControl
531
+ value={ 5 }
532
+ shiftStep={ 100 }
533
+ isShiftStepEnabled={ false }
534
+ />
535
+ );
536
+
537
+ const input = screen.getByRole( 'spinbutton' );
538
+ await user.click( input );
539
+ await user.keyboard( '{Shift>}[ArrowDown]{/Shift}' );
540
+
541
+ expect( input ).toHaveValue( 4 );
542
+ } );
543
+ } );
544
+
545
+ describe( 'custom spin buttons', () => {
546
+ test.each( [
547
+ undefined,
548
+ 'none',
549
+ 'native',
550
+ ] as NumberControlProps[ 'spinControls' ][] )(
551
+ 'should not appear when spinControls = %s',
552
+ ( spinControls ) => {
553
+ render( <NumberControl spinControls={ spinControls } /> );
554
+ expect(
555
+ screen.queryByLabelText( 'Increment' )
556
+ ).not.toBeInTheDocument();
557
+ expect(
558
+ screen.queryByLabelText( 'Decrement' )
559
+ ).not.toBeInTheDocument();
560
+ }
561
+ );
562
+
563
+ test.each( [
564
+ [ 'up', '1', {} ],
565
+ [ 'up', '2', { value: '1' } ],
566
+ [ 'up', '12', { value: '10', step: '2' } ],
567
+ [ 'up', '10', { value: '10', max: 10 } ],
568
+ [ 'down', '-1', {} ],
569
+ [ 'down', '1', { value: '2' } ],
570
+ [ 'down', '10', { value: '12', step: '2' } ],
571
+ [ 'down', '10', { value: '10', min: 10 } ],
572
+ ] )(
573
+ 'should spin %s to %s when props = %o',
574
+ async ( direction, expectedValue, props ) => {
575
+ const user = userEvent.setup( {
576
+ advanceTimers: jest.advanceTimersByTime,
577
+ } );
578
+ const onChange = jest.fn();
579
+ render(
580
+ <NumberControl
581
+ { ...props }
582
+ spinControls="custom"
583
+ onChange={ onChange }
584
+ />
585
+ );
586
+ await user.click(
587
+ screen.getByLabelText(
588
+ direction === 'up' ? 'Increment' : 'Decrement'
589
+ )
590
+ );
591
+ expect( onChange ).toHaveBeenCalledWith( expectedValue, {
592
+ event: expect.objectContaining( {
593
+ target: expect.any( HTMLInputElement ),
594
+ type: expect.any( String ),
595
+ } ),
596
+ } );
597
+ }
598
+ );
599
+ } );
600
+ } );