@wordpress/components 19.7.0 → 19.8.2

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 (420) hide show
  1. package/CHANGELOG.md +27 -1
  2. package/README.md +38 -0
  3. package/build/base-control/index.js +35 -31
  4. package/build/base-control/index.js.map +1 -1
  5. package/build/base-control/styles/base-control-styles.js +18 -18
  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/card/styles.js +22 -17
  66. package/build/card/styles.js.map +1 -1
  67. package/build/custom-select-control/index.js +4 -1
  68. package/build/custom-select-control/index.js.map +1 -1
  69. package/build/guide/index.js +14 -8
  70. package/build/guide/index.js.map +1 -1
  71. package/build/index.js +40 -0
  72. package/build/index.js.map +1 -1
  73. package/build/item-group/styles.js +14 -14
  74. package/build/item-group/styles.js.map +1 -1
  75. package/build/mobile/picker/index.android.js +0 -3
  76. package/build/mobile/picker/index.android.js.map +1 -1
  77. package/build/palette-edit/index.js +2 -1
  78. package/build/palette-edit/index.js.map +1 -1
  79. package/build/surface/styles.js +8 -8
  80. package/build/surface/styles.js.map +1 -1
  81. package/build/toggle-group-control/index.js +8 -0
  82. package/build/toggle-group-control/index.js.map +1 -1
  83. package/build/toggle-group-control/toggle-group-control/component.js +10 -1
  84. package/build/toggle-group-control/toggle-group-control/component.js.map +1 -1
  85. package/build/toggle-group-control/toggle-group-control/styles.js +14 -3
  86. package/build/toggle-group-control/toggle-group-control/styles.js.map +1 -1
  87. package/build/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.js +90 -0
  88. package/build/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.js.map +1 -0
  89. package/build/toggle-group-control/toggle-group-control-option/component.js +9 -87
  90. package/build/toggle-group-control/toggle-group-control-option/component.js.map +1 -1
  91. package/build/toggle-group-control/toggle-group-control-option-base/component.js +127 -0
  92. package/build/toggle-group-control/toggle-group-control-option-base/component.js.map +1 -0
  93. package/build/toggle-group-control/toggle-group-control-option-base/index.js +16 -0
  94. package/build/toggle-group-control/toggle-group-control-option-base/index.js.map +1 -0
  95. package/build/toggle-group-control/toggle-group-control-option-base/styles.js +66 -0
  96. package/build/toggle-group-control/toggle-group-control-option-base/styles.js.map +1 -0
  97. package/build/toggle-group-control/toggle-group-control-option-icon/component.js +55 -0
  98. package/build/toggle-group-control/toggle-group-control-option-icon/component.js.map +1 -0
  99. package/build/toggle-group-control/toggle-group-control-option-icon/index.js +16 -0
  100. package/build/toggle-group-control/toggle-group-control-option-icon/index.js.map +1 -0
  101. package/build/toolbar-dropdown-menu/index.js +1 -1
  102. package/build/toolbar-dropdown-menu/index.js.map +1 -1
  103. package/build/unit-control/index.js +7 -2
  104. package/build/unit-control/index.js.map +1 -1
  105. package/build/utils/colors-values.js +5 -3
  106. package/build/utils/colors-values.js.map +1 -1
  107. package/build/utils/config-values.js +9 -4
  108. package/build/utils/config-values.js.map +1 -1
  109. package/build-module/base-control/index.js +33 -34
  110. package/build-module/base-control/index.js.map +1 -1
  111. package/build-module/base-control/styles/base-control-styles.js +18 -18
  112. package/build-module/base-control/styles/base-control-styles.js.map +1 -1
  113. package/build-module/base-control/types.js +2 -0
  114. package/build-module/base-control/types.js.map +1 -0
  115. package/build-module/border-box-control/border-box-control/component.js +104 -0
  116. package/build-module/border-box-control/border-box-control/component.js.map +1 -0
  117. package/build-module/border-box-control/border-box-control/hook.js +97 -0
  118. package/build-module/border-box-control/border-box-control/hook.js.map +1 -0
  119. package/build-module/border-box-control/border-box-control/index.js +3 -0
  120. package/build-module/border-box-control/border-box-control/index.js.map +1 -0
  121. package/build-module/border-box-control/border-box-control-linked-button/component.js +42 -0
  122. package/build-module/border-box-control/border-box-control-linked-button/component.js.map +1 -0
  123. package/build-module/border-box-control/border-box-control-linked-button/hook.js +26 -0
  124. package/build-module/border-box-control/border-box-control-linked-button/hook.js.map +1 -0
  125. package/build-module/border-box-control/border-box-control-linked-button/index.js +2 -0
  126. package/build-module/border-box-control/border-box-control-linked-button/index.js.map +1 -0
  127. package/build-module/border-box-control/border-box-control-split-controls/component.js +77 -0
  128. package/build-module/border-box-control/border-box-control-split-controls/component.js.map +1 -0
  129. package/build-module/border-box-control/border-box-control-split-controls/hook.js +30 -0
  130. package/build-module/border-box-control/border-box-control-split-controls/hook.js.map +1 -0
  131. package/build-module/border-box-control/border-box-control-split-controls/index.js +2 -0
  132. package/build-module/border-box-control/border-box-control-split-controls/index.js.map +1 -0
  133. package/build-module/border-box-control/border-box-control-visualizer/component.js +27 -0
  134. package/build-module/border-box-control/border-box-control-visualizer/component.js.map +1 -0
  135. package/build-module/border-box-control/border-box-control-visualizer/hook.js +28 -0
  136. package/build-module/border-box-control/border-box-control-visualizer/hook.js.map +1 -0
  137. package/build-module/border-box-control/border-box-control-visualizer/index.js +2 -0
  138. package/build-module/border-box-control/border-box-control-visualizer/index.js.map +1 -0
  139. package/build-module/border-box-control/index.js +4 -0
  140. package/build-module/border-box-control/index.js.map +1 -0
  141. package/build-module/border-box-control/styles.js +66 -0
  142. package/build-module/border-box-control/styles.js.map +1 -0
  143. package/build-module/border-box-control/types.js +2 -0
  144. package/build-module/border-box-control/types.js.map +1 -0
  145. package/build-module/border-box-control/utils.js +127 -0
  146. package/build-module/border-box-control/utils.js.map +1 -0
  147. package/build-module/border-control/border-control/component.js +100 -0
  148. package/build-module/border-control/border-control/component.js.map +1 -0
  149. package/build-module/border-control/border-control/hook.js +115 -0
  150. package/build-module/border-control/border-control/hook.js.map +1 -0
  151. package/build-module/border-control/border-control/index.js +3 -0
  152. package/build-module/border-control/border-control/index.js.map +1 -0
  153. package/build-module/border-control/border-control-dropdown/component.js +174 -0
  154. package/build-module/border-control/border-control-dropdown/component.js.map +1 -0
  155. package/build-module/border-control/border-control-dropdown/hook.js +89 -0
  156. package/build-module/border-control/border-control-dropdown/hook.js.map +1 -0
  157. package/build-module/border-control/border-control-dropdown/index.js +2 -0
  158. package/build-module/border-control/border-control-dropdown/index.js.map +1 -0
  159. package/build-module/border-control/border-control-style-picker/component.js +81 -0
  160. package/build-module/border-control/border-control-style-picker/component.js.map +1 -0
  161. package/build-module/border-control/border-control-style-picker/hook.js +30 -0
  162. package/build-module/border-control/border-control-style-picker/hook.js.map +1 -0
  163. package/build-module/border-control/border-control-style-picker/index.js +2 -0
  164. package/build-module/border-control/border-control-style-picker/index.js.map +1 -0
  165. package/build-module/border-control/index.js +3 -0
  166. package/build-module/border-control/index.js.map +1 -0
  167. package/build-module/border-control/styles.js +90 -0
  168. package/build-module/border-control/styles.js.map +1 -0
  169. package/build-module/border-control/types.js +2 -0
  170. package/build-module/border-control/types.js.map +1 -0
  171. package/build-module/card/styles.js +23 -18
  172. package/build-module/card/styles.js.map +1 -1
  173. package/build-module/custom-select-control/index.js +4 -1
  174. package/build-module/custom-select-control/index.js.map +1 -1
  175. package/build-module/guide/index.js +14 -8
  176. package/build-module/guide/index.js.map +1 -1
  177. package/build-module/index.js +3 -1
  178. package/build-module/index.js.map +1 -1
  179. package/build-module/item-group/styles.js +14 -14
  180. package/build-module/item-group/styles.js.map +1 -1
  181. package/build-module/mobile/picker/index.android.js +0 -3
  182. package/build-module/mobile/picker/index.android.js.map +1 -1
  183. package/build-module/palette-edit/index.js +3 -2
  184. package/build-module/palette-edit/index.js.map +1 -1
  185. package/build-module/surface/styles.js +8 -8
  186. package/build-module/surface/styles.js.map +1 -1
  187. package/build-module/toggle-group-control/index.js +1 -0
  188. package/build-module/toggle-group-control/index.js.map +1 -1
  189. package/build-module/toggle-group-control/toggle-group-control/component.js +8 -1
  190. package/build-module/toggle-group-control/toggle-group-control/component.js.map +1 -1
  191. package/build-module/toggle-group-control/toggle-group-control/styles.js +11 -3
  192. package/build-module/toggle-group-control/toggle-group-control/styles.js.map +1 -1
  193. package/build-module/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.js +86 -0
  194. package/build-module/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.js.map +1 -0
  195. package/build-module/toggle-group-control/toggle-group-control-option/component.js +9 -76
  196. package/build-module/toggle-group-control/toggle-group-control-option/component.js.map +1 -1
  197. package/build-module/toggle-group-control/toggle-group-control-option-base/component.js +105 -0
  198. package/build-module/toggle-group-control/toggle-group-control-option-base/component.js.map +1 -0
  199. package/build-module/toggle-group-control/toggle-group-control-option-base/index.js +2 -0
  200. package/build-module/toggle-group-control/toggle-group-control-option-base/index.js.map +1 -0
  201. package/build-module/toggle-group-control/toggle-group-control-option-base/styles.js +55 -0
  202. package/build-module/toggle-group-control/toggle-group-control-option-base/styles.js.map +1 -0
  203. package/build-module/toggle-group-control/toggle-group-control-option-icon/component.js +50 -0
  204. package/build-module/toggle-group-control/toggle-group-control-option-icon/component.js.map +1 -0
  205. package/build-module/toggle-group-control/toggle-group-control-option-icon/index.js +2 -0
  206. package/build-module/toggle-group-control/toggle-group-control-option-icon/index.js.map +1 -0
  207. package/build-module/toolbar-dropdown-menu/index.js +1 -1
  208. package/build-module/toolbar-dropdown-menu/index.js.map +1 -1
  209. package/build-module/unit-control/index.js +7 -2
  210. package/build-module/unit-control/index.js.map +1 -1
  211. package/build-module/utils/colors-values.js +5 -3
  212. package/build-module/utils/colors-values.js.map +1 -1
  213. package/build-module/utils/config-values.js +8 -4
  214. package/build-module/utils/config-values.js.map +1 -1
  215. package/build-style/style-rtl.css +4 -4
  216. package/build-style/style.css +4 -4
  217. package/build-types/base-control/index.d.ts +35 -76
  218. package/build-types/base-control/index.d.ts.map +1 -1
  219. package/build-types/base-control/stories/index.d.ts +25 -0
  220. package/build-types/base-control/stories/index.d.ts.map +1 -0
  221. package/build-types/base-control/styles/base-control-styles.d.ts +6 -5
  222. package/build-types/base-control/styles/base-control-styles.d.ts.map +1 -1
  223. package/build-types/base-control/types.d.ts +41 -0
  224. package/build-types/base-control/types.d.ts.map +1 -0
  225. package/build-types/border-box-control/border-box-control/component.d.ts +4 -0
  226. package/build-types/border-box-control/border-box-control/component.d.ts.map +1 -0
  227. package/build-types/border-box-control/border-box-control/hook.d.ts +282 -0
  228. package/build-types/border-box-control/border-box-control/hook.d.ts.map +1 -0
  229. package/build-types/border-box-control/border-box-control/index.d.ts +3 -0
  230. package/build-types/border-box-control/border-box-control/index.d.ts.map +1 -0
  231. package/build-types/border-box-control/border-box-control-linked-button/component.d.ts +4 -0
  232. package/build-types/border-box-control/border-box-control-linked-button/component.d.ts.map +1 -0
  233. package/build-types/border-box-control/border-box-control-linked-button/hook.d.ts +266 -0
  234. package/build-types/border-box-control/border-box-control-linked-button/hook.d.ts.map +1 -0
  235. package/build-types/border-box-control/border-box-control-linked-button/index.d.ts +2 -0
  236. package/build-types/border-box-control/border-box-control-linked-button/index.d.ts.map +1 -0
  237. package/build-types/border-box-control/border-box-control-split-controls/component.d.ts +4 -0
  238. package/build-types/border-box-control/border-box-control-split-controls/component.d.ts.map +1 -0
  239. package/build-types/border-box-control/border-box-control-split-controls/hook.d.ts +274 -0
  240. package/build-types/border-box-control/border-box-control-split-controls/hook.d.ts.map +1 -0
  241. package/build-types/border-box-control/border-box-control-split-controls/index.d.ts +2 -0
  242. package/build-types/border-box-control/border-box-control-split-controls/index.d.ts.map +1 -0
  243. package/build-types/border-box-control/border-box-control-visualizer/component.d.ts +4 -0
  244. package/build-types/border-box-control/border-box-control-visualizer/component.d.ts.map +1 -0
  245. package/build-types/border-box-control/border-box-control-visualizer/hook.d.ts +266 -0
  246. package/build-types/border-box-control/border-box-control-visualizer/hook.d.ts.map +1 -0
  247. package/build-types/border-box-control/border-box-control-visualizer/index.d.ts +2 -0
  248. package/build-types/border-box-control/border-box-control-visualizer/index.d.ts.map +1 -0
  249. package/build-types/border-box-control/index.d.ts +4 -0
  250. package/build-types/border-box-control/index.d.ts.map +1 -0
  251. package/build-types/border-box-control/styles.d.ts +8 -0
  252. package/build-types/border-box-control/styles.d.ts.map +1 -0
  253. package/build-types/border-box-control/types.d.ts +91 -0
  254. package/build-types/border-box-control/types.d.ts.map +1 -0
  255. package/build-types/border-box-control/utils.d.ts +24 -0
  256. package/build-types/border-box-control/utils.d.ts.map +1 -0
  257. package/build-types/border-control/border-control/component.d.ts +4 -0
  258. package/build-types/border-control/border-control/component.d.ts.map +1 -0
  259. package/build-types/border-control/border-control/hook.d.ts +285 -0
  260. package/build-types/border-control/border-control/hook.d.ts.map +1 -0
  261. package/build-types/border-control/border-control/index.d.ts +3 -0
  262. package/build-types/border-control/border-control/index.d.ts.map +1 -0
  263. package/build-types/border-control/border-control-dropdown/component.d.ts +4 -0
  264. package/build-types/border-control/border-control-dropdown/component.d.ts.map +1 -0
  265. package/build-types/border-control/border-control-dropdown/hook.d.ts +280 -0
  266. package/build-types/border-control/border-control-dropdown/hook.d.ts.map +1 -0
  267. package/build-types/border-control/border-control-dropdown/index.d.ts +2 -0
  268. package/build-types/border-control/border-control-dropdown/index.d.ts.map +1 -0
  269. package/build-types/border-control/border-control-style-picker/component.d.ts +4 -0
  270. package/build-types/border-control/border-control-style-picker/component.d.ts.map +1 -0
  271. package/build-types/border-control/border-control-style-picker/hook.d.ts +269 -0
  272. package/build-types/border-control/border-control-style-picker/hook.d.ts.map +1 -0
  273. package/build-types/border-control/border-control-style-picker/index.d.ts +2 -0
  274. package/build-types/border-control/border-control-style-picker/index.d.ts.map +1 -0
  275. package/build-types/border-control/index.d.ts +3 -0
  276. package/build-types/border-control/index.d.ts.map +1 -0
  277. package/build-types/border-control/styles.d.ts +18 -0
  278. package/build-types/border-control/styles.d.ts.map +1 -0
  279. package/build-types/border-control/types.d.ts +163 -0
  280. package/build-types/border-control/types.d.ts.map +1 -0
  281. package/build-types/card/styles.d.ts.map +1 -1
  282. package/build-types/color-indicator/index.d.ts +7 -0
  283. package/build-types/color-indicator/index.d.ts.map +1 -0
  284. package/build-types/input-control/stories/index.d.ts +17 -0
  285. package/build-types/input-control/stories/index.d.ts.map +1 -0
  286. package/build-types/item-group/styles.d.ts.map +1 -1
  287. package/build-types/text/test/index.d.ts +2 -0
  288. package/build-types/text/test/index.d.ts.map +1 -0
  289. package/build-types/toggle-group-control/index.d.ts +1 -0
  290. package/build-types/toggle-group-control/index.d.ts.map +1 -1
  291. package/build-types/toggle-group-control/toggle-group-control/component.d.ts.map +1 -1
  292. package/build-types/toggle-group-control/toggle-group-control/styles.d.ts +5 -0
  293. package/build-types/toggle-group-control/toggle-group-control/styles.d.ts.map +1 -1
  294. package/build-types/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.d.ts +9 -0
  295. package/build-types/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.d.ts.map +1 -0
  296. package/build-types/toggle-group-control/toggle-group-control-option/component.d.ts +6 -2
  297. package/build-types/toggle-group-control/toggle-group-control-option/component.d.ts.map +1 -1
  298. package/build-types/toggle-group-control/toggle-group-control-option/styles.d.ts +4 -0
  299. package/build-types/toggle-group-control/toggle-group-control-option/styles.d.ts.map +1 -1
  300. package/build-types/toggle-group-control/toggle-group-control-option-base/component.d.ts +25 -0
  301. package/build-types/toggle-group-control/toggle-group-control-option-base/component.d.ts.map +1 -0
  302. package/build-types/toggle-group-control/toggle-group-control-option-base/index.d.ts +2 -0
  303. package/build-types/toggle-group-control/toggle-group-control-option-base/index.d.ts.map +1 -0
  304. package/build-types/toggle-group-control/toggle-group-control-option-base/styles.d.ts +15 -0
  305. package/build-types/toggle-group-control/toggle-group-control-option-base/styles.d.ts.map +1 -0
  306. package/build-types/toggle-group-control/toggle-group-control-option-icon/component.d.ts +37 -0
  307. package/build-types/toggle-group-control/toggle-group-control-option-icon/component.d.ts.map +1 -0
  308. package/build-types/toggle-group-control/toggle-group-control-option-icon/index.d.ts +2 -0
  309. package/build-types/toggle-group-control/toggle-group-control-option-icon/index.d.ts.map +1 -0
  310. package/build-types/toggle-group-control/types.d.ts +24 -8
  311. package/build-types/toggle-group-control/types.d.ts.map +1 -1
  312. package/build-types/ui/form-group/form-group.d.ts +2 -2
  313. package/build-types/unit-control/index.d.ts +6 -2
  314. package/build-types/unit-control/index.d.ts.map +1 -1
  315. package/build-types/unit-control/types.d.ts +5 -1
  316. package/build-types/unit-control/types.d.ts.map +1 -1
  317. package/build-types/utils/colors-values.d.ts +78 -18
  318. package/build-types/utils/colors-values.d.ts.map +1 -1
  319. package/build-types/utils/config-values.d.ts +71 -71
  320. package/build-types/utils/config-values.d.ts.map +1 -1
  321. package/package.json +17 -17
  322. package/src/animate/README.md +1 -1
  323. package/src/base-control/README.md +11 -11
  324. package/src/base-control/index.tsx +124 -0
  325. package/src/base-control/stories/index.tsx +80 -0
  326. package/src/base-control/styles/{base-control-styles.js → base-control-styles.ts} +0 -0
  327. package/src/base-control/types.ts +42 -0
  328. package/src/border-box-control/border-box-control/README.md +178 -0
  329. package/src/border-box-control/border-box-control/component.tsx +123 -0
  330. package/src/border-box-control/border-box-control/hook.ts +119 -0
  331. package/src/border-box-control/border-box-control/index.ts +2 -0
  332. package/src/border-box-control/border-box-control-linked-button/component.tsx +50 -0
  333. package/src/border-box-control/border-box-control-linked-button/hook.ts +30 -0
  334. package/src/border-box-control/border-box-control-linked-button/index.ts +1 -0
  335. package/src/border-box-control/border-box-control-split-controls/component.tsx +90 -0
  336. package/src/border-box-control/border-box-control-split-controls/hook.ts +34 -0
  337. package/src/border-box-control/border-box-control-split-controls/index.ts +1 -0
  338. package/src/border-box-control/border-box-control-visualizer/component.tsx +28 -0
  339. package/src/border-box-control/border-box-control-visualizer/hook.ts +30 -0
  340. package/src/border-box-control/border-box-control-visualizer/index.ts +1 -0
  341. package/src/border-box-control/index.ts +3 -0
  342. package/src/border-box-control/stories/index.js +104 -0
  343. package/src/border-box-control/styles.ts +69 -0
  344. package/src/border-box-control/test/index.js +354 -0
  345. package/src/border-box-control/test/utils.js +305 -0
  346. package/src/border-box-control/types.ts +98 -0
  347. package/src/border-box-control/utils.ts +151 -0
  348. package/src/border-control/border-control/README.md +181 -0
  349. package/src/border-control/border-control/component.tsx +112 -0
  350. package/src/border-control/border-control/hook.ts +145 -0
  351. package/src/border-control/border-control/index.ts +2 -0
  352. package/src/border-control/border-control-dropdown/component.tsx +252 -0
  353. package/src/border-control/border-control-dropdown/hook.ts +98 -0
  354. package/src/border-control/border-control-dropdown/index.ts +1 -0
  355. package/src/border-control/border-control-style-picker/component.tsx +89 -0
  356. package/src/border-control/border-control-style-picker/hook.ts +34 -0
  357. package/src/border-control/border-control-style-picker/index.ts +1 -0
  358. package/src/border-control/index.ts +2 -0
  359. package/src/border-control/stories/index.js +118 -0
  360. package/src/border-control/styles.ts +190 -0
  361. package/src/border-control/test/index.js +436 -0
  362. package/src/border-control/types.ts +173 -0
  363. package/src/card/styles.js +11 -5
  364. package/src/card/test/__snapshots__/index.js.snap +83 -66
  365. package/src/card/test/index.js +7 -5
  366. package/src/color-palette/README.md +6 -0
  367. package/src/color-palette/stories/index.js +8 -1
  368. package/src/custom-select-control/index.js +7 -1
  369. package/src/custom-select-control/style.scss +5 -1
  370. package/src/disabled/README.md +7 -10
  371. package/src/flyout/test/__snapshots__/index.js.snap +7 -7
  372. package/src/form-toggle/README.md +1 -1
  373. package/src/guide/index.js +12 -13
  374. package/src/guide/style.scss +0 -4
  375. package/src/index.js +8 -0
  376. package/src/item-group/styles.ts +1 -0
  377. package/src/item-group/test/__snapshots__/index.js.snap +11 -10
  378. package/src/mobile/picker/index.android.js +0 -1
  379. package/src/palette-edit/index.js +8 -2
  380. package/src/surface/styles.js +1 -1
  381. package/src/surface/test/__snapshots__/index.js.snap +11 -11
  382. package/src/toggle-group-control/index.ts +1 -0
  383. package/src/toggle-group-control/stories/index.js +37 -7
  384. package/src/toggle-group-control/test/__snapshots__/index.js.snap +269 -5
  385. package/src/toggle-group-control/test/index.js +43 -10
  386. package/src/toggle-group-control/toggle-group-control/component.tsx +10 -0
  387. package/src/toggle-group-control/toggle-group-control/styles.ts +14 -0
  388. package/src/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.tsx +86 -0
  389. package/src/toggle-group-control/toggle-group-control-option/README.md +8 -5
  390. package/src/toggle-group-control/toggle-group-control-option/component.tsx +18 -94
  391. package/src/toggle-group-control/toggle-group-control-option-base/README.md +27 -0
  392. package/src/toggle-group-control/toggle-group-control-option-base/component.tsx +129 -0
  393. package/src/toggle-group-control/toggle-group-control-option-base/index.ts +1 -0
  394. package/src/toggle-group-control/{toggle-group-control-option → toggle-group-control-option-base}/styles.ts +4 -1
  395. package/src/toggle-group-control/toggle-group-control-option-icon/README.md +56 -0
  396. package/src/toggle-group-control/toggle-group-control-option-icon/component.tsx +56 -0
  397. package/src/toggle-group-control/toggle-group-control-option-icon/index.ts +1 -0
  398. package/src/toggle-group-control/types.ts +33 -8
  399. package/src/toolbar-dropdown-menu/index.js +1 -1
  400. package/src/tools-panel/test/__snapshots__/index.js.snap +8 -8
  401. package/src/unit-control/README.md +6 -0
  402. package/src/unit-control/index.tsx +6 -1
  403. package/src/unit-control/test/index.js +120 -0
  404. package/src/unit-control/types.ts +5 -1
  405. package/src/utils/colors-values.js +4 -3
  406. package/src/utils/config-values.js +9 -4
  407. package/tsconfig.json +3 -0
  408. package/tsconfig.tsbuildinfo +1 -1
  409. package/build/guide/finish-button.js +0 -44
  410. package/build/guide/finish-button.js.map +0 -1
  411. package/build/toggle-group-control/toggle-group-control-option/styles.js +0 -66
  412. package/build/toggle-group-control/toggle-group-control-option/styles.js.map +0 -1
  413. package/build-module/guide/finish-button.js +0 -34
  414. package/build-module/guide/finish-button.js.map +0 -1
  415. package/build-module/toggle-group-control/toggle-group-control-option/styles.js +0 -55
  416. package/build-module/toggle-group-control/toggle-group-control-option/styles.js.map +0 -1
  417. package/src/base-control/index.js +0 -118
  418. package/src/base-control/stories/index.js +0 -81
  419. package/src/guide/finish-button.js +0 -26
  420. package/src/guide/test/finish-button.js +0 -49
