@wordpress/block-editor 14.5.0 → 14.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (541) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.md +0 -8
  3. package/build/autocompleters/block.js +13 -5
  4. package/build/autocompleters/block.js.map +1 -1
  5. package/build/components/block-canvas/index.js +10 -0
  6. package/build/components/block-canvas/index.js.map +1 -1
  7. package/build/components/block-card/index.js +2 -2
  8. package/build/components/block-card/index.js.map +1 -1
  9. package/build/components/block-full-height-alignment-control/index.js +1 -1
  10. package/build/components/block-full-height-alignment-control/index.js.map +1 -1
  11. package/build/components/block-list/block.js +15 -29
  12. package/build/components/block-list/block.js.map +1 -1
  13. package/build/components/block-list/block.native.js +1 -7
  14. package/build/components/block-list/block.native.js.map +1 -1
  15. package/build/components/block-list/index.js +5 -5
  16. package/build/components/block-list/index.js.map +1 -1
  17. package/build/components/block-list/use-block-props/index.js +1 -2
  18. package/build/components/block-list/use-block-props/index.js.map +1 -1
  19. package/build/components/block-list/use-block-props/use-focus-first-element.js +4 -3
  20. package/build/components/block-list/use-block-props/use-focus-first-element.js.map +1 -1
  21. package/build/components/block-list/use-block-props/use-selected-block-event-handlers.js +3 -6
  22. package/build/components/block-list/use-block-props/use-selected-block-event-handlers.js.map +1 -1
  23. package/build/components/block-list/use-in-between-inserter.js +1 -1
  24. package/build/components/block-list/use-in-between-inserter.js.map +1 -1
  25. package/build/components/block-patterns-list/index.js +23 -26
  26. package/build/components/block-patterns-list/index.js.map +1 -1
  27. package/build/components/block-patterns-paging/index.js +1 -1
  28. package/build/components/block-patterns-paging/index.js.map +1 -1
  29. package/build/components/block-popover/index.js +3 -46
  30. package/build/components/block-popover/index.js.map +1 -1
  31. package/build/components/block-preview/async.js +51 -0
  32. package/build/components/block-preview/async.js.map +1 -0
  33. package/build/components/block-preview/index.js +6 -3
  34. package/build/components/block-preview/index.js.map +1 -1
  35. package/build/components/block-settings-menu/block-settings-dropdown.js +5 -0
  36. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  37. package/build/components/block-settings-menu/index.js +4 -3
  38. package/build/components/block-settings-menu/index.js.map +1 -1
  39. package/build/components/block-toolbar/change-design.js +119 -0
  40. package/build/components/block-toolbar/change-design.js.map +1 -0
  41. package/build/components/block-toolbar/index.js +19 -7
  42. package/build/components/block-toolbar/index.js.map +1 -1
  43. package/build/components/block-tools/index.js +16 -19
  44. package/build/components/block-tools/index.js.map +1 -1
  45. package/build/components/block-tools/insertion-point.js +4 -3
  46. package/build/components/block-tools/insertion-point.js.map +1 -1
  47. package/build/components/block-tools/use-block-toolbar-popover-props.js +1 -1
  48. package/build/components/block-tools/use-block-toolbar-popover-props.js.map +1 -1
  49. package/build/components/block-tools/use-show-block-tools.js +7 -10
  50. package/build/components/block-tools/use-show-block-tools.js.map +1 -1
  51. package/build/components/block-tools/zoom-out-mode-inserters.js +20 -29
  52. package/build/components/block-tools/zoom-out-mode-inserters.js.map +1 -1
  53. package/build/components/block-variation-transforms/index.js +2 -2
  54. package/build/components/block-variation-transforms/index.js.map +1 -1
  55. package/build/components/block-vertical-alignment-control/ui.js +6 -10
  56. package/build/components/block-vertical-alignment-control/ui.js.map +1 -1
  57. package/build/components/border-radius-control/linked-button.js +7 -10
  58. package/build/components/border-radius-control/linked-button.js.map +1 -1
  59. package/build/components/collab/block-comment-icon-slot.js +18 -0
  60. package/build/components/collab/block-comment-icon-slot.js.map +1 -0
  61. package/build/components/collab/block-comment-icon-toolbar-slot.js +18 -0
  62. package/build/components/collab/block-comment-icon-toolbar-slot.js.map +1 -0
  63. package/build/components/colors-gradients/use-multiple-origin-colors-and-gradients.js +7 -1
  64. package/build/components/colors-gradients/use-multiple-origin-colors-and-gradients.js.map +1 -1
  65. package/build/components/convert-to-group-buttons/toolbar.js +4 -4
  66. package/build/components/convert-to-group-buttons/toolbar.js.map +1 -1
  67. package/build/components/global-styles/color-panel.js +1 -4
  68. package/build/components/global-styles/color-panel.js.map +1 -1
  69. package/build/components/global-styles/dimensions-panel.js +26 -14
  70. package/build/components/global-styles/dimensions-panel.js.map +1 -1
  71. package/build/components/global-styles/use-global-styles-context.native.js +6 -0
  72. package/build/components/global-styles/use-global-styles-context.native.js.map +1 -1
  73. package/build/components/iframe/get-compatibility-styles.js +4 -4
  74. package/build/components/iframe/get-compatibility-styles.js.map +1 -1
  75. package/build/components/iframe/index.js +33 -22
  76. package/build/components/iframe/index.js.map +1 -1
  77. package/build/components/image-size-control/index.js +61 -20
  78. package/build/components/image-size-control/index.js.map +1 -1
  79. package/build/components/inner-blocks/index.js +9 -5
  80. package/build/components/inner-blocks/index.js.map +1 -1
  81. package/build/components/inserter/block-patterns-explorer/pattern-list.js +2 -2
  82. package/build/components/inserter/block-patterns-explorer/pattern-list.js.map +1 -1
  83. package/build/components/inserter/block-patterns-tab/index.js +1 -2
  84. package/build/components/inserter/block-patterns-tab/index.js.map +1 -1
  85. package/build/components/inserter/block-patterns-tab/pattern-category-previews.js +5 -3
  86. package/build/components/inserter/block-patterns-tab/pattern-category-previews.js.map +1 -1
  87. package/build/components/inserter/block-patterns-tab/patterns-filter.js +1 -1
  88. package/build/components/inserter/block-patterns-tab/patterns-filter.js.map +1 -1
  89. package/build/components/inserter/block-patterns-tab/use-pattern-categories.js +3 -0
  90. package/build/components/inserter/block-patterns-tab/use-pattern-categories.js.map +1 -1
  91. package/build/components/inserter/block-patterns-tab/utils.js +5 -1
  92. package/build/components/inserter/block-patterns-tab/utils.js.map +1 -1
  93. package/build/components/inserter/category-tabs/index.js +15 -2
  94. package/build/components/inserter/category-tabs/index.js.map +1 -1
  95. package/build/components/inserter/hooks/use-block-types-state.js +1 -1
  96. package/build/components/inserter/hooks/use-block-types-state.js.map +1 -1
  97. package/build/components/inserter/hooks/use-patterns-paging.js +0 -5
  98. package/build/components/inserter/hooks/use-patterns-paging.js.map +1 -1
  99. package/build/components/inserter/menu.js +4 -2
  100. package/build/components/inserter/menu.js.map +1 -1
  101. package/build/components/inserter/search-results.js +0 -2
  102. package/build/components/inserter/search-results.js.map +1 -1
  103. package/build/components/inserter-button/index.native.js +1 -1
  104. package/build/components/inserter-button/index.native.js.map +1 -1
  105. package/build/components/inspector-controls-tabs/index.js +0 -2
  106. package/build/components/inspector-controls-tabs/index.js.map +1 -1
  107. package/build/components/inspector-controls-tabs/utils.js +3 -6
  108. package/build/components/inspector-controls-tabs/utils.js.map +1 -1
  109. package/build/components/link-control/link-preview.js +12 -9
  110. package/build/components/link-control/link-preview.js.map +1 -1
  111. package/build/components/list-view/appender.js +4 -3
  112. package/build/components/list-view/appender.js.map +1 -1
  113. package/build/components/list-view/branch.js +6 -5
  114. package/build/components/list-view/branch.js.map +1 -1
  115. package/build/components/list-view/index.js +1 -2
  116. package/build/components/list-view/index.js.map +1 -1
  117. package/build/components/media-placeholder/index.js +4 -4
  118. package/build/components/media-placeholder/index.js.map +1 -1
  119. package/build/components/provider/index.js +1 -1
  120. package/build/components/provider/index.js.map +1 -1
  121. package/build/components/rich-text/event-listeners/index.js +3 -1
  122. package/build/components/rich-text/event-listeners/index.js.map +1 -1
  123. package/build/components/rich-text/index.js +1 -1
  124. package/build/components/rich-text/index.js.map +1 -1
  125. package/build/components/rich-text/index.native.js +2 -6
  126. package/build/components/rich-text/index.native.js.map +1 -1
  127. package/build/components/spacing-sizes-control/index.js +2 -2
  128. package/build/components/spacing-sizes-control/index.js.map +1 -1
  129. package/build/components/spacing-sizes-control/input-controls/spacing-input-control.js +3 -3
  130. package/build/components/spacing-sizes-control/input-controls/spacing-input-control.js.map +1 -1
  131. package/build/components/spacing-sizes-control/linked-button.js +1 -5
  132. package/build/components/spacing-sizes-control/linked-button.js.map +1 -1
  133. package/build/components/tabbed-sidebar/index.js +1 -1
  134. package/build/components/tabbed-sidebar/index.js.map +1 -1
  135. package/build/components/tool-selector/index.js +1 -4
  136. package/build/components/tool-selector/index.js.map +1 -1
  137. package/build/components/url-input/index.js +4 -2
  138. package/build/components/url-input/index.js.map +1 -1
  139. package/build/components/use-block-commands/index.js +6 -7
  140. package/build/components/use-block-commands/index.js.map +1 -1
  141. package/build/components/use-block-drop-zone/index.js +5 -5
  142. package/build/components/use-block-drop-zone/index.js.map +1 -1
  143. package/build/components/use-block-drop-zone/index.native.js +0 -1
  144. package/build/components/use-block-drop-zone/index.native.js.map +1 -1
  145. package/build/components/use-moving-animation/index.js +1 -3
  146. package/build/components/use-moving-animation/index.js.map +1 -1
  147. package/build/components/use-settings/index.js +1 -3
  148. package/build/components/use-settings/index.js.map +1 -1
  149. package/build/components/writing-flow/index.js +5 -3
  150. package/build/components/writing-flow/index.js.map +1 -1
  151. package/build/components/writing-flow/use-tab-nav.js +2 -3
  152. package/build/components/writing-flow/use-tab-nav.js.map +1 -1
  153. package/build/hooks/block-bindings.js +19 -8
  154. package/build/hooks/block-bindings.js.map +1 -1
  155. package/build/hooks/contrast-checker.js +0 -1
  156. package/build/hooks/contrast-checker.js.map +1 -1
  157. package/build/hooks/duotone.js +2 -2
  158. package/build/hooks/duotone.js.map +1 -1
  159. package/build/hooks/font-family.js +1 -1
  160. package/build/hooks/font-family.js.map +1 -1
  161. package/build/hooks/style.js +4 -1
  162. package/build/hooks/style.js.map +1 -1
  163. package/build/hooks/supports.js +6 -6
  164. package/build/hooks/supports.js.map +1 -1
  165. package/build/hooks/typography.js +5 -5
  166. package/build/hooks/typography.js.map +1 -1
  167. package/build/hooks/use-zoom-out.js +13 -22
  168. package/build/hooks/use-zoom-out.js.map +1 -1
  169. package/build/hooks/utils.js +2 -2
  170. package/build/hooks/utils.js.map +1 -1
  171. package/build/index.js +0 -7
  172. package/build/index.js.map +1 -1
  173. package/build/lock-unlock.js.map +1 -1
  174. package/build/private-apis.js +6 -3
  175. package/build/private-apis.js.map +1 -1
  176. package/build/store/actions.js +2 -33
  177. package/build/store/actions.js.map +1 -1
  178. package/build/store/defaults.js +1 -1
  179. package/build/store/defaults.js.map +1 -1
  180. package/build/store/private-actions.js +57 -8
  181. package/build/store/private-actions.js.map +1 -1
  182. package/build/store/private-selectors.js +10 -22
  183. package/build/store/private-selectors.js.map +1 -1
  184. package/build/store/reducer.js +16 -6
  185. package/build/store/reducer.js.map +1 -1
  186. package/build/store/selectors.js +53 -15
  187. package/build/store/selectors.js.map +1 -1
  188. package/build/store/utils.js +5 -4
  189. package/build/store/utils.js.map +1 -1
  190. package/build/utils/dom.js +37 -17
  191. package/build/utils/dom.js.map +1 -1
  192. package/build/utils/get-font-styles-and-weights.js +1 -1
  193. package/build/utils/get-font-styles-and-weights.js.map +1 -1
  194. package/build/utils/transform-styles/index.js +4 -3
  195. package/build/utils/transform-styles/index.js.map +1 -1
  196. package/build-module/autocompleters/block.js +14 -6
  197. package/build-module/autocompleters/block.js.map +1 -1
  198. package/build-module/components/block-canvas/index.js +11 -1
  199. package/build-module/components/block-canvas/index.js.map +1 -1
  200. package/build-module/components/block-card/index.js +3 -3
  201. package/build-module/components/block-card/index.js.map +1 -1
  202. package/build-module/components/block-full-height-alignment-control/index.js +1 -1
  203. package/build-module/components/block-full-height-alignment-control/index.js.map +1 -1
  204. package/build-module/components/block-list/block.js +16 -28
  205. package/build-module/components/block-list/block.js.map +1 -1
  206. package/build-module/components/block-list/block.native.js +1 -7
  207. package/build-module/components/block-list/block.native.js.map +1 -1
  208. package/build-module/components/block-list/index.js +5 -5
  209. package/build-module/components/block-list/index.js.map +1 -1
  210. package/build-module/components/block-list/use-block-props/index.js +1 -2
  211. package/build-module/components/block-list/use-block-props/index.js.map +1 -1
  212. package/build-module/components/block-list/use-block-props/use-focus-first-element.js +4 -3
  213. package/build-module/components/block-list/use-block-props/use-focus-first-element.js.map +1 -1
  214. package/build-module/components/block-list/use-block-props/use-selected-block-event-handlers.js +3 -6
  215. package/build-module/components/block-list/use-block-props/use-selected-block-event-handlers.js.map +1 -1
  216. package/build-module/components/block-list/use-in-between-inserter.js +1 -1
  217. package/build-module/components/block-list/use-in-between-inserter.js.map +1 -1
  218. package/build-module/components/block-patterns-list/index.js +23 -26
  219. package/build-module/components/block-patterns-list/index.js.map +1 -1
  220. package/build-module/components/block-patterns-paging/index.js +1 -1
  221. package/build-module/components/block-patterns-paging/index.js.map +1 -1
  222. package/build-module/components/block-popover/index.js +4 -47
  223. package/build-module/components/block-popover/index.js.map +1 -1
  224. package/build-module/components/block-preview/async.js +44 -0
  225. package/build-module/components/block-preview/async.js.map +1 -0
  226. package/build-module/components/block-preview/index.js +6 -3
  227. package/build-module/components/block-preview/index.js.map +1 -1
  228. package/build-module/components/block-settings-menu/block-settings-dropdown.js +5 -0
  229. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  230. package/build-module/components/block-settings-menu/index.js +5 -4
  231. package/build-module/components/block-settings-menu/index.js.map +1 -1
  232. package/build-module/components/block-toolbar/change-design.js +111 -0
  233. package/build-module/components/block-toolbar/change-design.js.map +1 -0
  234. package/build-module/components/block-toolbar/index.js +19 -7
  235. package/build-module/components/block-toolbar/index.js.map +1 -1
  236. package/build-module/components/block-tools/index.js +17 -20
  237. package/build-module/components/block-tools/index.js.map +1 -1
  238. package/build-module/components/block-tools/insertion-point.js +4 -3
  239. package/build-module/components/block-tools/insertion-point.js.map +1 -1
  240. package/build-module/components/block-tools/use-block-toolbar-popover-props.js +2 -2
  241. package/build-module/components/block-tools/use-block-toolbar-popover-props.js.map +1 -1
  242. package/build-module/components/block-tools/use-show-block-tools.js +7 -10
  243. package/build-module/components/block-tools/use-show-block-tools.js.map +1 -1
  244. package/build-module/components/block-tools/zoom-out-mode-inserters.js +20 -29
  245. package/build-module/components/block-tools/zoom-out-mode-inserters.js.map +1 -1
  246. package/build-module/components/block-variation-transforms/index.js +2 -2
  247. package/build-module/components/block-variation-transforms/index.js.map +1 -1
  248. package/build-module/components/block-vertical-alignment-control/ui.js +6 -10
  249. package/build-module/components/block-vertical-alignment-control/ui.js.map +1 -1
  250. package/build-module/components/border-radius-control/linked-button.js +8 -11
  251. package/build-module/components/border-radius-control/linked-button.js.map +1 -1
  252. package/build-module/components/collab/block-comment-icon-slot.js +11 -0
  253. package/build-module/components/collab/block-comment-icon-slot.js.map +1 -0
  254. package/build-module/components/collab/block-comment-icon-toolbar-slot.js +11 -0
  255. package/build-module/components/collab/block-comment-icon-toolbar-slot.js.map +1 -0
  256. package/build-module/components/colors-gradients/use-multiple-origin-colors-and-gradients.js +7 -1
  257. package/build-module/components/colors-gradients/use-multiple-origin-colors-and-gradients.js.map +1 -1
  258. package/build-module/components/convert-to-group-buttons/toolbar.js +4 -4
  259. package/build-module/components/convert-to-group-buttons/toolbar.js.map +1 -1
  260. package/build-module/components/global-styles/color-panel.js +2 -5
  261. package/build-module/components/global-styles/color-panel.js.map +1 -1
  262. package/build-module/components/global-styles/dimensions-panel.js +26 -14
  263. package/build-module/components/global-styles/dimensions-panel.js.map +1 -1
  264. package/build-module/components/global-styles/use-global-styles-context.native.js +6 -0
  265. package/build-module/components/global-styles/use-global-styles-context.native.js.map +1 -1
  266. package/build-module/components/iframe/get-compatibility-styles.js +4 -4
  267. package/build-module/components/iframe/get-compatibility-styles.js.map +1 -1
  268. package/build-module/components/iframe/index.js +33 -22
  269. package/build-module/components/iframe/index.js.map +1 -1
  270. package/build-module/components/image-size-control/index.js +62 -21
  271. package/build-module/components/image-size-control/index.js.map +1 -1
  272. package/build-module/components/inner-blocks/index.js +9 -5
  273. package/build-module/components/inner-blocks/index.js.map +1 -1
  274. package/build-module/components/inserter/block-patterns-explorer/pattern-list.js +2 -2
  275. package/build-module/components/inserter/block-patterns-explorer/pattern-list.js.map +1 -1
  276. package/build-module/components/inserter/block-patterns-tab/index.js +1 -2
  277. package/build-module/components/inserter/block-patterns-tab/index.js.map +1 -1
  278. package/build-module/components/inserter/block-patterns-tab/pattern-category-previews.js +6 -4
  279. package/build-module/components/inserter/block-patterns-tab/pattern-category-previews.js.map +1 -1
  280. package/build-module/components/inserter/block-patterns-tab/patterns-filter.js +1 -1
  281. package/build-module/components/inserter/block-patterns-tab/patterns-filter.js.map +1 -1
  282. package/build-module/components/inserter/block-patterns-tab/use-pattern-categories.js +4 -1
  283. package/build-module/components/inserter/block-patterns-tab/use-pattern-categories.js.map +1 -1
  284. package/build-module/components/inserter/block-patterns-tab/utils.js +4 -0
  285. package/build-module/components/inserter/block-patterns-tab/utils.js.map +1 -1
  286. package/build-module/components/inserter/category-tabs/index.js +15 -2
  287. package/build-module/components/inserter/category-tabs/index.js.map +1 -1
  288. package/build-module/components/inserter/hooks/use-block-types-state.js +1 -1
  289. package/build-module/components/inserter/hooks/use-block-types-state.js.map +1 -1
  290. package/build-module/components/inserter/hooks/use-patterns-paging.js +1 -6
  291. package/build-module/components/inserter/hooks/use-patterns-paging.js.map +1 -1
  292. package/build-module/components/inserter/menu.js +5 -3
  293. package/build-module/components/inserter/menu.js.map +1 -1
  294. package/build-module/components/inserter/search-results.js +0 -2
  295. package/build-module/components/inserter/search-results.js.map +1 -1
  296. package/build-module/components/inserter-button/index.native.js +1 -1
  297. package/build-module/components/inserter-button/index.native.js.map +1 -1
  298. package/build-module/components/inspector-controls-tabs/index.js +0 -2
  299. package/build-module/components/inspector-controls-tabs/index.js.map +1 -1
  300. package/build-module/components/inspector-controls-tabs/utils.js +3 -6
  301. package/build-module/components/inspector-controls-tabs/utils.js.map +1 -1
  302. package/build-module/components/link-control/link-preview.js +13 -10
  303. package/build-module/components/link-control/link-preview.js.map +1 -1
  304. package/build-module/components/list-view/appender.js +4 -3
  305. package/build-module/components/list-view/appender.js.map +1 -1
  306. package/build-module/components/list-view/branch.js +7 -6
  307. package/build-module/components/list-view/branch.js.map +1 -1
  308. package/build-module/components/list-view/index.js +1 -2
  309. package/build-module/components/list-view/index.js.map +1 -1
  310. package/build-module/components/media-placeholder/index.js +4 -4
  311. package/build-module/components/media-placeholder/index.js.map +1 -1
  312. package/build-module/components/provider/index.js +1 -1
  313. package/build-module/components/provider/index.js.map +1 -1
  314. package/build-module/components/rich-text/event-listeners/index.js +4 -2
  315. package/build-module/components/rich-text/event-listeners/index.js.map +1 -1
  316. package/build-module/components/rich-text/index.js +1 -1
  317. package/build-module/components/rich-text/index.js.map +1 -1
  318. package/build-module/components/rich-text/index.native.js +2 -6
  319. package/build-module/components/rich-text/index.native.js.map +1 -1
  320. package/build-module/components/spacing-sizes-control/index.js +3 -3
  321. package/build-module/components/spacing-sizes-control/index.js.map +1 -1
  322. package/build-module/components/spacing-sizes-control/input-controls/spacing-input-control.js +4 -4
  323. package/build-module/components/spacing-sizes-control/input-controls/spacing-input-control.js.map +1 -1
  324. package/build-module/components/spacing-sizes-control/linked-button.js +2 -6
  325. package/build-module/components/spacing-sizes-control/linked-button.js.map +1 -1
  326. package/build-module/components/tabbed-sidebar/index.js +1 -1
  327. package/build-module/components/tabbed-sidebar/index.js.map +1 -1
  328. package/build-module/components/tool-selector/index.js +1 -4
  329. package/build-module/components/tool-selector/index.js.map +1 -1
  330. package/build-module/components/url-input/index.js +4 -2
  331. package/build-module/components/url-input/index.js.map +1 -1
  332. package/build-module/components/use-block-commands/index.js +5 -5
  333. package/build-module/components/use-block-commands/index.js.map +1 -1
  334. package/build-module/components/use-block-drop-zone/index.js +5 -5
  335. package/build-module/components/use-block-drop-zone/index.js.map +1 -1
  336. package/build-module/components/use-block-drop-zone/index.native.js +0 -1
  337. package/build-module/components/use-block-drop-zone/index.native.js.map +1 -1
  338. package/build-module/components/use-moving-animation/index.js +1 -3
  339. package/build-module/components/use-moving-animation/index.js.map +1 -1
  340. package/build-module/components/use-settings/index.js +1 -3
  341. package/build-module/components/use-settings/index.js.map +1 -1
  342. package/build-module/components/writing-flow/index.js +5 -3
  343. package/build-module/components/writing-flow/index.js.map +1 -1
  344. package/build-module/components/writing-flow/use-tab-nav.js +2 -3
  345. package/build-module/components/writing-flow/use-tab-nav.js.map +1 -1
  346. package/build-module/hooks/block-bindings.js +20 -9
  347. package/build-module/hooks/block-bindings.js.map +1 -1
  348. package/build-module/hooks/contrast-checker.js +0 -1
  349. package/build-module/hooks/contrast-checker.js.map +1 -1
  350. package/build-module/hooks/duotone.js +2 -2
  351. package/build-module/hooks/duotone.js.map +1 -1
  352. package/build-module/hooks/font-family.js +1 -1
  353. package/build-module/hooks/font-family.js.map +1 -1
  354. package/build-module/hooks/style.js +4 -1
  355. package/build-module/hooks/style.js.map +1 -1
  356. package/build-module/hooks/supports.js +6 -6
  357. package/build-module/hooks/supports.js.map +1 -1
  358. package/build-module/hooks/typography.js +5 -5
  359. package/build-module/hooks/typography.js.map +1 -1
  360. package/build-module/hooks/use-zoom-out.js +15 -23
  361. package/build-module/hooks/use-zoom-out.js.map +1 -1
  362. package/build-module/hooks/utils.js +2 -2
  363. package/build-module/hooks/utils.js.map +1 -1
  364. package/build-module/index.js +1 -1
  365. package/build-module/index.js.map +1 -1
  366. package/build-module/lock-unlock.js.map +1 -1
  367. package/build-module/private-apis.js +7 -5
  368. package/build-module/private-apis.js.map +1 -1
  369. package/build-module/store/actions.js +2 -33
  370. package/build-module/store/actions.js.map +1 -1
  371. package/build-module/store/defaults.js +1 -1
  372. package/build-module/store/defaults.js.map +1 -1
  373. package/build-module/store/private-actions.js +54 -7
  374. package/build-module/store/private-actions.js.map +1 -1
  375. package/build-module/store/private-selectors.js +10 -21
  376. package/build-module/store/private-selectors.js.map +1 -1
  377. package/build-module/store/reducer.js +16 -6
  378. package/build-module/store/reducer.js.map +1 -1
  379. package/build-module/store/selectors.js +54 -16
  380. package/build-module/store/selectors.js.map +1 -1
  381. package/build-module/store/utils.js +3 -3
  382. package/build-module/store/utils.js.map +1 -1
  383. package/build-module/utils/dom.js +35 -16
  384. package/build-module/utils/dom.js.map +1 -1
  385. package/build-module/utils/get-font-styles-and-weights.js +2 -2
  386. package/build-module/utils/get-font-styles-and-weights.js.map +1 -1
  387. package/build-module/utils/transform-styles/index.js +3 -2
  388. package/build-module/utils/transform-styles/index.js.map +1 -1
  389. package/build-style/content-rtl.css +16 -10
  390. package/build-style/content.css +16 -10
  391. package/build-style/style-rtl.css +47 -25
  392. package/build-style/style.css +47 -25
  393. package/build-types/utils/dom.d.ts +7 -9
  394. package/build-types/utils/dom.d.ts.map +1 -1
  395. package/package.json +34 -32
  396. package/src/autocompleters/block.js +16 -7
  397. package/src/components/block-canvas/index.js +17 -1
  398. package/src/components/block-canvas/style.scss +3 -1
  399. package/src/components/block-card/index.js +3 -3
  400. package/src/components/block-full-height-alignment-control/index.js +1 -1
  401. package/src/components/block-inspector/style.scss +2 -7
  402. package/src/components/block-list/block.js +29 -50
  403. package/src/components/block-list/block.native.js +0 -4
  404. package/src/components/block-list/content.scss +1 -1
  405. package/src/components/block-list/index.js +4 -4
  406. package/src/components/block-list/use-block-props/index.js +0 -2
  407. package/src/components/block-list/use-block-props/use-focus-first-element.js +5 -3
  408. package/src/components/block-list/use-block-props/use-selected-block-event-handlers.js +7 -20
  409. package/src/components/block-list/use-in-between-inserter.js +1 -1
  410. package/src/components/block-patterns-list/README.md +8 -8
  411. package/src/components/block-patterns-list/index.js +35 -51
  412. package/src/components/block-patterns-list/stories/fixtures.js +834 -0
  413. package/src/components/block-patterns-list/stories/index.story.js +64 -0
  414. package/src/components/block-patterns-list/style.scss +2 -0
  415. package/src/components/block-patterns-paging/index.js +1 -1
  416. package/src/components/block-popover/index.js +4 -66
  417. package/src/components/block-preview/async.js +43 -0
  418. package/src/components/block-preview/index.js +8 -3
  419. package/src/components/block-settings-menu/block-settings-dropdown.js +4 -0
  420. package/src/components/block-settings-menu/index.js +3 -0
  421. package/src/components/block-toolbar/change-design.js +127 -0
  422. package/src/components/block-toolbar/index.js +25 -8
  423. package/src/components/block-toolbar/style.scss +16 -0
  424. package/src/components/block-tools/index.js +30 -27
  425. package/src/components/block-tools/insertion-point.js +4 -3
  426. package/src/components/block-tools/style.scss +12 -20
  427. package/src/components/block-tools/use-block-toolbar-popover-props.js +2 -2
  428. package/src/components/block-tools/use-show-block-tools.js +3 -14
  429. package/src/components/block-tools/zoom-out-mode-inserters.js +25 -40
  430. package/src/components/block-variation-transforms/index.js +2 -2
  431. package/src/components/block-vertical-alignment-control/ui.js +11 -15
  432. package/src/components/border-radius-control/linked-button.js +9 -11
  433. package/src/components/collab/block-comment-icon-slot.js +12 -0
  434. package/src/components/collab/block-comment-icon-toolbar-slot.js +12 -0
  435. package/src/components/colors-gradients/use-multiple-origin-colors-and-gradients.js +7 -1
  436. package/src/components/convert-to-group-buttons/toolbar.js +4 -4
  437. package/src/components/default-block-appender/content.scss +13 -19
  438. package/src/components/global-styles/color-panel.js +2 -10
  439. package/src/components/global-styles/dimensions-panel.js +22 -16
  440. package/src/components/global-styles/test/use-global-styles-context.native.js +1 -0
  441. package/src/components/global-styles/use-global-styles-context.native.js +6 -0
  442. package/src/components/iframe/content.scss +4 -9
  443. package/src/components/iframe/get-compatibility-styles.js +4 -9
  444. package/src/components/iframe/index.js +48 -34
  445. package/src/components/iframe/style.scss +2 -3
  446. package/src/components/image-size-control/index.js +74 -43
  447. package/src/components/image-size-control/test/index.js +5 -63
  448. package/src/components/inner-blocks/index.js +12 -6
  449. package/src/components/inserter/block-patterns-explorer/pattern-list.js +3 -6
  450. package/src/components/inserter/block-patterns-tab/index.js +0 -1
  451. package/src/components/inserter/block-patterns-tab/pattern-category-previews.js +10 -4
  452. package/src/components/inserter/block-patterns-tab/patterns-filter.js +1 -1
  453. package/src/components/inserter/block-patterns-tab/use-pattern-categories.js +8 -0
  454. package/src/components/inserter/block-patterns-tab/utils.js +5 -0
  455. package/src/components/inserter/category-tabs/index.js +16 -2
  456. package/src/components/inserter/hooks/use-block-types-state.js +6 -1
  457. package/src/components/inserter/hooks/use-patterns-paging.js +1 -6
  458. package/src/components/inserter/menu.js +6 -4
  459. package/src/components/inserter/search-results.js +0 -6
  460. package/src/components/inserter/style.scss +13 -0
  461. package/src/components/inserter-button/index.native.js +1 -1
  462. package/src/components/inspector-controls-tabs/index.js +1 -6
  463. package/src/components/inspector-controls-tabs/utils.js +0 -3
  464. package/src/components/link-control/link-preview.js +15 -8
  465. package/src/components/link-control/test/index.js +63 -24
  466. package/src/components/list-view/appender.js +5 -6
  467. package/src/components/list-view/branch.js +8 -6
  468. package/src/components/list-view/index.js +1 -2
  469. package/src/components/media-placeholder/index.js +4 -4
  470. package/src/components/provider/index.js +1 -3
  471. package/src/components/provider/test/experimental-provider.js +43 -1
  472. package/src/components/rich-text/event-listeners/index.js +4 -2
  473. package/src/components/rich-text/index.js +8 -1
  474. package/src/components/rich-text/index.native.js +0 -2
  475. package/src/components/spacing-sizes-control/index.js +3 -3
  476. package/src/components/spacing-sizes-control/input-controls/spacing-input-control.js +4 -4
  477. package/src/components/spacing-sizes-control/linked-button.js +2 -12
  478. package/src/components/tabbed-sidebar/index.js +1 -1
  479. package/src/components/tabbed-sidebar/style.scss +1 -1
  480. package/src/components/tool-selector/index.js +1 -5
  481. package/src/components/url-input/index.js +4 -5
  482. package/src/components/use-block-commands/index.js +245 -234
  483. package/src/components/use-block-drop-zone/index.js +5 -5
  484. package/src/components/use-block-drop-zone/index.native.js +0 -1
  485. package/src/components/use-moving-animation/index.js +0 -1
  486. package/src/components/use-settings/index.js +0 -1
  487. package/src/components/writing-flow/index.js +5 -3
  488. package/src/components/writing-flow/use-tab-nav.js +1 -2
  489. package/src/hooks/block-bindings.js +48 -31
  490. package/src/hooks/contrast-checker.js +0 -1
  491. package/src/hooks/duotone.js +2 -2
  492. package/src/hooks/font-family.js +1 -1
  493. package/src/hooks/style.js +7 -3
  494. package/src/hooks/supports.js +6 -6
  495. package/src/hooks/typography.js +5 -5
  496. package/src/hooks/use-zoom-out.js +14 -34
  497. package/src/hooks/utils.js +7 -2
  498. package/src/index.js +0 -1
  499. package/src/private-apis.js +6 -3
  500. package/src/store/actions.js +3 -52
  501. package/src/store/defaults.js +2 -1
  502. package/src/store/private-actions.js +71 -8
  503. package/src/store/private-selectors.js +14 -25
  504. package/src/store/reducer.js +25 -11
  505. package/src/store/selectors.js +116 -53
  506. package/src/store/test/actions.js +41 -0
  507. package/src/store/test/private-selectors.js +5 -0
  508. package/src/store/test/reducer.js +23 -0
  509. package/src/store/utils.js +12 -11
  510. package/src/utils/dom.js +42 -17
  511. package/src/utils/get-font-styles-and-weights.js +2 -2
  512. package/src/utils/test/dom.js +224 -0
  513. package/src/utils/transform-styles/index.js +3 -2
  514. package/tsconfig.json +1 -0
  515. package/tsconfig.tsbuildinfo +1 -1
  516. package/build/components/block-list/use-block-props/use-zoom-out-mode-exit.js +0 -57
  517. package/build/components/block-list/use-block-props/use-zoom-out-mode-exit.js.map +0 -1
  518. package/build/components/block-toolbar/shuffle.js +0 -110
  519. package/build/components/block-toolbar/shuffle.js.map +0 -1
  520. package/build/components/block-tools/zoom-out-popover.js +0 -58
  521. package/build/components/block-tools/zoom-out-popover.js.map +0 -1
  522. package/build/components/block-tools/zoom-out-toolbar.js +0 -132
  523. package/build/components/block-tools/zoom-out-toolbar.js.map +0 -1
  524. package/build/components/block-vertical-alignment-control/icons.js +0 -48
  525. package/build/components/block-vertical-alignment-control/icons.js.map +0 -1
  526. package/build-module/components/block-list/use-block-props/use-zoom-out-mode-exit.js +0 -51
  527. package/build-module/components/block-list/use-block-props/use-zoom-out-mode-exit.js.map +0 -1
  528. package/build-module/components/block-toolbar/shuffle.js +0 -103
  529. package/build-module/components/block-toolbar/shuffle.js.map +0 -1
  530. package/build-module/components/block-tools/zoom-out-popover.js +0 -49
  531. package/build-module/components/block-tools/zoom-out-popover.js.map +0 -1
  532. package/build-module/components/block-tools/zoom-out-toolbar.js +0 -124
  533. package/build-module/components/block-tools/zoom-out-toolbar.js.map +0 -1
  534. package/build-module/components/block-vertical-alignment-control/icons.js +0 -41
  535. package/build-module/components/block-vertical-alignment-control/icons.js.map +0 -1
  536. package/src/components/block-list/use-block-props/use-zoom-out-mode-exit.js +0 -65
  537. package/src/components/block-toolbar/shuffle.js +0 -111
  538. package/src/components/block-tools/zoom-out-popover.js +0 -47
  539. package/src/components/block-tools/zoom-out-toolbar.js +0 -135
  540. package/src/components/block-vertical-alignment-control/icons.js +0 -34
  541. /package/src/{lock-unlock.js → lock-unlock.ts} +0 -0
