@wordpress/components 22.1.0 → 23.0.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 (530) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/build/alignment-matrix-control/cell.js.map +1 -1
  3. package/build/alignment-matrix-control/icon.js +4 -2
  4. package/build/alignment-matrix-control/icon.js.map +1 -1
  5. package/build/alignment-matrix-control/index.js +25 -1
  6. package/build/alignment-matrix-control/index.js.map +1 -1
  7. package/build/alignment-matrix-control/styles/alignment-matrix-control-icon-styles.js +13 -13
  8. package/build/alignment-matrix-control/styles/alignment-matrix-control-icon-styles.js.map +1 -1
  9. package/build/alignment-matrix-control/styles/alignment-matrix-control-styles.js +16 -16
  10. package/build/alignment-matrix-control/styles/alignment-matrix-control-styles.js.map +1 -1
  11. package/build/alignment-matrix-control/types.js +6 -0
  12. package/build/alignment-matrix-control/types.js.map +1 -0
  13. package/build/alignment-matrix-control/utils.js +9 -8
  14. package/build/alignment-matrix-control/utils.js.map +1 -1
  15. package/build/angle-picker-control/styles/angle-picker-control-styles.js +9 -9
  16. package/build/angle-picker-control/styles/angle-picker-control-styles.js.map +1 -1
  17. package/build/autocomplete/index.js +38 -9
  18. package/build/autocomplete/index.js.map +1 -1
  19. package/build/base-control/hooks.js +52 -0
  20. package/build/base-control/hooks.js.map +1 -0
  21. package/build/base-control/index.js +24 -7
  22. package/build/base-control/index.js.map +1 -1
  23. package/build/base-field/hook.js +0 -14
  24. package/build/base-field/hook.js.map +1 -1
  25. package/build/base-field/index.js.map +1 -1
  26. package/build/base-field/styles.js +5 -5
  27. package/build/base-field/styles.js.map +1 -1
  28. package/build/base-field/types.js +6 -0
  29. package/build/base-field/types.js.map +1 -0
  30. package/build/border-control/border-control/component.js +1 -0
  31. package/build/border-control/border-control/component.js.map +1 -1
  32. package/build/border-control/styles.js +16 -16
  33. package/build/border-control/styles.js.map +1 -1
  34. package/build/box-control/linked-button.js +3 -4
  35. package/build/box-control/linked-button.js.map +1 -1
  36. package/build/color-palette/index.js +2 -7
  37. package/build/color-palette/index.js.map +1 -1
  38. package/build/color-picker/input-with-slider.js +1 -0
  39. package/build/color-picker/input-with-slider.js.map +1 -1
  40. package/build/color-picker/styles.js +8 -8
  41. package/build/color-picker/styles.js.map +1 -1
  42. package/build/custom-select-control/index.js +14 -2
  43. package/build/custom-select-control/index.js.map +1 -1
  44. package/build/dashicon/index.js +1 -4
  45. package/build/dashicon/index.js.map +1 -1
  46. package/build/date-time/date-time/index.js +4 -4
  47. package/build/date-time/date-time/index.js.map +1 -1
  48. package/build/duotone-picker/duotone-picker.js +2 -2
  49. package/build/duotone-picker/duotone-picker.js.map +1 -1
  50. package/build/gradient-picker/index.js +3 -9
  51. package/build/gradient-picker/index.js.map +1 -1
  52. package/build/higher-order/with-fallback-styles/index.js +2 -2
  53. package/build/higher-order/with-fallback-styles/index.js.map +1 -1
  54. package/build/index.js +13 -1
  55. package/build/index.js.map +1 -1
  56. package/build/input-control/index.js +17 -5
  57. package/build/input-control/index.js.map +1 -1
  58. package/build/input-control/input-base.js +2 -0
  59. package/build/input-control/input-base.js.map +1 -1
  60. package/build/mobile/bottom-sheet/cell.native.js +1 -1
  61. package/build/mobile/bottom-sheet/cell.native.js.map +1 -1
  62. package/build/mobile/bottom-sheet/switch-cell.native.js +1 -3
  63. package/build/mobile/bottom-sheet/switch-cell.native.js.map +1 -1
  64. package/build/mobile/global-styles-context/index.native.js +8 -8
  65. package/build/mobile/global-styles-context/index.native.js.map +1 -1
  66. package/build/mobile/keyboard-aware-flat-list/index.ios.js +4 -2
  67. package/build/mobile/keyboard-aware-flat-list/index.ios.js.map +1 -1
  68. package/build/modal/index.js +8 -0
  69. package/build/modal/index.js.map +1 -1
  70. package/build/navigator/navigator-provider/component.js +12 -8
  71. package/build/navigator/navigator-provider/component.js.map +1 -1
  72. package/build/number-control/styles/number-control-styles.js +8 -8
  73. package/build/number-control/styles/number-control-styles.js.map +1 -1
  74. package/build/palette-edit/index.js +72 -33
  75. package/build/palette-edit/index.js.map +1 -1
  76. package/build/popover/index.js +10 -2
  77. package/build/popover/index.js.map +1 -1
  78. package/build/query-controls/index.js +1 -0
  79. package/build/query-controls/index.js.map +1 -1
  80. package/build/snackbar/index.js +35 -24
  81. package/build/snackbar/index.js.map +1 -1
  82. package/build/snackbar/list.js +14 -19
  83. package/build/snackbar/list.js.map +1 -1
  84. package/build/snackbar/types.js +6 -0
  85. package/build/snackbar/types.js.map +1 -0
  86. package/build/tab-panel/index.js +10 -5
  87. package/build/tab-panel/index.js.map +1 -1
  88. package/build/theme/color-algorithms.js +118 -0
  89. package/build/theme/color-algorithms.js.map +1 -0
  90. package/build/theme/index.js +21 -18
  91. package/build/theme/index.js.map +1 -1
  92. package/build/theme/styles.js +10 -7
  93. package/build/theme/styles.js.map +1 -1
  94. package/build/toggle-control/index.js +5 -2
  95. package/build/toggle-control/index.js.map +1 -1
  96. package/build/ui/context/context-system-provider.js +3 -1
  97. package/build/ui/context/context-system-provider.js.map +1 -1
  98. package/build/unit-control/index.js +5 -2
  99. package/build/unit-control/index.js.map +1 -1
  100. package/build/utils/colors-values.js +1 -1
  101. package/build/utils/colors-values.js.map +1 -1
  102. package/build/utils/config-values.js +0 -2
  103. package/build/utils/config-values.js.map +1 -1
  104. package/build/utils/hooks/use-controlled-value.js.map +1 -1
  105. package/build-module/alignment-matrix-control/cell.js.map +1 -1
  106. package/build-module/alignment-matrix-control/icon.js +4 -2
  107. package/build-module/alignment-matrix-control/icon.js.map +1 -1
  108. package/build-module/alignment-matrix-control/index.js +23 -1
  109. package/build-module/alignment-matrix-control/index.js.map +1 -1
  110. package/build-module/alignment-matrix-control/styles/alignment-matrix-control-icon-styles.js +13 -13
  111. package/build-module/alignment-matrix-control/styles/alignment-matrix-control-icon-styles.js.map +1 -1
  112. package/build-module/alignment-matrix-control/styles/alignment-matrix-control-styles.js +16 -16
  113. package/build-module/alignment-matrix-control/styles/alignment-matrix-control-styles.js.map +1 -1
  114. package/build-module/alignment-matrix-control/types.js +2 -0
  115. package/build-module/alignment-matrix-control/types.js.map +1 -0
  116. package/build-module/alignment-matrix-control/utils.js +13 -8
  117. package/build-module/alignment-matrix-control/utils.js.map +1 -1
  118. package/build-module/angle-picker-control/styles/angle-picker-control-styles.js +9 -9
  119. package/build-module/angle-picker-control/styles/angle-picker-control-styles.js.map +1 -1
  120. package/build-module/autocomplete/index.js +38 -9
  121. package/build-module/autocomplete/index.js.map +1 -1
  122. package/build-module/base-control/hooks.js +41 -0
  123. package/build-module/base-control/hooks.js.map +1 -0
  124. package/build-module/base-control/index.js +18 -8
  125. package/build-module/base-control/index.js.map +1 -1
  126. package/build-module/base-field/hook.js +0 -14
  127. package/build-module/base-field/hook.js.map +1 -1
  128. package/build-module/base-field/index.js.map +1 -1
  129. package/build-module/base-field/styles.js +5 -5
  130. package/build-module/base-field/styles.js.map +1 -1
  131. package/build-module/base-field/types.js +2 -0
  132. package/build-module/base-field/types.js.map +1 -0
  133. package/build-module/border-control/border-control/component.js +1 -0
  134. package/build-module/border-control/border-control/component.js.map +1 -1
  135. package/build-module/border-control/styles.js +17 -17
  136. package/build-module/border-control/styles.js.map +1 -1
  137. package/build-module/box-control/linked-button.js +3 -4
  138. package/build-module/box-control/linked-button.js.map +1 -1
  139. package/build-module/color-palette/index.js +2 -7
  140. package/build-module/color-palette/index.js.map +1 -1
  141. package/build-module/color-picker/input-with-slider.js +1 -0
  142. package/build-module/color-picker/input-with-slider.js.map +1 -1
  143. package/build-module/color-picker/styles.js +8 -8
  144. package/build-module/color-picker/styles.js.map +1 -1
  145. package/build-module/custom-select-control/index.js +14 -2
  146. package/build-module/custom-select-control/index.js.map +1 -1
  147. package/build-module/dashicon/index.js +1 -4
  148. package/build-module/dashicon/index.js.map +1 -1
  149. package/build-module/date-time/date-time/index.js +4 -4
  150. package/build-module/date-time/date-time/index.js.map +1 -1
  151. package/build-module/duotone-picker/duotone-picker.js +2 -2
  152. package/build-module/duotone-picker/duotone-picker.js.map +1 -1
  153. package/build-module/gradient-picker/index.js +3 -8
  154. package/build-module/gradient-picker/index.js.map +1 -1
  155. package/build-module/higher-order/with-fallback-styles/index.js +2 -2
  156. package/build-module/higher-order/with-fallback-styles/index.js.map +1 -1
  157. package/build-module/index.js +2 -2
  158. package/build-module/index.js.map +1 -1
  159. package/build-module/input-control/index.js +16 -5
  160. package/build-module/input-control/index.js.map +1 -1
  161. package/build-module/input-control/input-base.js +2 -0
  162. package/build-module/input-control/input-base.js.map +1 -1
  163. package/build-module/mobile/bottom-sheet/cell.native.js +1 -1
  164. package/build-module/mobile/bottom-sheet/cell.native.js.map +1 -1
  165. package/build-module/mobile/bottom-sheet/switch-cell.native.js +1 -2
  166. package/build-module/mobile/bottom-sheet/switch-cell.native.js.map +1 -1
  167. package/build-module/mobile/global-styles-context/index.native.js +8 -7
  168. package/build-module/mobile/global-styles-context/index.native.js.map +1 -1
  169. package/build-module/mobile/keyboard-aware-flat-list/index.ios.js +2 -2
  170. package/build-module/mobile/keyboard-aware-flat-list/index.ios.js.map +1 -1
  171. package/build-module/modal/index.js +8 -0
  172. package/build-module/modal/index.js.map +1 -1
  173. package/build-module/navigator/navigator-provider/component.js +12 -8
  174. package/build-module/navigator/navigator-provider/component.js.map +1 -1
  175. package/build-module/number-control/styles/number-control-styles.js +8 -10
  176. package/build-module/number-control/styles/number-control-styles.js.map +1 -1
  177. package/build-module/palette-edit/index.js +73 -34
  178. package/build-module/palette-edit/index.js.map +1 -1
  179. package/build-module/popover/index.js +10 -2
  180. package/build-module/popover/index.js.map +1 -1
  181. package/build-module/query-controls/index.js +1 -0
  182. package/build-module/query-controls/index.js.map +1 -1
  183. package/build-module/snackbar/index.js +33 -23
  184. package/build-module/snackbar/index.js.map +1 -1
  185. package/build-module/snackbar/list.js +14 -22
  186. package/build-module/snackbar/list.js.map +1 -1
  187. package/build-module/snackbar/types.js +2 -0
  188. package/build-module/snackbar/types.js.map +1 -0
  189. package/build-module/tab-panel/index.js +10 -5
  190. package/build-module/tab-panel/index.js.map +1 -1
  191. package/build-module/theme/color-algorithms.js +105 -0
  192. package/build-module/theme/color-algorithms.js.map +1 -0
  193. package/build-module/theme/index.js +21 -17
  194. package/build-module/theme/index.js.map +1 -1
  195. package/build-module/theme/styles.js +8 -6
  196. package/build-module/theme/styles.js.map +1 -1
  197. package/build-module/toggle-control/index.js +4 -2
  198. package/build-module/toggle-control/index.js.map +1 -1
  199. package/build-module/ui/context/context-system-provider.js +3 -2
  200. package/build-module/ui/context/context-system-provider.js.map +1 -1
  201. package/build-module/unit-control/index.js +5 -2
  202. package/build-module/unit-control/index.js.map +1 -1
  203. package/build-module/utils/colors-values.js +1 -1
  204. package/build-module/utils/colors-values.js.map +1 -1
  205. package/build-module/utils/config-values.js +0 -2
  206. package/build-module/utils/config-values.js.map +1 -1
  207. package/build-module/utils/hooks/use-controlled-value.js.map +1 -1
  208. package/build-style/style-rtl.css +92 -75
  209. package/build-style/style.css +92 -75
  210. package/build-types/alignment-matrix-control/cell.d.ts +5 -0
  211. package/build-types/alignment-matrix-control/cell.d.ts.map +1 -0
  212. package/build-types/alignment-matrix-control/icon.d.ts +6 -0
  213. package/build-types/alignment-matrix-control/icon.d.ts.map +1 -0
  214. package/build-types/alignment-matrix-control/index.d.ts +30 -0
  215. package/build-types/alignment-matrix-control/index.d.ts.map +1 -0
  216. package/build-types/alignment-matrix-control/stories/index.d.ts +14 -0
  217. package/build-types/alignment-matrix-control/stories/index.d.ts.map +1 -0
  218. package/build-types/alignment-matrix-control/styles/alignment-matrix-control-icon-styles.d.ts +19 -0
  219. package/build-types/alignment-matrix-control/styles/alignment-matrix-control-icon-styles.d.ts.map +1 -0
  220. package/build-types/alignment-matrix-control/styles/alignment-matrix-control-styles.d.ts +23 -0
  221. package/build-types/alignment-matrix-control/styles/alignment-matrix-control-styles.d.ts.map +1 -0
  222. package/build-types/alignment-matrix-control/test/index.d.ts +2 -0
  223. package/build-types/alignment-matrix-control/test/index.d.ts.map +1 -0
  224. package/build-types/alignment-matrix-control/types.d.ts +39 -0
  225. package/build-types/alignment-matrix-control/types.d.ts.map +1 -0
  226. package/build-types/alignment-matrix-control/utils.d.ts +33 -0
  227. package/build-types/alignment-matrix-control/utils.d.ts.map +1 -0
  228. package/build-types/base-control/hooks.d.ts +23 -0
  229. package/build-types/base-control/hooks.d.ts.map +1 -0
  230. package/build-types/base-control/index.d.ts +17 -7
  231. package/build-types/base-control/index.d.ts.map +1 -1
  232. package/build-types/base-control/stories/index.d.ts.map +1 -1
  233. package/build-types/base-control/test/index.d.ts +2 -0
  234. package/build-types/base-control/test/index.d.ts.map +1 -0
  235. package/build-types/base-control/types.d.ts +8 -2
  236. package/build-types/base-control/types.d.ts.map +1 -1
  237. package/build-types/base-field/hook.d.ts +7 -31
  238. package/build-types/base-field/hook.d.ts.map +1 -1
  239. package/build-types/base-field/index.d.ts +1 -1
  240. package/build-types/base-field/index.d.ts.map +1 -1
  241. package/build-types/base-field/styles.d.ts +5 -5
  242. package/build-types/base-field/styles.d.ts.map +1 -1
  243. package/build-types/base-field/test/index.d.ts +2 -0
  244. package/build-types/base-field/test/index.d.ts.map +1 -0
  245. package/build-types/base-field/types.d.ts +29 -0
  246. package/build-types/base-field/types.d.ts.map +1 -0
  247. package/build-types/border-box-control/border-box-control/hook.d.ts +2 -2
  248. package/build-types/border-box-control/border-box-control-linked-button/hook.d.ts +2 -2
  249. package/build-types/border-box-control/border-box-control-split-controls/hook.d.ts +2 -2
  250. package/build-types/border-box-control/border-box-control-visualizer/hook.d.ts +2 -2
  251. package/build-types/border-control/border-control/component.d.ts.map +1 -1
  252. package/build-types/border-control/border-control/hook.d.ts +2 -2
  253. package/build-types/border-control/border-control-dropdown/hook.d.ts +2 -2
  254. package/build-types/border-control/border-control-style-picker/hook.d.ts +2 -2
  255. package/build-types/border-control/styles.d.ts.map +1 -1
  256. package/build-types/card/card/hook.d.ts +2 -2
  257. package/build-types/card/card-body/hook.d.ts +2 -2
  258. package/build-types/card/card-divider/hook.d.ts +2 -2
  259. package/build-types/card/card-footer/hook.d.ts +2 -2
  260. package/build-types/card/card-header/hook.d.ts +2 -2
  261. package/build-types/card/card-media/hook.d.ts +2 -2
  262. package/build-types/color-palette/index.d.ts +2 -2
  263. package/build-types/color-palette/index.d.ts.map +1 -1
  264. package/build-types/color-palette/stories/index.d.ts +6 -7
  265. package/build-types/color-palette/stories/index.d.ts.map +1 -1
  266. package/build-types/color-palette/styles.d.ts +1 -1
  267. package/build-types/color-palette/types.d.ts +1 -1
  268. package/build-types/color-palette/types.d.ts.map +1 -1
  269. package/build-types/color-picker/input-with-slider.d.ts.map +1 -1
  270. package/build-types/color-picker/styles.d.ts +5 -5
  271. package/build-types/color-picker/styles.d.ts.map +1 -1
  272. package/build-types/custom-select-control/index.d.ts.map +1 -1
  273. package/build-types/dashicon/index.d.ts +6 -20
  274. package/build-types/dashicon/index.d.ts.map +1 -1
  275. package/build-types/dashicon/types.d.ts +14 -0
  276. package/build-types/dashicon/types.d.ts.map +1 -1
  277. package/build-types/date-time/date/styles.d.ts +3 -3
  278. package/build-types/date-time/date-time/styles.d.ts +3 -3
  279. package/build-types/date-time/time/styles.d.ts +8 -8
  280. package/build-types/elevation/hook.d.ts +2 -2
  281. package/build-types/external-link/styles/external-link-styles.d.ts +1 -1
  282. package/build-types/flex/flex/hook.d.ts +2 -2
  283. package/build-types/flex/flex-block/hook.d.ts +2 -2
  284. package/build-types/flex/flex-item/hook.d.ts +2 -2
  285. package/build-types/focal-point-picker/styles/focal-point-picker-style.d.ts +2 -5
  286. package/build-types/focal-point-picker/styles/focal-point-picker-style.d.ts.map +1 -1
  287. package/build-types/grid/hook.d.ts +2 -2
  288. package/build-types/h-stack/component.d.ts +1 -1
  289. package/build-types/h-stack/hook.d.ts +2 -2
  290. package/build-types/heading/hook.d.ts +2 -2
  291. package/build-types/input-control/index.d.ts +1 -1
  292. package/build-types/input-control/index.d.ts.map +1 -1
  293. package/build-types/input-control/input-base.d.ts.map +1 -1
  294. package/build-types/input-control/stories/index.d.ts +1 -0
  295. package/build-types/input-control/stories/index.d.ts.map +1 -1
  296. package/build-types/input-control/types.d.ts +2 -1
  297. package/build-types/input-control/types.d.ts.map +1 -1
  298. package/build-types/item-group/item/hook.d.ts +2 -2
  299. package/build-types/item-group/item-group/hook.d.ts +2 -2
  300. package/build-types/modal/index.d.ts.map +1 -1
  301. package/build-types/modal/stories/index.d.ts.map +1 -1
  302. package/build-types/navigator/navigator-back-button/hook.d.ts +3 -3
  303. package/build-types/navigator/navigator-button/hook.d.ts +3 -3
  304. package/build-types/navigator/navigator-provider/component.d.ts.map +1 -1
  305. package/build-types/number-control/index.d.ts +2 -2
  306. package/build-types/number-control/index.d.ts.map +1 -1
  307. package/build-types/number-control/stories/index.d.ts +25 -0
  308. package/build-types/number-control/stories/index.d.ts.map +1 -0
  309. package/build-types/number-control/styles/number-control-styles.d.ts +6 -6
  310. package/build-types/number-control/styles/number-control-styles.d.ts.map +1 -1
  311. package/build-types/number-control/test/index.d.ts +2 -0
  312. package/build-types/number-control/test/index.d.ts.map +1 -0
  313. package/build-types/popover/index.d.ts +1 -1
  314. package/build-types/popover/index.d.ts.map +1 -1
  315. package/build-types/popover/stories/e2e/index.d.ts +1 -1
  316. package/build-types/range-control/index.d.ts +1 -1
  317. package/build-types/range-control/styles/range-control-styles.d.ts +2 -2
  318. package/build-types/resizable-box/resize-tooltip/index.d.ts +15 -19
  319. package/build-types/resizable-box/resize-tooltip/index.d.ts.map +1 -1
  320. package/build-types/resizable-box/resize-tooltip/label.d.ts +4 -3
  321. package/build-types/resizable-box/resize-tooltip/label.d.ts.map +1 -1
  322. package/build-types/scrollable/hook.d.ts +2 -2
  323. package/build-types/search-control/index.d.ts +1 -1
  324. package/build-types/search-control/stories/index.d.ts +2 -2
  325. package/build-types/snackbar/index.d.ts +19 -0
  326. package/build-types/snackbar/index.d.ts.map +1 -0
  327. package/build-types/snackbar/list.d.ts +18 -0
  328. package/build-types/snackbar/list.d.ts.map +1 -0
  329. package/build-types/snackbar/stories/index.d.ts +16 -0
  330. package/build-types/snackbar/stories/index.d.ts.map +1 -0
  331. package/build-types/snackbar/stories/list.d.ts +12 -0
  332. package/build-types/snackbar/stories/list.d.ts.map +1 -0
  333. package/build-types/snackbar/types.d.ts +111 -0
  334. package/build-types/snackbar/types.d.ts.map +1 -0
  335. package/build-types/spacer/hook.d.ts +2 -2
  336. package/build-types/spinner/index.d.ts +1 -1
  337. package/build-types/surface/hook.d.ts +2 -2
  338. package/build-types/tab-panel/index.d.ts +1 -1
  339. package/build-types/tab-panel/index.d.ts.map +1 -1
  340. package/build-types/tab-panel/types.d.ts +19 -1
  341. package/build-types/tab-panel/types.d.ts.map +1 -1
  342. package/build-types/text/hook.d.ts +2 -2
  343. package/build-types/text-control/index.d.ts +2 -2
  344. package/build-types/text-control/stories/index.d.ts.map +1 -1
  345. package/build-types/text-control/types.d.ts +1 -5
  346. package/build-types/text-control/types.d.ts.map +1 -1
  347. package/build-types/theme/color-algorithms.d.ts +20 -0
  348. package/build-types/theme/color-algorithms.d.ts.map +1 -0
  349. package/build-types/theme/index.d.ts +1 -1
  350. package/build-types/theme/index.d.ts.map +1 -1
  351. package/build-types/theme/stories/index.d.ts +4 -0
  352. package/build-types/theme/stories/index.d.ts.map +1 -1
  353. package/build-types/theme/styles.d.ts +3 -2
  354. package/build-types/theme/styles.d.ts.map +1 -1
  355. package/build-types/theme/test/color-algorithms.d.ts +2 -0
  356. package/build-types/theme/test/color-algorithms.d.ts.map +1 -0
  357. package/build-types/theme/types.d.ts +41 -3
  358. package/build-types/theme/types.d.ts.map +1 -1
  359. package/build-types/toggle-control/index.d.ts.map +1 -1
  360. package/build-types/toggle-group-control/toggle-group-control/as-button-group.d.ts +2 -2
  361. package/build-types/toggle-group-control/toggle-group-control/as-radio-group.d.ts +2 -2
  362. package/build-types/toggle-group-control/toggle-group-control-option/component.d.ts +1 -1
  363. package/build-types/toggle-group-control/toggle-group-control-option-icon/component.d.ts +1 -1
  364. package/build-types/tools-panel/tools-panel/hook.d.ts +2 -2
  365. package/build-types/tools-panel/tools-panel-header/hook.d.ts +2 -2
  366. package/build-types/tools-panel/tools-panel-item/hook.d.ts +2 -2
  367. package/build-types/truncate/hook.d.ts +2 -2
  368. package/build-types/ui/context/context-system-provider.d.ts.map +1 -1
  369. package/build-types/ui/control-group/hook.d.ts +2 -2
  370. package/build-types/ui/control-label/hook.d.ts +2 -2
  371. package/build-types/ui/form-group/form-group.d.ts +2 -2
  372. package/build-types/ui/form-group/use-form-group.d.ts +5 -5
  373. package/build-types/unit-control/index.d.ts +2 -1
  374. package/build-types/unit-control/index.d.ts.map +1 -1
  375. package/build-types/unit-control/styles/unit-control-styles.d.ts +2 -2
  376. package/build-types/unit-control/types.d.ts +4 -0
  377. package/build-types/unit-control/types.d.ts.map +1 -1
  378. package/build-types/utils/config-values.d.ts +0 -2
  379. package/build-types/utils/hooks/use-controlled-value.d.ts +2 -1
  380. package/build-types/utils/hooks/use-controlled-value.d.ts.map +1 -1
  381. package/build-types/v-stack/component.d.ts +2 -2
  382. package/build-types/v-stack/hook.d.ts +2 -2
  383. package/build-types/v-stack/stories/index.d.ts +2 -2
  384. package/package.json +21 -20
  385. package/src/alignment-matrix-control/README.md +7 -7
  386. package/src/alignment-matrix-control/{cell.js → cell.tsx} +7 -1
  387. package/src/alignment-matrix-control/{icon.js → icon.tsx} +6 -3
  388. package/src/alignment-matrix-control/{index.js → index.tsx} +31 -4
  389. package/src/alignment-matrix-control/stories/{index.js → index.tsx} +17 -9
  390. package/src/alignment-matrix-control/styles/{alignment-matrix-control-icon-styles.js → alignment-matrix-control-icon-styles.ts} +11 -3
  391. package/src/alignment-matrix-control/styles/{alignment-matrix-control-styles.js → alignment-matrix-control-styles.ts} +13 -3
  392. package/src/alignment-matrix-control/test/{index.js → index.tsx} +5 -5
  393. package/src/alignment-matrix-control/types.ts +54 -0
  394. package/src/alignment-matrix-control/{utils.js → utils.tsx} +24 -14
  395. package/src/angle-picker-control/styles/angle-picker-control-styles.js +4 -0
  396. package/src/autocomplete/index.js +43 -12
  397. package/src/base-control/README.md +21 -12
  398. package/src/base-control/hooks.ts +45 -0
  399. package/src/base-control/index.tsx +18 -7
  400. package/src/base-control/stories/index.tsx +8 -10
  401. package/src/base-control/test/index.tsx +52 -0
  402. package/src/base-control/types.ts +8 -2
  403. package/src/base-field/README.md +21 -22
  404. package/src/base-field/{hook.js → hook.ts} +5 -15
  405. package/src/base-field/{index.js → index.ts} +0 -0
  406. package/src/base-field/{styles.js → styles.ts} +2 -2
  407. package/src/base-field/test/__snapshots__/{index.js.snap → index.tsx.snap} +4 -4
  408. package/src/base-field/test/{index.js → index.tsx} +10 -5
  409. package/src/base-field/types.ts +29 -0
  410. package/src/border-box-control/border-box-control/README.md +1 -0
  411. package/src/border-box-control/test/index.js +3 -1
  412. package/src/border-control/border-control/component.tsx +1 -0
  413. package/src/border-control/styles.ts +1 -10
  414. package/src/box-control/linked-button.js +8 -11
  415. package/src/box-control/test/index.js +206 -135
  416. package/src/button/stories/index.js +30 -0
  417. package/src/button/style.scss +17 -14
  418. package/src/button/test/index.js +32 -15
  419. package/src/card/test/index.tsx +32 -20
  420. package/src/circular-option-picker/style.scss +1 -0
  421. package/src/color-palette/index.tsx +4 -6
  422. package/src/color-palette/stories/index.tsx +1 -5
  423. package/src/color-palette/test/__snapshots__/index.tsx.snap +4 -4
  424. package/src/color-palette/test/index.tsx +84 -36
  425. package/src/color-palette/types.ts +1 -1
  426. package/src/color-picker/README.md +1 -0
  427. package/src/color-picker/input-with-slider.tsx +1 -0
  428. package/src/color-picker/styles.ts +0 -4
  429. package/src/confirm-dialog/README.md +3 -2
  430. package/src/custom-select-control/README.md +14 -0
  431. package/src/custom-select-control/index.js +14 -2
  432. package/src/dashicon/{index.js → index.tsx} +10 -4
  433. package/src/dashicon/types.ts +17 -0
  434. package/src/date-time/date-time/index.tsx +2 -2
  435. package/src/dimension-control/test/__snapshots__/index.test.js.snap +4 -8
  436. package/src/disabled/test/index.tsx +21 -11
  437. package/src/dropdown/test/index.js +39 -49
  438. package/src/dropdown-menu/test/index.js +18 -12
  439. package/src/duotone-picker/duotone-picker.js +2 -2
  440. package/src/focal-point-picker/test/media.js +26 -21
  441. package/src/form-token-field/style.scss +1 -1
  442. package/src/gradient-picker/index.js +5 -8
  443. package/src/grid/test/grid.tsx +31 -31
  444. package/src/higher-order/navigate-regions/style.scss +2 -22
  445. package/src/higher-order/with-fallback-styles/index.js +4 -2
  446. package/src/higher-order/with-filters/test/index.js +94 -101
  447. package/src/higher-order/with-focus-return/test/index.js +1 -4
  448. package/src/index.js +2 -2
  449. package/src/input-control/index.tsx +42 -28
  450. package/src/input-control/input-base.tsx +8 -1
  451. package/src/input-control/stories/index.tsx +6 -0
  452. package/src/input-control/test/index.js +18 -0
  453. package/src/input-control/types.ts +2 -0
  454. package/src/mobile/bottom-sheet/cell.native.js +1 -1
  455. package/src/mobile/bottom-sheet/switch-cell.native.js +2 -2
  456. package/src/mobile/global-styles-context/index.native.js +9 -11
  457. package/src/mobile/keyboard-aware-flat-list/index.ios.js +2 -2
  458. package/src/mobile/link-settings/test/edit.native.js +68 -124
  459. package/src/modal/index.tsx +11 -0
  460. package/src/modal/stories/index.tsx +3 -0
  461. package/src/modal/test/index.tsx +15 -0
  462. package/src/navigation/stories/index.js +6 -6
  463. package/src/navigation/stories/{controlled-state.js → utils/controlled-state.js} +3 -3
  464. package/src/navigation/stories/{default.js → utils/default.js} +3 -3
  465. package/src/navigation/stories/{group.js → utils/group.js} +4 -4
  466. package/src/navigation/stories/{hide-if-empty.js → utils/hide-if-empty.js} +3 -3
  467. package/src/navigation/stories/{more-examples.js → utils/more-examples.js} +4 -4
  468. package/src/navigation/stories/{search.js → utils/search.js} +5 -5
  469. package/src/navigator/navigator-provider/component.tsx +13 -10
  470. package/src/notice/test/list.js +8 -5
  471. package/src/number-control/stories/{index.js → index.tsx} +24 -7
  472. package/src/number-control/styles/{number-control-styles.js → number-control-styles.ts} +5 -3
  473. package/src/number-control/test/index.tsx +600 -0
  474. package/src/palette-edit/index.js +88 -39
  475. package/src/palette-edit/test/index.js +25 -1
  476. package/src/popover/index.tsx +10 -2
  477. package/src/popover/style.scss +12 -11
  478. package/src/popover/test/index.tsx +25 -15
  479. package/src/query-controls/index.js +1 -0
  480. package/src/range-control/test/index.tsx +57 -60
  481. package/src/resizable-box/style.scss +1 -0
  482. package/src/sandbox/test/index.js +13 -11
  483. package/src/search-control/style.scss +4 -0
  484. package/src/snackbar/README.md +63 -8
  485. package/src/snackbar/{index.js → index.tsx} +46 -28
  486. package/src/snackbar/{list.js → list.tsx} +20 -21
  487. package/src/snackbar/stories/index.tsx +96 -0
  488. package/src/snackbar/stories/list.tsx +98 -0
  489. package/src/snackbar/types.ts +116 -0
  490. package/src/tab-panel/README.md +9 -0
  491. package/src/tab-panel/index.tsx +14 -3
  492. package/src/tab-panel/style.scss +46 -34
  493. package/src/tab-panel/test/index.tsx +111 -0
  494. package/src/tab-panel/types.ts +20 -1
  495. package/src/text/test/__snapshots__/index.tsx.snap +1 -0
  496. package/src/text/test/index.tsx +98 -46
  497. package/src/text-control/stories/index.tsx +0 -1
  498. package/src/text-control/types.ts +1 -6
  499. package/src/theme/README.md +32 -2
  500. package/src/theme/color-algorithms.ts +138 -0
  501. package/src/theme/index.tsx +23 -16
  502. package/src/theme/stories/index.tsx +67 -0
  503. package/src/theme/styles.ts +22 -17
  504. package/src/theme/test/color-algorithms.ts +100 -0
  505. package/src/theme/test/index.tsx +68 -35
  506. package/src/theme/types.ts +43 -3
  507. package/src/toggle-control/index.tsx +4 -2
  508. package/src/toggle-group-control/test/index.tsx +13 -2
  509. package/src/toolbar-group/test/index.js +8 -6
  510. package/src/tools-panel/stories/index.js +1 -1
  511. package/src/tools-panel/stories/{tools-panel-with-item-group-slot.js → utils/tools-panel-with-item-group-slot.js} +14 -11
  512. package/src/tools-panel/test/index.js +20 -14
  513. package/src/tooltip/README.md +7 -0
  514. package/src/tooltip/style.scss +2 -2
  515. package/src/tooltip/test/index.js +109 -18
  516. package/src/ui/context/context-system-provider.js +3 -2
  517. package/src/ui/context/test/context-system-provider.js +5 -4
  518. package/src/ui/control-label/test/index.js +3 -5
  519. package/src/unit-control/README.md +9 -1
  520. package/src/unit-control/index.tsx +3 -0
  521. package/src/unit-control/test/index.tsx +1 -0
  522. package/src/unit-control/types.ts +4 -0
  523. package/src/utils/colors-values.js +1 -1
  524. package/src/utils/config-values.js +0 -2
  525. package/src/utils/hooks/use-controlled-value.ts +2 -2
  526. package/src/utils/theme-variables.scss +20 -0
  527. package/tsconfig.json +2 -4
  528. package/tsconfig.tsbuildinfo +1 -1
  529. package/src/number-control/test/index.js +0 -478
  530. package/src/snackbar/stories/index.js +0 -89
