@wordpress/block-editor 15.22.1-next.v.202606191442.0 → 15.23.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 (383) hide show
  1. package/CHANGELOG.md +3 -1
  2. package/README.md +2 -2
  3. package/build/components/block-editing-mode/index.cjs +13 -7
  4. package/build/components/block-editing-mode/index.cjs.map +2 -2
  5. package/build/components/block-inspector/index.cjs +50 -51
  6. package/build/components/block-inspector/index.cjs.map +2 -2
  7. package/build/components/block-rename/modal.cjs +0 -1
  8. package/build/components/block-rename/modal.cjs.map +2 -2
  9. package/build/components/block-toolbar/block-toolbar-icon.cjs +14 -6
  10. package/build/components/block-toolbar/block-toolbar-icon.cjs.map +2 -2
  11. package/build/components/colors-gradients/control.cjs +25 -14
  12. package/build/components/colors-gradients/control.cjs.map +2 -2
  13. package/build/components/colors-gradients/dropdown.cjs +4 -1
  14. package/build/components/colors-gradients/dropdown.cjs.map +3 -3
  15. package/build/components/contrast-checker/index.cjs +22 -4
  16. package/build/components/contrast-checker/index.cjs.map +2 -2
  17. package/build/components/date-format-picker/index.cjs +0 -1
  18. package/build/components/date-format-picker/index.cjs.map +2 -2
  19. package/build/components/global-styles/background-panel.cjs +153 -25
  20. package/build/components/global-styles/background-panel.cjs.map +3 -3
  21. package/build/components/global-styles/color-gradient-dropdown-item.cjs +227 -0
  22. package/build/components/global-styles/color-gradient-dropdown-item.cjs.map +7 -0
  23. package/build/components/global-styles/color-panel.cjs +98 -375
  24. package/build/components/global-styles/color-panel.cjs.map +3 -3
  25. package/build/components/global-styles/dimensions-panel.cjs +0 -3
  26. package/build/components/global-styles/dimensions-panel.cjs.map +2 -2
  27. package/build/components/global-styles/hooks.cjs +34 -0
  28. package/build/components/global-styles/hooks.cjs.map +2 -2
  29. package/build/components/global-styles/typography-panel.cjs +82 -10
  30. package/build/components/global-styles/typography-panel.cjs.map +3 -3
  31. package/build/components/inspector-controls/groups.cjs +2 -0
  32. package/build/components/inspector-controls/groups.cjs.map +2 -2
  33. package/build/components/inspector-controls-tabs/styles-tab.cjs +75 -31
  34. package/build/components/inspector-controls-tabs/styles-tab.cjs.map +2 -2
  35. package/build/components/link-control/index.cjs +1 -2
  36. package/build/components/link-control/index.cjs.map +2 -2
  37. package/build/components/list-view/block-select-button.cjs +1 -10
  38. package/build/components/list-view/block-select-button.cjs.map +3 -3
  39. package/build/components/provider/use-block-sync.cjs +3 -1
  40. package/build/components/provider/use-block-sync.cjs.map +2 -2
  41. package/build/components/url-popover/image-url-input-ui.cjs +0 -2
  42. package/build/components/url-popover/image-url-input-ui.cjs.map +2 -2
  43. package/build/components/use-block-display-information/index.cjs +10 -3
  44. package/build/components/use-block-display-information/index.cjs.map +2 -2
  45. package/build/components/use-resize-canvas/index.cjs +16 -53
  46. package/build/components/use-resize-canvas/index.cjs.map +3 -3
  47. package/build/hooks/anchor.cjs +0 -1
  48. package/build/hooks/anchor.cjs.map +2 -2
  49. package/build/hooks/background.cjs +124 -75
  50. package/build/hooks/background.cjs.map +3 -3
  51. package/build/hooks/color.cjs +0 -162
  52. package/build/hooks/color.cjs.map +3 -3
  53. package/build/hooks/contrast-checker.cjs +31 -28
  54. package/build/hooks/contrast-checker.cjs.map +3 -3
  55. package/build/hooks/custom-class-name.cjs +0 -1
  56. package/build/hooks/custom-class-name.cjs.map +2 -2
  57. package/build/hooks/elements.cjs +142 -0
  58. package/build/hooks/elements.cjs.map +7 -0
  59. package/build/hooks/grid-visualizer.cjs +21 -11
  60. package/build/hooks/grid-visualizer.cjs.map +2 -2
  61. package/build/hooks/layout-child.cjs +38 -8
  62. package/build/hooks/layout-child.cjs.map +2 -2
  63. package/build/hooks/layout.cjs +6 -3
  64. package/build/hooks/layout.cjs.map +2 -2
  65. package/build/hooks/states.cjs +15 -23
  66. package/build/hooks/states.cjs.map +2 -2
  67. package/build/hooks/style.cjs +8 -4
  68. package/build/hooks/style.cjs.map +2 -2
  69. package/build/hooks/typography.cjs +62 -10
  70. package/build/hooks/typography.cjs.map +3 -3
  71. package/build/layouts/flex.cjs +99 -6
  72. package/build/layouts/flex.cjs.map +2 -2
  73. package/build/private-apis.cjs +0 -1
  74. package/build/private-apis.cjs.map +2 -2
  75. package/build/store/private-actions.cjs +16 -0
  76. package/build/store/private-actions.cjs.map +2 -2
  77. package/build/store/private-keys.cjs +0 -3
  78. package/build/store/private-keys.cjs.map +2 -2
  79. package/build/store/private-selectors.cjs +24 -6
  80. package/build/store/private-selectors.cjs.map +2 -2
  81. package/build/store/reducer.cjs +19 -3
  82. package/build/store/reducer.cjs.map +2 -2
  83. package/build/utils/block-bindings.cjs +9 -9
  84. package/build/utils/block-bindings.cjs.map +3 -3
  85. package/build/utils/color-values.cjs +10 -1
  86. package/build/utils/color-values.cjs.map +3 -3
  87. package/build/utils/dom.cjs +2 -5
  88. package/build/utils/dom.cjs.map +3 -3
  89. package/build/utils/fit-text-frontend.cjs +6 -2
  90. package/build/utils/fit-text-frontend.cjs.map +3 -3
  91. package/build/utils/fit-text-utils.cjs +1 -1
  92. package/build/utils/fit-text-utils.cjs.map +3 -3
  93. package/build/utils/format-font-style.cjs +1 -1
  94. package/build/utils/format-font-style.cjs.map +3 -3
  95. package/build/utils/format-font-weight.cjs +1 -1
  96. package/build/utils/format-font-weight.cjs.map +3 -3
  97. package/build/utils/get-editor-region.cjs +4 -2
  98. package/build/utils/get-editor-region.cjs.map +3 -3
  99. package/build/utils/get-font-styles-and-weights.cjs +8 -12
  100. package/build/utils/get-font-styles-and-weights.cjs.map +3 -3
  101. package/build/utils/get-px-from-css-unit.cjs +1 -1
  102. package/build/utils/get-px-from-css-unit.cjs.map +1 -1
  103. package/build/utils/index.cjs +1 -1
  104. package/build/utils/index.cjs.map +1 -1
  105. package/build/utils/math.cjs +1 -1
  106. package/build/utils/math.cjs.map +3 -3
  107. package/build/utils/object.cjs +8 -8
  108. package/build/utils/object.cjs.map +3 -3
  109. package/build/utils/order-inserter-block-items.cjs +1 -1
  110. package/build/utils/order-inserter-block-items.cjs.map +3 -3
  111. package/build/utils/pasting.cjs +4 -2
  112. package/build/utils/pasting.cjs.map +3 -3
  113. package/build/utils/selection.cjs +2 -1
  114. package/build/utils/selection.cjs.map +3 -3
  115. package/build/utils/sorting.cjs +9 -3
  116. package/build/utils/sorting.cjs.map +3 -3
  117. package/build/utils/transform-styles/index.cjs +3 -2
  118. package/build/utils/transform-styles/index.cjs.map +3 -3
  119. package/build/utils/transform-styles/postcss-urlrebase.d.cjs +2 -0
  120. package/build/utils/transform-styles/postcss-urlrebase.d.cjs.map +7 -0
  121. package/build/utils/transform-styles/types.cjs +19 -0
  122. package/build/utils/transform-styles/types.cjs.map +7 -0
  123. package/build/utils/types.cjs +19 -0
  124. package/build/utils/types.cjs.map +7 -0
  125. package/build-module/components/block-editing-mode/index.mjs +14 -8
  126. package/build-module/components/block-editing-mode/index.mjs.map +2 -2
  127. package/build-module/components/block-inspector/index.mjs +50 -51
  128. package/build-module/components/block-inspector/index.mjs.map +2 -2
  129. package/build-module/components/block-rename/modal.mjs +0 -1
  130. package/build-module/components/block-rename/modal.mjs.map +2 -2
  131. package/build-module/components/block-toolbar/block-toolbar-icon.mjs +14 -6
  132. package/build-module/components/block-toolbar/block-toolbar-icon.mjs.map +2 -2
  133. package/build-module/components/colors-gradients/control.mjs +27 -15
  134. package/build-module/components/colors-gradients/control.mjs.map +2 -2
  135. package/build-module/components/colors-gradients/dropdown.mjs +4 -1
  136. package/build-module/components/colors-gradients/dropdown.mjs.map +2 -2
  137. package/build-module/components/contrast-checker/index.mjs +18 -4
  138. package/build-module/components/contrast-checker/index.mjs.map +2 -2
  139. package/build-module/components/date-format-picker/index.mjs +0 -1
  140. package/build-module/components/date-format-picker/index.mjs.map +2 -2
  141. package/build-module/components/global-styles/background-panel.mjs +155 -27
  142. package/build-module/components/global-styles/background-panel.mjs.map +2 -2
  143. package/build-module/components/global-styles/color-gradient-dropdown-item.mjs +207 -0
  144. package/build-module/components/global-styles/color-gradient-dropdown-item.mjs.map +7 -0
  145. package/build-module/components/global-styles/color-panel.mjs +106 -387
  146. package/build-module/components/global-styles/color-panel.mjs.map +3 -3
  147. package/build-module/components/global-styles/dimensions-panel.mjs +0 -3
  148. package/build-module/components/global-styles/dimensions-panel.mjs.map +2 -2
  149. package/build-module/components/global-styles/hooks.mjs +33 -0
  150. package/build-module/components/global-styles/hooks.mjs.map +2 -2
  151. package/build-module/components/global-styles/typography-panel.mjs +84 -10
  152. package/build-module/components/global-styles/typography-panel.mjs.map +2 -2
  153. package/build-module/components/inspector-controls/groups.mjs +2 -0
  154. package/build-module/components/inspector-controls/groups.mjs.map +2 -2
  155. package/build-module/components/inspector-controls-tabs/styles-tab.mjs +75 -31
  156. package/build-module/components/inspector-controls-tabs/styles-tab.mjs.map +2 -2
  157. package/build-module/components/link-control/index.mjs +1 -2
  158. package/build-module/components/link-control/index.mjs.map +2 -2
  159. package/build-module/components/list-view/block-select-button.mjs +2 -17
  160. package/build-module/components/list-view/block-select-button.mjs.map +2 -2
  161. package/build-module/components/provider/use-block-sync.mjs +3 -1
  162. package/build-module/components/provider/use-block-sync.mjs.map +2 -2
  163. package/build-module/components/url-popover/image-url-input-ui.mjs +0 -2
  164. package/build-module/components/url-popover/image-url-input-ui.mjs.map +2 -2
  165. package/build-module/components/use-block-display-information/index.mjs +10 -3
  166. package/build-module/components/use-block-display-information/index.mjs.map +2 -2
  167. package/build-module/components/use-resize-canvas/index.mjs +6 -53
  168. package/build-module/components/use-resize-canvas/index.mjs.map +2 -2
  169. package/build-module/hooks/anchor.mjs +0 -1
  170. package/build-module/hooks/anchor.mjs.map +2 -2
  171. package/build-module/hooks/background.mjs +123 -75
  172. package/build-module/hooks/background.mjs.map +2 -2
  173. package/build-module/hooks/color.mjs +2 -175
  174. package/build-module/hooks/color.mjs.map +2 -2
  175. package/build-module/hooks/contrast-checker.mjs +32 -19
  176. package/build-module/hooks/contrast-checker.mjs.map +2 -2
  177. package/build-module/hooks/custom-class-name.mjs +0 -1
  178. package/build-module/hooks/custom-class-name.mjs.map +2 -2
  179. package/build-module/hooks/elements.mjs +115 -0
  180. package/build-module/hooks/elements.mjs.map +7 -0
  181. package/build-module/hooks/grid-visualizer.mjs +21 -11
  182. package/build-module/hooks/grid-visualizer.mjs.map +2 -2
  183. package/build-module/hooks/layout-child.mjs +41 -8
  184. package/build-module/hooks/layout-child.mjs.map +2 -2
  185. package/build-module/hooks/layout.mjs +6 -3
  186. package/build-module/hooks/layout.mjs.map +2 -2
  187. package/build-module/hooks/states.mjs +15 -23
  188. package/build-module/hooks/states.mjs.map +2 -2
  189. package/build-module/hooks/style.mjs +9 -5
  190. package/build-module/hooks/style.mjs.map +2 -2
  191. package/build-module/hooks/typography.mjs +62 -10
  192. package/build-module/hooks/typography.mjs.map +2 -2
  193. package/build-module/layouts/flex.mjs +105 -7
  194. package/build-module/layouts/flex.mjs.map +2 -2
  195. package/build-module/private-apis.mjs +0 -2
  196. package/build-module/private-apis.mjs.map +2 -2
  197. package/build-module/store/private-actions.mjs +14 -0
  198. package/build-module/store/private-actions.mjs.map +2 -2
  199. package/build-module/store/private-keys.mjs +0 -2
  200. package/build-module/store/private-keys.mjs.map +2 -2
  201. package/build-module/store/private-selectors.mjs +22 -6
  202. package/build-module/store/private-selectors.mjs.map +2 -2
  203. package/build-module/store/reducer.mjs +17 -3
  204. package/build-module/store/reducer.mjs.map +2 -2
  205. package/build-module/utils/block-bindings.mjs +9 -9
  206. package/build-module/utils/block-bindings.mjs.map +3 -3
  207. package/build-module/utils/color-values.mjs +9 -1
  208. package/build-module/utils/color-values.mjs.map +3 -3
  209. package/build-module/utils/dom.mjs +2 -5
  210. package/build-module/utils/dom.mjs.map +3 -3
  211. package/build-module/utils/fit-text-frontend.mjs +6 -2
  212. package/build-module/utils/fit-text-frontend.mjs.map +3 -3
  213. package/build-module/utils/fit-text-utils.mjs +1 -1
  214. package/build-module/utils/fit-text-utils.mjs.map +3 -3
  215. package/build-module/utils/format-font-style.mjs +1 -1
  216. package/build-module/utils/format-font-style.mjs.map +3 -3
  217. package/build-module/utils/format-font-weight.mjs +1 -1
  218. package/build-module/utils/format-font-weight.mjs.map +3 -3
  219. package/build-module/utils/get-editor-region.mjs +4 -2
  220. package/build-module/utils/get-editor-region.mjs.map +3 -3
  221. package/build-module/utils/get-font-styles-and-weights.mjs +8 -12
  222. package/build-module/utils/get-font-styles-and-weights.mjs.map +3 -3
  223. package/build-module/utils/get-px-from-css-unit.mjs +1 -1
  224. package/build-module/utils/get-px-from-css-unit.mjs.map +1 -1
  225. package/build-module/utils/index.mjs +1 -1
  226. package/build-module/utils/index.mjs.map +1 -1
  227. package/build-module/utils/math.mjs +1 -1
  228. package/build-module/utils/math.mjs.map +3 -3
  229. package/build-module/utils/object.mjs +8 -8
  230. package/build-module/utils/object.mjs.map +3 -3
  231. package/build-module/utils/order-inserter-block-items.mjs +1 -1
  232. package/build-module/utils/order-inserter-block-items.mjs.map +3 -3
  233. package/build-module/utils/pasting.mjs +4 -2
  234. package/build-module/utils/pasting.mjs.map +3 -3
  235. package/build-module/utils/selection.mjs +2 -1
  236. package/build-module/utils/selection.mjs.map +3 -3
  237. package/build-module/utils/sorting.mjs +9 -3
  238. package/build-module/utils/sorting.mjs.map +3 -3
  239. package/build-module/utils/transform-styles/index.mjs +3 -2
  240. package/build-module/utils/transform-styles/index.mjs.map +3 -3
  241. package/build-module/utils/transform-styles/postcss-urlrebase.d.mjs +1 -0
  242. package/build-module/utils/transform-styles/postcss-urlrebase.d.mjs.map +7 -0
  243. package/build-module/utils/transform-styles/types.mjs +1 -0
  244. package/build-module/utils/transform-styles/types.mjs.map +7 -0
  245. package/build-module/utils/types.mjs +1 -0
  246. package/build-module/utils/types.mjs.map +7 -0
  247. package/build-style/content-rtl.css +2 -0
  248. package/build-style/content.css +2 -0
  249. package/build-style/style-rtl.css +34 -41
  250. package/build-style/style.css +34 -41
  251. package/build-types/utils/block-bindings.d.ts +27 -0
  252. package/build-types/utils/block-bindings.d.ts.map +1 -0
  253. package/build-types/utils/color-values.d.ts +40 -0
  254. package/build-types/utils/color-values.d.ts.map +1 -0
  255. package/build-types/utils/dom.d.ts +19 -19
  256. package/build-types/utils/dom.d.ts.map +1 -1
  257. package/build-types/utils/fit-text-frontend.d.ts +7 -0
  258. package/build-types/utils/fit-text-frontend.d.ts.map +1 -0
  259. package/build-types/utils/fit-text-utils.d.ts +15 -0
  260. package/build-types/utils/fit-text-utils.d.ts.map +1 -0
  261. package/build-types/utils/format-font-style.d.ts +12 -0
  262. package/build-types/utils/format-font-style.d.ts.map +1 -0
  263. package/build-types/utils/format-font-weight.d.ts +12 -0
  264. package/build-types/utils/format-font-weight.d.ts.map +1 -0
  265. package/build-types/utils/get-editor-region.d.ts +9 -0
  266. package/build-types/utils/get-editor-region.d.ts.map +1 -0
  267. package/build-types/utils/get-font-styles-and-weights.d.ts +16 -0
  268. package/build-types/utils/get-font-styles-and-weights.d.ts.map +1 -0
  269. package/build-types/utils/get-px-from-css-unit.d.ts +10 -0
  270. package/build-types/utils/get-px-from-css-unit.d.ts.map +1 -0
  271. package/build-types/utils/index.d.ts +3 -0
  272. package/build-types/utils/index.d.ts.map +1 -0
  273. package/build-types/utils/math.d.ts +61 -0
  274. package/build-types/utils/math.d.ts.map +1 -0
  275. package/build-types/utils/object.d.ts +39 -0
  276. package/build-types/utils/object.d.ts.map +1 -0
  277. package/build-types/utils/order-inserter-block-items.d.ts +13 -0
  278. package/build-types/utils/order-inserter-block-items.d.ts.map +1 -0
  279. package/build-types/utils/pasting.d.ts +28 -0
  280. package/build-types/utils/pasting.d.ts.map +1 -0
  281. package/build-types/utils/selection.d.ts +21 -0
  282. package/build-types/utils/selection.d.ts.map +1 -0
  283. package/build-types/utils/sorting.d.ts +17 -0
  284. package/build-types/utils/sorting.d.ts.map +1 -0
  285. package/build-types/utils/transform-styles/index.d.ts +15 -0
  286. package/build-types/utils/transform-styles/index.d.ts.map +1 -0
  287. package/build-types/utils/transform-styles/types.d.ts +13 -0
  288. package/build-types/utils/transform-styles/types.d.ts.map +1 -0
  289. package/build-types/utils/types.d.ts +28 -0
  290. package/build-types/utils/types.d.ts.map +1 -0
  291. package/package.json +40 -39
  292. package/src/components/alignment-control/test/__snapshots__/index.js.snap +6 -0
  293. package/src/components/block-alignment-control/test/__snapshots__/index.js.snap +5 -0
  294. package/src/components/block-editing-mode/index.js +17 -9
  295. package/src/components/block-icon/test/__snapshots__/index.js.snap +1 -0
  296. package/src/components/block-inspector/index.js +43 -53
  297. package/src/components/block-rename/modal.js +0 -1
  298. package/src/components/block-toolbar/block-toolbar-icon.js +22 -6
  299. package/src/components/block-toolbar/test/block-toolbar-icon.js +99 -0
  300. package/src/components/block-vertical-alignment-control/test/__snapshots__/index.js.snap +4 -0
  301. package/src/components/colors-gradients/control.js +29 -12
  302. package/src/components/colors-gradients/dropdown.js +4 -1
  303. package/src/components/colors-gradients/style.scss +39 -2
  304. package/src/components/contrast-checker/README.md +9 -0
  305. package/src/components/contrast-checker/index.js +42 -3
  306. package/src/components/date-format-picker/index.js +0 -1
  307. package/src/components/default-block-appender/content.scss +3 -0
  308. package/src/components/global-styles/background-panel.js +201 -34
  309. package/src/components/global-styles/color-gradient-dropdown-item.js +258 -0
  310. package/src/components/global-styles/color-panel.js +125 -487
  311. package/src/components/global-styles/dimensions-panel.js +0 -3
  312. package/src/components/global-styles/hooks.js +45 -0
  313. package/src/components/global-styles/test/background-panel.js +56 -0
  314. package/src/components/global-styles/test/color-panel.js +172 -118
  315. package/src/components/global-styles/test/typography-panel.js +167 -0
  316. package/src/components/global-styles/typography-panel.js +100 -11
  317. package/src/components/inspector-controls/README.md +0 -2
  318. package/src/components/inspector-controls/groups.js +2 -0
  319. package/src/components/inspector-controls-tabs/styles-tab.js +74 -28
  320. package/src/components/link-control/index.js +0 -1
  321. package/src/components/link-control/test/index.js +2 -3
  322. package/src/components/list-view/block-select-button.js +2 -17
  323. package/src/components/provider/use-block-sync.js +3 -1
  324. package/src/components/rich-text/content.scss +2 -0
  325. package/src/components/url-popover/image-url-input-ui.js +0 -2
  326. package/src/components/use-block-display-information/index.js +15 -2
  327. package/src/components/use-block-display-information/test/index.js +140 -0
  328. package/src/components/use-resize-canvas/index.js +10 -71
  329. package/src/hooks/anchor.js +0 -1
  330. package/src/hooks/background.js +210 -133
  331. package/src/hooks/background.scss +0 -35
  332. package/src/hooks/color.js +2 -205
  333. package/src/hooks/color.scss +3 -9
  334. package/src/hooks/contrast-checker.js +60 -17
  335. package/src/hooks/custom-class-name.js +0 -1
  336. package/src/hooks/elements.js +140 -0
  337. package/src/hooks/elements.scss +8 -0
  338. package/src/hooks/grid-visualizer.js +59 -45
  339. package/src/hooks/layout-child.js +51 -12
  340. package/src/hooks/layout.js +6 -3
  341. package/src/hooks/states.js +32 -28
  342. package/src/hooks/style.js +11 -7
  343. package/src/hooks/test/background.js +59 -0
  344. package/src/hooks/test/block-style-state.js +14 -14
  345. package/src/hooks/test/layout.js +6 -6
  346. package/src/hooks/test/style.js +8 -8
  347. package/src/hooks/typography.js +70 -6
  348. package/src/layouts/flex.js +118 -15
  349. package/src/private-apis.js +0 -2
  350. package/src/store/private-actions.js +31 -0
  351. package/src/store/private-keys.js +0 -1
  352. package/src/store/private-selectors.js +43 -7
  353. package/src/store/reducer.js +37 -2
  354. package/src/store/test/private-selectors.js +39 -14
  355. package/src/store/test/reducer.js +91 -12
  356. package/src/style.scss +1 -0
  357. package/src/utils/block-bindings.ts +51 -0
  358. package/src/utils/color-values.ts +63 -0
  359. package/src/utils/{dom.js → dom.ts} +27 -27
  360. package/src/utils/{fit-text-frontend.js → fit-text-frontend.ts} +12 -4
  361. package/src/utils/{fit-text-utils.js → fit-text-utils.ts} +15 -7
  362. package/src/utils/{format-font-style.js → format-font-style.ts} +10 -3
  363. package/src/utils/{format-font-weight.js → format-font-weight.ts} +10 -3
  364. package/src/utils/{get-editor-region.js → get-editor-region.ts} +10 -6
  365. package/src/utils/{get-font-styles-and-weights.js → get-font-styles-and-weights.ts} +21 -17
  366. package/src/utils/{math.js → math.ts} +37 -30
  367. package/src/utils/object.ts +89 -0
  368. package/src/utils/{order-inserter-block-items.js → order-inserter-block-items.ts} +8 -5
  369. package/src/utils/{pasting.js → pasting.ts} +18 -11
  370. package/src/utils/{selection.js → selection.ts} +11 -4
  371. package/src/utils/sorting.ts +81 -0
  372. package/src/utils/test/color-values.js +44 -1
  373. package/src/utils/transform-styles/{index.js → index.ts} +25 -25
  374. package/src/utils/transform-styles/postcss-urlrebase.d.ts +15 -0
  375. package/src/utils/transform-styles/types.ts +13 -0
  376. package/src/utils/types.ts +29 -0
  377. package/src/components/use-resize-canvas/README.md +0 -37
  378. package/src/utils/block-bindings.js +0 -46
  379. package/src/utils/color-values.js +0 -28
  380. package/src/utils/object.js +0 -67
  381. package/src/utils/sorting.js +0 -54
  382. /package/src/utils/{get-px-from-css-unit.js → get-px-from-css-unit.ts} +0 -0
  383. /package/src/utils/{index.js → index.ts} +0 -0