@@ -0,0 +1,64 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import blockLibraryStyles from '!!raw-loader!../../../../../block-library/build-style/style.css';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import BlockPatternsList from '../';
10
+ import { ExperimentalBlockEditorProvider } from '../../provider';
11
+ import patterns from './fixtures';
12
+
13
+ const blockEditorSettings = {
14
+ styles: [ { css: blockLibraryStyles } ],
15
+ };
16
+
17
+ export default {
18
+ component: BlockPatternsList,
19
+ title: 'BlockEditor/BlockPatternsList',
20
+ };
21
+
22
+ export const Default = {
23
+ render: function Template( props ) {
24
+ return (
25
+ <ExperimentalBlockEditorProvider settings={ blockEditorSettings }>
26
+ <BlockPatternsList { ...props } />
27
+ </ExperimentalBlockEditorProvider>
28
+ );
29
+ },
30
+ args: {
31
+ blockPatterns: patterns,
32
+ isDraggable: false,
33
+ label: 'Block patterns story',
34
+ showTitlesAsTooltip: false,
35
+ },
36
+ argTypes: {
37
+ blockPatterns: { description: 'The patterns to render.' },
38
+ shownPatterns: {
39
+ description:
40
+ 'Usually this component is used with `useAsyncList` for performance reasons and you should provide the returned list from that hook. Alternatively it should have the same value with `blockPatterns`.',
41
+ },
42
+ onClickPattern: { type: 'function' },
43
+ onHover: { type: 'function' },
44
+ showTitlesAsTooltip: {
45
+ description:
46
+ 'Whether to render the title of each pattern as a tooltip. If enabled',
47
+ },
48
+ orientation: {
49
+ description: 'Orientation for the underlying composite widget.',
50
+ table: {
51
+ defaultValue: { summary: 'both' },
52
+ type: { summary: 'string' },
53
+ },
54
+ },
55
+ category: { description: 'The currently selected pattern category.' },
56
+ isDraggable: {
57
+ description: 'Whether the pattern list item should be draggable.',
58
+ },
59
+ },
60
+ parameters: {
61
+ actions: { argTypesRegex: '^on.*' },
62
+ controls: { expanded: true },
63
+ },
64
+ };
@@ -26,6 +26,8 @@
26
26
  // the bottom margin set on `...__list-item` above