@@ -19,133 +19,185 @@ describe( 'Text', () => {
19
19
  } );
20
20
 
21
21
  test( 'should render optimizeReadabilityFor', () => {
22
- const { container } = render(
23
- <Text optimizeReadabilityFor="blue">Lorem ipsum.</Text>
22
+ render(
23
+ <Text role="heading" optimizeReadabilityFor="blue">
24
+ Lorem ipsum.
25
+ </Text>
24
26
  );
25
- expect( container.firstChild ).toHaveStyle( {
27
+ expect( screen.getByRole( 'heading' ) ).toHaveStyle( {
26
28
  color: COLORS.white,
27
29
  } );
28
30
  } );
29
31
 
30
32
  test( 'should render truncate', () => {
31
- const { container } = render( <Text truncate>Lorem ipsum.</Text> );
32
- expect( container.firstChild ).toHaveStyle( {
33
+ render(
34
+ <Text role="heading" truncate>
35
+ Lorem ipsum.
36
+ </Text>
37
+ );
38
+ expect( screen.getByRole( 'heading' ) ).toHaveStyle( {
33
39
  textOverflow: 'ellipsis',
34
40
  } );
35
41
  } );
36
42
 
37
43
  test( 'should render size', () => {
38
- const { container } = render( <Text size="title">Lorem ipsum.</Text> );
39
- expect( container.firstChild ).toHaveStyle( {
44
+ render(
45
+ <Text role="heading" size="title">
46
+ Lorem ipsum.
47
+ </Text>
48
+ );
49
+ expect( screen.getByRole( 'heading' ) ).toHaveStyle( {
40
50
  fontSize: getFontSize( 'title' ),
41
51
  } );
42
52
  } );
43
53
 
44
54
  test( 'should render custom size', () => {
45
- const { container } = render( <Text size={ 15 }>Lorem ipsum.</Text> );
46
- expect( container.firstChild ).toHaveStyle( {
55
+ render(
56
+ <Text role="heading" size={ 15 }>
57
+ Lorem ipsum.
58
+ </Text>
59
+ );
60
+ expect( screen.getByRole( 'heading' ) ).toHaveStyle( {
47
61
  fontSize: getFontSize( 15 ),
48
62
  } );
49
63
  } );
50
64
 
51
65
  test( 'should render variant', () => {
52
- const { container } = render(
53
- <Text variant="muted">Lorem ipsum.</Text>
66
+ render(
67
+ <Text role="heading" variant="muted">
68
+ Lorem ipsum.
69
+ </Text>
54
70
  );
55
- expect( container.firstChild ).toHaveStyle( {
71
+ expect( screen.getByRole( 'heading' ) ).toHaveStyle( {
56
72
  color: COLORS.gray[ 700 ],
57
73
  } );
58
74
  } );
59
75
 
60
76
  test( 'should render as another element', () => {
61
- const { container } = render( <Text as="div">Lorem ipsum.</Text> );
62
- expect( container.firstChild?.nodeName ).toBe( 'DIV' );
77
+ render(
78
+ <Text role="heading" as="div">
79
+ Lorem ipsum.
80
+ </Text>
81
+ );
82
+ expect( screen.getByRole( 'heading' )?.nodeName ).toBe( 'DIV' );
63
83
  } );
64
84
 
65
85
  test( 'should render align', () => {
66
- const { container: centerAlignedContainer } = render(
67
- <Text align="center">Lorem ipsum.</Text>
68
- );
69
- const { container: defaultAlignedContainer } = render(
70
- <Text>Lorem ipsum.</Text>
86
+ render(
87
+ <>
88
+ <Text role="heading" align="center">
89
+ Lorem ipsum.
90
+ </Text>
91
+ <Text role="note">Lorem ipsum.</Text>
92
+ </>
71
93
  );
72
94
 
73
- expect(
74
- defaultAlignedContainer.children[ 0 ]
75
- ).toMatchStyleDiffSnapshot( centerAlignedContainer.children[ 0 ] );
95
+ expect( screen.getByRole( 'note' ) ).toMatchStyleDiffSnapshot(
96
+ screen.getByRole( 'heading' )
97
+ );
76
98
  } );
77
99
 
78
100
  test( 'should render color', () => {
79
- const { container } = render(
80
- <Text color="orange">Lorem ipsum.</Text>
101
+ render(
102
+ <Text role="heading" color="orange">
103
+ Lorem ipsum.
104
+ </Text>
81
105
  );
82
- expect( container.firstChild ).toHaveStyle( { color: 'orange' } );
106
+ expect( screen.getByRole( 'heading' ) ).toHaveStyle( {
107
+ color: 'orange',
108
+ } );
83
109
  } );
84
110
 
85
111
  test( 'should render display', () => {
86
- const { container } = render(
87
- <Text display="inline-flex">Lorem ipsum.</Text>
112
+ render(
113
+ <Text role="heading" display="inline-flex">
114
+ Lorem ipsum.
115
+ </Text>
88
116
  );
89
- expect( container.firstChild ).toHaveStyle( {
117
+ expect( screen.getByRole( 'heading' ) ).toHaveStyle( {
90
118
  display: 'inline-flex',
91
119
  } );
92
120
  } );
93
121
 
94
122
  test( 'should render highlighted words', async () => {
95
- const { container } = render(
96
- <Text highlightWords={ [ 'm' ] }>Lorem ipsum.</Text>
123
+ render(
124
+ <Text role="heading" highlightWords={ [ 'm' ] }>
125
+ Lorem ipsum.
126
+ </Text>
97
127
  );
98
- expect( container.firstChild?.childNodes ).toHaveLength( 5 );
128
+ expect( screen.getByRole( 'heading' )?.childNodes ).toHaveLength( 5 );
99
129
  const words = await screen.findAllByText( 'm' );
100
130
  expect( words ).toHaveLength( 2 );
101
131
  words.forEach( ( word ) => expect( word.tagName ).toEqual( 'MARK' ) );
102
132
  } );
103
133
 
104
134
  test( 'should render highlighted words with undefined passed', () => {
105
- const { container } = render(
106
- <Text highlightWords={ undefined }>Lorem ipsum.</Text>
135
+ render(
136
+ <Text role="heading" highlightWords={ undefined }>
137
+ Lorem ipsum.
138
+ </Text>
107
139
  );
108
140
  // It'll have a length of 1 because there shouldn't be anything but the single span being rendered.
109
- expect( container.firstChild?.childNodes ).toHaveLength( 1 );
141
+ expect( screen.getByRole( 'heading' )?.childNodes ).toHaveLength( 1 );
110
142
  } );
111
143
 
112
144
  test( 'should render highlighted words with highlightCaseSensitive', () => {
113
145
  const { container } = render(
114
- <Text highlightCaseSensitive highlightWords={ [ 'IPSUM' ] }>
146
+ <Text
147
+ role="heading"
148
+ highlightCaseSensitive
149
+ highlightWords={ [ 'IPSUM' ] }
150
+ >
115
151
  Lorem ipsum.
116
152
  </Text>
117
153
  );
118
154
 
119
155
  expect( container ).toMatchSnapshot();
120
156
  // It'll have a length of 1 because there shouldn't be anything but the single span being rendered.
121
- expect( container.firstChild?.childNodes ).toHaveLength( 1 );
157
+ expect( screen.getByRole( 'heading' )?.childNodes ).toHaveLength( 1 );
122
158
  } );
123
159
 
124
160
  test( 'should render isBlock', () => {
125
- const { container } = render( <Text isBlock>Lorem ipsum.</Text> );
126
- expect( container.firstChild ).toHaveStyle( {
161
+ render(
162
+ <Text role="heading" isBlock>
163
+ Lorem ipsum.
164
+ </Text>
165
+ );
166
+ expect( screen.getByRole( 'heading' ) ).toHaveStyle( {
127
167
  display: 'block',
128
168
  } );
129
169
  } );
130
170
 
131
171
  test( 'should render lineHeight', () => {
132
- const { container } = render(
133
- <Text lineHeight={ 1.5 }>Lorem ipsum.</Text>
172
+ render(
173
+ <Text role="heading" lineHeight={ 1.5 }>
174
+ Lorem ipsum.
175
+ </Text>
134
176
  );
135
- expect( container.firstChild ).toHaveStyle( { lineHeight: '1.5' } );
177
+ expect( screen.getByRole( 'heading' ) ).toHaveStyle( {
178
+ lineHeight: '1.5',
179
+ } );
136
180
  } );
137
181
 
138
182
  test( 'should render upperCase', () => {
139
- const { container } = render( <Text upperCase>Lorem ipsum.</Text> );
140
- expect( container.firstChild ).toHaveStyle( {
183
+ render(
184
+ <Text role="heading" upperCase>
185
+ Lorem ipsum.
186
+ </Text>
187
+ );
188
+ expect( screen.getByRole( 'heading' ) ).toHaveStyle( {
141
189
  textTransform: 'uppercase',
142
190
  } );
143
191
  } );
144
192
 
145
193
  test( 'should render weight', () => {
146
- const { container } = render(
147
- <Text weight={ 700 }>Lorem ipsum.</Text>
194
+ render(
195
+ <Text role="heading" weight={ 700 }>
196
+ Lorem ipsum.
197
+ </Text>
148
198
  );
149
- expect( container.firstChild ).toHaveStyle( { fontWeight: '700' } );
199
+ expect( screen.getByRole( 'heading' ) ).toHaveStyle( {
200
+ fontWeight: '700',
201
+ } );
150
202
  } );
151
203
  } );
@@ -19,7 +19,6 @@ const meta: ComponentMeta< typeof TextControl > = {
19
19
  argTypes: {
20
20
  help: { control: { type: 'text' } },
21
21
  label: { control: { type: 'text' } },
22
- type: { control: { type: 'text' } },
23
22
  onChange: { action: 'onChange' },
24
23
  value: { control: { type: null } },
25
24
  },
@@ -1,8 +1,3 @@
1
- /**
2
- * External dependencies
3
- */
4
- import type { HTMLInputTypeAttribute } from 'react';
5
-
6
1
  /**
7
2
  * Internal dependencies
8
3
  */
@@ -29,5 +24,5 @@ export type TextControlProps = Pick<
29
24
  *
30
25
  * @default 'text'
31
26
  */
32
- type?: HTMLInputTypeAttribute;
27
+ type?: 'email' | 'number' | 'password' | 'tel' | 'text' | 'search' | 'url';
33
28
  };
@@ -17,7 +17,7 @@ const Example = () => {
17
17
  return (
18
18
  <Theme accent="red">
19
19
  <Button variant="primary">I'm red</Button>
20
- <Theme accent="blue">
20
+ <Theme accent="blue" background="black">
21
21
  <Button variant="primary">I'm blue</Button>
22
22
  </Theme>
23
23
  </Theme>
@@ -29,6 +29,36 @@ const Example = () => {
29
29
 
30
30
  ### `accent`: `string`
31
31
 
32
- Used to set the accent color (used by components as the primary color). If an accent color is not defined, the default fallback value is the original WP Admin main theme color. No all valid CSS color syntaxes are supported — in particular, keywords (like `'currentcolor'`, `'inherit'`, `'initial'`, `'revert'`, `'unset'`...) and CSS custom properties (e.g. `var(--my-custom-property)`) are _not_ supported values for this property.
32
+ The accent color (used by components as the primary color). If an accent color is not defined, the default fallback value is the original WP Admin main theme color.
33
+
34
+ Not all valid CSS color syntaxes are supported — in particular, keywords (like `'currentcolor'`, `'inherit'`, `'initial'`, `'revert'`, `'unset'`...) and CSS custom properties (e.g. `var(--my-custom-property)`) are _not_ supported values for this property.
33
35
 
34
36
  - Required: No
37
+
38
+ ### `background`: `string`
39
+
40
+ The background color. If a component explicitly has a background, it will be this color. Otherwise, this color will simply be used to determine what the foreground colors should be. The actual background color will need to be set on the component's container element. If a background color is not defined, the default fallback value is #fff.
41
+
42
+ Not all valid CSS color syntaxes are supported — in particular, keywords (like `'currentcolor'`, `'inherit'`, `'initial'`, `'revert'`, `'unset'`...) and CSS custom properties (e.g. `var(--my-custom-property)`) are _not_ supported values for this property.
43
+
44
+ - Required: No
45
+
46
+ ## Writing themeable components
47
+
48
+ If you would like your custom component to be themeable as a child of the `Theme` component, it should use these color variables. (This is a work in progress, and this list of variables may change. We do not recommend using these variables in production at this time.)
49
+
50
+ - `--wp-components-color-accent`: The accent color.
51
+ - `--wp-components-color-accent-darker-10`: A slightly darker version of the accent color.
52
+ - `--wp-components-color-accent-darker-20`: An even darker version of the accent color.
53
+ - `--wp-components-color-accent-inverted`: The foreground color when the accent color is the background, for example when placing text on the accent color.
54
+ - `--wp-components-color-background`: The background color.
55
+ - `--wp-components-color-foreground`: The foreground color, for example text.
56
+ - `--wp-components-color-foreground-inverted`: The foreground color when the foreground color is the background, for example when placing text on the foreground color.
57
+ - Grayscale:
58
+ - `--wp-components-color-gray-100`: Used for light gray backgrounds.
59
+ - `--wp-components-color-gray-200`: Used sparingly for light borders.
60
+ - `--wp-components-color-gray-300`: Used for most borders.
61
+ - `--wp-components-color-gray-400`
62
+ - `--wp-components-color-gray-600`: Meets 3:1 UI or large text contrast against white.
63
+ - `--wp-components-color-gray-700`: Meets 4.6:1 text contrast against white.
64
+ - `--wp-components-color-gray-800`
@@ -0,0 +1,138 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { colord, extend } from 'colord';
5
+ import a11yPlugin from 'colord/plugins/a11y';
6
+ import namesPlugin from 'colord/plugins/names';
7
+
8
+ /**
9
+ * WordPress dependencies
10
+ */
11
+ import warning from '@wordpress/warning';
12
+
13
+ /**
14
+ * Internal dependencies
15
+ */
16
+ import type { ThemeInputValues, ThemeOutputValues } from './types';
17
+ import { COLORS } from '../utils';
18
+
19
+ extend( [ namesPlugin, a11yPlugin ] );
20
+
21
+ export function generateThemeVariables(
22
+ inputs: ThemeInputValues
23
+ ): ThemeOutputValues {
24
+ validateInputs( inputs );
25
+
26
+ const generatedColors = {
27
+ ...generateAccentDependentColors( inputs.accent ),
28
+ ...generateBackgroundDependentColors( inputs.background ),
29
+ };
30
+
31
+ warnContrastIssues( checkContrasts( inputs, generatedColors ) );
32
+
33
+ return { colors: generatedColors };
34
+ }
35
+
36
+ function validateInputs( inputs: ThemeInputValues ) {
37
+ for ( const [ key, value ] of Object.entries( inputs ) ) {
38
+ if ( typeof value !== 'undefined' && ! colord( value ).isValid() ) {
39
+ warning(
40
+ `wp.components.Theme: "${ value }" is not a valid color value for the '${ key }' prop.`
41
+ );
42
+ }
43
+ }
44
+ }
45
+
46
+ export function checkContrasts(
47
+ inputs: ThemeInputValues,
48
+ outputs: ThemeOutputValues[ 'colors' ]
49
+ ) {
50
+ const background = inputs.background || COLORS.white;
51
+ const accent = inputs.accent || '#007cba';
52
+ const foreground = outputs.foreground || COLORS.gray[ 900 ];
53
+ const gray = outputs.gray || COLORS.gray;
54
+
55
+ return {
56
+ accent: colord( background ).isReadable( accent )
57
+ ? undefined
58
+ : `The background color ("${ background }") does not have sufficient contrast against the accent color ("${ accent }").`,
59
+ foreground: colord( background ).isReadable( foreground )
60
+ ? undefined
61
+ : `The background color provided ("${ background }") does not have sufficient contrast against the standard foreground colors.`,
62
+ grays:
63
+ colord( background ).contrast( gray[ 600 ] ) >= 3 &&
64
+ colord( background ).contrast( gray[ 700 ] ) >= 4.5
65
+ ? undefined
66
+ : `The background color provided ("${ background }") cannot generate a set of grayscale foreground colors with sufficient contrast. Try adjusting the color to be lighter or darker.`,
67
+ };
68
+ }
69
+
70
+ function warnContrastIssues( issues: ReturnType< typeof checkContrasts > ) {
71
+ for ( const error of Object.values( issues ) ) {
72
+ if ( error ) {
73
+ warning( 'wp.components.Theme: ' + error );
74
+ }
75
+ }
76
+ }
77
+
78
+ function generateAccentDependentColors( accent?: string ) {
79
+ if ( ! accent ) return {};
80
+
81
+ return {
82
+ accent,
83
+ accentDarker10: colord( accent ).darken( 0.1 ).toHex(),
84
+ accentDarker20: colord( accent ).darken( 0.2 ).toHex(),
85
+ accentInverted: getForegroundForColor( accent ),
86
+ };
87
+ }
88
+
89
+ function generateBackgroundDependentColors( background?: string ) {
90
+ if ( ! background ) return {};
91
+
92
+ const foreground = getForegroundForColor( background );
93
+
94
+ return {
95
+ background,
96
+ foreground,
97
+ foregroundInverted: getForegroundForColor( foreground ),
98
+ gray: generateShades( background, foreground ),
99
+ };
100
+ }
101
+
102
+ function getForegroundForColor( color: string ) {
103
+ return colord( color ).isDark() ? COLORS.white : COLORS.gray[ 900 ];
104
+ }
105
+
106
+ export function generateShades( background: string, foreground: string ) {
107
+ // How much darkness you need to add to #fff to get the COLORS.gray[n] color
108
+ const SHADES = {
109
+ 100: 0.06,
110
+ 200: 0.121,
111
+ 300: 0.132,
112
+ 400: 0.2,
113
+ 600: 0.42,
114
+ 700: 0.543,
115
+ 800: 0.821,
116
+ };
117
+
118
+ // Darkness of COLORS.gray[ 900 ], relative to #fff
119
+ const limit = 0.884;
120
+
121
+ const direction = colord( background ).isDark() ? 'lighten' : 'darken';
122
+
123
+ // Lightness delta between the background and foreground colors
124
+ const range =
125
+ Math.abs(
126
+ colord( background ).toHsl().l - colord( foreground ).toHsl().l
127
+ ) / 100;
128
+
129
+ const result: Record< number, string > = {};
130
+
131
+ Object.entries( SHADES ).forEach( ( [ key, value ] ) => {
132
+ result[ parseInt( key ) ] = colord( background )
133
+ [ direction ]( ( value / limit ) * range )
134
+ .toHex();
135
+ } );
136
+
137
+ return result as NonNullable< ThemeOutputValues[ 'colors' ][ 'gray' ] >;
138
+ }
@@ -1,18 +1,16 @@
1
1
  /**
2
- * External dependencies
2
+ * WordPress dependencies
3
3
  */
4
- import { colord, extend } from 'colord';
5
- import a11yPlugin from 'colord/plugins/a11y';
6
- import namesPlugin from 'colord/plugins/names';
4
+ import { useMemo } from '@wordpress/element';
7
5
 
8
6
  /**
9
7
  * Internal dependencies
10
8
  */
11
9
  import type { ThemeProps } from './types';
12
10
  import type { WordPressComponentProps } from '../ui/context';
13
- import { Wrapper } from './styles';
14
-
15
- extend( [ namesPlugin, a11yPlugin ] );
11
+ import { colorVariables, Wrapper } from './styles';
12
+ import { generateThemeVariables } from './color-algorithms';
13
+ import { useCx } from '../utils';
16
14
 
17
15
  /**
18
16
  * `Theme` allows defining theme variables for components in the `@wordpress/components` package.
@@ -36,16 +34,25 @@ extend( [ namesPlugin, a11yPlugin ] );
36
34
  * };
37
35
  * ```
38
36
  */
39
- function Theme( props: WordPressComponentProps< ThemeProps, 'div', true > ) {
40
- const { accent } = props;
41
- if ( accent && ! colord( accent ).isValid() ) {
42
- // eslint-disable-next-line no-console
43
- console.warn(
44
- `wp.components.Theme: "${ accent }" is not a valid color value for the 'accent' prop.`
45
- );
46
- }
37
+ function Theme( {
38
+ accent,
39
+ background,
40
+ className,
41
+ ...props
42
+ }: WordPressComponentProps< ThemeProps, 'div', true > ) {
43
+ const cx = useCx();
44
+ const classes = useMemo(
45
+ () =>
46
+ cx(
47
+ ...colorVariables(
48
+ generateThemeVariables( { accent, background } )
49
+ ),
50
+ className
51
+ ),
52
+ [ accent, background, className, cx ]
53
+ );
47
54
 
48
- return <Wrapper { ...props } />;
55
+ return <Wrapper className={ classes } { ...props } />;
49
56
  }
50
57
 
51
58
  export default Theme;
@@ -8,12 +8,15 @@ import type { ComponentMeta, ComponentStory } from '@storybook/react';
8
8
  */
9
9
  import Theme from '../index';
10
10
  import Button from '../../button';
11
+ import { generateThemeVariables, checkContrasts } from '../color-algorithms';
12
+ import { HStack } from '../../h-stack';
11
13
 
12
14
  const meta: ComponentMeta< typeof Theme > = {
13
15
  component: Theme,
14
16
  title: 'Components (Experimental)/Theme',
15
17
  argTypes: {
16
18
  accent: { control: { type: 'color' } },
19
+ background: { control: { type: 'color' } },
17
20
  },
18
21
  parameters: {
19
22
  controls: { expanded: true },
@@ -45,3 +48,67 @@ export const Nested: ComponentStory< typeof Theme > = ( args ) => (
45
48
  Nested.args = {
46
49
  accent: 'blue',
47
50
  };
51
+
52
+ /**
53
+ * The rest of the required colors are generated based on the given accent and background colors.
54
+ */
55
+ export const ColorScheme: ComponentStory< typeof Theme > = ( {
56
+ accent,
57
+ background,
58
+ } ) => {
59
+ const { colors } = generateThemeVariables( { accent, background } );
60
+ const { gray, ...otherColors } = colors;
61
+ const contrastIssues = Object.entries(
62
+ checkContrasts( { accent, background }, colors )
63
+ ).filter( ( [ _, error ] ) => !! error );
64
+
65
+ const Chip = ( { color, name }: { color: string; name: string } ) => (
66
+ <HStack justify="flex-start">
67
+ <div
68
+ style={ {
69
+ backgroundColor: color,
70
+ height: '1.25em',
71
+ width: 40,
72
+ } }
73
+ />
74
+ <div style={ { fontSize: 14 } }>{ name }</div>
75
+ </HStack>
76
+ );
77
+
78
+ return (
79
+ <>
80
+ { Object.entries( otherColors ).map( ( [ key, value ] ) => (
81
+ <Chip color={ value } name={ key } key={ key } />
82
+ ) ) }
83
+ { Object.entries( gray as NonNullable< typeof gray > ).map(
84
+ ( [ key, value ] ) => (
85
+ <Chip
86
+ color={ value }
87
+ name={ `gray ${ key }` }
88
+ key={ key }
89
+ />
90
+ )
91
+ ) }
92
+ { !! contrastIssues.length && (
93
+ <>
94
+ <h2>Contrast issues</h2>
95
+ <ul>
96
+ { contrastIssues.map( ( [ key, error ] ) => (
97
+ <li key={ key }>{ error }</li>
98
+ ) ) }
99
+ </ul>
100
+ </>
101
+ ) }
102
+ </>
103
+ );
104
+ };
105
+ ColorScheme.args = {
106
+ accent: '#007cba',
107
+ background: '#fff',
108
+ };
109
+ ColorScheme.argTypes = {
110
+ children: { table: { disable: true } },
111
+ };
112
+ ColorScheme.parameters = {
113
+ docs: { source: { state: 'closed' } },
114
+ };
@@ -1,28 +1,33 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { colord } from 'colord';
5
4
  import styled from '@emotion/styled';
6
5
  import { css } from '@emotion/react';
7
6
 
8
7
  /**
9
8
  * Internal dependencies
10
9
  */
11
- import type { ThemeProps } from './types';
10
+ import type { ThemeOutputValues } from './types';
12
11
 
13
- const accentColor = ( { accent }: ThemeProps ) =>
14
- accent
15
- ? css`
16
- --wp-components-color-accent: ${ accent };
17
- --wp-components-color-accent-darker-10: ${ colord( accent )
18
- .darken( 0.1 )
19
- .toHex() };
20
- --wp-components-color-accent-darker-20: ${ colord( accent )
21
- .darken( 0.2 )
22
- .toHex() };
23
- `
24
- : undefined;
12
+ export const colorVariables = ( { colors }: ThemeOutputValues ) => {
13
+ const shades = Object.entries( colors.gray || {} )
14
+ .map( ( [ k, v ] ) => `--wp-components-color-gray-${ k }: ${ v };` )
15
+ .join( '' );
25
16
 
26
- export const Wrapper = styled.div< ThemeProps >`
27
- ${ accentColor }
28
- `;
17
+ return [
18
+ css`
19
+ --wp-components-color-accent: ${ colors.accent };
20
+ --wp-components-color-accent-darker-10: ${ colors.accentDarker10 };
21
+ --wp-components-color-accent-darker-20: ${ colors.accentDarker20 };
22
+ --wp-components-color-accent-inverted: ${ colors.accentInverted };
23
+
24
+ --wp-components-color-background: ${ colors.background };
25
+ --wp-components-color-foreground: ${ colors.foreground };
26
+ --wp-components-color-foreground-inverted: ${ colors.foregroundInverted };
27
+
28
+ ${ shades }
29
+ `,
30
+ ];
31
+ };
32
+
33
+ export const Wrapper = styled.div``;