@wordpress/block-editor 12.9.1-next.5a1d1283.0 → 12.10.1

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 (448) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +33 -3
  3. package/build/components/block-canvas/index.js +107 -0
  4. package/build/components/block-canvas/index.js.map +1 -0
  5. package/build/components/block-inspector/index.js +4 -1
  6. package/build/components/block-inspector/index.js.map +1 -1
  7. package/build/components/block-patterns-list/index.js +28 -8
  8. package/build/components/block-patterns-list/index.js.map +1 -1
  9. package/build/components/block-patterns-paging/index.js +68 -0
  10. package/build/components/block-patterns-paging/index.js.map +1 -0
  11. package/build/components/block-settings-menu/block-settings-dropdown.js +28 -0
  12. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  13. package/build/components/block-settings-menu-controls/index.js +4 -7
  14. package/build/components/block-settings-menu-controls/index.js.map +1 -1
  15. package/build/components/block-styles/index.js +1 -0
  16. package/build/components/block-styles/index.js.map +1 -1
  17. package/build/components/block-toolbar/block-toolbar-menu.native.js +3 -7
  18. package/build/components/block-toolbar/block-toolbar-menu.native.js.map +1 -1
  19. package/build/components/block-tools/block-contextual-toolbar.js +18 -7
  20. package/build/components/block-tools/block-contextual-toolbar.js.map +1 -1
  21. package/build/components/block-tools/block-selection-button.js +5 -1
  22. package/build/components/block-tools/block-selection-button.js.map +1 -1
  23. package/build/components/border-radius-control/input-controls.js +1 -1
  24. package/build/components/border-radius-control/input-controls.js.map +1 -1
  25. package/build/components/border-radius-control/linked-button.js +2 -4
  26. package/build/components/border-radius-control/linked-button.js.map +1 -1
  27. package/build/components/colors/with-colors.js.map +1 -1
  28. package/build/components/convert-to-group-buttons/use-convert-to-group-button-props.js +8 -21
  29. package/build/components/convert-to-group-buttons/use-convert-to-group-button-props.js.map +1 -1
  30. package/build/components/default-block-appender/index.native.js +20 -1
  31. package/build/components/default-block-appender/index.native.js.map +1 -1
  32. package/build/components/duotone/utils.js +68 -0
  33. package/build/components/duotone/utils.js.map +1 -1
  34. package/build/components/editor-styles/index.js +28 -9
  35. package/build/components/editor-styles/index.js.map +1 -1
  36. package/build/components/global-styles/hooks.js +2 -101
  37. package/build/components/global-styles/hooks.js.map +1 -1
  38. package/build/components/global-styles/image-settings-panel.js +61 -0
  39. package/build/components/global-styles/image-settings-panel.js.map +1 -0
  40. package/build/components/global-styles/index.js +11 -17
  41. package/build/components/global-styles/index.js.map +1 -1
  42. package/build/components/global-styles/use-global-styles-output.js +19 -15
  43. package/build/components/global-styles/use-global-styles-output.js.map +1 -1
  44. package/build/components/global-styles/utils.js +1 -1
  45. package/build/components/global-styles/utils.js.map +1 -1
  46. package/build/components/iframe/index.js +67 -33
  47. package/build/components/iframe/index.js.map +1 -1
  48. package/build/components/image-editor/use-save-image.js +2 -5
  49. package/build/components/image-editor/use-save-image.js.map +1 -1
  50. package/build/components/image-editor/use-transform-image.js +9 -9
  51. package/build/components/image-editor/use-transform-image.js.map +1 -1
  52. package/build/components/index.js +8 -12
  53. package/build/components/index.js.map +1 -1
  54. package/build/components/index.native.js +6 -5
  55. package/build/components/index.native.js.map +1 -1
  56. package/build/components/inner-blocks/use-nested-settings-update.js +13 -7
  57. package/build/components/inner-blocks/use-nested-settings-update.js.map +1 -1
  58. package/build/components/inserter/block-patterns-explorer/explorer.js +12 -6
  59. package/build/components/inserter/block-patterns-explorer/explorer.js.map +1 -1
  60. package/build/components/inserter/block-patterns-explorer/patterns-list.js +45 -22
  61. package/build/components/inserter/block-patterns-explorer/patterns-list.js.map +1 -1
  62. package/build/components/inserter/block-patterns-explorer/sidebar.js +9 -9
  63. package/build/components/inserter/block-patterns-explorer/sidebar.js.map +1 -1
  64. package/build/components/inserter/block-patterns-filter.js +137 -0
  65. package/build/components/inserter/block-patterns-filter.js.map +1 -0
  66. package/build/components/inserter/block-patterns-tab.js +128 -42
  67. package/build/components/inserter/block-patterns-tab.js.map +1 -1
  68. package/build/components/inserter/hooks/use-patterns-paging.js +61 -0
  69. package/build/components/inserter/hooks/use-patterns-paging.js.map +1 -0
  70. package/build/components/inserter/hooks/use-patterns-state.js +21 -10
  71. package/build/components/inserter/hooks/use-patterns-state.js.map +1 -1
  72. package/build/components/inserter/menu.js +13 -11
  73. package/build/components/inserter/menu.js.map +1 -1
  74. package/build/components/inserter/search-results.js +4 -3
  75. package/build/components/inserter/search-results.js.map +1 -1
  76. package/build/components/inserter/tabs.js +1 -12
  77. package/build/components/inserter/tabs.js.map +1 -1
  78. package/build/components/inspector-controls/block-support-slot-container.js +12 -1
  79. package/build/components/inspector-controls/block-support-slot-container.js.map +1 -1
  80. package/build/components/inspector-controls/fill.js +24 -13
  81. package/build/components/inspector-controls/fill.js.map +1 -1
  82. package/build/components/inspector-controls/groups.js +5 -3
  83. package/build/components/inspector-controls/groups.js.map +1 -1
  84. package/build/components/inspector-controls/slot.js +13 -0
  85. package/build/components/inspector-controls/slot.js.map +1 -1
  86. package/build/components/inspector-controls-tabs/styles-tab.js +3 -0
  87. package/build/components/inspector-controls-tabs/styles-tab.js.map +1 -1
  88. package/build/components/link-control/index.js +12 -2
  89. package/build/components/link-control/index.js.map +1 -1
  90. package/build/components/list-view/block-select-button.js +1 -3
  91. package/build/components/list-view/block-select-button.js.map +1 -1
  92. package/build/components/list-view/block.js +13 -1
  93. package/build/components/list-view/block.js.map +1 -1
  94. package/build/components/list-view/use-block-selection.js +29 -24
  95. package/build/components/list-view/use-block-selection.js.map +1 -1
  96. package/build/components/media-placeholder/index.js +2 -2
  97. package/build/components/media-placeholder/index.js.map +1 -1
  98. package/build/components/media-placeholder/index.native.js +11 -11
  99. package/build/components/media-placeholder/index.native.js.map +1 -1
  100. package/build/components/media-replace-flow/index.js +2 -3
  101. package/build/components/media-replace-flow/index.js.map +1 -1
  102. package/build/components/media-upload/constants.js +30 -0
  103. package/build/components/media-upload/constants.js.map +1 -0
  104. package/build/components/media-upload/index.native.js +63 -53
  105. package/build/components/media-upload/index.native.js.map +1 -1
  106. package/build/components/preview-options/index.js +1 -1
  107. package/build/components/preview-options/index.js.map +1 -1
  108. package/build/components/rich-text/index.js +34 -35
  109. package/build/components/rich-text/index.js.map +1 -1
  110. package/build/components/rich-text/index.native.js +14 -32
  111. package/build/components/rich-text/index.native.js.map +1 -1
  112. package/build/components/rich-text/multiline.js +95 -0
  113. package/build/components/rich-text/multiline.js.map +1 -0
  114. package/build/components/rich-text/split-value.js +10 -16
  115. package/build/components/rich-text/split-value.js.map +1 -1
  116. package/build/components/rich-text/use-enter.js +31 -40
  117. package/build/components/rich-text/use-enter.js.map +1 -1
  118. package/build/components/rich-text/use-paste-handler.js +18 -33
  119. package/build/components/rich-text/use-paste-handler.js.map +1 -1
  120. package/build/components/spacing-sizes-control/utils.js +1 -1
  121. package/build/components/spacing-sizes-control/utils.js.map +1 -1
  122. package/build/components/use-block-commands/index.js +30 -18
  123. package/build/components/use-block-commands/index.js.map +1 -1
  124. package/build/components/use-block-display-information/index.js +5 -2
  125. package/build/components/use-block-display-information/index.js.map +1 -1
  126. package/build/hooks/background.js +263 -0
  127. package/build/hooks/background.js.map +1 -0
  128. package/build/hooks/block-hooks.js +188 -0
  129. package/build/hooks/block-hooks.js.map +1 -0
  130. package/build/hooks/block-rename-ui.js +161 -0
  131. package/build/hooks/block-rename-ui.js.map +1 -0
  132. package/build/hooks/duotone.js +29 -42
  133. package/build/hooks/duotone.js.map +1 -1
  134. package/build/hooks/index.js +2 -2
  135. package/build/hooks/index.js.map +1 -1
  136. package/build/hooks/layout.js +31 -14
  137. package/build/hooks/layout.js.map +1 -1
  138. package/build/hooks/position.js +4 -2
  139. package/build/hooks/position.js.map +1 -1
  140. package/build/hooks/style.js +10 -3
  141. package/build/hooks/style.js.map +1 -1
  142. package/build/private-apis.js +2 -0
  143. package/build/private-apis.js.map +1 -1
  144. package/build/store/actions.js +33 -10
  145. package/build/store/actions.js.map +1 -1
  146. package/build/store/private-actions.js +42 -8
  147. package/build/store/private-actions.js.map +1 -1
  148. package/build/store/private-selectors.js +25 -3
  149. package/build/store/private-selectors.js.map +1 -1
  150. package/build/store/reducer.js +43 -1
  151. package/build/store/reducer.js.map +1 -1
  152. package/build/store/selectors.js +84 -23
  153. package/build/store/selectors.js.map +1 -1
  154. package/build/store/utils.js +0 -4
  155. package/build/store/utils.js.map +1 -1
  156. package/build-module/components/block-canvas/index.js +97 -0
  157. package/build-module/components/block-canvas/index.js.map +1 -0
  158. package/build-module/components/block-inspector/index.js +4 -1
  159. package/build-module/components/block-inspector/index.js.map +1 -1
  160. package/build-module/components/block-patterns-list/index.js +30 -10
  161. package/build-module/components/block-patterns-list/index.js.map +1 -1
  162. package/build-module/components/block-patterns-paging/index.js +61 -0
  163. package/build-module/components/block-patterns-paging/index.js.map +1 -0
  164. package/build-module/components/block-settings-menu/block-settings-dropdown.js +28 -0
  165. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  166. package/build-module/components/block-settings-menu-controls/index.js +4 -7
  167. package/build-module/components/block-settings-menu-controls/index.js.map +1 -1
  168. package/build-module/components/block-styles/index.js +1 -0
  169. package/build-module/components/block-styles/index.js.map +1 -1
  170. package/build-module/components/block-toolbar/block-toolbar-menu.native.js +3 -7
  171. package/build-module/components/block-toolbar/block-toolbar-menu.native.js.map +1 -1
  172. package/build-module/components/block-tools/block-contextual-toolbar.js +18 -7
  173. package/build-module/components/block-tools/block-contextual-toolbar.js.map +1 -1
  174. package/build-module/components/block-tools/block-selection-button.js +5 -1
  175. package/build-module/components/block-tools/block-selection-button.js.map +1 -1
  176. package/build-module/components/border-radius-control/input-controls.js +1 -1
  177. package/build-module/components/border-radius-control/input-controls.js.map +1 -1
  178. package/build-module/components/border-radius-control/linked-button.js +2 -4
  179. package/build-module/components/border-radius-control/linked-button.js.map +1 -1
  180. package/build-module/components/colors/with-colors.js.map +1 -1
  181. package/build-module/components/convert-to-group-buttons/use-convert-to-group-button-props.js +8 -21
  182. package/build-module/components/convert-to-group-buttons/use-convert-to-group-button-props.js.map +1 -1
  183. package/build-module/components/default-block-appender/index.native.js +20 -1
  184. package/build-module/components/default-block-appender/index.native.js.map +1 -1
  185. package/build-module/components/duotone/utils.js +65 -0
  186. package/build-module/components/duotone/utils.js.map +1 -1
  187. package/build-module/components/editor-styles/index.js +28 -9
  188. package/build-module/components/editor-styles/index.js.map +1 -1
  189. package/build-module/components/global-styles/hooks.js +3 -100
  190. package/build-module/components/global-styles/hooks.js.map +1 -1
  191. package/build-module/components/global-styles/image-settings-panel.js +53 -0
  192. package/build-module/components/global-styles/image-settings-panel.js.map +1 -0
  193. package/build-module/components/global-styles/index.js +2 -2
  194. package/build-module/components/global-styles/index.js.map +1 -1
  195. package/build-module/components/global-styles/use-global-styles-output.js +18 -16
  196. package/build-module/components/global-styles/use-global-styles-output.js.map +1 -1
  197. package/build-module/components/global-styles/utils.js +1 -1
  198. package/build-module/components/global-styles/utils.js.map +1 -1
  199. package/build-module/components/iframe/index.js +66 -33
  200. package/build-module/components/iframe/index.js.map +1 -1
  201. package/build-module/components/image-editor/use-save-image.js +2 -5
  202. package/build-module/components/image-editor/use-save-image.js.map +1 -1
  203. package/build-module/components/image-editor/use-transform-image.js +9 -9
  204. package/build-module/components/image-editor/use-transform-image.js.map +1 -1
  205. package/build-module/components/index.js +1 -1
  206. package/build-module/components/index.js.map +1 -1
  207. package/build-module/components/index.native.js +2 -1
  208. package/build-module/components/index.native.js.map +1 -1
  209. package/build-module/components/inner-blocks/use-nested-settings-update.js +14 -8
  210. package/build-module/components/inner-blocks/use-nested-settings-update.js.map +1 -1
  211. package/build-module/components/inserter/block-patterns-explorer/explorer.js +12 -6
  212. package/build-module/components/inserter/block-patterns-explorer/explorer.js.map +1 -1
  213. package/build-module/components/inserter/block-patterns-explorer/patterns-list.js +47 -24
  214. package/build-module/components/inserter/block-patterns-explorer/patterns-list.js.map +1 -1
  215. package/build-module/components/inserter/block-patterns-explorer/sidebar.js +9 -9
  216. package/build-module/components/inserter/block-patterns-explorer/sidebar.js.map +1 -1
  217. package/build-module/components/inserter/block-patterns-filter.js +128 -0
  218. package/build-module/components/inserter/block-patterns-filter.js.map +1 -0
  219. package/build-module/components/inserter/block-patterns-tab.js +125 -44
  220. package/build-module/components/inserter/block-patterns-tab.js.map +1 -1
  221. package/build-module/components/inserter/hooks/use-patterns-paging.js +54 -0
  222. package/build-module/components/inserter/hooks/use-patterns-paging.js.map +1 -0
  223. package/build-module/components/inserter/hooks/use-patterns-state.js +22 -10
  224. package/build-module/components/inserter/hooks/use-patterns-state.js.map +1 -1
  225. package/build-module/components/inserter/menu.js +13 -11
  226. package/build-module/components/inserter/menu.js.map +1 -1
  227. package/build-module/components/inserter/search-results.js +4 -3
  228. package/build-module/components/inserter/search-results.js.map +1 -1
  229. package/build-module/components/inserter/tabs.js +1 -12
  230. package/build-module/components/inserter/tabs.js.map +1 -1
  231. package/build-module/components/inspector-controls/block-support-slot-container.js +13 -2
  232. package/build-module/components/inspector-controls/block-support-slot-container.js.map +1 -1
  233. package/build-module/components/inspector-controls/fill.js +25 -14
  234. package/build-module/components/inspector-controls/fill.js.map +1 -1
  235. package/build-module/components/inspector-controls/groups.js +5 -3
  236. package/build-module/components/inspector-controls/groups.js.map +1 -1
  237. package/build-module/components/inspector-controls/slot.js +15 -1
  238. package/build-module/components/inspector-controls/slot.js.map +1 -1
  239. package/build-module/components/inspector-controls-tabs/styles-tab.js +3 -0
  240. package/build-module/components/inspector-controls-tabs/styles-tab.js.map +1 -1
  241. package/build-module/components/link-control/index.js +12 -2
  242. package/build-module/components/link-control/index.js.map +1 -1
  243. package/build-module/components/list-view/block-select-button.js +1 -3
  244. package/build-module/components/list-view/block-select-button.js.map +1 -1
  245. package/build-module/components/list-view/block.js +13 -1
  246. package/build-module/components/list-view/block.js.map +1 -1
  247. package/build-module/components/list-view/use-block-selection.js +30 -25
  248. package/build-module/components/list-view/use-block-selection.js.map +1 -1
  249. package/build-module/components/media-placeholder/index.js +2 -2
  250. package/build-module/components/media-placeholder/index.js.map +1 -1
  251. package/build-module/components/media-placeholder/index.native.js +7 -7
  252. package/build-module/components/media-placeholder/index.native.js.map +1 -1
  253. package/build-module/components/media-replace-flow/index.js +2 -3
  254. package/build-module/components/media-replace-flow/index.js.map +1 -1
  255. package/build-module/components/media-upload/constants.js +14 -0
  256. package/build-module/components/media-upload/constants.js.map +1 -0
  257. package/build-module/components/media-upload/index.native.js +53 -34
  258. package/build-module/components/media-upload/index.native.js.map +1 -1
  259. package/build-module/components/preview-options/index.js +1 -1
  260. package/build-module/components/preview-options/index.js.map +1 -1
  261. package/build-module/components/rich-text/index.js +35 -37
  262. package/build-module/components/rich-text/index.js.map +1 -1
  263. package/build-module/components/rich-text/index.native.js +15 -33
  264. package/build-module/components/rich-text/index.native.js.map +1 -1
  265. package/build-module/components/rich-text/multiline.js +87 -0
  266. package/build-module/components/rich-text/multiline.js.map +1 -0
  267. package/build-module/components/rich-text/split-value.js +10 -16
  268. package/build-module/components/rich-text/split-value.js.map +1 -1
  269. package/build-module/components/rich-text/use-enter.js +33 -42
  270. package/build-module/components/rich-text/use-enter.js.map +1 -1
  271. package/build-module/components/rich-text/use-paste-handler.js +19 -34
  272. package/build-module/components/rich-text/use-paste-handler.js.map +1 -1
  273. package/build-module/components/spacing-sizes-control/utils.js +2 -2
  274. package/build-module/components/spacing-sizes-control/utils.js.map +1 -1
  275. package/build-module/components/use-block-commands/index.js +28 -16
  276. package/build-module/components/use-block-commands/index.js.map +1 -1
  277. package/build-module/components/use-block-display-information/index.js +5 -2
  278. package/build-module/components/use-block-display-information/index.js.map +1 -1
  279. package/build-module/hooks/background.js +249 -0
  280. package/build-module/hooks/background.js.map +1 -0
  281. package/build-module/hooks/block-hooks.js +181 -0
  282. package/build-module/hooks/block-hooks.js.map +1 -0
  283. package/build-module/hooks/block-rename-ui.js +154 -0
  284. package/build-module/hooks/block-rename-ui.js.map +1 -0
  285. package/build-module/hooks/duotone.js +26 -39
  286. package/build-module/hooks/duotone.js.map +1 -1
  287. package/build-module/hooks/index.js +2 -2
  288. package/build-module/hooks/index.js.map +1 -1
  289. package/build-module/hooks/layout.js +33 -16
  290. package/build-module/hooks/layout.js.map +1 -1
  291. package/build-module/hooks/position.js +4 -2
  292. package/build-module/hooks/position.js.map +1 -1
  293. package/build-module/hooks/style.js +10 -3
  294. package/build-module/hooks/style.js.map +1 -1
  295. package/build-module/private-apis.js +2 -0
  296. package/build-module/private-apis.js.map +1 -1
  297. package/build-module/store/actions.js +33 -10
  298. package/build-module/store/actions.js.map +1 -1
  299. package/build-module/store/private-actions.js +39 -8
  300. package/build-module/store/private-actions.js.map +1 -1
  301. package/build-module/store/private-selectors.js +23 -3
  302. package/build-module/store/private-selectors.js.map +1 -1
  303. package/build-module/store/reducer.js +41 -1
  304. package/build-module/store/reducer.js.map +1 -1
  305. package/build-module/store/selectors.js +78 -22
  306. package/build-module/store/selectors.js.map +1 -1
  307. package/build-module/store/utils.js +0 -4
  308. package/build-module/store/utils.js.map +1 -1
  309. package/build-style/content-rtl.css +0 -1
  310. package/build-style/content.css +0 -1
  311. package/build-style/style-rtl.css +201 -131
  312. package/build-style/style.css +201 -131
  313. package/package.json +32 -32
  314. package/src/components/block-canvas/index.js +108 -0
  315. package/src/components/block-inspector/index.js +5 -1
  316. package/src/components/block-list/content.scss +0 -1
  317. package/src/components/block-patterns-list/index.js +53 -19
  318. package/src/components/block-patterns-list/style.scss +26 -9
  319. package/src/components/block-patterns-paging/index.js +92 -0
  320. package/src/components/block-patterns-paging/style.scss +45 -0
  321. package/src/components/block-settings-menu/block-settings-dropdown.js +44 -0
  322. package/src/components/block-settings-menu-controls/index.js +4 -9
  323. package/src/components/block-styles/index.js +1 -0
  324. package/src/components/block-styles/style.scss +3 -3
  325. package/src/components/block-toolbar/block-toolbar-menu.native.js +1 -6
  326. package/src/components/block-tools/block-contextual-toolbar.js +16 -5
  327. package/src/components/block-tools/block-selection-button.js +9 -1
  328. package/src/components/block-tools/style.scss +0 -98
  329. package/src/components/border-radius-control/input-controls.js +1 -1
  330. package/src/components/border-radius-control/linked-button.js +8 -11
  331. package/src/components/color-palette/test/__snapshots__/control.js.snap +34 -21
  332. package/src/components/colors/with-colors.js +3 -2
  333. package/src/components/convert-to-group-buttons/use-convert-to-group-button-props.js +8 -35
  334. package/src/components/default-block-appender/index.native.js +26 -3
  335. package/src/components/duotone/utils.js +65 -0
  336. package/src/components/editor-styles/index.js +32 -23
  337. package/src/components/global-styles/hooks.js +4 -112
  338. package/src/components/global-styles/image-settings-panel.js +71 -0
  339. package/src/components/global-styles/index.js +4 -3
  340. package/src/components/global-styles/use-global-styles-output.js +25 -16
  341. package/src/components/global-styles/utils.js +1 -2
  342. package/src/components/iframe/index.js +72 -33
  343. package/src/components/image-editor/use-save-image.js +2 -9
  344. package/src/components/image-editor/use-transform-image.js +9 -9
  345. package/src/components/index.js +1 -1
  346. package/src/components/index.native.js +2 -2
  347. package/src/components/inner-blocks/use-nested-settings-update.js +15 -10
  348. package/src/components/inserter/block-patterns-explorer/explorer.js +17 -5
  349. package/src/components/inserter/block-patterns-explorer/patterns-list.js +68 -43
  350. package/src/components/inserter/block-patterns-explorer/sidebar.js +8 -8
  351. package/src/components/inserter/block-patterns-filter.js +183 -0
  352. package/src/components/inserter/block-patterns-tab.js +217 -58
  353. package/src/components/inserter/hooks/use-patterns-paging.js +76 -0
  354. package/src/components/inserter/hooks/use-patterns-state.js +27 -16
  355. package/src/components/inserter/menu.js +15 -17
  356. package/src/components/inserter/search-results.js +6 -4
  357. package/src/components/inserter/style.scss +36 -7
  358. package/src/components/inserter/tabs.js +2 -12
  359. package/src/components/inserter/test/index.native.js +8 -12
  360. package/src/components/inspector-controls/block-support-slot-container.js +19 -3
  361. package/src/components/inspector-controls/fill.js +28 -14
  362. package/src/components/inspector-controls/groups.js +6 -2
  363. package/src/components/inspector-controls/slot.js +28 -3
  364. package/src/components/inspector-controls-tabs/styles-tab.js +4 -0
  365. package/src/components/link-control/index.js +13 -0
  366. package/src/components/link-control/style.scss +23 -2
  367. package/src/components/link-control/test/index.js +88 -6
  368. package/src/components/list-view/block-select-button.js +1 -3
  369. package/src/components/list-view/block.js +19 -1
  370. package/src/components/list-view/style.scss +1 -2
  371. package/src/components/list-view/use-block-selection.js +38 -32
  372. package/src/components/media-placeholder/README.md +2 -2
  373. package/src/components/media-placeholder/index.js +2 -2
  374. package/src/components/media-placeholder/index.native.js +11 -12
  375. package/src/components/media-replace-flow/index.js +2 -2
  376. package/src/components/media-replace-flow/test/index.js +5 -23
  377. package/src/components/media-upload/README.md +3 -2
  378. package/src/components/media-upload/constants.js +15 -0
  379. package/src/components/media-upload/index.native.js +66 -40
  380. package/src/components/media-upload/style.native.scss +4 -0
  381. package/src/components/media-upload/test/index.native.js +2 -2
  382. package/src/components/preview-options/README.md +7 -0
  383. package/src/components/preview-options/index.js +1 -1
  384. package/src/components/rich-text/index.js +48 -44
  385. package/src/components/rich-text/index.native.js +14 -42
  386. package/src/components/rich-text/multiline.js +121 -0
  387. package/src/components/rich-text/split-value.js +10 -35
  388. package/src/components/rich-text/use-enter.js +32 -42
  389. package/src/components/rich-text/use-paste-handler.js +16 -40
  390. package/src/components/spacing-sizes-control/style.scss +5 -7
  391. package/src/components/spacing-sizes-control/utils.js +1 -2
  392. package/src/components/use-block-commands/index.js +28 -20
  393. package/src/components/use-block-display-information/index.js +3 -0
  394. package/src/hooks/background.js +299 -0
  395. package/src/hooks/background.scss +75 -0
  396. package/src/hooks/block-hooks.js +257 -0
  397. package/src/hooks/block-hooks.scss +16 -0
  398. package/src/hooks/block-rename-ui.js +231 -0
  399. package/src/hooks/block-rename-ui.scss +3 -0
  400. package/src/hooks/duotone.js +42 -43
  401. package/src/hooks/index.js +2 -2
  402. package/src/hooks/layout.js +31 -33
  403. package/src/hooks/position.js +4 -3
  404. package/src/hooks/style.js +11 -2
  405. package/src/hooks/test/align.native.js +4 -3
  406. package/src/private-apis.js +2 -0
  407. package/src/store/actions.js +52 -10
  408. package/src/store/private-actions.js +37 -6
  409. package/src/store/private-selectors.js +28 -3
  410. package/src/store/reducer.js +38 -0
  411. package/src/store/selectors.js +107 -26
  412. package/src/store/test/actions.js +19 -8
  413. package/src/store/test/private-actions.js +17 -0
  414. package/src/store/test/reducer.js +25 -0
  415. package/src/store/test/selectors.js +130 -123
  416. package/src/store/utils.js +3 -10
  417. package/src/style.scss +4 -0
  418. package/build/components/duotone/components.js +0 -135
  419. package/build/components/duotone/components.js.map +0 -1
  420. package/build/components/duotone/index.js +0 -38
  421. package/build/components/duotone/index.js.map +0 -1
  422. package/build/components/global-styles/behaviors-panel.js +0 -64
  423. package/build/components/global-styles/behaviors-panel.js.map +0 -1
  424. package/build/components/inserter/reusable-blocks-tab.js +0 -85
  425. package/build/components/inserter/reusable-blocks-tab.js.map +0 -1
  426. package/build/hooks/auto-inserting-blocks.js +0 -174
  427. package/build/hooks/auto-inserting-blocks.js.map +0 -1
  428. package/build/hooks/behaviors.js +0 -173
  429. package/build/hooks/behaviors.js.map +0 -1
  430. package/build-module/components/duotone/components.js +0 -126
  431. package/build-module/components/duotone/components.js.map +0 -1
  432. package/build-module/components/duotone/index.js +0 -3
  433. package/build-module/components/duotone/index.js.map +0 -1
  434. package/build-module/components/global-styles/behaviors-panel.js +0 -57
  435. package/build-module/components/global-styles/behaviors-panel.js.map +0 -1
  436. package/build-module/components/inserter/reusable-blocks-tab.js +0 -76
  437. package/build-module/components/inserter/reusable-blocks-tab.js.map +0 -1
  438. package/build-module/hooks/auto-inserting-blocks.js +0 -167
  439. package/build-module/hooks/auto-inserting-blocks.js.map +0 -1
  440. package/build-module/hooks/behaviors.js +0 -166
  441. package/build-module/hooks/behaviors.js.map +0 -1
  442. package/src/components/duotone/components.js +0 -133
  443. package/src/components/duotone/index.js +0 -7
  444. package/src/components/global-styles/behaviors-panel.js +0 -71
  445. package/src/components/inserter/reusable-blocks-tab.js +0 -84
  446. package/src/components/inserter/test/reusable-blocks-tab.js +0 -73
  447. package/src/hooks/auto-inserting-blocks.js +0 -232
  448. package/src/hooks/behaviors.js +0 -206