27
27
  scroll-margin-bottom: ($grid-unit-40 + $grid-unit-30);
28
28
 
29
+ outline: 0;
30
+
29
31
  .block-editor-block-patterns-list__item-title {
30
32
  flex-grow: 1;
31
33
  font-size: $helptext-font-size;
@@ -62,7 +62,7 @@ export default function Pagination( {
62
62
  </HStack>
63
63
  <Text variant="muted">
64
64
  { sprintf(
65
- // translators: %1$s: Current page number, %2$s: Total number of pages.
65
+ // translators: 1: Current page number. 2: Total number of pages.
66
66
  _x( '%1$s of %2$s', 'paging' ),
67
67
  currentPage,
68
68
  numPages
@@ -8,7 +8,6 @@ import clsx from 'clsx';
8
8
  */
9
9
  import { useMergeRefs } from '@wordpress/compose';
10
10
  import { Popover } from '@wordpress/components';
11
- import { useSelect } from '@wordpress/data';
12
11
  import {
13
12
  forwardRef,
14
13
  useMemo,
@@ -21,9 +20,7 @@ import {
21
20
  */
22
21
  import { useBlockElement } from '../block-list/use-block-props/use-block-refs';
23
22
  import usePopoverScroll from './use-popover-scroll';
24
- import { rectUnion, getVisibleElementBounds } from '../../utils/dom';
25
- import { store as blockEditorStore } from '../../store';
26
- import { unlock } from '../../lock-unlock';
23
+ import { rectUnion, getElementBounds } from '../../utils/dom';
27
24
 
28
25
  const MAX_POPOVER_RECOMPUTE_COUNTER = Number.MAX_SAFE_INTEGER;
29
26
 
@@ -77,38 +74,12 @@ function BlockPopover(
77
74
  };
78
75
  }, [ selectedElement ] );
79
76
 
80
- const { isZoomOut, parentSectionBlock, isSectionSelected } = useSelect(
81
- ( select ) => {
82
- const {
83
- isZoomOut: isZoomOutSelector,
84
- getSectionRootClientId,
85
- getParentSectionBlock,
86
- getBlockOrder,
87
- } = unlock( select( blockEditorStore ) );
88
-
89
- return {
90
- isZoomOut: isZoomOutSelector(),
91
- parentSectionBlock:
92
- getParentSectionBlock( clientId ) ?? clientId,
93
- isSectionSelected: getBlockOrder(
94
- getSectionRootClientId()
95
- ).includes( clientId ),
96
- };
97
- },
98
- [ clientId ]
99
- );
100
-
101
- // This element is used to position the zoom out view vertical toolbar
102
- // correctly, relative to the selected section.
103
- const parentSectionElement = useBlockElement( parentSectionBlock );
104
-
105
77
  const popoverAnchor = useMemo( () => {
106
78
  if (
107
79
  // popoverDimensionsRecomputeCounter is by definition always equal or greater
108
80
  // than 0. This check is only there to satisfy the correctness of the
109
81
  // exhaustive-deps rule for the `useMemo` hook.
110
82
  popoverDimensionsRecomputeCounter < 0 ||
111
- ( isZoomOut && ! parentSectionElement ) ||
112
83
  ! selectedElement ||
113
84
  ( bottomClientId && ! lastSelectedElement )
114
85
  ) {
@@ -117,53 +88,20 @@ function BlockPopover(
117
88
 
118
89
  return {
119
90
  getBoundingClientRect() {
120
- // The zoom out view has a vertical block toolbar that should always
121
- // be on the edge of the canvas, aligned to the top of the currently
122
- // selected section. This condition changes the anchor of the toolbar
123
- // to the section instead of the block to handle blocks that are
124
- // not full width and nested blocks to keep section height.
125
- if ( isZoomOut && isSectionSelected ) {
126
- // Compute the height based on the parent section of the
127
- // selected block, because the selected block may be
128
- // shorter than the section.
129
- const canvasElementRect = getVisibleElementBounds(
130
- __unstableContentRef.current
131
- );
132
- const parentSectionElementRect =
133
- getVisibleElementBounds( parentSectionElement );
134
- const anchorHeight =
135
- parentSectionElementRect.bottom -
136
- parentSectionElementRect.top;
137
-
138
- // Always use the width of the section root element to make sure
139
- // the toolbar is always on the edge of the canvas.
140
- const anchorWidth = canvasElementRect.width;
141
- return new window.DOMRectReadOnly(
142
- canvasElementRect.left,
143
- parentSectionElementRect.top,
144
- anchorWidth,
145
- anchorHeight
146
- );
147
- }
148
-
149
91
  return lastSelectedElement
150
92
  ? rectUnion(
151
- getVisibleElementBounds( selectedElement ),
152
- getVisibleElementBounds( lastSelectedElement )
93
+ getElementBounds( selectedElement ),
94
+ getElementBounds( lastSelectedElement )
153
95
  )
154
- : getVisibleElementBounds( selectedElement );
96
+ : getElementBounds( selectedElement );
155
97
  },
156
98
  contextElement: selectedElement,
157
99
  };
158
100
  }, [
159
101
  popoverDimensionsRecomputeCounter,
160
- isZoomOut,
161
- parentSectionElement,
162
102
  selectedElement,
163
103
  bottomClientId,
164
104
  lastSelectedElement,
165
- isSectionSelected,
166
- __unstableContentRef,
167
105
  ] );
168
106
 
169
107
  if ( ! selectedElement || ( bottomClientId && ! lastSelectedElement ) ) {
@@ -0,0 +1,43 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useEffect, useState, flushSync } from '@wordpress/element';
5
+ import { createQueue } from '@wordpress/priority-queue';
6
+
7
+ const blockPreviewQueue = createQueue();
8
+
9
+ /**
10
+ * Renders a component at the next idle time.
11
+ * @param {*} props
12
+ */
13
+ export function Async( { children, placeholder } ) {
14
+ const [ shouldRender, setShouldRender ] = useState( false );
15
+
16
+ // In the future, we could try to use startTransition here, but currently
17
+ // react will batch all transitions, which means all previews will be
18
+ // rendered at the same time.
19
+ // https://react.dev/reference/react/startTransition#caveats
20
+ // > If there are multiple ongoing Transitions, React currently batches them
21
+ // > together. This is a limitation that will likely be removed in a future
22
+ // > release.
23
+
24
+ useEffect( () => {
25
+ const context = {};
26
+ blockPreviewQueue.add( context, () => {
27
+ // Synchronously run all renders so it consumes timeRemaining.
28
+ // See https://github.com/WordPress/gutenberg/pull/48238
29
+ flushSync( () => {
30
+ setShouldRender( true );
31
+ } );
32
+ } );
33
+ return () => {
34
+ blockPreviewQueue.cancel( context );
35
+ };
36
+ }, [] );
37
+
38
+ if ( ! shouldRender ) {
39
+ return placeholder;
40
+ }
41
+
42
+ return children;
43
+ }
@@ -19,6 +19,7 @@ import AutoHeightBlockPreview from './auto';
19
19
  import EditorStyles from '../editor-styles';
20
20
  import { store as blockEditorStore } from '../../store';
21
21
  import { BlockListItems } from '../block-list';
22
+ import { Async } from './async';
22
23
 
23
24
  const EMPTY_ADDITIONAL_STYLES = [];
24
25
 
@@ -59,7 +60,7 @@ export function BlockPreview( {
59
60
  () => ( {
60
61
  ...originalSettings,
61
62
  focusMode: false, // Disable "Spotlight mode".
62
- __unstableIsPreviewMode: true,
63
+ isPreviewMode: true,
63
64
  } ),
64
65
  [ originalSettings ]
65
66
  );
@@ -86,6 +87,10 @@ export function BlockPreview( {
86
87
  );
87
88
  }
88
89
 
90
+ const MemoizedBlockPreview = memo( BlockPreview );
91
+
92
+ MemoizedBlockPreview.Async = Async;
93
+
89
94
  /**
90
95
  * BlockPreview renders a preview of a block or array of blocks.
91
96
  *
@@ -97,7 +102,7 @@ export function BlockPreview( {
97
102
  *
98
103
  * @return {Component} The component to be rendered.
99
104
  */
100
- export default memo( BlockPreview );
105
+ export default MemoizedBlockPreview;
101
106
 
102
107
  /**
103
108
  * This hook is used to lightly mark an element as a block preview wrapper
@@ -124,7 +129,7 @@ export function useBlockPreview( { blocks, props = {}, layout } ) {
124
129
  ...originalSettings,
125
130
  styles: undefined, // Clear styles included by the parent settings, as they are already output by the parent's EditorStyles.
126
131
  focusMode: false, // Disable "Spotlight mode".
127
- __unstableIsPreviewMode: true,
132
+ isPreviewMode: true,
128
133
  } ),
129
134
  [ originalSettings ]
130
135
  );
@@ -19,6 +19,7 @@ import { pipe, useCopyToClipboard } from '@wordpress/compose';
19
19
  * Internal dependencies
20
20
  */
21
21
  import BlockActions from '../block-actions';
22
+ import __unstableCommentIconFill from '../../components/collab/block-comment-icon-slot';
22
23
  import BlockHTMLConvertButton from './block-html-convert-button';
23
24
  import __unstableBlockSettingsMenuFirstItem from './block-settings-menu-first-item';
24
25
  import BlockSettingsMenuControls from '../block-settings-menu-controls';
@@ -294,6 +295,9 @@ export function BlockSettingsDropdown( {
294
295
  </MenuItem>
295
296
  </>
296
297
  ) }
298
+ <__unstableCommentIconFill.Slot
299
+ fillProps={ { onClose } }
300
+ />
297
301
  </MenuGroup>
298
302
  { canCopyStyles && ! isContentOnly && (
299
303
  <MenuGroup>
@@ -7,10 +7,13 @@ import { ToolbarGroup, ToolbarItem } from '@wordpress/components';
7
7
  * Internal dependencies
8
8
  */
9
9
  import BlockSettingsDropdown from './block-settings-dropdown';
10
+ import __unstableCommentIconToolbarFill from '../../components/collab/block-comment-icon-toolbar-slot';
10
11
 
11
12
  export function BlockSettingsMenu( { clientIds, ...props } ) {
12
13
  return (
13
14
  <ToolbarGroup>
15
+ <__unstableCommentIconToolbarFill.Slot />
16
+
14
17
  <ToolbarItem>
15
18
  { ( toggleProps ) => (
16
19
  <BlockSettingsDropdown
@@ -0,0 +1,127 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import {
5
+ ToolbarButton,
6
+ ToolbarGroup,
7
+ Dropdown,
8
+ __experimentalDropdownContentWrapper as DropdownContentWrapper,
9
+ } from '@wordpress/components';
10
+ import { __ } from '@wordpress/i18n';
11
+ import { cloneBlock } from '@wordpress/blocks';
12
+ import { useMemo } from '@wordpress/element';
13
+ import { useSelect, useDispatch } from '@wordpress/data';
14
+
15
+ /**
16
+ * Internal dependencies
17
+ */
18
+ import { store as blockEditorStore } from '../../store';
19
+ import BlockPatternsList from '../block-patterns-list';
20
+
21
+ const EMPTY_ARRAY = [];
22
+ const MAX_PATTERNS_TO_SHOW = 6;
23
+ const POPOVER_PROPS = {
24
+ placement: 'bottom-start',
25
+ };
26
+
27
+ export default function ChangeDesign( { clientId } ) {
28
+ const { categories, currentPatternName, patterns } = useSelect(
29
+ ( select ) => {
30
+ const {
31
+ getBlockAttributes,
32
+ getBlockRootClientId,
33
+ __experimentalGetAllowedPatterns,
34
+ } = select( blockEditorStore );
35
+ const attributes = getBlockAttributes( clientId );
36
+ const _categories = attributes?.metadata?.categories || EMPTY_ARRAY;
37
+ const rootBlock = getBlockRootClientId( clientId );
38
+
39
+ // Calling `__experimentalGetAllowedPatterns` is expensive.
40
+ // Checking if the block can be changed prevents unnecessary selector calls.
41
+ // See: https://github.com/WordPress/gutenberg/pull/64736.
42
+ const _patterns =
43
+ _categories.length > 0
44
+ ? __experimentalGetAllowedPatterns( rootBlock )
45
+ : EMPTY_ARRAY;
46
+ return {
47
+ categories: _categories,
48
+ currentPatternName: attributes?.metadata?.patternName,
49
+ patterns: _patterns,
50
+ };
51
+ },
52
+ [ clientId ]
53
+ );
54
+ const { replaceBlocks } = useDispatch( blockEditorStore );
55
+ const sameCategoryPatternsWithSingleWrapper = useMemo( () => {
56
+ if ( categories.length === 0 || ! patterns || patterns.length === 0 ) {
57
+ return EMPTY_ARRAY;
58
+ }
59
+ return patterns
60
+ .filter( ( pattern ) => {
61
+ const isCorePattern =
62
+ pattern.source === 'core' ||
63
+ ( pattern.source?.startsWith( 'pattern-directory' ) &&
64
+ pattern.source !== 'pattern-directory/theme' );
65
+ return (
66
+ // Check if the pattern has only one top level block,
67
+ // otherwise we may switch to a pattern that doesn't have replacement suggestions.
68
+ pattern.blocks.length === 1 &&
69
+ // We exclude the core patterns and pattern directory patterns that are not theme patterns.
70
+ ! isCorePattern &&
71
+ // Exclude current pattern.
72
+ currentPatternName !== pattern.name &&
73
+ pattern.categories?.some( ( category ) => {
74
+ return categories.includes( category );
75
+ } ) &&
76
+ // Check if the pattern is not a synced pattern.
77
+ ( pattern.syncStatus === 'unsynced' || ! pattern.id )
78
+ );
79
+ } )
80
+ .slice( 0, MAX_PATTERNS_TO_SHOW );
81
+ }, [ categories, currentPatternName, patterns ] );
82
+
83
+ if ( sameCategoryPatternsWithSingleWrapper.length < 2 ) {
84
+ return null;
85
+ }
86
+
87
+ const onClickPattern = ( pattern ) => {
88
+ const newBlocks = ( pattern.blocks ?? [] ).map( ( block ) => {
89
+ return cloneBlock( block );
90
+ } );
91
+ newBlocks[ 0 ].attributes.metadata = {
92
+ ...newBlocks[ 0 ].attributes.metadata,
93
+ categories,
94
+ };
95
+ replaceBlocks( clientId, newBlocks );
96
+ };
97
+
98
+ return (
99
+ <Dropdown
100
+ popoverProps={ POPOVER_PROPS }
101
+ renderToggle={ ( { onToggle, isOpen } ) => {
102
+ return (
103
+ <ToolbarGroup>
104
+ <ToolbarButton
105
+ onClick={ () => onToggle( ! isOpen ) }
106
+ aria-expanded={ isOpen }
107
+ >
108
+ { __( 'Change design' ) }
109
+ </ToolbarButton>
110
+ </ToolbarGroup>
111
+ );
112
+ } }
113
+ renderContent={ () => (
114
+ <DropdownContentWrapper
115
+ className="block-editor-block-toolbar-change-design-content-wrapper"
116
+ paddingSize="none"
117
+ >
118
+ <BlockPatternsList
119
+ blockPatterns={ sameCategoryPatternsWithSingleWrapper }
120
+ onClickPattern={ onClickPattern }
121
+ showTitlesAsTooltip
122
+ />
123
+ </DropdownContentWrapper>
124
+ ) }
125
+ />
126
+ );
127
+ }
@@ -35,6 +35,7 @@ import { store as blockEditorStore } from '../../store';
35
35
  import __unstableBlockNameContext from './block-name-context';
36
36
  import NavigableToolbar from '../navigable-toolbar';
37
37
  import { useHasBlockToolbar } from './use-has-block-toolbar';
38
+ import ChangeDesign from './change-design';
38
39
  import { unlock } from '../../lock-unlock';
39
40
 
40
41
  /**
@@ -67,6 +68,10 @@ export function PrivateBlockToolbar( {
67
68
  isUsingBindings,
68
69
  hasParentPattern,
69
70
  hasContentOnlyLocking,
71
+ showShuffleButton,
72
+ showSlots,
73
+ showGroupButtons,
74
+ showLockButtons,
70
75
  } = useSelect( ( select ) => {
71
76
  const {
72
77
  getBlockName,
@@ -79,6 +84,7 @@ export function PrivateBlockToolbar( {
79
84
  getBlockParentsByBlockName,
80
85
  getTemplateLock,
81
86
  getParentSectionBlock,
87
+ isZoomOut,
82
88
  } = unlock( select( blockEditorStore ) );
83
89
  const selectedBlockClientIds = getSelectedBlockClientIds();
84
90
  const selectedBlockClientId = selectedBlockClientIds[ 0 ];
@@ -119,6 +125,7 @@ export function PrivateBlockToolbar( {
119
125
  shouldShowVisualToolbar: isValid && isVisual,
120
126
  toolbarKey: `${ selectedBlockClientId }${ parentClientId }`,
121
127
  showParentSelector:
128
+ ! isZoomOut() &&
122
129
  parentBlockType &&
123
130
  getBlockEditingMode( parentClientId ) !== 'disabled' &&
124
131
  hasBlockSupport(
@@ -130,6 +137,10 @@ export function PrivateBlockToolbar( {
130
137
  isUsingBindings: _isUsingBindings,
131
138
  hasParentPattern: _hasParentPattern,
132
139
  hasContentOnlyLocking: _hasTemplateLock,
140
+ showShuffleButton: isZoomOut(),
141
+ showSlots: ! isZoomOut(),
142
+ showGroupButtons: ! isZoomOut(),
143
+ showLockButtons: ! isZoomOut(),
133
144
  };
134
145
  }, [] );
135
146
 
@@ -179,7 +190,7 @@ export function PrivateBlockToolbar( {
179
190
  key={ toolbarKey }
180
191
  >
181
192
  <div ref={ toolbarWrapperRef } className={ innerClasses }>
182
- { ! isMultiToolbar && isLargeViewport && (
193
+ { showParentSelector && ! isMultiToolbar && isLargeViewport && (
183
194
  <BlockParentSelector />
184
195
  ) }
185
196
  { ( shouldShowVisualToolbar || isMultiToolbar ) &&
@@ -190,11 +201,13 @@ export function PrivateBlockToolbar( {
190
201
  >
191
202
  <ToolbarGroup className="block-editor-block-toolbar__block-controls">
192
203
  <BlockSwitcher clientIds={ blockClientIds } />
193
- { ! isMultiToolbar && isDefaultEditingMode && (
194
- <BlockLockToolbar
195
- clientId={ blockClientId }
196
- />
197
- ) }
204
+ { ! isMultiToolbar &&
205
+ isDefaultEditingMode &&
206
+ showLockButtons && (
207
+ <BlockLockToolbar
208
+ clientId={ blockClientId }
209
+ />
210
+ ) }
198
211
  <BlockMover
199
212
  clientIds={ blockClientIds }
200
213
  hideDragHandle={ hideDragHandle }
@@ -204,8 +217,12 @@ export function PrivateBlockToolbar( {
204
217
  ) }
205
218
  { ! hasContentOnlyLocking &&
206
219
  shouldShowVisualToolbar &&
207
- isMultiToolbar && <BlockGroupToolbar /> }
208
- { shouldShowVisualToolbar && (
220
+ isMultiToolbar &&
221
+ showGroupButtons && <BlockGroupToolbar /> }
222
+ { showShuffleButton && (
223
+ <ChangeDesign clientId={ blockClientIds[ 0 ] } />
224
+ ) }
225
+ { shouldShowVisualToolbar && showSlots && (
209
226
  <>
210
227
  <BlockControls.Slot
211
228
  group="parent"
@@ -285,3 +285,19 @@
285
285
  }
286
286
  }
287
287
  }
288
+
289
+ .block-editor-block-toolbar-change-design-content-wrapper {
290
+ padding: $grid-unit-15;
291
+ width: 320px;
292
+ .block-editor-block-patterns-list {
293
+ display: grid;
294
+ grid-template-columns: 1fr 1fr;
295
+ grid-gap: $grid-unit-15;
296
+ .block-editor-block-patterns-list__list-item {
297
+ margin-bottom: 0;
298
+ }
299
+ .block-editor-inserter__media-list__list-item {
300
+ min-height: 100px;
301
+ }
302
+ }
303
+ }
@@ -8,7 +8,7 @@ import { __unstableUseShortcutEventMatch as useShortcutEventMatch } from '@wordp
8
8
  import { useRef } from '@wordpress/element';
9
9
  import { switchToBlockType, store as blocksStore } from '@wordpress/blocks';
10
10
  import { speak } from '@wordpress/a11y';
11
- import { __ } from '@wordpress/i18n';
11
+ import { __, sprintf, _n } from '@wordpress/i18n';
12
12
 
13
13
  /**
14
14
  * Internal dependencies
@@ -19,7 +19,6 @@ import {
19
19
  default as InsertionPoint,
20
20
  } from './insertion-point';
21
21
  import BlockToolbarPopover from './block-toolbar-popover';
22
- import ZoomOutPopover from './zoom-out-popover';
23
22
  import { store as blockEditorStore } from '../../store';
24
23
  import usePopoverScroll from '../block-popover/use-popover-scroll';
25
24
  import ZoomOutModeInserters from './zoom-out-mode-inserters';
@@ -31,21 +30,19 @@ function selector( select ) {
31
30
  getSelectedBlockClientId,
32
31
  getFirstMultiSelectedBlockClientId,
33
32
  getSettings,
34
- __unstableGetEditorMode,
35
33
  isTyping,
36
34
  isDragging,
35
+ isZoomOut,
37
36
  } = unlock( select( blockEditorStore ) );
38
37
 
39
38
  const clientId =
40
39
  getSelectedBlockClientId() || getFirstMultiSelectedBlockClientId();
41
40
 
42
- const editorMode = __unstableGetEditorMode();
43
-
44
41
  return {
45
42
  clientId,
46
43
  hasFixedToolbar: getSettings().hasFixedToolbar,
47
44
  isTyping: isTyping(),
48
- isZoomOutMode: editorMode === 'zoom-out',
45
+ isZoomOutMode: isZoomOut(),
49
46
  isDragging: isDragging(),
50
47
  };
51
48
  }
@@ -75,11 +72,8 @@ export default function BlockTools( {
75
72
  isGroupable,
76
73
  } = useSelect( blockEditorStore );
77
74
  const { getGroupingBlockName } = useSelect( blocksStore );
78
- const {
79
- showEmptyBlockSideInserter,
80
- showBlockToolbarPopover,
81
- showZoomOutToolbar,
82
- } = useShowBlockTools();
75
+ const { showEmptyBlockSideInserter, showBlockToolbarPopover } =
76
+ useShowBlockTools();
83
77
 
84
78
  const {
85
79
  duplicateBlocks,
@@ -98,19 +92,35 @@ export default function BlockTools( {
98
92
  return;
99
93
  }
100
94
 
101
- if ( isMatch( 'core/block-editor/move-up', event ) ) {
102
- const clientIds = getSelectedBlockClientIds();
103
- if ( clientIds.length ) {
104
- event.preventDefault();
105
- const rootClientId = getBlockRootClientId( clientIds[ 0 ] );
106
- moveBlocksUp( clientIds, rootClientId );
107
- }
108
- } else if ( isMatch( 'core/block-editor/move-down', event ) ) {
95
+ if (
96
+ isMatch( 'core/block-editor/move-up', event ) ||
97
+ isMatch( 'core/block-editor/move-down', event )
98
+ ) {
109
99
  const clientIds = getSelectedBlockClientIds();
110
100
  if ( clientIds.length ) {
111
101
  event.preventDefault();
112
102
  const rootClientId = getBlockRootClientId( clientIds[ 0 ] );
113
- moveBlocksDown( clientIds, rootClientId );
103
+ const direction = isMatch( 'core/block-editor/move-up', event )
104
+ ? 'up'
105
+ : 'down';
106
+ if ( direction === 'up' ) {
107
+ moveBlocksUp( clientIds, rootClientId );
108
+ } else {
109
+ moveBlocksDown( clientIds, rootClientId );
110
+ }
111
+ const blockLength = Array.isArray( clientIds )
112
+ ? clientIds.length
113
+ : 1;
114
+ const message = sprintf(
115
+ // translators: %d: the name of the block that has been moved
116
+ _n(
117
+ '%d block moved.',
118
+ '%d blocks moved.',
119
+ clientIds.length
120
+ ),
121
+ blockLength
122
+ );
123
+ speak( message );
114
124
  }
115
125
  } else if ( isMatch( 'core/block-editor/duplicate', event ) ) {
116
126
  const clientIds = getSelectedBlockClientIds();
@@ -211,13 +221,6 @@ export default function BlockTools( {
211
221
  />
212
222
  ) }
213
223
 
214
- { showZoomOutToolbar && (
215
- <ZoomOutPopover
216
- __unstableContentRef={ __unstableContentRef }
217
- clientId={ clientId }
218
- />
219
- ) }
220
-
221
224
  { /* Used for the inline rich text toolbar. Until this toolbar is combined into BlockToolbar, someone implementing their own BlockToolbar will also need to use this to see the image caption toolbar. */ }
222
225
  { ! isZoomOutMode && ! hasFixedToolbar && (
223
226
  <Popover.Slot