@@ -18,6 +18,7 @@ exports[`AlignmentUI should allow custom alignment controls to be specified 1`]
18
18
  >
19
19
  <svg
20
20
  aria-hidden="true"
21
+ fill="currentColor"
21
22
  focusable="false"
22
23
  height="24"
23
24
  viewBox="0 0 24 24"
@@ -41,6 +42,7 @@ exports[`AlignmentUI should allow custom alignment controls to be specified 1`]
41
42
  >
42
43
  <svg
43
44
  aria-hidden="true"
45
+ fill="currentColor"
44
46
  focusable="false"
45
47
  height="24"
46
48
  viewBox="0 0 24 24"
@@ -73,6 +75,7 @@ exports[`AlignmentUI should match snapshot when controls are hidden 1`] = `
73
75
  >
74
76
  <svg
75
77
  aria-hidden="true"
78
+ fill="currentColor"
76
79
  focusable="false"
77
80
  height="24"
78
81
  viewBox="0 0 24 24"
@@ -106,6 +109,7 @@ exports[`AlignmentUI should match snapshot when controls are visible 1`] = `
106
109
  >
107
110
  <svg
108
111
  aria-hidden="true"
112
+ fill="currentColor"
109
113
  focusable="false"
110
114
  height="24"
111
115
  viewBox="0 0 24 24"
