@wordpress/components 19.6.1 → 19.8.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 (514) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +38 -0
  3. package/build/base-control/index.js +41 -32
  4. package/build/base-control/index.js.map +1 -1
  5. package/build/base-control/styles/base-control-styles.js +43 -22
  6. package/build/base-control/styles/base-control-styles.js.map +1 -1
  7. package/build/base-control/types.js +6 -0
  8. package/build/base-control/types.js.map +1 -0
  9. package/build/border-box-control/border-box-control/component.js +124 -0
  10. package/build/border-box-control/border-box-control/component.js.map +1 -0
  11. package/build/border-box-control/border-box-control/hook.js +113 -0
  12. package/build/border-box-control/border-box-control/hook.js.map +1 -0
  13. package/build/border-box-control/border-box-control/index.js +24 -0
  14. package/build/border-box-control/border-box-control/index.js.map +1 -0
  15. package/build/border-box-control/border-box-control-linked-button/component.js +59 -0
  16. package/build/border-box-control/border-box-control-linked-button/component.js.map +1 -0
  17. package/build/border-box-control/border-box-control-linked-button/hook.js +41 -0
  18. package/build/border-box-control/border-box-control-linked-button/hook.js.map +1 -0
  19. package/build/border-box-control/border-box-control-linked-button/index.js +16 -0
  20. package/build/border-box-control/border-box-control-linked-button/index.js.map +1 -0
  21. package/build/border-box-control/border-box-control-split-controls/component.js +93 -0
  22. package/build/border-box-control/border-box-control-split-controls/component.js.map +1 -0
  23. package/build/border-box-control/border-box-control-split-controls/hook.js +45 -0
  24. package/build/border-box-control/border-box-control-split-controls/hook.js.map +1 -0
  25. package/build/border-box-control/border-box-control-split-controls/index.js +16 -0
  26. package/build/border-box-control/border-box-control-split-controls/index.js.map +1 -0
  27. package/build/border-box-control/border-box-control-visualizer/component.js +40 -0
  28. package/build/border-box-control/border-box-control-visualizer/component.js.map +1 -0
  29. package/build/border-box-control/border-box-control-visualizer/hook.js +43 -0
  30. package/build/border-box-control/border-box-control-visualizer/hook.js.map +1 -0
  31. package/build/border-box-control/border-box-control-visualizer/index.js +16 -0
  32. package/build/border-box-control/border-box-control-visualizer/index.js.map +1 -0
  33. package/build/border-box-control/index.js +44 -0
  34. package/build/border-box-control/index.js.map +1 -0
  35. package/build/border-box-control/styles.js +76 -0
  36. package/build/border-box-control/styles.js.map +1 -0
  37. package/build/border-box-control/types.js +6 -0
  38. package/build/border-box-control/types.js.map +1 -0
  39. package/build/border-box-control/utils.js +161 -0
  40. package/build/border-box-control/utils.js.map +1 -0
  41. package/build/border-control/border-control/component.js +119 -0
  42. package/build/border-control/border-control/component.js.map +1 -0
  43. package/build/border-control/border-control/hook.js +130 -0
  44. package/build/border-control/border-control/hook.js.map +1 -0
  45. package/build/border-control/border-control/index.js +24 -0
  46. package/build/border-control/border-control/index.js.map +1 -0
  47. package/build/border-control/border-control-dropdown/component.js +196 -0
  48. package/build/border-control/border-control-dropdown/component.js.map +1 -0
  49. package/build/border-control/border-control-dropdown/hook.js +105 -0
  50. package/build/border-control/border-control-dropdown/hook.js.map +1 -0
  51. package/build/border-control/border-control-dropdown/index.js +16 -0
  52. package/build/border-control/border-control-dropdown/index.js.map +1 -0
  53. package/build/border-control/border-control-style-picker/component.js +101 -0
  54. package/build/border-control/border-control-style-picker/component.js.map +1 -0
  55. package/build/border-control/border-control-style-picker/hook.js +45 -0
  56. package/build/border-control/border-control-style-picker/hook.js.map +1 -0
  57. package/build/border-control/border-control-style-picker/index.js +16 -0
  58. package/build/border-control/border-control-style-picker/index.js.map +1 -0
  59. package/build/border-control/index.js +24 -0
  60. package/build/border-control/index.js.map +1 -0
  61. package/build/border-control/styles.js +125 -0
  62. package/build/border-control/styles.js.map +1 -0
  63. package/build/border-control/types.js +6 -0
  64. package/build/border-control/types.js.map +1 -0
  65. package/build/box-control/all-input-control.js +3 -7
  66. package/build/box-control/all-input-control.js.map +1 -1
  67. package/build/box-control/axial-input-controls.js +20 -15
  68. package/build/box-control/axial-input-controls.js.map +1 -1
  69. package/build/box-control/input-controls.js +21 -16
  70. package/build/box-control/input-controls.js.map +1 -1
  71. package/build/box-control/utils.js +25 -11
  72. package/build/box-control/utils.js.map +1 -1
  73. package/build/card/styles.js +22 -17
  74. package/build/card/styles.js.map +1 -1
  75. package/build/checkbox-control/index.js +21 -1
  76. package/build/checkbox-control/index.js.map +1 -1
  77. package/build/color-palette/index.js +53 -4
  78. package/build/color-palette/index.js.map +1 -1
  79. package/build/custom-select-control/index.js +12 -4
  80. package/build/custom-select-control/index.js.map +1 -1
  81. package/build/divider/styles.js +28 -16
  82. package/build/divider/styles.js.map +1 -1
  83. package/build/focal-point-picker/controls.js +2 -3
  84. package/build/focal-point-picker/controls.js.map +1 -1
  85. package/build/form-file-upload/index.js +4 -1
  86. package/build/form-file-upload/index.js.map +1 -1
  87. package/build/index.js +40 -0
  88. package/build/index.js.map +1 -1
  89. package/build/input-control/input-field.js +21 -14
  90. package/build/input-control/input-field.js.map +1 -1
  91. package/build/input-control/reducer/actions.js +1 -3
  92. package/build/input-control/reducer/actions.js.map +1 -1
  93. package/build/input-control/reducer/reducer.js +1 -43
  94. package/build/input-control/reducer/reducer.js.map +1 -1
  95. package/build/item-group/styles.js +14 -14
  96. package/build/item-group/styles.js.map +1 -1
  97. package/build/mobile/picker/index.android.js +0 -3
  98. package/build/mobile/picker/index.android.js.map +1 -1
  99. package/build/number-control/index.js +15 -10
  100. package/build/number-control/index.js.map +1 -1
  101. package/build/resizable-box/resize-tooltip/styles/resize-tooltip.styles.js +4 -4
  102. package/build/resizable-box/resize-tooltip/styles/resize-tooltip.styles.js.map +1 -1
  103. package/build/surface/styles.js +8 -8
  104. package/build/surface/styles.js.map +1 -1
  105. package/build/toggle-group-control/index.js +8 -0
  106. package/build/toggle-group-control/index.js.map +1 -1
  107. package/build/toggle-group-control/toggle-group-control/component.js +10 -1
  108. package/build/toggle-group-control/toggle-group-control/component.js.map +1 -1
  109. package/build/toggle-group-control/toggle-group-control/styles.js +14 -3
  110. package/build/toggle-group-control/toggle-group-control/styles.js.map +1 -1
  111. package/build/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.js +90 -0
  112. package/build/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.js.map +1 -0
  113. package/build/toggle-group-control/toggle-group-control-option/component.js +9 -87
  114. package/build/toggle-group-control/toggle-group-control-option/component.js.map +1 -1
  115. package/build/toggle-group-control/toggle-group-control-option-base/component.js +127 -0
  116. package/build/toggle-group-control/toggle-group-control-option-base/component.js.map +1 -0
  117. package/build/toggle-group-control/toggle-group-control-option-base/index.js +16 -0
  118. package/build/toggle-group-control/toggle-group-control-option-base/index.js.map +1 -0
  119. package/build/toggle-group-control/toggle-group-control-option-base/styles.js +66 -0
  120. package/build/toggle-group-control/toggle-group-control-option-base/styles.js.map +1 -0
  121. package/build/toggle-group-control/toggle-group-control-option-icon/component.js +55 -0
  122. package/build/toggle-group-control/toggle-group-control-option-icon/component.js.map +1 -0
  123. package/build/toggle-group-control/toggle-group-control-option-icon/index.js +16 -0
  124. package/build/toggle-group-control/toggle-group-control-option-icon/index.js.map +1 -0
  125. package/build/toolbar-dropdown-menu/index.js +1 -1
  126. package/build/toolbar-dropdown-menu/index.js.map +1 -1
  127. package/build/unit-control/index.js +56 -29
  128. package/build/unit-control/index.js.map +1 -1
  129. package/build/unit-control/unit-select-control.js +2 -4
  130. package/build/unit-control/unit-select-control.js.map +1 -1
  131. package/build/utils/colors-values.js +5 -3
  132. package/build/utils/colors-values.js.map +1 -1
  133. package/build/utils/config-values.js +9 -4
  134. package/build/utils/config-values.js.map +1 -1
  135. package/build-module/base-control/index.js +39 -35
  136. package/build-module/base-control/index.js.map +1 -1
  137. package/build-module/base-control/styles/base-control-styles.js +44 -16
  138. package/build-module/base-control/styles/base-control-styles.js.map +1 -1
  139. package/build-module/base-control/types.js +2 -0
  140. package/build-module/base-control/types.js.map +1 -0
  141. package/build-module/border-box-control/border-box-control/component.js +104 -0
  142. package/build-module/border-box-control/border-box-control/component.js.map +1 -0
  143. package/build-module/border-box-control/border-box-control/hook.js +97 -0
  144. package/build-module/border-box-control/border-box-control/hook.js.map +1 -0
  145. package/build-module/border-box-control/border-box-control/index.js +3 -0
  146. package/build-module/border-box-control/border-box-control/index.js.map +1 -0
  147. package/build-module/border-box-control/border-box-control-linked-button/component.js +42 -0
  148. package/build-module/border-box-control/border-box-control-linked-button/component.js.map +1 -0
  149. package/build-module/border-box-control/border-box-control-linked-button/hook.js +26 -0
  150. package/build-module/border-box-control/border-box-control-linked-button/hook.js.map +1 -0
  151. package/build-module/border-box-control/border-box-control-linked-button/index.js +2 -0
  152. package/build-module/border-box-control/border-box-control-linked-button/index.js.map +1 -0
  153. package/build-module/border-box-control/border-box-control-split-controls/component.js +77 -0
  154. package/build-module/border-box-control/border-box-control-split-controls/component.js.map +1 -0
  155. package/build-module/border-box-control/border-box-control-split-controls/hook.js +30 -0
  156. package/build-module/border-box-control/border-box-control-split-controls/hook.js.map +1 -0
  157. package/build-module/border-box-control/border-box-control-split-controls/index.js +2 -0
  158. package/build-module/border-box-control/border-box-control-split-controls/index.js.map +1 -0
  159. package/build-module/border-box-control/border-box-control-visualizer/component.js +27 -0
  160. package/build-module/border-box-control/border-box-control-visualizer/component.js.map +1 -0
  161. package/build-module/border-box-control/border-box-control-visualizer/hook.js +28 -0
  162. package/build-module/border-box-control/border-box-control-visualizer/hook.js.map +1 -0
  163. package/build-module/border-box-control/border-box-control-visualizer/index.js +2 -0
  164. package/build-module/border-box-control/border-box-control-visualizer/index.js.map +1 -0
  165. package/build-module/border-box-control/index.js +4 -0
  166. package/build-module/border-box-control/index.js.map +1 -0
  167. package/build-module/border-box-control/styles.js +66 -0
  168. package/build-module/border-box-control/styles.js.map +1 -0
  169. package/build-module/border-box-control/types.js +2 -0
  170. package/build-module/border-box-control/types.js.map +1 -0
  171. package/build-module/border-box-control/utils.js +127 -0
  172. package/build-module/border-box-control/utils.js.map +1 -0
  173. package/build-module/border-control/border-control/component.js +100 -0
  174. package/build-module/border-control/border-control/component.js.map +1 -0
  175. package/build-module/border-control/border-control/hook.js +115 -0
  176. package/build-module/border-control/border-control/hook.js.map +1 -0
  177. package/build-module/border-control/border-control/index.js +3 -0
  178. package/build-module/border-control/border-control/index.js.map +1 -0
  179. package/build-module/border-control/border-control-dropdown/component.js +174 -0
  180. package/build-module/border-control/border-control-dropdown/component.js.map +1 -0
  181. package/build-module/border-control/border-control-dropdown/hook.js +89 -0
  182. package/build-module/border-control/border-control-dropdown/hook.js.map +1 -0
  183. package/build-module/border-control/border-control-dropdown/index.js +2 -0
  184. package/build-module/border-control/border-control-dropdown/index.js.map +1 -0
  185. package/build-module/border-control/border-control-style-picker/component.js +81 -0
  186. package/build-module/border-control/border-control-style-picker/component.js.map +1 -0
  187. package/build-module/border-control/border-control-style-picker/hook.js +30 -0
  188. package/build-module/border-control/border-control-style-picker/hook.js.map +1 -0
  189. package/build-module/border-control/border-control-style-picker/index.js +2 -0
  190. package/build-module/border-control/border-control-style-picker/index.js.map +1 -0
  191. package/build-module/border-control/index.js +3 -0
  192. package/build-module/border-control/index.js.map +1 -0
  193. package/build-module/border-control/styles.js +90 -0
  194. package/build-module/border-control/styles.js.map +1 -0
  195. package/build-module/border-control/types.js +2 -0
  196. package/build-module/border-control/types.js.map +1 -0
  197. package/build-module/box-control/all-input-control.js +4 -8
  198. package/build-module/box-control/all-input-control.js.map +1 -1
  199. package/build-module/box-control/axial-input-controls.js +18 -14
  200. package/build-module/box-control/axial-input-controls.js.map +1 -1
  201. package/build-module/box-control/input-controls.js +18 -14
  202. package/build-module/box-control/input-controls.js.map +1 -1
  203. package/build-module/box-control/utils.js +25 -11
  204. package/build-module/box-control/utils.js.map +1 -1
  205. package/build-module/card/styles.js +23 -18
  206. package/build-module/card/styles.js.map +1 -1
  207. package/build-module/checkbox-control/index.js +24 -3
  208. package/build-module/checkbox-control/index.js.map +1 -1
  209. package/build-module/color-palette/index.js +52 -4
  210. package/build-module/color-palette/index.js.map +1 -1
  211. package/build-module/custom-select-control/index.js +12 -4
  212. package/build-module/custom-select-control/index.js.map +1 -1
  213. package/build-module/divider/styles.js +29 -10
  214. package/build-module/divider/styles.js.map +1 -1
  215. package/build-module/focal-point-picker/controls.js +2 -3
  216. package/build-module/focal-point-picker/controls.js.map +1 -1
  217. package/build-module/form-file-upload/index.js +4 -1
  218. package/build-module/form-file-upload/index.js.map +1 -1
  219. package/build-module/index.js +3 -1
  220. package/build-module/index.js.map +1 -1
  221. package/build-module/input-control/input-field.js +21 -13
  222. package/build-module/input-control/input-field.js.map +1 -1
  223. package/build-module/input-control/reducer/actions.js +0 -1
  224. package/build-module/input-control/reducer/actions.js.map +1 -1
  225. package/build-module/input-control/reducer/reducer.js +2 -39
  226. package/build-module/input-control/reducer/reducer.js.map +1 -1
  227. package/build-module/item-group/styles.js +14 -14
  228. package/build-module/item-group/styles.js.map +1 -1
  229. package/build-module/mobile/picker/index.android.js +0 -3
  230. package/build-module/mobile/picker/index.android.js.map +1 -1
  231. package/build-module/number-control/index.js +15 -9
  232. package/build-module/number-control/index.js.map +1 -1
  233. package/build-module/resizable-box/resize-tooltip/styles/resize-tooltip.styles.js +4 -4
  234. package/build-module/resizable-box/resize-tooltip/styles/resize-tooltip.styles.js.map +1 -1
  235. package/build-module/surface/styles.js +8 -8
  236. package/build-module/surface/styles.js.map +1 -1
  237. package/build-module/toggle-group-control/index.js +1 -0
  238. package/build-module/toggle-group-control/index.js.map +1 -1
  239. package/build-module/toggle-group-control/toggle-group-control/component.js +8 -1
  240. package/build-module/toggle-group-control/toggle-group-control/component.js.map +1 -1
  241. package/build-module/toggle-group-control/toggle-group-control/styles.js +11 -3
  242. package/build-module/toggle-group-control/toggle-group-control/styles.js.map +1 -1
  243. package/build-module/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.js +86 -0
  244. package/build-module/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.js.map +1 -0
  245. package/build-module/toggle-group-control/toggle-group-control-option/component.js +9 -76
  246. package/build-module/toggle-group-control/toggle-group-control-option/component.js.map +1 -1
  247. package/build-module/toggle-group-control/toggle-group-control-option-base/component.js +105 -0
  248. package/build-module/toggle-group-control/toggle-group-control-option-base/component.js.map +1 -0
  249. package/build-module/toggle-group-control/toggle-group-control-option-base/index.js +2 -0
  250. package/build-module/toggle-group-control/toggle-group-control-option-base/index.js.map +1 -0
  251. package/build-module/toggle-group-control/toggle-group-control-option-base/styles.js +55 -0
  252. package/build-module/toggle-group-control/toggle-group-control-option-base/styles.js.map +1 -0
  253. package/build-module/toggle-group-control/toggle-group-control-option-icon/component.js +50 -0
  254. package/build-module/toggle-group-control/toggle-group-control-option-icon/component.js.map +1 -0
  255. package/build-module/toggle-group-control/toggle-group-control-option-icon/index.js +2 -0
  256. package/build-module/toggle-group-control/toggle-group-control-option-icon/index.js.map +1 -0
  257. package/build-module/toolbar-dropdown-menu/index.js +1 -1
  258. package/build-module/toolbar-dropdown-menu/index.js.map +1 -1
  259. package/build-module/unit-control/index.js +54 -27
  260. package/build-module/unit-control/index.js.map +1 -1
  261. package/build-module/unit-control/unit-select-control.js +2 -3
  262. package/build-module/unit-control/unit-select-control.js.map +1 -1
  263. package/build-module/utils/colors-values.js +5 -3
  264. package/build-module/utils/colors-values.js.map +1 -1
  265. package/build-module/utils/config-values.js +8 -4
  266. package/build-module/utils/config-values.js.map +1 -1
  267. package/build-style/style-rtl.css +33 -182
  268. package/build-style/style.css +33 -182
  269. package/build-types/base-control/index.d.ts +35 -71
  270. package/build-types/base-control/index.d.ts.map +1 -1
  271. package/build-types/base-control/stories/index.d.ts +25 -0
  272. package/build-types/base-control/stories/index.d.ts.map +1 -0
  273. package/build-types/base-control/styles/base-control-styles.d.ts +10 -5
  274. package/build-types/base-control/styles/base-control-styles.d.ts.map +1 -1
  275. package/build-types/base-control/types.d.ts +41 -0
  276. package/build-types/base-control/types.d.ts.map +1 -0
  277. package/build-types/border-box-control/border-box-control/component.d.ts +4 -0
  278. package/build-types/border-box-control/border-box-control/component.d.ts.map +1 -0
  279. package/build-types/border-box-control/border-box-control/hook.d.ts +282 -0
  280. package/build-types/border-box-control/border-box-control/hook.d.ts.map +1 -0
  281. package/build-types/border-box-control/border-box-control/index.d.ts +3 -0
  282. package/build-types/border-box-control/border-box-control/index.d.ts.map +1 -0
  283. package/build-types/border-box-control/border-box-control-linked-button/component.d.ts +4 -0
  284. package/build-types/border-box-control/border-box-control-linked-button/component.d.ts.map +1 -0
  285. package/build-types/border-box-control/border-box-control-linked-button/hook.d.ts +266 -0
  286. package/build-types/border-box-control/border-box-control-linked-button/hook.d.ts.map +1 -0
  287. package/build-types/border-box-control/border-box-control-linked-button/index.d.ts +2 -0
  288. package/build-types/border-box-control/border-box-control-linked-button/index.d.ts.map +1 -0
  289. package/build-types/border-box-control/border-box-control-split-controls/component.d.ts +4 -0
  290. package/build-types/border-box-control/border-box-control-split-controls/component.d.ts.map +1 -0
  291. package/build-types/border-box-control/border-box-control-split-controls/hook.d.ts +274 -0
  292. package/build-types/border-box-control/border-box-control-split-controls/hook.d.ts.map +1 -0
  293. package/build-types/border-box-control/border-box-control-split-controls/index.d.ts +2 -0
  294. package/build-types/border-box-control/border-box-control-split-controls/index.d.ts.map +1 -0
  295. package/build-types/border-box-control/border-box-control-visualizer/component.d.ts +4 -0
  296. package/build-types/border-box-control/border-box-control-visualizer/component.d.ts.map +1 -0
  297. package/build-types/border-box-control/border-box-control-visualizer/hook.d.ts +266 -0
  298. package/build-types/border-box-control/border-box-control-visualizer/hook.d.ts.map +1 -0
  299. package/build-types/border-box-control/border-box-control-visualizer/index.d.ts +2 -0
  300. package/build-types/border-box-control/border-box-control-visualizer/index.d.ts.map +1 -0
  301. package/build-types/border-box-control/index.d.ts +4 -0
  302. package/build-types/border-box-control/index.d.ts.map +1 -0
  303. package/build-types/border-box-control/styles.d.ts +8 -0
  304. package/build-types/border-box-control/styles.d.ts.map +1 -0
  305. package/build-types/border-box-control/types.d.ts +91 -0
  306. package/build-types/border-box-control/types.d.ts.map +1 -0
  307. package/build-types/border-box-control/utils.d.ts +24 -0
  308. package/build-types/border-box-control/utils.d.ts.map +1 -0
  309. package/build-types/border-control/border-control/component.d.ts +4 -0
  310. package/build-types/border-control/border-control/component.d.ts.map +1 -0
  311. package/build-types/border-control/border-control/hook.d.ts +285 -0
  312. package/build-types/border-control/border-control/hook.d.ts.map +1 -0
  313. package/build-types/border-control/border-control/index.d.ts +3 -0
  314. package/build-types/border-control/border-control/index.d.ts.map +1 -0
  315. package/build-types/border-control/border-control-dropdown/component.d.ts +4 -0
  316. package/build-types/border-control/border-control-dropdown/component.d.ts.map +1 -0
  317. package/build-types/border-control/border-control-dropdown/hook.d.ts +280 -0
  318. package/build-types/border-control/border-control-dropdown/hook.d.ts.map +1 -0
  319. package/build-types/border-control/border-control-dropdown/index.d.ts +2 -0
  320. package/build-types/border-control/border-control-dropdown/index.d.ts.map +1 -0
  321. package/build-types/border-control/border-control-style-picker/component.d.ts +4 -0
  322. package/build-types/border-control/border-control-style-picker/component.d.ts.map +1 -0
  323. package/build-types/border-control/border-control-style-picker/hook.d.ts +269 -0
  324. package/build-types/border-control/border-control-style-picker/hook.d.ts.map +1 -0
  325. package/build-types/border-control/border-control-style-picker/index.d.ts +2 -0
  326. package/build-types/border-control/border-control-style-picker/index.d.ts.map +1 -0
  327. package/build-types/border-control/index.d.ts +3 -0
  328. package/build-types/border-control/index.d.ts.map +1 -0
  329. package/build-types/border-control/styles.d.ts +18 -0
  330. package/build-types/border-control/styles.d.ts.map +1 -0
  331. package/build-types/border-control/types.d.ts +163 -0
  332. package/build-types/border-control/types.d.ts.map +1 -0
  333. package/build-types/card/card-divider/hook.d.ts +1 -1
  334. package/build-types/card/styles.d.ts.map +1 -1
  335. package/build-types/color-indicator/index.d.ts +7 -0
  336. package/build-types/color-indicator/index.d.ts.map +1 -0
  337. package/build-types/color-palette/index.d.ts.map +1 -1
  338. package/build-types/color-picker/styles.d.ts +1 -1
  339. package/build-types/divider/stories/index.d.ts +1 -0
  340. package/build-types/divider/stories/index.d.ts.map +1 -1
  341. package/build-types/divider/styles.d.ts.map +1 -1
  342. package/build-types/divider/types.d.ts +8 -1
  343. package/build-types/divider/types.d.ts.map +1 -1
  344. package/build-types/input-control/input-field.d.ts.map +1 -1
  345. package/build-types/input-control/reducer/actions.d.ts +1 -3
  346. package/build-types/input-control/reducer/actions.d.ts.map +1 -1
  347. package/build-types/input-control/reducer/reducer.d.ts +3 -9
  348. package/build-types/input-control/reducer/reducer.d.ts.map +1 -1
  349. package/build-types/input-control/types.d.ts +2 -2
  350. package/build-types/input-control/types.d.ts.map +1 -1
  351. package/build-types/item-group/styles.d.ts.map +1 -1
  352. package/build-types/number-control/index.d.ts +3 -3
  353. package/build-types/number-control/index.d.ts.map +1 -1
  354. package/build-types/range-control/styles/range-control-styles.d.ts +1 -1
  355. package/build-types/resizable-box/resize-tooltip/styles/resize-tooltip.styles.d.ts.map +1 -1
  356. package/build-types/toggle-group-control/index.d.ts +1 -0
  357. package/build-types/toggle-group-control/index.d.ts.map +1 -1
  358. package/build-types/toggle-group-control/toggle-group-control/component.d.ts.map +1 -1
  359. package/build-types/toggle-group-control/toggle-group-control/styles.d.ts +5 -0
  360. package/build-types/toggle-group-control/toggle-group-control/styles.d.ts.map +1 -1
  361. package/build-types/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.d.ts +9 -0
  362. package/build-types/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.d.ts.map +1 -0
  363. package/build-types/toggle-group-control/toggle-group-control-option/component.d.ts +6 -2
  364. package/build-types/toggle-group-control/toggle-group-control-option/component.d.ts.map +1 -1
  365. package/build-types/toggle-group-control/toggle-group-control-option-base/component.d.ts +25 -0
  366. package/build-types/toggle-group-control/toggle-group-control-option-base/component.d.ts.map +1 -0
  367. package/build-types/toggle-group-control/toggle-group-control-option-base/index.d.ts +2 -0
  368. package/build-types/toggle-group-control/toggle-group-control-option-base/index.d.ts.map +1 -0
  369. package/build-types/toggle-group-control/{toggle-group-control-option → toggle-group-control-option-base}/styles.d.ts +0 -0
  370. package/build-types/toggle-group-control/toggle-group-control-option-base/styles.d.ts.map +1 -0
  371. package/build-types/toggle-group-control/toggle-group-control-option-icon/component.d.ts +37 -0
  372. package/build-types/toggle-group-control/toggle-group-control-option-icon/component.d.ts.map +1 -0
  373. package/build-types/toggle-group-control/toggle-group-control-option-icon/index.d.ts +2 -0
  374. package/build-types/toggle-group-control/toggle-group-control-option-icon/index.d.ts.map +1 -0
  375. package/build-types/toggle-group-control/types.d.ts +24 -8
  376. package/build-types/toggle-group-control/types.d.ts.map +1 -1
  377. package/build-types/ui/form-group/form-group.d.ts +2 -2
  378. package/build-types/unit-control/index.d.ts +12 -5
  379. package/build-types/unit-control/index.d.ts.map +1 -1
  380. package/build-types/unit-control/stories/index.d.ts +33 -0
  381. package/build-types/unit-control/stories/index.d.ts.map +1 -0
  382. package/build-types/unit-control/styles/unit-control-styles.d.ts +1 -1
  383. package/build-types/unit-control/types.d.ts +28 -7
  384. package/build-types/unit-control/types.d.ts.map +1 -1
  385. package/build-types/unit-control/unit-select-control.d.ts.map +1 -1
  386. package/build-types/utils/colors-values.d.ts +78 -18
  387. package/build-types/utils/colors-values.d.ts.map +1 -1
  388. package/build-types/utils/config-values.d.ts +71 -71
  389. package/build-types/utils/config-values.d.ts.map +1 -1
  390. package/package.json +17 -17
  391. package/src/animate/README.md +1 -1
  392. package/src/base-control/README.md +20 -12
  393. package/src/base-control/index.tsx +124 -0
  394. package/src/base-control/stories/index.tsx +80 -0
  395. package/src/base-control/styles/{base-control-styles.js → base-control-styles.ts} +23 -1
  396. package/src/base-control/types.ts +42 -0
  397. package/src/border-box-control/border-box-control/README.md +178 -0
  398. package/src/border-box-control/border-box-control/component.tsx +123 -0
  399. package/src/border-box-control/border-box-control/hook.ts +119 -0
  400. package/src/border-box-control/border-box-control/index.ts +2 -0
  401. package/src/border-box-control/border-box-control-linked-button/component.tsx +50 -0
  402. package/src/border-box-control/border-box-control-linked-button/hook.ts +30 -0
  403. package/src/border-box-control/border-box-control-linked-button/index.ts +1 -0
  404. package/src/border-box-control/border-box-control-split-controls/component.tsx +90 -0
  405. package/src/border-box-control/border-box-control-split-controls/hook.ts +34 -0
  406. package/src/border-box-control/border-box-control-split-controls/index.ts +1 -0
  407. package/src/border-box-control/border-box-control-visualizer/component.tsx +28 -0
  408. package/src/border-box-control/border-box-control-visualizer/hook.ts +30 -0
  409. package/src/border-box-control/border-box-control-visualizer/index.ts +1 -0
  410. package/src/border-box-control/index.ts +3 -0
  411. package/src/border-box-control/stories/index.js +104 -0
  412. package/src/border-box-control/styles.ts +69 -0
  413. package/src/border-box-control/test/index.js +354 -0
  414. package/src/border-box-control/test/utils.js +305 -0
  415. package/src/border-box-control/types.ts +98 -0
  416. package/src/border-box-control/utils.ts +151 -0
  417. package/src/border-control/border-control/README.md +181 -0
  418. package/src/border-control/border-control/component.tsx +112 -0
  419. package/src/border-control/border-control/hook.ts +145 -0
  420. package/src/border-control/border-control/index.ts +2 -0
  421. package/src/border-control/border-control-dropdown/component.tsx +252 -0
  422. package/src/border-control/border-control-dropdown/hook.ts +98 -0
  423. package/src/border-control/border-control-dropdown/index.ts +1 -0
  424. package/src/border-control/border-control-style-picker/component.tsx +89 -0
  425. package/src/border-control/border-control-style-picker/hook.ts +34 -0
  426. package/src/border-control/border-control-style-picker/index.ts +1 -0
  427. package/src/border-control/index.ts +2 -0
  428. package/src/border-control/stories/index.js +118 -0
  429. package/src/border-control/styles.ts +190 -0
  430. package/src/border-control/test/index.js +436 -0
  431. package/src/border-control/types.ts +173 -0
  432. package/src/box-control/all-input-control.js +2 -10
  433. package/src/box-control/axial-input-controls.js +32 -21
  434. package/src/box-control/input-controls.js +30 -19
  435. package/src/box-control/utils.js +29 -12
  436. package/src/card/styles.js +11 -5
  437. package/src/card/test/__snapshots__/index.js.snap +83 -66
  438. package/src/card/test/index.js +7 -5
  439. package/src/checkbox-control/index.js +34 -3
  440. package/src/checkbox-control/stories/index.js +44 -0
  441. package/src/checkbox-control/style.scss +4 -2
  442. package/src/color-palette/README.md +6 -0
  443. package/src/color-palette/index.js +73 -8
  444. package/src/color-palette/stories/index.js +69 -26
  445. package/src/color-palette/style.scss +11 -3
  446. package/src/color-palette/test/__snapshots__/index.js.snap +662 -12
  447. package/src/color-palette/test/index.js +1 -1
  448. package/src/custom-select-control/index.js +15 -3
  449. package/src/custom-select-control/stories/index.js +77 -74
  450. package/src/custom-select-control/style.scss +23 -4
  451. package/src/disabled/README.md +7 -10
  452. package/src/divider/stories/index.tsx +26 -23
  453. package/src/divider/styles.ts +9 -0
  454. package/src/divider/types.ts +11 -1
  455. package/src/flyout/test/__snapshots__/index.js.snap +7 -7
  456. package/src/focal-point-picker/controls.js +2 -3
  457. package/src/form-file-upload/README.md +18 -0
  458. package/src/form-file-upload/index.js +3 -0
  459. package/src/form-file-upload/test/index.js +73 -11
  460. package/src/form-toggle/README.md +1 -1
  461. package/src/index.js +8 -0
  462. package/src/input-control/input-field.tsx +23 -12
  463. package/src/input-control/reducer/actions.ts +1 -7
  464. package/src/input-control/reducer/reducer.ts +0 -29
  465. package/src/input-control/types.ts +2 -1
  466. package/src/item-group/styles.ts +1 -0
  467. package/src/item-group/test/__snapshots__/index.js.snap +11 -10
  468. package/src/mobile/picker/index.android.js +0 -1
  469. package/src/number-control/README.md +14 -0
  470. package/src/number-control/index.js +13 -12
  471. package/src/number-control/stories/index.js +14 -7
  472. package/src/number-control/test/index.js +79 -1
  473. package/src/range-control/stories/index.js +91 -119
  474. package/src/resizable-box/resize-tooltip/styles/resize-tooltip.styles.js +1 -0
  475. package/src/surface/styles.js +1 -1
  476. package/src/surface/test/__snapshots__/index.js.snap +11 -11
  477. package/src/toggle-group-control/index.ts +1 -0
  478. package/src/toggle-group-control/stories/index.js +37 -7
  479. package/src/toggle-group-control/test/__snapshots__/index.js.snap +269 -5
  480. package/src/toggle-group-control/test/index.js +43 -10
  481. package/src/toggle-group-control/toggle-group-control/component.tsx +10 -0
  482. package/src/toggle-group-control/toggle-group-control/styles.ts +14 -0
  483. package/src/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.tsx +86 -0
  484. package/src/toggle-group-control/toggle-group-control-option/README.md +8 -5
  485. package/src/toggle-group-control/toggle-group-control-option/component.tsx +18 -94
  486. package/src/toggle-group-control/toggle-group-control-option-base/README.md +27 -0
  487. package/src/toggle-group-control/toggle-group-control-option-base/component.tsx +129 -0
  488. package/src/toggle-group-control/toggle-group-control-option-base/index.ts +1 -0
  489. package/src/toggle-group-control/{toggle-group-control-option → toggle-group-control-option-base}/styles.ts +4 -1
  490. package/src/toggle-group-control/toggle-group-control-option-icon/README.md +56 -0
  491. package/src/toggle-group-control/toggle-group-control-option-icon/component.tsx +56 -0
  492. package/src/toggle-group-control/toggle-group-control-option-icon/index.ts +1 -0
  493. package/src/toggle-group-control/types.ts +33 -8
  494. package/src/toolbar-dropdown-menu/index.js +1 -1
  495. package/src/toolbar-group/style.scss +0 -73
  496. package/src/tools-panel/test/__snapshots__/index.js.snap +8 -8
  497. package/src/unit-control/README.md +7 -3
  498. package/src/unit-control/index.tsx +65 -31
  499. package/src/unit-control/stories/index.tsx +170 -0
  500. package/src/unit-control/test/index.js +263 -100
  501. package/src/unit-control/types.ts +65 -42
  502. package/src/unit-control/unit-select-control.tsx +2 -3
  503. package/src/utils/colors-values.js +4 -3
  504. package/src/utils/config-values.js +9 -4
  505. package/tsconfig.json +3 -0
  506. package/tsconfig.tsbuildinfo +1 -1
  507. package/build/toggle-group-control/toggle-group-control-option/styles.js +0 -66
  508. package/build/toggle-group-control/toggle-group-control-option/styles.js.map +0 -1
  509. package/build-module/toggle-group-control/toggle-group-control-option/styles.js +0 -55
  510. package/build-module/toggle-group-control/toggle-group-control-option/styles.js.map +0 -1
  511. package/build-types/toggle-group-control/toggle-group-control-option/styles.d.ts.map +0 -1
  512. package/src/base-control/index.js +0 -111
  513. package/src/base-control/stories/index.js +0 -81
  514. package/src/unit-control/stories/index.js +0 -127
