@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,190 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { css } from '@emotion/react';
5
+ import type { CSSProperties } from 'react';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import { COLORS, CONFIG, rtl } from '../utils';
11
+ import { space } from '../ui/utils/space';
12
+ import {
13
+ StyledField,
14
+ StyledLabel,
15
+ } from '../base-control/styles/base-control-styles';
16
+ import { BackdropUI } from '../input-control/styles/input-control-styles';
17
+ import { Root as UnitControlWrapper } from '../unit-control/styles/unit-control-styles';
18
+
19
+ import type { Border } from './types';
20
+
21
+ const labelStyles = css`
22
+ font-weight: 500;
23
+ `;
24
+
25
+ export const borderControl = css`
26
+ position: relative;
27
+ `;
28
+
29
+ export const innerWrapper = () => css`
30
+ border: ${ CONFIG.borderWidth } solid ${ COLORS.gray[ 200 ] };
31
+ border-radius: 2px;
32
+ flex: 1 0 40%;
33
+
34
+ /*
35
+ * Needs more thought. Aim is to prevent the border for BorderBoxControl
36
+ * showing through the control. Likely needs to take into account
37
+ * light/dark themes etc.
38
+ */
39
+ background: #fff;
40
+
41
+ /*
42
+ * Forces the width control to fill available space given UnitControl
43
+ * passes its className directly through to the input.
44
+ */
45
+ ${ UnitControlWrapper } {
46
+ flex: 1;
47
+ ${ rtl( { marginLeft: 0 } )() }
48
+ }
49
+ `;
50
+
51
+ export const wrapperWidth = ( width: CSSProperties[ 'width' ] ) => {
52
+ return css`
53
+ width: ${ width };
54
+ flex: 0 0 auto;
55
+ `;
56
+ };
57
+
58
+ export const borderControlDropdown = () => css`
59
+ background: #fff;
60
+ ${ rtl(
61
+ {
62
+ borderRadius: `1px 0 0 1px`,
63
+ borderRight: `${ CONFIG.borderWidth } solid ${ COLORS.gray[ 200 ] }`,
64
+ },
65
+ {
66
+ borderRadius: `0 1px 1px 0`,
67
+ borderLeft: `${ CONFIG.borderWidth } solid ${ COLORS.gray[ 200 ] }`,
68
+ }
69
+ )() }
70
+
71
+ && > button {
72
+ padding: ${ space( 1 ) };
73
+ border-radius: inherit;
74
+ }
75
+ `;
76
+
77
+ export const colorIndicatorBorder = ( border?: Border ) => {
78
+ const { color, style } = border || {};
79
+
80
+ const fallbackColor =
81
+ !! style && style !== 'none' ? COLORS.gray[ 300 ] : undefined;
82
+
83
+ return css`
84
+ border-style: ${ style === 'none' ? 'solid' : style };
85
+ border-color: ${ color || fallbackColor };
86
+ `;
87
+ };
88
+
89
+ export const colorIndicatorWrapper = ( border?: Border ) => {
90
+ const { style } = border || {};
91
+
92
+ return css`
93
+ border-radius: 9999px;
94
+ border: 2px solid transparent;
95
+ ${ style ? colorIndicatorBorder( border ) : undefined }
96
+ width: 28px;
97
+ height: 28px;
98
+ padding: 2px;
99
+
100
+ /*
101
+ * ColorIndicator
102
+ *
103
+ * The transparent colors used here ensure visibility of the indicator
104
+ * over the active state of the border control dropdown's toggle button.
105
+ */
106
+ & > span {
107
+ background: linear-gradient(
108
+ -45deg,
109
+ transparent 48%,
110
+ rgb( 0 0 0 / 20% ) 48%,
111
+ rgb( 0 0 0 / 20% ) 52%,
112
+ transparent 52%
113
+ );
114
+ }
115
+ `;
116
+ };
117
+
118
+ export const borderControlPopover = css`
119
+ /* Remove padding from content, this will be re-added via inner elements*/
120
+ && > div > div {
121
+ padding: 0;
122
+ }
123
+ `;
124
+
125
+ export const borderControlPopoverControls = css`
126
+ padding: ${ space( 2 ) };
127
+
128
+ > div:first-of-type > ${ StyledLabel } {
129
+ margin-bottom: 0;
130
+ ${ labelStyles }
131
+ }
132
+
133
+ && ${ StyledLabel } + button:not( .has-text ) {
134
+ min-width: 24px;
135
+ padding: 0;
136
+ }
137
+ `;
138
+
139
+ export const borderControlPopoverContent = css``;
140
+ export const borderColorIndicator = css``;
141
+
142
+ export const resetButton = css`
143
+ justify-content: center;
144
+ width: 100%;
145
+
146
+ /* Override button component styling */
147
+ && {
148
+ border-top: ${ CONFIG.borderWidth } solid ${ COLORS.gray[ 200 ] };
149
+ height: 46px;
150
+ }
151
+ `;
152
+
153
+ export const borderWidthControl = () => css`
154
+ /* Target the InputControl's backdrop */
155
+ &&& ${ BackdropUI } {
156
+ border: none;
157
+ }
158
+
159
+ /* Specificity required to overcome UnitControl padding */
160
+ /* See packages/components/src/unit-control/styles/unit-control-styles.ts */
161
+ &&& input {
162
+ ${ rtl( { paddingRight: 0 } )() }
163
+ }
164
+ `;
165
+
166
+ export const borderControlStylePicker = css`
167
+ ${ StyledLabel } {
168
+ ${ labelStyles }
169
+ }
170
+ `;
171
+
172
+ export const borderStyleButton = css`
173
+ &&&&& {
174
+ min-width: 30px;
175
+ width: 30px;
176
+ height: 30px;
177
+ padding: 3px;
178
+ }
179
+ `;
180
+
181
+ export const borderSlider = () => css`
182
+ flex: 1 1 60%;
183
+ ${ rtl( { marginRight: space( 3 ) } )() }
184
+
185
+ ${ StyledField } {
186
+ margin-bottom: 0;
187
+ font-size: 0;
188
+ display: flex;
189
+ }
190
+ `;
@@ -0,0 +1,436 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { fireEvent, render, screen } from '@testing-library/react';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { BorderControl } from '../';
10
+
11
+ const colors = [
12
+ { name: 'Gray', color: '#f6f7f7' },
13
+ { name: 'Blue', color: '#72aee6' },
14
+ { name: 'Red', color: '#e65054' },
15
+ { name: 'Green', color: '#00a32a' },
16
+ { name: 'Yellow', color: '#bd8600' },
17
+ ];
18
+
19
+ const defaultBorder = {
20
+ color: '#72aee6',
21
+ style: 'solid',
22
+ width: '1px',
23
+ };
24
+
25
+ const props = {
26
+ colors,
27
+ label: 'Border',
28
+ onChange: jest.fn().mockImplementation( ( newValue ) => {
29
+ props.value = newValue;
30
+ } ),
31
+ value: defaultBorder,
32
+ };
33
+
34
+ const toggleLabelRegex = /Border color( and style)* picker/;
35
+
36
+ const renderBorderControl = ( customProps ) => {
37
+ return render( <BorderControl { ...{ ...props, ...customProps } } /> );
38
+ };
39
+
40
+ const rerenderBorderControl = ( rerender, customProps ) => {
41
+ return rerender( <BorderControl { ...{ ...props, ...customProps } } /> );
42
+ };
43
+
44
+ const openPopover = () => {
45
+ const toggleButton = screen.getByLabelText( toggleLabelRegex );
46
+ fireEvent.click( toggleButton );
47
+ };
48
+
49
+ const getButton = ( name ) => {
50
+ return screen.getByRole( 'button', { name } );
51
+ };
52
+
53
+ const queryButton = ( name ) => {
54
+ return screen.queryByRole( 'button', { name } );
55
+ };
56
+
57
+ const clickButton = ( name ) => {
58
+ fireEvent.click( getButton( name ) );
59
+ };
60
+
61
+ const setWidthInput = ( value ) => {
62
+ const widthInput = screen.getByRole( 'spinbutton' );
63
+ widthInput.focus();
64
+ fireEvent.change( widthInput, { target: { value } } );
65
+ };
66
+
67
+ const clearWidthInput = () => setWidthInput( '' );
68
+
69
+ describe( 'BorderControl', () => {
70
+ describe( 'basic rendering', () => {
71
+ it( 'should render standard border control', () => {
72
+ renderBorderControl();
73
+
74
+ const label = screen.getByText( props.label );
75
+ const colorButton = screen.getByLabelText( toggleLabelRegex );
76
+ const widthInput = screen.getByRole( 'spinbutton' );
77
+ const unitSelect = screen.getByRole( 'combobox' );
78
+ const slider = screen.queryByRole( 'slider' );
79
+
80
+ expect( label ).toBeInTheDocument();
81
+ expect( colorButton ).toBeInTheDocument();
82
+ expect( widthInput ).toBeInTheDocument();
83
+ expect( unitSelect ).toBeInTheDocument();
84
+ expect( slider ).not.toBeInTheDocument();
85
+ } );
86
+
87
+ it( 'should hide label', () => {
88
+ renderBorderControl( { hideLabelFromVision: true } );
89
+ const label = screen.getByText( props.label );
90
+
91
+ // As visually hidden labels are still included in the document
92
+ // and do not have `display: none` styling, we can't rely on
93
+ // `.toBeInTheDocument()` or `.toBeVisible()` assertions.
94
+ expect( label ).toHaveAttribute(
95
+ 'data-wp-component',
96
+ 'VisuallyHidden'
97
+ );
98
+ } );
99
+
100
+ it( 'should render with slider', () => {
101
+ renderBorderControl( { withSlider: true } );
102
+
103
+ const slider = screen.getByRole( 'slider' );
104
+ expect( slider ).toBeInTheDocument();
105
+ } );
106
+
107
+ it( 'should render placeholder in UnitControl', () => {
108
+ renderBorderControl( { placeholder: 'Mixed' } );
109
+ const widthInput = screen.getByRole( 'spinbutton' );
110
+
111
+ expect( widthInput ).toHaveAttribute( 'placeholder', 'Mixed' );
112
+ } );
113
+
114
+ it( 'should render color and style popover', () => {
115
+ renderBorderControl();
116
+ openPopover();
117
+
118
+ const customColorPicker = getButton( /Custom color picker/ );
119
+ const colorSwatchButtons = screen.getAllByRole( 'button', {
120
+ name: /^Color:/,
121
+ } );
122
+ const styleLabel = screen.getByText( 'Style' );
123
+ const solidButton = getButton( 'Solid' );
124
+ const dashedButton = getButton( 'Dashed' );
125
+ const dottedButton = getButton( 'Dotted' );
126
+ const resetButton = getButton( 'Reset to default' );
127
+
128
+ expect( customColorPicker ).toBeInTheDocument();
129
+ expect( colorSwatchButtons.length ).toEqual( colors.length );
130
+ expect( styleLabel ).toBeInTheDocument();
131
+ expect( solidButton ).toBeInTheDocument();
132
+ expect( dashedButton ).toBeInTheDocument();
133
+ expect( dottedButton ).toBeInTheDocument();
134
+ expect( resetButton ).toBeInTheDocument();
135
+ } );
136
+
137
+ it( 'should render color and style popover header', () => {
138
+ renderBorderControl( { showDropdownHeader: true } );
139
+ openPopover();
140
+
141
+ const headerLabel = screen.getByText( 'Border color' );
142
+ const closeButton = getButton( 'Close border color' );
143
+
144
+ expect( headerLabel ).toBeInTheDocument();
145
+ expect( closeButton ).toBeInTheDocument();
146
+ } );
147
+
148
+ it( 'should not render style options when opted out of', () => {
149
+ renderBorderControl( { enableStyle: false } );
150
+ openPopover();
151
+
152
+ const styleLabel = screen.queryByText( 'Style' );
153
+ const solidButton = queryButton( 'Solid' );
154
+ const dashedButton = queryButton( 'Dashed' );
155
+ const dottedButton = queryButton( 'Dotted' );
156
+
157
+ expect( styleLabel ).not.toBeInTheDocument();
158
+ expect( solidButton ).not.toBeInTheDocument();
159
+ expect( dashedButton ).not.toBeInTheDocument();
160
+ expect( dottedButton ).not.toBeInTheDocument();
161
+ } );
162
+ } );
163
+
164
+ describe( 'color and style picker aria labels', () => {
165
+ describe( 'with style selection enabled', () => {
166
+ it( 'should include both color and style in label', () => {
167
+ renderBorderControl( { value: undefined } );
168
+
169
+ expect(
170
+ screen.getByLabelText( 'Border color and style picker.' )
171
+ ).toBeInTheDocument();
172
+ } );
173
+
174
+ it( 'should correctly describe named color selection', () => {
175
+ renderBorderControl( { value: { color: '#72aee6' } } );
176
+
177
+ expect(
178
+ screen.getByLabelText(
179
+ 'Border color and style picker. The currently selected color is called "Blue" and has a value of "#72aee6".'
180
+ )
181
+ ).toBeInTheDocument();
182
+ } );
183
+
184
+ it( 'should correctly describe custom color selection', () => {
185
+ renderBorderControl( { value: { color: '#4b1d80' } } );
186
+
187
+ expect(
188
+ screen.getByLabelText(
189
+ 'Border color and style picker. The currently selected color has a value of "#4b1d80".'
190
+ )
191
+ ).toBeInTheDocument();
192
+ } );
193
+
194
+ it( 'should correctly describe named color and style selections', () => {
195
+ renderBorderControl( {
196
+ value: { color: '#72aee6', style: 'dotted' },
197
+ } );
198
+
199
+ expect(
200
+ screen.getByLabelText(
201
+ 'Border color and style picker. The currently selected color is called "Blue" and has a value of "#72aee6". The currently selected style is "dotted".'
202
+ )
203
+ ).toBeInTheDocument();
204
+ } );
205
+
206
+ it( 'should correctly describe custom color and style selections', () => {
207
+ renderBorderControl( {
208
+ value: { color: '#4b1d80', style: 'dashed' },
209
+ } );
210
+
211
+ expect(
212
+ screen.getByLabelText(
213
+ 'Border color and style picker. The currently selected color has a value of "#4b1d80". The currently selected style is "dashed".'
214
+ )
215
+ ).toBeInTheDocument();
216
+ } );
217
+ } );
218
+
219
+ describe( 'with style selection disabled', () => {
220
+ it( 'should only include color in the label', () => {
221
+ renderBorderControl( { value: undefined, enableStyle: false } );
222
+
223
+ expect(
224
+ screen.getByLabelText( 'Border color picker.' )
225
+ ).toBeInTheDocument();
226
+ } );
227
+
228
+ it( 'should correctly describe named color selection', () => {
229
+ renderBorderControl( {
230
+ value: { color: '#72aee6' },
231
+ enableStyle: false,
232
+ } );
233
+
234
+ expect(
235
+ screen.getByLabelText(
236
+ 'Border color picker. The currently selected color is called "Blue" and has a value of "#72aee6".'
237
+ )
238
+ ).toBeInTheDocument();
239
+ } );
240
+
241
+ it( 'should correctly describe custom color selection', () => {
242
+ renderBorderControl( {
243
+ value: { color: '#4b1d80' },
244
+ enableStyle: false,
245
+ } );
246
+
247
+ expect(
248
+ screen.getByLabelText(
249
+ 'Border color picker. The currently selected color has a value of "#4b1d80".'
250
+ )
251
+ ).toBeInTheDocument();
252
+ } );
253
+ } );
254
+ } );
255
+
256
+ describe( 'onChange handling', () => {
257
+ beforeEach( () => {
258
+ jest.clearAllMocks();
259
+ props.value = defaultBorder;
260
+ } );
261
+
262
+ it( 'should update width with slider value', () => {
263
+ const { rerender } = renderBorderControl( { withSlider: true } );
264
+
265
+ const slider = screen.getByRole( 'slider' );
266
+ fireEvent.change( slider, { target: { value: '5' } } );
267
+
268
+ expect( props.onChange ).toHaveBeenNthCalledWith( 1, {
269
+ ...defaultBorder,
270
+ width: '5px',
271
+ } );
272
+
273
+ rerenderBorderControl( rerender, { withSlider: true } );
274
+ const widthInput = screen.getByRole( 'spinbutton' );
275
+
276
+ expect( widthInput.value ).toEqual( '5' );
277
+ } );
278
+
279
+ it( 'should update color selection', () => {
280
+ renderBorderControl();
281
+ openPopover();
282
+ clickButton( 'Color: Green' );
283
+
284
+ expect( props.onChange ).toHaveBeenNthCalledWith( 1, {
285
+ ...defaultBorder,
286
+ color: '#00a32a',
287
+ } );
288
+ } );
289
+
290
+ it( 'should clear color selection when toggling swatch off', () => {
291
+ renderBorderControl();
292
+ openPopover();
293
+ clickButton( 'Color: Blue' );
294
+
295
+ expect( props.onChange ).toHaveBeenNthCalledWith( 1, {
296
+ ...defaultBorder,
297
+ color: undefined,
298
+ } );
299
+ } );
300
+
301
+ it( 'should update style selection', () => {
302
+ renderBorderControl();
303
+ openPopover();
304
+ clickButton( 'Dashed' );
305
+
306
+ expect( props.onChange ).toHaveBeenNthCalledWith( 1, {
307
+ ...defaultBorder,
308
+ style: 'dashed',
309
+ } );
310
+ } );
311
+
312
+ it( 'should take no action when color and style popover is closed', () => {
313
+ renderBorderControl( { showDropdownHeader: true } );
314
+ openPopover();
315
+ clickButton( 'Close border color' );
316
+
317
+ expect( props.onChange ).not.toHaveBeenCalled();
318
+ } );
319
+
320
+ it( 'should reset color and style only when popover reset button clicked', () => {
321
+ renderBorderControl();
322
+ openPopover();
323
+ clickButton( 'Reset to default' );
324
+
325
+ expect( props.onChange ).toHaveBeenNthCalledWith( 1, {
326
+ color: undefined,
327
+ style: undefined,
328
+ width: defaultBorder.width,
329
+ } );
330
+ } );
331
+
332
+ it( 'should sanitize border when width and color are undefined', () => {
333
+ const { rerender } = renderBorderControl();
334
+ clearWidthInput();
335
+ rerenderBorderControl( rerender );
336
+ openPopover();
337
+ clickButton( 'Color: Blue' );
338
+
339
+ expect( props.onChange ).toHaveBeenCalledWith( undefined );
340
+ } );
341
+
342
+ it( 'should not sanitize border when requested', () => {
343
+ const { rerender } = renderBorderControl( {
344
+ shouldSanitizeBorder: false,
345
+ } );
346
+ clearWidthInput();
347
+ rerenderBorderControl( rerender, { shouldSanitizeBorder: false } );
348
+ openPopover();
349
+ clickButton( 'Color: Blue' );
350
+
351
+ expect( props.onChange ).toHaveBeenNthCalledWith( 2, {
352
+ color: undefined,
353
+ style: defaultBorder.style,
354
+ width: undefined,
355
+ } );
356
+ } );
357
+
358
+ it( 'should clear color and set style to `none` when setting zero width', () => {
359
+ renderBorderControl();
360
+ openPopover();
361
+ clickButton( 'Color: Green' );
362
+ clickButton( 'Dotted' );
363
+ setWidthInput( '0' );
364
+
365
+ expect( props.onChange ).toHaveBeenNthCalledWith( 3, {
366
+ color: undefined,
367
+ style: 'none',
368
+ width: '0px',
369
+ } );
370
+ } );
371
+
372
+ it( 'should reselect color and style selections when changing to non-zero width', () => {
373
+ const { rerender } = renderBorderControl();
374
+ openPopover();
375
+ clickButton( 'Color: Green' );
376
+ rerenderBorderControl( rerender );
377
+ clickButton( 'Dotted' );
378
+ rerenderBorderControl( rerender );
379
+ setWidthInput( '0' );
380
+ setWidthInput( '5' );
381
+
382
+ expect( props.onChange ).toHaveBeenNthCalledWith( 4, {
383
+ color: '#00a32a',
384
+ style: 'dotted',
385
+ width: '5px',
386
+ } );
387
+ } );
388
+
389
+ it( 'should set a non-zero width when applying color to zero width border', () => {
390
+ const { rerender } = renderBorderControl( { value: undefined } );
391
+ openPopover();
392
+ clickButton( 'Color: Yellow' );
393
+
394
+ expect( props.onChange ).toHaveBeenCalledWith( {
395
+ color: '#bd8600',
396
+ style: undefined,
397
+ width: undefined,
398
+ } );
399
+
400
+ setWidthInput( '0' );
401
+ rerenderBorderControl( rerender );
402
+ clickButton( 'Color: Green' );
403
+
404
+ expect( props.onChange ).toHaveBeenCalledWith( {
405
+ color: '#00a32a',
406
+ style: undefined,
407
+ width: '1px',
408
+ } );
409
+ } );
410
+
411
+ it( 'should set a non-zero width when applying style to zero width border', () => {
412
+ const { rerender } = renderBorderControl( {
413
+ value: undefined,
414
+ shouldSanitizeBorder: false,
415
+ } );
416
+ openPopover();
417
+ clickButton( 'Dashed' );
418
+
419
+ expect( props.onChange ).toHaveBeenCalledWith( {
420
+ color: undefined,
421
+ style: 'dashed',
422
+ width: undefined,
423
+ } );
424
+
425
+ setWidthInput( '0' );
426
+ rerenderBorderControl( rerender, { shouldSanitizeBorder: false } );
427
+ clickButton( 'Dotted' );
428
+
429
+ expect( props.onChange ).toHaveBeenCalledWith( {
430
+ color: undefined,
431
+ style: 'dotted',
432
+ width: '1px',
433
+ } );
434
+ } );
435
+ } );
436
+ } );