@@ -0,0 +1,27 @@
1
+ # `ToggleGroupControlOptionBase`
2
+
3
+ <div class="callout callout-alert">
4
+ This feature is still experimental. “Experimental” means this is an early implementation subject to drastic and breaking changes.
5
+ </div>
6
+
7
+ `ToggleGroupControlOptionBase` is a form component and is meant to be used as an internal, generic component for any children of [`ToggleGroupControl`](<(/packages/components/src/toggle-group-control/toggle-group-control/README.md)>).
8
+
9
+ ## Props
10
+
11
+ ### `children`: `ReactNode`
12
+
13
+ The children elements.
14
+
15
+ - Required: Yes
16
+
17
+ ### `value`: `string | number`
18
+
19
+ The value of the `ToggleGroupControlOptionBase`.
20
+
21
+ - Required: Yes
22
+
23
+ ### `showTooltip`: `boolean`
24
+
25
+ Whether to show a tooltip when hovering over the option. The tooltip will only show if a label for it is provided using the `aria-label` prop.
26
+
27
+ - Required: No
@@ -0,0 +1,129 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import type { ForwardedRef } from 'react';
5
+ // eslint-disable-next-line no-restricted-imports
6
+ import { Radio } from 'reakit';
7
+
8
+ /**
9
+ * WordPress dependencies
10
+ */
11
+ import { useInstanceId } from '@wordpress/compose';
12
+
13
+ /**
14
+ * Internal dependencies
15
+ */
16
+ import {
17
+ contextConnect,
18
+ useContextSystem,
19
+ WordPressComponentProps,
20
+ } from '../../ui/context';
21
+ import type {
22
+ ToggleGroupControlOptionBaseProps,
23
+ WithToolTipProps,
24
+ } from '../types';
25
+ import { useToggleGroupControlContext } from '../context';
26
+ import * as styles from './styles';
27
+ import { useCx } from '../../utils/hooks';
28
+ import Tooltip from '../../tooltip';
29
+
30
+ const { ButtonContentView, LabelView } = styles;
31
+
32
+ const WithToolTip = ( { showTooltip, text, children }: WithToolTipProps ) => {
33
+ if ( showTooltip && text ) {
34
+ return (
35
+ <Tooltip text={ text } position="top center">
36
+ { children }
37
+ </Tooltip>
38
+ );
39
+ }
40
+ return <>{ children }</>;
41
+ };
42
+
43
+ function ToggleGroupControlOptionBase(
44
+ props: WordPressComponentProps<
45
+ ToggleGroupControlOptionBaseProps,
46
+ 'button',
47
+ false
48
+ >,
49
+ forwardedRef: ForwardedRef< any >
50
+ ) {
51
+ const toggleGroupControlContext = useToggleGroupControlContext();
52
+ const id = useInstanceId(
53
+ ToggleGroupControlOptionBase,
54
+ toggleGroupControlContext.baseId || 'toggle-group-control-option-base'
55
+ ) as string;
56
+ const buttonProps = useContextSystem(
57
+ { ...props, id },
58
+ 'ToggleGroupControlOptionBase'
59
+ );
60
+ const {
61
+ className,
62
+ isBlock = false,
63
+ value,
64
+ children,
65
+ showTooltip = false,
66
+ ...radioProps
67
+ } = {
68
+ ...toggleGroupControlContext,
69
+ ...buttonProps,
70
+ };
71
+
72
+ const isActive = radioProps.state === value;
73
+ const cx = useCx();
74
+ const labelViewClasses = cx( isBlock && styles.labelBlock );
75
+ const classes = cx(
76
+ styles.buttonView,
77
+ className,
78
+ isActive && styles.buttonActive
79
+ );
80
+
81
+ return (
82
+ <LabelView className={ labelViewClasses } data-active={ isActive }>
83
+ <WithToolTip
84
+ showTooltip={ showTooltip }
85
+ text={ radioProps[ 'aria-label' ] }
86
+ >
87
+ <Radio
88
+ { ...radioProps }
89
+ as="button"
90
+ aria-label={ radioProps[ 'aria-label' ] }
91
+ className={ classes }
92
+ data-value={ value }
93
+ ref={ forwardedRef }
94
+ value={ value }
95
+ >
96
+ <ButtonContentView>{ children }</ButtonContentView>
97
+ </Radio>
98
+ </WithToolTip>
99
+ </LabelView>
100
+ );
101
+ }
102
+
103
+ /**
104
+ * `ToggleGroupControlOptionBase` is a form component and is meant to be used as an internal,
105
+ * generic component for any children of `ToggleGroupControl`.
106
+ *
107
+ * @example
108
+ * ```jsx
109
+ * import {
110
+ * __experimentalToggleGroupControl as ToggleGroupControl,
111
+ * __experimentalToggleGroupControlOptionBase as ToggleGroupControlOptionBase,
112
+ * } from '@wordpress/components';
113
+ *
114
+ * function Example() {
115
+ * return (
116
+ * <ToggleGroupControl label="my label" value="vertical" isBlock>
117
+ * <ToggleGroupControlOption value="horizontal" label="Horizontal" />
118
+ * <ToggleGroupControlOption value="vertical" label="Vertical" />
119
+ * </ToggleGroupControl>
120
+ * );
121
+ * }
122
+ * ```
123
+ */
124
+ const ConnectedToggleGroupControlOptionBase = contextConnect(
125
+ ToggleGroupControlOptionBase,
126
+ 'ToggleGroupControlOptionBase'
127
+ );
128
+
129
+ export default ConnectedToggleGroupControlOptionBase;
@@ -0,0 +1 @@
1
+ export { default as ToggleGroupControlOptionBase } from './component';
@@ -27,6 +27,7 @@ export const buttonView = css`
27
27
  border: none;
28
28
  border-radius: ${ CONFIG.controlBorderRadius };
29
29
  color: ${ COLORS.gray[ 700 ] };
30
+ fill: currentColor;
30
31
  cursor: pointer;
31
32
  display: flex;
32
33
  font-family: inherit;
@@ -55,7 +56,9 @@ export const buttonView = css`
55
56
 
