@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,98 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import type { Border, ColorProps, LabelProps } from '../border-control/types';
5
+
6
+ export type Borders = {
7
+ top?: Border;
8
+ right?: Border;
9
+ bottom?: Border;
10
+ left?: Border;
11
+ };
12
+
13
+ export type AnyBorder = Border | Borders | undefined;
14
+ export type BorderProp = keyof Border;
15
+ export type BorderSide = keyof Borders;
16
+
17
+ export type PopoverClassNames = {
18
+ linked?: string;
19
+ top?: string;
20
+ right?: string;
21
+ bottom?: string;
22
+ left?: string;
23
+ };
24
+
25
+ export type BorderBoxControlProps = ColorProps &
26
+ LabelProps & {
27
+ /**
28
+ * This controls whether to support border style selections.
29
+ */
30
+ enableStyle?: boolean;
31
+ /**
32
+ * A callback function invoked when any border value is changed. The value
33
+ * received may be a "flat" border object, one that has properties defining
34
+ * individual side borders, or `undefined`.
35
+ */
36
+ onChange: ( value: AnyBorder ) => void;
37
+ /**
38
+ * An object defining CSS classnames for all the inner `BorderControl`
39
+ * popover content.
40
+ */
41
+ popoverClassNames?: PopoverClassNames;
42
+ /**
43
+ * An object representing the current border configuration.
44
+ *
45
+ * This may be a "flat" border where the object has `color`, `style`, and
46
+ * `width` properties or a "split" border which defines the previous
47
+ * properties but for each side; `top`, `right`, `bottom`, and `left`.
48
+ */
49
+ value: AnyBorder;
50
+ };
51
+
52
+ export type LinkedButtonProps = {
53
+ /**
54
+ * This prop allows the `LinkedButton` to reflect whether the parent
55
+ * `BorderBoxControl` is currently displaying "linked" or "unlinked"
56
+ * border controls.
57
+ */
58
+ isLinked: boolean;
59
+ /**
60
+ * A callback invoked when this `LinkedButton` is clicked. It is used to
61
+ * toggle display between linked or split border controls within the parent
62
+ * `BorderBoxControl`.
63
+ */
64
+ onClick: () => void;
65
+ };
66
+
67
+ export type VisualizerProps = {
68
+ /**
69
+ * An object representing the current border configuration. It contains
70
+ * properties for each side, with each side an object reflecting the border
71
+ * color, style, and width.
72
+ */
73
+ value?: Borders;
74
+ };
75
+
76
+ export type SplitControlsProps = ColorProps & {
77
+ /**
78
+ * This controls whether to include border style options within the
79
+ * individual `BorderControl` components.
80
+ */
81
+ enableStyle?: boolean;
82
+ /**
83
+ * A callback that is invoked whenever an individual side's border has
84
+ * changed.
85
+ */
86
+ onChange: ( value: Border | undefined, side: BorderSide ) => void;
87
+ /**
88
+ * An object defining CSS classnames for the split side `BorderControl`s'
89
+ * popover content.
90
+ */
91
+ popoverClassNames?: PopoverClassNames;
92
+ /**
93
+ * An object representing the current border configuration. It contains
94
+ * properties for each side, with each side an object reflecting the border
95
+ * color, style, and width.
96
+ */
97
+ value?: Borders;
98
+ };
@@ -0,0 +1,151 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import type { CSSProperties } from 'react';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import type { Border } from '../border-control/types';
10
+ import type { AnyBorder, Borders, BorderProp, BorderSide } from './types';
11
+
12
+ const sides: BorderSide[] = [ 'top', 'right', 'bottom', 'left' ];
13
+ const borderProps: BorderProp[] = [ 'color', 'style', 'width' ];
14
+
15
+ export const isEmptyBorder = ( border?: Border ) => {
16
+ if ( ! border ) {
17
+ return true;
18
+ }
19
+ return ! borderProps.some( ( prop ) => border[ prop ] !== undefined );
20
+ };
21
+
22
+ export const isDefinedBorder = ( border: AnyBorder ) => {
23
+ // No border, no worries :)
24
+ if ( ! border ) {
25
+ return false;
26
+ }
27
+
28
+ // If we have individual borders per side within the border object we
29
+ // need to check whether any of those side borders have been set.
30
+ if ( hasSplitBorders( border ) ) {
31
+ const allSidesEmpty = sides.every( ( side ) =>
32
+ isEmptyBorder( ( border as Borders )[ side ] )
33
+ );
34
+
35
+ return ! allSidesEmpty;
36
+ }
37
+
38
+ // If we have a top-level border only, check if that is empty. e.g.
39
+ // { color: undefined, style: undefined, width: undefined }
40
+ // Border radius can still be set within the border object as it is
41
+ // handled separately.
42
+ return ! isEmptyBorder( border as Border );
43
+ };
44
+
45
+ export const isCompleteBorder = ( border?: Border ) => {
46
+ if ( ! border ) {
47
+ return false;
48
+ }
49
+
50
+ return borderProps.every( ( prop ) => border[ prop ] !== undefined );
51
+ };
52
+
53
+ export const hasSplitBorders = ( border: AnyBorder = {} ) => {
54
+ return Object.keys( border ).some(
55
+ ( side ) => sides.indexOf( side as BorderSide ) !== -1
56
+ );
57
+ };
58
+
59
+ export const hasMixedBorders = ( borders: AnyBorder ) => {
60
+ if ( ! hasSplitBorders( borders ) ) {
61
+ return false;
62
+ }
63
+
64
+ const shorthandBorders = sides.map( ( side: BorderSide ) =>
65
+ getShorthandBorderStyle( ( borders as Borders )?.[ side ] )
66
+ );
67
+
68
+ return ! shorthandBorders.every(
69
+ ( border ) => border === shorthandBorders[ 0 ]
70
+ );
71
+ };
72
+
73
+ export const getSplitBorders = ( border?: Border ) => {
74
+ if ( ! border || isEmptyBorder( border ) ) {
75
+ return undefined;
76
+ }
77
+
78
+ return {
79
+ top: border,
80
+ right: border,
81
+ bottom: border,
82
+ left: border,
83
+ };
84
+ };
85
+
86
+ export const getBorderDiff = ( original: Border, updated: Border ) => {
87
+ const diff: Border = {};
88
+
89
+ if ( original.color !== updated.color ) {
90
+ diff.color = updated.color;
91
+ }
92
+
93
+ if ( original.style !== updated.style ) {
94
+ diff.style = updated.style;
95
+ }
96
+
97
+ if ( original.width !== updated.width ) {
98
+ diff.width = updated.width;
99
+ }
100
+
101
+ return diff;
102
+ };
103
+
104
+ export const getCommonBorder = ( borders?: Borders ) => {
105
+ if ( ! borders ) {
106
+ return undefined;
107
+ }
108
+
109
+ const colors: ( CSSProperties[ 'borderColor' ] | undefined )[] = [];
110
+ const styles: ( CSSProperties[ 'borderStyle' ] | undefined )[] = [];
111
+ const widths: ( CSSProperties[ 'borderWidth' ] | undefined )[] = [];
112
+
113
+ sides.forEach( ( side ) => {
114
+ colors.push( borders[ side ]?.color );
115
+ styles.push( borders[ side ]?.style );
116
+ widths.push( borders[ side ]?.width );
117
+ } );
118
+
119
+ const allColorsMatch = colors.every( ( value ) => value === colors[ 0 ] );
120
+ const allStylesMatch = styles.every( ( value ) => value === styles[ 0 ] );
121
+ const allWidthsMatch = widths.every( ( value ) => value === widths[ 0 ] );
122
+
123
+ return {
124
+ color: allColorsMatch ? colors[ 0 ] : undefined,
125
+ style: allStylesMatch ? styles[ 0 ] : undefined,
126
+ width: allWidthsMatch ? widths[ 0 ] : undefined,
127
+ };
128
+ };
129
+
130
+ export const getShorthandBorderStyle = (
131
+ border?: Border,
132
+ fallbackBorder?: Border
133
+ ) => {
134
+ if ( isEmptyBorder( border ) ) {
135
+ return fallbackBorder;
136
+ }
137
+
138
+ const { color: fallbackColor, style: fallbackStyle, width: fallbackWidth } =
139
+ fallbackBorder || {};
140
+
141
+ const {
142
+ color = fallbackColor,
143
+ style = fallbackStyle,
144
+ width = fallbackWidth,
145
+ } = border as Border;
146
+
147
+ const hasVisibleBorder = ( !! width && width !== '0' ) || !! color;
148
+ const borderStyle = hasVisibleBorder ? style || 'solid' : style;
149
+
150
+ return [ width, borderStyle, color ].filter( Boolean ).join( ' ' );
151
+ };
@@ -0,0 +1,181 @@
1
+ # BorderControl
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
+ <br />
7
+ This component provides control over a border's color, style, and width.
8
+
9
+ ## Development guidelines
10
+
11
+ The `BorderControl` brings together internal sub-components which allow users to
12
+ set the various properties of a border. The first sub-component, a
13
+ `BorderDropdown` contains options representing border color and style. The
14
+ border width is controlled via a `UnitControl` and an optional `RangeControl`.
15
+
16
+ Border radius is not covered by this control as it may be desired separate to
17
+ color, style, and width. For example, the border radius may be absorbed under
18
+ a "shape" abstraction.
19
+
20
+ ## Usage
21
+
22
+ ```jsx
23
+ import { __experimentalBorderControl as BorderControl } from '@wordpress/components';
24
+ import { __ } from '@wordpress/i18n';
25
+
26
+ const colors = [
27
+ { name: 'Blue 20', color: '#72aee6' },
28
+ // ...
29
+ ];
30
+
31
+ const MyBorderControl = () => {
32
+ const [ border, setBorder ] = useState();
33
+ const onChange = ( newBorder ) => setBorder( newBorder );
34
+
35
+ return (
36
+ <BorderControl
37
+ colors={ colors }
38
+ label={ __( 'Border' ) }
39
+ onChange={ onChange }
40
+ value={ border }
41
+ />
42
+ );
43
+ };
44
+ ```
45
+
46
+ If you're using this component outside the editor, you can
47
+ [ensure `Tooltip` positioning](/packages/components/README.md#popovers-and-tooltips)
48
+ for the `BorderControl`'s color and style options, by rendering your
49
+ `BorderControl` with a `Popover.Slot` further up the element tree and within a
50
+ `SlotFillProvider` overall.
51
+
52
+ ## Props
53
+
54
+ ### `colors`: `Array`
55
+
56
+ An array of color definitions. This may also be a multi-dimensional array where
57
+ colors are organized by multiple origins.
58
+
59
+ Each color may be an object containing a `name` and `color` value.
60
+
61
+ - Required: No
62
+
63
+ ### `disableCustomColors`: `boolean`
64
+
65
+ This toggles the ability to choose custom colors.
66
+
67
+ - Required: No
68
+
69
+ ### `enableAlpha`: `boolean`
70
+
71
+ This controls whether the alpha channel will be offered when selecting
72
+ custom colors.
73
+
74
+ - Required: No
75
+
76
+ ### `enableStyle`: `boolean`
77
+
78
+ This controls whether to include border style options within the
79
+ `BorderDropdown` sub-component.
80
+
81
+ - Required: No
82
+ - Default: `true`
83
+
84
+ ### `hideLabelFromVision`: `boolean`
85
+
86
+ Provides control over whether the label will only be visible to screen readers.
87
+
88
+ - Required: No
89
+
90
+ ### `isCompact`: `boolean`
91
+
92
+ This flags the `BorderControl` to render with a more compact appearance. It
93
+ restricts the width of the control and prevents it from expanding to take up
94
+ additional space.
95
+
96
+ - Required: No
97
+
98
+ ### `label`: `string`
99
+
100
+ If provided, a label will be generated using this as the content.
101
+
102
+ _Whether it is visible only to screen readers is controlled via
103
+ `hideLabelFromVision`._
104
+
105
+ - Required: No
106
+
107
+ ### `onChange`: `( value?: Object ) => void`
108
+
109
+ A callback function invoked when the border value is changed via an interaction
110
+ that selects or clears, border color, style, or width.
111
+
112
+ _Note: the value may be `undefined` if a user clears all border properties._
113
+
114
+ - Required: Yes
115
+
116
+ ### `popoverContentClassName`: `string`
117
+
118
+ A custom CSS class name to be assigned to the `BorderControl`'s dropdown
119
+ popover content.
120
+
121
+ - Required: No
122
+
123
+ ### `shouldSanitizeBorder`: `boolean`
124
+
125
+ If opted into, sanitizing the border means that if no width or color have been
126
+ selected, the border style is also cleared and `undefined` is returned as the
127
+ new border value.
128
+
129
+ - Required: No
130
+ - Default: true
131
+
132
+ ### `showDropdownHeader`: `boolean`
133
+
134
+ Whether or not to render a header for the border color and style picker
135
+ dropdown. The header includes a label for the color picker and a close button.
136
+
137
+ - Required: No
138
+
139
+ ### `value`: `Object`
140
+
141
+ An object representing a border or `undefined`. Used to set the current border
142
+ configuration for this component.
143
+
144
+ Example:
145
+ ```js
146
+ {
147
+ color: '#72aee6',
148
+ style: 'solid',
149
+ width: '2px,
150
+ }
151
+ ```
152
+
153
+ - Required: No
154
+
155
+ ### `width`: `CSSProperties[ 'width' ]`
156
+
157
+ Controls the visual width of the `BorderControl`. It has no effect if the
158
+ `isCompact` prop is set to `true`.
159
+
160
+ - Required: No
161
+
162
+ ### `withSlider`: `boolean`
163
+
164
+ Flags whether this `BorderControl` should also render a `RangeControl` for
165
+ additional control over a border's width.
166
+
167
+ - Required: No
168
+
169
+ ### `__experimentalHasMultipleOrigins`: `boolean`
170
+
171
+ This is passed on to the color related sub-components which need to be made
172
+ aware of whether the colors prop contains multiple origins.
173
+
174
+ - Required: No
175
+
176
+ ### `__experimentalIsRenderedInSidebar`: `boolean`
177
+
178
+ This is passed on to the color related sub-components so they may render more
179
+ effectively when used within a sidebar.
180
+
181
+ - Required: No
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import BorderControlDropdown from '../border-control-dropdown';
5
+ import UnitControl from '../../unit-control';
6
+ import RangeControl from '../../range-control';
7
+ import { HStack } from '../../h-stack';
8
+ import { StyledLabel } from '../../base-control/styles/base-control-styles';
9
+ import { View } from '../../view';
10
+ import { VisuallyHidden } from '../../visually-hidden';
11
+ import { contextConnect, WordPressComponentProps } from '../../ui/context';
12
+ import { useBorderControl } from './hook';
13
+
14
+ import type { BorderControlProps, LabelProps } from '../types';
15
+
16
+ const BorderLabel = ( props: LabelProps ) => {
17
+ const { label, hideLabelFromVision } = props;
18
+
19
+ if ( ! label ) {
20
+ return null;
21
+ }
22
+
23
+ return hideLabelFromVision ? (
24
+ <VisuallyHidden as="label">{ label }</VisuallyHidden>
25
+ ) : (
26
+ <StyledLabel>{ label }</StyledLabel>
27
+ );
28
+ };
29
+
30
+ const BorderControl = (
31
+ props: WordPressComponentProps< BorderControlProps, 'div' >,
32
+ forwardedRef: React.ForwardedRef< any >
33
+ ) => {
34
+ const {
35
+ colors,
36
+ disableCustomColors,
37
+ enableAlpha,
38
+ enableStyle = true,
39
+ hideLabelFromVision,
40
+ innerWrapperClassName,
41
+ label,
42
+ onBorderChange,
43
+ onSliderChange,
44
+ onWidthChange,
45
+ placeholder,
46
+ popoverContentClassName,
47
+ previousStyleSelection,
48
+ showDropdownHeader,
49
+ sliderClassName,
50
+ value: border,
51
+ widthControlClassName,
52
+ widthUnit,
53
+ widthValue,
54
+ withSlider,
55
+ __experimentalHasMultipleOrigins,
56
+ __experimentalIsRenderedInSidebar,
57
+ ...otherProps
58
+ } = useBorderControl( props );
59
+
60
+ return (
61
+ <View { ...otherProps } ref={ forwardedRef }>
62
+ <BorderLabel
63
+ label={ label }
64
+ hideLabelFromVision={ hideLabelFromVision }
65
+ />
66
+ <HStack spacing={ 3 }>
67
+ <HStack className={ innerWrapperClassName } alignment="stretch">
68
+ <BorderControlDropdown
69
+ border={ border }
70
+ colors={ colors }
71
+ contentClassName={ popoverContentClassName }
72
+ disableCustomColors={ disableCustomColors }
73
+ enableAlpha={ enableAlpha }
74
+ enableStyle={ enableStyle }
75
+ onChange={ onBorderChange }
76
+ previousStyleSelection={ previousStyleSelection }
77
+ showDropdownHeader={ showDropdownHeader }
78
+ __experimentalHasMultipleOrigins={
79
+ __experimentalHasMultipleOrigins
80
+ }
81
+ __experimentalIsRenderedInSidebar={
82
+ __experimentalIsRenderedInSidebar
83
+ }
84
+ />
85
+ <UnitControl
86
+ className={ widthControlClassName }
87
+ min={ 0 }
88
+ onChange={ onWidthChange }
89
+ value={ border?.width || '' }
90
+ placeholder={ placeholder }
91
+ />
92
+ </HStack>
93
+ { withSlider && (
94
+ <RangeControl
95
+ className={ sliderClassName }
96
+ initialPosition={ 0 }
97
+ max={ 100 }
98
+ min={ 0 }
99
+ onChange={ onSliderChange }
100
+ step={ [ 'px', '%' ].includes( widthUnit ) ? 1 : 0.1 }
101
+ value={ widthValue || undefined }
102
+ withInputField={ false }
103
+ />
104
+ ) }
105
+ </HStack>
106
+ </View>
107
+ );
108
+ };
109
+
110
+ const ConnectedBorderControl = contextConnect( BorderControl, 'BorderControl' );
111
+
112
+ export default ConnectedBorderControl;
@@ -0,0 +1,145 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useCallback, useMemo, useState } from '@wordpress/element';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import * as styles from '../styles';
10
+ import { parseQuantityAndUnitFromRawValue } from '../../unit-control/utils';
11
+ import { useContextSystem, WordPressComponentProps } from '../../ui/context';
12
+ import { useCx } from '../../utils/hooks/use-cx';
13
+
14
+ import type { Border, BorderControlProps } from '../types';
15
+
16
+ const sanitizeBorder = ( border?: Border ) => {
17
+ const hasNoWidth = border?.width === undefined || border.width === '';
18
+ const hasNoColor = border?.color === undefined;
19
+
20
+ // If width and color are undefined, unset any style selection as well.
21
+ if ( hasNoWidth && hasNoColor ) {
22
+ return undefined;
23
+ }
24
+
25
+ return border;
26
+ };
27
+
28
+ export function useBorderControl(
29
+ props: WordPressComponentProps< BorderControlProps, 'div' >
30
+ ) {
31
+ const {
32
+ className,
33
+ isCompact,
34
+ onChange,
35
+ shouldSanitizeBorder = true,
36
+ value: border,
37
+ width,
38
+ ...otherProps
39
+ } = useContextSystem( props, 'BorderControl' );
40
+
41
+ const [ widthValue, originalWidthUnit ] = parseQuantityAndUnitFromRawValue(
42
+ border?.width
43
+ );
44
+ const widthUnit = originalWidthUnit || 'px';
45
+ const hadPreviousZeroWidth = widthValue === 0;
46
+
47
+ const [ colorSelection, setColorSelection ] = useState< string >();
48
+ const [ styleSelection, setStyleSelection ] = useState< string >();
49
+
50
+ const onBorderChange = useCallback(
51
+ ( newBorder?: Border ) => {
52
+ if ( shouldSanitizeBorder ) {
53
+ return onChange( sanitizeBorder( newBorder ) );
54
+ }
55
+
56
+ onChange( newBorder );
57
+ },
58
+ [ onChange, shouldSanitizeBorder, sanitizeBorder ]
59
+ );
60
+
61
+ const onWidthChange = useCallback(
62
+ ( newWidth?: string ) => {
63
+ const newWidthValue = newWidth === '' ? undefined : newWidth;
64
+ const [ parsedValue ] = parseQuantityAndUnitFromRawValue(
65
+ newWidth
66
+ );
67
+ const hasZeroWidth = parsedValue === 0;
68
+
69
+ const updatedBorder = { ...border, width: newWidthValue };
70
+
71
+ // Setting the border width explicitly to zero will also set the
72
+ // border style to `none` and clear the border color.
73
+ if ( hasZeroWidth && ! hadPreviousZeroWidth ) {
74
+ // Before clearing the color and style selections, keep track of
75
+ // the current selections so they can be restored when the width
76
+ // changes to a non-zero value.
77
+ setColorSelection( border?.color );
78
+ setStyleSelection( border?.style );
79
+
80
+ // Clear the color and style border properties.
81
+ updatedBorder.color = undefined;
82
+ updatedBorder.style = 'none';
83
+ }
84
+
85
+ // Selection has changed from zero border width to non-zero width.
86
+ if ( ! hasZeroWidth && hadPreviousZeroWidth ) {
87
+ // Restore previous border color and style selections if width
88
+ // is now not zero.
89
+ if ( updatedBorder.color === undefined ) {
90
+ updatedBorder.color = colorSelection;
91
+ }
92
+ if ( updatedBorder.style === 'none' ) {
93
+ updatedBorder.style = styleSelection;
94
+ }
95
+ }
96
+
97
+ onBorderChange( updatedBorder );
98
+ },
99
+ [ border, hadPreviousZeroWidth, onBorderChange ]
100
+ );
101
+
102
+ const onSliderChange = useCallback(
103
+ ( value: string ) => {
104
+ onWidthChange( `${ value }${ widthUnit }` );
105
+ },
106
+ [ onWidthChange, widthUnit ]
107
+ );
108
+
109
+ // Generate class names.
110
+ const cx = useCx();
111
+ const classes = useMemo( () => {
112
+ return cx( styles.borderControl, className );
113
+ }, [ className, cx ] );
114
+
115
+ const innerWrapperClassName = useMemo( () => {
116
+ const wrapperWidth = isCompact ? '90px' : width;
117
+ const widthStyle =
118
+ !! wrapperWidth && styles.wrapperWidth( wrapperWidth );
119
+
120
+ return cx( styles.innerWrapper(), widthStyle );
121
+ }, [ isCompact, width, cx ] );
122
+
123
+ const widthControlClassName = useMemo( () => {
124
+ return cx( styles.borderWidthControl() );
125
+ }, [ cx ] );
126
+
127
+ const sliderClassName = useMemo( () => {
128
+ return cx( styles.borderSlider() );
129
+ }, [ cx ] );
130
+
131
+ return {
132
+ ...otherProps,
133
+ className: classes,
134
+ innerWrapperClassName,
135
+ onBorderChange,
136
+ onSliderChange,
137
+ onWidthChange,
138
+ previousStyleSelection: styleSelection,
139
+ sliderClassName,
140
+ value: border,
141
+ widthControlClassName,
142
+ widthUnit,
143
+ widthValue,
144
+ };
145
+ }
@@ -0,0 +1,2 @@
1
+ export { default as BorderControl } from './component';
2
+ export { useBorderControl } from './hook';