@wordpress/components 21.3.0 → 22.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 (612) hide show
  1. package/CHANGELOG.md +65 -1
  2. package/build/angle-picker-control/index.js +1 -1
  3. package/build/angle-picker-control/index.js.map +1 -1
  4. package/build/autocomplete/autocompleter-ui.js +28 -2
  5. package/build/autocomplete/autocompleter-ui.js.map +1 -1
  6. package/build/border-box-control/border-box-control/component.js +63 -15
  7. package/build/border-box-control/border-box-control/component.js.map +1 -1
  8. package/build/border-box-control/border-box-control/hook.js +7 -3
  9. package/build/border-box-control/border-box-control/hook.js.map +1 -1
  10. package/build/border-box-control/border-box-control-linked-button/hook.js +3 -3
  11. package/build/border-box-control/border-box-control-linked-button/hook.js.map +1 -1
  12. package/build/border-box-control/border-box-control-split-controls/component.js +3 -3
  13. package/build/border-box-control/border-box-control-split-controls/component.js.map +1 -1
  14. package/build/border-box-control/border-box-control-split-controls/hook.js +8 -11
  15. package/build/border-box-control/border-box-control-split-controls/hook.js.map +1 -1
  16. package/build/border-box-control/border-box-control-visualizer/hook.js +3 -7
  17. package/build/border-box-control/border-box-control-visualizer/hook.js.map +1 -1
  18. package/build/border-box-control/styles.js +34 -34
  19. package/build/border-box-control/styles.js.map +1 -1
  20. package/build/border-control/border-control/component.js +5 -4
  21. package/build/border-control/border-control/component.js.map +1 -1
  22. package/build/border-control/border-control/hook.js +12 -5
  23. package/build/border-control/border-control/hook.js.map +1 -1
  24. package/build/border-control/border-control-dropdown/hook.js +5 -5
  25. package/build/border-control/border-control-dropdown/hook.js.map +1 -1
  26. package/build/border-control/styles.js +19 -34
  27. package/build/border-control/styles.js.map +1 -1
  28. package/build/box-control/index.js +6 -2
  29. package/build/box-control/index.js.map +1 -1
  30. package/build/circular-option-picker/index.js +14 -14
  31. package/build/circular-option-picker/index.js.map +1 -1
  32. package/build/color-palette/index.js +83 -30
  33. package/build/color-palette/index.js.map +1 -1
  34. package/build/color-palette/styles.js +3 -3
  35. package/build/color-palette/styles.js.map +1 -1
  36. package/build/color-palette/types.js +6 -0
  37. package/build/color-palette/types.js.map +1 -0
  38. package/build/color-picker/input-with-slider.js +1 -1
  39. package/build/color-picker/input-with-slider.js.map +1 -1
  40. package/build/custom-gradient-picker/gradient-bar/index.js +1 -3
  41. package/build/custom-gradient-picker/gradient-bar/index.js.map +1 -1
  42. package/build/custom-select-control/index.js +8 -4
  43. package/build/custom-select-control/index.js.map +1 -1
  44. package/build/date-time/date-time/index.js +2 -0
  45. package/build/date-time/date-time/index.js.map +1 -1
  46. package/build/date-time/time/index.js +4 -4
  47. package/build/date-time/time/index.js.map +1 -1
  48. package/build/disabled/index.js +8 -1
  49. package/build/disabled/index.js.map +1 -1
  50. package/build/external-link/index.js +13 -2
  51. package/build/external-link/index.js.map +1 -1
  52. package/build/focusable-iframe/index.js +0 -1
  53. package/build/focusable-iframe/index.js.map +1 -1
  54. package/build/font-size-picker/index.js +61 -48
  55. package/build/font-size-picker/index.js.map +1 -1
  56. package/build/font-size-picker/utils.js +0 -21
  57. package/build/font-size-picker/utils.js.map +1 -1
  58. package/build/form-file-upload/index.js.map +1 -1
  59. package/build/higher-order/with-filters/index.js +1 -7
  60. package/build/higher-order/with-filters/index.js.map +1 -1
  61. package/build/index.js +7 -1
  62. package/build/index.js.map +1 -1
  63. package/build/input-control/index.js +2 -0
  64. package/build/input-control/index.js.map +1 -1
  65. package/build/input-control/input-base.js +1 -1
  66. package/build/input-control/input-base.js.map +1 -1
  67. package/build/input-control/styles/input-control-styles.js +21 -21
  68. package/build/input-control/styles/input-control-styles.js.map +1 -1
  69. package/build/isolated-event-container/index.js +5 -9
  70. package/build/isolated-event-container/index.js.map +1 -1
  71. package/build/item-group/styles.js +10 -10
  72. package/build/item-group/styles.js.map +1 -1
  73. package/build/navigator/navigator-screen/component.js +20 -14
  74. package/build/navigator/navigator-screen/component.js.map +1 -1
  75. package/build/number-control/index.js +82 -22
  76. package/build/number-control/index.js.map +1 -1
  77. package/build/number-control/styles/number-control-styles.js +36 -6
  78. package/build/number-control/styles/number-control-styles.js.map +1 -1
  79. package/build/popover/index.js +15 -29
  80. package/build/popover/index.js.map +1 -1
  81. package/build/radio-group/index.js +7 -1
  82. package/build/radio-group/index.js.map +1 -1
  83. package/build/{radio → radio-group/radio}/index.js +7 -1
  84. package/build/radio-group/radio/index.js.map +1 -0
  85. package/build/{radio-context → radio-group/radio-context}/index.js +0 -0
  86. package/build/radio-group/radio-context/index.js.map +1 -0
  87. package/build/slot-fill/bubbles-virtually/fill.js +9 -5
  88. package/build/slot-fill/bubbles-virtually/fill.js.map +1 -1
  89. package/build/slot-fill/bubbles-virtually/slot.js +13 -8
  90. package/build/slot-fill/bubbles-virtually/slot.js.map +1 -1
  91. package/build/slot-fill/bubbles-virtually/use-slot.js +15 -9
  92. package/build/slot-fill/bubbles-virtually/use-slot.js.map +1 -1
  93. package/build/slot-fill/fill.js +12 -4
  94. package/build/slot-fill/fill.js.map +1 -1
  95. package/build/slot-fill/use-slot.js +3 -1
  96. package/build/slot-fill/use-slot.js.map +1 -1
  97. package/build/snackbar/index.js +1 -1
  98. package/build/snackbar/index.js.map +1 -1
  99. package/build/tab-panel/index.js +2 -6
  100. package/build/tab-panel/index.js.map +1 -1
  101. package/build/text-control/index.js +0 -2
  102. package/build/text-control/index.js.map +1 -1
  103. package/build/toggle-control/index.js +15 -3
  104. package/build/toggle-control/index.js.map +1 -1
  105. package/build/toggle-group-control/toggle-group-control/as-button-group.js +90 -0
  106. package/build/toggle-group-control/toggle-group-control/as-button-group.js.map +1 -0
  107. package/build/toggle-group-control/toggle-group-control/as-radio-group.js +90 -0
  108. package/build/toggle-group-control/toggle-group-control/as-radio-group.js.map +1 -0
  109. package/build/toggle-group-control/toggle-group-control/component.js +21 -50
  110. package/build/toggle-group-control/toggle-group-control/component.js.map +1 -1
  111. package/build/toggle-group-control/toggle-group-control/styles.js +8 -8
  112. package/build/toggle-group-control/toggle-group-control/styles.js.map +1 -1
  113. package/build/toggle-group-control/toggle-group-control-option-base/component.js +39 -17
  114. package/build/toggle-group-control/toggle-group-control-option-base/component.js.map +1 -1
  115. package/build/toggle-group-control/toggle-group-control-option-base/styles.js +23 -23
  116. package/build/toggle-group-control/toggle-group-control-option-base/styles.js.map +1 -1
  117. package/build/toolbar-dropdown-menu/index.js +1 -1
  118. package/build/toolbar-dropdown-menu/index.js.map +1 -1
  119. package/build/ui/context/context-system-provider.js +9 -22
  120. package/build/ui/context/context-system-provider.js.map +1 -1
  121. package/build/unit-control/index.js +7 -9
  122. package/build/unit-control/index.js.map +1 -1
  123. package/build/unit-control/styles/unit-control-styles.js +15 -25
  124. package/build/unit-control/styles/unit-control-styles.js.map +1 -1
  125. package/build/utils/config-values.js +0 -1
  126. package/build/utils/config-values.js.map +1 -1
  127. package/build/utils/hooks/use-update-effect.js +5 -1
  128. package/build/utils/hooks/use-update-effect.js.map +1 -1
  129. package/build-module/angle-picker-control/index.js +1 -1
  130. package/build-module/angle-picker-control/index.js.map +1 -1
  131. package/build-module/autocomplete/autocompleter-ui.js +29 -3
  132. package/build-module/autocomplete/autocompleter-ui.js.map +1 -1
  133. package/build-module/border-box-control/border-box-control/component.js +61 -13
  134. package/build-module/border-box-control/border-box-control/component.js.map +1 -1
  135. package/build-module/border-box-control/border-box-control/hook.js +7 -3
  136. package/build-module/border-box-control/border-box-control/hook.js.map +1 -1
  137. package/build-module/border-box-control/border-box-control-linked-button/hook.js +3 -3
  138. package/build-module/border-box-control/border-box-control-linked-button/hook.js.map +1 -1
  139. package/build-module/border-box-control/border-box-control-split-controls/component.js +3 -3
  140. package/build-module/border-box-control/border-box-control-split-controls/component.js.map +1 -1
  141. package/build-module/border-box-control/border-box-control-split-controls/hook.js +9 -10
  142. package/build-module/border-box-control/border-box-control-split-controls/hook.js.map +1 -1
  143. package/build-module/border-box-control/border-box-control-visualizer/hook.js +4 -6
  144. package/build-module/border-box-control/border-box-control-visualizer/hook.js.map +1 -1
  145. package/build-module/border-box-control/styles.js +26 -28
  146. package/build-module/border-box-control/styles.js.map +1 -1
  147. package/build-module/border-control/border-control/component.js +5 -4
  148. package/build-module/border-control/border-control/component.js.map +1 -1
  149. package/build-module/border-control/border-control/hook.js +12 -5
  150. package/build-module/border-control/border-control/hook.js.map +1 -1
  151. package/build-module/border-control/border-control-dropdown/hook.js +5 -5
  152. package/build-module/border-control/border-control-dropdown/hook.js.map +1 -1
  153. package/build-module/border-control/styles.js +20 -36
  154. package/build-module/border-control/styles.js.map +1 -1
  155. package/build-module/box-control/index.js +6 -2
  156. package/build-module/box-control/index.js.map +1 -1
  157. package/build-module/circular-option-picker/index.js +14 -14
  158. package/build-module/circular-option-picker/index.js.map +1 -1
  159. package/build-module/color-palette/index.js +81 -28
  160. package/build-module/color-palette/index.js.map +1 -1
  161. package/build-module/color-palette/styles.js +3 -3
  162. package/build-module/color-palette/styles.js.map +1 -1
  163. package/build-module/color-palette/types.js +2 -0
  164. package/build-module/color-palette/types.js.map +1 -0
  165. package/build-module/color-picker/input-with-slider.js +1 -1
  166. package/build-module/color-picker/input-with-slider.js.map +1 -1
  167. package/build-module/custom-gradient-picker/gradient-bar/index.js +1 -2
  168. package/build-module/custom-gradient-picker/gradient-bar/index.js.map +1 -1
  169. package/build-module/custom-select-control/index.js +8 -4
  170. package/build-module/custom-select-control/index.js.map +1 -1
  171. package/build-module/date-time/date-time/index.js +2 -0
  172. package/build-module/date-time/date-time/index.js.map +1 -1
  173. package/build-module/date-time/time/index.js +4 -4
  174. package/build-module/date-time/time/index.js.map +1 -1
  175. package/build-module/disabled/index.js +8 -1
  176. package/build-module/disabled/index.js.map +1 -1
  177. package/build-module/external-link/index.js +13 -2
  178. package/build-module/external-link/index.js.map +1 -1
  179. package/build-module/focusable-iframe/index.js +0 -1
  180. package/build-module/focusable-iframe/index.js.map +1 -1
  181. package/build-module/font-size-picker/index.js +65 -50
  182. package/build-module/font-size-picker/index.js.map +1 -1
  183. package/build-module/font-size-picker/utils.js +0 -19
  184. package/build-module/font-size-picker/utils.js.map +1 -1
  185. package/build-module/form-file-upload/index.js.map +1 -1
  186. package/build-module/higher-order/with-filters/index.js +1 -6
  187. package/build-module/higher-order/with-filters/index.js.map +1 -1
  188. package/build-module/index.js +2 -2
  189. package/build-module/index.js.map +1 -1
  190. package/build-module/input-control/index.js +2 -0
  191. package/build-module/input-control/index.js.map +1 -1
  192. package/build-module/input-control/input-base.js +1 -1
  193. package/build-module/input-control/input-base.js.map +1 -1
  194. package/build-module/input-control/styles/input-control-styles.js +21 -21
  195. package/build-module/input-control/styles/input-control-styles.js.map +1 -1
  196. package/build-module/isolated-event-container/index.js +7 -9
  197. package/build-module/isolated-event-container/index.js.map +1 -1
  198. package/build-module/item-group/styles.js +10 -10
  199. package/build-module/item-group/styles.js.map +1 -1
  200. package/build-module/navigator/navigator-screen/component.js +20 -4
  201. package/build-module/navigator/navigator-screen/component.js.map +1 -1
  202. package/build-module/number-control/index.js +81 -26
  203. package/build-module/number-control/index.js.map +1 -1
  204. package/build-module/number-control/styles/number-control-styles.js +30 -4
  205. package/build-module/number-control/styles/number-control-styles.js.map +1 -1
  206. package/build-module/popover/index.js +15 -29
  207. package/build-module/popover/index.js.map +1 -1
  208. package/build-module/radio-group/index.js +6 -1
  209. package/build-module/radio-group/index.js.map +1 -1
  210. package/build-module/{radio → radio-group/radio}/index.js +6 -1
  211. package/build-module/radio-group/radio/index.js.map +1 -0
  212. package/build-module/{radio-context → radio-group/radio-context}/index.js +0 -0
  213. package/build-module/radio-group/radio-context/index.js.map +1 -0
  214. package/build-module/slot-fill/bubbles-virtually/fill.js +9 -5
  215. package/build-module/slot-fill/bubbles-virtually/fill.js.map +1 -1
  216. package/build-module/slot-fill/bubbles-virtually/slot.js +13 -8
  217. package/build-module/slot-fill/bubbles-virtually/slot.js.map +1 -1
  218. package/build-module/slot-fill/bubbles-virtually/use-slot.js +15 -9
  219. package/build-module/slot-fill/bubbles-virtually/use-slot.js.map +1 -1
  220. package/build-module/slot-fill/fill.js +12 -4
  221. package/build-module/slot-fill/fill.js.map +1 -1
  222. package/build-module/slot-fill/use-slot.js +3 -1
  223. package/build-module/slot-fill/use-slot.js.map +1 -1
  224. package/build-module/snackbar/index.js +1 -1
  225. package/build-module/snackbar/index.js.map +1 -1
  226. package/build-module/tab-panel/index.js +2 -6
  227. package/build-module/tab-panel/index.js.map +1 -1
  228. package/build-module/text-control/index.js +0 -2
  229. package/build-module/text-control/index.js.map +1 -1
  230. package/build-module/toggle-control/index.js +15 -3
  231. package/build-module/toggle-control/index.js.map +1 -1
  232. package/build-module/toggle-group-control/toggle-group-control/as-button-group.js +76 -0
  233. package/build-module/toggle-group-control/toggle-group-control/as-button-group.js.map +1 -0
  234. package/build-module/toggle-group-control/toggle-group-control/as-radio-group.js +75 -0
  235. package/build-module/toggle-group-control/toggle-group-control/as-radio-group.js.map +1 -0
  236. package/build-module/toggle-group-control/toggle-group-control/component.js +19 -49
  237. package/build-module/toggle-group-control/toggle-group-control/component.js.map +1 -1
  238. package/build-module/toggle-group-control/toggle-group-control/styles.js +7 -6
  239. package/build-module/toggle-group-control/toggle-group-control/styles.js.map +1 -1
  240. package/build-module/toggle-group-control/toggle-group-control-option-base/component.js +39 -17
  241. package/build-module/toggle-group-control/toggle-group-control-option-base/component.js.map +1 -1
  242. package/build-module/toggle-group-control/toggle-group-control-option-base/styles.js +21 -18
  243. package/build-module/toggle-group-control/toggle-group-control-option-base/styles.js.map +1 -1
  244. package/build-module/toolbar-dropdown-menu/index.js +1 -1
  245. package/build-module/toolbar-dropdown-menu/index.js.map +1 -1
  246. package/build-module/ui/context/context-system-provider.js +6 -20
  247. package/build-module/ui/context/context-system-provider.js.map +1 -1
  248. package/build-module/unit-control/index.js +8 -10
  249. package/build-module/unit-control/index.js.map +1 -1
  250. package/build-module/unit-control/styles/unit-control-styles.js +8 -24
  251. package/build-module/unit-control/styles/unit-control-styles.js.map +1 -1
  252. package/build-module/utils/config-values.js +0 -1
  253. package/build-module/utils/config-values.js.map +1 -1
  254. package/build-module/utils/hooks/use-update-effect.js +5 -1
  255. package/build-module/utils/hooks/use-update-effect.js.map +1 -1
  256. package/build-style/style-rtl.css +21 -41
  257. package/build-style/style.css +19 -39
  258. package/build-types/base-field/hook.d.ts +11 -11
  259. package/build-types/border-box-control/border-box-control/component.d.ts +53 -4
  260. package/build-types/border-box-control/border-box-control/component.d.ts.map +1 -1
  261. package/build-types/border-box-control/border-box-control/hook.d.ts +13 -12
  262. package/build-types/border-box-control/border-box-control/hook.d.ts.map +1 -1
  263. package/build-types/border-box-control/border-box-control-linked-button/hook.d.ts +12 -12
  264. package/build-types/border-box-control/border-box-control-linked-button/hook.d.ts.map +1 -1
  265. package/build-types/border-box-control/border-box-control-split-controls/component.d.ts +1 -1
  266. package/build-types/border-box-control/border-box-control-split-controls/component.d.ts.map +1 -1
  267. package/build-types/border-box-control/border-box-control-split-controls/hook.d.ts +12 -12
  268. package/build-types/border-box-control/border-box-control-split-controls/hook.d.ts.map +1 -1
  269. package/build-types/border-box-control/border-box-control-visualizer/hook.d.ts +12 -12
  270. package/build-types/border-box-control/border-box-control-visualizer/hook.d.ts.map +1 -1
  271. package/build-types/border-box-control/stories/index.d.ts +17 -0
  272. package/build-types/border-box-control/stories/index.d.ts.map +1 -0
  273. package/build-types/border-box-control/styles.d.ts +7 -6
  274. package/build-types/border-box-control/styles.d.ts.map +1 -1
  275. package/build-types/border-box-control/types.d.ts +12 -16
  276. package/build-types/border-box-control/types.d.ts.map +1 -1
  277. package/build-types/border-control/border-control/component.d.ts +1 -1
  278. package/build-types/border-control/border-control/component.d.ts.map +1 -1
  279. package/build-types/border-control/border-control/hook.d.ts +13 -13
  280. package/build-types/border-control/border-control/hook.d.ts.map +1 -1
  281. package/build-types/border-control/border-control-dropdown/component.d.ts +1 -1
  282. package/build-types/border-control/border-control-dropdown/hook.d.ts +11 -11
  283. package/build-types/border-control/border-control-dropdown/hook.d.ts.map +1 -1
  284. package/build-types/border-control/border-control-style-picker/hook.d.ts +11 -11
  285. package/build-types/border-control/stories/index.d.ts +6 -6
  286. package/build-types/border-control/stories/index.d.ts.map +1 -1
  287. package/build-types/border-control/styles.d.ts +3 -3
  288. package/build-types/border-control/styles.d.ts.map +1 -1
  289. package/build-types/border-control/types.d.ts +7 -9
  290. package/build-types/border-control/types.d.ts.map +1 -1
  291. package/build-types/card/card/hook.d.ts +12 -12
  292. package/build-types/card/card-body/hook.d.ts +12 -12
  293. package/build-types/card/card-divider/hook.d.ts +13 -13
  294. package/build-types/card/card-footer/hook.d.ts +12 -12
  295. package/build-types/card/card-header/hook.d.ts +12 -12
  296. package/build-types/card/card-media/hook.d.ts +12 -12
  297. package/build-types/card/stories/index.d.ts.map +1 -1
  298. package/build-types/circular-option-picker/index.d.ts +4 -24
  299. package/build-types/circular-option-picker/index.d.ts.map +1 -1
  300. package/build-types/color-palette/index.d.ts +33 -18
  301. package/build-types/color-palette/index.d.ts.map +1 -1
  302. package/build-types/color-palette/stories/index.d.ts +21 -0
  303. package/build-types/color-palette/stories/index.d.ts.map +1 -0
  304. package/build-types/color-palette/styles.d.ts +3 -2
  305. package/build-types/color-palette/styles.d.ts.map +1 -1
  306. package/build-types/color-palette/test/index.d.ts +2 -0
  307. package/build-types/color-palette/test/index.d.ts.map +1 -0
  308. package/build-types/color-palette/types.d.ts +86 -0
  309. package/build-types/color-palette/types.d.ts.map +1 -0
  310. package/build-types/color-picker/styles.d.ts +5 -4
  311. package/build-types/color-picker/styles.d.ts.map +1 -1
  312. package/build-types/confirm-dialog/component.d.ts +4 -4
  313. package/build-types/custom-select-control/index.d.ts +1 -12
  314. package/build-types/custom-select-control/index.d.ts.map +1 -1
  315. package/build-types/custom-select-control/styles.d.ts +3 -1
  316. package/build-types/custom-select-control/styles.d.ts.map +1 -1
  317. package/build-types/date-time/date/styles.d.ts +3 -3
  318. package/build-types/date-time/date-time/index.d.ts +2 -0
  319. package/build-types/date-time/date-time/index.d.ts.map +1 -1
  320. package/build-types/date-time/date-time/styles.d.ts +3 -3
  321. package/build-types/date-time/stories/date-time.d.ts.map +1 -1
  322. package/build-types/date-time/time/styles.d.ts +8 -4
  323. package/build-types/date-time/time/styles.d.ts.map +1 -1
  324. package/build-types/disabled/index.d.ts +8 -1
  325. package/build-types/disabled/index.d.ts.map +1 -1
  326. package/build-types/elevation/hook.d.ts +12 -12
  327. package/build-types/external-link/index.d.ts.map +1 -1
  328. package/build-types/external-link/styles/external-link-styles.d.ts +1 -1
  329. package/build-types/external-link/test/index.d.ts +2 -0
  330. package/build-types/external-link/test/index.d.ts.map +1 -0
  331. package/build-types/flex/flex/hook.d.ts +12 -12
  332. package/build-types/flex/flex-block/hook.d.ts +12 -12
  333. package/build-types/flex/flex-item/hook.d.ts +12 -12
  334. package/build-types/focal-point-picker/styles/focal-point-picker-style.d.ts +2 -2
  335. package/build-types/focal-point-picker/styles/focal-point-style.d.ts +3 -3
  336. package/build-types/focusable-iframe/index.d.ts.map +1 -1
  337. package/build-types/font-size-picker/index.d.ts.map +1 -1
  338. package/build-types/font-size-picker/types.d.ts +1 -1
  339. package/build-types/font-size-picker/utils.d.ts +0 -8
  340. package/build-types/font-size-picker/utils.d.ts.map +1 -1
  341. package/build-types/form-file-upload/index.d.ts.map +1 -1
  342. package/build-types/form-file-upload/types.d.ts +5 -4
  343. package/build-types/form-file-upload/types.d.ts.map +1 -1
  344. package/build-types/grid/hook.d.ts +12 -12
  345. package/build-types/h-stack/component.d.ts +1 -1
  346. package/build-types/h-stack/hook.d.ts +12 -12
  347. package/build-types/heading/hook.d.ts +12 -12
  348. package/build-types/input-control/index.d.ts +1 -1
  349. package/build-types/input-control/index.d.ts.map +1 -1
  350. package/build-types/input-control/input-base.d.ts +5 -2
  351. package/build-types/input-control/input-base.d.ts.map +1 -1
  352. package/build-types/input-control/styles/input-control-styles.d.ts.map +1 -1
  353. package/build-types/input-control/types.d.ts +3 -8
  354. package/build-types/input-control/types.d.ts.map +1 -1
  355. package/build-types/input-control/utils.d.ts +1 -1
  356. package/build-types/isolated-event-container/index.d.ts +3 -2
  357. package/build-types/isolated-event-container/index.d.ts.map +1 -1
  358. package/build-types/item-group/item/hook.d.ts +13 -13
  359. package/build-types/item-group/item-group/hook.d.ts +13 -13
  360. package/build-types/navigator/navigator-back-button/hook.d.ts +13 -13
  361. package/build-types/navigator/navigator-button/hook.d.ts +13 -13
  362. package/build-types/navigator/navigator-screen/component.d.ts.map +1 -1
  363. package/build-types/number-control/index.d.ts +2 -4
  364. package/build-types/number-control/index.d.ts.map +1 -1
  365. package/build-types/number-control/styles/number-control-styles.d.ts +5 -0
  366. package/build-types/number-control/styles/number-control-styles.d.ts.map +1 -1
  367. package/build-types/number-control/types.d.ts +12 -0
  368. package/build-types/number-control/types.d.ts.map +1 -1
  369. package/build-types/popover/index.d.ts +1 -1
  370. package/build-types/popover/index.d.ts.map +1 -1
  371. package/build-types/popover/stories/e2e/index.d.ts +1 -1
  372. package/build-types/popover/stories/index.d.ts +2 -0
  373. package/build-types/popover/stories/index.d.ts.map +1 -1
  374. package/build-types/popover/types.d.ts +18 -14
  375. package/build-types/popover/types.d.ts.map +1 -1
  376. package/build-types/radio-group/index.d.ts +10 -0
  377. package/build-types/radio-group/index.d.ts.map +1 -0
  378. package/build-types/radio-group/radio/index.d.ts +7 -0
  379. package/build-types/radio-group/radio/index.d.ts.map +1 -0
  380. package/build-types/{radio-context → radio-group/radio-context}/index.d.ts +0 -0
  381. package/build-types/radio-group/radio-context/index.d.ts.map +1 -0
  382. package/build-types/range-control/index.d.ts +1 -1
  383. package/build-types/range-control/styles/range-control-styles.d.ts +2 -1
  384. package/build-types/range-control/styles/range-control-styles.d.ts.map +1 -1
  385. package/build-types/resizable-box/index.d.ts +1 -1
  386. package/build-types/resizable-box/resize-tooltip/index.d.ts +1 -1
  387. package/build-types/resizable-box/resize-tooltip/label.d.ts +1 -1
  388. package/build-types/scrollable/hook.d.ts +12 -12
  389. package/build-types/search-control/index.d.ts +2 -2
  390. package/build-types/search-control/stories/index.d.ts +4 -4
  391. package/build-types/select-control/stories/index.d.ts.map +1 -1
  392. package/build-types/slot-fill/bubbles-virtually/use-slot.d.ts.map +1 -1
  393. package/build-types/slot-fill/fill.d.ts.map +1 -1
  394. package/build-types/slot-fill/use-slot.d.ts.map +1 -1
  395. package/build-types/spacer/hook.d.ts +12 -12
  396. package/build-types/spinner/index.d.ts +1 -1
  397. package/build-types/surface/hook.d.ts +12 -12
  398. package/build-types/tab-panel/index.d.ts.map +1 -1
  399. package/build-types/text/hook.d.ts +12 -12
  400. package/build-types/text-control/index.d.ts +2 -4
  401. package/build-types/text-control/index.d.ts.map +1 -1
  402. package/build-types/text-control/stories/index.d.ts.map +1 -1
  403. package/build-types/toggle-control/index.d.ts.map +1 -1
  404. package/build-types/toggle-control/types.d.ts +2 -1
  405. package/build-types/toggle-control/types.d.ts.map +1 -1
  406. package/build-types/toggle-group-control/stories/index.d.ts +2 -2
  407. package/build-types/toggle-group-control/stories/index.d.ts.map +1 -1
  408. package/build-types/toggle-group-control/toggle-group-control/as-button-group.d.ts +6 -0
  409. package/build-types/toggle-group-control/toggle-group-control/as-button-group.d.ts.map +1 -0
  410. package/build-types/toggle-group-control/toggle-group-control/as-radio-group.d.ts +6 -0
  411. package/build-types/toggle-group-control/toggle-group-control/as-radio-group.d.ts.map +1 -0
  412. package/build-types/toggle-group-control/toggle-group-control/component.d.ts +2 -2
  413. package/build-types/toggle-group-control/toggle-group-control/component.d.ts.map +1 -1
  414. package/build-types/toggle-group-control/toggle-group-control/styles.d.ts +2 -2
  415. package/build-types/toggle-group-control/toggle-group-control/styles.d.ts.map +1 -1
  416. package/build-types/toggle-group-control/toggle-group-control-option-base/component.d.ts.map +1 -1
  417. package/build-types/toggle-group-control/toggle-group-control-option-base/styles.d.ts +4 -7
  418. package/build-types/toggle-group-control/toggle-group-control-option-base/styles.d.ts.map +1 -1
  419. package/build-types/toggle-group-control/toggle-group-control-option-icon/component.d.ts +1 -1
  420. package/build-types/toggle-group-control/types.d.ts +19 -14
  421. package/build-types/toggle-group-control/types.d.ts.map +1 -1
  422. package/build-types/tools-panel/tools-panel/hook.d.ts +12 -12
  423. package/build-types/tools-panel/tools-panel-header/hook.d.ts +12 -12
  424. package/build-types/tools-panel/tools-panel-item/hook.d.ts +12 -12
  425. package/build-types/truncate/hook.d.ts +12 -12
  426. package/build-types/ui/context/context-system-provider.d.ts.map +1 -1
  427. package/build-types/ui/control-group/hook.d.ts +12 -12
  428. package/build-types/ui/control-label/component.d.ts +1 -1
  429. package/build-types/ui/control-label/hook.d.ts +12 -12
  430. package/build-types/ui/form-group/form-group.d.ts +4 -4
  431. package/build-types/ui/form-group/use-form-group.d.ts +28 -28
  432. package/build-types/unit-control/index.d.ts +2 -2
  433. package/build-types/unit-control/index.d.ts.map +1 -1
  434. package/build-types/unit-control/styles/unit-control-styles.d.ts +2 -5
  435. package/build-types/unit-control/styles/unit-control-styles.d.ts.map +1 -1
  436. package/build-types/unit-control/types.d.ts +3 -3
  437. package/build-types/unit-control/types.d.ts.map +1 -1
  438. package/build-types/utils/config-values.d.ts +0 -1
  439. package/build-types/utils/hooks/use-update-effect.d.ts.map +1 -1
  440. package/build-types/utils/types.d.ts +0 -14
  441. package/build-types/utils/types.d.ts.map +1 -1
  442. package/build-types/v-stack/component.d.ts +2 -2
  443. package/build-types/v-stack/hook.d.ts +12 -12
  444. package/build-types/v-stack/stories/index.d.ts +2 -2
  445. package/package.json +17 -17
  446. package/src/angle-picker-control/index.js +1 -1
  447. package/src/angle-picker-control/stories/index.js +3 -0
  448. package/src/autocomplete/autocompleter-ui.js +29 -2
  449. package/src/autocomplete/test/index.js +89 -0
  450. package/src/border-box-control/border-box-control/README.md +8 -0
  451. package/src/border-box-control/border-box-control/component.tsx +64 -13
  452. package/src/border-box-control/border-box-control/hook.ts +7 -2
  453. package/src/border-box-control/border-box-control-linked-button/hook.ts +3 -6
  454. package/src/border-box-control/border-box-control-split-controls/component.tsx +3 -6
  455. package/src/border-box-control/border-box-control-split-controls/hook.ts +11 -14
  456. package/src/border-box-control/border-box-control-visualizer/hook.ts +4 -7
  457. package/src/border-box-control/stories/index.tsx +90 -0
  458. package/src/border-box-control/styles.ts +28 -22
  459. package/src/border-box-control/test/index.js +287 -122
  460. package/src/border-box-control/types.ts +12 -16
  461. package/src/border-control/border-control/README.md +8 -0
  462. package/src/border-control/border-control/component.tsx +4 -3
  463. package/src/border-control/border-control/hook.ts +10 -6
  464. package/src/border-control/border-control-dropdown/hook.ts +5 -7
  465. package/src/border-control/stories/index.tsx +12 -14
  466. package/src/border-control/styles.ts +20 -23
  467. package/src/border-control/test/index.js +139 -96
  468. package/src/border-control/types.ts +7 -9
  469. package/src/box-control/README.md +14 -0
  470. package/src/box-control/index.js +4 -0
  471. package/src/box-control/stories/index.js +8 -27
  472. package/src/button/README.md +2 -15
  473. package/src/button/stories/index.js +109 -178
  474. package/src/button/style.scss +17 -54
  475. package/src/card/stories/index.tsx +27 -31
  476. package/src/card/test/__snapshots__/index.tsx.snap +36 -35
  477. package/src/card/test/index.tsx +2 -6
  478. package/src/circular-option-picker/index.js +14 -20
  479. package/src/color-palette/README.md +51 -49
  480. package/src/color-palette/{index.js → index.tsx} +132 -51
  481. package/src/color-palette/stories/{index.js → index.tsx} +38 -27
  482. package/src/color-palette/style.scss +2 -2
  483. package/src/color-palette/{styles.js → styles.ts} +0 -0
  484. package/src/color-palette/test/__snapshots__/{index.js.snap → index.tsx.snap} +0 -0
  485. package/src/color-palette/test/{index.js → index.tsx} +1 -1
  486. package/src/color-palette/types.ts +93 -0
  487. package/src/color-picker/input-with-slider.tsx +1 -1
  488. package/src/custom-gradient-picker/gradient-bar/index.js +1 -3
  489. package/src/custom-select-control/README.md +14 -0
  490. package/src/custom-select-control/index.js +22 -15
  491. package/src/date-time/date-time/index.tsx +2 -0
  492. package/src/date-time/stories/date-time.tsx +4 -0
  493. package/src/date-time/time/index.tsx +4 -4
  494. package/src/dimension-control/test/__snapshots__/index.test.js.snap +4 -0
  495. package/src/disabled/README.md +2 -0
  496. package/src/disabled/index.tsx +8 -1
  497. package/src/disabled/test/index.tsx +0 -5
  498. package/src/external-link/index.tsx +14 -6
  499. package/src/external-link/test/index.tsx +106 -0
  500. package/src/focusable-iframe/index.js +0 -1
  501. package/src/font-size-picker/README.md +3 -3
  502. package/src/font-size-picker/index.tsx +152 -142
  503. package/src/font-size-picker/test/index.tsx +447 -174
  504. package/src/font-size-picker/test/utils.ts +1 -45
  505. package/src/font-size-picker/types.ts +1 -1
  506. package/src/font-size-picker/utils.ts +0 -22
  507. package/src/form-file-upload/README.md +1 -3
  508. package/src/form-file-upload/index.tsx +1 -0
  509. package/src/form-file-upload/types.ts +5 -4
  510. package/src/form-toggle/test/__snapshots__/index.tsx.snap +15 -13
  511. package/src/form-toggle/test/index.tsx +1 -1
  512. package/src/h-stack/test/__snapshots__/index.tsx.snap +36 -30
  513. package/src/h-stack/test/index.tsx +3 -3
  514. package/src/higher-order/with-filters/index.js +4 -9
  515. package/src/index.js +2 -1
  516. package/src/input-control/index.tsx +2 -0
  517. package/src/input-control/input-base.tsx +3 -3
  518. package/src/input-control/styles/input-control-styles.tsx +1 -0
  519. package/src/input-control/types.ts +4 -11
  520. package/src/isolated-event-container/index.tsx +32 -0
  521. package/src/item-group/styles.ts +1 -1
  522. package/src/item-group/test/__snapshots__/index.js.snap +90 -85
  523. package/src/item-group/test/index.js +7 -17
  524. package/src/navigator/navigator-screen/component.tsx +20 -3
  525. package/src/number-control/README.md +9 -4
  526. package/src/number-control/index.tsx +100 -33
  527. package/src/number-control/styles/number-control-styles.js +26 -1
  528. package/src/number-control/test/index.js +50 -0
  529. package/src/number-control/types.ts +12 -0
  530. package/src/popover/README.md +12 -7
  531. package/src/popover/index.tsx +20 -30
  532. package/src/popover/stories/index.tsx +29 -1
  533. package/src/popover/style.scss +9 -0
  534. package/src/popover/types.ts +18 -15
  535. package/src/radio-group/README.md +4 -0
  536. package/src/radio-group/index.js +6 -1
  537. package/src/{radio → radio-group/radio}/index.js +6 -1
  538. package/src/{radio-context → radio-group/radio-context}/index.js +0 -0
  539. package/src/radio-group/stories/index.js +11 -2
  540. package/src/sandbox/test/index.js +2 -2
  541. package/src/select-control/stories/index.tsx +9 -4
  542. package/src/slot-fill/bubbles-virtually/fill.js +5 -5
  543. package/src/slot-fill/bubbles-virtually/slot.js +10 -8
  544. package/src/slot-fill/bubbles-virtually/use-slot.js +15 -9
  545. package/src/slot-fill/fill.js +12 -2
  546. package/src/slot-fill/use-slot.js +3 -0
  547. package/src/snackbar/index.js +1 -1
  548. package/src/surface/test/__snapshots__/index.tsx.snap +58 -46
  549. package/src/surface/test/index.tsx +6 -16
  550. package/src/tab-panel/index.tsx +2 -3
  551. package/src/tab-panel/test/index.tsx +78 -1
  552. package/src/text/test/__snapshots__/index.tsx.snap +19 -15
  553. package/src/text/test/index.tsx +2 -2
  554. package/src/text-control/index.tsx +0 -2
  555. package/src/text-control/stories/index.tsx +5 -6
  556. package/src/toggle-control/README.md +6 -4
  557. package/src/toggle-control/index.tsx +13 -2
  558. package/src/toggle-control/types.ts +2 -4
  559. package/src/toggle-group-control/stories/index.tsx +4 -4
  560. package/src/toggle-group-control/test/__snapshots__/index.tsx.snap +219 -160
  561. package/src/toggle-group-control/test/index.tsx +129 -2
  562. package/src/toggle-group-control/toggle-group-control/as-button-group.tsx +103 -0
  563. package/src/toggle-group-control/toggle-group-control/as-radio-group.tsx +99 -0
  564. package/src/toggle-group-control/toggle-group-control/component.tsx +29 -74
  565. package/src/toggle-group-control/toggle-group-control/styles.ts +12 -10
  566. package/src/toggle-group-control/toggle-group-control-option-base/component.tsx +49 -25
  567. package/src/toggle-group-control/toggle-group-control-option-base/styles.ts +39 -19
  568. package/src/toggle-group-control/types.ts +75 -63
  569. package/src/toolbar-dropdown-menu/index.js +1 -1
  570. package/src/tools-panel/stories/index.js +0 -1
  571. package/src/tools-panel/stories/tools-panel-with-item-group-slot.js +0 -1
  572. package/src/tree-grid/test/__snapshots__/cell.js.snap +20 -18
  573. package/src/tree-grid/test/__snapshots__/roving-tab-index.js.snap +3 -1
  574. package/src/tree-grid/test/__snapshots__/row.js.snap +33 -29
  575. package/src/tree-grid/test/cell.js +1 -1
  576. package/src/tree-grid/test/roving-tab-index.js +1 -1
  577. package/src/tree-grid/test/row.js +2 -2
  578. package/src/ui/context/context-system-provider.js +5 -18
  579. package/src/ui/context/test/__snapshots__/context-system-provider.js.snap +23 -17
  580. package/src/ui/context/test/context-system-provider.js +3 -3
  581. package/src/ui/control-group/test/__snapshots__/index.js.snap +18 -16
  582. package/src/ui/control-group/test/index.js +1 -1
  583. package/src/ui/control-label/test/__snapshots__/index.js.snap +27 -21
  584. package/src/ui/control-label/test/index.js +3 -3
  585. package/src/ui/form-group/test/__snapshots__/index.js.snap +34 -30
  586. package/src/ui/form-group/test/index.js +2 -2
  587. package/src/ui/shortcut/test/__snapshots__/index.js.snap +1 -1
  588. package/src/ui/shortcut/test/index.js +1 -1
  589. package/src/ui/spinner/test/__snapshots__/index.js.snap +75 -73
  590. package/src/ui/spinner/test/index.js +3 -7
  591. package/src/unit-control/index.tsx +29 -30
  592. package/src/unit-control/styles/unit-control-styles.ts +6 -12
  593. package/src/unit-control/test/utils.ts +43 -0
  594. package/src/unit-control/types.ts +5 -6
  595. package/src/utils/config-values.js +0 -1
  596. package/src/utils/hooks/use-update-effect.js +5 -1
  597. package/src/utils/types.ts +0 -15
  598. package/src/v-stack/test/__snapshots__/index.tsx.snap +36 -30
  599. package/src/v-stack/test/index.tsx +3 -3
  600. package/src/view/test/__snapshots__/index.js.snap +34 -24
  601. package/src/view/test/index.js +5 -5
  602. package/tsconfig.json +0 -2
  603. package/tsconfig.tsbuildinfo +1 -1
  604. package/build/radio/index.js.map +0 -1
  605. package/build/radio-context/index.js.map +0 -1
  606. package/build-module/radio/index.js.map +0 -1
  607. package/build-module/radio-context/index.js.map +0 -1
  608. package/build-types/radio-context/index.d.ts.map +0 -1
  609. package/src/border-box-control/stories/index.js +0 -106
  610. package/src/form-file-upload/stories/index.js +0 -51
  611. package/src/isolated-event-container/index.js +0 -28
  612. package/src/radio/stories/index.js +0 -20
