@wordpress/block-editor 15.21.1 → 15.22.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 (490) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +2 -2
  3. package/build/components/block-card/index.cjs +4 -5
  4. package/build/components/block-card/index.cjs.map +2 -2
  5. package/build/components/block-editing-mode/index.cjs +13 -7
  6. package/build/components/block-editing-mode/index.cjs.map +2 -2
  7. package/build/components/block-inspector/index.cjs +35 -20
  8. package/build/components/block-inspector/index.cjs.map +2 -2
  9. package/build/components/block-mover/mover-description.cjs +6 -6
  10. package/build/components/block-mover/mover-description.cjs.map +1 -1
  11. package/build/components/block-patterns-list/index.cjs.map +2 -2
  12. package/build/components/block-patterns-paging/index.cjs +4 -4
  13. package/build/components/block-patterns-paging/index.cjs.map +2 -2
  14. package/build/components/block-popover/use-popover-scroll.cjs.map +1 -1
  15. package/build/components/block-quick-navigation/index.cjs +7 -5
  16. package/build/components/block-quick-navigation/index.cjs.map +2 -2
  17. package/build/components/block-rename/modal.cjs +0 -1
  18. package/build/components/block-rename/modal.cjs.map +2 -2
  19. package/build/components/block-toolbar/block-toolbar-icon.cjs +14 -6
  20. package/build/components/block-toolbar/block-toolbar-icon.cjs.map +2 -2
  21. package/build/components/block-toolbar/edit-section-button.cjs.map +1 -1
  22. package/build/components/block-tools/use-block-toolbar-popover-props.cjs +10 -4
  23. package/build/components/block-tools/use-block-toolbar-popover-props.cjs.map +2 -2
  24. package/build/components/child-layout-control/index.cjs +51 -19
  25. package/build/components/child-layout-control/index.cjs.map +2 -2
  26. package/build/components/colors-gradients/control.cjs +25 -14
  27. package/build/components/colors-gradients/control.cjs.map +2 -2
  28. package/build/components/colors-gradients/dropdown.cjs +4 -1
  29. package/build/components/colors-gradients/dropdown.cjs.map +3 -3
  30. package/build/components/contrast-checker/index.cjs +22 -4
  31. package/build/components/contrast-checker/index.cjs.map +2 -2
  32. package/build/components/date-format-picker/index.cjs +0 -1
  33. package/build/components/date-format-picker/index.cjs.map +2 -2
  34. package/build/components/dimensions-tool/index.cjs +4 -5
  35. package/build/components/dimensions-tool/index.cjs.map +2 -2
  36. package/build/components/dimensions-tool/scale-tool.cjs +1 -1
  37. package/build/components/dimensions-tool/scale-tool.cjs.map +2 -2
  38. package/build/components/global-styles/background-panel.cjs +153 -25
  39. package/build/components/global-styles/background-panel.cjs.map +3 -3
  40. package/build/components/global-styles/color-gradient-dropdown-item.cjs +227 -0
  41. package/build/components/global-styles/color-gradient-dropdown-item.cjs.map +7 -0
  42. package/build/components/global-styles/color-panel.cjs +98 -375
  43. package/build/components/global-styles/color-panel.cjs.map +3 -3
  44. package/build/components/global-styles/dimensions-panel.cjs +1 -4
  45. package/build/components/global-styles/dimensions-panel.cjs.map +2 -2
  46. package/build/components/global-styles/hooks.cjs +34 -0
  47. package/build/components/global-styles/hooks.cjs.map +2 -2
  48. package/build/components/global-styles/shadow-panel-components.cjs.map +2 -2
  49. package/build/components/global-styles/typography-panel.cjs +82 -10
  50. package/build/components/global-styles/typography-panel.cjs.map +3 -3
  51. package/build/components/grid/grid-item-resizer.cjs.map +1 -1
  52. package/build/components/grid/grid-visualizer.cjs.map +1 -1
  53. package/build/components/iframe/index.cjs +6 -3
  54. package/build/components/iframe/index.cjs.map +3 -3
  55. package/build/components/image-editor/use-transform-image.cjs.map +1 -1
  56. package/build/components/inserter/get-appender-label.cjs.map +1 -1
  57. package/build/components/inserter/media-tab/media-preview.cjs.map +2 -2
  58. package/build/components/inserter/search-items.cjs.map +1 -1
  59. package/build/components/inspector-controls/fill.cjs +1 -3
  60. package/build/components/inspector-controls/fill.cjs.map +2 -2
  61. package/build/components/inspector-controls/groups.cjs +2 -0
  62. package/build/components/inspector-controls/groups.cjs.map +2 -2
  63. package/build/components/inspector-controls-tabs/index.cjs.map +2 -2
  64. package/build/components/inspector-controls-tabs/styles-tab.cjs +76 -32
  65. package/build/components/inspector-controls-tabs/styles-tab.cjs.map +2 -2
  66. package/build/components/keyboard-shortcuts/index.cjs.map +1 -1
  67. package/build/components/line-height-control/index.cjs.map +1 -1
  68. package/build/components/link-control/index.cjs +2 -3
  69. package/build/components/link-control/index.cjs.map +2 -2
  70. package/build/components/link-control/normalize-url.cjs.map +1 -1
  71. package/build/components/list-view/block-select-button.cjs +1 -10
  72. package/build/components/list-view/block-select-button.cjs.map +3 -3
  73. package/build/components/list-view/utils.cjs.map +1 -1
  74. package/build/components/preset-input-control/custom-value-controls.cjs.map +2 -2
  75. package/build/components/provider/index.cjs.map +1 -1
  76. package/build/components/provider/use-block-sync.cjs +3 -1
  77. package/build/components/provider/use-block-sync.cjs.map +2 -2
  78. package/build/components/rich-text/event-listeners/before-input-rules.cjs +1 -1
  79. package/build/components/rich-text/event-listeners/before-input-rules.cjs.map +2 -2
  80. package/build/components/rich-text/event-listeners/paste-handler.cjs.map +1 -1
  81. package/build/components/rich-text/prevent-event-discovery.cjs +1 -1
  82. package/build/components/rich-text/prevent-event-discovery.cjs.map +1 -1
  83. package/build/components/url-popover/image-url-input-ui.cjs +0 -2
  84. package/build/components/url-popover/image-url-input-ui.cjs.map +2 -2
  85. package/build/components/use-block-display-information/index.cjs +10 -3
  86. package/build/components/use-block-display-information/index.cjs.map +2 -2
  87. package/build/components/writing-flow/use-tab-nav.cjs.map +1 -1
  88. package/build/hooks/anchor.cjs +1 -2
  89. package/build/hooks/anchor.cjs.map +2 -2
  90. package/build/hooks/background.cjs +124 -75
  91. package/build/hooks/background.cjs.map +3 -3
  92. package/build/hooks/block-fields/index.cjs +13 -2
  93. package/build/hooks/block-fields/index.cjs.map +2 -2
  94. package/build/hooks/color.cjs +0 -162
  95. package/build/hooks/color.cjs.map +3 -3
  96. package/build/hooks/contrast-checker.cjs +31 -28
  97. package/build/hooks/contrast-checker.cjs.map +3 -3
  98. package/build/hooks/custom-class-name.cjs +0 -1
  99. package/build/hooks/custom-class-name.cjs.map +2 -2
  100. package/build/hooks/dimensions.cjs +13 -2
  101. package/build/hooks/dimensions.cjs.map +2 -2
  102. package/build/hooks/elements.cjs +142 -0
  103. package/build/hooks/elements.cjs.map +7 -0
  104. package/build/hooks/grid-visualizer.cjs +21 -11
  105. package/build/hooks/grid-visualizer.cjs.map +2 -2
  106. package/build/hooks/layout-child.cjs +65 -10
  107. package/build/hooks/layout-child.cjs.map +2 -2
  108. package/build/hooks/layout.cjs +6 -3
  109. package/build/hooks/layout.cjs.map +2 -2
  110. package/build/hooks/list-view.cjs +10 -7
  111. package/build/hooks/list-view.cjs.map +2 -2
  112. package/build/hooks/spacing-visualizer.cjs.map +1 -1
  113. package/build/hooks/state-utils.cjs.map +1 -1
  114. package/build/hooks/states.cjs +2 -2
  115. package/build/hooks/states.cjs.map +2 -2
  116. package/build/hooks/style.cjs +50 -6
  117. package/build/hooks/style.cjs.map +2 -2
  118. package/build/hooks/typography.cjs +62 -10
  119. package/build/hooks/typography.cjs.map +3 -3
  120. package/build/layouts/flex.cjs +99 -6
  121. package/build/layouts/flex.cjs.map +2 -2
  122. package/build/private-apis.cjs +4 -0
  123. package/build/private-apis.cjs.map +2 -2
  124. package/build/store/actions.cjs.map +1 -1
  125. package/build/store/private-selectors.cjs +19 -2
  126. package/build/store/private-selectors.cjs.map +2 -2
  127. package/build/store/reducer.cjs.map +1 -1
  128. package/build/store/selectors.cjs.map +1 -1
  129. package/build/utils/block-bindings.cjs +9 -9
  130. package/build/utils/block-bindings.cjs.map +3 -3
  131. package/build/utils/color-values.cjs +10 -1
  132. package/build/utils/color-values.cjs.map +3 -3
  133. package/build/utils/dom.cjs +2 -5
  134. package/build/utils/dom.cjs.map +3 -3
  135. package/build/utils/fit-text-frontend.cjs +6 -2
  136. package/build/utils/fit-text-frontend.cjs.map +3 -3
  137. package/build/utils/fit-text-utils.cjs +1 -1
  138. package/build/utils/fit-text-utils.cjs.map +3 -3
  139. package/build/utils/format-font-style.cjs +1 -1
  140. package/build/utils/format-font-style.cjs.map +3 -3
  141. package/build/utils/format-font-weight.cjs +1 -1
  142. package/build/utils/format-font-weight.cjs.map +3 -3
  143. package/build/utils/get-editor-region.cjs +4 -2
  144. package/build/utils/get-editor-region.cjs.map +3 -3
  145. package/build/utils/get-font-styles-and-weights.cjs +8 -12
  146. package/build/utils/get-font-styles-and-weights.cjs.map +3 -3
  147. package/build/utils/get-px-from-css-unit.cjs +1 -1
  148. package/build/utils/get-px-from-css-unit.cjs.map +1 -1
  149. package/build/utils/index.cjs +1 -1
  150. package/build/utils/index.cjs.map +1 -1
  151. package/build/utils/math.cjs +1 -1
  152. package/build/utils/math.cjs.map +3 -3
  153. package/build/utils/object.cjs +8 -8
  154. package/build/utils/object.cjs.map +3 -3
  155. package/build/utils/order-inserter-block-items.cjs +1 -1
  156. package/build/utils/order-inserter-block-items.cjs.map +3 -3
  157. package/build/utils/pasting.cjs +4 -2
  158. package/build/utils/pasting.cjs.map +3 -3
  159. package/build/utils/selection.cjs +3 -2
  160. package/build/utils/selection.cjs.map +3 -3
  161. package/build/utils/sorting.cjs +9 -3
  162. package/build/utils/sorting.cjs.map +3 -3
  163. package/build/utils/transform-styles/index.cjs +3 -2
  164. package/build/utils/transform-styles/index.cjs.map +3 -3
  165. package/build/utils/transform-styles/postcss-urlrebase.d.cjs +2 -0
  166. package/build/utils/transform-styles/postcss-urlrebase.d.cjs.map +7 -0
  167. package/build/utils/transform-styles/types.cjs +19 -0
  168. package/build/utils/transform-styles/types.cjs.map +7 -0
  169. package/build/utils/types.cjs +19 -0
  170. package/build/utils/types.cjs.map +7 -0
  171. package/build-module/components/block-card/index.mjs +5 -6
  172. package/build-module/components/block-card/index.mjs.map +2 -2
  173. package/build-module/components/block-editing-mode/index.mjs +14 -8
  174. package/build-module/components/block-editing-mode/index.mjs.map +2 -2
  175. package/build-module/components/block-inspector/index.mjs +35 -21
  176. package/build-module/components/block-inspector/index.mjs.map +2 -2
  177. package/build-module/components/block-mover/mover-description.mjs +6 -6
  178. package/build-module/components/block-mover/mover-description.mjs.map +1 -1
  179. package/build-module/components/block-patterns-list/index.mjs.map +2 -2
  180. package/build-module/components/block-patterns-paging/index.mjs +4 -4
  181. package/build-module/components/block-patterns-paging/index.mjs.map +2 -2
  182. package/build-module/components/block-popover/use-popover-scroll.mjs.map +1 -1
  183. package/build-module/components/block-quick-navigation/index.mjs +8 -6
  184. package/build-module/components/block-quick-navigation/index.mjs.map +2 -2
  185. package/build-module/components/block-rename/modal.mjs +0 -1
  186. package/build-module/components/block-rename/modal.mjs.map +2 -2
  187. package/build-module/components/block-toolbar/block-toolbar-icon.mjs +14 -6
  188. package/build-module/components/block-toolbar/block-toolbar-icon.mjs.map +2 -2
  189. package/build-module/components/block-toolbar/edit-section-button.mjs.map +1 -1
  190. package/build-module/components/block-tools/use-block-toolbar-popover-props.mjs +10 -4
  191. package/build-module/components/block-tools/use-block-toolbar-popover-props.mjs.map +2 -2
  192. package/build-module/components/child-layout-control/index.mjs +51 -19
  193. package/build-module/components/child-layout-control/index.mjs.map +2 -2
  194. package/build-module/components/colors-gradients/control.mjs +27 -15
  195. package/build-module/components/colors-gradients/control.mjs.map +2 -2
  196. package/build-module/components/colors-gradients/dropdown.mjs +4 -1
  197. package/build-module/components/colors-gradients/dropdown.mjs.map +2 -2
  198. package/build-module/components/contrast-checker/index.mjs +18 -4
  199. package/build-module/components/contrast-checker/index.mjs.map +2 -2
  200. package/build-module/components/date-format-picker/index.mjs +0 -1
  201. package/build-module/components/date-format-picker/index.mjs.map +2 -2
  202. package/build-module/components/dimensions-tool/index.mjs +4 -5
  203. package/build-module/components/dimensions-tool/index.mjs.map +2 -2
  204. package/build-module/components/dimensions-tool/scale-tool.mjs +1 -1
  205. package/build-module/components/dimensions-tool/scale-tool.mjs.map +2 -2
  206. package/build-module/components/global-styles/background-panel.mjs +155 -27
  207. package/build-module/components/global-styles/background-panel.mjs.map +2 -2
  208. package/build-module/components/global-styles/color-gradient-dropdown-item.mjs +207 -0
  209. package/build-module/components/global-styles/color-gradient-dropdown-item.mjs.map +7 -0
  210. package/build-module/components/global-styles/color-panel.mjs +106 -387
  211. package/build-module/components/global-styles/color-panel.mjs.map +3 -3
  212. package/build-module/components/global-styles/dimensions-panel.mjs +1 -5
  213. package/build-module/components/global-styles/dimensions-panel.mjs.map +2 -2
  214. package/build-module/components/global-styles/hooks.mjs +33 -0
  215. package/build-module/components/global-styles/hooks.mjs.map +2 -2
  216. package/build-module/components/global-styles/shadow-panel-components.mjs.map +2 -2
  217. package/build-module/components/global-styles/typography-panel.mjs +84 -10
  218. package/build-module/components/global-styles/typography-panel.mjs.map +2 -2
  219. package/build-module/components/grid/grid-item-resizer.mjs.map +1 -1
  220. package/build-module/components/grid/grid-visualizer.mjs.map +1 -1
  221. package/build-module/components/iframe/index.mjs +6 -3
  222. package/build-module/components/iframe/index.mjs.map +2 -2
  223. package/build-module/components/image-editor/use-transform-image.mjs.map +1 -1
  224. package/build-module/components/inserter/get-appender-label.mjs.map +1 -1
  225. package/build-module/components/inserter/media-tab/media-preview.mjs.map +2 -2
  226. package/build-module/components/inserter/search-items.mjs.map +1 -1
  227. package/build-module/components/inspector-controls/fill.mjs +1 -3
  228. package/build-module/components/inspector-controls/fill.mjs.map +2 -2
  229. package/build-module/components/inspector-controls/groups.mjs +2 -0
  230. package/build-module/components/inspector-controls/groups.mjs.map +2 -2
  231. package/build-module/components/inspector-controls-tabs/index.mjs.map +2 -2
  232. package/build-module/components/inspector-controls-tabs/styles-tab.mjs +76 -32
  233. package/build-module/components/inspector-controls-tabs/styles-tab.mjs.map +2 -2
  234. package/build-module/components/keyboard-shortcuts/index.mjs.map +1 -1
  235. package/build-module/components/line-height-control/index.mjs.map +1 -1
  236. package/build-module/components/link-control/index.mjs +2 -3
  237. package/build-module/components/link-control/index.mjs.map +2 -2
  238. package/build-module/components/link-control/normalize-url.mjs.map +1 -1
  239. package/build-module/components/list-view/block-select-button.mjs +2 -17
  240. package/build-module/components/list-view/block-select-button.mjs.map +2 -2
  241. package/build-module/components/list-view/utils.mjs.map +1 -1
  242. package/build-module/components/preset-input-control/custom-value-controls.mjs.map +2 -2
  243. package/build-module/components/provider/index.mjs.map +1 -1
  244. package/build-module/components/provider/use-block-sync.mjs +3 -1
  245. package/build-module/components/provider/use-block-sync.mjs.map +2 -2
  246. package/build-module/components/rich-text/event-listeners/before-input-rules.mjs +1 -1
  247. package/build-module/components/rich-text/event-listeners/before-input-rules.mjs.map +2 -2
  248. package/build-module/components/rich-text/event-listeners/paste-handler.mjs.map +1 -1
  249. package/build-module/components/rich-text/prevent-event-discovery.mjs +1 -1
  250. package/build-module/components/rich-text/prevent-event-discovery.mjs.map +1 -1
  251. package/build-module/components/url-popover/image-url-input-ui.mjs +0 -2
  252. package/build-module/components/url-popover/image-url-input-ui.mjs.map +2 -2
  253. package/build-module/components/use-block-display-information/index.mjs +10 -3
  254. package/build-module/components/use-block-display-information/index.mjs.map +2 -2
  255. package/build-module/components/writing-flow/use-tab-nav.mjs.map +1 -1
  256. package/build-module/hooks/anchor.mjs +1 -2
  257. package/build-module/hooks/anchor.mjs.map +2 -2
  258. package/build-module/hooks/background.mjs +123 -75
  259. package/build-module/hooks/background.mjs.map +2 -2
  260. package/build-module/hooks/block-fields/index.mjs +13 -2
  261. package/build-module/hooks/block-fields/index.mjs.map +2 -2
  262. package/build-module/hooks/color.mjs +2 -175
  263. package/build-module/hooks/color.mjs.map +2 -2
  264. package/build-module/hooks/contrast-checker.mjs +32 -19
  265. package/build-module/hooks/contrast-checker.mjs.map +2 -2
  266. package/build-module/hooks/custom-class-name.mjs +0 -1
  267. package/build-module/hooks/custom-class-name.mjs.map +2 -2
  268. package/build-module/hooks/dimensions.mjs +12 -2
  269. package/build-module/hooks/dimensions.mjs.map +2 -2
  270. package/build-module/hooks/elements.mjs +115 -0
  271. package/build-module/hooks/elements.mjs.map +7 -0
  272. package/build-module/hooks/grid-visualizer.mjs +21 -11
  273. package/build-module/hooks/grid-visualizer.mjs.map +2 -2
  274. package/build-module/hooks/layout-child.mjs +68 -10
  275. package/build-module/hooks/layout-child.mjs.map +2 -2
  276. package/build-module/hooks/layout.mjs +6 -3
  277. package/build-module/hooks/layout.mjs.map +2 -2
  278. package/build-module/hooks/list-view.mjs +10 -7
  279. package/build-module/hooks/list-view.mjs.map +2 -2
  280. package/build-module/hooks/spacing-visualizer.mjs.map +1 -1
  281. package/build-module/hooks/state-utils.mjs.map +1 -1
  282. package/build-module/hooks/states.mjs +2 -2
  283. package/build-module/hooks/states.mjs.map +2 -2
  284. package/build-module/hooks/style.mjs +53 -8
  285. package/build-module/hooks/style.mjs.map +2 -2
  286. package/build-module/hooks/typography.mjs +62 -10
  287. package/build-module/hooks/typography.mjs.map +2 -2
  288. package/build-module/layouts/flex.mjs +105 -7
  289. package/build-module/layouts/flex.mjs.map +2 -2
  290. package/build-module/private-apis.mjs +8 -0
  291. package/build-module/private-apis.mjs.map +2 -2
  292. package/build-module/store/actions.mjs.map +1 -1
  293. package/build-module/store/private-selectors.mjs +18 -1
  294. package/build-module/store/private-selectors.mjs.map +2 -2
  295. package/build-module/store/reducer.mjs.map +1 -1
  296. package/build-module/store/selectors.mjs.map +1 -1
  297. package/build-module/utils/block-bindings.mjs +9 -9
  298. package/build-module/utils/block-bindings.mjs.map +3 -3
  299. package/build-module/utils/color-values.mjs +9 -1
  300. package/build-module/utils/color-values.mjs.map +3 -3
  301. package/build-module/utils/dom.mjs +2 -5
  302. package/build-module/utils/dom.mjs.map +3 -3
  303. package/build-module/utils/fit-text-frontend.mjs +6 -2
  304. package/build-module/utils/fit-text-frontend.mjs.map +3 -3
  305. package/build-module/utils/fit-text-utils.mjs +1 -1
  306. package/build-module/utils/fit-text-utils.mjs.map +3 -3
  307. package/build-module/utils/format-font-style.mjs +1 -1
  308. package/build-module/utils/format-font-style.mjs.map +3 -3
  309. package/build-module/utils/format-font-weight.mjs +1 -1
  310. package/build-module/utils/format-font-weight.mjs.map +3 -3
  311. package/build-module/utils/get-editor-region.mjs +4 -2
  312. package/build-module/utils/get-editor-region.mjs.map +3 -3
  313. package/build-module/utils/get-font-styles-and-weights.mjs +8 -12
  314. package/build-module/utils/get-font-styles-and-weights.mjs.map +3 -3
  315. package/build-module/utils/get-px-from-css-unit.mjs +1 -1
  316. package/build-module/utils/get-px-from-css-unit.mjs.map +1 -1
  317. package/build-module/utils/index.mjs +1 -1
  318. package/build-module/utils/index.mjs.map +1 -1
  319. package/build-module/utils/math.mjs +1 -1
  320. package/build-module/utils/math.mjs.map +3 -3
  321. package/build-module/utils/object.mjs +8 -8
  322. package/build-module/utils/object.mjs.map +3 -3
  323. package/build-module/utils/order-inserter-block-items.mjs +1 -1
  324. package/build-module/utils/order-inserter-block-items.mjs.map +3 -3
  325. package/build-module/utils/pasting.mjs +4 -2
  326. package/build-module/utils/pasting.mjs.map +3 -3
  327. package/build-module/utils/selection.mjs +3 -2
  328. package/build-module/utils/selection.mjs.map +3 -3
  329. package/build-module/utils/sorting.mjs +9 -3
  330. package/build-module/utils/sorting.mjs.map +3 -3
  331. package/build-module/utils/transform-styles/index.mjs +3 -2
  332. package/build-module/utils/transform-styles/index.mjs.map +3 -3
  333. package/build-module/utils/transform-styles/postcss-urlrebase.d.mjs +1 -0
  334. package/build-module/utils/transform-styles/postcss-urlrebase.d.mjs.map +7 -0
  335. package/build-module/utils/transform-styles/types.mjs +1 -0
  336. package/build-module/utils/transform-styles/types.mjs.map +7 -0
  337. package/build-module/utils/types.mjs +1 -0
  338. package/build-module/utils/types.mjs.map +7 -0
  339. package/build-style/content-rtl.css +2 -0
  340. package/build-style/content.css +2 -0
  341. package/build-style/style-rtl.css +34 -41
  342. package/build-style/style.css +34 -41
  343. package/build-types/utils/block-bindings.d.ts +27 -0
  344. package/build-types/utils/block-bindings.d.ts.map +1 -0
  345. package/build-types/utils/color-values.d.ts +40 -0
  346. package/build-types/utils/color-values.d.ts.map +1 -0
  347. package/build-types/utils/dom.d.ts +19 -19
  348. package/build-types/utils/dom.d.ts.map +1 -1
  349. package/build-types/utils/fit-text-frontend.d.ts +7 -0
  350. package/build-types/utils/fit-text-frontend.d.ts.map +1 -0
  351. package/build-types/utils/fit-text-utils.d.ts +15 -0
  352. package/build-types/utils/fit-text-utils.d.ts.map +1 -0
  353. package/build-types/utils/format-font-style.d.ts +12 -0
  354. package/build-types/utils/format-font-style.d.ts.map +1 -0
  355. package/build-types/utils/format-font-weight.d.ts +12 -0
  356. package/build-types/utils/format-font-weight.d.ts.map +1 -0
  357. package/build-types/utils/get-editor-region.d.ts +9 -0
  358. package/build-types/utils/get-editor-region.d.ts.map +1 -0
  359. package/build-types/utils/get-font-styles-and-weights.d.ts +16 -0
  360. package/build-types/utils/get-font-styles-and-weights.d.ts.map +1 -0
  361. package/build-types/utils/get-px-from-css-unit.d.ts +10 -0
  362. package/build-types/utils/get-px-from-css-unit.d.ts.map +1 -0
  363. package/build-types/utils/index.d.ts +3 -0
  364. package/build-types/utils/index.d.ts.map +1 -0
  365. package/build-types/utils/math.d.ts +61 -0
  366. package/build-types/utils/math.d.ts.map +1 -0
  367. package/build-types/utils/object.d.ts +39 -0
  368. package/build-types/utils/object.d.ts.map +1 -0
  369. package/build-types/utils/order-inserter-block-items.d.ts +13 -0
  370. package/build-types/utils/order-inserter-block-items.d.ts.map +1 -0
  371. package/build-types/utils/pasting.d.ts +28 -0
  372. package/build-types/utils/pasting.d.ts.map +1 -0
  373. package/build-types/utils/selection.d.ts +21 -0
  374. package/build-types/utils/selection.d.ts.map +1 -0
  375. package/build-types/utils/sorting.d.ts +17 -0
  376. package/build-types/utils/sorting.d.ts.map +1 -0
  377. package/build-types/utils/transform-styles/index.d.ts +15 -0
  378. package/build-types/utils/transform-styles/index.d.ts.map +1 -0
  379. package/build-types/utils/transform-styles/types.d.ts +13 -0
  380. package/build-types/utils/transform-styles/types.d.ts.map +1 -0
  381. package/build-types/utils/types.d.ts +28 -0
  382. package/build-types/utils/types.d.ts.map +1 -0
  383. package/package.json +46 -40
  384. package/src/components/alignment-control/test/__snapshots__/index.js.snap +6 -0
  385. package/src/components/block-alignment-control/test/__snapshots__/index.js.snap +5 -0
  386. package/src/components/block-card/index.js +7 -13
  387. package/src/components/block-editing-mode/index.js +17 -9
  388. package/src/components/block-icon/test/__snapshots__/index.js.snap +1 -0
  389. package/src/components/block-inspector/index.js +22 -20
  390. package/src/components/block-patterns-list/index.js +0 -1
  391. package/src/components/block-quick-navigation/index.js +7 -7
  392. package/src/components/block-rename/modal.js +0 -1
  393. package/src/components/block-toolbar/block-toolbar-icon.js +22 -6
  394. package/src/components/block-toolbar/test/block-toolbar-icon.js +99 -0
  395. package/src/components/block-tools/use-block-toolbar-popover-props.js +10 -4
  396. package/src/components/block-vertical-alignment-control/test/__snapshots__/index.js.snap +4 -0
  397. package/src/components/child-layout-control/index.js +65 -20
  398. package/src/components/child-layout-control/test/index.js +64 -0
  399. package/src/components/colors-gradients/control.js +29 -12
  400. package/src/components/colors-gradients/dropdown.js +4 -1
  401. package/src/components/colors-gradients/style.scss +39 -2
  402. package/src/components/contrast-checker/README.md +9 -0
  403. package/src/components/contrast-checker/index.js +42 -3
  404. package/src/components/date-format-picker/index.js +0 -1
  405. package/src/components/default-block-appender/content.scss +3 -0
  406. package/src/components/dimensions-tool/index.js +4 -9
  407. package/src/components/dimensions-tool/scale-tool.js +1 -2
  408. package/src/components/dimensions-tool/test/index.js +89 -11
  409. package/src/components/global-styles/background-panel.js +201 -34
  410. package/src/components/global-styles/color-gradient-dropdown-item.js +258 -0
  411. package/src/components/global-styles/color-panel.js +125 -487
  412. package/src/components/global-styles/dimensions-panel.js +1 -5
  413. package/src/components/global-styles/hooks.js +45 -0
  414. package/src/components/global-styles/shadow-panel-components.js +0 -1
  415. package/src/components/global-styles/test/background-panel.js +56 -0
  416. package/src/components/global-styles/test/color-panel.js +172 -118
  417. package/src/components/global-styles/test/typography-panel.js +167 -0
  418. package/src/components/global-styles/typography-panel.js +100 -11
  419. package/src/components/iframe/index.js +8 -3
  420. package/src/components/inserter/media-tab/media-preview.js +0 -1
  421. package/src/components/inspector-controls/README.md +0 -2
  422. package/src/components/inspector-controls/fill.js +6 -8
  423. package/src/components/inspector-controls/groups.js +2 -0
  424. package/src/components/inspector-controls-tabs/index.js +0 -1
  425. package/src/components/inspector-controls-tabs/styles-tab.js +78 -28
  426. package/src/components/link-control/index.js +0 -1
  427. package/src/components/link-control/test/index.js +2 -3
  428. package/src/components/list-view/block-select-button.js +2 -18
  429. package/src/components/preset-input-control/custom-value-controls.js +0 -1
  430. package/src/components/provider/use-block-sync.js +3 -1
  431. package/src/components/rich-text/content.scss +2 -0
  432. package/src/components/url-popover/image-url-input-ui.js +0 -2
  433. package/src/components/use-block-display-information/index.js +15 -2
  434. package/src/components/use-block-display-information/test/index.js +140 -0
  435. package/src/hooks/anchor.js +0 -1
  436. package/src/hooks/background.js +210 -133
  437. package/src/hooks/background.scss +0 -35
  438. package/src/hooks/block-fields/index.js +27 -2
  439. package/src/hooks/color.js +2 -205
  440. package/src/hooks/color.scss +3 -9
  441. package/src/hooks/contrast-checker.js +60 -17
  442. package/src/hooks/custom-class-name.js +0 -1
  443. package/src/hooks/dimensions.js +14 -3
  444. package/src/hooks/elements.js +140 -0
  445. package/src/hooks/elements.scss +8 -0
  446. package/src/hooks/grid-visualizer.js +59 -45
  447. package/src/hooks/layout-child.js +92 -14
  448. package/src/hooks/layout.js +6 -3
  449. package/src/hooks/list-view.js +10 -11
  450. package/src/hooks/states.js +2 -2
  451. package/src/hooks/style.js +91 -9
  452. package/src/hooks/test/background.js +59 -0
  453. package/src/hooks/test/block-style-state.js +14 -14
  454. package/src/hooks/test/dimensions.js +71 -0
  455. package/src/hooks/test/layout-child.js +165 -0
  456. package/src/hooks/test/layout.js +6 -6
  457. package/src/hooks/test/style.js +133 -11
  458. package/src/hooks/typography.js +70 -6
  459. package/src/layouts/flex.js +118 -15
  460. package/src/private-apis.js +8 -0
  461. package/src/store/private-selectors.js +47 -0
  462. package/src/store/test/private-selectors.js +166 -7
  463. package/src/store/test/reducer.js +61 -10
  464. package/src/style.scss +1 -0
  465. package/src/utils/block-bindings.ts +51 -0
  466. package/src/utils/color-values.ts +63 -0
  467. package/src/utils/{dom.js → dom.ts} +27 -27
  468. package/src/utils/{fit-text-frontend.js → fit-text-frontend.ts} +12 -4
  469. package/src/utils/{fit-text-utils.js → fit-text-utils.ts} +15 -7
  470. package/src/utils/{format-font-style.js → format-font-style.ts} +10 -3
  471. package/src/utils/{format-font-weight.js → format-font-weight.ts} +10 -3
  472. package/src/utils/{get-editor-region.js → get-editor-region.ts} +10 -6
  473. package/src/utils/{get-font-styles-and-weights.js → get-font-styles-and-weights.ts} +21 -17
  474. package/src/utils/{math.js → math.ts} +37 -30
  475. package/src/utils/object.ts +89 -0
  476. package/src/utils/{order-inserter-block-items.js → order-inserter-block-items.ts} +8 -5
  477. package/src/utils/{pasting.js → pasting.ts} +18 -11
  478. package/src/utils/{selection.js → selection.ts} +11 -4
  479. package/src/utils/sorting.ts +81 -0
  480. package/src/utils/test/color-values.js +44 -1
  481. package/src/utils/transform-styles/{index.js → index.ts} +25 -25
  482. package/src/utils/transform-styles/postcss-urlrebase.d.ts +15 -0
  483. package/src/utils/transform-styles/types.ts +13 -0
  484. package/src/utils/types.ts +29 -0
  485. package/src/utils/block-bindings.js +0 -46
  486. package/src/utils/color-values.js +0 -28
  487. package/src/utils/object.js +0 -67
  488. package/src/utils/sorting.js +0 -54
  489. /package/src/utils/{get-px-from-css-unit.js → get-px-from-css-unit.ts} +0 -0
  490. /package/src/utils/{index.js → index.ts} +0 -0