@@ -17,7 +17,6 @@ import type {
17
17
  * WordPress dependencies
18
18
  */
19
19
  import { forwardRef, useRef } from '@wordpress/element';
20
- import { UP, DOWN, ENTER, ESCAPE } from '@wordpress/keycodes';
21
20
  /**
22
21
  * Internal dependencies
23
22
  */
@@ -68,7 +67,6 @@ function InputField(
68
67
  pressEnter,
69
68
  pressUp,
70
69
  reset,
71
- update,
72
70
  } = useInputControlStateReducer( stateReducer, {
73
71
  isDragEnabled,
74
72
  value: valueProp,
@@ -92,10 +90,12 @@ function InputField(
92
90
  return;
93
91
  }
94
92
  if ( ! isFocused && ! wasDirtyOnBlur.current ) {
95
- update( valueProp, _event as SyntheticEvent );
93
+ commit( valueProp, _event as SyntheticEvent );
96
94
  } else if ( ! isDirty ) {
97
95
  onChange( value, {
98
- event: _event as ChangeEvent< HTMLInputElement >,
96
+ event: _event as
97
+ | ChangeEvent< HTMLInputElement >
98
+ | PointerEvent< HTMLInputElement >,
99
99
  } );
100
100
  wasDirtyOnBlur.current = false;
101
101
  }
@@ -109,7 +109,7 @@ function InputField(
109
109
  * If isPressEnterToChange is set, this commits the value to
110
110
  * the onChange callback.
111
111
  */
112
- if ( isPressEnterToChange && isDirty ) {
112
+ if ( isDirty || ! event.target.validity.valid ) {
113
113
  wasDirtyOnBlur.current = true;
114
114
  handleOnCommit( event );
115
115
  }
@@ -137,19 +137,19 @@ function InputField(
137
137
  };
138
138
 
139
139
  const handleOnKeyDown = ( event: KeyboardEvent< HTMLInputElement > ) => {
140
- const { keyCode } = event;
140
+ const { key } = event;
141
141
  onKeyDown( event );
142
142
 
143
- switch ( keyCode ) {
144
- case UP:
143
+ switch ( key ) {
144
+ case 'ArrowUp':
145
145
  pressUp( event );
146
146
  break;
147
147
 
148
- case DOWN:
148
+ case 'ArrowDown':
149
149
  pressDown( event );
150
150
  break;
151
151
 
152
- case ENTER:
152
+ case 'Enter':
153
153
  pressEnter( event );
154
154
 
155
155
  if ( isPressEnterToChange ) {
@@ -158,7 +158,7 @@ function InputField(
158
158
  }
159
159
  break;
160
160
 
161
- case ESCAPE:
161
+ case 'Escape':
162
162
  if ( isPressEnterToChange && isDirty ) {
163
163
  event.preventDefault();
164
164
  reset( valueProp, event );
@@ -169,7 +169,18 @@ function InputField(
169
169
 
170
170
  const dragGestureProps = useDrag< PointerEvent< HTMLInputElement > >(
171
171
  ( dragProps ) => {
172
- const { distance, dragging, event } = dragProps;
172
+ const { distance, dragging, event, target } = dragProps;
173
+
174
+ // The `target` prop always references the `input` element while, by
175
+ // default, the `dragProps.event.target` property would reference the real
176
+ // event target (i.e. any DOM element that the pointer is hovering while
177
+ // dragging). Ensuring that the `target` is always the `input` element
178
+ // allows consumers of `InputControl` (or any higher-level control) to
179
+ // check the input's validity by accessing `event.target.validity.valid`.
180
+ dragProps.event = {
181
+ ...dragProps.event,
182
+ target,
183
+ };
173
184
 
174
185
  if ( ! distance ) return;
175
186
  event.stopPropagation();
@@ -18,7 +18,6 @@ export const PRESS_DOWN = 'PRESS_DOWN';
18
18
  export const PRESS_ENTER = 'PRESS_ENTER';
19
19
  export const PRESS_UP = 'PRESS_UP';
20
20
  export const RESET = 'RESET';
21
- export const UPDATE = 'UPDATE';
22
21
 
23
22
  interface EventPayload {
24
23
  event?: SyntheticEvent;
@@ -42,14 +41,9 @@ export type DragStartAction = Action< typeof DRAG_START, DragProps >;
42
41
  export type DragEndAction = Action< typeof DRAG_END, DragProps >;
43
42
  export type DragAction = Action< typeof DRAG, DragProps >;
44
43
  export type ResetAction = Action< typeof RESET, Partial< ValuePayload > >;
45
- export type UpdateAction = Action< typeof UPDATE, ValuePayload >;
46
44
  export type InvalidateAction = Action< typeof INVALIDATE, { error: unknown } >;
47
45
 
48
- export type ChangeEventAction =
49
- | ChangeAction
50
- | ResetAction
51
- | CommitAction
52
- | UpdateAction;
46
+ export type ChangeEventAction = ChangeAction | ResetAction | CommitAction;
53
47
 
54
48
  export type DragEventAction = DragStartAction | DragEndAction | DragAction;
55
49
 
@@ -1,7 +1,6 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { isEmpty } from 'lodash';
5
4
  import type { SyntheticEvent } from 'react';
6
5
 
7
6
  /**
@@ -38,27 +37,6 @@ function mergeInitialState(
38
37
  } as InputState;
39
38
  }
40
39
 
41
- /**
42
- * Composes multiple stateReducers into a single stateReducer, building
43
- * the pipeline to control the flow for state and actions.
44
- *
45
- * @param fns State reducers.
46
- * @return The single composed stateReducer.
47
- */
48
- export const composeStateReducers = (
49
- ...fns: StateReducer[]
50
- ): StateReducer => {
51
- return ( ...args ) => {
52
- return fns.reduceRight( ( state, fn ) => {
53
- // TODO: Assess whether this can be replaced with a more standard `compose` implementation
54
- // like wp.data.compose() (aka lodash flowRight) or Redux compose().
55
- // The current implementation only works by functions mutating the original state object.
56
- const fnState = fn( ...args );
57
- return isEmpty( fnState ) ? state : { ...state, ...fnState };
58
- }, {} as InputState );
59
- };
60
- };
61
-
62
40
  /**
63
41
  * Creates a reducer that opens the channel for external state subscription
64
42
  * and modification.
@@ -122,11 +100,6 @@ function inputControlStateReducer(
122
100
  nextState.value = action.payload.value || state.initialValue;
123
101
  break;
124
102
 
125
- case actions.UPDATE:
126
- nextState.value = action.payload.value;
127
- nextState.isDirty = false;
128
- break;
129
-
130
103
  /**
131
104
  * Validation
132
105
  */
@@ -219,7 +192,6 @@ export function useInputControlStateReducer(
219
192
  dispatch( { type: actions.INVALIDATE, payload: { error, event } } );
220
193
  const reset = createChangeEvent( actions.RESET );
221
194
  const commit = createChangeEvent( actions.COMMIT );
222
- const update = createChangeEvent( actions.UPDATE );
223
195
 
224
196
  const dragStart = createDragEvent( actions.DRAG_START );
225
197
  const drag = createDragEvent( actions.DRAG );
@@ -242,6 +214,5 @@ export function useInputControlStateReducer(
242
214
  pressUp,
243
215
  reset,
244
216
  state,
245
- update,
246
217
  } as const;
247
218
  }
@@ -6,6 +6,7 @@ import type {
6
6
  ReactNode,
7
7
  ChangeEvent,
8
8
  SyntheticEvent,
9
+ PointerEvent,
9
10
  } from 'react';
10
11
  import type { useDrag } from '@use-gesture/react';
11
12
 
@@ -33,7 +34,7 @@ interface BaseProps {
33
34
  }
34
35
 
35
36
  export type InputChangeCallback<
36
- E = ChangeEvent< HTMLInputElement >,
37
+ E = ChangeEvent< HTMLInputElement > | PointerEvent< HTMLInputElement >,
37
38
  P = {}
38
39
  > = ( nextValue: string | undefined, extra: { event: E } & P ) => void;
39
40
 
@@ -36,6 +36,7 @@ export const item = css`
36
36
  width: 100%;
37
37
  display: block;
38
38
  margin: 0;
39
+ color: inherit;
39
40
  `;
40
41
 
41
42
  export const bordered = css`
@@ -11,8 +11,8 @@ Snapshot Diff:
11
11
  role="listitem"
12
12
  >
13
13
  <div
14
- - class="components-item css-2fnxcf-View-medium-item-spacedAround em57xhy0"
15
- + class="components-item css-346xw3-View-large-item-spacedAround em57xhy0"
14
+ - class="components-item css-1uo9kmu-View-medium-item-spacedAround em57xhy0"
15
+ + class="components-item css-10mizr-View-large-item-spacedAround em57xhy0"
16
16
  data-wp-c16t="true"
17
17
  data-wp-component="Item"
18
18
  >
@@ -24,8 +24,8 @@ Snapshot Diff:
24
24
  role="listitem"
25
25
  >
26
26
  <div
27
- - class="components-item css-2fnxcf-View-medium-item-spacedAround em57xhy0"
28
- + class="components-item css-346xw3-View-large-item-spacedAround em57xhy0"
27
+ - class="components-item css-1uo9kmu-View-medium-item-spacedAround em57xhy0"
28
+ + class="components-item css-10mizr-View-large-item-spacedAround em57xhy0"
29
29
  data-wp-c16t="true"
30
30
  data-wp-component="Item"
31
31
  >
@@ -44,8 +44,8 @@ Snapshot Diff:
44
44
  role="listitem"
45
45
  >
46
46
  <div
47
- - class="components-item css-4qcpca-View-medium-item em57xhy0"
48
- + class="components-item css-132y1d5-View-large-item em57xhy0"
47
+ - class="components-item css-bsdqin-View-medium-item em57xhy0"
48
+ + class="components-item css-1ohjtsa-View-large-item em57xhy0"
49
49
  data-wp-c16t="true"
50
50
  data-wp-component="Item"
51
51
  >
@@ -78,6 +78,7 @@ exports[`ItemGroup ItemGroup component should render correctly 1`] = `
78
78
  width: 100%;
79
79
  display: block;
80
80
  margin: 0;
81
+ color: inherit;
81
82
  border-radius: 2px;
82
83
  }
83
84
 
@@ -120,8 +121,8 @@ Snapshot Diff:
120
121
  role="listitem"
121
122
  >
122
123
  <div
123
- - class="components-item css-2fnxcf-View-medium-item-spacedAround em57xhy0"
124
- + class="components-item css-4qcpca-View-medium-item em57xhy0"
124
+ - class="components-item css-1uo9kmu-View-medium-item-spacedAround em57xhy0"
125
+ + class="components-item css-bsdqin-View-medium-item em57xhy0"
125
126
  data-wp-c16t="true"
126
127
  data-wp-component="Item"
127
128
  >
@@ -147,8 +148,8 @@ Snapshot Diff:
147
148
  role="listitem"
148
149
  >
149
150
  <div
150
- - class="components-item css-2fnxcf-View-medium-item-spacedAround em57xhy0"
151
- + class="components-item css-4qcpca-View-medium-item em57xhy0"
151
+ - class="components-item css-1uo9kmu-View-medium-item-spacedAround em57xhy0"
152
+ + class="components-item css-bsdqin-View-medium-item em57xhy0"
152
153
  data-wp-c16t="true"
153
154
  data-wp-component="Item"
154
155
  >
@@ -78,7 +78,6 @@ export default class Picker extends Component {
78
78
  <BottomSheet
79
79
  isVisible={ isVisible }
80
80
  onClose={ this.onClose }
81
- style={ { paddingBottom: 20 } }
82
81
  hideHeader
83
82
  testID={ testID }
84
83
  >
@@ -97,6 +97,20 @@ The minimum `value` allowed.
97
97
  - Required: No
98
98
  - Default: `-Infinity`
99
99
 
100
+ ### onChange
101
+
102
+ Callback fired whenever the value of the input changes.
103
+
104
+ The callback receives two arguments:
105
+
106
+ 1. `newValue`: the new value of the input
107
+ 2. `extra`: an object containing, under the `event` key, the original browser event.
108
+
109
+ Note that the value received as the first argument of the callback is _not_ guaranteed to be a valid value (e.g. it could be outside of the range defined by the [`min`, `max`] props, or it could not match the `step`). In order to check the value's validity, check the `event.target?.validity.valid` property from the callback's second argument.
110
+
111
+ - Type: `(newValue, extra) => void`
112
+ - Required: No
113
+
100
114
  ### required
101
115
 
102
116
  If `true` enforces a valid number within the control's min/max range. If `false` allows an empty string as a valid value.
@@ -15,13 +15,12 @@ import { isRTL } from '@wordpress/i18n';
15
15
  */
16
16
  import { Input } from './styles/number-control-styles';
17
17
  import * as inputControlActionTypes from '../input-control/reducer/actions';
18
- import { composeStateReducers } from '../input-control/reducer/reducer';
19
18
  import { add, subtract, roundClamp } from '../utils/math';
20
19
  import { isValueEmpty } from '../utils/values';
21
20
 
22
21
  export function NumberControl(
23
22
  {
24
- __unstableStateReducer: stateReducer = ( state ) => state,
23
+ __unstableStateReducer: stateReducerProp,
25
24
  className,
26
25
  dragDirection = 'n',
27
26
  hideHTMLArrows = false,
@@ -62,9 +61,11 @@ export function NumberControl(
62
61
  * @return {Object} The updated state to apply to InputControl
63
62
  */
64
63
  const numberControlStateReducer = ( state, action ) => {
64
+ const nextState = { ...state };
65
+
65
66
  const { type, payload } = action;
66
67
  const event = payload?.event;
67
- const currentValue = state.value;
68
+ const currentValue = nextState.value;
68
69
 
69
70
  /**
70
71
  * Handles custom UP and DOWN Keyboard events
@@ -94,7 +95,7 @@ export function NumberControl(
94
95
  nextValue = subtract( nextValue, incrementalValue );
95
96
  }
96
97
 
97
- state.value = constrainValue(
98
+ nextState.value = constrainValue(
98
99
  nextValue,
99
100
  enableShift ? incrementalValue : null
100
101
  );
@@ -139,7 +140,7 @@ export function NumberControl(
139
140
  delta = Math.ceil( Math.abs( delta ) ) * Math.sign( delta );
140
141
  const distance = delta * modifier * directionModifier;
141
142
 
142
- state.value = constrainValue(
143
+ nextState.value = constrainValue(
143
144
  add( currentValue, distance ),
144
145
  enableShift ? modifier : null
145
146
  );
@@ -147,7 +148,7 @@ export function NumberControl(
147
148
  }
148
149
 
149
150
  /**
150
- * Handles commit (ENTER key press or on blur if isPressEnterToChange)
151
+ * Handles commit (ENTER key press or blur)
151
152
  */
152
153
  if (
153
154
  type === inputControlActionTypes.PRESS_ENTER ||
@@ -155,12 +156,12 @@ export function NumberControl(
155
156
  ) {
156
157
  const applyEmptyValue = required === false && currentValue === '';
157
158
 
158
- state.value = applyEmptyValue
159
+ nextState.value = applyEmptyValue
159
160
  ? currentValue
160
161
  : constrainValue( currentValue );
161
162
  }
162
163
 
163
- return state;
164
+ return nextState;
164
165
  };
165
166
 
166
167
  return (
@@ -180,10 +181,10 @@ export function NumberControl(
180
181
  step={ step }
181
182
  type={ typeProp }
182
183
  value={ valueProp }
183
- __unstableStateReducer={ composeStateReducers(
184
- numberControlStateReducer,
185
- stateReducer
186
- ) }
184
+ __unstableStateReducer={ ( state, action ) => {
185
+ const baseState = numberControlStateReducer( state, action );
186
+ return stateReducerProp?.( baseState, action ) ?? baseState;
187
+ } }
187
188
  />
188
189
  );
189
190
  }
@@ -23,6 +23,7 @@ export default {
23
23
 
24
24
  function Example() {
25
25
  const [ value, setValue ] = useState( '0' );
26
+ const [ isValidValue, setIsValidValue ] = useState( true );
26
27
 
27
28
  const props = {
28
29
  disabled: boolean( 'disabled', false ),
@@ -32,18 +33,24 @@ function Example() {
32
33
  label: text( 'label', 'Number' ),
33
34
  min: number( 'min', 0 ),
34
35
  max: number( 'max', 100 ),
35
- placeholder: text( 'placeholder', 0 ),
36
+ placeholder: text( 'placeholder', '0' ),
36
37
  required: boolean( 'required', false ),
37
38
  shiftStep: number( 'shiftStep', 10 ),
38
- step: text( 'step', 1 ),
39
+ step: text( 'step', '1' ),
39
40
  };
40
41
 
41
42
  return (
42
- <NumberControl
43
- { ...props }
44
- value={ value }
45
- onChange={ ( v ) => setValue( v ) }
46
- />
43
+ <>
44
+ <NumberControl
45
+ { ...props }
46
+ value={ value }
47
+ onChange={ ( v, extra ) => {
48
+ setValue( v );
49
+ setIsValidValue( extra.event.target.validity.valid );
50
+ } }
51
+ />
52
+ <p>Is valid? { isValidValue ? 'Yes' : 'No' }</p>
53
+ </>
47
54
  );
48
55
  }
49
56
 
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { render, screen, fireEvent } from '@testing-library/react';
4
+ import { render, screen, fireEvent, waitFor } from '@testing-library/react';
5
5
 
6
6
  /**
7
7
  * WordPress dependencies
@@ -63,6 +63,68 @@ describe( 'NumberControl', () => {
63
63
 
64
64
  expect( spy ).toHaveBeenCalledWith( '10' );
65
65
  } );
66
+
67
+ it( 'should call onChange callback when value is clamped on blur', async () => {
68
+ const spy = jest.fn();
69
+ render(
70
+ <NumberControl
71
+ value={ 5 }
72
+ min={ 4 }
73
+ max={ 10 }
74
+ onChange={ ( v ) => spy( v ) }
75
+ />
76
+ );
77
+
78
+ const input = getInput();
79
+ input.focus();
80
+ fireEvent.change( input, { target: { value: 1 } } );
81
+
82
+ // Before blurring, the value is still un-clamped
83
+ expect( input.value ).toBe( '1' );
84
+
85
+ input.blur();
86
+
87
+ // After blur, value is clamped
88
+ expect( input.value ).toBe( '4' );
89
+
90
+ // After the blur, the `onChange` callback fires asynchronously.
91
+ await waitFor( () => {
92
+ expect( spy ).toHaveBeenCalledTimes( 2 );
93
+ expect( spy ).toHaveBeenNthCalledWith( 1, '1' );
94
+ expect( spy ).toHaveBeenNthCalledWith( 2, 4 );
95
+ } );
96
+ } );
97
+
98
+ it( 'should call onChange callback when value is not valid', () => {
99
+ const spy = jest.fn();
100
+ render(
101
+ <NumberControl
102
+ value={ 5 }
103
+ min={ 1 }
104
+ max={ 10 }
105
+ onChange={ ( v, extra ) =>
106
+ spy( v, extra.event.target.validity.valid )
107
+ }
108
+ />
109
+ );
110
+
111
+ const input = getInput();
112
+ input.focus();
113
+ fireEvent.change( input, { target: { value: 14 } } );
114
+
115
+ expect( input.value ).toBe( '14' );
116
+
117
+ fireKeyDown( { keyCode: ENTER } );
118
+
119
+ expect( input.value ).toBe( '10' );
120
+
121
+ expect( spy ).toHaveBeenCalledTimes( 2 );
122
+
123
+ // First call: invalid, unclamped value
124
+ expect( spy ).toHaveBeenNthCalledWith( 1, '14', false );
125
+ // Second call: valid, clamped value
126
+ expect( spy ).toHaveBeenNthCalledWith( 2, 10, true );
127
+ } );
66
128
  } );
67
129
 
68
130
  describe( 'Validation', () => {
@@ -82,6 +144,22 @@ describe( 'NumberControl', () => {
82
144
  expect( input.value ).toBe( '0' );
83
145
  } );
84
146
 
147
+ it( 'should clamp value within range on blur', () => {
148
+ render( <NumberControl value={ 5 } min={ 0 } max={ 10 } /> );
149
+
150
+ const input = getInput();
151
+ input.focus();
152
+ fireEvent.change( input, { target: { value: 41 } } );
153
+
154
+ // Before blurring, the value is still un-clamped
155
+ expect( input.value ).toBe( '41' );
156
+
157
+ input.blur();
158
+
159
+ // After blur, value is clamped
160
+ expect( input.value ).toBe( '10' );
161
+ } );
162
+
85
163
  it( 'should parse to number value on ENTER keypress when required', () => {
86
164
  render( <NumberControl value={ 5 } required={ true } /> );
87
165