@wordpress/block-editor 15.19.1-next.v.202605131032.0 → 15.20.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 (352) hide show
  1. package/CHANGELOG.md +15 -1
  2. package/build/components/block-card/index.cjs +51 -41
  3. package/build/components/block-card/index.cjs.map +3 -3
  4. package/build/components/block-heading-level-dropdown/heading-level-icon.cjs.map +3 -3
  5. package/build/components/block-icon/index.cjs +7 -1
  6. package/build/components/block-icon/index.cjs.map +3 -3
  7. package/build/components/block-inspector/index.cjs +156 -11
  8. package/build/components/block-inspector/index.cjs.map +3 -3
  9. package/build/components/block-inspector/inspector-pre-tabs-slot-fill.cjs +38 -0
  10. package/build/components/block-inspector/inspector-pre-tabs-slot-fill.cjs.map +7 -0
  11. package/build/components/block-list/use-block-props/index.cjs +1 -1
  12. package/build/components/block-list/use-block-props/index.cjs.map +2 -2
  13. package/build/components/block-list/use-block-props/use-focus-handler.cjs +3 -4
  14. package/build/components/block-list/use-block-props/use-focus-handler.cjs.map +3 -3
  15. package/build/components/block-list/use-block-props/use-is-hovered.cjs +24 -14
  16. package/build/components/block-list/use-block-props/use-is-hovered.cjs.map +3 -3
  17. package/build/components/block-lock/modal.cjs.map +3 -3
  18. package/build/components/block-patterns-list/index.cjs +13 -2
  19. package/build/components/block-patterns-list/index.cjs.map +2 -2
  20. package/build/components/block-popover/index.cjs +13 -3
  21. package/build/components/block-popover/index.cjs.map +2 -2
  22. package/build/components/block-toolbar/switch-section-style.cjs.map +3 -3
  23. package/build/components/block-visibility/modal.cjs.map +3 -3
  24. package/build/components/block-visibility/viewport-visibility-info.cjs.map +3 -3
  25. package/build/components/colors-gradients/control.cjs +7 -4
  26. package/build/components/colors-gradients/control.cjs.map +2 -2
  27. package/build/components/global-styles/advanced-panel.cjs +24 -22
  28. package/build/components/global-styles/advanced-panel.cjs.map +3 -3
  29. package/build/components/global-styles/color-panel.cjs +95 -58
  30. package/build/components/global-styles/color-panel.cjs.map +2 -2
  31. package/build/components/global-styles/dimensions-panel.cjs +11 -5
  32. package/build/components/global-styles/dimensions-panel.cjs.map +2 -2
  33. package/build/components/global-styles/index.cjs +3 -0
  34. package/build/components/global-styles/index.cjs.map +2 -2
  35. package/build/components/global-styles/shadow-panel-components.cjs +38 -26
  36. package/build/components/global-styles/shadow-panel-components.cjs.map +2 -2
  37. package/build/components/global-styles/state-control-badges.cjs +69 -0
  38. package/build/components/global-styles/state-control-badges.cjs.map +7 -0
  39. package/build/components/global-styles/state-control.cjs +54 -63
  40. package/build/components/global-styles/state-control.cjs.map +3 -3
  41. package/build/components/iframe/index.cjs +0 -3
  42. package/build/components/iframe/index.cjs.map +2 -2
  43. package/build/components/iframe/use-scale-canvas.cjs +4 -1
  44. package/build/components/iframe/use-scale-canvas.cjs.map +2 -2
  45. package/build/components/inserter/hooks/use-patterns-state.cjs +4 -6
  46. package/build/components/inserter/hooks/use-patterns-state.cjs.map +2 -2
  47. package/build/components/inserter/index.cjs +1 -0
  48. package/build/components/inserter/index.cjs.map +2 -2
  49. package/build/components/inserter/media-tab/media-preview.cjs +27 -18
  50. package/build/components/inserter/media-tab/media-preview.cjs.map +2 -2
  51. package/build/components/inserter/media-tab/utils.cjs +1 -1
  52. package/build/components/inserter/media-tab/utils.cjs.map +2 -2
  53. package/build/components/inserter/panel.cjs.map +3 -3
  54. package/build/components/inspector-controls/block-support-tools-panel.cjs +10 -2
  55. package/build/components/inspector-controls/block-support-tools-panel.cjs.map +2 -2
  56. package/build/components/inspector-controls/fill.cjs +14 -4
  57. package/build/components/inspector-controls/fill.cjs.map +2 -2
  58. package/build/components/inspector-controls/groups.cjs +2 -0
  59. package/build/components/inspector-controls/groups.cjs.map +2 -2
  60. package/build/components/inspector-controls-tabs/index.cjs +13 -8
  61. package/build/components/inspector-controls-tabs/index.cjs.map +3 -3
  62. package/build/components/inspector-controls-tabs/settings-tab.cjs +1 -4
  63. package/build/components/inspector-controls-tabs/settings-tab.cjs.map +3 -3
  64. package/build/components/inspector-controls-tabs/styles-tab.cjs +9 -0
  65. package/build/components/inspector-controls-tabs/styles-tab.cjs.map +3 -3
  66. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.cjs +11 -5
  67. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.cjs.map +2 -2
  68. package/build/components/list-view/block-select-button.cjs +20 -8
  69. package/build/components/list-view/block-select-button.cjs.map +2 -2
  70. package/build/components/list-view/block.cjs +2 -1
  71. package/build/components/list-view/block.cjs.map +2 -2
  72. package/build/components/preset-input-control/custom-value-controls.cjs +10 -1
  73. package/build/components/preset-input-control/custom-value-controls.cjs.map +2 -2
  74. package/build/components/preset-input-control/index.cjs.map +3 -3
  75. package/build/components/provider/use-media-upload-settings.cjs +1 -0
  76. package/build/components/provider/use-media-upload-settings.cjs.map +2 -2
  77. package/build/components/rich-text/event-listeners/enter.cjs +9 -2
  78. package/build/components/rich-text/event-listeners/enter.cjs.map +3 -3
  79. package/build/components/rich-text/event-listeners/paste-handler.cjs +4 -4
  80. package/build/components/rich-text/event-listeners/paste-handler.cjs.map +3 -3
  81. package/build/hooks/background.cjs +13 -3
  82. package/build/hooks/background.cjs.map +2 -2
  83. package/build/hooks/block-fields/link/index.cjs.map +3 -3
  84. package/build/hooks/block-fields/media/index.cjs.map +3 -3
  85. package/build/hooks/block-style-state.cjs +112 -0
  86. package/build/hooks/block-style-state.cjs.map +7 -0
  87. package/build/hooks/border.cjs +13 -3
  88. package/build/hooks/border.cjs.map +2 -2
  89. package/build/hooks/color.cjs +28 -9
  90. package/build/hooks/color.cjs.map +2 -2
  91. package/build/hooks/dimensions.cjs +15 -6
  92. package/build/hooks/dimensions.cjs.map +2 -2
  93. package/build/hooks/layout-child.cjs +147 -61
  94. package/build/hooks/layout-child.cjs.map +2 -2
  95. package/build/hooks/layout.cjs +263 -56
  96. package/build/hooks/layout.cjs.map +3 -3
  97. package/build/hooks/state-utils.cjs +94 -0
  98. package/build/hooks/state-utils.cjs.map +7 -0
  99. package/build/hooks/states.cjs +124 -0
  100. package/build/hooks/states.cjs.map +7 -0
  101. package/build/hooks/style.cjs +304 -17
  102. package/build/hooks/style.cjs.map +3 -3
  103. package/build/hooks/typography.cjs +14 -5
  104. package/build/hooks/typography.cjs.map +2 -2
  105. package/build/layouts/constrained.cjs +128 -55
  106. package/build/layouts/constrained.cjs.map +3 -3
  107. package/build/layouts/flex.cjs +119 -31
  108. package/build/layouts/flex.cjs.map +3 -3
  109. package/build/layouts/grid.cjs +103 -40
  110. package/build/layouts/grid.cjs.map +3 -3
  111. package/build/private-apis.cjs +2 -0
  112. package/build/private-apis.cjs.map +2 -2
  113. package/build/store/private-actions.cjs +18 -0
  114. package/build/store/private-actions.cjs.map +2 -2
  115. package/build/store/private-keys.cjs +10 -2
  116. package/build/store/private-keys.cjs.map +2 -2
  117. package/build/store/private-selectors.cjs +26 -2
  118. package/build/store/private-selectors.cjs.map +2 -2
  119. package/build/store/reducer.cjs +70 -1
  120. package/build/store/reducer.cjs.map +2 -2
  121. package/build/store/utils.cjs +1 -1
  122. package/build/store/utils.cjs.map +2 -2
  123. package/build/utils/color-values.cjs +44 -0
  124. package/build/utils/color-values.cjs.map +7 -0
  125. package/build-module/components/block-card/index.mjs +52 -45
  126. package/build-module/components/block-card/index.mjs.map +2 -2
  127. package/build-module/components/block-heading-level-dropdown/heading-level-icon.mjs +2 -2
  128. package/build-module/components/block-heading-level-dropdown/heading-level-icon.mjs.map +2 -2
  129. package/build-module/components/block-icon/index.mjs +8 -2
  130. package/build-module/components/block-icon/index.mjs.map +2 -2
  131. package/build-module/components/block-inspector/index.mjs +166 -13
  132. package/build-module/components/block-inspector/index.mjs.map +2 -2
  133. package/build-module/components/block-inspector/inspector-pre-tabs-slot-fill.mjs +12 -0
  134. package/build-module/components/block-inspector/inspector-pre-tabs-slot-fill.mjs.map +7 -0
  135. package/build-module/components/block-list/use-block-props/index.mjs +1 -1
  136. package/build-module/components/block-list/use-block-props/index.mjs.map +2 -2
  137. package/build-module/components/block-list/use-block-props/use-focus-handler.mjs +7 -5
  138. package/build-module/components/block-list/use-block-props/use-focus-handler.mjs.map +2 -2
  139. package/build-module/components/block-list/use-block-props/use-is-hovered.mjs +28 -15
  140. package/build-module/components/block-list/use-block-props/use-is-hovered.mjs.map +2 -2
  141. package/build-module/components/block-lock/modal.mjs +4 -4
  142. package/build-module/components/block-lock/modal.mjs.map +2 -2
  143. package/build-module/components/block-patterns-list/index.mjs +14 -4
  144. package/build-module/components/block-patterns-list/index.mjs.map +2 -2
  145. package/build-module/components/block-popover/index.mjs +13 -3
  146. package/build-module/components/block-popover/index.mjs.map +2 -2
  147. package/build-module/components/block-toolbar/switch-section-style.mjs +2 -2
  148. package/build-module/components/block-toolbar/switch-section-style.mjs.map +2 -2
  149. package/build-module/components/block-visibility/modal.mjs +2 -2
  150. package/build-module/components/block-visibility/modal.mjs.map +2 -2
  151. package/build-module/components/block-visibility/viewport-visibility-info.mjs +2 -2
  152. package/build-module/components/block-visibility/viewport-visibility-info.mjs.map +2 -2
  153. package/build-module/components/colors-gradients/control.mjs +7 -4
  154. package/build-module/components/colors-gradients/control.mjs.map +2 -2
  155. package/build-module/components/global-styles/advanced-panel.mjs +25 -27
  156. package/build-module/components/global-styles/advanced-panel.mjs.map +2 -2
  157. package/build-module/components/global-styles/color-panel.mjs +96 -59
  158. package/build-module/components/global-styles/color-panel.mjs.map +2 -2
  159. package/build-module/components/global-styles/dimensions-panel.mjs +14 -5
  160. package/build-module/components/global-styles/dimensions-panel.mjs.map +2 -2
  161. package/build-module/components/global-styles/index.mjs +2 -0
  162. package/build-module/components/global-styles/index.mjs.map +2 -2
  163. package/build-module/components/global-styles/shadow-panel-components.mjs +39 -28
  164. package/build-module/components/global-styles/shadow-panel-components.mjs.map +2 -2
  165. package/build-module/components/global-styles/state-control-badges.mjs +48 -0
  166. package/build-module/components/global-styles/state-control-badges.mjs.map +7 -0
  167. package/build-module/components/global-styles/state-control.mjs +57 -71
  168. package/build-module/components/global-styles/state-control.mjs.map +2 -2
  169. package/build-module/components/iframe/index.mjs +0 -3
  170. package/build-module/components/iframe/index.mjs.map +2 -2
  171. package/build-module/components/iframe/use-scale-canvas.mjs +4 -1
  172. package/build-module/components/iframe/use-scale-canvas.mjs.map +2 -2
  173. package/build-module/components/inserter/hooks/use-patterns-state.mjs +8 -7
  174. package/build-module/components/inserter/hooks/use-patterns-state.mjs.map +2 -2
  175. package/build-module/components/inserter/index.mjs +1 -0
  176. package/build-module/components/inserter/index.mjs.map +2 -2
  177. package/build-module/components/inserter/media-tab/media-preview.mjs +27 -19
  178. package/build-module/components/inserter/media-tab/media-preview.mjs.map +2 -2
  179. package/build-module/components/inserter/media-tab/utils.mjs +1 -1
  180. package/build-module/components/inserter/media-tab/utils.mjs.map +2 -2
  181. package/build-module/components/inserter/panel.mjs +2 -2
  182. package/build-module/components/inserter/panel.mjs.map +2 -2
  183. package/build-module/components/inspector-controls/block-support-tools-panel.mjs +10 -2
  184. package/build-module/components/inspector-controls/block-support-tools-panel.mjs.map +2 -2
  185. package/build-module/components/inspector-controls/fill.mjs +18 -5
  186. package/build-module/components/inspector-controls/fill.mjs.map +2 -2
  187. package/build-module/components/inspector-controls/groups.mjs +2 -0
  188. package/build-module/components/inspector-controls/groups.mjs.map +2 -2
  189. package/build-module/components/inspector-controls-tabs/index.mjs +14 -10
  190. package/build-module/components/inspector-controls-tabs/index.mjs.map +2 -2
  191. package/build-module/components/inspector-controls-tabs/settings-tab.mjs +1 -4
  192. package/build-module/components/inspector-controls-tabs/settings-tab.mjs.map +2 -2
  193. package/build-module/components/inspector-controls-tabs/styles-tab.mjs +9 -0
  194. package/build-module/components/inspector-controls-tabs/styles-tab.mjs.map +2 -2
  195. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.mjs +11 -5
  196. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.mjs.map +2 -2
  197. package/build-module/components/list-view/block-select-button.mjs +20 -9
  198. package/build-module/components/list-view/block-select-button.mjs.map +2 -2
  199. package/build-module/components/list-view/block.mjs +2 -1
  200. package/build-module/components/list-view/block.mjs.map +2 -2
  201. package/build-module/components/preset-input-control/custom-value-controls.mjs +10 -2
  202. package/build-module/components/preset-input-control/custom-value-controls.mjs.map +2 -2
  203. package/build-module/components/preset-input-control/index.mjs +2 -2
  204. package/build-module/components/preset-input-control/index.mjs.map +2 -2
  205. package/build-module/components/provider/use-media-upload-settings.mjs +1 -0
  206. package/build-module/components/provider/use-media-upload-settings.mjs.map +2 -2
  207. package/build-module/components/rich-text/event-listeners/enter.mjs +9 -2
  208. package/build-module/components/rich-text/event-listeners/enter.mjs.map +2 -2
  209. package/build-module/components/rich-text/event-listeners/paste-handler.mjs +4 -4
  210. package/build-module/components/rich-text/event-listeners/paste-handler.mjs.map +2 -2
  211. package/build-module/hooks/background.mjs +18 -3
  212. package/build-module/hooks/background.mjs.map +2 -2
  213. package/build-module/hooks/block-fields/link/index.mjs +3 -3
  214. package/build-module/hooks/block-fields/link/index.mjs.map +2 -2
  215. package/build-module/hooks/block-fields/media/index.mjs +3 -3
  216. package/build-module/hooks/block-fields/media/index.mjs.map +2 -2
  217. package/build-module/hooks/block-style-state.mjs +79 -0
  218. package/build-module/hooks/block-style-state.mjs.map +7 -0
  219. package/build-module/hooks/border.mjs +18 -3
  220. package/build-module/hooks/border.mjs.map +2 -2
  221. package/build-module/hooks/color.mjs +33 -9
  222. package/build-module/hooks/color.mjs.map +2 -2
  223. package/build-module/hooks/dimensions.mjs +20 -6
  224. package/build-module/hooks/dimensions.mjs.map +2 -2
  225. package/build-module/hooks/layout-child.mjs +141 -61
  226. package/build-module/hooks/layout-child.mjs.map +2 -2
  227. package/build-module/hooks/layout.mjs +270 -58
  228. package/build-module/hooks/layout.mjs.map +2 -2
  229. package/build-module/hooks/state-utils.mjs +64 -0
  230. package/build-module/hooks/state-utils.mjs.map +7 -0
  231. package/build-module/hooks/states.mjs +85 -0
  232. package/build-module/hooks/states.mjs.map +7 -0
  233. package/build-module/hooks/style.mjs +309 -18
  234. package/build-module/hooks/style.mjs.map +2 -2
  235. package/build-module/hooks/typography.mjs +19 -5
  236. package/build-module/hooks/typography.mjs.map +2 -2
  237. package/build-module/layouts/constrained.mjs +130 -57
  238. package/build-module/layouts/constrained.mjs.map +2 -2
  239. package/build-module/layouts/flex.mjs +123 -35
  240. package/build-module/layouts/flex.mjs.map +2 -2
  241. package/build-module/layouts/grid.mjs +105 -42
  242. package/build-module/layouts/grid.mjs.map +2 -2
  243. package/build-module/private-apis.mjs +4 -0
  244. package/build-module/private-apis.mjs.map +2 -2
  245. package/build-module/store/private-actions.mjs +16 -0
  246. package/build-module/store/private-actions.mjs.map +2 -2
  247. package/build-module/store/private-keys.mjs +7 -1
  248. package/build-module/store/private-keys.mjs.map +2 -2
  249. package/build-module/store/private-selectors.mjs +25 -2
  250. package/build-module/store/private-selectors.mjs.map +2 -2
  251. package/build-module/store/reducer.mjs +69 -1
  252. package/build-module/store/reducer.mjs.map +2 -2
  253. package/build-module/store/utils.mjs +5 -2
  254. package/build-module/store/utils.mjs.map +2 -2
  255. package/build-module/utils/color-values.mjs +19 -0
  256. package/build-module/utils/color-values.mjs.map +7 -0
  257. package/build-style/content-rtl.css +18 -3
  258. package/build-style/content.css +18 -3
  259. package/build-style/style-rtl.css +14 -17
  260. package/build-style/style.css +14 -17
  261. package/package.json +41 -41
  262. package/src/components/audio-player/index.native.js +7 -3
  263. package/src/components/block-card/index.js +67 -60
  264. package/src/components/block-heading-level-dropdown/heading-level-icon.js +2 -2
  265. package/src/components/block-icon/index.js +5 -2
  266. package/src/components/block-icon/index.native.js +2 -2
  267. package/src/components/block-inspector/index.js +153 -7
  268. package/src/components/block-inspector/inspector-pre-tabs-slot-fill.js +11 -0
  269. package/src/components/block-list/block-selection-button.native.js +3 -3
  270. package/src/components/block-list/content.scss +0 -6
  271. package/src/components/block-list/use-block-props/index.js +1 -1
  272. package/src/components/block-list/use-block-props/use-focus-handler.js +8 -6
  273. package/src/components/block-list/use-block-props/use-is-hovered.js +32 -15
  274. package/src/components/block-lock/modal.js +4 -4
  275. package/src/components/block-patterns-list/index.js +14 -5
  276. package/src/components/block-patterns-list/stories/index.story.jsx +2 -0
  277. package/src/components/block-patterns-list/style.scss +0 -1
  278. package/src/components/block-popover/index.js +20 -10
  279. package/src/components/block-toolbar/switch-section-style.js +2 -2
  280. package/src/components/block-visibility/modal.js +2 -2
  281. package/src/components/block-visibility/viewport-visibility-info.js +2 -2
  282. package/src/components/colors/test/with-colors.js +1 -1
  283. package/src/components/colors-gradients/control.js +10 -8
  284. package/src/components/colors-gradients/test/control.js +98 -1
  285. package/src/components/global-styles/advanced-panel.js +44 -39
  286. package/src/components/global-styles/color-panel.js +133 -60
  287. package/src/components/global-styles/dimensions-panel.js +17 -4
  288. package/src/components/global-styles/index.js +1 -0
  289. package/src/components/global-styles/shadow-panel-components.js +29 -19
  290. package/src/components/global-styles/state-control-badges.js +58 -0
  291. package/src/components/global-styles/state-control.js +28 -36
  292. package/src/components/global-styles/test/color-panel.js +135 -0
  293. package/src/components/iframe/index.js +0 -3
  294. package/src/components/iframe/use-scale-canvas.js +8 -2
  295. package/src/components/inserter/hooks/use-patterns-state.js +12 -7
  296. package/src/components/inserter/index.js +1 -0
  297. package/src/components/inserter/media-tab/media-preview.js +29 -20
  298. package/src/components/inserter/media-tab/utils.js +1 -1
  299. package/src/components/inserter/panel.js +2 -2
  300. package/src/components/inserter/style.scss +1 -0
  301. package/src/components/inserter-button/index.native.js +5 -2
  302. package/src/components/inspector-controls/block-support-tools-panel.js +10 -2
  303. package/src/components/inspector-controls/fill.js +18 -5
  304. package/src/components/inspector-controls/groups.js +2 -0
  305. package/src/components/inspector-controls-tabs/index.js +9 -5
  306. package/src/components/inspector-controls-tabs/settings-tab.js +1 -7
  307. package/src/components/inspector-controls-tabs/styles-tab.js +6 -0
  308. package/src/components/inspector-controls-tabs/use-inspector-controls-tabs.js +13 -7
  309. package/src/components/list-view/block-select-button.js +19 -9
  310. package/src/components/list-view/block.js +6 -1
  311. package/src/components/media-replace-flow/style.scss +0 -18
  312. package/src/components/preset-input-control/custom-value-controls.js +13 -6
  313. package/src/components/preset-input-control/index.js +2 -2
  314. package/src/components/provider/use-media-upload-settings.js +1 -0
  315. package/src/components/rich-text/event-listeners/enter.js +14 -2
  316. package/src/components/rich-text/event-listeners/paste-handler.js +5 -4
  317. package/src/components/unsupported-block-details/index.native.js +6 -2
  318. package/src/components/video-player/index.native.js +2 -2
  319. package/src/components/warning/index.native.js +2 -2
  320. package/src/hooks/background.js +59 -37
  321. package/src/hooks/block-fields/link/index.js +3 -3
  322. package/src/hooks/block-fields/media/index.js +3 -3
  323. package/src/hooks/block-style-state.js +127 -0
  324. package/src/hooks/border.js +25 -6
  325. package/src/hooks/color.js +40 -18
  326. package/src/hooks/dimensions.js +32 -11
  327. package/src/hooks/layout-child.js +179 -62
  328. package/src/hooks/layout.js +349 -75
  329. package/src/hooks/layout.scss +6 -0
  330. package/src/hooks/state-utils.js +158 -0
  331. package/src/hooks/states.js +109 -0
  332. package/src/hooks/style.js +456 -19
  333. package/src/hooks/test/block-style-state.js +270 -0
  334. package/src/hooks/test/layout.js +185 -0
  335. package/src/hooks/test/state-utils.js +193 -0
  336. package/src/hooks/test/style.js +301 -1
  337. package/src/hooks/typography.js +33 -14
  338. package/src/layouts/constrained.js +182 -95
  339. package/src/layouts/flex.js +141 -36
  340. package/src/layouts/grid.js +122 -32
  341. package/src/layouts/test/flex.js +57 -20
  342. package/src/private-apis.js +4 -0
  343. package/src/store/private-actions.js +32 -0
  344. package/src/store/private-keys.js +4 -0
  345. package/src/store/private-selectors.js +44 -2
  346. package/src/store/reducer.js +105 -1
  347. package/src/store/test/private-actions.js +26 -0
  348. package/src/store/test/private-selectors.js +90 -0
  349. package/src/store/test/reducer.js +363 -0
  350. package/src/store/utils.js +6 -2
  351. package/src/utils/color-values.js +28 -0
  352. package/src/utils/test/color-values.js +78 -0