@@ -0,0 +1,140 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { render } from '@testing-library/react';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { useSelect } from '@wordpress/data';
10
+ import { useEffect } from '@wordpress/element';
11
+ import { symbol } from '@wordpress/icons';
12
+
13
+ /**
14
+ * Internal dependencies
15
+ */
16
+ import useBlockDisplayInformation from '../';
17
+ import { isIsolatedEditorKey } from '../../../store/private-keys';
18
+
19
+ jest.mock( '@wordpress/data/src/components/use-select', () => jest.fn() );
20
+ jest.mock( '../../../lock-unlock', () => ( {
21
+ unlock: ( value ) => ( {
22
+ registerPrivateActions: jest.fn(),
23
+ registerPrivateSelectors: jest.fn(),
24
+ ...value,
25
+ } ),
26
+ } ) );
27
+
28
+ const groupIcon = 'group-icon';
29
+
30
+ function TestComponent( { onChange } ) {
31
+ const blockInformation = useBlockDisplayInformation( 'client-id' );
32
+ useEffect( () => {
33
+ onChange( blockInformation );
34
+ }, [ blockInformation, onChange ] );
35
+ return null;
36
+ }
37
+
38
+ function setupUseSelect( {
39
+ attributes = {
40
+ anchor: 'hero',
41
+ metadata: {
42
+ name: 'Hero pattern',
43
+ patternName: 'theme/hero',
44
+ },
45
+ style: {
46
+ position: {
47
+ type: 'sticky',
48
+ },
49
+ },
50
+ },
51
+ blockName = 'core/group',
52
+ blockType = {
53
+ name: 'core/group',
54
+ title: 'Group',
55
+ icon: groupIcon,
56
+ description: 'Gather blocks in a layout container.',
57
+ },
58
+ getActiveBlockVariation = () => null,
59
+ settings = {},
60
+ isWithinEditedSection = false,
61
+ } = {} ) {
62
+ useSelect.mockImplementation( ( mapSelect ) =>
63
+ mapSelect( () => ( {
64
+ getBlockName: () => blockName,
65
+ getBlockAttributes: () => attributes,
66
+ getSettings: () => settings,
67
+ __experimentalGetParsedPattern: () => ( {
68
+ title: 'Hero pattern',
69
+ description: 'Pattern description.',
70
+ } ),
71
+ isWithinEditedContentOnlySection: () => isWithinEditedSection,
72
+ getBlockType: () => blockType,
73
+ getActiveBlockVariation,
74
+ } ) )
75
+ );
76
+ }
77
+
78
+ describe( 'useBlockDisplayInformation', () => {
79
+ beforeEach( () => {
80
+ jest.clearAllMocks();
81
+ } );
82
+
83
+ it( 'displays pattern information for a pattern section that is not being edited', () => {
84
+ setupUseSelect();
85
+ const onChange = jest.fn();
86
+
87
+ render( <TestComponent onChange={ onChange } /> );
88
+
89
+ expect( onChange ).toHaveBeenCalledWith(
90
+ expect.objectContaining( {
91
+ title: 'Pattern',
92
+ icon: symbol,
93
+ description: 'Pattern description.',
94
+ name: 'Hero pattern',
95
+ } )
96
+ );
97
+ } );
98
+
99
+ it( 'displays block information for a pattern section that is being edited', () => {
100
+ setupUseSelect( { isWithinEditedSection: true } );
101
+ const onChange = jest.fn();
102
+
103
+ render( <TestComponent onChange={ onChange } /> );
104
+
105
+ expect( onChange ).toHaveBeenCalledWith(
106
+ expect.objectContaining( {
107
+ title: 'Group',
108
+ icon: groupIcon,
109
+ description: 'Gather blocks in a layout container.',
110
+ name: 'Hero pattern',
111
+ } )
112
+ );
113
+ } );
114
+
115
+ it( 'displays block information for a pattern wrapper in an isolated editor', () => {
116
+ setupUseSelect( {
117
+ attributes: {
118
+ metadata: {
119
+ name: 'Header',
120
+ patternName: 'theme/header-wrapper',
121
+ },
122
+ },
123
+ settings: {
124
+ [ isIsolatedEditorKey ]: true,
125
+ },
126
+ } );
127
+ const onChange = jest.fn();
128
+
129
+ render( <TestComponent onChange={ onChange } /> );
130
+
131
+ expect( onChange ).toHaveBeenCalledWith(
132
+ expect.objectContaining( {
133
+ title: 'Group',
134
+ icon: groupIcon,
135
+ description: 'Gather blocks in a layout container.',
136
+ name: 'Header',
137
+ } )
138
+ );
139
+ } );
140
+ } );
@@ -55,7 +55,6 @@ function BlockEditAnchorControlPure( { anchor, setAttributes } ) {
55
55
  return (
56
56
  <InspectorControls group="advanced">
57
57
  <TextControl
58
- __next40pxDefaultSize
59
58
  className="html-anchor-control"
60
59
  label={ __( 'HTML anchor' ) }
61
60
  help={
@@ -8,14 +8,16 @@ import clsx from 'clsx';
8
8
  */
9
9
  import { getBlockSupport } from '@wordpress/blocks';
10
10
  import { useSelect } from '@wordpress/data';
11
- import { useCallback } from '@wordpress/element';
11
+ import { __ } from '@wordpress/i18n';
12
12
 
13
13
  /**
14
14
  * Internal dependencies
15
15
  */
16
16
  import InspectorControls from '../components/inspector-controls';
17
17
  import { cleanEmptyObject } from './utils';
18
+ import { extractPresetSlug } from '../utils/color-values';
18
19
  import { store as blockEditorStore } from '../store';
20
+ import useBlockColorContrastWarning from './contrast-checker';
19
21
  import {
20
22
  default as StylesBackgroundPanel,
21
23
  useHasBackgroundPanel,
@@ -126,39 +128,41 @@ export function getBackgroundImageClasses( style ) {
126
128
  : '';
127
129
  }
128
130
 
129
- function BackgroundInspectorControl( {
130
- children,
131
- backgroundGradientSupported = false,
132
- } ) {
133
- const resetAllFilter = useCallback(
134
- ( attributes ) => {
135
- const updatedClassName = attributes.className?.includes(
136
- 'has-background'
137
- )
138
- ? attributes.className
139
- .split( ' ' )
140
- .filter( ( c ) => c !== 'has-background' )
141
- .join( ' ' ) || undefined
142
- : attributes.className;
143
- return {
144
- ...attributes,
145
- className: updatedClassName,
146
- style: cleanEmptyObject( {
147
- ...attributes.style,
148
- background: undefined,
149
- color: backgroundGradientSupported
150
- ? {
151
- ...attributes.style?.color,
152
- gradient: undefined,
153
- }
154
- : attributes.style?.color,
155
- } ),
156
- };
157
- },
158
- [ backgroundGradientSupported ]
159
- );
131
+ // Clears every control the Background panel owns: the background image,
132
+ // background color, and the gradient. The Background panel owns the gradient
133
+ // control for both the newer `background.gradient` support and the legacy
134
+ // `color.gradient` path, so "Reset all" clears the legacy value too,
135
+ // regardless of which path stored it.
136
+ export function backgroundResetAllFilter( attributes ) {
137
+ const updatedClassName = attributes.className?.includes( 'has-background' )
138
+ ? attributes.className
139
+ .split( ' ' )
140
+ .filter( ( c ) => c !== 'has-background' )
141
+ .join( ' ' ) || undefined
142
+ : attributes.className;
143
+ return {
144
+ ...attributes,
145
+ className: updatedClassName,
146
+ backgroundColor: undefined,
147
+ gradient: undefined,
148
+ style: cleanEmptyObject( {
149
+ ...attributes.style,
150
+ background: undefined,
151
+ color: {
152
+ ...attributes.style?.color,
153
+ background: undefined,
154
+ gradient: undefined,
155
+ },
156
+ } ),
157
+ };
158
+ }
159
+
160
+ function BackgroundInspectorControl( { children } ) {
160
161
  return (
161
- <InspectorControls group="background" resetAllFilter={ resetAllFilter }>
162
+ <InspectorControls
163
+ group="background"
164
+ resetAllFilter={ backgroundResetAllFilter }
165
+ >
162
166
  { children }
163
167
  </InspectorControls>
164
168
  );
@@ -169,122 +173,179 @@ export function BackgroundImagePanel( {
169
173
  name,
170
174
  setAttributes,
171
175
  settings,
176
+ // Allows rendering outside the `background` inspector group (e.g. section
177
+ // blocks direct-render this panel because their support fills are gated
178
+ // off by editing mode). Defaults to the slot-based wrapper.
179
+ asWrapper,
172
180
  } ) {
173
181
  const selectedState = useBlockStyleState();
174
- const { style, className, inheritedValue } = useSelect(
175
- ( select ) => {
176
- const { getBlockAttributes, getSettings } =
177
- select( blockEditorStore );
178
- const _settings = getSettings();
179
- const blockAttributes = getBlockAttributes( clientId );
180
- return {
181
- style: blockAttributes?.style,
182
- className: blockAttributes?.className,
183
- /*
184
- * To ensure we pass down the right inherited values:
185
- * @TODO 1. Pass inherited value down to all block style controls,
186
- * See: packages/block-editor/src/hooks/style.js
187
- * @TODO 2. Add support for block style variations,
188
- * See implementation: packages/block-editor/src/hooks/block-style-variation.js
189
- */
190
- inheritedValue:
191
- _settings[ globalStylesDataKey ]?.blocks?.[ name ],
192
- };
193
- },
194
- [ clientId, name ]
195
- );
182
+ const { style, className, backgroundColor, gradient, inheritedValue } =
183
+ useSelect(
184
+ ( select ) => {
185
+ const { getBlockAttributes, getSettings } =
186
+ select( blockEditorStore );
187
+ const _settings = getSettings();
188
+ const blockAttributes = getBlockAttributes( clientId );
189
+ return {
190
+ style: blockAttributes?.style,
191
+ className: blockAttributes?.className,
192
+ backgroundColor: blockAttributes?.backgroundColor,
193
+ gradient: blockAttributes?.gradient,
194
+ inheritedValue:
195
+ _settings[ globalStylesDataKey ]?.blocks?.[ name ],
196
+ };
197
+ },
198
+ [ clientId, name ]
199
+ );
196
200
 
197
201
  const backgroundGradientSupported = hasBackgroundSupport(
198
202
  name,
199
203
  'gradient'
200
204
  );
201
205
 
202
- // Must be declared before the early return to follow Rules of Hooks.
203
- // Passes backgroundGradientSupported so that "Reset All" also clears
204
- // the legacy color.gradient value when background.gradient is supported.
205
- const as = useCallback(
206
- ( { children } ) => (
207
- <BackgroundInspectorControl
208
- backgroundGradientSupported={ backgroundGradientSupported }
209
- >
210
- { children }
211
- </BackgroundInspectorControl>
206
+ const colorSupport = getBlockSupport( name, 'color' );
207
+ const hasColorBackgroundSupport =
208
+ colorSupport && colorSupport.background !== false;
209
+ const hasColorGradientSupport = !! colorSupport?.gradients;
210
+
211
+ const isStateSelected = ! isDefaultBlockStyleState( selectedState );
212
+
213
+ // Fold the backgroundColor / gradient attribute slugs back into the style
214
+ // object the panel consumes. When background.gradient is supported but not
215
+ // yet explicitly set, fall back to color.gradient for display.
216
+ const styleValue = {
217
+ ...style,
218
+ color: {
219
+ ...style?.color,
220
+ background: backgroundColor
221
+ ? 'var:preset|color|' + backgroundColor
222
+ : style?.color?.background,
223
+ gradient:
224
+ ! backgroundGradientSupported && gradient
225
+ ? 'var:preset|gradient|' + gradient
226
+ : style?.color?.gradient,
227
+ },
228
+ ...( backgroundGradientSupported && {
229
+ background: {
230
+ ...style?.background,
231
+ gradient: gradient
232
+ ? 'var:preset|gradient|' + gradient
233
+ : style?.background?.gradient ?? style?.color?.gradient,
234
+ },
235
+ } ),
236
+ };
237
+
238
+ // Skipped for gradients, which can't be reliably evaluated for contrast.
239
+ const enableContrastChecking =
240
+ ! isStateSelected &&
241
+ ! styleValue?.color?.gradient &&
242
+ ! styleValue?.background?.gradient &&
243
+ !! styleValue?.color?.background &&
244
+ ( settings?.color?.text || settings?.color?.link ) &&
245
+ false !== getBlockSupport( name, [ 'color', 'enableContrastChecker' ] );
246
+
247
+ const contrastWarning = useBlockColorContrastWarning( {
248
+ clientId,
249
+ name,
250
+ enabled: !! enableContrastChecking,
251
+ messageOverride: __(
252
+ 'This color combination has poor contrast. Consider increasing contrast between background and foreground.'
212
253
  ),
213
- [ backgroundGradientSupported ]
214
- );
254
+ } );
215
255
 
216
256
  if (
217
257
  ! useHasBackgroundPanel( settings ) ||
218
- ! hasBackgroundSupport( name )
258
+ ( ! hasBackgroundSupport( name ) &&
259
+ ! hasColorBackgroundSupport &&
260
+ ! hasColorGradientSupport )
219
261
  ) {
220
262
  return null;
221
263
  }
222
264
 
223
- const isStateSelected = ! isDefaultBlockStyleState( selectedState );
265
+ const onChange = ( newStyle ) => {
266
+ if ( isStateSelected ) {
267
+ setAttributes( {
268
+ style: setStyleForState( style, selectedState, newStyle ),
269
+ } );
270
+ return;
271
+ }
224
272
 
225
- const onChange = isStateSelected
226
- ? ( newStyle ) => {
227
- setAttributes( {
228
- style: setStyleForState( style, selectedState, newStyle ),
229
- } );
230
- }
231
- : ( newStyle ) => {
232
- const isMigrating =
233
- backgroundGradientSupported && !! style?.color?.gradient;
234
- const newAttributes = {
235
- style: cleanEmptyObject(
236
- backgroundGradientSupported
237
- ? {
238
- ...newStyle,
239
- color: {
240
- ...newStyle?.color,
241
- gradient: undefined,
242
- },
243
- }
244
- : newStyle
245
- ),
246
- };
273
+ // Extract background color slug from style.color.background.
274
+ const newBackgroundColorValue = newStyle?.color?.background;
275
+ const newBackgroundColorSlug = extractPresetSlug(
276
+ newBackgroundColorValue,
277
+ 'color'
278
+ );
279
+
280
+ // Extract gradient slug — prefer the new background.gradient path
281
+ // when backgroundGradientSupported, fall back to color.gradient.
282
+ const newGradientValue = backgroundGradientSupported
283
+ ? newStyle?.background?.gradient
284
+ : newStyle?.color?.gradient;
285
+ const newGradientSlug = extractPresetSlug(
286
+ newGradientValue,
287
+ 'gradient'
288
+ );
289
+ const cleanedColorGradient = newGradientSlug
290
+ ? undefined
291
+ : newStyle?.color?.gradient;
247
292
 
248
- // When migrating from color.gradient to background.gradient, preserve
249
- // the has-background class so existing styles relying on it (e.g.
250
- // theme padding) are not silently broken. Only add the class when a
251
- // gradient value is being set — not when it is being cleared/reset.
252
- // Conversely, if the gradient is cleared and has-background was added
253
- // during a previous migration, remove it so it does not linger.
254
- if ( isMigrating && !! newStyle?.background?.gradient ) {
255
- newAttributes.className = clsx(
256
- className,
257
- 'has-background'
258
- );
259
- } else if (
260
- ! newStyle?.background?.gradient &&
261
- className?.includes( 'has-background' )
262
- ) {
263
- newAttributes.className =
264
- className
265
- .split( ' ' )
266
- .filter( ( c ) => c !== 'has-background' )
267
- .join( ' ' ) || undefined;
268
- }
269
-
270
- setAttributes( newAttributes );
271
- };
272
-
273
- // When background.gradient is supported but not yet explicitly set, fall
274
- // back to color.gradient for display. Any write from this panel migrates
275
- // the value to background.gradient and clears color.gradient atomically.
276
- const styleValue =
277
- backgroundGradientSupported &&
278
- ! style?.background?.gradient &&
279
- style?.color?.gradient
280
- ? {
281
- ...style,
282
- background: {
283
- ...style?.background,
284
- gradient: style?.color?.gradient,
285
- },
286
- }
287
- : style;
293
+ // Drop slug-resolved values so they aren't persisted inline alongside
294
+ // the attribute slugs.
295
+ const cleanedStyle = {
296
+ ...newStyle,
297
+ color: {
298
+ ...newStyle?.color,
299
+ background: newBackgroundColorSlug
300
+ ? undefined
301
+ : newBackgroundColorValue,
302
+ gradient: backgroundGradientSupported
303
+ ? undefined
304
+ : cleanedColorGradient,
305
+ },
306
+ };
307
+ if ( backgroundGradientSupported ) {
308
+ // Background gradients are kept whole in `style.background.gradient`
309
+ // rather than extracted to the legacy `gradient` attribute.
310
+ cleanedStyle.background = {
311
+ ...cleanedStyle.background,
312
+ gradient: newStyle?.background?.gradient,
313
+ };
314
+ }
315
+
316
+ const isMigrating =
317
+ backgroundGradientSupported && !! style?.color?.gradient;
318
+ const newAttributes = {
319
+ style: cleanEmptyObject( cleanedStyle ),
320
+ backgroundColor: newBackgroundColorSlug,
321
+ // The legacy `gradient` attribute is only used when the block does
322
+ // not support `background.gradient`; otherwise the gradient is
323
+ // stored in `style.background.gradient` above.
324
+ gradient: backgroundGradientSupported ? undefined : newGradientSlug,
325
+ };
326
+
327
+ // When migrating from color.gradient to background.gradient, preserve
328
+ // the has-background class so existing styles relying on it (e.g.
329
+ // theme padding) are not silently broken. Only add the class when a
330
+ // gradient value is being set — not when it is being cleared/reset.
331
+ // Conversely, if the gradient is cleared and has-background was added
332
+ // during a previous migration, remove it so it does not linger.
333
+ const hasNewGradient = !! newGradientSlug || !! newGradientValue;
334
+ if ( isMigrating && hasNewGradient ) {
335
+ newAttributes.className = clsx( className, 'has-background' );
336
+ } else if (
337
+ ! hasNewGradient &&
338
+ className?.includes( 'has-background' )
339
+ ) {
340
+ newAttributes.className =
341
+ className
342
+ .split( ' ' )
343
+ .filter( ( c ) => c !== 'has-background' )
344
+ .join( ' ' ) || undefined;
345
+ }
346
+
347
+ setAttributes( newAttributes );
348
+ };
288
349
 
289
350
  const updatedSettings = {
290
351
  ...settings,
@@ -296,15 +357,30 @@ export function BackgroundImagePanel( {
296
357
  },
297
358
  };
298
359
 
299
- const defaultControls = getBlockSupport( name, [
360
+ const backgroundDefaultControls = getBlockSupport( name, [
300
361
  BACKGROUND_SUPPORT_KEY,
301
362
  '__experimentalDefaultControls',
302
363
  ] );
364
+ const colorDefaultControls = getBlockSupport( name, [
365
+ 'color',
366
+ '__experimentalDefaultControls',
367
+ ] );
368
+ const defaultControls = {
369
+ ...backgroundDefaultControls,
370
+ backgroundColor: colorDefaultControls?.background,
371
+ // Mirror the old combined control: show the gradient item by default
372
+ // when background color was shown by default.
373
+ gradient:
374
+ backgroundDefaultControls?.gradient ??
375
+ colorDefaultControls?.background,
376
+ };
377
+
378
+ const Wrapper = asWrapper || BackgroundInspectorControl;
303
379
 
304
380
  return (
305
381
  <StylesBackgroundPanel
306
382
  inheritedValue={ inheritedValue }
307
- as={ as }
383
+ as={ Wrapper }
308
384
  panelId={ clientId }
309
385
  defaultValues={ BACKGROUND_BLOCK_DEFAULT_VALUES }
310
386
  settings={ updatedSettings }
@@ -315,6 +391,7 @@ export function BackgroundImagePanel( {
315
391
  ? getStyleForState( style, selectedState )
316
392
  : styleValue
317
393
  }
394
+ contrastWarning={ contrastWarning }
318
395
  />
319
396
  );
320
397
  }
@@ -1,39 +1,4 @@
1
1
  @use "@wordpress/base-styles/variables" as *;
2
- @use "@wordpress/base-styles/colors" as *;
3
-
4
- /**
5
- * ItemGroup-like border styles for the background panel's ToolsPanelItems.
6
- * Replicates the separated border of the `ItemGroup` component while
7
- * allowing for hidden placeholder items (same approach as the color panel).
8
- */
9
- .block-editor-background-panel__item {
10
- padding: 0;
11
- max-width: 100%;
12
- position: relative;
13
-
14
- // Border styles.
15
- border-left: 1px solid $gray-300;
16
- border-right: 1px solid $gray-300;
17
- border-bottom: 1px solid $gray-300;
18
-
19
- // Identify the first visible instance as placeholder items will not have this class.
20
- &:nth-child(1 of &) {
21
- border-top-left-radius: $radius-small;
22
- border-top-right-radius: $radius-small;
23
- border-top: 1px solid $gray-300;
24
- }
25
-
26
- // Identify the last visible instance as placeholder items will not have this class.
27
- &:nth-last-child(1 of &) {
28
- border-bottom-left-radius: $radius-small;
29
- border-bottom-right-radius: $radius-small;
30
- }
31
-
32
- > div,
33
- > div > button {
34
- border-radius: inherit;
35
- }
36
- }
37
2
 
38
3
  .background-block-support-panel {
39
4
  /* Increased specificity required to remove the slot wrapper's row gap */
@@ -14,6 +14,7 @@ import { useContext, useState, useMemo } from '@wordpress/element';
14
14
  import { __ } from '@wordpress/i18n';
15
15
  import { store as blockEditorStore } from '../../store';
16
16
  import { unlock } from '../../lock-unlock';
17
+ import { replacePatternOverridesDefaultBinding } from '../../utils/block-bindings';
17
18
  import BlockContext from '../../components/block-context';
18
19
  import BlockIcon from '../../components/block-icon';
19
20
  import useBlockDisplayTitle from '../../components/block-title/use-block-display-title';
@@ -80,15 +81,39 @@ function BlockFields( {
80
81
  return _attributes;
81
82
  }
82
83
 
84
+ /*
85
+ * The pattern overrides `__default` binding is a placeholder, not
86
+ * a real attribute: expand it to the block's bindable attributes
87
+ * before resolving values, as other bindings consumers do.
88
+ */
89
+ const { __experimentalBlockBindingsSupportedAttributes } =
90
+ select( blockEditorStore ).getSettings();
91
+ const bindableAttributes =
92
+ __experimentalBlockBindingsSupportedAttributes?.[
93
+ blockType?.name
94
+ ];
95
+ const bindings = bindableAttributes
96
+ ? replacePatternOverridesDefaultBinding(
97
+ _attributes.metadata.bindings,
98
+ bindableAttributes
99
+ )
100
+ : _attributes.metadata.bindings;
101
+
83
102
  const { getBlockBindingsSource } = unlock( select( blocksStore ) );
84
- return Object.entries( _attributes.metadata.bindings ).reduce(
103
+ return Object.entries( bindings ).reduce(
85
104
  ( acc, [ attribute, binding ] ) => {
105
+ // Skip a `__default` binding that could not be expanded:
106
+ // it is not a real block attribute.
107
+ if ( attribute === '__default' ) {
108
+ return acc;
109
+ }
86
110
  const source = getBlockBindingsSource( binding.source );
87
111
  if ( ! source ) {
88
112
  return acc;
89
113
  }
90
114
  const values = source.getValues( {
91
115
  select,
116
+ clientId,
92
117
  context: blockContext,
93
118
  bindings: { [ attribute ]: binding },
94
119
  } );
@@ -97,7 +122,7 @@ function BlockFields( {
97
122
  _attributes
98
123
  );
99
124
  },
100
- [ blockContext, clientId ]
125
+ [ blockContext, clientId, blockType?.name ]
101
126
  );
102
127
  const { selectBlock, toggleBlockHighlight } =
103
128
  useDispatch( blockEditorStore );