@@ -1,249 +1,522 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { render, fireEvent, screen } from '@testing-library/react';
4
+ import { render, screen, fireEvent } from '@testing-library/react';
5
+ import userEvent from '@testing-library/user-event';
5
6
 
6
7
  /**
7
8
  * Internal dependencies
8
9
  */
9
10
  import FontSizePicker from '../';
10
-
11
- const getUnitSelect = () =>
12
- document.body.querySelector( '.components-unit-control select' );
13
- const getUnitLabel = () =>
14
- document.body.querySelector( '.components-unit-control__unit-label' );
15
-
16
- const toggleCustomInput = ( showCustomInput: boolean ) => {
17
- const label = showCustomInput ? 'Set custom size' : 'Use size preset';
18
- const toggleCustom = screen.getByLabelText( label, { selector: 'button' } );
19
- fireEvent.click( toggleCustom );
20
- };
11
+ import type { FontSize } from '../types';
21
12
 
22
13
  describe( 'FontSizePicker', () => {
23
- describe( 'onChange values', () => {
24
- it( 'should not use units when the initial value is a number', () => {
25
- let fontSize = 12;
26
- const setFontSize = jest.fn(
27
- ( nextSize ) => ( fontSize = nextSize )
28
- );
29
-
14
+ test.each( [
15
+ // Use units when initial value uses units.
16
+ { value: '12px', expectedValue: '80px' },
17
+ // Don't use units when initial value does not use units.
18
+ { value: 12, expectedValue: 80 },
19
+ ] )(
20
+ 'should call onChange( $expectedValue ) after user types 80 when value is $value',
21
+ async ( { value, expectedValue } ) => {
22
+ const user = userEvent.setup( {
23
+ advanceTimers: jest.advanceTimersByTime,
24
+ } );
25
+ const onChange = jest.fn();
30
26
  render(
31
27
  <FontSizePicker
32
- value={ fontSize }
33
- onChange={ setFontSize }
34
28
  __nextHasNoMarginBottom
29
+ value={ value }
30
+ onChange={ onChange }
35
31
  />
36
32
  );
33
+ const input = screen.getByLabelText( 'Custom' );
34
+ await user.clear( input );
35
+ await user.type( input, '80' );
36
+ expect( onChange ).toHaveBeenCalledTimes( 3 ); // Once for the clear, then once per keystroke.
37
+ expect( onChange ).toHaveBeenCalledWith( expectedValue );
38
+ }
39
+ );
37
40
 
38
- const unitSelect = getUnitSelect();
39
- const unitLabel = getUnitLabel();
40
- const input = screen.getByLabelText( 'Custom', {
41
- selector: 'input',
41
+ test.each( [
42
+ // Use units when first font size uses units.
43
+ { firstFontSize: '12px', expectedValue: '80px' },
44
+ // Don't use units when first font size does not use units.
45
+ { firstFontSize: 12, expectedValue: 80 },
46
+ ] )(
47
+ 'should call onChange( $expectedValue ) after user types 80 when first font size is $firstFontSize',
48
+ async ( { firstFontSize, expectedValue } ) => {
49
+ const user = userEvent.setup( {
50
+ advanceTimers: jest.advanceTimersByTime,
42
51
  } );
43
-
44
- input.focus();
45
- fireEvent.change( input, { target: { value: 16 } } );
46
-
47
- expect( unitSelect ).toBeFalsy();
48
- expect( unitLabel ).toBeTruthy();
49
- expect( fontSize ).toBe( 16 );
50
- } );
51
-
52
- it( 'should use units when the initial value has a unit', () => {
53
- let fontSize = '12px';
54
- const setFontSize = jest.fn(
55
- ( nextSize ) => ( fontSize = nextSize )
56
- );
57
-
52
+ const onChange = jest.fn();
58
53
  render(
59
54
  <FontSizePicker
60
- value={ fontSize }
61
- onChange={ setFontSize }
62
55
  __nextHasNoMarginBottom
56
+ fontSizes={ [ { slug: 'slug', size: firstFontSize } ] }
57
+ onChange={ onChange }
63
58
  />
64
59
  );
60
+ await user.click(
61
+ screen.getByRole( 'button', { name: 'Set custom size' } )
62
+ );
63
+ const input = screen.getByLabelText( 'Custom' );
64
+ await user.type( input, '80' );
65
+ expect( onChange ).toHaveBeenCalledTimes( 2 ); // Once per keystroke.
66
+ expect( onChange ).toHaveBeenCalledWith( expectedValue );
67
+ }
68
+ );
65
69
 
66
- const unitSelect = getUnitSelect();
67
- const unitLabel = getUnitLabel();
68
- const input = screen.getByLabelText( 'Custom', {
69
- selector: 'input',
70
- } );
71
-
72
- input.focus();
73
- fireEvent.change( input, { target: { value: 16 } } );
70
+ describe( 'with > 5 font sizes', () => {
71
+ const fontSizes = [
72
+ {
73
+ slug: 'tiny',
74
+ name: 'Tiny',
75
+ size: '8px',
76
+ },
77
+ {
78
+ slug: 'small',
79
+ name: 'Small',
80
+ size: '1em',
81
+ },
82
+ {
83
+ slug: 'medium',
84
+ name: 'Medium',
85
+ size: '2rem',
86
+ },
87
+ {
88
+ slug: 'large',
89
+ name: 'Large',
90
+ size: 'clamp(1.75rem, 3vw, 2.25rem)',
91
+ },
92
+ {
93
+ slug: 'x-large',
94
+ name: 'Extra Large',
95
+ size: '30px',
96
+ },
97
+ {
98
+ slug: 'xx-large',
99
+ // no name
100
+ size: '40px',
101
+ },
102
+ ];
74
103
 
75
- expect( unitSelect ).toBeTruthy();
76
- expect( unitLabel ).toBeFalsy();
77
- expect( fontSize ).toBe( '16px' );
104
+ it( 'displays a select control', async () => {
105
+ const user = userEvent.setup( {
106
+ advanceTimers: jest.advanceTimersByTime,
107
+ } );
108
+ render(
109
+ <FontSizePicker
110
+ __nextHasNoMarginBottom
111
+ fontSizes={ fontSizes }
112
+ />
113
+ );
114
+ await user.click(
115
+ screen.getByRole( 'button', { name: 'Font size' } )
116
+ );
117
+ const options = screen.getAllByRole( 'option' );
118
+ expect( options ).toHaveLength( 8 );
119
+ expect( options[ 0 ] ).toHaveAccessibleName( 'Default' );
120
+ expect( options[ 1 ] ).toHaveAccessibleName( 'Tiny 8' );
121
+ expect( options[ 2 ] ).toHaveAccessibleName( 'Small 1' );
122
+ expect( options[ 3 ] ).toHaveAccessibleName( 'Medium 2' );
123
+ expect( options[ 4 ] ).toHaveAccessibleName( 'Large' );
124
+ expect( options[ 5 ] ).toHaveAccessibleName( 'Extra Large 30' );
125
+ expect( options[ 6 ] ).toHaveAccessibleName( 'xx-large 40' );
126
+ expect( options[ 7 ] ).toHaveAccessibleName( 'Custom' );
78
127
  } );
79
128
 
80
- it( 'should not use units when fontSizes size values are numbers', () => {
81
- let fontSize;
82
- const fontSizes = [
83
- {
84
- name: 'Small',
85
- slug: 'small',
86
- size: 12,
87
- },
88
- ];
89
- const setFontSize = jest.fn(
90
- ( nextSize ) => ( fontSize = nextSize )
91
- );
129
+ test.each( [
130
+ { value: undefined, expectedLabel: 'Size' },
131
+ { value: '8px', expectedLabel: 'Size (8px)' },
132
+ { value: '1em', expectedLabel: 'Size (1em)' },
133
+ { value: '2rem', expectedLabel: 'Size (2rem)' },
134
+ { value: 'clamp(1.75rem, 3vw, 2.25rem)', expectedLabel: 'Size' },
135
+ { value: '3px', expectedLabel: 'Size (Custom)' },
136
+ ] )(
137
+ 'displays $expectedLabel as label when value is $value',
138
+ ( { value, expectedLabel } ) => {
139
+ render(
140
+ <FontSizePicker
141
+ __nextHasNoMarginBottom
142
+ fontSizes={ fontSizes }
143
+ value={ value }
144
+ />
145
+ );
146
+ expect(
147
+ screen.getByLabelText( expectedLabel )
148
+ ).toBeInTheDocument();
149
+ }
150
+ );
92
151
 
152
+ test.each( [
153
+ { option: 'Default', value: '8px', expectedValue: undefined },
154
+ { option: 'Tiny 8', value: undefined, expectedValue: '8px' },
155
+ { option: 'Small 1', value: '8px', expectedValue: '1em' },
156
+ { option: 'Medium 2', value: '8px', expectedValue: '2rem' },
157
+ {
158
+ option: 'Large',
159
+ value: '8px',
160
+ expectedValue: 'clamp(1.75rem, 3vw, 2.25rem)',
161
+ },
162
+ ] )(
163
+ 'calls onChange( $expectedValue ) when $option is selected',
164
+ async ( { option, value, expectedValue } ) => {
165
+ const user = userEvent.setup( {
166
+ advanceTimers: jest.advanceTimersByTime,
167
+ } );
168
+ const onChange = jest.fn();
169
+ render(
170
+ <FontSizePicker
171
+ __nextHasNoMarginBottom
172
+ fontSizes={ fontSizes }
173
+ value={ value }
174
+ onChange={ onChange }
175
+ />
176
+ );
177
+ await user.click(
178
+ screen.getByRole( 'button', { name: 'Font size' } )
179
+ );
180
+ await user.click(
181
+ screen.getByRole( 'option', { name: option } )
182
+ );
183
+ expect( onChange ).toHaveBeenCalledTimes( 1 );
184
+ expect( onChange ).toHaveBeenCalledWith( expectedValue );
185
+ }
186
+ );
187
+
188
+ it( 'shows custom input when Custom is selected', async () => {
189
+ const user = userEvent.setup( {
190
+ advanceTimers: jest.advanceTimersByTime,
191
+ } );
192
+ const onChange = jest.fn();
93
193
  render(
94
194
  <FontSizePicker
95
- fontSizes={ fontSizes }
96
- value={ fontSize }
97
- onChange={ setFontSize }
98
195
  __nextHasNoMarginBottom
196
+ fontSizes={ fontSizes }
197
+ onChange={ onChange }
99
198
  />
100
199
  );
200
+ await user.click(
201
+ screen.getByRole( 'button', { name: 'Font size' } )
202
+ );
203
+ await user.click(
204
+ screen.getByRole( 'option', { name: 'Custom' } )
205
+ );
206
+ expect( screen.getByLabelText( 'Custom' ) ).toBeInTheDocument();
207
+ // TODO: onChange() shouldn't be called.
208
+ //expect( onChange ).not.toHaveBeenCalled();
209
+ } );
101
210
 
102
- toggleCustomInput( true );
103
- const unitSelect = getUnitSelect();
104
- const unitLabel = getUnitLabel();
105
- const input = screen.getByLabelText( 'Custom', {
106
- selector: 'input',
107
- } );
211
+ commonTests( fontSizes );
212
+ } );
108
213
 
109
- input.focus();
110
- fireEvent.change( input, { target: { value: 16 } } );
214
+ describe( 'with ≤ 5 homogeneous font sizes', () => {
215
+ const fontSizes = [
216
+ {
217
+ slug: 'small',
218
+ // no name
219
+ size: '12px',
220
+ },
221
+ {
222
+ slug: 'medium',
223
+ name: 'Medium',
224
+ size: '16px',
225
+ },
226
+ {
227
+ slug: 'large',
228
+ name: 'Large',
229
+ size: '22px',
230
+ },
231
+ {
232
+ slug: 'huge',
233
+ name: 'Huge',
234
+ size: '30px',
235
+ },
236
+ {
237
+ slug: 'gigantosaurus',
238
+ name: 'Gigantosaurus',
239
+ size: '40px',
240
+ },
241
+ ];
111
242
 
112
- expect( unitSelect ).toBeFalsy();
113
- expect( unitLabel ).toBeTruthy();
114
- expect( fontSize ).toBe( 16 );
243
+ it( 'displays a toggle group control with t-shirt sizes', () => {
244
+ render(
245
+ <FontSizePicker
246
+ __nextHasNoMarginBottom
247
+ fontSizes={ fontSizes }
248
+ />
249
+ );
250
+ const options = screen.getAllByRole( 'radio' );
251
+ expect( options ).toHaveLength( 5 );
252
+ expect( options[ 0 ] ).toHaveTextContent( 'S' );
253
+ expect( options[ 0 ] ).toHaveAccessibleName( 'S' );
254
+ expect( options[ 1 ] ).toHaveTextContent( 'M' );
255
+ expect( options[ 1 ] ).toHaveAccessibleName( 'Medium' );
256
+ expect( options[ 2 ] ).toHaveTextContent( 'L' );
257
+ expect( options[ 2 ] ).toHaveAccessibleName( 'Large' );
258
+ expect( options[ 3 ] ).toHaveTextContent( 'XL' );
259
+ expect( options[ 3 ] ).toHaveAccessibleName( 'Huge' );
260
+ expect( options[ 4 ] ).toHaveTextContent( 'XXL' );
261
+ expect( options[ 4 ] ).toHaveAccessibleName( 'Gigantosaurus' );
115
262
  } );
116
263
 
117
- it( 'should use units when fontSizes size values have units', () => {
118
- let fontSize;
119
- const fontSizes = [
120
- {
121
- name: 'Small',
122
- slug: 'small',
123
- size: '12px',
124
- },
125
- ];
126
- const setFontSize = jest.fn(
127
- ( nextSize ) => ( fontSize = nextSize )
128
- );
264
+ test.each( [
265
+ { value: undefined, expectedLabel: 'Size Default' },
266
+ { value: '12px', expectedLabel: 'Size small(px)' },
267
+ { value: '40px', expectedLabel: 'Size Gigantosaurus(px)' },
268
+ ] )(
269
+ 'displays $expectedLabel as label when value is $value',
270
+ ( { value, expectedLabel } ) => {
271
+ render(
272
+ <FontSizePicker
273
+ __nextHasNoMarginBottom
274
+ fontSizes={ fontSizes }
275
+ value={ value }
276
+ />
277
+ );
278
+ expect(
279
+ screen.getByLabelText( expectedLabel )
280
+ ).toBeInTheDocument();
281
+ }
282
+ );
129
283
 
284
+ it( 'calls onChange when a font size is selected', async () => {
285
+ const user = userEvent.setup( {
286
+ advanceTimers: jest.advanceTimersByTime,
287
+ } );
288
+ const onChange = jest.fn();
130
289
  render(
131
290
  <FontSizePicker
132
- fontSizes={ fontSizes }
133
- value={ fontSize }
134
- onChange={ setFontSize }
135
291
  __nextHasNoMarginBottom
292
+ fontSizes={ fontSizes }
293
+ onChange={ onChange }
136
294
  />
137
295
  );
138
-
139
- toggleCustomInput( true );
140
- const unitSelect = getUnitSelect();
141
- const unitLabel = getUnitLabel();
142
- const input = screen.getByLabelText( 'Custom', {
143
- selector: 'input',
144
- } );
145
-
146
- input.focus();
147
- fireEvent.change( input, { target: { value: 16 } } );
148
-
149
- expect( unitSelect ).toBeTruthy();
150
- expect( unitLabel ).toBeFalsy();
151
- expect( fontSize ).toBe( '16px' );
296
+ await user.click( screen.getByRole( 'radio', { name: 'Medium' } ) );
297
+ expect( onChange ).toHaveBeenCalledTimes( 1 );
298
+ expect( onChange ).toHaveBeenCalledWith( '16px' );
152
299
  } );
300
+
301
+ commonTests( fontSizes );
153
302
  } );
154
- describe( 'renders different control', () => {
155
- const options = [
303
+
304
+ describe( 'with 5 heterogeneous font sizes', () => {
305
+ const fontSizes = [
156
306
  {
157
- name: 'Small',
158
307
  slug: 'small',
159
- size: '0.65rem',
308
+ name: 'Small',
309
+ size: '12px',
160
310
  },
161
311
  {
162
- name: 'Medium',
163
312
  slug: 'medium',
164
- size: '1.125rem',
313
+ name: 'Medium',
314
+ size: '1em',
165
315
  },
166
316
  {
167
- name: 'Large',
168
317
  slug: 'large',
169
- size: '1.7rem',
318
+ name: 'Large',
319
+ size: '2rem',
320
+ },
321
+ {
322
+ slug: 'x-large',
323
+ name: 'Extra Large',
324
+ size: 'clamp(1.75rem, 3vw, 2.25rem)',
170
325
  },
171
326
  ];
172
- it( 'should render select control when we have more than five font sizes', () => {
173
- const extraOptions = [
174
- {
175
- name: 'Extra Large',
176
- slug: 'extra-large',
177
- size: '1.95rem',
178
- },
179
- {
180
- name: 'Extra Extra Large',
181
- slug: 'extra-extra-large',
182
- size: '2.5rem',
183
- },
184
- {
185
- name: 'Huge',
186
- slug: 'huge',
187
- size: '2.8rem',
188
- },
189
- ];
190
- const fontSizes = [ ...options, ...extraOptions ];
327
+
328
+ it( 'displays a toggle group control with t-shirt sizes', () => {
191
329
  render(
192
330
  <FontSizePicker
193
- fontSizes={ fontSizes }
194
- value={ fontSizes[ 0 ].size }
195
331
  __nextHasNoMarginBottom
332
+ fontSizes={ fontSizes }
196
333
  />
197
334
  );
198
- // Trigger click to open the select menu and take into account
199
- // the two extra options (default, custom);
200
- fireEvent.click(
201
- screen.getByLabelText( 'Font size', { selector: 'button' } )
202
- );
203
- const element = screen.getAllByRole( 'option' );
204
- expect( element ).toHaveLength( fontSizes.length + 2 );
335
+ const options = screen.getAllByRole( 'radio' );
336
+ expect( options ).toHaveLength( 4 );
337
+ expect( options[ 0 ] ).toHaveTextContent( 'S' );
338
+ expect( options[ 0 ] ).toHaveAccessibleName( 'Small' );
339
+ expect( options[ 1 ] ).toHaveTextContent( 'M' );
340
+ expect( options[ 1 ] ).toHaveAccessibleName( 'Medium' );
341
+ expect( options[ 2 ] ).toHaveTextContent( 'L' );
342
+ expect( options[ 2 ] ).toHaveAccessibleName( 'Large' );
343
+ expect( options[ 3 ] ).toHaveTextContent( 'XL' );
344
+ expect( options[ 3 ] ).toHaveAccessibleName( 'Extra Large' );
205
345
  } );
206
- describe( 'segmented control', () => {
207
- it( 'should use t-shirt labels for simple css values', () => {
208
- const fontSizes = [ ...options ];
346
+
347
+ test.each( [
348
+ { value: undefined, expectedLabel: 'Size Default' },
349
+ { value: '12px', expectedLabel: 'Size Small' },
350
+ { value: '1em', expectedLabel: 'Size Medium' },
351
+ { value: '2rem', expectedLabel: 'Size Large' },
352
+ {
353
+ value: 'clamp(1.75rem, 3vw, 2.25rem)',
354
+ expectedLabel: 'Size Extra Large',
355
+ },
356
+ ] )(
357
+ 'displays $expectedLabel as label when value is $value',
358
+ ( { value, expectedLabel } ) => {
209
359
  render(
210
360
  <FontSizePicker
211
- fontSizes={ fontSizes }
212
- value={ fontSizes[ 0 ].size }
213
361
  __nextHasNoMarginBottom
362
+ fontSizes={ fontSizes }
363
+ value={ value }
214
364
  />
215
365
  );
216
- const element = screen.getByLabelText( 'Large' );
217
- expect( element ).toBeInTheDocument();
218
- expect( element.children[ 0 ] ).toHaveTextContent( 'L' );
219
- } );
220
- it( 'should use incremental sequence of t-shirt sizes as labels if we have complex css', () => {
221
- const fontSizes = [
222
- ...options,
223
- {
224
- name: 'Extra Large',
225
- slug: 'extra-large',
226
- size: 'clamp(1.75rem, 3vw, 2.25rem)',
227
- },
228
- ];
366
+ expect(
367
+ screen.getByLabelText( expectedLabel )
368
+ ).toBeInTheDocument();
369
+ }
370
+ );
371
+
372
+ test.each( [
373
+ { radio: 'Small', expectedValue: '12px' },
374
+ { radio: 'Medium', expectedValue: '1em' },
375
+ { radio: 'Large', expectedValue: '2rem' },
376
+ {
377
+ radio: 'Extra Large',
378
+ expectedValue: 'clamp(1.75rem, 3vw, 2.25rem)',
379
+ },
380
+ ] )(
381
+ 'calls onChange( $expectedValue ) when $radio is selected',
382
+ async ( { radio, expectedValue } ) => {
383
+ const user = userEvent.setup( {
384
+ advanceTimers: jest.advanceTimersByTime,
385
+ } );
386
+ const onChange = jest.fn();
229
387
  render(
230
388
  <FontSizePicker
231
- fontSizes={ fontSizes }
232
- value={ fontSizes[ 0 ].size }
233
389
  __nextHasNoMarginBottom
390
+ fontSizes={ fontSizes }
391
+ onChange={ onChange }
234
392
  />
235
393
  );
236
- const largeElement = screen.getByLabelText( 'Large' );
237
- expect( largeElement ).toBeInTheDocument();
238
- expect( largeElement ).toHaveTextContent( 'L' );
239
-
240
- const extraLargeElement =
241
- screen.getByLabelText( 'Extra Large' );
242
- expect( extraLargeElement ).toBeInTheDocument();
243
- expect( extraLargeElement.children[ 0 ] ).toHaveTextContent(
244
- 'XL'
394
+ await user.click(
395
+ screen.getByRole( 'radio', { name: radio } )
245
396
  );
397
+ expect( onChange ).toHaveBeenCalledTimes( 1 );
398
+ expect( onChange ).toHaveBeenCalledWith( expectedValue );
399
+ }
400
+ );
401
+
402
+ commonTests( fontSizes );
403
+ } );
404
+
405
+ function commonTests( fontSizes: FontSize[] ) {
406
+ it( 'allows custom values by default', async () => {
407
+ const user = userEvent.setup( {
408
+ advanceTimers: jest.advanceTimersByTime,
246
409
  } );
410
+ const onChange = jest.fn();
411
+ render(
412
+ <FontSizePicker
413
+ __nextHasNoMarginBottom
414
+ fontSizes={ fontSizes }
415
+ onChange={ onChange }
416
+ />
417
+ );
418
+ await user.click(
419
+ screen.getByRole( 'button', { name: 'Set custom size' } )
420
+ );
421
+ await user.type( screen.getByLabelText( 'Custom' ), '80' );
422
+ expect( onChange ).toHaveBeenCalledTimes( 2 ); // Once per keystroke.
423
+ expect( onChange ).toHaveBeenCalledWith( '80px' );
247
424
  } );
248
- } );
425
+
426
+ it( 'does not allow custom values when disableCustomFontSizes is set', () => {
427
+ render(
428
+ <FontSizePicker
429
+ __nextHasNoMarginBottom
430
+ fontSizes={ fontSizes }
431
+ disableCustomFontSizes
432
+ />
433
+ );
434
+ expect(
435
+ screen.queryByRole( 'button', { name: 'Set custom size' } )
436
+ ).not.toBeInTheDocument();
437
+ } );
438
+
439
+ it( 'does not display a slider by default', async () => {
440
+ const user = userEvent.setup( {
441
+ advanceTimers: jest.advanceTimersByTime,
442
+ } );
443
+ render(
444
+ <FontSizePicker
445
+ __nextHasNoMarginBottom
446
+ fontSizes={ fontSizes }
447
+ />
448
+ );
449
+ await user.click(
450
+ screen.getByRole( 'button', { name: 'Set custom size' } )
451
+ );
452
+ expect(
453
+ screen.queryByLabelText( 'Custom Size' )
454
+ ).not.toBeInTheDocument();
455
+ } );
456
+
457
+ it( 'allows a slider to be used when withSlider is set', async () => {
458
+ const user = userEvent.setup( {
459
+ advanceTimers: jest.advanceTimersByTime,
460
+ } );
461
+ const onChange = jest.fn();
462
+ render(
463
+ <FontSizePicker
464
+ __nextHasNoMarginBottom
465
+ fontSizes={ fontSizes }
466
+ withSlider
467
+ onChange={ onChange }
468
+ />
469
+ );
470
+ await user.click(
471
+ screen.getByRole( 'button', { name: 'Set custom size' } )
472
+ );
473
+ const sliderInput = screen.getByLabelText( 'Custom Size' );
474
+ fireEvent.change( sliderInput, {
475
+ target: { value: 80 },
476
+ } );
477
+ expect( onChange ).toHaveBeenCalledTimes( 1 );
478
+ expect( onChange ).toHaveBeenCalledWith( '80px' );
479
+ } );
480
+
481
+ it( 'allows reset by default', async () => {
482
+ const user = userEvent.setup( {
483
+ advanceTimers: jest.advanceTimersByTime,
484
+ } );
485
+ const onChange = jest.fn();
486
+ render(
487
+ <FontSizePicker
488
+ __nextHasNoMarginBottom
489
+ fontSizes={ fontSizes }
490
+ value={ fontSizes[ 0 ].size }
491
+ onChange={ onChange }
492
+ />
493
+ );
494
+ await user.click(
495
+ screen.getByRole( 'button', { name: 'Set custom size' } )
496
+ );
497
+ await user.click( screen.getByRole( 'button', { name: 'Reset' } ) );
498
+ expect( onChange ).toHaveBeenCalledTimes( 1 );
499
+ expect( onChange ).toHaveBeenCalledWith( undefined );
500
+ } );
501
+
502
+ it( 'does not allow reset when withReset is false', async () => {
503
+ const user = userEvent.setup( {
504
+ advanceTimers: jest.advanceTimersByTime,
505
+ } );
506
+ render(
507
+ <FontSizePicker
508
+ __nextHasNoMarginBottom
509
+ fontSizes={ fontSizes }
510
+ value={ fontSizes[ 0 ].size }
511
+ withReset={ false }
512
+ />
513
+ );
514
+ await user.click(
515
+ screen.getByRole( 'button', { name: 'Set custom size' } )
516
+ );
517
+ expect(
518
+ screen.queryByRole( 'button', { name: 'Reset' } )
519
+ ).not.toBeInTheDocument();
520
+ } );
521
+ }
249
522
  } );