@wordpress/components 19.6.1 → 19.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (514) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +38 -0
  3. package/build/base-control/index.js +41 -32
  4. package/build/base-control/index.js.map +1 -1
  5. package/build/base-control/styles/base-control-styles.js +43 -22
  6. package/build/base-control/styles/base-control-styles.js.map +1 -1
  7. package/build/base-control/types.js +6 -0
  8. package/build/base-control/types.js.map +1 -0
  9. package/build/border-box-control/border-box-control/component.js +124 -0
  10. package/build/border-box-control/border-box-control/component.js.map +1 -0
  11. package/build/border-box-control/border-box-control/hook.js +113 -0
  12. package/build/border-box-control/border-box-control/hook.js.map +1 -0
  13. package/build/border-box-control/border-box-control/index.js +24 -0
  14. package/build/border-box-control/border-box-control/index.js.map +1 -0
  15. package/build/border-box-control/border-box-control-linked-button/component.js +59 -0
  16. package/build/border-box-control/border-box-control-linked-button/component.js.map +1 -0
  17. package/build/border-box-control/border-box-control-linked-button/hook.js +41 -0
  18. package/build/border-box-control/border-box-control-linked-button/hook.js.map +1 -0
  19. package/build/border-box-control/border-box-control-linked-button/index.js +16 -0
  20. package/build/border-box-control/border-box-control-linked-button/index.js.map +1 -0
  21. package/build/border-box-control/border-box-control-split-controls/component.js +93 -0
  22. package/build/border-box-control/border-box-control-split-controls/component.js.map +1 -0
  23. package/build/border-box-control/border-box-control-split-controls/hook.js +45 -0
  24. package/build/border-box-control/border-box-control-split-controls/hook.js.map +1 -0
  25. package/build/border-box-control/border-box-control-split-controls/index.js +16 -0
  26. package/build/border-box-control/border-box-control-split-controls/index.js.map +1 -0
  27. package/build/border-box-control/border-box-control-visualizer/component.js +40 -0
  28. package/build/border-box-control/border-box-control-visualizer/component.js.map +1 -0
  29. package/build/border-box-control/border-box-control-visualizer/hook.js +43 -0
  30. package/build/border-box-control/border-box-control-visualizer/hook.js.map +1 -0
  31. package/build/border-box-control/border-box-control-visualizer/index.js +16 -0
  32. package/build/border-box-control/border-box-control-visualizer/index.js.map +1 -0
  33. package/build/border-box-control/index.js +44 -0
  34. package/build/border-box-control/index.js.map +1 -0
  35. package/build/border-box-control/styles.js +76 -0
  36. package/build/border-box-control/styles.js.map +1 -0
  37. package/build/border-box-control/types.js +6 -0
  38. package/build/border-box-control/types.js.map +1 -0
  39. package/build/border-box-control/utils.js +161 -0
  40. package/build/border-box-control/utils.js.map +1 -0
  41. package/build/border-control/border-control/component.js +119 -0
  42. package/build/border-control/border-control/component.js.map +1 -0
  43. package/build/border-control/border-control/hook.js +130 -0
  44. package/build/border-control/border-control/hook.js.map +1 -0
  45. package/build/border-control/border-control/index.js +24 -0
  46. package/build/border-control/border-control/index.js.map +1 -0
  47. package/build/border-control/border-control-dropdown/component.js +196 -0
  48. package/build/border-control/border-control-dropdown/component.js.map +1 -0
  49. package/build/border-control/border-control-dropdown/hook.js +105 -0
  50. package/build/border-control/border-control-dropdown/hook.js.map +1 -0
  51. package/build/border-control/border-control-dropdown/index.js +16 -0
  52. package/build/border-control/border-control-dropdown/index.js.map +1 -0
  53. package/build/border-control/border-control-style-picker/component.js +101 -0
  54. package/build/border-control/border-control-style-picker/component.js.map +1 -0
  55. package/build/border-control/border-control-style-picker/hook.js +45 -0
  56. package/build/border-control/border-control-style-picker/hook.js.map +1 -0
  57. package/build/border-control/border-control-style-picker/index.js +16 -0
  58. package/build/border-control/border-control-style-picker/index.js.map +1 -0
  59. package/build/border-control/index.js +24 -0
  60. package/build/border-control/index.js.map +1 -0
  61. package/build/border-control/styles.js +125 -0
  62. package/build/border-control/styles.js.map +1 -0
  63. package/build/border-control/types.js +6 -0
  64. package/build/border-control/types.js.map +1 -0
  65. package/build/box-control/all-input-control.js +3 -7
  66. package/build/box-control/all-input-control.js.map +1 -1
  67. package/build/box-control/axial-input-controls.js +20 -15
  68. package/build/box-control/axial-input-controls.js.map +1 -1
  69. package/build/box-control/input-controls.js +21 -16
  70. package/build/box-control/input-controls.js.map +1 -1
  71. package/build/box-control/utils.js +25 -11
  72. package/build/box-control/utils.js.map +1 -1
  73. package/build/card/styles.js +22 -17
  74. package/build/card/styles.js.map +1 -1
  75. package/build/checkbox-control/index.js +21 -1
  76. package/build/checkbox-control/index.js.map +1 -1
  77. package/build/color-palette/index.js +53 -4
  78. package/build/color-palette/index.js.map +1 -1
  79. package/build/custom-select-control/index.js +12 -4
  80. package/build/custom-select-control/index.js.map +1 -1
  81. package/build/divider/styles.js +28 -16
  82. package/build/divider/styles.js.map +1 -1
  83. package/build/focal-point-picker/controls.js +2 -3
  84. package/build/focal-point-picker/controls.js.map +1 -1
  85. package/build/form-file-upload/index.js +4 -1
  86. package/build/form-file-upload/index.js.map +1 -1
  87. package/build/index.js +40 -0
  88. package/build/index.js.map +1 -1
  89. package/build/input-control/input-field.js +21 -14
  90. package/build/input-control/input-field.js.map +1 -1
  91. package/build/input-control/reducer/actions.js +1 -3
  92. package/build/input-control/reducer/actions.js.map +1 -1
  93. package/build/input-control/reducer/reducer.js +1 -43
  94. package/build/input-control/reducer/reducer.js.map +1 -1
  95. package/build/item-group/styles.js +14 -14
  96. package/build/item-group/styles.js.map +1 -1
  97. package/build/mobile/picker/index.android.js +0 -3
  98. package/build/mobile/picker/index.android.js.map +1 -1
  99. package/build/number-control/index.js +15 -10
  100. package/build/number-control/index.js.map +1 -1
  101. package/build/resizable-box/resize-tooltip/styles/resize-tooltip.styles.js +4 -4
  102. package/build/resizable-box/resize-tooltip/styles/resize-tooltip.styles.js.map +1 -1
  103. package/build/surface/styles.js +8 -8
  104. package/build/surface/styles.js.map +1 -1
  105. package/build/toggle-group-control/index.js +8 -0
  106. package/build/toggle-group-control/index.js.map +1 -1
  107. package/build/toggle-group-control/toggle-group-control/component.js +10 -1
  108. package/build/toggle-group-control/toggle-group-control/component.js.map +1 -1
  109. package/build/toggle-group-control/toggle-group-control/styles.js +14 -3
  110. package/build/toggle-group-control/toggle-group-control/styles.js.map +1 -1
  111. package/build/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.js +90 -0
  112. package/build/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.js.map +1 -0
  113. package/build/toggle-group-control/toggle-group-control-option/component.js +9 -87
  114. package/build/toggle-group-control/toggle-group-control-option/component.js.map +1 -1
  115. package/build/toggle-group-control/toggle-group-control-option-base/component.js +127 -0
  116. package/build/toggle-group-control/toggle-group-control-option-base/component.js.map +1 -0
  117. package/build/toggle-group-control/toggle-group-control-option-base/index.js +16 -0
  118. package/build/toggle-group-control/toggle-group-control-option-base/index.js.map +1 -0
  119. package/build/toggle-group-control/toggle-group-control-option-base/styles.js +66 -0
  120. package/build/toggle-group-control/toggle-group-control-option-base/styles.js.map +1 -0
  121. package/build/toggle-group-control/toggle-group-control-option-icon/component.js +55 -0
  122. package/build/toggle-group-control/toggle-group-control-option-icon/component.js.map +1 -0
  123. package/build/toggle-group-control/toggle-group-control-option-icon/index.js +16 -0
  124. package/build/toggle-group-control/toggle-group-control-option-icon/index.js.map +1 -0
  125. package/build/toolbar-dropdown-menu/index.js +1 -1
  126. package/build/toolbar-dropdown-menu/index.js.map +1 -1
  127. package/build/unit-control/index.js +56 -29
  128. package/build/unit-control/index.js.map +1 -1
  129. package/build/unit-control/unit-select-control.js +2 -4
  130. package/build/unit-control/unit-select-control.js.map +1 -1
  131. package/build/utils/colors-values.js +5 -3
  132. package/build/utils/colors-values.js.map +1 -1
  133. package/build/utils/config-values.js +9 -4
  134. package/build/utils/config-values.js.map +1 -1
  135. package/build-module/base-control/index.js +39 -35
  136. package/build-module/base-control/index.js.map +1 -1
  137. package/build-module/base-control/styles/base-control-styles.js +44 -16
  138. package/build-module/base-control/styles/base-control-styles.js.map +1 -1
  139. package/build-module/base-control/types.js +2 -0
  140. package/build-module/base-control/types.js.map +1 -0
  141. package/build-module/border-box-control/border-box-control/component.js +104 -0
  142. package/build-module/border-box-control/border-box-control/component.js.map +1 -0
  143. package/build-module/border-box-control/border-box-control/hook.js +97 -0
  144. package/build-module/border-box-control/border-box-control/hook.js.map +1 -0
  145. package/build-module/border-box-control/border-box-control/index.js +3 -0
  146. package/build-module/border-box-control/border-box-control/index.js.map +1 -0
  147. package/build-module/border-box-control/border-box-control-linked-button/component.js +42 -0
  148. package/build-module/border-box-control/border-box-control-linked-button/component.js.map +1 -0
  149. package/build-module/border-box-control/border-box-control-linked-button/hook.js +26 -0
  150. package/build-module/border-box-control/border-box-control-linked-button/hook.js.map +1 -0
  151. package/build-module/border-box-control/border-box-control-linked-button/index.js +2 -0
  152. package/build-module/border-box-control/border-box-control-linked-button/index.js.map +1 -0
  153. package/build-module/border-box-control/border-box-control-split-controls/component.js +77 -0
  154. package/build-module/border-box-control/border-box-control-split-controls/component.js.map +1 -0
  155. package/build-module/border-box-control/border-box-control-split-controls/hook.js +30 -0
  156. package/build-module/border-box-control/border-box-control-split-controls/hook.js.map +1 -0
  157. package/build-module/border-box-control/border-box-control-split-controls/index.js +2 -0
  158. package/build-module/border-box-control/border-box-control-split-controls/index.js.map +1 -0
  159. package/build-module/border-box-control/border-box-control-visualizer/component.js +27 -0
  160. package/build-module/border-box-control/border-box-control-visualizer/component.js.map +1 -0
  161. package/build-module/border-box-control/border-box-control-visualizer/hook.js +28 -0
  162. package/build-module/border-box-control/border-box-control-visualizer/hook.js.map +1 -0
  163. package/build-module/border-box-control/border-box-control-visualizer/index.js +2 -0
  164. package/build-module/border-box-control/border-box-control-visualizer/index.js.map +1 -0
  165. package/build-module/border-box-control/index.js +4 -0
  166. package/build-module/border-box-control/index.js.map +1 -0
  167. package/build-module/border-box-control/styles.js +66 -0
  168. package/build-module/border-box-control/styles.js.map +1 -0
  169. package/build-module/border-box-control/types.js +2 -0
  170. package/build-module/border-box-control/types.js.map +1 -0
  171. package/build-module/border-box-control/utils.js +127 -0
  172. package/build-module/border-box-control/utils.js.map +1 -0
  173. package/build-module/border-control/border-control/component.js +100 -0
  174. package/build-module/border-control/border-control/component.js.map +1 -0
  175. package/build-module/border-control/border-control/hook.js +115 -0
  176. package/build-module/border-control/border-control/hook.js.map +1 -0
  177. package/build-module/border-control/border-control/index.js +3 -0
  178. package/build-module/border-control/border-control/index.js.map +1 -0
  179. package/build-module/border-control/border-control-dropdown/component.js +174 -0
  180. package/build-module/border-control/border-control-dropdown/component.js.map +1 -0
  181. package/build-module/border-control/border-control-dropdown/hook.js +89 -0
  182. package/build-module/border-control/border-control-dropdown/hook.js.map +1 -0
  183. package/build-module/border-control/border-control-dropdown/index.js +2 -0
  184. package/build-module/border-control/border-control-dropdown/index.js.map +1 -0
  185. package/build-module/border-control/border-control-style-picker/component.js +81 -0
  186. package/build-module/border-control/border-control-style-picker/component.js.map +1 -0
  187. package/build-module/border-control/border-control-style-picker/hook.js +30 -0
  188. package/build-module/border-control/border-control-style-picker/hook.js.map +1 -0
  189. package/build-module/border-control/border-control-style-picker/index.js +2 -0
  190. package/build-module/border-control/border-control-style-picker/index.js.map +1 -0
  191. package/build-module/border-control/index.js +3 -0
  192. package/build-module/border-control/index.js.map +1 -0
  193. package/build-module/border-control/styles.js +90 -0
  194. package/build-module/border-control/styles.js.map +1 -0
  195. package/build-module/border-control/types.js +2 -0
  196. package/build-module/border-control/types.js.map +1 -0
  197. package/build-module/box-control/all-input-control.js +4 -8
  198. package/build-module/box-control/all-input-control.js.map +1 -1
  199. package/build-module/box-control/axial-input-controls.js +18 -14
  200. package/build-module/box-control/axial-input-controls.js.map +1 -1
  201. package/build-module/box-control/input-controls.js +18 -14
  202. package/build-module/box-control/input-controls.js.map +1 -1
  203. package/build-module/box-control/utils.js +25 -11
  204. package/build-module/box-control/utils.js.map +1 -1
  205. package/build-module/card/styles.js +23 -18
  206. package/build-module/card/styles.js.map +1 -1
  207. package/build-module/checkbox-control/index.js +24 -3
  208. package/build-module/checkbox-control/index.js.map +1 -1
  209. package/build-module/color-palette/index.js +52 -4
  210. package/build-module/color-palette/index.js.map +1 -1
  211. package/build-module/custom-select-control/index.js +12 -4
  212. package/build-module/custom-select-control/index.js.map +1 -1
  213. package/build-module/divider/styles.js +29 -10
  214. package/build-module/divider/styles.js.map +1 -1
  215. package/build-module/focal-point-picker/controls.js +2 -3
  216. package/build-module/focal-point-picker/controls.js.map +1 -1
  217. package/build-module/form-file-upload/index.js +4 -1
  218. package/build-module/form-file-upload/index.js.map +1 -1
  219. package/build-module/index.js +3 -1
  220. package/build-module/index.js.map +1 -1
  221. package/build-module/input-control/input-field.js +21 -13
  222. package/build-module/input-control/input-field.js.map +1 -1
  223. package/build-module/input-control/reducer/actions.js +0 -1
  224. package/build-module/input-control/reducer/actions.js.map +1 -1
  225. package/build-module/input-control/reducer/reducer.js +2 -39
  226. package/build-module/input-control/reducer/reducer.js.map +1 -1
  227. package/build-module/item-group/styles.js +14 -14
  228. package/build-module/item-group/styles.js.map +1 -1
  229. package/build-module/mobile/picker/index.android.js +0 -3
  230. package/build-module/mobile/picker/index.android.js.map +1 -1
  231. package/build-module/number-control/index.js +15 -9
  232. package/build-module/number-control/index.js.map +1 -1
  233. package/build-module/resizable-box/resize-tooltip/styles/resize-tooltip.styles.js +4 -4
  234. package/build-module/resizable-box/resize-tooltip/styles/resize-tooltip.styles.js.map +1 -1
  235. package/build-module/surface/styles.js +8 -8
  236. package/build-module/surface/styles.js.map +1 -1
  237. package/build-module/toggle-group-control/index.js +1 -0
  238. package/build-module/toggle-group-control/index.js.map +1 -1
  239. package/build-module/toggle-group-control/toggle-group-control/component.js +8 -1
  240. package/build-module/toggle-group-control/toggle-group-control/component.js.map +1 -1
  241. package/build-module/toggle-group-control/toggle-group-control/styles.js +11 -3
  242. package/build-module/toggle-group-control/toggle-group-control/styles.js.map +1 -1
  243. package/build-module/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.js +86 -0
  244. package/build-module/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.js.map +1 -0
  245. package/build-module/toggle-group-control/toggle-group-control-option/component.js +9 -76
  246. package/build-module/toggle-group-control/toggle-group-control-option/component.js.map +1 -1
  247. package/build-module/toggle-group-control/toggle-group-control-option-base/component.js +105 -0
  248. package/build-module/toggle-group-control/toggle-group-control-option-base/component.js.map +1 -0
  249. package/build-module/toggle-group-control/toggle-group-control-option-base/index.js +2 -0
  250. package/build-module/toggle-group-control/toggle-group-control-option-base/index.js.map +1 -0
  251. package/build-module/toggle-group-control/toggle-group-control-option-base/styles.js +55 -0
  252. package/build-module/toggle-group-control/toggle-group-control-option-base/styles.js.map +1 -0
  253. package/build-module/toggle-group-control/toggle-group-control-option-icon/component.js +50 -0
  254. package/build-module/toggle-group-control/toggle-group-control-option-icon/component.js.map +1 -0
  255. package/build-module/toggle-group-control/toggle-group-control-option-icon/index.js +2 -0
  256. package/build-module/toggle-group-control/toggle-group-control-option-icon/index.js.map +1 -0
  257. package/build-module/toolbar-dropdown-menu/index.js +1 -1
  258. package/build-module/toolbar-dropdown-menu/index.js.map +1 -1
  259. package/build-module/unit-control/index.js +54 -27
  260. package/build-module/unit-control/index.js.map +1 -1
  261. package/build-module/unit-control/unit-select-control.js +2 -3
  262. package/build-module/unit-control/unit-select-control.js.map +1 -1
  263. package/build-module/utils/colors-values.js +5 -3
  264. package/build-module/utils/colors-values.js.map +1 -1
  265. package/build-module/utils/config-values.js +8 -4
  266. package/build-module/utils/config-values.js.map +1 -1
  267. package/build-style/style-rtl.css +33 -182
  268. package/build-style/style.css +33 -182
  269. package/build-types/base-control/index.d.ts +35 -71
  270. package/build-types/base-control/index.d.ts.map +1 -1
  271. package/build-types/base-control/stories/index.d.ts +25 -0
  272. package/build-types/base-control/stories/index.d.ts.map +1 -0
  273. package/build-types/base-control/styles/base-control-styles.d.ts +10 -5
  274. package/build-types/base-control/styles/base-control-styles.d.ts.map +1 -1
  275. package/build-types/base-control/types.d.ts +41 -0
  276. package/build-types/base-control/types.d.ts.map +1 -0
  277. package/build-types/border-box-control/border-box-control/component.d.ts +4 -0
  278. package/build-types/border-box-control/border-box-control/component.d.ts.map +1 -0
  279. package/build-types/border-box-control/border-box-control/hook.d.ts +282 -0
  280. package/build-types/border-box-control/border-box-control/hook.d.ts.map +1 -0
  281. package/build-types/border-box-control/border-box-control/index.d.ts +3 -0
  282. package/build-types/border-box-control/border-box-control/index.d.ts.map +1 -0
  283. package/build-types/border-box-control/border-box-control-linked-button/component.d.ts +4 -0
  284. package/build-types/border-box-control/border-box-control-linked-button/component.d.ts.map +1 -0
  285. package/build-types/border-box-control/border-box-control-linked-button/hook.d.ts +266 -0
  286. package/build-types/border-box-control/border-box-control-linked-button/hook.d.ts.map +1 -0
  287. package/build-types/border-box-control/border-box-control-linked-button/index.d.ts +2 -0
  288. package/build-types/border-box-control/border-box-control-linked-button/index.d.ts.map +1 -0
  289. package/build-types/border-box-control/border-box-control-split-controls/component.d.ts +4 -0
  290. package/build-types/border-box-control/border-box-control-split-controls/component.d.ts.map +1 -0
  291. package/build-types/border-box-control/border-box-control-split-controls/hook.d.ts +274 -0
  292. package/build-types/border-box-control/border-box-control-split-controls/hook.d.ts.map +1 -0
  293. package/build-types/border-box-control/border-box-control-split-controls/index.d.ts +2 -0
  294. package/build-types/border-box-control/border-box-control-split-controls/index.d.ts.map +1 -0
  295. package/build-types/border-box-control/border-box-control-visualizer/component.d.ts +4 -0
  296. package/build-types/border-box-control/border-box-control-visualizer/component.d.ts.map +1 -0
  297. package/build-types/border-box-control/border-box-control-visualizer/hook.d.ts +266 -0
  298. package/build-types/border-box-control/border-box-control-visualizer/hook.d.ts.map +1 -0
  299. package/build-types/border-box-control/border-box-control-visualizer/index.d.ts +2 -0
  300. package/build-types/border-box-control/border-box-control-visualizer/index.d.ts.map +1 -0
  301. package/build-types/border-box-control/index.d.ts +4 -0
  302. package/build-types/border-box-control/index.d.ts.map +1 -0
  303. package/build-types/border-box-control/styles.d.ts +8 -0
  304. package/build-types/border-box-control/styles.d.ts.map +1 -0
  305. package/build-types/border-box-control/types.d.ts +91 -0
  306. package/build-types/border-box-control/types.d.ts.map +1 -0
  307. package/build-types/border-box-control/utils.d.ts +24 -0
  308. package/build-types/border-box-control/utils.d.ts.map +1 -0
  309. package/build-types/border-control/border-control/component.d.ts +4 -0
  310. package/build-types/border-control/border-control/component.d.ts.map +1 -0
  311. package/build-types/border-control/border-control/hook.d.ts +285 -0
  312. package/build-types/border-control/border-control/hook.d.ts.map +1 -0
  313. package/build-types/border-control/border-control/index.d.ts +3 -0
  314. package/build-types/border-control/border-control/index.d.ts.map +1 -0
  315. package/build-types/border-control/border-control-dropdown/component.d.ts +4 -0
  316. package/build-types/border-control/border-control-dropdown/component.d.ts.map +1 -0
  317. package/build-types/border-control/border-control-dropdown/hook.d.ts +280 -0
  318. package/build-types/border-control/border-control-dropdown/hook.d.ts.map +1 -0
  319. package/build-types/border-control/border-control-dropdown/index.d.ts +2 -0
  320. package/build-types/border-control/border-control-dropdown/index.d.ts.map +1 -0
  321. package/build-types/border-control/border-control-style-picker/component.d.ts +4 -0
  322. package/build-types/border-control/border-control-style-picker/component.d.ts.map +1 -0
  323. package/build-types/border-control/border-control-style-picker/hook.d.ts +269 -0
  324. package/build-types/border-control/border-control-style-picker/hook.d.ts.map +1 -0
  325. package/build-types/border-control/border-control-style-picker/index.d.ts +2 -0
  326. package/build-types/border-control/border-control-style-picker/index.d.ts.map +1 -0
  327. package/build-types/border-control/index.d.ts +3 -0
  328. package/build-types/border-control/index.d.ts.map +1 -0
  329. package/build-types/border-control/styles.d.ts +18 -0
  330. package/build-types/border-control/styles.d.ts.map +1 -0
  331. package/build-types/border-control/types.d.ts +163 -0
  332. package/build-types/border-control/types.d.ts.map +1 -0
  333. package/build-types/card/card-divider/hook.d.ts +1 -1
  334. package/build-types/card/styles.d.ts.map +1 -1
  335. package/build-types/color-indicator/index.d.ts +7 -0
  336. package/build-types/color-indicator/index.d.ts.map +1 -0
  337. package/build-types/color-palette/index.d.ts.map +1 -1
  338. package/build-types/color-picker/styles.d.ts +1 -1
  339. package/build-types/divider/stories/index.d.ts +1 -0
  340. package/build-types/divider/stories/index.d.ts.map +1 -1
  341. package/build-types/divider/styles.d.ts.map +1 -1
  342. package/build-types/divider/types.d.ts +8 -1
  343. package/build-types/divider/types.d.ts.map +1 -1
  344. package/build-types/input-control/input-field.d.ts.map +1 -1
  345. package/build-types/input-control/reducer/actions.d.ts +1 -3
  346. package/build-types/input-control/reducer/actions.d.ts.map +1 -1
  347. package/build-types/input-control/reducer/reducer.d.ts +3 -9
  348. package/build-types/input-control/reducer/reducer.d.ts.map +1 -1
  349. package/build-types/input-control/types.d.ts +2 -2
  350. package/build-types/input-control/types.d.ts.map +1 -1
  351. package/build-types/item-group/styles.d.ts.map +1 -1
  352. package/build-types/number-control/index.d.ts +3 -3
  353. package/build-types/number-control/index.d.ts.map +1 -1
  354. package/build-types/range-control/styles/range-control-styles.d.ts +1 -1
  355. package/build-types/resizable-box/resize-tooltip/styles/resize-tooltip.styles.d.ts.map +1 -1
  356. package/build-types/toggle-group-control/index.d.ts +1 -0
  357. package/build-types/toggle-group-control/index.d.ts.map +1 -1
  358. package/build-types/toggle-group-control/toggle-group-control/component.d.ts.map +1 -1
  359. package/build-types/toggle-group-control/toggle-group-control/styles.d.ts +5 -0
  360. package/build-types/toggle-group-control/toggle-group-control/styles.d.ts.map +1 -1
  361. package/build-types/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.d.ts +9 -0
  362. package/build-types/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.d.ts.map +1 -0
  363. package/build-types/toggle-group-control/toggle-group-control-option/component.d.ts +6 -2
  364. package/build-types/toggle-group-control/toggle-group-control-option/component.d.ts.map +1 -1
  365. package/build-types/toggle-group-control/toggle-group-control-option-base/component.d.ts +25 -0
  366. package/build-types/toggle-group-control/toggle-group-control-option-base/component.d.ts.map +1 -0
  367. package/build-types/toggle-group-control/toggle-group-control-option-base/index.d.ts +2 -0
  368. package/build-types/toggle-group-control/toggle-group-control-option-base/index.d.ts.map +1 -0
  369. package/build-types/toggle-group-control/{toggle-group-control-option → toggle-group-control-option-base}/styles.d.ts +0 -0
  370. package/build-types/toggle-group-control/toggle-group-control-option-base/styles.d.ts.map +1 -0
  371. package/build-types/toggle-group-control/toggle-group-control-option-icon/component.d.ts +37 -0
  372. package/build-types/toggle-group-control/toggle-group-control-option-icon/component.d.ts.map +1 -0
  373. package/build-types/toggle-group-control/toggle-group-control-option-icon/index.d.ts +2 -0
  374. package/build-types/toggle-group-control/toggle-group-control-option-icon/index.d.ts.map +1 -0
  375. package/build-types/toggle-group-control/types.d.ts +24 -8
  376. package/build-types/toggle-group-control/types.d.ts.map +1 -1
  377. package/build-types/ui/form-group/form-group.d.ts +2 -2
  378. package/build-types/unit-control/index.d.ts +12 -5
  379. package/build-types/unit-control/index.d.ts.map +1 -1
  380. package/build-types/unit-control/stories/index.d.ts +33 -0
  381. package/build-types/unit-control/stories/index.d.ts.map +1 -0
  382. package/build-types/unit-control/styles/unit-control-styles.d.ts +1 -1
  383. package/build-types/unit-control/types.d.ts +28 -7
  384. package/build-types/unit-control/types.d.ts.map +1 -1
  385. package/build-types/unit-control/unit-select-control.d.ts.map +1 -1
  386. package/build-types/utils/colors-values.d.ts +78 -18
  387. package/build-types/utils/colors-values.d.ts.map +1 -1
  388. package/build-types/utils/config-values.d.ts +71 -71
  389. package/build-types/utils/config-values.d.ts.map +1 -1
  390. package/package.json +17 -17
  391. package/src/animate/README.md +1 -1
  392. package/src/base-control/README.md +20 -12
  393. package/src/base-control/index.tsx +124 -0
  394. package/src/base-control/stories/index.tsx +80 -0
  395. package/src/base-control/styles/{base-control-styles.js → base-control-styles.ts} +23 -1
  396. package/src/base-control/types.ts +42 -0
  397. package/src/border-box-control/border-box-control/README.md +178 -0
  398. package/src/border-box-control/border-box-control/component.tsx +123 -0
  399. package/src/border-box-control/border-box-control/hook.ts +119 -0
  400. package/src/border-box-control/border-box-control/index.ts +2 -0
  401. package/src/border-box-control/border-box-control-linked-button/component.tsx +50 -0
  402. package/src/border-box-control/border-box-control-linked-button/hook.ts +30 -0
  403. package/src/border-box-control/border-box-control-linked-button/index.ts +1 -0
  404. package/src/border-box-control/border-box-control-split-controls/component.tsx +90 -0
  405. package/src/border-box-control/border-box-control-split-controls/hook.ts +34 -0
  406. package/src/border-box-control/border-box-control-split-controls/index.ts +1 -0
  407. package/src/border-box-control/border-box-control-visualizer/component.tsx +28 -0
  408. package/src/border-box-control/border-box-control-visualizer/hook.ts +30 -0
  409. package/src/border-box-control/border-box-control-visualizer/index.ts +1 -0
  410. package/src/border-box-control/index.ts +3 -0
  411. package/src/border-box-control/stories/index.js +104 -0
  412. package/src/border-box-control/styles.ts +69 -0
  413. package/src/border-box-control/test/index.js +354 -0
  414. package/src/border-box-control/test/utils.js +305 -0
  415. package/src/border-box-control/types.ts +98 -0
  416. package/src/border-box-control/utils.ts +151 -0
  417. package/src/border-control/border-control/README.md +181 -0
  418. package/src/border-control/border-control/component.tsx +112 -0
  419. package/src/border-control/border-control/hook.ts +145 -0
  420. package/src/border-control/border-control/index.ts +2 -0
  421. package/src/border-control/border-control-dropdown/component.tsx +252 -0
  422. package/src/border-control/border-control-dropdown/hook.ts +98 -0
  423. package/src/border-control/border-control-dropdown/index.ts +1 -0
  424. package/src/border-control/border-control-style-picker/component.tsx +89 -0
  425. package/src/border-control/border-control-style-picker/hook.ts +34 -0
  426. package/src/border-control/border-control-style-picker/index.ts +1 -0
  427. package/src/border-control/index.ts +2 -0
  428. package/src/border-control/stories/index.js +118 -0
  429. package/src/border-control/styles.ts +190 -0
  430. package/src/border-control/test/index.js +436 -0
  431. package/src/border-control/types.ts +173 -0
  432. package/src/box-control/all-input-control.js +2 -10
  433. package/src/box-control/axial-input-controls.js +32 -21
  434. package/src/box-control/input-controls.js +30 -19
  435. package/src/box-control/utils.js +29 -12
  436. package/src/card/styles.js +11 -5
  437. package/src/card/test/__snapshots__/index.js.snap +83 -66
  438. package/src/card/test/index.js +7 -5
  439. package/src/checkbox-control/index.js +34 -3
  440. package/src/checkbox-control/stories/index.js +44 -0
  441. package/src/checkbox-control/style.scss +4 -2
  442. package/src/color-palette/README.md +6 -0
  443. package/src/color-palette/index.js +73 -8
  444. package/src/color-palette/stories/index.js +69 -26
  445. package/src/color-palette/style.scss +11 -3
  446. package/src/color-palette/test/__snapshots__/index.js.snap +662 -12
  447. package/src/color-palette/test/index.js +1 -1
  448. package/src/custom-select-control/index.js +15 -3
  449. package/src/custom-select-control/stories/index.js +77 -74
  450. package/src/custom-select-control/style.scss +23 -4
  451. package/src/disabled/README.md +7 -10
  452. package/src/divider/stories/index.tsx +26 -23
  453. package/src/divider/styles.ts +9 -0
  454. package/src/divider/types.ts +11 -1
  455. package/src/flyout/test/__snapshots__/index.js.snap +7 -7
  456. package/src/focal-point-picker/controls.js +2 -3
  457. package/src/form-file-upload/README.md +18 -0
  458. package/src/form-file-upload/index.js +3 -0
  459. package/src/form-file-upload/test/index.js +73 -11
  460. package/src/form-toggle/README.md +1 -1
  461. package/src/index.js +8 -0
  462. package/src/input-control/input-field.tsx +23 -12
  463. package/src/input-control/reducer/actions.ts +1 -7
  464. package/src/input-control/reducer/reducer.ts +0 -29
  465. package/src/input-control/types.ts +2 -1
  466. package/src/item-group/styles.ts +1 -0
  467. package/src/item-group/test/__snapshots__/index.js.snap +11 -10
  468. package/src/mobile/picker/index.android.js +0 -1
  469. package/src/number-control/README.md +14 -0
  470. package/src/number-control/index.js +13 -12
  471. package/src/number-control/stories/index.js +14 -7
  472. package/src/number-control/test/index.js +79 -1
  473. package/src/range-control/stories/index.js +91 -119
  474. package/src/resizable-box/resize-tooltip/styles/resize-tooltip.styles.js +1 -0
  475. package/src/surface/styles.js +1 -1
  476. package/src/surface/test/__snapshots__/index.js.snap +11 -11
  477. package/src/toggle-group-control/index.ts +1 -0
  478. package/src/toggle-group-control/stories/index.js +37 -7
  479. package/src/toggle-group-control/test/__snapshots__/index.js.snap +269 -5
  480. package/src/toggle-group-control/test/index.js +43 -10
  481. package/src/toggle-group-control/toggle-group-control/component.tsx +10 -0
  482. package/src/toggle-group-control/toggle-group-control/styles.ts +14 -0
  483. package/src/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.tsx +86 -0
  484. package/src/toggle-group-control/toggle-group-control-option/README.md +8 -5
  485. package/src/toggle-group-control/toggle-group-control-option/component.tsx +18 -94
  486. package/src/toggle-group-control/toggle-group-control-option-base/README.md +27 -0
  487. package/src/toggle-group-control/toggle-group-control-option-base/component.tsx +129 -0
  488. package/src/toggle-group-control/toggle-group-control-option-base/index.ts +1 -0
  489. package/src/toggle-group-control/{toggle-group-control-option → toggle-group-control-option-base}/styles.ts +4 -1
  490. package/src/toggle-group-control/toggle-group-control-option-icon/README.md +56 -0
  491. package/src/toggle-group-control/toggle-group-control-option-icon/component.tsx +56 -0
  492. package/src/toggle-group-control/toggle-group-control-option-icon/index.ts +1 -0
  493. package/src/toggle-group-control/types.ts +33 -8
  494. package/src/toolbar-dropdown-menu/index.js +1 -1
  495. package/src/toolbar-group/style.scss +0 -73
  496. package/src/tools-panel/test/__snapshots__/index.js.snap +8 -8
  497. package/src/unit-control/README.md +7 -3
  498. package/src/unit-control/index.tsx +65 -31
  499. package/src/unit-control/stories/index.tsx +170 -0
  500. package/src/unit-control/test/index.js +263 -100
  501. package/src/unit-control/types.ts +65 -42
  502. package/src/unit-control/unit-select-control.tsx +2 -3
  503. package/src/utils/colors-values.js +4 -3
  504. package/src/utils/config-values.js +9 -4
  505. package/tsconfig.json +3 -0
  506. package/tsconfig.tsbuildinfo +1 -1
  507. package/build/toggle-group-control/toggle-group-control-option/styles.js +0 -66
  508. package/build/toggle-group-control/toggle-group-control-option/styles.js.map +0 -1
  509. package/build-module/toggle-group-control/toggle-group-control-option/styles.js +0 -55
  510. package/build-module/toggle-group-control/toggle-group-control-option/styles.js.map +0 -1
  511. package/build-types/toggle-group-control/toggle-group-control-option/styles.d.ts.map +0 -1
  512. package/src/base-control/index.js +0 -111
  513. package/src/base-control/stories/index.js +0 -81
  514. package/src/unit-control/stories/index.js +0 -127