56
57
  export const buttonActive = css`
57
58
  color: ${ COLORS.white };
58
- background-color: ${ COLORS.gray[ 900 ] };
59
+ &:active {
60
+ background: transparent;
61
+ }
59
62
  `;
60
63
 
61
64
  export const ButtonContentView = styled.div`
@@ -0,0 +1,56 @@
1
+ # `ToggleGroupControlOptionIcon`
2
+
3
+ <div class="callout callout-alert">
4
+ This feature is still experimental. “Experimental” means this is an early implementation subject to drastic and breaking changes.
5
+ </div>
6
+
7
+ `ToggleGroupControlOptionIcon` is a form component which is meant to be used as a child of [`ToggleGroupControl`] and displays an icon(<(/packages/components/src/toggle-group-control/toggle-group-control/README.md)>).
8
+
9
+ ## Usage
10
+
11
+ ```js
12
+ import {
13
+ __experimentalToggleGroupControl as ToggleGroupControl,
14
+ __experimentalToggleGroupControlOptionIcon as ToggleGroupControlOptionIcon,
15
+ } from '@wordpress/components';
16
+ import { formatLowercase, formatUppercase } from '@wordpress/icons';
17
+
18
+ function Example() {
19
+ return (
20
+ <ToggleGroupControl label="my label" value="lowercase" isBlock>
21
+ <ToggleGroupControlOptionIcon
22
+ value="uppercase"
23
+ icon={ formatUppercase }
24
+ showTooltip={ true }
25
+ aria-label="Uppercase"
26
+ />
27
+ <ToggleGroupControlOptionIcon
28
+ value="lowercase"
29
+ icon={ formatLowercase }
30
+ showTooltip={ true }
31
+ aria-label="Lowercase"
32
+ />
33
+ </ToggleGroupControl>
34
+ );
35
+ }
36
+ ```
37
+
38
+ ## Props
39
+
40
+ ### `value`: `string | number`
41
+
42
+ The value of the `ToggleGroupControlOption`.
43
+
44
+ - Required: Yes
45
+
46
+ ### `icon`: `WPComponent`
47
+
48
+ Icon displayed as the content of the option. Usually one of the icons from the `@wordpress/icons` package, or a custom React `<svg>` icon.
49
+
50
+ - Required: Yes
51
+
52
+ ### `showTooltip`: `boolean`
53
+
54
+ Whether to show a tooltip when hovering over the option. The tooltip will only show if a label for it is provided using the `aria-label` prop.
55
+
56
+ - Required: No
@@ -0,0 +1,56 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { Icon } from '@wordpress/icons';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import type { WordPressComponentProps } from '../../ui/context';
10
+ import type { ToggleGroupControlOptionIconProps } from '../types';
11
+ import { ToggleGroupControlOptionBase } from '../toggle-group-control-option-base';
12
+
13
+ export default function ToggleGroupControlOptionIcon(
14
+ props: WordPressComponentProps<
15
+ ToggleGroupControlOptionIconProps,
16
+ 'button',
17
+ false
18
+ >
19
+ ) {
20
+ const { icon, ...restProps } = props;
21
+ return (
22
+ <ToggleGroupControlOptionBase { ...restProps }>
23
+ <Icon icon={ icon } />
24
+ </ToggleGroupControlOptionBase>
25
+ );
26
+ }
27
+
28
+ /**
29
+ * `ToggleGroupControlOptionIcon` is a form component which is meant to be used as a
30
+ * child of `ToggleGroupControl` and displays an icon.
31
+ *
32
+ * @example
33
+ * ```jsx
34
+ *
35
+ * import {
36
+ * __experimentalToggleGroupControl as ToggleGroupControl,
37
+ * __experimentalToggleGroupControlOptionIcon as ToggleGroupControlOptionIcon,
38
+ * from '@wordpress/components';
39
+ * import { formatLowercase, formatUppercase } from '@wordpress/icons';
40
+ *
41
+ * function Example() {
42
+ * return (
43
+ * <ToggleGroupControl label="my label" value="vertical" isBlock>
44
+ * <ToggleGroupControlOptionIcon
45
+ * value="uppercase"
46
+ * icon={ formatUppercase }
47
+ * />
48
+ * <ToggleGroupControlOptionIcon
49
+ * value="lowercase"
50
+ * icon={ formatLowercase }
51
+ * />
52
+ * </ToggleGroupControl>
53
+ * );
54
+ * }
55
+ ** ```
56
+ */
@@ -0,0 +1 @@
1
+ export { default as ToggleGroupControlOptionIcon } from './component';
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import type { ReactNode, ReactText } from 'react';
4
+ import type { MutableRefObject, ReactNode, ReactText } from 'react';
5
5
  // eslint-disable-next-line no-restricted-imports
6
6
  import type { RadioStateReturn } from 'reakit';
7
7
 
@@ -10,13 +10,9 @@ import type { RadioStateReturn } from 'reakit';
10
10
  */
11
11
  import type { FormElementProps } from '../utils/types';
12
12
 
13
- export type ToggleGroupControlOptionProps = {
13
+ export type ToggleGroupControlOptionBaseProps = {
14
+ children: ReactNode;
14
15
  value: ReactText;
15
- /**
16
- * Label for the option. If needed, the `aria-label` prop can be used in addition
17
- * to specify a different label for assistive technologies.
18
- */
19
- label: string;
20
16
  /**
21
17
  * Whether to display a Tooltip for the control option. If set to `true`, the tooltip will
22
18
  * show the aria-label or the label prop text.
@@ -26,6 +22,28 @@ export type ToggleGroupControlOptionProps = {
26
22
  showTooltip?: boolean;
27
23
  };
28
24
 
25
+ export type ToggleGroupControlOptionIconProps = Omit<
26
+ ToggleGroupControlOptionBaseProps,
27
+ 'children'
28
+ > & {
29
+ /**
30
+ * Icon displayed as the content of the option. Usually one of the icons from
31
+ * the `@wordpress/icons` package, or a custom React `<svg>` icon.
32
+ */
33
+ icon: JSX.Element;
34
+ };
35
+
36
+ export type ToggleGroupControlOptionProps = Omit<
37
+ ToggleGroupControlOptionBaseProps,
38
+ 'children'
39
+ > & {
40
+ /**
41
+ * Label for the option. If needed, the `aria-label` prop can be used in addition
42
+ * to specify a different label for assistive technologies.
43
+ */
44
+ label: string;
45
+ };
46
+
29
47
  export type WithToolTipProps = {
30
48
  /**
31
49
  * React children
@@ -34,7 +52,7 @@ export type WithToolTipProps = {
34
52
  /**
35
53
  * Label for the Tooltip component.
36
54
  */
37
- text: string;
55
+ text?: string;
38
56
  /**
39
57
  * Whether to wrap the control option in a Tooltip component.
40
58
  *
@@ -96,3 +114,10 @@ export type ToggleGroupControlContextProps = RadioStateReturn & {
96
114
  */
97
115
  isBlock?: boolean;
98
116
  };
117
+
118
+ export type ToggleGroupControlBackdropProps = {
119
+ containerRef: MutableRefObject< HTMLElement | undefined >;
120
+ containerWidth?: number | null;
121
+ isAdaptiveWidth?: boolean;
122
+ state?: any;
123
+ };
@@ -19,7 +19,7 @@ function ToolbarDropdownMenu( props, ref ) {
19
19
 
20
20
  // ToobarItem will pass all props to the render prop child, which will pass
21
21
  // all props to the toggle of DropdownMenu. This means that ToolbarDropdownMenu
22
- // has the same API as DrpodownMenu.
22
+ // has the same API as DropdownMenu.
23
23
  return (
24
24
  <ToolbarItem ref={ ref } { ...props.toggleProps }>
25
25
  { ( toolbarItemProps ) => (
@@ -89,15 +89,15 @@ exports[`ToolsPanel first and last panel items should apply first/last classes t
89
89
  max-width: 100%;
90
90
  }
