@wordpress/block-editor 11.5.0 → 11.7.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 (345) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +4 -0
  3. package/build/components/block-list/block-html.js +1 -3
  4. package/build/components/block-list/block-html.js.map +1 -1
  5. package/build/components/block-list/block-invalid-warning.js +63 -80
  6. package/build/components/block-list/block-invalid-warning.js.map +1 -1
  7. package/build/components/block-preview/auto.js +6 -23
  8. package/build/components/block-preview/auto.js.map +1 -1
  9. package/build/components/block-settings-menu-controls/index.js +1 -1
  10. package/build/components/block-settings-menu-controls/index.js.map +1 -1
  11. package/build/components/block-switcher/block-transformations-menu.native.js +1 -0
  12. package/build/components/block-switcher/block-transformations-menu.native.js.map +1 -1
  13. package/build/components/convert-to-group-buttons/use-convert-to-group-button-props.js +6 -3
  14. package/build/components/convert-to-group-buttons/use-convert-to-group-button-props.js.map +1 -1
  15. package/build/components/editor-styles/index.js +20 -2
  16. package/build/components/editor-styles/index.js.map +1 -1
  17. package/build/components/global-styles/border-panel.js +306 -0
  18. package/build/components/global-styles/border-panel.js.map +1 -0
  19. package/build/components/global-styles/color-panel.js +583 -0
  20. package/build/components/global-styles/color-panel.js.map +1 -0
  21. package/build/components/global-styles/dimensions-panel.js +8 -30
  22. package/build/components/global-styles/dimensions-panel.js.map +1 -1
  23. package/build/components/global-styles/get-block-css-selector.js +129 -0
  24. package/build/components/global-styles/get-block-css-selector.js.map +1 -0
  25. package/build/components/global-styles/hooks.js +109 -3
  26. package/build/components/global-styles/hooks.js.map +1 -1
  27. package/build/components/global-styles/index.js +36 -0
  28. package/build/components/global-styles/index.js.map +1 -1
  29. package/build/components/global-styles/typography-panel.js +66 -45
  30. package/build/components/global-styles/typography-panel.js.map +1 -1
  31. package/build/components/global-styles/use-global-styles-output.js +180 -99
  32. package/build/components/global-styles/use-global-styles-output.js.map +1 -1
  33. package/build/components/global-styles/utils.js +2 -1
  34. package/build/components/global-styles/utils.js.map +1 -1
  35. package/build/components/image-size-control/index.js +8 -5
  36. package/build/components/image-size-control/index.js.map +1 -1
  37. package/build/components/inserter/index.js +29 -17
  38. package/build/components/inserter/index.js.map +1 -1
  39. package/build/components/inserter/menu.js +1 -1
  40. package/build/components/inserter/menu.js.map +1 -1
  41. package/build/components/inserter/quick-inserter.js +4 -2
  42. package/build/components/inserter/quick-inserter.js.map +1 -1
  43. package/build/components/inserter/search-results.js +10 -3
  44. package/build/components/inserter/search-results.js.map +1 -1
  45. package/build/components/inserter/tabs.js +1 -1
  46. package/build/components/inserter/tabs.js.map +1 -1
  47. package/build/components/inspector-controls-tabs/position-controls-panel.js +43 -7
  48. package/build/components/inspector-controls-tabs/position-controls-panel.js.map +1 -1
  49. package/build/components/line-height-control/index.js +15 -1
  50. package/build/components/line-height-control/index.js.map +1 -1
  51. package/build/components/link-control/index.js +1 -1
  52. package/build/components/link-control/index.js.map +1 -1
  53. package/build/components/link-control/search-item.js +5 -2
  54. package/build/components/link-control/search-item.js.map +1 -1
  55. package/build/components/list-view/appender.js +105 -0
  56. package/build/components/list-view/appender.js.map +1 -0
  57. package/build/components/list-view/block.js +5 -5
  58. package/build/components/list-view/block.js.map +1 -1
  59. package/build/components/list-view/branch.js +25 -5
  60. package/build/components/list-view/branch.js.map +1 -1
  61. package/build/components/list-view/index.js +37 -13
  62. package/build/components/list-view/index.js.map +1 -1
  63. package/build/components/list-view/use-block-selection.js +1 -2
  64. package/build/components/list-view/use-block-selection.js.map +1 -1
  65. package/build/components/media-replace-flow/index.js +13 -4
  66. package/build/components/media-replace-flow/index.js.map +1 -1
  67. package/build/components/off-canvas-editor/appender.js +28 -3
  68. package/build/components/off-canvas-editor/appender.js.map +1 -1
  69. package/build/components/off-canvas-editor/branch.js +5 -3
  70. package/build/components/off-canvas-editor/branch.js.map +1 -1
  71. package/build/components/off-canvas-editor/index.js +9 -7
  72. package/build/components/off-canvas-editor/index.js.map +1 -1
  73. package/build/components/off-canvas-editor/link-ui.js +0 -1
  74. package/build/components/off-canvas-editor/link-ui.js.map +1 -1
  75. package/build/components/provider/use-block-sync.js +17 -3
  76. package/build/components/provider/use-block-sync.js.map +1 -1
  77. package/build/components/rich-text/format-edit.js +2 -30
  78. package/build/components/rich-text/format-edit.js.map +1 -1
  79. package/build/components/rich-text/format-toolbar-container.js +0 -3
  80. package/build/components/rich-text/format-toolbar-container.js.map +1 -1
  81. package/build/components/writing-flow/use-input.js +4 -8
  82. package/build/components/writing-flow/use-input.js.map +1 -1
  83. package/build/hooks/border.js +90 -240
  84. package/build/hooks/border.js.map +1 -1
  85. package/build/hooks/color.js +92 -229
  86. package/build/hooks/color.js.map +1 -1
  87. package/build/hooks/content-lock-ui.js +4 -2
  88. package/build/hooks/content-lock-ui.js.map +1 -1
  89. package/build/hooks/{color-panel.js → contrast-checker.js} +11 -49
  90. package/build/hooks/contrast-checker.js.map +1 -0
  91. package/build/hooks/custom-class-name.js +4 -4
  92. package/build/hooks/custom-class-name.js.map +1 -1
  93. package/build/hooks/custom-class-name.native.js +3 -4
  94. package/build/hooks/custom-class-name.native.js.map +1 -1
  95. package/build/hooks/dimensions.js +0 -1
  96. package/build/hooks/dimensions.js.map +1 -1
  97. package/build/hooks/duotone.js +3 -1
  98. package/build/hooks/duotone.js.map +1 -1
  99. package/build/hooks/layout.js +19 -22
  100. package/build/hooks/layout.js.map +1 -1
  101. package/build/hooks/position.js +2 -2
  102. package/build/hooks/position.js.map +1 -1
  103. package/build/hooks/style.js +23 -26
  104. package/build/hooks/style.js.map +1 -1
  105. package/build/hooks/supports.js +7 -1
  106. package/build/hooks/supports.js.map +1 -1
  107. package/build/hooks/typography.js +2 -2
  108. package/build/hooks/typography.js.map +1 -1
  109. package/build/hooks/utils.js +50 -75
  110. package/build/hooks/utils.js.map +1 -1
  111. package/build/layouts/constrained.js +6 -2
  112. package/build/layouts/constrained.js.map +1 -1
  113. package/build/layouts/grid.js +165 -0
  114. package/build/layouts/grid.js.map +1 -0
  115. package/build/layouts/index.js +3 -1
  116. package/build/layouts/index.js.map +1 -1
  117. package/build/private-apis.js +7 -1
  118. package/build/private-apis.js.map +1 -1
  119. package/build/store/actions.js +10 -8
  120. package/build/store/actions.js.map +1 -1
  121. package/build/store/selectors.js +19 -3
  122. package/build/store/selectors.js.map +1 -1
  123. package/build/utils/object.js +76 -0
  124. package/build/utils/object.js.map +1 -0
  125. package/build/utils/parse-css-unit-to-px.js +15 -9
  126. package/build/utils/parse-css-unit-to-px.js.map +1 -1
  127. package/build-module/components/block-list/block-html.js +1 -3
  128. package/build-module/components/block-list/block-html.js.map +1 -1
  129. package/build-module/components/block-list/block-invalid-warning.js +66 -78
  130. package/build-module/components/block-list/block-invalid-warning.js.map +1 -1
  131. package/build-module/components/block-preview/auto.js +6 -22
  132. package/build-module/components/block-preview/auto.js.map +1 -1
  133. package/build-module/components/block-settings-menu-controls/index.js +1 -1
  134. package/build-module/components/block-settings-menu-controls/index.js.map +1 -1
  135. package/build-module/components/block-switcher/block-transformations-menu.native.js +1 -0
  136. package/build-module/components/block-switcher/block-transformations-menu.native.js.map +1 -1
  137. package/build-module/components/convert-to-group-buttons/use-convert-to-group-button-props.js +6 -3
  138. package/build-module/components/convert-to-group-buttons/use-convert-to-group-button-props.js.map +1 -1
  139. package/build-module/components/editor-styles/index.js +19 -2
  140. package/build-module/components/editor-styles/index.js.map +1 -1
  141. package/build-module/components/global-styles/border-panel.js +291 -0
  142. package/build-module/components/global-styles/border-panel.js.map +1 -0
  143. package/build-module/components/global-styles/color-panel.js +554 -0
  144. package/build-module/components/global-styles/color-panel.js.map +1 -0
  145. package/build-module/components/global-styles/dimensions-panel.js +7 -30
  146. package/build-module/components/global-styles/dimensions-panel.js.map +1 -1
  147. package/build-module/components/global-styles/get-block-css-selector.js +120 -0
  148. package/build-module/components/global-styles/get-block-css-selector.js.map +1 -0
  149. package/build-module/components/global-styles/hooks.js +104 -3
  150. package/build-module/components/global-styles/hooks.js.map +1 -1
  151. package/build-module/components/global-styles/index.js +3 -0
  152. package/build-module/components/global-styles/index.js.map +1 -1
  153. package/build-module/components/global-styles/typography-panel.js +65 -46
  154. package/build-module/components/global-styles/typography-panel.js.map +1 -1
  155. package/build-module/components/global-styles/use-global-styles-output.js +181 -100
  156. package/build-module/components/global-styles/use-global-styles-output.js.map +1 -1
  157. package/build-module/components/global-styles/utils.js +2 -1
  158. package/build-module/components/global-styles/utils.js.map +1 -1
  159. package/build-module/components/image-size-control/index.js +8 -5
  160. package/build-module/components/image-size-control/index.js.map +1 -1
  161. package/build-module/components/inserter/index.js +28 -16
  162. package/build-module/components/inserter/index.js.map +1 -1
  163. package/build-module/components/inserter/menu.js +1 -1
  164. package/build-module/components/inserter/menu.js.map +1 -1
  165. package/build-module/components/inserter/quick-inserter.js +4 -2
  166. package/build-module/components/inserter/quick-inserter.js.map +1 -1
  167. package/build-module/components/inserter/search-results.js +10 -3
  168. package/build-module/components/inserter/search-results.js.map +1 -1
  169. package/build-module/components/inserter/tabs.js +1 -1
  170. package/build-module/components/inserter/tabs.js.map +1 -1
  171. package/build-module/components/inspector-controls-tabs/position-controls-panel.js +42 -7
  172. package/build-module/components/inspector-controls-tabs/position-controls-panel.js.map +1 -1
  173. package/build-module/components/line-height-control/index.js +15 -1
  174. package/build-module/components/line-height-control/index.js.map +1 -1
  175. package/build-module/components/link-control/index.js +1 -1
  176. package/build-module/components/link-control/index.js.map +1 -1
  177. package/build-module/components/link-control/search-item.js +4 -2
  178. package/build-module/components/link-control/search-item.js.map +1 -1
  179. package/build-module/components/list-view/appender.js +88 -0
  180. package/build-module/components/list-view/appender.js.map +1 -0
  181. package/build-module/components/list-view/block.js +5 -4
  182. package/build-module/components/list-view/block.js.map +1 -1
  183. package/build-module/components/list-view/branch.js +22 -5
  184. package/build-module/components/list-view/branch.js.map +1 -1
  185. package/build-module/components/list-view/index.js +32 -12
  186. package/build-module/components/list-view/index.js.map +1 -1
  187. package/build-module/components/list-view/use-block-selection.js +1 -2
  188. package/build-module/components/list-view/use-block-selection.js.map +1 -1
  189. package/build-module/components/media-replace-flow/index.js +12 -4
  190. package/build-module/components/media-replace-flow/index.js.map +1 -1
  191. package/build-module/components/off-canvas-editor/appender.js +28 -4
  192. package/build-module/components/off-canvas-editor/appender.js.map +1 -1
  193. package/build-module/components/off-canvas-editor/branch.js +5 -3
  194. package/build-module/components/off-canvas-editor/branch.js.map +1 -1
  195. package/build-module/components/off-canvas-editor/index.js +9 -7
  196. package/build-module/components/off-canvas-editor/index.js.map +1 -1
  197. package/build-module/components/off-canvas-editor/link-ui.js +0 -1
  198. package/build-module/components/off-canvas-editor/link-ui.js.map +1 -1
  199. package/build-module/components/provider/use-block-sync.js +17 -3
  200. package/build-module/components/provider/use-block-sync.js.map +1 -1
  201. package/build-module/components/rich-text/format-edit.js +3 -31
  202. package/build-module/components/rich-text/format-edit.js.map +1 -1
  203. package/build-module/components/rich-text/format-toolbar-container.js +0 -3
  204. package/build-module/components/rich-text/format-toolbar-container.js.map +1 -1
  205. package/build-module/components/writing-flow/use-input.js +4 -8
  206. package/build-module/components/writing-flow/use-input.js.map +1 -1
  207. package/build-module/hooks/border.js +92 -240
  208. package/build-module/hooks/border.js.map +1 -1
  209. package/build-module/hooks/color.js +90 -232
  210. package/build-module/hooks/color.js.map +1 -1
  211. package/build-module/hooks/content-lock-ui.js +4 -2
  212. package/build-module/hooks/content-lock-ui.js.map +1 -1
  213. package/build-module/hooks/{color-panel.js → contrast-checker.js} +10 -44
  214. package/build-module/hooks/contrast-checker.js.map +1 -0
  215. package/build-module/hooks/custom-class-name.js +4 -4
  216. package/build-module/hooks/custom-class-name.js.map +1 -1
  217. package/build-module/hooks/custom-class-name.native.js +3 -4
  218. package/build-module/hooks/custom-class-name.native.js.map +1 -1
  219. package/build-module/hooks/dimensions.js +0 -1
  220. package/build-module/hooks/dimensions.js.map +1 -1
  221. package/build-module/hooks/duotone.js +4 -2
  222. package/build-module/hooks/duotone.js.map +1 -1
  223. package/build-module/hooks/layout.js +19 -22
  224. package/build-module/hooks/layout.js.map +1 -1
  225. package/build-module/hooks/position.js +3 -3
  226. package/build-module/hooks/position.js.map +1 -1
  227. package/build-module/hooks/style.js +23 -26
  228. package/build-module/hooks/style.js.map +1 -1
  229. package/build-module/hooks/supports.js +7 -1
  230. package/build-module/hooks/supports.js.map +1 -1
  231. package/build-module/hooks/typography.js +2 -2
  232. package/build-module/hooks/typography.js.map +1 -1
  233. package/build-module/hooks/utils.js +48 -72
  234. package/build-module/hooks/utils.js.map +1 -1
  235. package/build-module/layouts/constrained.js +6 -2
  236. package/build-module/layouts/constrained.js.map +1 -1
  237. package/build-module/layouts/grid.js +151 -0
  238. package/build-module/layouts/grid.js.map +1 -0
  239. package/build-module/layouts/index.js +2 -1
  240. package/build-module/layouts/index.js.map +1 -1
  241. package/build-module/private-apis.js +5 -1
  242. package/build-module/private-apis.js.map +1 -1
  243. package/build-module/store/actions.js +10 -8
  244. package/build-module/store/actions.js.map +1 -1
  245. package/build-module/store/selectors.js +17 -3
  246. package/build-module/store/selectors.js.map +1 -1
  247. package/build-module/utils/object.js +69 -0
  248. package/build-module/utils/object.js.map +1 -0
  249. package/build-module/utils/parse-css-unit-to-px.js +15 -9
  250. package/build-module/utils/parse-css-unit-to-px.js.map +1 -1
  251. package/build-style/style-rtl.css +32 -12
  252. package/build-style/style.css +32 -12
  253. package/package.json +31 -31
  254. package/src/components/block-draggable/content.scss +1 -1
  255. package/src/components/block-inspector/style.scss +3 -0
  256. package/src/components/block-list/block-html.js +1 -1
  257. package/src/components/block-list/block-invalid-warning.js +72 -64
  258. package/src/components/block-mover/test/__snapshots__/index.native.js.snap +20 -2
  259. package/src/components/block-preview/auto.js +2 -17
  260. package/src/components/block-preview/test/index.js +0 -2
  261. package/src/components/block-settings-menu-controls/index.js +2 -1
  262. package/src/components/block-styles/style.scss +2 -2
  263. package/src/components/block-switcher/block-transformations-menu.native.js +1 -0
  264. package/src/components/color-palette/test/__snapshots__/control.js.snap +16 -14
  265. package/src/components/colors-gradients/style.scss +8 -8
  266. package/src/components/convert-to-group-buttons/use-convert-to-group-button-props.js +48 -38
  267. package/src/components/editor-styles/index.js +29 -1
  268. package/src/components/global-styles/border-panel.js +285 -0
  269. package/src/components/global-styles/color-panel.js +706 -0
  270. package/src/components/global-styles/dimensions-panel.js +13 -42
  271. package/src/components/global-styles/get-block-css-selector.js +129 -0
  272. package/src/components/global-styles/hooks.js +154 -1
  273. package/src/components/global-styles/index.js +3 -0
  274. package/src/components/global-styles/test/use-global-styles-output.js +31 -2
  275. package/src/components/global-styles/typography-panel.js +67 -45
  276. package/src/components/global-styles/use-global-styles-output.js +176 -93
  277. package/src/components/global-styles/utils.js +3 -0
  278. package/src/components/image-size-control/index.js +4 -3
  279. package/src/components/image-size-control/test/index.js +2 -2
  280. package/src/components/inner-blocks/README.md +1 -1
  281. package/src/components/inserter/index.js +30 -11
  282. package/src/components/inserter/menu.js +0 -1
  283. package/src/components/inserter/quick-inserter.js +2 -0
  284. package/src/components/inserter/search-results.js +7 -1
  285. package/src/components/inserter/style.scss +3 -0
  286. package/src/components/inserter/tabs.js +1 -9
  287. package/src/components/inspector-controls-tabs/position-controls-panel.js +40 -9
  288. package/src/components/line-height-control/index.js +10 -1
  289. package/src/components/link-control/index.js +1 -1
  290. package/src/components/link-control/search-item.js +3 -1
  291. package/src/components/link-control/style.scss +0 -4
  292. package/src/components/link-control/test/index.js +0 -2
  293. package/src/components/list-view/appender.js +101 -0
  294. package/src/components/list-view/block.js +5 -4
  295. package/src/components/list-view/branch.js +30 -1
  296. package/src/components/list-view/index.js +43 -10
  297. package/src/components/list-view/style.scss +19 -0
  298. package/src/components/list-view/use-block-selection.js +0 -2
  299. package/src/components/media-replace-flow/index.js +36 -24
  300. package/src/components/media-replace-flow/style.scss +5 -2
  301. package/src/components/off-canvas-editor/appender.js +31 -5
  302. package/src/components/off-canvas-editor/branch.js +3 -1
  303. package/src/components/off-canvas-editor/index.js +7 -7
  304. package/src/components/off-canvas-editor/link-ui.js +0 -1
  305. package/src/components/provider/use-block-sync.js +21 -4
  306. package/src/components/rich-text/format-edit.js +2 -32
  307. package/src/components/rich-text/format-toolbar-container.js +1 -7
  308. package/src/components/url-popover/test/index.js +0 -2
  309. package/src/components/writing-flow/use-input.js +4 -5
  310. package/src/hooks/border.js +93 -225
  311. package/src/hooks/color.js +120 -296
  312. package/src/hooks/content-lock-ui.js +6 -2
  313. package/src/hooks/{color-panel.js → contrast-checker.js} +10 -46
  314. package/src/hooks/custom-class-name.js +4 -4
  315. package/src/hooks/custom-class-name.native.js +3 -4
  316. package/src/hooks/dimensions.js +0 -1
  317. package/src/hooks/duotone.js +8 -5
  318. package/src/hooks/layout.js +19 -16
  319. package/src/hooks/position.js +3 -3
  320. package/src/hooks/style.js +29 -28
  321. package/src/hooks/supports.js +6 -0
  322. package/src/hooks/test/style.js +2 -1
  323. package/src/hooks/test/use-typography-props.js +2 -0
  324. package/src/hooks/test/utils.js +0 -104
  325. package/src/hooks/typography.js +2 -1
  326. package/src/hooks/utils.js +63 -70
  327. package/src/layouts/constrained.js +23 -17
  328. package/src/layouts/grid.js +172 -0
  329. package/src/layouts/index.js +2 -1
  330. package/src/layouts/test/grid.js +21 -0
  331. package/src/private-apis.js +4 -0
  332. package/src/store/actions.js +10 -8
  333. package/src/store/selectors.js +20 -3
  334. package/src/utils/object.js +69 -0
  335. package/src/utils/parse-css-unit-to-px.js +14 -9
  336. package/src/utils/test/object.js +107 -0
  337. package/src/utils/test/parse-css-unit-to-px.js +1 -2
  338. package/tsconfig.tsbuildinfo +1 -1
  339. package/build/hooks/border-radius.js +0 -100
  340. package/build/hooks/border-radius.js.map +0 -1
  341. package/build/hooks/color-panel.js.map +0 -1
  342. package/build-module/hooks/border-radius.js +0 -84
  343. package/build-module/hooks/border-radius.js.map +0 -1
  344. package/build-module/hooks/color-panel.js.map +0 -1
  345. package/src/hooks/border-radius.js +0 -70