@@ -0,0 +1,231 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { createHigherOrderComponent, useInstanceId } from '@wordpress/compose';
5
+ import { addFilter } from '@wordpress/hooks';
6
+ import { __, sprintf } from '@wordpress/i18n';
7
+ import { getBlockSupport } from '@wordpress/blocks';
8
+ import {
9
+ MenuItem,
10
+ __experimentalHStack as HStack,
11
+ __experimentalVStack as VStack,
12
+ Button,
13
+ TextControl,
14
+ Modal,
15
+ } from '@wordpress/components';
16
+ import { useState } from '@wordpress/element';
17
+ import { speak } from '@wordpress/a11y';
18
+
19
+ /**
20
+ * Internal dependencies
21
+ */
22
+ import {
23
+ BlockSettingsMenuControls,
24
+ useBlockDisplayInformation,
25
+ InspectorControls,
26
+ } from '../components';
27
+
28
+ const emptyString = ( testString ) => testString?.trim()?.length === 0;
29
+
30
+ function RenameModal( { blockName, originalBlockName, onClose, onSave } ) {
31
+ const [ editedBlockName, setEditedBlockName ] = useState( blockName );
32
+
33
+ const nameHasChanged = editedBlockName !== blockName;
34
+ const nameIsOriginal = editedBlockName === originalBlockName;
35
+ const nameIsEmpty = emptyString( editedBlockName );
36
+
37
+ const isNameValid = nameHasChanged || nameIsOriginal;
38
+
39
+ const autoSelectInputText = ( event ) => event.target.select();
40
+
41
+ const dialogDescription = useInstanceId(
42
+ RenameModal,
43
+ `block-editor-rename-modal__description`
44
+ );
45
+
46
+ const handleSubmit = () => {
47
+ // Must be assertive to immediately announce change.
48
+ speak(
49
+ sprintf(
50
+ /* translators: %1$s: type of update (either reset of changed). %2$s: new name/label for the block */
51
+ __( 'Block name %1$s to: "%2$s".' ),
52
+ nameIsOriginal || nameIsEmpty ? __( 'reset' ) : __( 'changed' ),
53
+ editedBlockName
54
+ ),
55
+ 'assertive'
56
+ );
57
+
58
+ onSave( editedBlockName );
59
+
60
+ // Immediate close avoids ability to hit save multiple times.
61
+ onClose();
62
+ };
63
+
64
+ return (
65
+ <Modal
66
+ title={ __( 'Rename' ) }
67
+ onRequestClose={ onClose }
68
+ overlayClassName="block-editor-block-rename-modal"
69
+ aria={ {
70
+ describedby: dialogDescription,
71
+ } }
72
+ focusOnMount="firstContentElement"
73
+ >
74
+ <p id={ dialogDescription }>
75
+ { __( 'Enter a custom name for this block.' ) }
76
+ </p>
77
+ <form
78
+ onSubmit={ ( e ) => {
79
+ e.preventDefault();
80
+
81
+ if ( ! isNameValid ) {
82
+ return;
83
+ }
84
+
85
+ handleSubmit();
86
+ } }
87
+ >
88
+ <VStack spacing="3">
89
+ <TextControl
90
+ __nextHasNoMarginBottom
91
+ value={ editedBlockName }
92
+ label={ __( 'Block name' ) }
93
+ hideLabelFromVision={ true }
94
+ placeholder={ originalBlockName }
95
+ onChange={ setEditedBlockName }
96
+ onFocus={ autoSelectInputText }
97
+ />
98
+ <HStack justify="right">
99
+ <Button variant="tertiary" onClick={ onClose }>
100
+ { __( 'Cancel' ) }
101
+ </Button>
102
+
103
+ <Button
104
+ aria-disabled={ ! isNameValid }
105
+ variant="primary"
106
+ type="submit"
107
+ >
108
+ { __( 'Save' ) }
109
+ </Button>
110
+ </HStack>
111
+ </VStack>
112
+ </form>
113
+ </Modal>
114
+ );
115
+ }
116
+
117
+ function BlockRenameControl( props ) {
118
+ const [ renamingBlock, setRenamingBlock ] = useState( false );
119
+
120
+ const { clientId, customName, onChange } = props;
121
+
122
+ const blockInformation = useBlockDisplayInformation( clientId );
123
+
124
+ return (
125
+ <>
126
+ <InspectorControls group="advanced">
127
+ <TextControl
128
+ __nextHasNoMarginBottom
129
+ label={ __( 'Block name' ) }
130
+ value={ customName || '' }
131
+ onChange={ onChange }
132
+ />
133
+ </InspectorControls>
134
+ <BlockSettingsMenuControls>
135
+ { ( { selectedClientIds } ) => {
136
+ // Only enabled for single selections.
137
+ const canRename =
138
+ selectedClientIds.length === 1 &&
139
+ clientId === selectedClientIds[ 0 ];
140
+
141
+ // This check ensures the `BlockSettingsMenuControls` fill
142
+ // doesn't render multiple times and also that it renders for
143
+ // the block from which the menu was triggered.
144
+ if ( ! canRename ) {
145
+ return null;
146
+ }
147
+
148
+ return (
149
+ <MenuItem
150
+ onClick={ () => {
151
+ setRenamingBlock( true );
152
+ } }
153
+ aria-expanded={ renamingBlock }
154
+ aria-haspopup="dialog"
155
+ >
156
+ { __( 'Rename' ) }
157
+ </MenuItem>
158
+ );
159
+ } }
160
+ </BlockSettingsMenuControls>
161
+
162
+ { renamingBlock && (
163
+ <RenameModal
164
+ blockName={ customName || '' }
165
+ originalBlockName={ blockInformation?.title }
166
+ onClose={ () => setRenamingBlock( false ) }
167
+ onSave={ ( newName ) => {
168
+ // If the new value is the block's original name (e.g. `Group`)
169
+ // or it is an empty string then assume the intent is to reset
170
+ // the value. Therefore reset the metadata.
171
+ if (
172
+ newName === blockInformation?.title ||
173
+ emptyString( newName )
174
+ ) {
175
+ newName = undefined;
176
+ }
177
+
178
+ onChange( newName );
179
+ } }
180
+ />
181
+ ) }
182
+ </>
183
+ );
184
+ }
185
+
186
+ export const withBlockRenameControl = createHigherOrderComponent(
187
+ ( BlockEdit ) => ( props ) => {
188
+ const { clientId, name, attributes, setAttributes } = props;
189
+
190
+ const metaDataSupport = getBlockSupport(
191
+ name,
192
+ '__experimentalMetadata',
193
+ false
194
+ );
195
+
196
+ const supportsBlockNaming = !! (
197
+ true === metaDataSupport || metaDataSupport?.name
198
+ );
199
+
200
+ return (
201
+ <>
202
+ { supportsBlockNaming && (
203
+ <>
204
+ <BlockRenameControl
205
+ clientId={ clientId }
206
+ customName={ attributes?.metadata?.name }
207
+ onChange={ ( newName ) => {
208
+ setAttributes( {
209
+ metadata: {
210
+ ...( attributes?.metadata &&
211
+ attributes?.metadata ),
212
+ name: newName,
213
+ },
214
+ } );
215
+ } }
216
+ />
217
+ </>
218
+ ) }
219
+
220
+ <BlockEdit key="edit" { ...props } />
221
+ </>
222
+ );
223
+ },
224
+ 'withToolbarControls'
225
+ );
226
+
227
+ addFilter(
228
+ 'editor.BlockEdit',
229
+ 'core/block-rename-ui/with-block-rename-control',
230
+ withBlockRenameControl
231
+ );
@@ -0,0 +1,3 @@
1
+ .block-editor-block-rename-modal {
2
+ z-index: z-index(".block-editor-block-rename-modal");
3
+ }
@@ -15,7 +15,8 @@ import {
15
15
  } from '@wordpress/blocks';