@@ -16,6 +16,7 @@ export default function BlockSupportToolsPanel( { children, group, label } ) {
16
16
  const { updateBlockAttributes } = useDispatch( blockEditorStore );
17
17
  const {
18
18
  getBlockAttributes,
19
+ getBlockName,
19
20
  getMultiSelectedBlockClientIds,
20
21
  getSelectedBlockClientId,
21
22
  hasMultiSelection,
@@ -31,13 +32,19 @@ export default function BlockSupportToolsPanel( { children, group, label } ) {
31
32
  : [ panelId ];
32
33
 
33
34
  clientIds.forEach( ( clientId ) => {
34
- const { style } = getBlockAttributes( clientId );
35
+ const blockAttributes = getBlockAttributes( clientId ) || {};
36
+ const { style } = blockAttributes;
35
37
  let newBlockAttributes = { style };
38
+ const resetContext = {
39
+ attributes: blockAttributes,
40
+ clientId,
41
+ name: getBlockName( clientId ),
42
+ };
36
43
 
37
44
  resetFilters.forEach( ( resetFilter ) => {
38
45
  newBlockAttributes = {
39
46
  ...newBlockAttributes,
40
- ...resetFilter( newBlockAttributes ),
47
+ ...resetFilter( newBlockAttributes, resetContext ),
41
48
  };
42
49
  } );
43
50
 
@@ -54,6 +61,7 @@ export default function BlockSupportToolsPanel( { children, group, label } ) {
54
61
  },
55
62
  [
56
63
  getBlockAttributes,
64
+ getBlockName,
57
65
  getMultiSelectedBlockClientIds,
58
66
  hasMultiSelection,
59
67
  panelId,
@@ -7,7 +7,7 @@ import {
7
7
  } from '@wordpress/components';
8
8
  import warning from '@wordpress/warning';
9
9
  import deprecated from '@wordpress/deprecated';
10
- import { useEffect, useContext } from '@wordpress/element';
10
+ import { useEffect, useContext, useMemo } from '@wordpress/element';
11
11
 
12
12
  /**
13
13
  * Internal dependencies
@@ -19,6 +19,10 @@ import {
19
19
  isInListViewBlockSupportTreeKey,
20
20
  } from '../block-edit/context';
21
21
  import groups from './groups';
22
+ import {
23
+ scopeResetAllFilterToState,
24
+ useBlockStyleState,
25
+ } from '../../hooks/block-style-state';
22
26
  import { ListViewContentFill } from './list-view-content-popover';
23
27
 
24
28
  const PATTERN_EDITING_GROUPS = [ 'content', 'list' ];
@@ -117,18 +121,27 @@ export default function InspectorControlsFill( {
117
121
  function RegisterResetAll( { resetAllFilter, children } ) {
118
122
  const { registerResetAllFilter, deregisterResetAllFilter } =
119
123
  useContext( ToolsPanelContext );
124
+ const selectedState = useBlockStyleState();
125
+ const scopedResetAllFilter = useMemo(
126
+ () => scopeResetAllFilterToState( selectedState, resetAllFilter ),
127
+ [ resetAllFilter, selectedState ]
128
+ );
120
129
  useEffect( () => {
121
130
  if (
122
- resetAllFilter &&
131
+ scopedResetAllFilter &&
123
132
  registerResetAllFilter &&
124
133
  deregisterResetAllFilter
125
134
  ) {
126
- registerResetAllFilter( resetAllFilter );
135
+ registerResetAllFilter( scopedResetAllFilter );
127
136
  return () => {
128
- deregisterResetAllFilter( resetAllFilter );
137
+ deregisterResetAllFilter( scopedResetAllFilter );
129
138
  };
130
139
  }
131
- }, [ resetAllFilter, registerResetAllFilter, deregisterResetAllFilter ] );
140
+ }, [
141
+ scopedResetAllFilter,
142
+ registerResetAllFilter,
143
+ deregisterResetAllFilter,
144
+ ] );
132
145
  return children;
133
146
  }
134
147
 
@@ -15,6 +15,7 @@ const InspectorControlsFilter = createSlotFill( 'InspectorControlsFilter' );
15
15
  const InspectorControlsDimensions = createSlotFill(
16
16
  'InspectorControlsDimensions'
17
17
  );
18
+ const InspectorControlsLayout = createSlotFill( 'InspectorControlsLayout' );
18
19
  const InspectorControlsPosition = createSlotFill( 'InspectorControlsPosition' );
19
20
  const InspectorControlsTypography = createSlotFill(
20
21
  'InspectorControlsTypography'
@@ -35,6 +36,7 @@ const groups = {
35
36
  dimensions: InspectorControlsDimensions,
36
37
  effects: InspectorControlsEffects,
37
38
  filter: InspectorControlsFilter,
39
+ layout: InspectorControlsLayout,
38
40
  list: InspectorControlsListView,
39
41
  position: InspectorControlsPosition,
40
42
  settings: InspectorControlsDefault, // Alias for default.
@@ -2,14 +2,16 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import {
5
- Icon,
6
- Tooltip,
5
+ Icon as WCIcon,
7
6
  privateApis as componentsPrivateApis,
8
7
  } from '@wordpress/components';
9
8
  import { useEffect, useState, useRef } from '@wordpress/element';
10
9
  import { store as preferencesStore } from '@wordpress/preferences';
11
10
  import { useSelect, useDispatch } from '@wordpress/data';
12
11
 
12
+ // eslint-disable-next-line @wordpress/use-recommended-components -- `Tooltip` is not yet on the recommended `@wordpress/ui` allow-list; landing as a migration step ahead of the wider rollout.
13
+ import { Tooltip } from '@wordpress/ui';
14
+
13
15
  /**
14
16
  * Internal dependencies
15
17
  */
@@ -175,14 +177,16 @@ export default function InspectorControlsTabs( {
175
177
  { tab.title }
176
178
  </Tabs.Tab>
177
179
  ) : (
178
- <Tooltip text={ tab.title } key={ tab.name }>
180
+ <Tooltip.Root key={ tab.name }>
179
181
  <Tabs.Tab
180
182
  tabId={ tab.name }
181
183
  aria-label={ tab.title }
184
+ render={ <Tooltip.Trigger /> }
182
185
  >
183
- <Icon icon={ tab.icon } />
186
+ <WCIcon icon={ tab.icon } />
184
187
  </Tabs.Tab>
185
- </Tooltip>
188
+ <Tooltip.Popup>{ tab.title }</Tooltip.Popup>
189
+ </Tooltip.Root>
186
190
  )
187
191
  ) }
188
192
  </Tabs.TabList>
@@ -7,26 +7,20 @@ import { __experimentalUseSlotFills as useSlotFills } from '@wordpress/component
7
7
  * Internal dependencies
8
8
  */
9
9
  import AdvancedControls from './advanced-controls-panel';
10
- import PositionControls from './position-controls-panel';
11
10
  import { default as InspectorControls } from '../inspector-controls';
12
11
  import groups from '../inspector-controls/groups';
13
12
 
14
13
  const SettingsTab = ( { showAdvancedControls = false } ) => {
15
14
  const defaultFills = useSlotFills( groups.default.name );
16
- const positionFills = useSlotFills( groups.position.name );
17
15
  const bindingsFills = useSlotFills( groups.bindings.name );
18
16
 
19
17
  // Expand the advanced panel when there are no other fills
20
18
  // in the settings tab.
21
- const hasOtherFills =
22
- !! defaultFills?.length ||
23
- !! positionFills?.length ||
24
- !! bindingsFills?.length;
19
+ const hasOtherFills = !! defaultFills?.length || !! bindingsFills?.length;
25
20
 
26
21
  return (
27
22
  <>
28
23
  <InspectorControls.Slot />
29
- <PositionControls />
30
24
  <InspectorControls.Slot group="bindings" />
31
25
  { showAdvancedControls && (
32
26
  <div>
@@ -9,6 +9,7 @@ import { useDispatch, useSelect } from '@wordpress/data';
9
9
  */
10
10
  import BlockStyles from '../block-styles';
11
11
  import InspectorControls from '../inspector-controls';
12
+ import PositionControls from './position-controls-panel';
12
13
  import { useBorderPanelLabel } from '../../hooks/border';
13
14
  import { useBlockSettings } from '../../hooks/utils';
14
15
  import { store as blockEditorStore } from '../../store';
@@ -95,6 +96,10 @@ const StylesTab = ( {
95
96
  group="typography"
96
97
  label={ __( 'Typography' ) }
97
98
  />
99
+ <InspectorControls.Slot
100
+ group="layout"
101
+ label={ __( 'Layout' ) }
102
+ />
98
103
  <InspectorControls.Slot
99
104
  group="dimensions"
100
105
  label={ __( 'Dimensions' ) }
@@ -103,6 +108,7 @@ const StylesTab = ( {
103
108
  group="border"
104
109
  label={ borderPanelLabel }
105
110
  />
111
+ <PositionControls />
106
112
  <InspectorControls.Slot group="styles" />
107
113
  </>
108
114
  ) }
@@ -41,6 +41,7 @@ export default function useInspectorControlsTabs(
41
41
  color: colorGroup,
42
42
  content: contentGroup,
43
43
  default: defaultGroup,
44
+ layout: layoutGroup,
44
45
  dimensions: dimensionsGroup,
45
46
  list: listGroup,
46
47
  position: positionGroup,
@@ -62,6 +63,8 @@ export default function useInspectorControlsTabs(
62
63
  const styleFills = [
63
64
  ...( useSlotFills( borderGroup.name ) || [] ),
64
65
  ...( useSlotFills( colorGroup.name ) || [] ),
66
+ ...( useSlotFills( layoutGroup.name ) || [] ),
67
+ ...( useSlotFills( positionGroup.name ) || [] ),
65
68
  ...( useSlotFills( dimensionsGroup.name ) || [] ),
66
69
  ...( useSlotFills( stylesGroup.name ) || [] ),
67
70
  ...( useSlotFills( typographyGroup.name ) || [] ),
@@ -70,7 +73,7 @@ export default function useInspectorControlsTabs(
70
73
  const hasStyleFills = styleFills.length;
71
74
 
72
75
  // Settings Tab: If we don't have multiple tabs to display
73
- // (i.e. both list view and styles), check only the default and position
76
+ // (i.e. both list view and styles), check only the default
74
77
  // InspectorControls slots. If we have multiple tabs, we'll need to check
75
78
  // the advanced controls slot as well to ensure they are rendered.
76
79
  const advancedFills = [
@@ -80,7 +83,6 @@ export default function useInspectorControlsTabs(
80
83
 
81
84
  const settingsFills = [
82
85
  ...( useSlotFills( defaultGroup.name ) || [] ),
83
- ...( useSlotFills( positionGroup.name ) || [] ),
84
86
  ...( hasListFills && hasStyleFills > 1 ? advancedFills : [] ),
85
87
  ];
86
88
 
@@ -111,14 +113,18 @@ export default function useInspectorControlsTabs(
111
113
  tabs.push( TAB_SETTINGS );
112
114
  }
113
115
 
114
- if ( hasBlockStyles || hasStyleFills ) {
116
+ const { tabSettings, isPreviewMode } = useSelect( ( select ) => {
117
+ const settings = select( blockEditorStore ).getSettings();
118
+ return {
119
+ tabSettings: settings.blockInspectorTabs,
120
+ isPreviewMode: settings.isPreviewMode,
121
+ };
122
+ }, [] );
123
+
124
+ if ( ! isPreviewMode && ( hasBlockStyles || hasStyleFills ) ) {
115
125
  tabs.push( TAB_STYLES );
116
126
  }
117
127
 
118
- const tabSettings = useSelect( ( select ) => {
119
- return select( blockEditorStore ).getSettings().blockInspectorTabs;
120
- }, [] );
121
-
122
128
  const showTabs = getShowTabs( blockName, tabSettings );
123
129
  return showTabs ? tabs : EMPTY_ARRAY;
124
130
  }
@@ -9,7 +9,6 @@ import clsx from 'clsx';
9
9
  import {
10
10
  __experimentalHStack as HStack,
11
11
  __experimentalTruncate as Truncate,
12
- Tooltip,
13
12
  privateApis as componentsPrivateApis,
14
13
  } from '@wordpress/components';
15
14
  import { forwardRef } from '@wordpress/element';
@@ -23,6 +22,9 @@ import {
23
22
  import { SPACE, ENTER } from '@wordpress/keycodes';
24
23
  import { useSelect } from '@wordpress/data';
25
24
 
25
+ // eslint-disable-next-line @wordpress/use-recommended-components -- `Tooltip` is not yet on the recommended `@wordpress/ui` allow-list; landing as a migration step ahead of the wider rollout.
26
+ import { Tooltip } from '@wordpress/ui';
27
+
26
28
  /**
27
29
  * Internal dependencies
28
30
  */
@@ -164,14 +166,22 @@ function ListViewBlockSelectButton(
164
166
  </span>
165
167
  ) : null }
166
168
  { !! visibilityLabel && (
167
- <Tooltip text={ visibilityLabel }>
168
- <span
169
- className="block-editor-list-view-block-select-button__block-visibility"
170
- aria-hidden="true"
171
- >
172
- <Icon icon={ unseen } />
173
- </span>
174
- </Tooltip>
169
+ // TODO: `visibilityLabel` is not exposed to
170
+ // assistive technology — the trigger is
171
+ // `aria-hidden`, so the label is sighted-hover-only.
172
+ <Tooltip.Root>
173
+ <Tooltip.Trigger
174
+ render={
175
+ <span
176
+ className="block-editor-list-view-block-select-button__block-visibility"
177
+ aria-hidden="true"
178
+ >
179
+ <Icon icon={ unseen } />
180
+ </span>
181
+ }
182
+ />
183
+ <Tooltip.Popup>{ visibilityLabel }</Tooltip.Popup>
184
+ </Tooltip.Root>
175
185
  ) }
176
186
  { shouldShowLockIcon && (
177
187
  <span className="block-editor-list-view-block-select-button__lock">
@@ -415,7 +415,12 @@ function ListViewBlock( {
415
415
 
416
416
  const selectEditorBlock = useCallback(
417
417
  ( event ) => {
418
- selectBlock( event, clientId );
418
+ // For keyboard activation (Enter/Space on a link), transfer focus
419
+ // to the canvas with the caret at the end of the block.
420
+ // For mouse clicks, keep focus in the list view so that subsequent
421
+ // keyboard operations (arrow navigation, copy/paste) still work.
422
+ const isKeyboardActivation = event?.detail === 0;
423
+ selectBlock( event, clientId, isKeyboardActivation ? -1 : null );
419
424
  event.preventDefault();
420
425
  },
421
426
  [ clientId, selectBlock ]
@@ -65,21 +65,3 @@
65
65
  }
66
66
  }
67
67
  }
68
-
69
- .block-editor-media-flow__error {
70
- padding: 0 20px 20px 20px;
71
- max-width: 255px;
72
-
73
- .components-with-notices-ui {
74
- max-width: 255px;
75
-
76
- .components-notice__content {
77
- overflow: hidden;
78
- word-wrap: break-word;
79
- }
80
- .components-notice__dismiss {
81
- position: absolute;
82
- right: 10px;
83
- }
84
- }
85
- }
@@ -3,10 +3,12 @@
3
3
  */
4
4
  import {
5
5
  RangeControl,
6
- Tooltip,
7
6
  __experimentalUnitControl as UnitControl,
8
7
  } from '@wordpress/components';
9
8
 
9
+ // eslint-disable-next-line @wordpress/use-recommended-components -- `Tooltip` is not yet on the recommended `@wordpress/ui` allow-list; landing as a migration step ahead of the wider rollout.
10
+ import { Tooltip } from '@wordpress/ui';
11
+
10
12
  /**
11
13
  * CustomValueControls component for handling custom value input.
12
14
  *
@@ -93,11 +95,16 @@ export default function CustomValueControls( {
93
95
  );
94
96
 
95
97
  const wrappedUnitControl = showTooltip ? (
96
- <Tooltip text={ ariaLabel } placement="top">
97
- <div className="preset-input-control__tooltip-wrapper">
98
- { unitControl }
99
- </div>
100
- </Tooltip>
98
+ <Tooltip.Root>
99
+ <Tooltip.Trigger
100
+ render={
101
+ <div className="preset-input-control__tooltip-wrapper">
102
+ { unitControl }
103
+ </div>
104
+ }
105
+ />
106
+ <Tooltip.Popup>{ ariaLabel }</Tooltip.Popup>
107
+ </Tooltip.Root>
101
108
  ) : (
102
109
  unitControl
103
110
  );
@@ -4,7 +4,7 @@
4
4
  import {
5
5
  Button,
6
6
  CustomSelectControl,
7
- Icon,
7
+ Icon as WCIcon,
8
8
  RangeControl,
9
9
  __experimentalHStack as HStack,
10
10
  __experimentalParseQuantityAndUnitFromRawValue as parseQuantityAndUnitFromRawValue,
@@ -208,7 +208,7 @@ export default function PresetInputControl( {
208
208
  className={ `preset-input-control__wrapper ${ className }__wrapper` }
209
209
  >
210
210
  { icon && (
211
- <Icon
211
+ <WCIcon
212
212
  className="preset-input-control__icon"
213
213
  icon={ icon }
214
214
  size={ ICON_SIZE }
@@ -16,6 +16,7 @@ function useMediaUploadSettings( settings = {} ) {
16
16
  mediaUpload: settings.mediaUpload,
17
17
  mediaSideload: settings.mediaSideload,
18
18
  mediaFinalize: settings.mediaFinalize,
19
+ mediaDelete: settings.mediaDelete,
19
20
  maxUploadFileSize: settings.maxUploadFileSize,
20
21
  allowedMimeTypes: settings.allowedMimeTypes,
21
22
  allImageSizes: settings.allImageSizes,
@@ -3,6 +3,14 @@
3
3
  */
4
4
  import { ENTER } from '@wordpress/keycodes';
5
5
  import { insert, remove } from '@wordpress/rich-text';
6
+ import { privateApis as composePrivateApis } from '@wordpress/compose';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import { unlock } from '../../../lock-unlock';
12
+
13
+ const { subscribeDelegatedListener } = unlock( composePrivateApis );
6
14
 
7
15
  export default ( props ) => ( element ) => {
8
16
  function onKeyDownDeprecated( event ) {
@@ -75,10 +83,14 @@ export default ( props ) => ( element ) => {
75
83
 
76
84
  // Attach the listener to the window so parent elements have the chance to
77
85
  // prevent the default behavior.
78
- defaultView.addEventListener( 'keydown', onKeyDown );
86
+ const unsubscribeKeyDown = subscribeDelegatedListener(
87
+ defaultView,
88
+ 'keydown',
89
+ onKeyDown
90
+ );
79
91
  element.addEventListener( 'keydown', onKeyDownDeprecated );
80
92
  return () => {
81
- defaultView.removeEventListener( 'keydown', onKeyDown );
93
+ unsubscribeKeyDown();
82
94
  element.removeEventListener( 'keydown', onKeyDownDeprecated );
83
95
  };
84
96
  };
@@ -4,6 +4,7 @@
4
4
  import { pasteHandler } from '@wordpress/blocks';
5
5
  import { isEmpty, insert, create } from '@wordpress/rich-text';
6
6
  import { isURL } from '@wordpress/url';
7
+ import { privateApis as composePrivateApis } from '@wordpress/compose';
7
8
 
8
9
  /**
9
10
  * Internal dependencies
@@ -11,6 +12,9 @@ import { isURL } from '@wordpress/url';
11
12
  import { store as blockEditorStore } from '../../../store';
12
13
  import { addActiveFormats } from '../utils';
13
14
  import { getPasteEventData } from '../../../utils/pasting';
15
+ import { unlock } from '../../../lock-unlock';
16
+
17
+ const { subscribeDelegatedListener } = unlock( composePrivateApis );
14
18
 
15
19
  /** @typedef {import('@wordpress/rich-text').RichTextValue} RichTextValue */
16
20
 
@@ -141,8 +145,5 @@ export default ( props ) => ( element ) => {
141
145
 
142
146
  // Attach the listener to the window so parent elements have the chance to
143
147
  // prevent the default behavior.
144
- defaultView.addEventListener( 'paste', _onPaste );
145
- return () => {
146
- defaultView.removeEventListener( 'paste', _onPaste );
147
- };
148
+ return subscribeDelegatedListener( defaultView, 'paste', _onPaste );
148
149
  };
@@ -6,7 +6,11 @@ import { View, Text } from 'react-native';
6
6
  /**
7
7
  * WordPress dependencies
8
8
  */
9
- import { BottomSheet, Icon, TextControl } from '@wordpress/components';
9
+ import {
10
+ BottomSheet,
11
+ Icon as WCIcon,
12
+ TextControl,
13
+ } from '@wordpress/components';
10
14
  import {
11
15
  requestUnsupportedBlockFallback,
12
16
  sendActionButtonPressedAction,
@@ -148,7 +152,7 @@ const UnsupportedBlockDetails = ( {
148
152
  } }
149
153
  >
150
154
  <View style={ styles[ 'unsupported-block-details__container' ] }>
151
- <Icon
155
+ <WCIcon
152
156
  icon={ icon || help }
153
157
  color={ iconStyle.color }
154
158
  size={ iconStyle.size }
@@ -2,7 +2,7 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import { Component } from '@wordpress/element';
5
- import { Icon } from '@wordpress/components';
5
+ import { Icon as WCIcon } from '@wordpress/components';
6
6
  import { __ } from '@wordpress/i18n';
7
7
 
8
8
  /**
@@ -118,7 +118,7 @@ class Video extends Component {
118
118
  style={ [ style, styles.overlayContainer ] }
119
119
  >
120
120
  <View style={ styles.blackOverlay } />
121
- <Icon
121
+ <WCIcon
122
122
  icon={ PlayIcon }
123
123
  style={ styles.playIcon }
124
124
  size={ styles.playIcon.size }
@@ -6,7 +6,7 @@ import { View, Text } from 'react-native';
6
6
  /**
7
7
  * WordPress dependencies
8
8
  */
9
- import { Icon } from '@wordpress/components';
9
+ import { Icon as WCIcon } from '@wordpress/components';
10
10
  import { withPreferredColorScheme } from '@wordpress/compose';
11
11
  import { normalizeIconObject } from '@wordpress/blocks';
12
12
 
@@ -48,7 +48,7 @@ function Warning( {
48
48
  <View style={ containerStyle } { ...viewProps }>
49
49
  { icon && (
50
50
  <View style={ styles.icon }>
51
- <Icon
51
+ <WCIcon
52
52
  className={ iconClass || internalIconClass }
53
53
  icon={ icon && icon.src ? icon.src : icon }
54
54
  />
@@ -23,6 +23,12 @@ import {
23
23
  hasBackgroundGradientValue,
24
24
  } from '../components/global-styles/background-panel';
25
25
  import { globalStylesDataKey } from '../store/private-keys';
26
+ import {
27
+ getStyleForState,
28
+ isDefaultBlockStyleState,
29
+ setStyleForState,
30
+ useBlockStyleState,
31
+ } from './block-style-state';
26
32
 
27
33
  export const BACKGROUND_SUPPORT_KEY = 'background';
28
34
 
@@ -164,6 +170,7 @@ export function BackgroundImagePanel( {
164
170
  setAttributes,
165
171
  settings,
166
172
  } ) {
173
+ const selectedState = useBlockStyleState();
167
174
  const { style, className, inheritedValue } = useSelect(
168
175
  ( select ) => {
169
176
  const { getBlockAttributes, getSettings } =
@@ -213,44 +220,55 @@ export function BackgroundImagePanel( {
213
220
  return null;
214
221
  }
215
222
 
216
- const onChange = ( newStyle ) => {
217
- const isMigrating =
218
- backgroundGradientSupported && !! style?.color?.gradient;
219
- const newAttributes = {
220
- style: cleanEmptyObject(
221
- backgroundGradientSupported
222
- ? {
223
- ...newStyle,
224
- color: {
225
- ...newStyle?.color,
226
- gradient: undefined,
227
- },
228
- }
229
- : newStyle
230
- ),
231
- };
223
+ const isStateSelected = ! isDefaultBlockStyleState( selectedState );
232
224
 
233
- // When migrating from color.gradient to background.gradient, preserve
234
- // the has-background class so existing styles relying on it (e.g.
235
- // theme padding) are not silently broken. Only add the class when a
236
- // gradient value is being set — not when it is being cleared/reset.
237
- // Conversely, if the gradient is cleared and has-background was added
238
- // during a previous migration, remove it so it does not linger.
239
- if ( isMigrating && !! newStyle?.background?.gradient ) {
240
- newAttributes.className = clsx( className, 'has-background' );
241
- } else if (
242
- ! newStyle?.background?.gradient &&
243
- className?.includes( 'has-background' )
244
- ) {
245
- newAttributes.className =
246
- className
247
- .split( ' ' )
248
- .filter( ( c ) => c !== 'has-background' )
249
- .join( ' ' ) || undefined;
250
- }
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
+ };
251
247
 
252
- setAttributes( newAttributes );
253
- };
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
+ };
254
272
 
255
273
  // When background.gradient is supported but not yet explicitly set, fall
256
274
  // back to color.gradient for display. Any write from this panel migrates
@@ -292,7 +310,11 @@ export function BackgroundImagePanel( {
292
310
  settings={ updatedSettings }
293
311
  onChange={ onChange }
294
312
  defaultControls={ defaultControls }
295
- value={ styleValue }
313
+ value={
314
+ isStateSelected
315
+ ? getStyleForState( style, selectedState )
316
+ : styleValue
317
+ }
296
318
  />
297
319
  );
298
320
  }