@@ -0,0 +1,706 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import classnames from 'classnames';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import {
10
+ __experimentalToolsPanel as ToolsPanel,
11
+ __experimentalToolsPanelItem as ToolsPanelItem,
12
+ __experimentalHStack as HStack,
13
+ __experimentalZStack as ZStack,
14
+ __experimentalDropdownContentWrapper as DropdownContentWrapper,
15
+ TabPanel,
16
+ ColorIndicator,
17
+ Flex,
18
+ FlexItem,
19
+ Dropdown,
20
+ Button,
21
+ } from '@wordpress/components';
22
+ import { useCallback } from '@wordpress/element';
23
+ import { __ } from '@wordpress/i18n';
24
+
25
+ /**
26
+ * Internal dependencies
27
+ */
28
+ import ColorGradientControl from '../colors-gradients/control';
29
+ import { useColorsPerOrigin, useGradientsPerOrigin } from './hooks';
30
+ import { getValueFromVariable } from './utils';
31
+ import { immutableSet } from '../../utils/object';
32
+
33
+ export function useHasColorPanel( settings ) {
34
+ const hasTextPanel = useHasTextPanel( settings );
35
+ const hasBackgroundPanel = useHasBackgroundPanel( settings );
36
+ const hasLinkPanel = useHasLinkPanel( settings );
37
+ const hasHeadingPanel = useHasHeadingPanel( settings );
38
+ const hasButtonPanel = useHasHeadingPanel( settings );
39
+ const hasCaptionPanel = useHasCaptionPanel( settings );
40
+
41
+ return (
42
+ hasTextPanel ||
43
+ hasBackgroundPanel ||
44
+ hasLinkPanel ||
45
+ hasHeadingPanel ||
46
+ hasButtonPanel ||
47
+ hasCaptionPanel
48
+ );
49
+ }
50
+
51
+ export function useHasTextPanel( settings ) {
52
+ const colors = useColorsPerOrigin( settings );
53
+ return (
54
+ settings?.color?.text &&
55
+ ( colors?.length > 0 || settings?.color?.custom )
56
+ );
57
+ }
58
+
59
+ export function useHasLinkPanel( settings ) {
60
+ const colors = useColorsPerOrigin( settings );
61
+ return (
62
+ settings?.color?.link &&
63
+ ( colors?.length > 0 || settings?.color?.custom )
64
+ );
65
+ }
66
+
67
+ export function useHasCaptionPanel( settings ) {
68
+ const colors = useColorsPerOrigin( settings );
69
+ return (
70
+ settings?.color?.caption &&
71
+ ( colors?.length > 0 || settings?.color?.custom )
72
+ );
73
+ }
74
+
75
+ export function useHasHeadingPanel( settings ) {
76
+ const colors = useColorsPerOrigin( settings );
77
+ const gradients = useGradientsPerOrigin( settings );
78
+ return (
79
+ settings?.color?.heading &&
80
+ ( colors?.length > 0 ||
81
+ settings?.color?.custom ||
82
+ gradients?.length > 0 ||
83
+ settings?.color?.customGradient )
84
+ );
85
+ }
86
+
87
+ export function useHasButtonPanel( settings ) {
88
+ const colors = useColorsPerOrigin( settings );
89
+ const gradients = useGradientsPerOrigin( settings );
90
+ return (
91
+ settings?.color?.button &&
92
+ ( colors?.length > 0 ||
93
+ settings?.color?.custom ||
94
+ gradients?.length > 0 ||
95
+ settings?.color?.customGradient )
96
+ );
97
+ }
98
+
99
+ export function useHasBackgroundPanel( settings ) {
100
+ const colors = useColorsPerOrigin( settings );
101
+ const gradients = useGradientsPerOrigin( settings );
102
+ return (
103
+ settings?.color?.background &&
104
+ ( colors?.length > 0 ||
105
+ settings?.color?.custom ||
106
+ gradients?.length > 0 ||
107
+ settings?.color?.customGradient )
108
+ );
109
+ }
110
+
111
+ function ColorToolsPanel( {
112
+ resetAllFilter,
113
+ onChange,
114
+ value,
115
+ panelId,
116
+ children,
117
+ } ) {
118
+ const resetAll = () => {
119
+ const updatedValue = resetAllFilter( value );
120
+ onChange( updatedValue );
121
+ };
122
+
123
+ return (
124
+ <ToolsPanel
125
+ label={ __( 'Color' ) }
126
+ resetAll={ resetAll }
127
+ panelId={ panelId }
128
+ hasInnerWrapper
129
+ className="color-block-support-panel"
130
+ __experimentalFirstVisibleItemClass="first"
131
+ __experimentalLastVisibleItemClass="last"
132
+ >
133
+ <div className="color-block-support-panel__inner-wrapper">
134
+ { children }
135
+ </div>
136
+ </ToolsPanel>
137
+ );
138
+ }
139
+
140
+ const DEFAULT_CONTROLS = {
141
+ text: true,
142
+ background: true,
143
+ link: true,
144
+ heading: true,
145
+ button: true,
146
+ caption: true,
147
+ };
148
+
149
+ const popoverProps = {
150
+ placement: 'left-start',
151
+ offset: 36,
152
+ shift: true,
153
+ };
154
+
155
+ const LabeledColorIndicators = ( { indicators, label } ) => (
156
+ <HStack justify="flex-start">
157
+ <ZStack isLayered={ false } offset={ -8 }>
158
+ { indicators.map( ( indicator, index ) => (
159
+ <Flex key={ index } expanded={ false }>
160
+ <ColorIndicator colorValue={ indicator } />
161
+ </Flex>
162
+ ) ) }
163
+ </ZStack>
164
+ <FlexItem
165
+ className="block-editor-panel-color-gradient-settings__color-name"
166
+ title={ label }
167
+ >
168
+ { label }
169
+ </FlexItem>
170
+ </HStack>
171
+ );
172
+
173
+ function ColorPanelTab( {
174
+ isGradient,
175
+ inheritedValue,
176
+ userValue,
177
+ setValue,
178
+ colorGradientControlSettings,
179
+ } ) {
180
+ return (
181
+ <ColorGradientControl
182
+ { ...colorGradientControlSettings }
183
+ showTitle={ false }
184
+ enableAlpha
185
+ __experimentalIsRenderedInSidebar
186
+ colorValue={ isGradient ? undefined : inheritedValue }
187
+ gradientValue={ isGradient ? inheritedValue : undefined }
188
+ onColorChange={ isGradient ? undefined : setValue }
189
+ onGradientChange={ isGradient ? setValue : undefined }
190
+ clearable={ inheritedValue === userValue }
191
+ headingLevel={ 3 }
192
+ />
193
+ );
194
+ }
195
+
196
+ function ColorPanelDropdown( {
197
+ label,
198
+ hasValue,
199
+ resetValue,
200
+ isShownByDefault,
201
+ indicators,
202
+ tabs,
203
+ colorGradientControlSettings,
204
+ panelId,
205
+ } ) {
206
+ const tabConfigs = tabs.map( ( { key, label: tabLabel } ) => {
207
+ return {
208
+ name: key,
209
+ title: tabLabel,
210
+ };
211
+ } );
212
+
213
+ return (
214
+ <ToolsPanelItem
215
+ className="block-editor-tools-panel-color-gradient-settings__item"
216
+ hasValue={ hasValue }
217
+ label={ label }
218
+ onDeselect={ resetValue }
219
+ isShownByDefault={ isShownByDefault }
220
+ panelId={ panelId }
221
+ >
222
+ <Dropdown
223
+ popoverProps={ popoverProps }
224
+ className="block-editor-tools-panel-color-gradient-settings__dropdown"
225
+ renderToggle={ ( { onToggle, isOpen } ) => {
226
+ const toggleProps = {
227
+ onClick: onToggle,
228
+ className: classnames(
229
+ 'block-editor-panel-color-gradient-settings__dropdown',
230
+ { 'is-open': isOpen }
231
+ ),
232
+ 'aria-expanded': isOpen,
233
+ };
234
+
235
+ return (
236
+ <Button { ...toggleProps }>
237
+ <LabeledColorIndicators
238
+ indicators={ indicators }
239
+ label={ label }
240
+ />
241
+ </Button>
242
+ );
243
+ } }
244
+ renderContent={ () => (
245
+ <DropdownContentWrapper paddingSize="none">
246
+ <div className="block-editor-panel-color-gradient-settings__dropdown-content">
247
+ { tabs.length === 1 && (
248
+ <ColorPanelTab
249
+ { ...tabs[ 0 ] }
250
+ colorGradientControlSettings={
251
+ colorGradientControlSettings
252
+ }
253
+ />
254
+ ) }
255
+ { tabs.length > 1 && (
256
+ <TabPanel tabs={ tabConfigs }>
257
+ { ( tab ) => {
258
+ const selectedTab = tabs.find(
259
+ ( t ) => t.key === tab.name
260
+ );
261
+
262
+ if ( ! selectedTab ) {
263
+ return null;
264
+ }
265
+
266
+ return (
267
+ <ColorPanelTab
268
+ { ...selectedTab }
269
+ colorGradientControlSettings={
270
+ colorGradientControlSettings
271
+ }
272
+ />
273
+ );
274
+ } }
275
+ </TabPanel>
276
+ ) }
277
+ </div>
278
+ </DropdownContentWrapper>
279
+ ) }
280
+ />
281
+ </ToolsPanelItem>
282
+ );
283
+ }
284
+
285
+ export default function ColorPanel( {
286
+ as: Wrapper = ColorToolsPanel,
287
+ value,
288
+ onChange,
289
+ inheritedValue = value,
290
+ settings,
291
+ panelId,
292
+ defaultControls = DEFAULT_CONTROLS,
293
+ children,
294
+ } ) {
295
+ const colors = useColorsPerOrigin( settings );
296
+ const gradients = useGradientsPerOrigin( settings );
297
+ const areCustomSolidsEnabled = settings?.color?.custom;
298
+ const areCustomGradientsEnabled = settings?.color?.customGradient;
299
+ const hasSolidColors = colors.length > 0 || areCustomSolidsEnabled;
300
+ const hasGradientColors = gradients.length > 0 || areCustomGradientsEnabled;
301
+ const decodeValue = ( rawValue ) =>
302
+ getValueFromVariable( { settings }, '', rawValue );
303
+ const encodeColorValue = ( colorValue ) => {
304
+ const allColors = colors.flatMap(
305
+ ( { colors: originColors } ) => originColors
306
+ );
307
+ const colorObject = allColors.find(
308
+ ( { color } ) => color === colorValue
309
+ );
310
+ return colorObject
311
+ ? 'var:preset|color|' + colorObject.slug
312
+ : colorValue;
313
+ };
314
+ const encodeGradientValue = ( gradientValue ) => {
315
+ const allGradients = gradients.flatMap(
316
+ ( { gradients: originGradients } ) => originGradients
317
+ );
318
+ const gradientObject = allGradients.find(
319
+ ( { gradient } ) => gradient === gradientValue
320
+ );
321
+ return gradientObject
322
+ ? 'var:preset|gradient|' + gradientObject.slug
323
+ : gradientValue;
324
+ };
325
+
326
+ // Text Color
327
+ const showTextPanel = useHasTextPanel( settings );
328
+ const textColor = decodeValue( inheritedValue?.color?.text );
329
+ const userTextColor = decodeValue( value?.color?.text );
330
+ const hasTextColor = () => !! userTextColor;
331
+ const setTextColor = ( newColor ) => {
332
+ onChange(
333
+ immutableSet(
334
+ value,
335
+ [ 'color', 'text' ],
336
+ encodeColorValue( newColor )
337
+ )
338
+ );
339
+ };
340
+ const resetTextColor = () => setTextColor( undefined );
341
+
342
+ // BackgroundColor
343
+ const showBackgroundPanel = useHasBackgroundPanel( settings );
344
+ const backgroundColor = decodeValue( inheritedValue?.color?.background );
345
+ const userBackgroundColor = decodeValue( value?.color?.background );
346
+ const gradient = decodeValue( inheritedValue?.color?.gradient );
347
+ const userGradient = decodeValue( value?.color?.gradient );
348
+ const hasBackground = () => !! userBackgroundColor || !! userGradient;
349
+ const setBackgroundColor = ( newColor ) => {
350
+ const newValue = immutableSet(
351
+ value,
352
+ [ 'color', 'background' ],
353
+ encodeColorValue( newColor )
354
+ );
355
+ newValue.color.gradient = undefined;
356
+ onChange( newValue );
357
+ };
358
+ const setGradient = ( newGradient ) => {
359
+ const newValue = immutableSet(
360
+ value,
361
+ [ 'color', 'gradient' ],
362
+ encodeGradientValue( newGradient )
363
+ );
364
+ newValue.color.background = undefined;
365
+ onChange( newValue );
366
+ };
367
+ const resetBackground = () => {
368
+ const newValue = immutableSet(
369
+ value,
370
+ [ 'color', 'background' ],
371
+ undefined
372
+ );
373
+ newValue.color.gradient = undefined;
374
+ onChange( newValue );
375
+ };
376
+
377
+ // Links
378
+ const showLinkPanel = useHasLinkPanel( settings );
379
+ const linkColor = decodeValue(
380
+ inheritedValue?.elements?.link?.color?.text
381
+ );
382
+ const userLinkColor = decodeValue( value?.elements?.link?.color?.text );
383
+ const setLinkColor = ( newColor ) => {
384
+ onChange(
385
+ immutableSet(
386
+ value,
387
+ [ 'elements', 'link', 'color', 'text' ],
388
+ encodeColorValue( newColor )
389
+ )
390
+ );
391
+ };
392
+ const hoverLinkColor = decodeValue(
393
+ inheritedValue?.elements?.link?.[ ':hover' ]?.color?.text
394
+ );
395
+ const userHoverLinkColor = decodeValue(
396
+ value?.elements?.link?.[ ':hover' ]?.color?.text
397
+ );
398
+ const setHoverLinkColor = ( newColor ) => {
399
+ onChange(
400
+ immutableSet(
401
+ value,
402
+ [ 'elements', 'link', ':hover', 'color', 'text' ],
403
+ encodeColorValue( newColor )
404
+ )
405
+ );
406
+ };
407
+ const hasLink = () => !! userLinkColor || !! userHoverLinkColor;
408
+ const resetLink = () => {
409
+ let newValue = immutableSet(
410
+ value,
411
+ [ 'elements', 'link', ':hover', 'color', 'text' ],
412
+ undefined
413
+ );
414
+ newValue = immutableSet(
415
+ newValue,
416
+ [ 'elements', 'link', 'color', 'text' ],
417
+ undefined
418
+ );
419
+ onChange( newValue );
420
+ };
421
+
422
+ // Elements
423
+ const elements = [
424
+ {
425
+ name: 'caption',
426
+ label: __( 'Captions' ),
427
+ showPanel: useHasCaptionPanel( settings ),
428
+ },
429
+ {
430
+ name: 'button',
431
+ label: __( 'Button' ),
432
+ showPanel: useHasButtonPanel( settings ),
433
+ },
434
+ {
435
+ name: 'heading',
436
+ label: __( 'Heading' ),
437
+ showPanel: useHasHeadingPanel( settings ),
438
+ },
439
+ {
440
+ name: 'h1',
441
+ label: __( 'H1' ),
442
+ showPanel: useHasHeadingPanel( settings ),
443
+ },
444
+ {
445
+ name: 'h2',
446
+ label: __( 'H2' ),
447
+ showPanel: useHasHeadingPanel( settings ),
448
+ },
449
+ {
450
+ name: 'h3',
451
+ label: __( 'H3' ),
452
+ showPanel: useHasHeadingPanel( settings ),
453
+ },
454
+ {
455
+ name: 'h4',
456
+ label: __( 'H4' ),
457
+ showPanel: useHasHeadingPanel( settings ),
458
+ },
459
+ {
460
+ name: 'h5',
461
+ label: __( 'H5' ),
462
+ showPanel: useHasHeadingPanel( settings ),
463
+ },
464
+ {
465
+ name: 'h6',
466
+ label: __( 'H6' ),
467
+ showPanel: useHasHeadingPanel( settings ),
468
+ },
469
+ ];
470
+
471
+ const resetAllFilter = useCallback( ( previousValue ) => {
472
+ return {
473
+ ...previousValue,
474
+ color: undefined,
475
+ elements: {
476
+ ...previousValue?.elements,
477
+ link: {
478
+ ...previousValue?.elements?.link,
479
+ color: undefined,
480
+ ':hover': {
481
+ color: undefined,
482
+ },
483
+ },
484
+ ...elements.reduce( ( acc, element ) => {
485
+ return {
486
+ ...acc,
487
+ [ element.name ]: {
488
+ ...previousValue?.elements?.[ element.name ],
489
+ color: undefined,
490
+ },
491
+ };
492
+ }, {} ),
493
+ },
494
+ };
495
+ }, [] );
496
+
497
+ const items = [
498
+ showTextPanel && {
499
+ key: 'text',
500
+ label: __( 'Text' ),
501
+ hasValue: hasTextColor,
502
+ resetValue: resetTextColor,
503
+ isShownByDefault: defaultControls.text,
504
+ indicators: [ textColor ],
505
+ tabs: [
506
+ {
507
+ key: 'text',
508
+ label: __( 'Text' ),
509
+ inheritedValue: textColor,
510
+ setValue: setTextColor,
511
+ userValue: userTextColor,
512
+ },
513
+ ],
514
+ },
515
+ showBackgroundPanel && {
516
+ key: 'background',
517
+ label: __( 'Background' ),
518
+ hasValue: hasBackground,
519
+ resetValue: resetBackground,
520
+ isShownByDefault: defaultControls.background,
521
+ indicators: [ gradient ?? backgroundColor ],
522
+ tabs: [
523
+ {
524
+ key: 'background',
525
+ label: __( 'Solid' ),
526
+ inheritedValue: backgroundColor,
527
+ setValue: setBackgroundColor,
528
+ userValue: userBackgroundColor,
529
+ },
530
+ {
531
+ key: 'gradient',
532
+ label: __( 'Gradient' ),
533
+ inheritedValue: gradient,
534
+ setValue: setGradient,
535
+ userValue: userGradient,
536
+ isGradient: true,
537
+ },
538
+ ],
539
+ },
540
+ showLinkPanel && {
541
+ key: 'link',
542
+ label: __( 'Link' ),
543
+ hasValue: hasLink,
544
+ resetValue: resetLink,
545
+ isShownByDefault: defaultControls.link,
546
+ indicators: [ linkColor, hoverLinkColor ],
547
+ tabs: [
548
+ {
549
+ key: 'link',
550
+ label: __( 'Default' ),
551
+ inheritedValue: linkColor,
552
+ setValue: setLinkColor,
553
+ userValue: userLinkColor,
554
+ },
555
+ {
556
+ key: 'hover',
557
+ label: __( 'Hover' ),
558
+ inheritedValue: hoverLinkColor,
559
+ setValue: setHoverLinkColor,
560
+ userValue: userHoverLinkColor,
561
+ },
562
+ ],
563
+ },
564
+ ].filter( Boolean );
565
+
566
+ elements.forEach( ( { name, label, showPanel } ) => {
567
+ if ( ! showPanel ) return;
568
+
569
+ const elementBackgroundColor = decodeValue(
570
+ inheritedValue?.elements?.[ name ]?.color?.background
571
+ );
572
+ const elementGradient = decodeValue(
573
+ inheritedValue?.elements?.[ name ]?.color?.gradient
574
+ );
575
+ const elementTextColor = decodeValue(
576
+ inheritedValue?.elements?.[ name ]?.color?.text
577
+ );
578
+ const elementBackgroundUserColor = decodeValue(
579
+ value?.elements?.[ name ]?.color?.background
580
+ );
581
+ const elementGradientUserColor = decodeValue(
582
+ value?.elements?.[ name ]?.color?.gradient
583
+ );
584
+ const elementTextUserColor = decodeValue(
585
+ value?.elements?.[ name ]?.color?.text
586
+ );
587
+ const hasElement = () =>
588
+ !! (
589
+ elementTextUserColor ||
590
+ elementBackgroundUserColor ||
591
+ elementGradientUserColor
592
+ );
593
+ const resetElement = () => {
594
+ const newValue = immutableSet(
595
+ value,
596
+ [ 'elements', name, 'color', 'background' ],
597
+ undefined
598
+ );
599
+ newValue.elements[ name ].color.gradient = undefined;
600
+ newValue.elements[ name ].color.text = undefined;
601
+ onChange( newValue );
602
+ };
603
+
604
+ const setElementTextColor = ( newTextColor ) => {
605
+ onChange(
606
+ immutableSet(
607
+ value,
608
+ [ 'elements', name, 'color', 'text' ],
609
+ encodeColorValue( newTextColor )
610
+ )
611
+ );
612
+ };
613
+ const setElementBackgroundColor = ( newBackgroundColor ) => {
614
+ const newValue = immutableSet(
615
+ value,
616
+ [ 'elements', name, 'color', 'background' ],
617
+ encodeColorValue( newBackgroundColor )
618
+ );
619
+ newValue.elements[ name ].color.gradient = undefined;
620
+ onChange( newValue );
621
+ };
622
+ const setElementGradient = ( newGradient ) => {
623
+ const newValue = immutableSet(
624
+ value,
625
+ [ 'elements', name, 'color', 'gradient' ],
626
+ encodeGradientValue( newGradient )
627
+ );
628
+ newValue.elements[ name ].color.background = undefined;
629
+ onChange( newValue );
630
+ };
631
+ const supportsTextColor = true;
632
+ // Background color is not supported for `caption`
633
+ // as there isn't yet a way to set padding for the element.
634
+ const supportsBackground = name !== 'caption';
635
+
636
+ items.push( {
637
+ key: name,
638
+ label,
639
+ hasValue: hasElement,
640
+ resetValue: resetElement,
641
+ isShownByDefault: defaultControls[ name ],
642
+ indicators:
643
+ supportsTextColor && supportsBackground
644
+ ? [
645
+ elementTextColor,
646
+ elementGradient ?? elementBackgroundColor,
647
+ ]
648
+ : [
649
+ supportsTextColor
650
+ ? elementTextColor
651
+ : elementGradient ?? elementBackgroundColor,
652
+ ],
653
+ tabs: [
654
+ hasSolidColors &&
655
+ supportsTextColor && {
656
+ key: 'text',
657
+ label: __( 'Text' ),
658
+ inheritedValue: elementTextColor,
659
+ setValue: setElementTextColor,
660
+ userValue: elementTextUserColor,
661
+ },
662
+ hasSolidColors &&
663
+ supportsBackground && {
664
+ key: 'background',
665
+ label: __( 'Background' ),
666
+ inheritedValue: elementBackgroundColor,
667
+ setValue: setElementBackgroundColor,
668
+ userValue: elementBackgroundUserColor,
669
+ },
670
+ hasGradientColors &&
671
+ supportsBackground && {
672
+ key: 'gradient',
673
+ label: __( 'Gradient' ),
674
+ inheritedValue: elementGradient,
675
+ setValue: setElementGradient,
676
+ userValue: elementGradientUserColor,
677
+ isGradient: true,
678
+ },
679
+ ].filter( Boolean ),
680
+ } );
681
+ } );
682
+
683
+ return (
684
+ <Wrapper
685
+ resetAllFilter={ resetAllFilter }
686
+ value={ value }
687
+ onChange={ onChange }
688
+ panelId={ panelId }
689
+ >
690
+ { items.map( ( item ) => (
691
+ <ColorPanelDropdown
692
+ key={ item.key }
693
+ { ...item }
694
+ colorGradientControlSettings={ {
695
+ colors,
696
+ disableCustomColors: ! areCustomSolidsEnabled,
697
+ gradients,
698
+ disableCustomGradients: ! areCustomGradientsEnabled,
699
+ } }
700
+ panelId={ panelId }
701
+ />
702
+ ) ) }
703
+ { children }
704
+ </Wrapper>
705
+ );
706
+ }