@@ -129,6 +133,7 @@ exports[`AlignmentUI should match snapshot when controls are visible 1`] = `
129
133
  >
130
134
  <svg
131
135
  aria-hidden="true"
136
+ fill="currentColor"
132
137
  focusable="false"
133
138
  height="24"
134
139
  viewBox="0 0 24 24"
@@ -152,6 +157,7 @@ exports[`AlignmentUI should match snapshot when controls are visible 1`] = `
152
157
  >
153
158
  <svg
154
159
  aria-hidden="true"
160
+ fill="currentColor"
155
161
  focusable="false"
156
162
  height="24"
157
163
  viewBox="0 0 24 24"
@@ -16,6 +16,7 @@ exports[`BlockAlignmentUI should match snapshot when controls are hidden 1`] = `
16
16
  >
17
17
  <svg
18
18
  aria-hidden="true"
19
+ fill="currentColor"
19
20
  focusable="false"
20
21
  height="24"
21
22
  viewBox="0 0 24 24"
@@ -48,6 +49,7 @@ exports[`BlockAlignmentUI should match snapshot when controls are visible 1`] =
48
49
  >
49
50
  <svg
50
51
  aria-hidden="true"
52
+ fill="currentColor"
51
53
  focusable="false"
52
54
  height="24"
53
55
  viewBox="0 0 24 24"
@@ -70,6 +72,7 @@ exports[`BlockAlignmentUI should match snapshot when controls are visible 1`] =
70
72
  >
71
73
  <svg
72
74
  aria-hidden="true"
75
+ fill="currentColor"
73
76
  focusable="false"
74
77
  height="24"
75
78
  viewBox="0 0 24 24"
@@ -92,6 +95,7 @@ exports[`BlockAlignmentUI should match snapshot when controls are visible 1`] =
92
95
  >
93
96
  <svg
94
97
  aria-hidden="true"
98
+ fill="currentColor"
95
99
  focusable="false"
96
100
  height="24"
97
101
  viewBox="0 0 24 24"
@@ -114,6 +118,7 @@ exports[`BlockAlignmentUI should match snapshot when controls are visible 1`] =
114
118
  >
115
119
  <svg
116
120
  aria-hidden="true"
121
+ fill="currentColor"
117
122
  focusable="false"
118
123
  height="24"
119
124
  viewBox="0 0 24 24"
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { useSelect, useDispatch } from '@wordpress/data';
4
+ import { useSelect, useRegistry } from '@wordpress/data';
5
5
  import { useEffect } from '@wordpress/element';
6
6
 
7
7
  /**
@@ -50,8 +50,7 @@ import {
50
50
  export function useBlockEditingMode( mode ) {
51
51
  const context = useBlockEditContext();
52
52
  const { clientId = '' } = context;
53
- const { setBlockEditingMode, unsetBlockEditingMode } =
54
- useDispatch( blockEditorStore );
53
+ const registry = useRegistry();
55
54
  const globalBlockEditingMode = useSelect(
56
55
  ( select ) =>
57
56
  // Avoid adding the subscription if not needed!
@@ -59,14 +58,23 @@ export function useBlockEditingMode( mode ) {
59
58
  [ clientId ]
60
59
  );
61
60
  useEffect( () => {
62
- if ( mode ) {
63
- setBlockEditingMode( clientId, mode );
61
+ if ( ! mode ) {
62
+ return;
64
63
  }
64
+
65
+ const {
66
+ setBlockEditingMode,
67
+ unsetBlockEditingMode,
68
+ __unstableMarkNextChangeAsNotPersistent,
69
+ } = registry.dispatch( blockEditorStore );
70
+
71
+ __unstableMarkNextChangeAsNotPersistent();
72
+ setBlockEditingMode( clientId, mode );
73
+
65
74
  return () => {
66
- if ( mode ) {
67
- unsetBlockEditingMode( clientId );
68
- }
75
+ __unstableMarkNextChangeAsNotPersistent();
76
+ unsetBlockEditingMode( clientId );
69
77
  };
70
- }, [ clientId, mode, setBlockEditingMode, unsetBlockEditingMode ] );
78
+ }, [ registry, clientId, mode ] );
71
79
  return clientId ? context[ blockEditingModeKey ] : globalBlockEditingMode;
72
80
  }
@@ -7,6 +7,7 @@ exports[`BlockIcon renders a Icon 1`] = `
7
7
  >