91
91
 
92
- .emotion-6.emotion-6 .e1puf3u4 {
92
+ .emotion-6.emotion-6 .ej5x27r4 {
93
93
  margin-bottom: 0;
94
94
  }
95
95
 
96
- .emotion-6.emotion-6 .e1puf3u4 .e1puf3u3:last-child {
96
+ .emotion-6.emotion-6 .ej5x27r4 .ej5x27r3:last-child {
97
97
  margin-bottom: 0;
98
98
  }
99
99
 
100
- .emotion-6 .e1puf3u1 {
100
+ .emotion-6 .ej5x27r1 {
101
101
  margin-bottom: 0;
102
102
  }
103
103
 
@@ -106,7 +106,7 @@ exports[`ToolsPanel first and last panel items should apply first/last classes t
106
106
  }
107
107
 
108
108
  .emotion-6 .components-custom-select-control__label,
109
- .emotion-6 .e1puf3u2 {
109
+ .emotion-6 .ej5x27r2 {
110
110
  line-height: 1.4em;
111
111
  }
112
112
 
@@ -121,15 +121,15 @@ exports[`ToolsPanel first and last panel items should apply first/last classes t
121
121
  max-width: 100%;
122
122
  }
123
123
 
124
- .emotion-8.emotion-8 .e1puf3u4 {
124
+ .emotion-8.emotion-8 .ej5x27r4 {
125
125
  margin-bottom: 0;
126
126
  }
127
127
 
128
- .emotion-8.emotion-8 .e1puf3u4 .e1puf3u3:last-child {
128
+ .emotion-8.emotion-8 .ej5x27r4 .ej5x27r3:last-child {
129
129
  margin-bottom: 0;
130
130
  }
131
131
 
132
- .emotion-8 .e1puf3u1 {
132
+ .emotion-8 .ej5x27r1 {
133
133
  margin-bottom: 0;
134
134
  }
135
135
 
@@ -138,7 +138,7 @@ exports[`ToolsPanel first and last panel items should apply first/last classes t
138
138
  }
139
139
 
140
140
  .emotion-8 .components-custom-select-control__label,
141
- .emotion-8 .e1puf3u2 {
141
+ .emotion-8 .ej5x27r2 {
142
142
  line-height: 1.4em;
143
143
  }
144
144
 
@@ -61,6 +61,12 @@ The position of the label (`top`, `side`, `bottom`, or `edge`).
61
61
 
62
62
  - Required: No
63
63
 
64
+ ### `onBlur`: `FocusEventHandler< HTMLInputElement | HTMLSelectElement >`
65
+
66
+ Callback invoked when either the quantity or unit inputs fire the `blur` event.
67
+
68
+ - Required: No
69
+
64
70
  ### `onChange`: `UnitControlOnChangeCallback`
65
71
 
66
72
  Callback when the `value` changes.
@@ -61,6 +61,7 @@ function UnforwardedUnitControl(
61
61
  unit: unitProp,
62
62
  units: unitsProp = CSS_UNITS,
63
63
  value: valueProp,
64
+ onBlur: onBlurProp,
64
65
  ...props
65
66
  } = unitControlProps;
66
67
 
@@ -187,7 +188,10 @@ function UnforwardedUnitControl(
187
188
  }
188
189
  };
189
190
 
190
- const handleOnBlur: FocusEventHandler< HTMLInputElement > = mayUpdateUnit;
191
+ const handleOnBlur: FocusEventHandler< HTMLInputElement > = ( event ) => {
192
+ mayUpdateUnit( event );
193
+ onBlurProp?.( event );
194
+ };
191
195
 
192
196
  const handleOnKeyDown = ( event: KeyboardEvent< HTMLInputElement > ) => {
193
197
  const { key } = event;
@@ -242,6 +246,7 @@ function UnforwardedUnitControl(
242
246
  size={ size }
243
247
  unit={ unit }
244
248
  units={ units }
249
+ onBlur={ onBlurProp }
245
250
  />
246
251
  ) : null;
247
252
 
@@ -220,6 +220,91 @@ describe( 'UnitControl', () => {
220
220
  expect( input.value ).toBe( '50' );
221
221
  expect( state ).toBe( 50 );
222
222
  } );
223
+
224
+ it( 'should run onBlur callback when quantity input is blurred', async () => {
225
+ let state = '33%';
226
+ const onChangeSpy = jest.fn();
227
+ const onBlurSpy = jest.fn();
228
+ const setState = ( nextState ) => {
229
+ onChangeSpy( nextState );
230
+ state = nextState;
231
+ };
232
+
233
+ const { user } = render(
234
+ <>
235
+ <button>Click me</button>
236
+ <UnitControl
237
+ value={ state }
238
+ onChange={ setState }
239
+ onBlur={ onBlurSpy }
240
+ />
241
+ </>
242
+ );
243
+
244
+ const input = getInput();
245
+ await user.clear( input );
246
+ await user.type( input, '41' );
247
+
248
+ await waitFor( () =>
249
+ expect( onChangeSpy ).toHaveBeenCalledTimes( 3 )
250
+ );
251
+ expect( onChangeSpy ).toHaveBeenLastCalledWith( '41%' );
252
+
253
+ // Clicking on the button should cause the `onBlur` callback to fire.
254
+ const button = screen.getByRole( 'button' );
255
+ await user.click( button );
256
+
257
+ await waitFor( () =>
258
+ expect( onBlurSpy ).toHaveBeenCalledTimes( 1 )
259
+ );
260
+ } );
261
+
262
+ it( 'should invoke onChange and onUnitChange callbacks when isPressEnterToChange is true and the component is blurred with an uncommitted value', async () => {
263
+ let state = '15px';
264
+
265
+ const onUnitChangeSpy = jest.fn();
266
+ const onChangeSpy = jest.fn();
267
+
268
+ const setState = ( nextState ) => {
269
+ onChangeSpy( nextState );
270
+ state = nextState;
271
+ };
272
+
273
+ const { user } = render(
274
+ <>
275
+ <button>Click me</button>
276
+ <UnitControl
277
+ value={ state }
278
+ onChange={ setState }
279
+ onUnitChange={ onUnitChangeSpy }
280
+ isPressEnterToChange
281
+ />
282
+ </>
283
+ );
284
+
285
+ const input = getInput();
286
+ await user.clear( input );
287
+ await user.type( input, '41vh' );
288
+
289
+ // This is because `isPressEnterToChange` is `true`
290
+ expect( onChangeSpy ).not.toHaveBeenCalled();
291
+
292
+ // Clicking on the button should cause the `onBlur` callback to fire.
293
+ const button = screen.getByRole( 'button' );
294
+ await user.click( button );
295
+
296
+ await waitFor( () =>
297
+ expect( onChangeSpy ).toHaveBeenCalledTimes( 1 )
298
+ );
299
+
300
+ expect( onChangeSpy ).toHaveBeenLastCalledWith( '41vh' );
301
+
302
+ expect( onUnitChangeSpy ).toHaveBeenCalledTimes( 1 );
303
+ expect( onUnitChangeSpy ).toHaveBeenLastCalledWith(
304
+ 'vh',
305
+ expect.anything()
306
+ );
307
+ } );
223
308
  } );
224
309
 
225
310
  describe( 'Unit', () => {
@@ -384,6 +469,41 @@ describe( 'UnitControl', () => {
384
469
 
385
470
  expect( select ).toHaveValue( 'vmax' );
386
471
  } );
472
+
473
+ it( 'should run onBlur callback when the unit select is blurred', async () => {
474
+ const onUnitChangeSpy = jest.fn();
475
+ const onBlurSpy = jest.fn();
476
+
477
+ const { user } = render(
478
+ <>
479
+ <button>Click me</button>
480
+ <UnitControl
481
+ value="15px"
482
+ onUnitChange={ onUnitChangeSpy }
483
+ onBlur={ onBlurSpy }
484
+ />
485
+ </>
486
+ );
487
+
488
+ const select = getSelect();
489
+ await user.selectOptions( select, [ 'em' ] );
490
+
491
+ await waitFor( () =>
492
+ expect( onUnitChangeSpy ).toHaveBeenCalledTimes( 1 )
493
+ );
494
+ expect( onUnitChangeSpy ).toHaveBeenLastCalledWith(
495
+ 'em',
496
+ expect.anything()
497
+ );
498
+
499
+ // Clicking on the button should cause the `onBlur` callback to fire.
500
+ const button = screen.getByRole( 'button' );
501
+ await user.click( button );
502
+
503
+ await waitFor( () =>
504
+ expect( onBlurSpy ).toHaveBeenCalledTimes( 1 )
505
+ );
506
+ } );
387
507
  } );
388
508
 
389
509
  describe( 'Unit Parser', () => {
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import type { CSSProperties, SyntheticEvent } from 'react';
4
+ import type { CSSProperties, FocusEventHandler, SyntheticEvent } from 'react';
5
5
 
6
6
  /**
7
7
  * Internal dependencies
@@ -131,4 +131,8 @@ export type UnitControlProps = Omit< UnitSelectControlProps, 'unit' > &
131
131
  * @default 10
132
132
  */
133
133
  shiftStep?: number;
134
+ /**
135
+ * Callback when either the quantity or the unit inputs lose focus.
136
+ */
137
+ onBlur?: FocusEventHandler< HTMLInputElement | HTMLSelectElement >;
134
138
  };
@@ -166,8 +166,9 @@ export const UI = {
166
166
  textLight: BASE.black,
167
167
  };
168
168
 
169
- export const COLORS = {
170
- ...BASE,
169
+ // Using Object.assign instead of { ...spread } syntax helps TypeScript
170
+ // to extract the correct type defs here.
171
+ export const COLORS = Object.assign( {}, BASE, {
171
172
  darkGray: merge( {}, DARK_GRAY, G2.darkGray ),
172
173
  darkOpacity: DARK_OPACITY,
173
174
  darkOpacityLight: DARK_OPACITY_LIGHT,
@@ -179,6 +180,6 @@ export const COLORS = {
179
180
  alert: ALERT,
180
181
  admin: ADMIN,
181
182
  ui: UI,
182
- };
183
+ } );
183
184
 
184
185
  export default COLORS;
@@ -26,15 +26,20 @@ const CONTROL_PROPS = {
26
26
  controlHeightLarge: `calc( ${ CONTROL_HEIGHT } * 1.2 )`,
27
27
  controlHeightXLarge: `calc( ${ CONTROL_HEIGHT } * 1.4 )`,
28
28
  };
29
+
29
30
  const TOGGLE_GROUP_CONTROL_PROPS = {
30
31
  toggleGroupControlBackgroundColor: CONTROL_PROPS.controlBackgroundColor,
31
32
  toggleGroupControlBorderColor: COLORS.ui.border,
33
+ toggleGroupControlBackdropBackgroundColor:
34
+ CONTROL_PROPS.controlSurfaceColor,
35
+ toggleGroupControlBackdropBorderColor: COLORS.ui.border,
36
+ toggleGroupControlBackdropBoxShadow: 'transparent',
32
37
  toggleGroupControlButtonColorActive: CONTROL_PROPS.controlBackgroundColor,
33
38
  };
34
39
 
35
- export default {
36
- ...CONTROL_PROPS,
37
- ...TOGGLE_GROUP_CONTROL_PROPS,
40
+ // Using Object.assign to avoid creating circular references when emitting
41
+ // TypeScript type declarations.
42
+ export default Object.assign( {}, CONTROL_PROPS, TOGGLE_GROUP_CONTROL_PROPS, {
38
43
  colorDivider: 'rgba(0, 0, 0, 0.1)',
39
44
  colorScrollbarThumb: 'rgba(0, 0, 0, 0.2)',
40
45
  colorScrollbarThumbHover: 'rgba(0, 0, 0, 0.5)',
@@ -79,4 +84,4 @@ export default {
79
84
  transitionDurationFastest: '100ms',
80
85
  transitionTimingFunction: 'cubic-bezier(0.08, 0.52, 0.52, 1)',
81
86
  transitionTimingFunctionControl: 'cubic-bezier(0.12, 0.8, 0.32, 1)',
82
- };
87
+ } );
package/tsconfig.json CHANGED
@@ -26,9 +26,12 @@
26
26
  "src/animate/**/*",
27
27
  "src/base-control/**/*",
28
28
  "src/base-field/**/*",
29
+ "src/border-box-control/**/*",
30
+ "src/border-control/**/*",
29
31
  "src/button/**/*",
30
32
  "src/card/**/*",
31
33
  "src/circular-option-picker/**/*",
34
+ "src/color-indicator/**/*",
32
35
  "src/color-palette/**/*",
33
36
  "src/color-picker/**/*",
34
37
  "src/confirm-dialog/**/*",