@@ -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';
@@ -0,0 +1,252 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import type { CSSProperties } from 'react';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { __, sprintf } from '@wordpress/i18n';
10
+ import { closeSmall } from '@wordpress/icons';
11
+
12
+ /**
13
+ * Internal dependencies
14
+ */
15
+ import BorderControlStylePicker from '../border-control-style-picker';
16
+ import Button from '../../button';
17
+ import ColorIndicator from '../../color-indicator';
18
+ import ColorPalette from '../../color-palette';
19
+ import Dropdown from '../../dropdown';
20
+ import { HStack } from '../../h-stack';
21
+ import { VStack } from '../../v-stack';
22
+ import { contextConnect, WordPressComponentProps } from '../../ui/context';
23
+ import { useBorderControlDropdown } from './hook';
24
+ import { StyledLabel } from '../../base-control/styles/base-control-styles';
25
+
26
+ import type {
27
+ Color,
28
+ ColorOrigin,
29
+ Colors,
30
+ DropdownProps,
31
+ PopoverProps,
32
+ } from '../types';
33
+
34
+ const noop = () => undefined;
35
+ const getColorObject = (
36
+ colorValue: CSSProperties[ 'borderColor' ],
37
+ colors: Colors | undefined,
38
+ hasMultipleColorOrigins: boolean
39
+ ) => {
40
+ if ( ! colorValue || ! colors ) {
41
+ return;
42
+ }
43
+
44
+ if ( hasMultipleColorOrigins ) {
45
+ let matchedColor;
46
+
47
+ ( colors as ColorOrigin[] ).some( ( origin ) =>
48
+ origin.colors.some( ( color ) => {
49
+ if ( color.color === colorValue ) {
50
+ matchedColor = color;
51
+ return true;
52
+ }
53
+
54
+ return false;
55
+ } )
56
+ );
57
+
58
+ return matchedColor;
59
+ }
60
+
61
+ return ( colors as Color[] ).find(
62
+ ( color ) => color.color === colorValue
63
+ );
64
+ };
65
+
66
+ const getToggleAriaLabel = (
67
+ colorValue: CSSProperties[ 'borderColor' ],
68
+ colorObject: Color | undefined,
69
+ style: CSSProperties[ 'borderStyle' ],
70
+ isStyleEnabled: boolean
71
+ ) => {
72
+ if ( isStyleEnabled ) {
73
+ if ( colorObject ) {
74
+ return style
75
+ ? sprintf(
76
+ // translators: %1$s: The name of the color e.g. "vivid red". %2$s: The color's hex code e.g.: "#f00:". %3$s: The current border style selection e.g. "solid".
77
+ 'Border color and style picker. The currently selected color is called "%1$s" and has a value of "%2$s". The currently selected style is "%3$s".',
78
+ colorObject.name,
79
+ colorObject.color,
80
+ style
81
+ )
82
+ : sprintf(
83
+ // translators: %1$s: The name of the color e.g. "vivid red". %2$s: The color's hex code e.g.: "#f00:".
84
+ 'Border color and style picker. The currently selected color is called "%1$s" and has a value of "%2$s".',
85
+ colorObject.name,
86
+ colorObject.color
87
+ );
88
+ }
89
+
90
+ if ( colorValue ) {
91
+ return style
92
+ ? sprintf(
93
+ // translators: %1$s: The color's hex code e.g.: "#f00:". %2$s: The current border style selection e.g. "solid".
94
+ 'Border color and style picker. The currently selected color has a value of "%1$s". The currently selected style is "%2$s".',
95
+ colorValue,
96
+ style
97
+ )
98
+ : sprintf(
99
+ // translators: %1$s: The color's hex code e.g.: "#f00:".
100
+ 'Border color and style picker. The currently selected color has a value of "%1$s".',
101
+ colorValue
102
+ );
103
+ }
104
+
105
+ return __( 'Border color and style picker.' );
106
+ }
107
+
108
+ if ( colorObject ) {
109
+ return sprintf(
110
+ // translators: %1$s: The name of the color e.g. "vivid red". %2$s: The color's hex code e.g.: "#f00:".
111
+ 'Border color picker. The currently selected color is called "%1$s" and has a value of "%2$s".',
112
+ colorObject.name,
113
+ colorObject.color
114
+ );
115
+ }
116
+
117
+ if ( colorValue ) {
118
+ return sprintf(
119
+ // translators: %1$s: The color's hex code e.g.: "#f00:".
120
+ 'Border color picker. The currently selected color has a value of "%1$s".',
121
+ colorValue
122
+ );
123
+ }
124
+
125
+ return __( 'Border color picker.' );
126
+ };
127
+
128
+ const BorderControlDropdown = (
129
+ props: WordPressComponentProps< DropdownProps, 'div' >,
130
+ forwardedRef: React.ForwardedRef< any >
131
+ ) => {
132
+ const {
133
+ __experimentalHasMultipleOrigins,
134
+ __experimentalIsRenderedInSidebar,
135
+ border,
136
+ colors,
137
+ disableCustomColors,
138
+ enableAlpha,
139
+ indicatorClassName,
140
+ indicatorWrapperClassName,
141
+ onReset,
142
+ onColorChange,
143
+ onStyleChange,
144
+ popoverClassName,
145
+ popoverContentClassName,
146
+ popoverControlsClassName,
147
+ resetButtonClassName,
148
+ showDropdownHeader,
149
+ enableStyle = true,
150
+ ...otherProps
151
+ } = useBorderControlDropdown( props );
152
+
153
+ const { color, style } = border || {};
154
+ const colorObject = getColorObject(
155
+ color,
156
+ colors,
157
+ !! __experimentalHasMultipleOrigins
158
+ );
159
+
160
+ const toggleAriaLabel = getToggleAriaLabel(
161
+ color,
162
+ colorObject,
163
+ style,
164
+ enableStyle
165
+ );
166
+
167
+ const dropdownPosition = __experimentalIsRenderedInSidebar
168
+ ? 'bottom left'
169
+ : undefined;
170
+
171
+ const renderToggle = ( { onToggle = noop } ) => (
172
+ <Button
173
+ onClick={ onToggle }
174
+ variant="tertiary"
175
+ aria-label={ toggleAriaLabel }
176
+ position={ dropdownPosition }
177
+ >
178
+ <span className={ indicatorWrapperClassName }>
179
+ <ColorIndicator
180
+ className={ indicatorClassName }
181
+ colorValue={ color }
182
+ />
183
+ </span>
184
+ </Button>
185
+ );
186
+
187
+ const renderContent = ( { onClose }: PopoverProps ) => (
188
+ <>
189
+ <VStack className={ popoverControlsClassName } spacing={ 6 }>
190
+ { showDropdownHeader ? (
191
+ <HStack>
192
+ <StyledLabel>{ __( 'Border color' ) }</StyledLabel>
193
+ <Button
194
+ isSmall
195
+ label={ __( 'Close border color' ) }
196
+ icon={ closeSmall }
197
+ onClick={ onClose }
198
+ />
199
+ </HStack>
200
+ ) : undefined }
201
+ <ColorPalette
202
+ className={ popoverContentClassName }
203
+ value={ color }
204
+ onChange={ onColorChange }
205
+ { ...{ colors, disableCustomColors } }
206
+ __experimentalHasMultipleOrigins={
207
+ __experimentalHasMultipleOrigins
208
+ }
209
+ __experimentalIsRenderedInSidebar={
210
+ __experimentalIsRenderedInSidebar
211
+ }
212
+ clearable={ false }
213
+ enableAlpha={ enableAlpha }
214
+ />
215
+ { enableStyle && (
216
+ <BorderControlStylePicker
217
+ label={ __( 'Style' ) }
218
+ value={ style }
219
+ onChange={ onStyleChange }
220
+ />
221
+ ) }
222
+ </VStack>
223
+ <Button
224
+ className={ resetButtonClassName }
225
+ variant="tertiary"
226
+ onClick={ () => {
227
+ onReset();
228
+ onClose();
229
+ } }
230
+ >
231
+ { __( 'Reset to default' ) }
232
+ </Button>
233
+ </>
234
+ );
235
+
236
+ return (
237
+ <Dropdown
238
+ renderToggle={ renderToggle }
239
+ renderContent={ renderContent }
240
+ contentClassName={ popoverClassName }
241
+ { ...otherProps }
242
+ ref={ forwardedRef }
243
+ />
244
+ );
245
+ };
246
+
247
+ const ConnectedBorderControlDropdown = contextConnect(
248
+ BorderControlDropdown,
249
+ 'BorderControlDropdown'
250
+ );
251
+
252
+ export default ConnectedBorderControlDropdown;