16
16
  import { createHigherOrderComponent, useInstanceId } from '@wordpress/compose';
17
17
  import { addFilter } from '@wordpress/hooks';
18
- import { useMemo, useContext, createPortal } from '@wordpress/element';
18
+ import { useMemo, useEffect } from '@wordpress/element';
19
+ import { useDispatch } from '@wordpress/data';
19
20
 
20
21
  /**
21
22
  * Internal dependencies
@@ -26,45 +27,23 @@ import {
26
27
  __experimentalDuotoneControl as DuotoneControl,
27
28
  useSetting,
28
29
  } from '../components';
29
- import BlockList from '../components/block-list';
30
30
  import {
31
- __unstableDuotoneFilter as DuotoneFilter,
32
- __unstableDuotoneStylesheet as DuotoneStylesheet,
33
- __unstableDuotoneUnsetStylesheet as DuotoneUnsetStylesheet,
34
- } from '../components/duotone';
31
+ getDuotoneFilter,
32
+ getDuotoneStylesheet,
33
+ getDuotoneUnsetStylesheet,
34
+ } from '../components/duotone/utils';
35
35
  import { getBlockCSSSelector } from '../components/global-styles/get-block-css-selector';
36
36
  import { scopeSelector } from '../components/global-styles/utils';
37
37
  import { useBlockSettings } from './utils';
38
38
  import { default as StylesFiltersPanel } from '../components/global-styles/filters-panel';
39
39
  import { useBlockEditingMode } from '../components/block-editing-mode';
40
+ import { store as blockEditorStore } from '../store';
41
+ import { unlock } from '../lock-unlock';
40
42
 
41
43
  const EMPTY_ARRAY = [];
42
44
 
43
45
  extend( [ namesPlugin ] );
44
46
 
45
- /**
46
- * SVG and stylesheet needed for rendering the duotone filter.
47
- *
48
- * @param {Object} props Duotone props.
49
- * @param {string} props.selector Selector to apply the filter to.
50
- * @param {string} props.id Unique id for this duotone filter.
51
- * @param {string[]|"unset"} props.colors Array of RGB color strings ordered from dark to light.
52
- *
53
- * @return {WPElement} Duotone element.
54
- */
55
- function InlineDuotone( { selector, id, colors } ) {
56
- if ( colors === 'unset' ) {
57
- return <DuotoneUnsetStylesheet selector={ selector } />;
58
- }
59
-
60
- return (
61
- <>
62
- <DuotoneFilter id={ id } colors={ colors } />
63
- <DuotoneStylesheet id={ id } selector={ selector } />
64
- </>
65
- );
66
- }
67
-
68
47
  function useMultiOriginPresets( { presetSetting, defaultSetting } ) {
69
48
  const disableDefault = ! useSetting( defaultSetting );
70
49
  const userPresets =
@@ -248,8 +227,6 @@ function DuotoneStyles( {
248
227
  selector: duotoneSelector,
249
228
  attribute: duotoneAttr,
250
229
  } ) {
251
- const element = useContext( BlockList.__unstableElementContext );
252
-
253
230
  const duotonePalette = useMultiOriginPresets( {
254
231
  presetSetting: 'color.duotone',
255
232
  defaultSetting: 'color.defaultDuotone',
@@ -290,25 +267,47 @@ function DuotoneStyles( {
290
267
  // Assuming the selector part is a subclass selector (not a tag name)
291
268
  // so we can prepend the filter id class. If we want to support elements
292
269
  // such as `img` or namespaces, we'll need to add a case for that here.
293
- return `.editor-styles-wrapper .${ filterId }${ selectorPart.trim() }`;
270
+ return `.${ filterId }${ selectorPart.trim() }`;
294
271
  } );
295
272
 
296
273
  const selector = selectorsScoped.join( ', ' );
297
274
 
298
275
  const isValidFilter = Array.isArray( colors ) || colors === 'unset';
299
276
 
300
- return (
301
- element &&
302
- isValidFilter &&
303
- createPortal(
304
- <InlineDuotone
305
- selector={ selector }
306
- id={ filterId }
307
- colors={ colors }
308
- />,
309
- element
310
- )
277
+ const { setStyleOverride, deleteStyleOverride } = unlock(
278
+ useDispatch( blockEditorStore )
311
279
  );
280
+
281
+ useEffect( () => {
282
+ if ( ! isValidFilter ) return;
283
+
284
+ setStyleOverride( filterId, {
285
+ css:
286
+ colors !== 'unset'
287
+ ? getDuotoneStylesheet( selector, filterId )
288
+ : getDuotoneUnsetStylesheet( selector ),
289
+ __unstableType: 'presets',
290
+ } );
291
+ setStyleOverride( `duotone-${ filterId }`, {
292
+ assets:
293
+ colors !== 'unset' ? getDuotoneFilter( filterId, colors ) : '',
294
+ __unstableType: 'svgs',
295
+ } );
296
+
297
+ return () => {
298
+ deleteStyleOverride( filterId );
299
+ deleteStyleOverride( `duotone-${ filterId }` );
300
+ };
301
+ }, [
302
+ isValidFilter,
303
+ colors,
304
+ selector,
305
+ filterId,
306
+ setStyleOverride,
307
+ deleteStyleOverride,
308
+ ] );
309
+
310
+ return null;
312
311
  }
313
312
 
314
313
  /**
@@ -20,9 +20,9 @@ import './layout';
20
20
  import './content-lock-ui';
21
21
  import './metadata';
22
22
  import './metadata-name';
23
- import './behaviors';
24
23
  import './custom-fields';
25
- import './auto-inserting-blocks';
24
+ import './block-hooks';
25
+ import './block-rename-ui';
26
26
 
27
27
  export { useCustomSides } from './dimensions';
28
28
  export { useLayoutClasses, useLayoutStyles } from './layout';
@@ -9,7 +9,7 @@ import classnames from 'classnames';
9
9
  import { createHigherOrderComponent, useInstanceId } from '@wordpress/compose';
10
10
  import { addFilter } from '@wordpress/hooks';
11
11
  import { getBlockSupport, hasBlockSupport } from '@wordpress/blocks';
12
- import { useSelect } from '@wordpress/data';
12
+ import { useSelect, useDispatch } from '@wordpress/data';
13
13
  import {
14
14
  Button,
15
15
  ButtonGroup,
@@ -17,7 +17,7 @@ import {
17
17
  PanelBody,
18
18
  } from '@wordpress/components';
19
19
  import { __ } from '@wordpress/i18n';
20
- import { useContext, createPortal } from '@wordpress/element';
20
+ import { useEffect } from '@wordpress/element';
21
21
 
22
22
  /**
23
23
  * Internal dependencies
@@ -25,13 +25,12 @@ import { useContext, createPortal } from '@wordpress/element';
25
25
  import { store as blockEditorStore } from '../store';
26
26
  import { InspectorControls } from '../components';
27
27
  import useSetting from '../components/use-setting';
28
- import { LayoutStyle } from '../components/block-list/layout';
29
- import BlockList from '../components/block-list';
30
28
  import { getLayoutType, getLayoutTypes } from '../layouts';
31
29
  import { useBlockEditingMode } from '../components/block-editing-mode';
32
30
  import { LAYOUT_DEFINITIONS } from '../layouts/definitions';
33
31
  import { kebabCase } from '../utils/object';
34
32
  import { useBlockSettings } from './utils';
33
+ import { unlock } from '../lock-unlock';
35
34
 
36
35
  const layoutBlockSupportKey = 'layout';
37
36
 
@@ -364,7 +363,6 @@ export const withLayoutStyles = createHigherOrderComponent(
364
363
  const shouldRenderLayoutStyles =
365
364
  blockSupportsLayout && ! disableLayoutStyles;
366
365
  const id = useInstanceId( BlockListBlock );
367
- const element = useContext( BlockList.__unstableElementContext );
368
366
  const { layout } = attributes;
369
367
  const { default: defaultBlockLayout } =
370
368
  getBlockSupport( name, layoutBlockSupportKey ) || {};
@@ -404,26 +402,23 @@ export const withLayoutStyles = createHigherOrderComponent(
404
402
  layoutClasses
405
403
  );
406
404
 
405
+ const { setStyleOverride, deleteStyleOverride } = unlock(
406
+ useDispatch( blockEditorStore )
407
+ );
408
+
409
+ useEffect( () => {
410
+ if ( ! css ) return;
411
+ setStyleOverride( id, { css } );
412
+ return () => {
413
+ deleteStyleOverride( id );
414
+ };
415
+ }, [ id, css, setStyleOverride, deleteStyleOverride ] );
416
+
407
417
  return (
408
- <>
409
- { shouldRenderLayoutStyles &&
410
- element &&
411
- !! css &&
412
- createPortal(
413
- <LayoutStyle
414
- blockName={ name }
415
- selector={ selector }
416
- css={ css }
417
- layout={ usedLayout }
418
- style={ attributes?.style }
419
- />,
420
- element
421
- ) }
422
- <BlockListBlock
423
- { ...props }
424
- __unstableLayoutClassNames={ layoutClassNames }
425
- />
426
- </>
418
+ <BlockListBlock
419
+ { ...props }
420
+ __unstableLayoutClassNames={ layoutClassNames }
421
+ />
427
422
  );
428
423
  },
429
424
  'withLayoutStyles'
@@ -449,7 +444,6 @@ export const withChildLayoutStyles = createHigherOrderComponent(
449
444
  const shouldRenderChildLayoutStyles =
450
445
  hasChildLayout && ! disableLayoutStyles;
451
446
 
452
- const element = useContext( BlockList.__unstableElementContext );
453
447
  const id = useInstanceId( BlockListBlock );
454
448
  const selector = `.wp-container-content-${ id }`;
455
449
 
@@ -472,15 +466,19 @@ export const withChildLayoutStyles = createHigherOrderComponent(
472
466
  shouldRenderChildLayoutStyles && !! css, // Only attach a container class if there is generated CSS to be attached.
473
467
  } );
474
468
 
475
- return (
476
- <>
477
- { shouldRenderChildLayoutStyles &&
478
- element &&
479
- !! css &&
480
- createPortal( <style>{ css }</style>, element ) }
481
- <BlockListBlock { ...props } className={ className } />
482
- </>
469
+ const { setStyleOverride, deleteStyleOverride } = unlock(
470
+ useDispatch( blockEditorStore )
483
471
  );
472
+
473
+ useEffect( () => {
474
+ if ( ! css ) return;
475
+ setStyleOverride( id, { css } );
476
+ return () => {
477
+ deleteStyleOverride( id );
478
+ };
479
+ }, [ id, css, setStyleOverride, deleteStyleOverride ] );
480
+
481
+ return <BlockListBlock { ...props } className={ className } />;
484
482
  },
485
483
  'withChildLayoutStyles'
486
484
  );
@@ -334,8 +334,8 @@ export const withInspectorControls = createHigherOrderComponent(
334
334
  blockName,
335
335
  POSITION_SUPPORT_KEY
336
336
  );
337
- const showPositionControls =
338
- positionSupport && ! useIsPositionDisabled( props );
337
+ const isPositionDisabled = useIsPositionDisabled( props );
338
+ const showPositionControls = positionSupport && ! isPositionDisabled;
339
339
 
340
340
  return [
341
341
  showPositionControls && (
@@ -361,8 +361,9 @@ export const withPositionStyles = createHigherOrderComponent(
361
361
  name,
362
362
  POSITION_SUPPORT_KEY
363
363
  );
364
+ const isPositionDisabled = useIsPositionDisabled( props );
364
365
  const allowPositionStyles =
365
- hasPositionBlockSupport && ! useIsPositionDisabled( props );
366
+ hasPositionBlockSupport && ! isPositionDisabled;
366
367
 
367
368
  const id = useInstanceId( BlockListBlock );
368
369
  const element = useContext( BlockList.__unstableElementContext );
@@ -20,6 +20,7 @@ import { getCSSRules, compileCSS } from '@wordpress/style-engine';
20
20
  * Internal dependencies
21
21
  */
22
22
  import BlockList from '../components/block-list';
23
+ import { BACKGROUND_SUPPORT_KEY, BackgroundImagePanel } from './background';
23
24
  import { BORDER_SUPPORT_KEY, BorderPanel } from './border';
24
25
  import { COLOR_SUPPORT_KEY, ColorEdit } from './color';
25
26
  import {
@@ -42,6 +43,7 @@ const styleSupportKeys = [
42
43
  BORDER_SUPPORT_KEY,
43
44
  COLOR_SUPPORT_KEY,
44
45
  DIMENSIONS_SUPPORT_KEY,
46
+ BACKGROUND_SUPPORT_KEY,
45
47
  SPACING_SUPPORT_KEY,
46
48
  ];
47
49
 
@@ -127,7 +129,11 @@ const skipSerializationPathsEdit = {
127
129
  */
128
130
  const skipSerializationPathsSave = {
129
131
  ...skipSerializationPathsEdit,
130
- [ `${ SPACING_SUPPORT_KEY }` ]: [ 'spacing.blockGap' ],
132
+ [ `${ BACKGROUND_SUPPORT_KEY }` ]: [ BACKGROUND_SUPPORT_KEY ], // Skip serialization of background support in save mode.
133
+ };
134
+
135
+ const skipSerializationPathsSaveChecks = {
136
+ [ `${ BACKGROUND_SUPPORT_KEY }` ]: true,
131
137
  };
132
138
 
133
139
  /**
@@ -285,7 +291,9 @@ export function addSaveProps(
285
291
 
286
292
  let { style } = attributes;
287
293
  Object.entries( skipPaths ).forEach( ( [ indicator, path ] ) => {
288
- const skipSerialization = getBlockSupport( blockType, indicator );
294
+ const skipSerialization =
295
+ skipSerializationPathsSaveChecks[ indicator ] ||
296
+ getBlockSupport( blockType, indicator );
289
297
 
290
298
  if ( skipSerialization === true ) {
291
299
  style = omitStyle( style, path );
@@ -360,6 +368,7 @@ export const withBlockControls = createHigherOrderComponent(
360
368
  { shouldDisplayControls && blockEditingMode === 'default' && (
361
369
  <>
362
370
  <ColorEdit { ...props } />
371
+ <BackgroundImagePanel { ...props } />
363
372
  <TypographyPanel { ...props } />
364
373
  <BorderPanel { ...props } />
365
374
  <DimensionsPanel { ...props } />
@@ -108,9 +108,10 @@ describe( 'Align options', () => {
108
108
  expect( groupBlock ).toBeVisible();
109
109
 
110
110
  // Trigger inner blocks layout
111
- const innerBlockListWrapper = await within(
112
- groupBlock
113
- ).findByTestId( 'block-list-wrapper' );
111
+ const innerBlockListWrapper =
112
+ await within( groupBlock ).findByTestId(
113
+ 'block-list-wrapper'
114
+ );
114
115
  fireEvent( innerBlockListWrapper, 'layout', {
115
116
  nativeEvent: {
116
117
  layout: {
@@ -23,6 +23,7 @@ import {
23
23
  useReusableBlocksRenameHint,
24
24
  } from './components/inserter/reusable-block-rename-hint';
25
25
  import { usesContextKey } from './components/rich-text/format-edit';
26
+ import { ExperimentalBlockCanvas } from './components/block-canvas';
26
27
 
27
28
  /**
28
29
  * Private @wordpress/block-editor APIs.
@@ -30,6 +31,7 @@ import { usesContextKey } from './components/rich-text/format-edit';
30
31
  export const privateApis = {};
31
32
  lock( privateApis, {
32
33
  ...globalStyles,
34
+ ExperimentalBlockCanvas,
33
35
  ExperimentalBlockEditorProvider,
34
36
  getRichTextValues,
35
37
  kebabCase,
@@ -375,7 +375,7 @@ function getBlocksWithDefaultStylesApplied( blocks, blockEditorSettings ) {
375
375
  */
376
376
  export const replaceBlocks =
377
377
  ( clientIds, blocks, indexToSelect, initialPosition = 0, meta ) =>
378
- ( { select, dispatch } ) => {
378
+ ( { select, dispatch, registry } ) => {
379
379
  /* eslint-enable jsdoc/valid-types */
380
380
  clientIds = castArray( clientIds );
381
381
  blocks = getBlocksWithDefaultStylesApplied(
@@ -394,16 +394,22 @@ export const replaceBlocks =
394
394
  return;
395
395
  }
396
396
  }
397
- dispatch( {
398
- type: 'REPLACE_BLOCKS',
399
- clientIds,
400
- blocks,
401
- time: Date.now(),
402
- indexToSelect,
403
- initialPosition,
404
- meta,
397
+ // We're batching these two actions because an extra `undo/redo` step can
398
+ // be created, based on whether we insert a default block or not.
399
+ registry.batch( () => {
400
+ dispatch( {
401
+ type: 'REPLACE_BLOCKS',
402
+ clientIds,
403
+ blocks,
404
+ time: Date.now(),
405
+ indexToSelect,
406
+ initialPosition,
407
+ meta,
408
+ } );
409
+ // To avoid a focus loss when removing the last block, assure there is
410
+ // always a default block if the last of the blocks have been removed.
411
+ dispatch.ensureDefaultBlock();
405
412
  } );
406
- dispatch.ensureDefaultBlock();
407
413
  };
408
414
 
409
415
  /**
@@ -1034,6 +1040,7 @@ export const mergeBlocks =
1034
1040
  dispatch.selectBlock( blockA.clientId );
1035
1041
  return;
1036
1042
  }
1043
+
1037
1044
  registry.batch( () => {
1038
1045
  dispatch.insertBlocks(
1039
1046
  blockWithSameType.innerBlocks,
@@ -1044,6 +1051,41 @@ export const mergeBlocks =
1044
1051
  dispatch.selectBlock(
1045
1052
  blockWithSameType.innerBlocks[ 0 ].clientId
1046
1053
  );
1054
+
1055
+ // Attempt to merge the next block if it's the same type and
1056
+ // same attributes. This is useful when merging a paragraph into
1057
+ // a list, and the next block is also a list. If we don't merge,
1058
+ // it looks like one list, but it's actually two lists. The same
1059
+ // applies to other blocks such as a group with the same
1060
+ // attributes.
1061
+ const nextBlockClientId =
1062
+ select.getNextBlockClientId( clientIdA );
1063
+
1064
+ if (
1065
+ nextBlockClientId &&
1066
+ select.getBlockName( clientIdA ) ===
1067
+ select.getBlockName( nextBlockClientId )
1068
+ ) {
1069
+ const rootAttributes =
1070
+ select.getBlockAttributes( clientIdA );
1071
+ const previousRootAttributes =
1072
+ select.getBlockAttributes( nextBlockClientId );
1073
+
1074
+ if (
1075
+ Object.keys( rootAttributes ).every(
1076
+ ( key ) =>
1077
+ rootAttributes[ key ] ===
1078
+ previousRootAttributes[ key ]
1079
+ )
1080
+ ) {
1081
+ dispatch.moveBlocksToPosition(
1082
+ select.getBlockOrder( nextBlockClientId ),
1083
+ nextBlockClientId,
1084
+ clientIdA
1085
+ );
1086
+ dispatch.removeBlock( nextBlockClientId, false );
1087
+ }
1088
+ }
1047
1089
  } );
1048
1090
  return;
1049
1091
  }