@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
@@ -28,6 +28,7 @@ import SpacingSizesControl from '../spacing-sizes-control';
28
28
  import HeightControl from '../height-control';
29
29
  import ChildLayoutControl from '../child-layout-control';
30
30
  import { cleanEmptyObject } from '../../hooks/utils';
31
+ import { immutableSet } from '../../utils/object';
31
32
 
32
33
  const AXIAL_SIDES = [ 'horizontal', 'vertical' ];
33
34
 
@@ -223,13 +224,9 @@ export default function DimensionsPanel( {
223
224
  useHasContentSize( settings ) && includeLayoutControls;
224
225
  const contentSizeValue = decodeValue( inheritedValue?.layout?.contentSize );
225
226
  const setContentSizeValue = ( newValue ) => {
226
- onChange( {
227
- ...value,
228
- layout: {
229
- ...value?.layout,
230
- contentSize: newValue,
231
- },
232
- } );
227
+ onChange(
228
+ immutableSet( value, [ 'layout', 'contentSize' ], newValue )
229
+ );
233
230
  };
234
231
  const hasUserSetContentSizeValue = () => !! value?.layout?.contentSize;
235
232
  const resetContentSizeValue = () => setContentSizeValue( undefined );
@@ -239,13 +236,7 @@ export default function DimensionsPanel( {
239
236
  useHasWideSize( settings ) && includeLayoutControls;
240
237
  const wideSizeValue = decodeValue( inheritedValue?.layout?.wideSize );
241
238
  const setWideSizeValue = ( newValue ) => {
242
- onChange( {
243
- ...value,
244
- layout: {
245
- ...value?.layout,
246
- wideSize: newValue,
247
- },
248
- } );
239
+ onChange( immutableSet( value, [ 'layout', 'wideSize' ], newValue ) );
249
240
  };
250
241
  const hasUserSetWideSizeValue = () => !! value?.layout?.wideSize;
251
242
  const resetWideSizeValue = () => setWideSizeValue( undefined );
@@ -262,13 +253,7 @@ export default function DimensionsPanel( {
262
253
  paddingSides.some( ( side ) => AXIAL_SIDES.includes( side ) );
263
254
  const setPaddingValues = ( newPaddingValues ) => {
264
255
  const padding = filterValuesBySides( newPaddingValues, paddingSides );
265
- onChange( {
266
- ...value,
267
- spacing: {
268
- ...value?.spacing,
269
- padding,
270
- },
271
- } );
256
+ onChange( immutableSet( value, [ 'spacing', 'padding' ], padding ) );
272
257
  };
273
258
  const hasPaddingValue = () =>
274
259
  !! value?.spacing?.padding &&
@@ -288,13 +273,7 @@ export default function DimensionsPanel( {
288
273
  marginSides.some( ( side ) => AXIAL_SIDES.includes( side ) );
289
274
  const setMarginValues = ( newMarginValues ) => {
290
275
  const margin = filterValuesBySides( newMarginValues, marginSides );
291
- onChange( {
292
- ...value,
293
- spacing: {
294
- ...value?.spacing,
295
- margin,
296
- },
297
- } );
276
+ onChange( immutableSet( value, [ 'spacing', 'margin' ], margin ) );
298
277
  };
299
278
  const hasMarginValue = () =>
300
279
  !! value?.spacing?.margin &&
@@ -312,13 +291,9 @@ export default function DimensionsPanel( {
312
291
  const isAxialGap =
313
292
  gapSides && gapSides.some( ( side ) => AXIAL_SIDES.includes( side ) );
314
293
  const setGapValue = ( newGapValue ) => {
315
- onChange( {
316
- ...value,
317
- spacing: {
318
- ...value?.spacing,
319
- blockGap: newGapValue,
320
- },
321
- } );
294
+ onChange(
295
+ immutableSet( value, [ 'spacing', 'blockGap' ], newGapValue )
296
+ );
322
297
  };
323
298
  const setGapValues = ( nextBoxGapValue ) => {
324
299
  if ( ! nextBoxGapValue ) {
@@ -341,13 +316,9 @@ export default function DimensionsPanel( {
341
316
  const showMinHeightControl = useHasMinHeight( settings );
342
317
  const minHeightValue = decodeValue( inheritedValue?.dimensions?.minHeight );
343
318
  const setMinHeightValue = ( newValue ) => {
344
- onChange( {
345
- ...value,
346
- dimensions: {
347
- ...value?.dimensions,
348
- minHeight: newValue,
349
- },
350
- } );
319
+ onChange(
320
+ immutableSet( value, [ 'dimensions', 'minHeight' ], newValue )
321
+ );
351
322
  };
352
323
  const resetMinHeightValue = () => {
353
324
  setMinHeightValue( undefined );
@@ -0,0 +1,129 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { get, isEmpty } from 'lodash';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { scopeSelector } from './utils';
10
+
11
+ /**
12
+ * Determine the CSS selector for the block type and target provided, returning
13
+ * it if available.
14
+ *
15
+ * @param {import('@wordpress/blocks').Block} blockType The block's type.
16
+ * @param {string|string[]} target The desired selector's target e.g. `root`, delimited string, or array path.
17
+ * @param {Object} options Options object.
18
+ * @param {boolean} options.fallback Whether or not to fallback to broader selector.
19
+ *
20
+ * @return {?string} The CSS selector or `null` if no selector available.
21
+ */
22
+ export function getBlockCSSSelector(
23
+ blockType,
24
+ target = 'root',
25
+ options = {}
26
+ ) {
27
+ if ( ! target ) {
28
+ return null;
29
+ }
30
+
31
+ const { fallback = false } = options;
32
+ const { name, selectors, supports } = blockType;
33
+
34
+ const hasSelectors = ! isEmpty( selectors );
35
+ const path = Array.isArray( target ) ? target.join( '.' ) : target;
36
+
37
+ // Duotone ( no fallback selectors for Duotone ).
38
+ if ( path === 'filter.duotone' ) {
39
+ // If selectors API in use, only use its value or null.
40
+ if ( hasSelectors ) {
41
+ return get( selectors, path, null );
42
+ }
43
+
44
+ // Selectors API, not available, check for old experimental selector.
45
+ return get( supports, 'color.__experimentalDuotone', null );
46
+ }
47
+
48
+ // Root selector.
49
+
50
+ // Calculated before returning as it can be used as a fallback for feature
51
+ // selectors later on.
52
+ let rootSelector = null;
53
+
54
+ if ( hasSelectors && selectors.root ) {
55
+ // Use the selectors API if available.
56
+ rootSelector = selectors?.root;
57
+ } else if ( supports?.__experimentalSelector ) {
58
+ // Use the old experimental selector supports property if set.
59
+ rootSelector = supports.__experimentalSelector;
60
+ } else {
61
+ // If no root selector found, generate default block class selector.
62
+ rootSelector =
63
+ '.wp-block-' + name.replace( 'core/', '' ).replace( '/', '-' );
64
+ }
65
+
66
+ // Return selector if it's the root target we are looking for.
67
+ if ( path === 'root' ) {
68
+ return rootSelector;
69
+ }
70
+
71
+ // If target is not `root` or `duotone` we have a feature or subfeature
72
+ // as the target. If the target is a string convert to an array.
73
+ const pathArray = Array.isArray( target ) ? target : target.split( '.' );
74
+
75
+ // Feature selectors ( may fallback to root selector );
76
+ if ( pathArray.length === 1 ) {
77
+ const fallbackSelector = fallback ? rootSelector : null;
78
+
79
+ // Prefer the selectors API if available.
80
+ if ( hasSelectors ) {
81
+ // Get selector from either `feature.root` or shorthand path.
82
+ const featureSelector =
83
+ get( selectors, `${ path }.root`, null ) ||
84
+ get( selectors, path, null );
85
+
86
+ // Return feature selector if found or any available fallback.
87
+ return featureSelector || fallbackSelector;
88
+ }
89
+
90
+ // Try getting old experimental supports selector value.
91
+ const featureSelector = get(
92
+ supports,
93
+ `${ path }.__experimentalSelector`,
94
+ null
95
+ );
96
+
97
+ // If nothing to work with, provide fallback selector if available.
98
+ if ( ! featureSelector ) {
99
+ return fallbackSelector;
100
+ }
101
+
102
+ // Scope the feature selector by the block's root selector.
103
+ return scopeSelector( rootSelector, featureSelector );
104
+ }
105
+
106
+ // Subfeature selector.
107
+ // This may fallback either to parent feature or root selector.
108
+ let subfeatureSelector;
109
+
110
+ // Use selectors API if available.
111
+ if ( hasSelectors ) {
112
+ subfeatureSelector = get( selectors, path, null );
113
+ }
114
+
115
+ // Only return if we have a subfeature selector.
116
+ if ( subfeatureSelector ) {
117
+ return subfeatureSelector;
118
+ }
119
+
120
+ // To this point we don't have a subfeature selector. If a fallback has been
121
+ // requested, remove subfeature from target path and return results of a
122
+ // call for the parent feature's selector.
123
+ if ( fallback ) {
124
+ return getBlockCSSSelector( blockType, pathArray[ 0 ], options );
125
+ }
126
+
127
+ // We tried.
128
+ return null;
129
+ }
@@ -10,6 +10,7 @@ import { get, set } from 'lodash';
10
10
  import { useContext, useCallback, useMemo } from '@wordpress/element';
11
11
  import { useSelect } from '@wordpress/data';
12
12
  import { store as blocksStore } from '@wordpress/blocks';
13
+ import { _x } from '@wordpress/i18n';
13
14
 
14
15
  /**
15
16
  * Internal dependencies
@@ -30,6 +31,8 @@ const VALID_SETTINGS = [
30
31
  'shadow.presets',
31
32
  'shadow.defaultPresets',
32
33
  'color.background',
34
+ 'color.button',
35
+ 'color.caption',
33
36
  'color.custom',
34
37
  'color.customDuotone',
35
38
  'color.customGradient',
@@ -38,6 +41,7 @@ const VALID_SETTINGS = [
38
41
  'color.defaultPalette',
39
42
  'color.duotone',
40
43
  'color.gradients',
44
+ 'color.heading',
41
45
  'color.link',
42
46
  'color.palette',
43
47
  'color.text',
@@ -64,6 +68,7 @@ const VALID_SETTINGS = [
64
68
  'typography.fontWeight',
65
69
  'typography.letterSpacing',
66
70
  'typography.lineHeight',
71
+ 'typography.textColumns',
67
72
  'typography.textDecoration',
68
73
  'typography.textTransform',
69
74
  ];
@@ -177,7 +182,7 @@ export function useGlobalStyle(
177
182
  switch ( source ) {
178
183
  case 'all':
179
184
  rawResult =
180
- // The stlyes.css path is allowed to be empty, so don't revert to base if undefined.
185
+ // The styles.css path is allowed to be empty, so don't revert to base if undefined.
181
186
  finalPath === 'styles.css'
182
187
  ? get( userConfig, finalPath )
183
188
  : get( mergedConfig, finalPath );
@@ -249,6 +254,35 @@ export function useSettingsForBlockElement(
249
254
  };
250
255
  }
251
256
 
257
+ updatedSettings.color = {
258
+ ...updatedSettings.color,
259
+ text:
260
+ updatedSettings.color?.text &&
261
+ supportedStyles.includes( 'color' ),
262
+ background:
263
+ updatedSettings.color?.background &&
264
+ ( supportedStyles.includes( 'background' ) ||
265
+ supportedStyles.includes( 'backgroundColor' ) ),
266
+ button:
267
+ updatedSettings.color?.button &&
268
+ supportedStyles.includes( 'buttonColor' ),
269
+ heading:
270
+ updatedSettings.color?.heading &&
271
+ supportedStyles.includes( 'headingColor' ),
272
+ link:
273
+ updatedSettings.color?.link &&
274
+ supportedStyles.includes( 'linkColor' ),
275
+ caption:
276
+ updatedSettings.color?.caption &&
277
+ supportedStyles.includes( 'captionColor' ),
278
+ };
279
+
280
+ // Some blocks can enable background colors but disable gradients.
281
+ if ( ! supportedStyles.includes( 'background' ) ) {
282
+ updatedSettings.color.gradients = [];
283
+ updatedSettings.color.customGradient = false;
284
+ }
285
+
252
286
  [
253
287
  'lineHeight',
254
288
  'fontStyle',
@@ -265,6 +299,16 @@ export function useSettingsForBlockElement(
265
299
  }
266
300
  } );
267
301
 
302
+ // The column-count style is named text column to reduce confusion with
303
+ // the columns block and manage expectations from the support.
304
+ // See: https://github.com/WordPress/gutenberg/pull/33587
305
+ if ( ! supportedStyles.includes( 'columnCount' ) ) {
306
+ updatedSettings.typography = {
307
+ ...updatedSettings.typography,
308
+ textColumns: false,
309
+ };
310
+ }
311
+
268
312
  [ 'contentSize', 'wideSize' ].forEach( ( key ) => {
269
313
  if ( ! supportedStyles.includes( key ) ) {
270
314
  updatedSettings.layout = {
@@ -303,6 +347,115 @@ export function useSettingsForBlockElement(
303
347
  };
304
348
  }
305
349
 
350
+ [ 'radius', 'color', 'style', 'width' ].forEach( ( key ) => {
351
+ if (
352
+ ! supportedStyles.includes(
353
+ 'border' + key.charAt( 0 ).toUpperCase() + key.slice( 1 )
354
+ )
355
+ ) {
356
+ updatedSettings.border = {
357
+ ...updatedSettings.border,
358
+ [ key ]: false,
359
+ };
360
+ }
361
+ } );
362
+
306
363
  return updatedSettings;
307
364
  }, [ parentSettings, supportedStyles, supports ] );
308
365
  }
366
+
367
+ export function useColorsPerOrigin( settings ) {
368
+ const customColors = settings?.color?.palette?.custom;
369
+ const themeColors = settings?.color?.palette?.theme;
370
+ const defaultColors = settings?.color?.palette?.default;
371
+ const shouldDisplayDefaultColors = settings?.color?.defaultPalette;
372
+
373
+ return useMemo( () => {
374
+ const result = [];
375
+ if ( themeColors && themeColors.length ) {
376
+ result.push( {
377
+ name: _x(
378
+ 'Theme',
379
+ 'Indicates this palette comes from the theme.'
380
+ ),
381
+ colors: themeColors,
382
+ } );
383
+ }
384
+ if (
385
+ shouldDisplayDefaultColors &&
386
+ defaultColors &&
387
+ defaultColors.length
388
+ ) {
389
+ result.push( {
390
+ name: _x(
391
+ 'Default',
392
+ 'Indicates this palette comes from WordPress.'
393
+ ),
394
+ colors: defaultColors,
395
+ } );
396
+ }
397
+ if ( customColors && customColors.length ) {
398
+ result.push( {
399
+ name: _x(
400
+ 'Custom',
401
+ 'Indicates this palette is created by the user.'
402
+ ),
403
+ colors: customColors,
404
+ } );
405
+ }
406
+ return result;
407
+ }, [
408
+ customColors,
409
+ themeColors,
410
+ defaultColors,
411
+ shouldDisplayDefaultColors,
412
+ ] );
413
+ }
414
+
415
+ export function useGradientsPerOrigin( settings ) {
416
+ const customGradients = settings?.color?.gradients?.custom;
417
+ const themeGradients = settings?.color?.gradients?.theme;
418
+ const defaultGradients = settings?.color?.gradients?.default;
419
+ const shouldDisplayDefaultGradients = settings?.color?.defaultGradients;
420
+
421
+ return useMemo( () => {
422
+ const result = [];
423
+ if ( themeGradients && themeGradients.length ) {
424
+ result.push( {
425
+ name: _x(
426
+ 'Theme',
427
+ 'Indicates this palette comes from the theme.'
428
+ ),
429
+ gradients: themeGradients,
430
+ } );
431
+ }
432
+ if (
433
+ shouldDisplayDefaultGradients &&
434
+ defaultGradients &&
435
+ defaultGradients.length
436
+ ) {
437
+ result.push( {
438
+ name: _x(
439
+ 'Default',
440
+ 'Indicates this palette comes from WordPress.'
441
+ ),
442
+ gradients: defaultGradients,
443
+ } );
444
+ }
445
+ if ( customGradients && customGradients.length ) {
446
+ result.push( {
447
+ name: _x(
448
+ 'Custom',
449
+ 'Indicates this palette is created by the user.'
450
+ ),
451
+ gradients: customGradients,
452
+ } );
453
+ }
454
+ return result;
455
+ }, [
456
+ customGradients,
457
+ themeGradients,
458
+ defaultGradients,
459
+ shouldDisplayDefaultGradients,
460
+ ] );
461
+ }
@@ -4,6 +4,7 @@ export {
4
4
  useGlobalStyle,
5
5
  useSettingsForBlockElement,
6
6
  } from './hooks';
7
+ export { getBlockCSSSelector } from './get-block-css-selector';
7
8
  export { useGlobalStylesOutput } from './use-global-styles-output';
8
9
  export { GlobalStylesContext } from './context';
9
10
  export {
@@ -14,3 +15,5 @@ export {
14
15
  default as DimensionsPanel,
15
16
  useHasDimensionsPanel,
16
17
  } from './dimensions-panel';
18
+ export { default as BorderPanel, useHasBorderPanel } from './border-panel';
19
+ export { default as ColorPanel, useHasColorPanel } from './color-panel';
@@ -480,7 +480,7 @@ describe( 'global styles renderer', () => {
480
480
  expect( toStyles( tree, blockSelectors ) ).toEqual(
481
481
  'body {margin: 0;}' +
482
482
  'body{background-color: red;margin: 10px;padding: 10px;}a{color: blue;}a:hover{color: orange;}a:focus{color: orange;}h1{font-size: 42px;}.wp-block-group{margin-top: 10px;margin-right: 20px;margin-bottom: 30px;margin-left: 40px;padding-top: 11px;padding-right: 22px;padding-bottom: 33px;padding-left: 44px;}h1,h2,h3,h4,h5,h6{color: orange;}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color: hotpink;}h1 a:hover,h2 a:hover,h3 a:hover,h4 a:hover,h5 a:hover,h6 a:hover{color: red;}h1 a:focus,h2 a:focus,h3 a:focus,h4 a:focus,h5 a:focus,h6 a:focus{color: red;}' +
483
- '.wp-block-image img, .wp-block-image .wp-crop-area{border-radius: 9999px }.wp-block-image{color: red;}.wp-site-blocks > .alignleft { float: left; margin-right: 2em; }.wp-site-blocks > .alignright { float: right; margin-left: 2em; }.wp-site-blocks > .aligncenter { justify-content: center; margin-left: auto; margin-right: auto; }' +
483
+ '.wp-block-image img, .wp-block-image .wp-crop-area{border-radius: 9999px}.wp-block-image{color: red;}.wp-site-blocks > .alignleft { float: left; margin-right: 2em; }.wp-site-blocks > .alignright { float: right; margin-left: 2em; }.wp-site-blocks > .aligncenter { justify-content: center; margin-left: auto; margin-right: auto; }' +
484
484
  '.has-white-color{color: var(--wp--preset--color--white) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}h1.has-blue-color,h2.has-blue-color,h3.has-blue-color,h4.has-blue-color,h5.has-blue-color,h6.has-blue-color{color: var(--wp--preset--color--blue) !important;}h1.has-blue-background-color,h2.has-blue-background-color,h3.has-blue-background-color,h4.has-blue-background-color,h5.has-blue-background-color,h6.has-blue-background-color{background-color: var(--wp--preset--color--blue) !important;}h1.has-blue-border-color,h2.has-blue-border-color,h3.has-blue-border-color,h4.has-blue-border-color,h5.has-blue-border-color,h6.has-blue-border-color{border-color: var(--wp--preset--color--blue) !important;}'
485
485
  );
486
486
  } );
@@ -644,7 +644,7 @@ describe( 'global styles renderer', () => {
644
644
  } );
645
645
 
646
646
  expect( layoutStyles ).toEqual(
647
- '.wp-block-group.is-layout-flow > * { margin-block-start: 0; margin-block-end: 0; }.wp-block-group.is-layout-flow > * + * { margin-block-start: 12px; margin-block-end: 0; }.wp-block-group.is-layout-flex { gap: 12px; }'
647
+ '.wp-block-group-is-layout-flow.wp-block-group-is-layout-flow > * { margin-block-start: 0; margin-block-end: 0; }.wp-block-group-is-layout-flow.wp-block-group-is-layout-flow > * + * { margin-block-start: 12px; margin-block-end: 0; }.wp-block-group-is-layout-flex.wp-block-group-is-layout-flex { gap: 12px; }'
648
648
  );
649
649
  } );
650
650
 
@@ -668,6 +668,34 @@ describe( 'global styles renderer', () => {
668
668
 
669
669
  describe( 'getBlockSelectors', () => {
670
670
  it( 'should return block selectors data', () => {
671
+ const imageSelectors = {
672
+ root: '.my-image',
673
+ border: '.my-image img, .my-image .crop-area',
674
+ filter: { duotone: 'img' },
675
+ };
676
+ const imageBlock = {
677
+ name: 'core/image',
678
+ selectors: imageSelectors,
679
+ };
680
+ const blockTypes = [ imageBlock ];
681
+
682
+ expect( getBlockSelectors( blockTypes, () => {} ) ).toEqual( {
683
+ 'core/image': {
684
+ name: imageBlock.name,
685
+ selector: imageSelectors.root,
686
+ duotoneSelector: imageSelectors.filter.duotone,
687
+ fallbackGapValue: undefined,
688
+ featureSelectors: {
689
+ root: '.my-image',
690
+ border: '.my-image img, .my-image .crop-area',
691
+ filter: { duotone: 'img' },
692
+ },
693
+ hasLayoutSupport: false,
694
+ },
695
+ } );
696
+ } );
697
+
698
+ it( 'should return block selectors data with old experimental selectors', () => {
671
699
  const imageSupports = {
672
700
  __experimentalBorder: {
673
701
  radius: true,
@@ -688,6 +716,7 @@ describe( 'global styles renderer', () => {
688
716
  duotoneSelector: imageSupports.color.__experimentalDuotone,
689
717
  fallbackGapValue: undefined,
690
718
  featureSelectors: {
719
+ root: '.my-image',
691
720
  border: '.my-image img, .my-image .crop-area',
692
721
  },
693
722
  hasLayoutSupport: false,