8
8
  <svg
9
9
  aria-hidden="true"
10
+ fill="currentColor"
10
11
  focusable="false"
11
12
  height="24"
12
13
  viewBox="0 0 24 24"
@@ -45,7 +45,6 @@ import {
45
45
  hasViewportBlockStyleState,
46
46
  isDefaultBlockStyleState,
47
47
  } from '../../hooks/block-style-state';
48
- import { onViewportStateChangeKey } from '../../store/private-keys';
49
48
 
50
49
  function StyleInspectorSlots( {
51
50
  blockName,
@@ -57,6 +56,10 @@ function StyleInspectorSlots( {
57
56
  return (
58
57
  <>
59
58
  <InspectorControls.Slot />
59
+ <InspectorControls.Slot
60
+ group="typography"
61
+ label={ __( 'Typography' ) }
62
+ />
60
63
  <InspectorControls.Slot
61
64
  group="color"
62
65
  label={ __( 'Color' ) }
@@ -64,19 +67,20 @@ function StyleInspectorSlots( {
64
67
  />
65
68
  <InspectorControls.Slot
66
69
  group="background"
67
- label={ __( 'Background image' ) }
70
+ label={ __( 'Background' ) }
68
71
  className="background-block-support-panel__inner-wrapper"
69
72
  />
70
- <InspectorControls.Slot
71
- group="typography"
72
- label={ __( 'Typography' ) }
73
- />
74
73
  <InspectorControls.Slot group="layout" label={ __( 'Layout' ) } />
75
74
  <InspectorControls.Slot
76
75
  group="dimensions"
77
76
  label={ __( 'Dimensions' ) }
78
77
  />
79
78
  <InspectorControls.Slot group="border" label={ borderPanelLabel } />
79
+ <InspectorControls.Slot
80
+ group="elements"
81
+ label={ __( 'Elements' ) }
82
+ className="elements-block-support-panel__inner-wrapper"
83
+ />
80
84
  { showPositionControls && <PositionControls /> }
81
85
  <InspectorControls.Slot group="styles" />
82
86
  { showBindingsControls && (
@@ -98,6 +102,10 @@ function StyleStateInspectorSlots( { blockName, selectedBlockStyleState } ) {
98
102
  ! hasPseudoBlockStyleState( selectedBlockStyleState );
99
103
  return (
100
104
  <>
105
+ <InspectorControls.Slot
106
+ group="typography"
107
+ label={ __( 'Typography' ) }
108
+ />
101
109
  <InspectorControls.Slot
102
110
  group="color"
103
111
  label={ __( 'Color' ) }
@@ -105,13 +113,9 @@ function StyleStateInspectorSlots( { blockName, selectedBlockStyleState } ) {
105
113
  />
106
114
  <InspectorControls.Slot
107
115
  group="background"
108
- label={ __( 'Background image' ) }
116
+ label={ __( 'Background' ) }
109
117
  className="background-block-support-panel__inner-wrapper"
110
118
  />
111
- <InspectorControls.Slot
112
- group="typography"
113
- label={ __( 'Typography' ) }
114
- />
115
119
  { showLayoutControls && (
116
120
  <InspectorControls.Slot
117
121
  group="layout"
@@ -123,6 +127,11 @@ function StyleStateInspectorSlots( { blockName, selectedBlockStyleState } ) {
123
127
  label={ __( 'Dimensions' ) }
124
128
  />
125
129
  <InspectorControls.Slot group="border" label={ borderPanelLabel } />
130
+ <InspectorControls.Slot
131
+ group="elements"
132
+ label={ __( 'Elements' ) }
133
+ className="elements-block-support-panel__inner-wrapper"
134
+ />
126
135
  </>
127
136
  );
128
137
  }
@@ -140,7 +149,7 @@ function BlockInspector() {
140
149
  blockEditingMode,
141
150
  selectedBlockStyleState,
142
151
  showStateOnCanvas,
143
- onViewportStateChange,
152
+ isResponsiveEditing,
144
153
  } = useSelect( ( select ) => {
145
154
  const {
146
155
  getSelectedBlockClientId,
@@ -154,8 +163,8 @@ function BlockInspector() {
154
163
  getBlockEditingMode,
155
164
  getSelectedBlockStyleState,
156
165
  isSelectedBlockStyleStateShownOnCanvas,
166
+ isResponsiveEditing: _isResponsiveEditing,
157
167
  } = unlock( select( blockEditorStore ) );
158
- const blockEditorSettings = select( blockEditorStore ).getSettings();
159
168
  const { getBlockStyles } = select( blocksStore );
160
169
  const _selectedBlockClientId = getSelectedBlockClientId();
161
170
  const isWithinEditedSection = isWithinEditedContentOnlySection(
@@ -193,8 +202,7 @@ function BlockInspector() {
193
202
  showStateOnCanvas: isSelectedBlockStyleStateShownOnCanvas(
194
203
  _renderedBlockClientId
195
204
  ),
196
- onViewportStateChange:
197
- blockEditorSettings?.[ onViewportStateChangeKey ],
205
+ isResponsiveEditing: _isResponsiveEditing(),
198
206
  };
199
207
  }, [] );
200
208
 
@@ -329,7 +337,7 @@ function BlockInspector() {
329
337
  blockEditingMode={ blockEditingMode }
330
338
  selectedBlockStyleState={ selectedBlockStyleState }
331
339
  showStateOnCanvas={ showStateOnCanvas }
332
- onViewportStateChange={ onViewportStateChange }
340
+ isResponsiveEditing={ isResponsiveEditing }
333
341
  isBlockStyleStateSelected={ isBlockStyleStateSelected }
334
342
  />
335
343
  </BlockInspectorSingleBlockWrapper>
@@ -385,11 +393,14 @@ const BlockInspectorSingleBlock = ( {
385
393
  blockEditingMode,
386
394
  selectedBlockStyleState,
387
395
  showStateOnCanvas,
388
- onViewportStateChange,
396
+ isResponsiveEditing,
389
397
  isBlockStyleStateSelected,
390
398
  } ) => {
391
399
  const listViewRef = useRef( null );
392
400
  const hasMultipleTabs = availableTabs?.length > 1;
401
+ const hasPseudoState = hasPseudoBlockStyleState( selectedBlockStyleState );
402
+ const isEditingStyleState =
403
+ isBlockStyleStateSelected || isResponsiveEditing;
393
404
  const hasParentChildBlockCards =
394
405
  editedContentOnlySection &&
395
406
  editedContentOnlySection !== renderedBlockClientId;
@@ -405,32 +416,10 @@ const BlockInspectorSingleBlock = ( {
405
416
  setSelectedBlockStyleStateCanvasPreview,
406
417
  } = unlock( useDispatch( blockEditorStore ) );
407
418
  const onBlockStyleStateChange = ( value ) => {
408
- const nextSelectedBlockStyleState = {
409
- ...selectedBlockStyleState,
410
- ...value,
411
- };
412
-
413
- setSelectedBlockStyleState(
414
- renderedBlockClientId,
415
- nextSelectedBlockStyleState
416
- );
417
-
418
- if ( value.viewport ) {
419
- onViewportStateChange?.( {
420
- viewport: nextSelectedBlockStyleState.viewport,
421
- showStateOnCanvas,
422
- } );
423
- }
419
+ setSelectedBlockStyleState( renderedBlockClientId, value );
424
420
  };
425
421
  const onShowStateOnCanvasChange = ( value ) => {
426
422
  setSelectedBlockStyleStateCanvasPreview( renderedBlockClientId, value );
427
-
428
- if ( value ) {
429
- onViewportStateChange?.( {
430
- viewport: selectedBlockStyleState.viewport,
431
- showStateOnCanvas: value,
432
- } );
433
- }
434
423
  };
435
424
 
436
425
  return (
@@ -460,34 +449,37 @@ const BlockInspectorSingleBlock = ( {
460
449
  )
461
450
  }
462
451
  />
463
- { blockEditingMode === 'default' && isBlockStyleStateSelected && (
452
+ { blockEditingMode === 'default' && isEditingStyleState && (
464
453
  <Spacer paddingX={ 4 } paddingY={ 2 }>
465
- <ToggleControl
466
- label={ __( 'Show state on canvas' ) }
467
- checked={ showStateOnCanvas }
468
- onChange={ onShowStateOnCanvasChange }
469
- />
454
+ { hasPseudoState && (
455
+ <ToggleControl
456
+ label={ __( 'Show state on canvas' ) }
457
+ checked={ showStateOnCanvas }
458
+ onChange={ onShowStateOnCanvasChange }
459
+ />
460
+ ) }
470
461
  <BlockStateBadges
471
462
  name={ blockName }
472
463
  value={ selectedBlockStyleState }
464
+ isResponsiveEditing={ isResponsiveEditing }
473
465
  />
474
466
  </Spacer>
475
467
  ) }
476
468
  <ViewportVisibilityInfo clientId={ renderedBlockClientId } />
477
469
  <EditContents clientId={ renderedBlockClientId } />
478
- { ! isBlockStyleStateSelected && (
470
+ { ! isEditingStyleState && (
479
471
  <BlockVariationTransforms
480
472
  blockClientId={ renderedBlockClientId }
481
473
  />
482
474
  ) }
483
475
  <BlockInspectorPreTabsSlot />
484
- { isBlockStyleStateSelected && ! isSectionBlock && (
476
+ { isEditingStyleState && ! isSectionBlock && (
485
477
  <StyleStateInspectorSlots
486
478
  blockName={ blockName }
487
479
  selectedBlockStyleState={ selectedBlockStyleState }
488
480
  />
489
481
  ) }
490
- { ! isBlockStyleStateSelected && hasMultipleTabs && (
482
+ { ! isEditingStyleState && hasMultipleTabs && (
491
483
  <>
492
484
  <InspectorControlsTabs
493
485
  hasBlockStyles={ hasBlockStyles }
@@ -499,7 +491,7 @@ const BlockInspectorSingleBlock = ( {
499
491
  />
500
492
  </>
501
493
  ) }
502
- { ! isBlockStyleStateSelected && ! hasMultipleTabs && (
494
+ { ! isEditingStyleState && ! hasMultipleTabs && (
503
495
  <>
504
496
  { hasBlockStyles && (
505
497
  <BlockStyles clientId={ renderedBlockClientId } />
@@ -513,9 +505,7 @@ const BlockInspectorSingleBlock = ( {
513
505
  ) }
514
506
  </>
515
507
  ) }
516
- { ! isBlockStyleStateSelected && (
517
- <InspectorControlsLastItem.Slot />
518
- ) }
508
+ { ! isEditingStyleState && <InspectorControlsLastItem.Slot /> }
519
509
  <SkipToSelectedBlock key="back" />
520
510
  </div>
521
511
  );
@@ -107,7 +107,6 @@ export default function BlockRenameModal( { clientId, onClose } ) {
107
107
  >
108
108
  <VStack spacing="3">
109
109
  <TextControl
110
- __next40pxDefaultSize
111
110
  value={ editedBlockName ?? blockName }
112
111
  label={ __( 'Name' ) }
113
112
  help={
@@ -19,6 +19,7 @@ import useBlockDisplayTitle from '../block-title/use-block-display-title';
19
19
  import { store as blockEditorStore } from '../../store';
20
20
  import { hasPatternOverridesDefaultBinding } from '../../utils/block-bindings';
21
21
  import { unlock } from '../../lock-unlock';
22
+ import { isIsolatedEditorKey } from '../../store/private-keys';
22
23
 
23
24
  function getBlockIconVariant( { select, clientIds } ) {
24
25
  const {
@@ -29,8 +30,11 @@ function getBlockIconVariant( { select, clientIds } ) {
29
30
  getTemplateLock,
30
31
  getBlockEditingMode,
31
32
  canEditBlock,
33
+ isWithinEditedContentOnlySection,
34
+ getSettings,
32
35
  } = unlock( select( blockEditorStore ) );
33
36
  const { getBlockStyles } = select( blocksStore );
37
+ const isIsolatedEditor = !! getSettings()?.[ isIsolatedEditorKey ];
34
38
 
35
39
  const hasTemplateLock = clientIds.some(
36
40
  ( id ) => getTemplateLock( id ) === 'contentOnly'
@@ -42,7 +46,10 @@ function getBlockIconVariant( { select, clientIds } ) {
42
46
  const hasBlockStyles =
43
47
  isSingleBlock && !! getBlockStyles( blockName )?.length;
44
48
  const hasPatternNameInSelection = clientIds.some(
45
- ( id ) => !! getBlockAttributes( id )?.metadata?.patternName
49
+ ( id ) =>
50
+ !! getBlockAttributes( id )?.metadata?.patternName &&
51
+ ! isWithinEditedContentOnlySection( id ) &&
52
+ ! isIsolatedEditor
46
53
  );
47
54
  const hasPatternOverrides = clientIds.every( ( clientId ) =>
48
55
  hasPatternOverridesDefaultBinding(
@@ -86,20 +93,29 @@ function getBlockIconVariant( { select, clientIds } ) {
86
93
  }
87
94
 
88
95
  function getBlockIcon( { select, clientIds } ) {
89
- const { getBlockName, getBlockAttributes } = unlock(
90
- select( blockEditorStore )
91
- );
96
+ const {
97
+ getBlockName,
98
+ getBlockAttributes,
99
+ isWithinEditedContentOnlySection,
100
+ getSettings,
101
+ } = unlock( select( blockEditorStore ) );
102
+ const isIsolatedEditor = !! getSettings()?.[ isIsolatedEditorKey ];
92
103
 
93
104
  const _isSingleBlock = clientIds.length === 1;
94
105
  const firstClientId = clientIds[ 0 ];
106
+
95
107
  const blockAttributes = getBlockAttributes( firstClientId );
96
- if ( _isSingleBlock && blockAttributes?.metadata?.patternName ) {
108
+ if (
109
+ _isSingleBlock &&
110
+ blockAttributes?.metadata?.patternName &&
111
+ ! isWithinEditedContentOnlySection( firstClientId ) &&
112
+ ! isIsolatedEditor
113
+ ) {
97
114
  return symbol;
98
115
  }
99
116
 
100
117
  const blockName = getBlockName( firstClientId );
101
118
  const blockType = getBlockType( blockName );
102
-
103
119
  if ( _isSingleBlock ) {
104
120
  const { getActiveBlockVariation } = select( blocksStore );
105
121
  const match = getActiveBlockVariation( blockName, blockAttributes );
@@ -13,11 +13,33 @@ import { paragraph } from '@wordpress/icons';
13
13
  * Internal dependencies
14
14
  */
15
15
  import BlockToolbarIcon from '../block-toolbar-icon';
16
+ import { isIsolatedEditorKey } from '../../../store/private-keys';
16
17
 
18
+ jest.mock( '@wordpress/blocks', () => {
19
+ const actualImplementation = jest.requireActual( '@wordpress/blocks' );
20
+ return {
21
+ ...actualImplementation,
22
+ getBlockType: ( name ) => ( {
23
+ name,
24
+ title: name === 'core/template-part' ? 'Template Part' : 'Group',
25
+ icon: `${ name }-icon`,
26
+ } ),
27
+ };
28
+ } );
17
29
  jest.mock( '@wordpress/data/src/components/use-select', () => jest.fn() );
30
+ jest.mock( '../../../lock-unlock', () => ( {
31
+ unlock: ( value ) => ( {
32
+ registerPrivateActions: jest.fn(),
33
+ registerPrivateSelectors: jest.fn(),
34
+ ...value,
35
+ } ),
36
+ } ) );
18
37
  jest.mock( '../../block-title/use-block-display-title', () =>
19
38
  jest.fn().mockReturnValue( 'Block Name' )
20
39
  );
40
+ jest.mock( '../../block-icon', () =>
41
+ jest.fn( ( { icon } ) => <span data-testid="block-icon">{ icon }</span> )
42
+ );
21
43
  jest.mock( '../../block-switcher', () =>
22
44
  jest.fn( ( { children } ) => (
23
45
  <div data-testid="block-switcher">{ children }</div>
@@ -38,6 +60,34 @@ describe( 'BlockToolbarIcon', () => {
38
60
  clientIds: [ 'test-client-id' ],
39
61
  isSynced: false,
40
62
  };
63
+ const setupToolbarSelectors = ( {
64
+ attributes = {
65
+ metadata: {
66
+ patternName: 'theme/hero',
67
+ },
68
+ },
69
+ blockName = 'core/group',
70
+ getActiveBlockVariation = () => null,
71
+ settings = {},
72
+ isWithinEditedSection = false,
73
+ } = {} ) => {
74
+ useSelect.mockImplementation( ( mapSelect ) =>
75
+ mapSelect( () => ( {
76
+ get: () => false,
77
+ getBlockName: () => blockName,
78
+ getBlockAttributes: () => attributes,
79
+ getSettings: () => settings,
80
+ getBlockParentsByBlockName: () => [],
81
+ canRemoveBlocks: () => true,
82
+ getTemplateLock: () => undefined,
83
+ getBlockEditingMode: () => 'default',
84
+ canEditBlock: () => true,
85
+ getBlockStyles: () => [ {} ],
86
+ getActiveBlockVariation,
87
+ isWithinEditedContentOnlySection: () => isWithinEditedSection,
88
+ } ) )
89
+ );
90
+ };
41
91
 
42
92
  beforeEach( () => {
43
93
  jest.clearAllMocks();
@@ -144,6 +194,55 @@ describe( 'BlockToolbarIcon', () => {
144
194
  } );
145
195
  } );
146
196
 
197
+ describe( 'pattern sections', () => {
198
+ it( 'should not show the block switcher before the section is being edited', () => {
199
+ setupToolbarSelectors();
200
+
201
+ render( <BlockToolbarIcon { ...defaultProps } /> );
202
+
203
+ expect(
204
+ screen.queryByTestId( 'block-switcher' )
205
+ ).not.toBeInTheDocument();
206
+ expect( screen.getByRole( 'button' ) ).toHaveAttribute(
207
+ 'aria-disabled',
208
+ 'true'
209
+ );
210
+ } );
211
+
212
+ it( 'should show the block switcher when the section is being edited', () => {
213
+ setupToolbarSelectors( { isWithinEditedSection: true } );
214
+
215
+ render( <BlockToolbarIcon { ...defaultProps } /> );
216
+
217
+ expect(
218
+ screen.getByTestId( 'block-switcher' )
219
+ ).toBeInTheDocument();
220
+ } );
221
+
222
+ it( 'should show the block icon for pattern wrappers in isolated editors', () => {
223
+ setupToolbarSelectors( {
224
+ attributes: {
225
+ metadata: {
226
+ name: 'Header',
227
+ patternName: 'theme/header-wrapper',
228
+ },
229
+ },
230
+ settings: {
231
+ [ isIsolatedEditorKey ]: true,
232
+ },
233
+ } );
234
+
235
+ render( <BlockToolbarIcon { ...defaultProps } /> );
236
+
237
+ expect(
238
+ screen.getByTestId( 'block-switcher' )
239
+ ).toBeInTheDocument();
240
+ expect( screen.getByTestId( 'block-icon' ) ).toHaveTextContent(
241
+ 'core/group-icon'
242
+ );
243
+ } );
244
+ } );
245
+
147
246
  describe( 'label calculation', () => {
148
247
  it( 'should use block title for single block', () => {
149
248
  useSelect.mockImplementation( () => ( {
@@ -16,6 +16,7 @@ exports[`BlockVerticalAlignmentUI should match snapshot when controls are hidden
16
16
  >
17
17
  <svg
18
18
  aria-hidden="true"
19
+ fill="currentColor"
19
20
  focusable="false"
20
21
  height="24"
21
22
  viewBox="0 0 24 24"
@@ -48,6 +49,7 @@ exports[`BlockVerticalAlignmentUI should match snapshot when controls are visibl
48
49
  >
49
50
  <svg
50
51
  aria-hidden="true"
52
+ fill="currentColor"
51
53
  focusable="false"
52
54
  height="24"
53
55
  viewBox="0 0 24 24"
@@ -70,6 +72,7 @@ exports[`BlockVerticalAlignmentUI should match snapshot when controls are visibl
70
72
  >
71
73
  <svg
72
74
  aria-hidden="true"
75
+ fill="currentColor"
73
76
  focusable="false"
74
77
  height="24"
75
78
  viewBox="0 0 24 24"
@@ -92,6 +95,7 @@ exports[`BlockVerticalAlignmentUI should match snapshot when controls are visibl
92
95
  >
93
96
  <svg
94
97
  aria-hidden="true"
98
+ fill="currentColor"
95
99
  focusable="false"
96
100
  height="24"
97
101
  viewBox="0 0 24 24"
@@ -12,6 +12,7 @@ import {
12
12
  __experimentalVStack as VStack,
13
13
  ColorPalette,
14
14
  GradientPicker,
15
+ Notice,
15
16
  privateApis as componentsPrivateApis,
16
17
  } from '@wordpress/components';
17
18
 
@@ -48,6 +49,7 @@ function ColorGradientControlInner( {
48
49
  showTitle = true,
49
50
  enableAlpha,
50
51
  headingLevel,
52
+ noticeProps,
51
53
  } ) {
52
54
  const canChooseAColor =
53
55
  onColorChange &&
@@ -67,20 +69,35 @@ function ColorGradientControlInner( {
67
69
  }
68
70
  : ( newColor, _index, newSlug ) => onColorChange( newColor, newSlug );
69
71
 
72
+ const colorPalette = (
73
+ <ColorPalette
74
+ value={ colorValue }
75
+ selectedSlug={ colorSlug }
76
+ onChange={ colorPaletteOnChange }
77
+ { ...{ colors, disableCustomColors } }
78
+ __experimentalIsRenderedInSidebar={
79
+ __experimentalIsRenderedInSidebar
80
+ }
81
+ clearable={ clearable }
82
+ enableAlpha={ enableAlpha }
83
+ headingLevel={ headingLevel }
84
+ />
85
+ );
86
+
70
87
  const tabPanels = {
88
+ // The `ColorPalette` must stay at a stable position in the tree whether
89
+ // or not a notice is present. Wrapping it in a `VStack` only when a
90
+ // notice appears remounts it, which resets the custom color picker back
91
+ // to the swatch view mid-edit. Keep `ColorPalette` last and toggle only
92
+ // the notice ahead of it; the notice's own bottom margin provides the
93
+ // spacing the wrapper used to.
71
94
  [ TAB_IDS.color ]: (
72
- <ColorPalette
73
- value={ colorValue }
74
- selectedSlug={ colorSlug }
75
- onChange={ colorPaletteOnChange }
76
- { ...{ colors, disableCustomColors } }
77
- __experimentalIsRenderedInSidebar={
78
- __experimentalIsRenderedInSidebar
79
- }
80
- clearable={ clearable }
81
- enableAlpha={ enableAlpha }
82
- headingLevel={ headingLevel }
83
- />
95
+ <>
96
+ { noticeProps && (
97
+ <Notice isDismissible={ false } { ...noticeProps } />
98
+ ) }
99
+ { colorPalette }
100
+ </>
84
101
  ),
85
102
  [ TAB_IDS.gradient ]: (
86
103
  <GradientPicker
@@ -51,7 +51,10 @@ const WithToolsPanelItem = ( { setting, children, panelId, ...props } ) => {
51
51
  : true
52
52
  }
53
53
  { ...props }
54
- className="block-editor-tools-panel-color-gradient-settings__item"
54
+ className={ clsx(
55
+ 'block-editor-color-gradient-item',
56
+ 'block-editor-tools-panel-color-gradient-settings__item'
57
+ ) }
55
58
  panelId={ panelId }
56
59
  // Pass resetAllFilter if supplied due to rendering via SlotFill
57
60
  // into parent ToolsPanel.