@wordpress/block-editor 12.20.0 → 12.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (558) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/build/components/block-actions/index.js +47 -36
  3. package/build/components/block-actions/index.js.map +1 -1
  4. package/build/components/block-bindings-toolbar-indicator/index.js +25 -0
  5. package/build/components/block-bindings-toolbar-indicator/index.js.map +1 -0
  6. package/build/components/block-edit/context.js +2 -1
  7. package/build/components/block-edit/context.js.map +1 -1
  8. package/build/components/block-edit/index.js +8 -3
  9. package/build/components/block-edit/index.js.map +1 -1
  10. package/build/components/block-heading-level-dropdown/index.js +5 -5
  11. package/build/components/block-heading-level-dropdown/index.js.map +1 -1
  12. package/build/components/block-heading-level-dropdown/index.native.js +5 -4
  13. package/build/components/block-heading-level-dropdown/index.native.js.map +1 -1
  14. package/build/components/block-inspector/index.js +5 -4
  15. package/build/components/block-inspector/index.js.map +1 -1
  16. package/build/components/block-list/block-crash-boundary.native.js +49 -0
  17. package/build/components/block-list/block-crash-boundary.native.js.map +1 -0
  18. package/build/components/block-list/block-crash-warning.native.js +24 -0
  19. package/build/components/block-list/block-crash-warning.native.js.map +1 -0
  20. package/build/components/block-list/block-invalid-warning.native.js.map +1 -1
  21. package/build/components/block-list/block-list-item.native.js +1 -1
  22. package/build/components/block-list/block-list-item.native.js.map +1 -1
  23. package/build/components/block-list/block-outline.native.js +23 -7
  24. package/build/components/block-list/block-outline.native.js.map +1 -1
  25. package/build/components/block-list/block-selection-button.native.js.map +1 -1
  26. package/build/components/block-list/block.native.js +7 -5
  27. package/build/components/block-list/block.native.js.map +1 -1
  28. package/build/components/block-list/use-block-props/index.js +8 -1
  29. package/build/components/block-list/use-block-props/index.js.map +1 -1
  30. package/build/components/block-list/use-block-props/use-selected-block-event-handlers.js +3 -3
  31. package/build/components/block-list/use-block-props/use-selected-block-event-handlers.js.map +1 -1
  32. package/build/components/block-mover/index.native.js.map +1 -1
  33. package/build/components/block-popover/cover.js +68 -0
  34. package/build/components/block-popover/cover.js.map +1 -0
  35. package/build/components/block-popover/drop-zone.js +2 -3
  36. package/build/components/block-popover/drop-zone.js.map +1 -1
  37. package/build/components/block-popover/index.js +1 -19
  38. package/build/components/block-popover/index.js.map +1 -1
  39. package/build/components/block-preview/index.js +2 -1
  40. package/build/components/block-preview/index.js.map +1 -1
  41. package/build/components/block-removal-warning-modal/index.js +2 -4
  42. package/build/components/block-removal-warning-modal/index.js.map +1 -1
  43. package/build/components/block-rename/modal.js.map +1 -1
  44. package/build/components/block-settings/container.native.js +2 -1
  45. package/build/components/block-settings/container.native.js.map +1 -1
  46. package/build/components/block-settings-menu/block-settings-dropdown.js +41 -39
  47. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  48. package/build/components/block-settings-menu-controls/index.js +1 -3
  49. package/build/components/block-settings-menu-controls/index.js.map +1 -1
  50. package/build/components/block-switcher/block-transformations-menu.native.js.map +1 -1
  51. package/build/components/block-toolbar/block-toolbar-menu.native.js.map +1 -1
  52. package/build/components/block-toolbar/index.js +24 -11
  53. package/build/components/block-toolbar/index.js.map +1 -1
  54. package/build/components/block-toolbar/shuffle.js +89 -0
  55. package/build/components/block-toolbar/shuffle.js.map +1 -0
  56. package/build/components/block-toolbar/use-has-block-toolbar.js +43 -0
  57. package/build/components/block-toolbar/use-has-block-toolbar.js.map +1 -0
  58. package/build/components/block-tools/block-selection-button.js +5 -1
  59. package/build/components/block-tools/block-selection-button.js.map +1 -1
  60. package/build/components/block-tools/empty-block-inserter.js +2 -5
  61. package/build/components/block-tools/empty-block-inserter.js.map +1 -1
  62. package/build/components/block-tools/index.js +9 -26
  63. package/build/components/block-tools/index.js.map +1 -1
  64. package/build/components/block-tools/use-show-block-tools.js +60 -0
  65. package/build/components/block-tools/use-show-block-tools.js.map +1 -0
  66. package/build/components/caption/index.native.js.map +1 -1
  67. package/build/components/child-layout-control/index.js +108 -11
  68. package/build/components/child-layout-control/index.js.map +1 -1
  69. package/build/components/color-palette/control.js.map +1 -1
  70. package/build/components/colors-gradients/control.js +1 -1
  71. package/build/components/colors-gradients/control.js.map +1 -1
  72. package/build/components/convert-to-group-buttons/toolbar.js +11 -0
  73. package/build/components/convert-to-group-buttons/toolbar.js.map +1 -1
  74. package/build/components/global-styles/border-panel.js +21 -8
  75. package/build/components/global-styles/border-panel.js.map +1 -1
  76. package/build/components/global-styles/color-panel.js +1 -1
  77. package/build/components/global-styles/color-panel.js.map +1 -1
  78. package/build/components/global-styles/dimensions-panel.js +8 -33
  79. package/build/components/global-styles/dimensions-panel.js.map +1 -1
  80. package/build/components/global-styles/image-settings-panel.js.map +1 -1
  81. package/build/components/global-styles/index.js +6 -0
  82. package/build/components/global-styles/index.js.map +1 -1
  83. package/build/components/global-styles/shadow-panel-components.js +80 -23
  84. package/build/components/global-styles/shadow-panel-components.js.map +1 -1
  85. package/build/components/global-styles/typography-utils.js +7 -5
  86. package/build/components/global-styles/typography-utils.js.map +1 -1
  87. package/build/components/global-styles/use-global-styles-output.js +16 -16
  88. package/build/components/global-styles/use-global-styles-output.js.map +1 -1
  89. package/build/components/global-styles/utils.js +2 -4
  90. package/build/components/global-styles/utils.js.map +1 -1
  91. package/build/components/grid-visualizer/grid-item-resizer.js +77 -0
  92. package/build/components/grid-visualizer/grid-item-resizer.js.map +1 -0
  93. package/build/components/grid-visualizer/grid-visualizer.js +81 -0
  94. package/build/components/grid-visualizer/grid-visualizer.js.map +1 -0
  95. package/build/components/grid-visualizer/index.js +20 -0
  96. package/build/components/grid-visualizer/index.js.map +1 -0
  97. package/build/components/grid-visualizer/utils.js +10 -0
  98. package/build/components/grid-visualizer/utils.js.map +1 -0
  99. package/build/components/iframe/index.js +66 -17
  100. package/build/components/iframe/index.js.map +1 -1
  101. package/build/components/index.native.js +7 -0
  102. package/build/components/index.native.js.map +1 -1
  103. package/build/components/inner-blocks/use-nested-settings-update.js +8 -2
  104. package/build/components/inner-blocks/use-nested-settings-update.js.map +1 -1
  105. package/build/components/inserter/block-patterns-explorer/index.js +3 -6
  106. package/build/components/inserter/block-patterns-explorer/index.js.map +1 -1
  107. package/build/components/inserter/block-patterns-explorer/pattern-list.js +3 -1
  108. package/build/components/inserter/block-patterns-explorer/pattern-list.js.map +1 -1
  109. package/build/components/inserter/media-tab/media-preview.js.map +1 -1
  110. package/build/components/inserter/menu.native.js.map +1 -1
  111. package/build/components/inserter/mobile-tab-navigation.js +2 -2
  112. package/build/components/inserter/mobile-tab-navigation.js.map +1 -1
  113. package/build/components/inspector-controls/block-support-tools-panel.js.map +1 -1
  114. package/build/components/inspector-controls-tabs/advanced-controls-panel.native.js +36 -0
  115. package/build/components/inspector-controls-tabs/advanced-controls-panel.native.js.map +1 -0
  116. package/build/components/inspector-controls-tabs/index.js +1 -1
  117. package/build/components/inspector-controls-tabs/index.js.map +1 -1
  118. package/build/components/inspector-controls-tabs/styles-tab.js +1 -1
  119. package/build/components/inspector-controls-tabs/styles-tab.js.map +1 -1
  120. package/build/components/link-control/link-preview.js +4 -1
  121. package/build/components/link-control/link-preview.js.map +1 -1
  122. package/build/components/link-control/search-input.js.map +1 -1
  123. package/build/components/list-view/block-select-button.js +0 -2
  124. package/build/components/list-view/block-select-button.js.map +1 -1
  125. package/build/components/list-view/block.js +4 -11
  126. package/build/components/list-view/block.js.map +1 -1
  127. package/build/components/list-view/branch.js.map +1 -1
  128. package/build/components/list-view/drop-indicator.js.map +1 -1
  129. package/build/components/list-view/index.js.map +1 -1
  130. package/build/components/list-view/use-clipboard-handler.js +2 -1
  131. package/build/components/list-view/use-clipboard-handler.js.map +1 -1
  132. package/build/components/list-view/utils.js +5 -3
  133. package/build/components/list-view/utils.js.map +1 -1
  134. package/build/components/panel-color-settings/index.js.map +1 -1
  135. package/build/components/provider/index.js.map +1 -1
  136. package/build/components/resizable-box-popover/index.js +3 -5
  137. package/build/components/resizable-box-popover/index.js.map +1 -1
  138. package/build/components/responsive-block-control/index.js +1 -1
  139. package/build/components/responsive-block-control/index.js.map +1 -1
  140. package/build/components/rich-text/index.js +46 -26
  141. package/build/components/rich-text/index.js.map +1 -1
  142. package/build/components/rich-text/use-enter.js +3 -0
  143. package/build/components/rich-text/use-enter.js.map +1 -1
  144. package/build/components/spacing-sizes-control/input-controls/spacing-input-control.js.map +1 -1
  145. package/build/components/spacing-sizes-control/sides-dropdown/index.js +1 -1
  146. package/build/components/spacing-sizes-control/sides-dropdown/index.js.map +1 -1
  147. package/build/components/url-popover/index.js +3 -3
  148. package/build/components/url-popover/index.js.map +1 -1
  149. package/build/components/use-moving-animation/index.js +4 -0
  150. package/build/components/use-moving-animation/index.js.map +1 -1
  151. package/build/components/warning/index.native.js +9 -4
  152. package/build/components/warning/index.native.js.map +1 -1
  153. package/build/components/writing-flow/use-clipboard-handler.js +2 -1
  154. package/build/components/writing-flow/use-clipboard-handler.js.map +1 -1
  155. package/build/components/writing-flow/utils.js +23 -6
  156. package/build/components/writing-flow/utils.js.map +1 -1
  157. package/build/hooks/anchor.js +7 -8
  158. package/build/hooks/anchor.js.map +1 -1
  159. package/build/hooks/background.js +39 -2
  160. package/build/hooks/background.js.map +1 -1
  161. package/build/hooks/block-hooks.js +34 -8
  162. package/build/hooks/block-hooks.js.map +1 -1
  163. package/build/hooks/border.js +6 -4
  164. package/build/hooks/border.js.map +1 -1
  165. package/build/hooks/dimensions.js +3 -4
  166. package/build/hooks/dimensions.js.map +1 -1
  167. package/build/hooks/font-size.js +6 -7
  168. package/build/hooks/font-size.js.map +1 -1
  169. package/build/hooks/index.js +3 -2
  170. package/build/hooks/index.js.map +1 -1
  171. package/build/hooks/layout-child.js +67 -6
  172. package/build/hooks/layout-child.js.map +1 -1
  173. package/build/hooks/layout.js +32 -14
  174. package/build/hooks/layout.js.map +1 -1
  175. package/build/hooks/line-height.js.map +1 -1
  176. package/build/hooks/position.js +1 -1
  177. package/build/hooks/position.js.map +1 -1
  178. package/build/hooks/spacing-visualizer.js +115 -0
  179. package/build/hooks/spacing-visualizer.js.map +1 -0
  180. package/build/hooks/use-bindings-attributes.js +171 -48
  181. package/build/hooks/use-bindings-attributes.js.map +1 -1
  182. package/build/hooks/use-typography-props.js +1 -2
  183. package/build/hooks/use-typography-props.js.map +1 -1
  184. package/build/layouts/grid.js +6 -2
  185. package/build/layouts/grid.js.map +1 -1
  186. package/build/private-apis.js +7 -3
  187. package/build/private-apis.js.map +1 -1
  188. package/build/private-apis.native.js +3 -1
  189. package/build/private-apis.native.js.map +1 -1
  190. package/build/store/actions.js +42 -12
  191. package/build/store/actions.js.map +1 -1
  192. package/build/store/private-actions.js +29 -55
  193. package/build/store/private-actions.js.map +1 -1
  194. package/build/store/private-selectors.js +0 -8
  195. package/build/store/private-selectors.js.map +1 -1
  196. package/build/store/reducer.js +34 -46
  197. package/build/store/reducer.js.map +1 -1
  198. package/build/store/selectors.js +27 -15
  199. package/build/store/selectors.js.map +1 -1
  200. package/build-module/components/block-actions/index.js +47 -36
  201. package/build-module/components/block-actions/index.js.map +1 -1
  202. package/build-module/components/block-bindings-toolbar-indicator/index.js +18 -0
  203. package/build-module/components/block-bindings-toolbar-indicator/index.js.map +1 -0
  204. package/build-module/components/block-edit/context.js +1 -0
  205. package/build-module/components/block-edit/context.js.map +1 -1
  206. package/build-module/components/block-edit/index.js +9 -4
  207. package/build-module/components/block-edit/index.js.map +1 -1
  208. package/build-module/components/block-heading-level-dropdown/index.js +5 -5
  209. package/build-module/components/block-heading-level-dropdown/index.js.map +1 -1
  210. package/build-module/components/block-heading-level-dropdown/index.native.js +5 -4
  211. package/build-module/components/block-heading-level-dropdown/index.native.js.map +1 -1
  212. package/build-module/components/block-inspector/index.js +6 -5
  213. package/build-module/components/block-inspector/index.js.map +1 -1
  214. package/build-module/components/block-list/block-crash-boundary.native.js +42 -0
  215. package/build-module/components/block-list/block-crash-boundary.native.js.map +1 -0
  216. package/build-module/components/block-list/block-crash-warning.native.js +15 -0
  217. package/build-module/components/block-list/block-crash-warning.native.js.map +1 -0
  218. package/build-module/components/block-list/block-invalid-warning.native.js.map +1 -1
  219. package/build-module/components/block-list/block-list-item.native.js +1 -1
  220. package/build-module/components/block-list/block-list-item.native.js.map +1 -1
  221. package/build-module/components/block-list/block-outline.native.js +23 -7
  222. package/build-module/components/block-list/block-outline.native.js.map +1 -1
  223. package/build-module/components/block-list/block-selection-button.native.js.map +1 -1
  224. package/build-module/components/block-list/block.native.js +7 -5
  225. package/build-module/components/block-list/block.native.js.map +1 -1
  226. package/build-module/components/block-list/use-block-props/index.js +9 -2
  227. package/build-module/components/block-list/use-block-props/index.js.map +1 -1
  228. package/build-module/components/block-list/use-block-props/use-selected-block-event-handlers.js +3 -3
  229. package/build-module/components/block-list/use-block-props/use-selected-block-event-handlers.js.map +1 -1
  230. package/build-module/components/block-mover/index.native.js.map +1 -1
  231. package/build-module/components/block-popover/cover.js +60 -0
  232. package/build-module/components/block-popover/cover.js.map +1 -0
  233. package/build-module/components/block-popover/drop-zone.js +2 -3
  234. package/build-module/components/block-popover/drop-zone.js.map +1 -1
  235. package/build-module/components/block-popover/index.js +1 -19
  236. package/build-module/components/block-popover/index.js.map +1 -1
  237. package/build-module/components/block-preview/index.js +2 -1
  238. package/build-module/components/block-preview/index.js.map +1 -1
  239. package/build-module/components/block-removal-warning-modal/index.js +3 -5
  240. package/build-module/components/block-removal-warning-modal/index.js.map +1 -1
  241. package/build-module/components/block-rename/modal.js.map +1 -1
  242. package/build-module/components/block-settings/container.native.js +3 -2
  243. package/build-module/components/block-settings/container.native.js.map +1 -1
  244. package/build-module/components/block-settings-menu/block-settings-dropdown.js +42 -40
  245. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  246. package/build-module/components/block-settings-menu-controls/index.js +1 -3
  247. package/build-module/components/block-settings-menu-controls/index.js.map +1 -1
  248. package/build-module/components/block-switcher/block-transformations-menu.native.js.map +1 -1
  249. package/build-module/components/block-toolbar/block-toolbar-menu.native.js.map +1 -1
  250. package/build-module/components/block-toolbar/index.js +24 -12
  251. package/build-module/components/block-toolbar/index.js.map +1 -1
  252. package/build-module/components/block-toolbar/shuffle.js +82 -0
  253. package/build-module/components/block-toolbar/shuffle.js.map +1 -0
  254. package/build-module/components/block-toolbar/use-has-block-toolbar.js +36 -0
  255. package/build-module/components/block-toolbar/use-has-block-toolbar.js.map +1 -0
  256. package/build-module/components/block-tools/block-selection-button.js +5 -1
  257. package/build-module/components/block-tools/block-selection-button.js.map +1 -1
  258. package/build-module/components/block-tools/empty-block-inserter.js +2 -5
  259. package/build-module/components/block-tools/empty-block-inserter.js.map +1 -1
  260. package/build-module/components/block-tools/index.js +9 -26
  261. package/build-module/components/block-tools/index.js.map +1 -1
  262. package/build-module/components/block-tools/use-show-block-tools.js +54 -0
  263. package/build-module/components/block-tools/use-show-block-tools.js.map +1 -0
  264. package/build-module/components/caption/index.native.js.map +1 -1
  265. package/build-module/components/child-layout-control/index.js +109 -12
  266. package/build-module/components/child-layout-control/index.js.map +1 -1
  267. package/build-module/components/color-palette/control.js.map +1 -1
  268. package/build-module/components/colors-gradients/control.js +1 -1
  269. package/build-module/components/colors-gradients/control.js.map +1 -1
  270. package/build-module/components/convert-to-group-buttons/toolbar.js +12 -1
  271. package/build-module/components/convert-to-group-buttons/toolbar.js.map +1 -1
  272. package/build-module/components/global-styles/border-panel.js +22 -10
  273. package/build-module/components/global-styles/border-panel.js.map +1 -1
  274. package/build-module/components/global-styles/color-panel.js +1 -1
  275. package/build-module/components/global-styles/color-panel.js.map +1 -1
  276. package/build-module/components/global-styles/dimensions-panel.js +9 -34
  277. package/build-module/components/global-styles/dimensions-panel.js.map +1 -1
  278. package/build-module/components/global-styles/image-settings-panel.js.map +1 -1
  279. package/build-module/components/global-styles/index.js +1 -1
  280. package/build-module/components/global-styles/index.js.map +1 -1
  281. package/build-module/components/global-styles/shadow-panel-components.js +82 -24
  282. package/build-module/components/global-styles/shadow-panel-components.js.map +1 -1
  283. package/build-module/components/global-styles/typography-utils.js +7 -5
  284. package/build-module/components/global-styles/typography-utils.js.map +1 -1
  285. package/build-module/components/global-styles/use-global-styles-output.js +17 -17
  286. package/build-module/components/global-styles/use-global-styles-output.js.map +1 -1
  287. package/build-module/components/global-styles/utils.js +2 -4
  288. package/build-module/components/global-styles/utils.js.map +1 -1
  289. package/build-module/components/grid-visualizer/grid-item-resizer.js +69 -0
  290. package/build-module/components/grid-visualizer/grid-item-resizer.js.map +1 -0
  291. package/build-module/components/grid-visualizer/grid-visualizer.js +73 -0
  292. package/build-module/components/grid-visualizer/grid-visualizer.js.map +1 -0
  293. package/build-module/components/grid-visualizer/index.js +3 -0
  294. package/build-module/components/grid-visualizer/index.js.map +1 -0
  295. package/build-module/components/grid-visualizer/utils.js +4 -0
  296. package/build-module/components/grid-visualizer/utils.js.map +1 -0
  297. package/build-module/components/iframe/index.js +66 -17
  298. package/build-module/components/iframe/index.js.map +1 -1
  299. package/build-module/components/index.native.js +1 -1
  300. package/build-module/components/index.native.js.map +1 -1
  301. package/build-module/components/inner-blocks/use-nested-settings-update.js +8 -2
  302. package/build-module/components/inner-blocks/use-nested-settings-update.js.map +1 -1
  303. package/build-module/components/inserter/block-patterns-explorer/index.js +3 -6
  304. package/build-module/components/inserter/block-patterns-explorer/index.js.map +1 -1
  305. package/build-module/components/inserter/block-patterns-explorer/pattern-list.js +3 -1
  306. package/build-module/components/inserter/block-patterns-explorer/pattern-list.js.map +1 -1
  307. package/build-module/components/inserter/media-tab/media-preview.js.map +1 -1
  308. package/build-module/components/inserter/menu.native.js.map +1 -1
  309. package/build-module/components/inserter/mobile-tab-navigation.js +2 -2
  310. package/build-module/components/inserter/mobile-tab-navigation.js.map +1 -1
  311. package/build-module/components/inspector-controls/block-support-tools-panel.js.map +1 -1
  312. package/build-module/components/inspector-controls-tabs/advanced-controls-panel.native.js +28 -0
  313. package/build-module/components/inspector-controls-tabs/advanced-controls-panel.native.js.map +1 -0
  314. package/build-module/components/inspector-controls-tabs/index.js +1 -1
  315. package/build-module/components/inspector-controls-tabs/index.js.map +1 -1
  316. package/build-module/components/inspector-controls-tabs/styles-tab.js +2 -2
  317. package/build-module/components/inspector-controls-tabs/styles-tab.js.map +1 -1
  318. package/build-module/components/link-control/link-preview.js +5 -2
  319. package/build-module/components/link-control/link-preview.js.map +1 -1
  320. package/build-module/components/link-control/search-input.js.map +1 -1
  321. package/build-module/components/list-view/block-select-button.js +0 -2
  322. package/build-module/components/list-view/block-select-button.js.map +1 -1
  323. package/build-module/components/list-view/block.js +6 -13
  324. package/build-module/components/list-view/block.js.map +1 -1
  325. package/build-module/components/list-view/branch.js.map +1 -1
  326. package/build-module/components/list-view/drop-indicator.js.map +1 -1
  327. package/build-module/components/list-view/index.js.map +1 -1
  328. package/build-module/components/list-view/use-clipboard-handler.js +3 -2
  329. package/build-module/components/list-view/use-clipboard-handler.js.map +1 -1
  330. package/build-module/components/list-view/utils.js +2 -1
  331. package/build-module/components/list-view/utils.js.map +1 -1
  332. package/build-module/components/panel-color-settings/index.js.map +1 -1
  333. package/build-module/components/provider/index.js.map +1 -1
  334. package/build-module/components/resizable-box-popover/index.js +3 -5
  335. package/build-module/components/resizable-box-popover/index.js.map +1 -1
  336. package/build-module/components/responsive-block-control/index.js +1 -1
  337. package/build-module/components/responsive-block-control/index.js.map +1 -1
  338. package/build-module/components/rich-text/index.js +47 -28
  339. package/build-module/components/rich-text/index.js.map +1 -1
  340. package/build-module/components/rich-text/use-enter.js +3 -0
  341. package/build-module/components/rich-text/use-enter.js.map +1 -1
  342. package/build-module/components/spacing-sizes-control/input-controls/spacing-input-control.js.map +1 -1
  343. package/build-module/components/spacing-sizes-control/sides-dropdown/index.js +1 -1
  344. package/build-module/components/spacing-sizes-control/sides-dropdown/index.js.map +1 -1
  345. package/build-module/components/url-popover/index.js +3 -3
  346. package/build-module/components/url-popover/index.js.map +1 -1
  347. package/build-module/components/use-moving-animation/index.js +4 -0
  348. package/build-module/components/use-moving-animation/index.js.map +1 -1
  349. package/build-module/components/warning/index.native.js +9 -4
  350. package/build-module/components/warning/index.native.js.map +1 -1
  351. package/build-module/components/writing-flow/use-clipboard-handler.js +3 -2
  352. package/build-module/components/writing-flow/use-clipboard-handler.js.map +1 -1
  353. package/build-module/components/writing-flow/utils.js +22 -7
  354. package/build-module/components/writing-flow/utils.js.map +1 -1
  355. package/build-module/hooks/anchor.js +8 -9
  356. package/build-module/hooks/anchor.js.map +1 -1
  357. package/build-module/hooks/background.js +38 -1
  358. package/build-module/hooks/background.js.map +1 -1
  359. package/build-module/hooks/block-hooks.js +34 -8
  360. package/build-module/hooks/block-hooks.js.map +1 -1
  361. package/build-module/hooks/border.js +7 -5
  362. package/build-module/hooks/border.js.map +1 -1
  363. package/build-module/hooks/dimensions.js +1 -2
  364. package/build-module/hooks/dimensions.js.map +1 -1
  365. package/build-module/hooks/font-size.js +7 -8
  366. package/build-module/hooks/font-size.js.map +1 -1
  367. package/build-module/hooks/index.js +3 -2
  368. package/build-module/hooks/index.js.map +1 -1
  369. package/build-module/hooks/layout-child.js +67 -6
  370. package/build-module/hooks/layout-child.js.map +1 -1
  371. package/build-module/hooks/layout.js +32 -14
  372. package/build-module/hooks/layout.js.map +1 -1
  373. package/build-module/hooks/line-height.js.map +1 -1
  374. package/build-module/hooks/position.js +1 -1
  375. package/build-module/hooks/position.js.map +1 -1
  376. package/build-module/hooks/spacing-visualizer.js +106 -0
  377. package/build-module/hooks/spacing-visualizer.js.map +1 -0
  378. package/build-module/hooks/use-bindings-attributes.js +172 -49
  379. package/build-module/hooks/use-bindings-attributes.js.map +1 -1
  380. package/build-module/hooks/use-typography-props.js +2 -3
  381. package/build-module/hooks/use-typography-props.js.map +1 -1
  382. package/build-module/layouts/grid.js +6 -2
  383. package/build-module/layouts/grid.js.map +1 -1
  384. package/build-module/private-apis.js +7 -3
  385. package/build-module/private-apis.js.map +1 -1
  386. package/build-module/private-apis.native.js +3 -1
  387. package/build-module/private-apis.native.js.map +1 -1
  388. package/build-module/store/actions.js +42 -12
  389. package/build-module/store/actions.js.map +1 -1
  390. package/build-module/store/private-actions.js +29 -54
  391. package/build-module/store/private-actions.js.map +1 -1
  392. package/build-module/store/private-selectors.js +0 -6
  393. package/build-module/store/private-selectors.js.map +1 -1
  394. package/build-module/store/reducer.js +34 -46
  395. package/build-module/store/reducer.js.map +1 -1
  396. package/build-module/store/selectors.js +23 -13
  397. package/build-module/store/selectors.js.map +1 -1
  398. package/build-style/content-rtl.css +22 -2
  399. package/build-style/content.css +22 -2
  400. package/build-style/default-editor-styles-rtl.css +1 -0
  401. package/build-style/default-editor-styles.css +1 -0
  402. package/build-style/style-rtl.css +106 -27
  403. package/build-style/style.css +106 -27
  404. package/package.json +31 -31
  405. package/src/components/block-actions/index.js +59 -55
  406. package/src/components/block-bindings-toolbar-indicator/index.js +20 -0
  407. package/src/components/block-bindings-toolbar-indicator/style.scss +16 -0
  408. package/src/components/block-draggable/test/index.native.js +2 -2
  409. package/src/components/block-edit/context.js +1 -0
  410. package/src/components/block-edit/index.js +5 -1
  411. package/src/components/block-heading-level-dropdown/README.md +5 -5
  412. package/src/components/block-heading-level-dropdown/index.js +5 -5
  413. package/src/components/block-heading-level-dropdown/index.native.js +5 -4
  414. package/src/components/block-inspector/index.js +7 -5
  415. package/src/components/block-list/block-crash-boundary.native.js +43 -0
  416. package/src/components/block-list/block-crash-warning.native.js +19 -0
  417. package/src/components/block-list/block-invalid-warning.native.js +1 -1
  418. package/src/components/block-list/block-list-item.native.js +1 -1
  419. package/src/components/block-list/block-outline.native.js +36 -21
  420. package/src/components/block-list/block-selection-button.native.js +1 -3
  421. package/src/components/block-list/block.native.js +14 -10
  422. package/src/components/block-list/content.scss +21 -1
  423. package/src/components/block-list/test/block-outline.native.js +255 -0
  424. package/src/components/block-list/use-block-props/index.js +12 -2
  425. package/src/components/block-list/use-block-props/use-selected-block-event-handlers.js +3 -7
  426. package/src/components/block-mover/index.native.js +1 -1
  427. package/src/components/block-popover/cover.js +63 -0
  428. package/src/components/block-popover/drop-zone.js +3 -4
  429. package/src/components/block-popover/index.js +1 -28
  430. package/src/components/block-preview/index.js +3 -1
  431. package/src/components/block-removal-warning-modal/index.js +5 -19
  432. package/src/components/block-rename/modal.js +1 -1
  433. package/src/components/block-settings/container.native.js +5 -1
  434. package/src/components/block-settings-menu/block-settings-dropdown.js +53 -65
  435. package/src/components/block-settings-menu-controls/README.md +0 -9
  436. package/src/components/block-settings-menu-controls/index.js +1 -6
  437. package/src/components/block-switcher/block-transformations-menu.native.js +1 -1
  438. package/src/components/block-toolbar/block-toolbar-menu.native.js +2 -2
  439. package/src/components/block-toolbar/index.js +22 -16
  440. package/src/components/block-toolbar/shuffle.js +93 -0
  441. package/src/components/block-toolbar/test/index.native.js +1 -7
  442. package/src/components/block-toolbar/use-has-block-toolbar.js +49 -0
  443. package/src/components/block-tools/block-selection-button.js +4 -0
  444. package/src/components/block-tools/empty-block-inserter.js +3 -6
  445. package/src/components/block-tools/index.js +13 -36
  446. package/src/components/block-tools/use-show-block-tools.js +73 -0
  447. package/src/components/caption/index.native.js +1 -1
  448. package/src/components/child-layout-control/index.js +148 -36
  449. package/src/components/color-palette/control.js +1 -1
  450. package/src/components/colors-gradients/control.js +1 -1
  451. package/src/components/colors-gradients/test/control.js +2 -2
  452. package/src/components/contrast-checker/test/index.js +10 -10
  453. package/src/components/convert-to-group-buttons/toolbar.js +13 -1
  454. package/src/components/default-block-appender/content.scss +5 -2
  455. package/src/components/global-styles/border-panel.js +35 -24
  456. package/src/components/global-styles/color-panel.js +1 -1
  457. package/src/components/global-styles/dimensions-panel.js +9 -34
  458. package/src/components/global-styles/image-settings-panel.js +1 -1
  459. package/src/components/global-styles/index.js +5 -1
  460. package/src/components/global-styles/shadow-panel-components.js +92 -23
  461. package/src/components/global-styles/style.scss +33 -10
  462. package/src/components/global-styles/test/typography-utils.js +231 -81
  463. package/src/components/global-styles/test/use-global-styles-output.js +31 -0
  464. package/src/components/global-styles/typography-utils.js +10 -7
  465. package/src/components/global-styles/use-global-styles-output.js +17 -17
  466. package/src/components/global-styles/utils.js +2 -26
  467. package/src/components/grid-visualizer/grid-item-resizer.js +100 -0
  468. package/src/components/grid-visualizer/grid-visualizer.js +81 -0
  469. package/src/components/grid-visualizer/index.js +2 -0
  470. package/src/components/grid-visualizer/style.scss +33 -0
  471. package/src/components/grid-visualizer/utils.js +5 -0
  472. package/src/components/iframe/index.js +89 -26
  473. package/src/components/index.native.js +1 -0
  474. package/src/components/inner-blocks/use-nested-settings-update.js +12 -2
  475. package/src/components/inserter/block-patterns-explorer/index.js +2 -9
  476. package/src/components/inserter/block-patterns-explorer/pattern-list.js +7 -1
  477. package/src/components/inserter/media-tab/media-preview.js +1 -1
  478. package/src/components/inserter/menu.native.js +3 -3
  479. package/src/components/inserter/mobile-tab-navigation.js +2 -2
  480. package/src/components/inserter/style.scss +10 -0
  481. package/src/components/inspector-controls/block-support-tools-panel.js +2 -2
  482. package/src/components/inspector-controls-tabs/advanced-controls-panel.native.js +31 -0
  483. package/src/components/inspector-controls-tabs/index.js +1 -1
  484. package/src/components/inspector-controls-tabs/styles-tab.js +2 -2
  485. package/src/components/line-height-control/test/index.js +1 -1
  486. package/src/components/link-control/link-preview.js +9 -2
  487. package/src/components/link-control/search-input.js +1 -1
  488. package/src/components/link-control/style.scss +9 -5
  489. package/src/components/list-view/block-select-button.js +0 -2
  490. package/src/components/list-view/block.js +12 -21
  491. package/src/components/list-view/branch.js +1 -1
  492. package/src/components/list-view/drop-indicator.js +1 -1
  493. package/src/components/list-view/index.js +1 -1
  494. package/src/components/list-view/style.scss +34 -16
  495. package/src/components/list-view/use-clipboard-handler.js +3 -2
  496. package/src/components/list-view/utils.js +4 -1
  497. package/src/components/panel-color-settings/index.js +1 -1
  498. package/src/components/panel-color-settings/test/index.js +3 -3
  499. package/src/components/provider/index.js +1 -4
  500. package/src/components/resizable-box-popover/index.js +4 -6
  501. package/src/components/responsive-block-control/README.md +4 -4
  502. package/src/components/responsive-block-control/index.js +1 -1
  503. package/src/components/responsive-block-control/test/index.js +5 -5
  504. package/src/components/rich-text/README.md +6 -0
  505. package/src/components/rich-text/index.js +76 -53
  506. package/src/components/rich-text/use-enter.js +4 -0
  507. package/src/components/spacing-sizes-control/input-controls/spacing-input-control.js +4 -4
  508. package/src/components/spacing-sizes-control/sides-dropdown/index.js +1 -1
  509. package/src/components/url-popover/index.js +5 -5
  510. package/src/components/url-popover/style.scss +1 -0
  511. package/src/components/use-moving-animation/index.js +1 -0
  512. package/src/components/warning/index.native.js +19 -15
  513. package/src/components/writing-flow/use-clipboard-handler.js +3 -2
  514. package/src/components/writing-flow/utils.js +31 -16
  515. package/src/hooks/anchor.js +41 -61
  516. package/src/hooks/background.js +49 -4
  517. package/src/hooks/block-hooks.js +47 -9
  518. package/src/hooks/block-hooks.scss +6 -0
  519. package/src/hooks/border.js +16 -4
  520. package/src/hooks/dimensions.js +1 -2
  521. package/src/hooks/font-size.js +7 -12
  522. package/src/hooks/index.js +3 -0
  523. package/src/hooks/layout-child.js +82 -8
  524. package/src/hooks/layout.js +34 -19
  525. package/src/hooks/line-height.js +1 -1
  526. package/src/hooks/position.js +1 -1
  527. package/src/hooks/spacing-visualizer.js +126 -0
  528. package/src/hooks/{padding.scss → spacing.scss} +1 -1
  529. package/src/hooks/test/__snapshots__/anchor.native.js.snap +7 -0
  530. package/src/hooks/test/anchor.native.js +32 -0
  531. package/src/hooks/use-bindings-attributes.js +215 -65
  532. package/src/hooks/use-typography-props.js +2 -8
  533. package/src/layouts/grid.js +8 -3
  534. package/src/private-apis.js +6 -2
  535. package/src/private-apis.native.js +2 -0
  536. package/src/store/actions.js +56 -18
  537. package/src/store/private-actions.js +34 -79
  538. package/src/store/private-selectors.js +0 -8
  539. package/src/store/reducer.js +43 -64
  540. package/src/store/selectors.js +41 -46
  541. package/src/store/test/actions.js +0 -4
  542. package/src/style.scss +3 -1
  543. package/tsconfig.json +1 -0
  544. package/build/hooks/margin.js +0 -86
  545. package/build/hooks/margin.js.map +0 -1
  546. package/build/hooks/padding.js +0 -78
  547. package/build/hooks/padding.js.map +0 -1
  548. package/build/utils/use-can-block-toolbar-be-focused.js +0 -46
  549. package/build/utils/use-can-block-toolbar-be-focused.js.map +0 -1
  550. package/build-module/hooks/margin.js +0 -78
  551. package/build-module/hooks/margin.js.map +0 -1
  552. package/build-module/hooks/padding.js +0 -70
  553. package/build-module/hooks/padding.js.map +0 -1
  554. package/build-module/utils/use-can-block-toolbar-be-focused.js +0 -40
  555. package/build-module/utils/use-can-block-toolbar-be-focused.js.map +0 -1
  556. package/src/hooks/margin.js +0 -91
  557. package/src/hooks/padding.js +0 -82
  558. package/src/utils/use-can-block-toolbar-be-focused.js +0 -48
@@ -9,7 +9,7 @@ import {
9
9
  import { DropdownMenu, MenuGroup, MenuItem } from '@wordpress/components';
10
10
  import { useDispatch, useSelect } from '@wordpress/data';
11
11
  import { moreVertical } from '@wordpress/icons';
12
- import { Children, cloneElement, useCallback } from '@wordpress/element';
12
+ import { Children, cloneElement } from '@wordpress/element';
13
13
  import { __ } from '@wordpress/i18n';
14
14
  import {
15
15
  store as keyboardShortcutsStore,
@@ -33,8 +33,12 @@ const POPOVER_PROPS = {
33
33
  placement: 'bottom-start',
34
34
  };
35
35
 
36
- function CopyMenuItem( { blocks, onCopy, label } ) {
37
- const ref = useCopyToClipboard( () => serialize( blocks ), onCopy );
36
+ function CopyMenuItem( { clientIds, onCopy, label } ) {
37
+ const { getBlocksByClientId } = useSelect( blockEditorStore );
38
+ const ref = useCopyToClipboard(
39
+ () => serialize( getBlocksByClientId( clientIds ) ),
40
+ onCopy
41
+ );
38
42
  const copyMenuItemLabel = label ? label : __( 'Copy' );
39
43
  return <MenuItem ref={ ref }>{ copyMenuItemLabel }</MenuItem>;
40
44
  }
@@ -42,18 +46,14 @@ function CopyMenuItem( { blocks, onCopy, label } ) {
42
46
  export function BlockSettingsDropdown( {
43
47
  block,
44
48
  clientIds,
45
- __experimentalSelectBlock,
46
49
  children,
47
- __unstableDisplayLocation,
50
+ __experimentalSelectBlock,
48
51
  ...props
49
52
  } ) {
50
53
  // Get the client id of the current block for this menu, if one is set.
51
54
  const currentClientId = block?.clientId;
52
- const blockClientIds = Array.isArray( clientIds )
53
- ? clientIds
54
- : [ clientIds ];
55
- const count = blockClientIds.length;
56
- const firstBlockClientId = blockClientIds[ 0 ];
55
+ const count = clientIds.length;
56
+ const firstBlockClientId = clientIds[ 0 ];
57
57
  const {
58
58
  firstParentClientId,
59
59
  onlyBlock,
@@ -123,41 +123,35 @@ export function BlockSettingsDropdown( {
123
123
  const isMatch = __unstableUseShortcutEventMatch();
124
124
  const hasSelectedBlocks = selectedBlockClientIds.length > 0;
125
125
 
126
- const updateSelectionAfterDuplicate = useCallback(
127
- async ( clientIdsPromise ) => {
128
- if ( __experimentalSelectBlock ) {
129
- const ids = await clientIdsPromise;
130
- if ( ids && ids[ 0 ] ) {
131
- __experimentalSelectBlock( ids[ 0 ], false );
132
- }
133
- }
134
- },
135
- [ __experimentalSelectBlock ]
136
- );
126
+ async function updateSelectionAfterDuplicate( clientIdsPromise ) {
127
+ if ( ! __experimentalSelectBlock ) {
128
+ return;
129
+ }
137
130
 
138
- const updateSelectionAfterRemove = useCallback( () => {
139
- if ( __experimentalSelectBlock ) {
140
- let blockToFocus = previousBlockClientId || firstParentClientId;
131
+ const ids = await clientIdsPromise;
132
+ if ( ids && ids[ 0 ] ) {
133
+ __experimentalSelectBlock( ids[ 0 ], false );
134
+ }
135
+ }
141
136
 
142
- // Focus the first block if there's no previous block nor parent block.
143
- if ( ! blockToFocus ) {
144
- blockToFocus = getBlockOrder()[ 0 ];
145
- }
137
+ function updateSelectionAfterRemove() {
138
+ if ( ! __experimentalSelectBlock ) {
139
+ return;
140
+ }
146
141
 
147
- // Only update the selection if the original selection is removed.
148
- const shouldUpdateSelection =
149
- hasSelectedBlocks && getSelectedBlockClientIds().length === 0;
142
+ let blockToFocus = previousBlockClientId || firstParentClientId;
150
143
 
151
- __experimentalSelectBlock( blockToFocus, shouldUpdateSelection );
144
+ // Focus the first block if there's no previous block nor parent block.
145
+ if ( ! blockToFocus ) {
146
+ blockToFocus = getBlockOrder()[ 0 ];
152
147
  }
153
- }, [
154
- __experimentalSelectBlock,
155
- previousBlockClientId,
156
- firstParentClientId,
157
- getBlockOrder,
158
- hasSelectedBlocks,
159
- getSelectedBlockClientIds,
160
- ] );
148
+
149
+ // Only update the selection if the original selection is removed.
150
+ const shouldUpdateSelection =
151
+ hasSelectedBlocks && getSelectedBlockClientIds().length === 0;
152
+
153
+ __experimentalSelectBlock( blockToFocus, shouldUpdateSelection );
154
+ }
161
155
 
162
156
  // This can occur when the selected block (the parent)
163
157
  // displays child blocks within a List View.
@@ -175,20 +169,17 @@ export function BlockSettingsDropdown( {
175
169
  ? undefined
176
170
  : openedBlockSettingsMenu === currentClientId || false;
177
171
 
178
- const onToggle = useCallback(
179
- ( localOpen ) => {
180
- if ( localOpen && openedBlockSettingsMenu !== currentClientId ) {
181
- setOpenedBlockSettingsMenu( currentClientId );
182
- } else if (
183
- ! localOpen &&
184
- openedBlockSettingsMenu &&
185
- openedBlockSettingsMenu === currentClientId
186
- ) {
187
- setOpenedBlockSettingsMenu( undefined );
188
- }
189
- },
190
- [ currentClientId, openedBlockSettingsMenu, setOpenedBlockSettingsMenu ]
191
- );
172
+ function onToggle( localOpen ) {
173
+ if ( localOpen && openedBlockSettingsMenu !== currentClientId ) {
174
+ setOpenedBlockSettingsMenu( currentClientId );
175
+ } else if (
176
+ ! localOpen &&
177
+ openedBlockSettingsMenu &&
178
+ openedBlockSettingsMenu === currentClientId
179
+ ) {
180
+ setOpenedBlockSettingsMenu( undefined );
181
+ }
182
+ }
192
183
 
193
184
  return (
194
185
  <BlockActions
@@ -198,7 +189,7 @@ export function BlockSettingsDropdown( {
198
189
  { ( {
199
190
  canCopyStyles,
200
191
  canDuplicate,
201
- canInsertDefaultBlock,
192
+ canInsertBlock,
202
193
  canMove,
203
194
  canRemove,
204
195
  onDuplicate,
@@ -208,7 +199,6 @@ export function BlockSettingsDropdown( {
208
199
  onCopy,
209
200
  onPasteStyles,
210
201
  onMoveTo,
211
- blocks,
212
202
  } ) => (
213
203
  <DropdownMenu
214
204
  icon={ moreVertical }
@@ -230,7 +220,8 @@ export function BlockSettingsDropdown( {
230
220
  canRemove
231
221
  ) {
232
222
  event.preventDefault();
233
- updateSelectionAfterRemove( onRemove() );
223
+ onRemove();
224
+ updateSelectionAfterRemove();
234
225
  } else if (
235
226
  isMatch(
236
227
  'core/block-editor/duplicate',
@@ -245,7 +236,7 @@ export function BlockSettingsDropdown( {
245
236
  'core/block-editor/insert-after',
246
237
  event
247
238
  ) &&
248
- canInsertDefaultBlock
239
+ canInsertBlock
249
240
  ) {
250
241
  event.preventDefault();
251
242
  setOpenedBlockSettingsMenu( undefined );
@@ -255,7 +246,7 @@ export function BlockSettingsDropdown( {
255
246
  'core/block-editor/insert-before',
256
247
  event
257
248
  ) &&
258
- canInsertDefaultBlock
249
+ canInsertBlock
259
250
  ) {
260
251
  event.preventDefault();
261
252
  setOpenedBlockSettingsMenu( undefined );
@@ -286,7 +277,7 @@ export function BlockSettingsDropdown( {
286
277
  />
287
278
  ) }
288
279
  <CopyMenuItem
289
- blocks={ blocks }
280
+ clientIds={ clientIds }
290
281
  onCopy={ onCopy }
291
282
  />
292
283
  { canDuplicate && (
@@ -301,7 +292,7 @@ export function BlockSettingsDropdown( {
301
292
  { __( 'Duplicate' ) }
302
293
  </MenuItem>
303
294
  ) }
304
- { canInsertDefaultBlock && (
295
+ { canInsertBlock && (
305
296
  <>
306
297
  <MenuItem
307
298
  onClick={ pipe(
@@ -327,7 +318,7 @@ export function BlockSettingsDropdown( {
327
318
  { canCopyStyles && (
328
319
  <MenuGroup>
329
320
  <CopyMenuItem
330
- blocks={ blocks }
321
+ clientIds={ clientIds }
331
322
  onCopy={ onCopy }
332
323
  label={ __( 'Copy styles' ) }
333
324
  />
@@ -346,9 +337,6 @@ export function BlockSettingsDropdown( {
346
337
  firstBlockClientId,
347
338
  } }
348
339
  clientIds={ clientIds }
349
- __unstableDisplayLocation={
350
- __unstableDisplayLocation
351
- }
352
340
  />
353
341
  { typeof children === 'function'
354
342
  ? children( { onClose } )
@@ -16,12 +16,3 @@ function ReusableBlocksMenuItems() {
16
16
  );
17
17
  }
18
18
  ```
19
-
20
- ## Props
21
-
22
- ### `__unstableDisplayLocation`
23
-
24
- - **Type:** `String`
25
- - **Default:** `undefined`
26
-
27
- A string representing the location where the component is being displayed within the UI. This can be used to conditionalize certain behaviors including the display of associated components. This behaviour will likely be refactored to a React.Context implementation.
@@ -26,11 +26,7 @@ import { BlockRenameControl, useBlockRename } from '../block-rename';
26
26
 
27
27
  const { Fill, Slot } = createSlotFill( 'BlockSettingsMenuControls' );
28
28
 
29
- const BlockSettingsMenuControlsSlot = ( {
30
- fillProps,
31
- clientIds = null,
32
- __unstableDisplayLocation,
33
- } ) => {
29
+ const BlockSettingsMenuControlsSlot = ( { fillProps, clientIds = null } ) => {
34
30
  const { selectedBlocks, selectedClientIds } = useSelect(
35
31
  ( select ) => {
36
32
  const { getBlockNamesByClientId, getSelectedBlockClientIds } =
@@ -61,7 +57,6 @@ const BlockSettingsMenuControlsSlot = ( {
61
57
  <Slot
62
58
  fillProps={ {
63
59
  ...fillProps,
64
- __unstableDisplayLocation,
65
60
  selectedBlocks,
66
61
  selectedClientIds,
67
62
  } }
@@ -80,7 +80,7 @@ const BlockTransformationsMenu = ( {
80
80
  options={ pickerOptions() }
81
81
  onChange={ onPickerSelect }
82
82
  hideCancelButton={ Platform.OS !== 'ios' }
83
- leftAlign={ true }
83
+ leftAlign
84
84
  getAnchor={ getAnchor }
85
85
  // translators: %s: block title e.g: "Paragraph".
86
86
  title={ sprintf( __( 'Transform %s to' ), blockTitle ) }
@@ -256,7 +256,7 @@ const BlockActionsMenu = ( {
256
256
  <ToolbarButton
257
257
  title={ __( 'Open Block Actions Menu' ) }
258
258
  icon={ moreHorizontalMobile }
259
- disabled={ true }
259
+ disabled
260
260
  />
261
261
  </ToolbarGroup>
262
262
  );
@@ -311,7 +311,7 @@ const BlockActionsMenu = ( {
311
311
  destructiveButtonIndex={ options.length }
312
312
  disabledButtonIndices={ disabledButtonIndices }
313
313
  hideCancelButton={ Platform.OS !== 'ios' }
314
- leftAlign={ true }
314
+ leftAlign
315
315
  getAnchor={ getAnchor }
316
316
  // translators: %s: block title e.g: "Paragraph".
317
317
  title={ sprintf( __( '%s block options' ), blockTitle ) }
@@ -34,8 +34,10 @@ import { useShowHoveredOrFocusedGestures } from './utils';
34
34
  import { store as blockEditorStore } from '../../store';
35
35
  import __unstableBlockNameContext from './block-name-context';
36
36
  import NavigableToolbar from '../navigable-toolbar';
37
- import { useHasAnyBlockControls } from '../block-controls/use-has-block-controls';
38
-
37
+ import Shuffle from './shuffle';
38
+ import BlockBindingsIndicator from '../block-bindings-toolbar-indicator';
39
+ import { useHasBlockToolbar } from './use-has-block-toolbar';
40
+ import { canBindBlock } from '../../hooks/use-bindings-attributes';
39
41
  /**
40
42
  * Renders the block toolbar.
41
43
  *
@@ -60,8 +62,11 @@ export function PrivateBlockToolbar( {
60
62
  blockClientIds,
61
63
  isDefaultEditingMode,
62
64
  blockType,
65
+ blockName,
66
+ toolbarKey,
63
67
  shouldShowVisualToolbar,
64
68
  showParentSelector,
69
+ isUsingBindings,
65
70
  } = useSelect( ( select ) => {
66
71
  const {
67
72
  getBlockName,
@@ -71,6 +76,7 @@ export function PrivateBlockToolbar( {
71
76
  isBlockValid,
72
77
  getBlockRootClientId,
73
78
  getBlockEditingMode,
79
+ getBlockAttributes,
74
80
  } = select( blockEditorStore );
75
81
  const selectedBlockClientIds = getSelectedBlockClientIds();
76
82
  const selectedBlockClientId = selectedBlockClientIds[ 0 ];
@@ -81,22 +87,24 @@ export function PrivateBlockToolbar( {
81
87
  const parentBlockType = getBlockType( parentBlockName );
82
88
  const _isDefaultEditingMode =
83
89
  getBlockEditingMode( selectedBlockClientId ) === 'default';
90
+ const _blockName = getBlockName( selectedBlockClientId );
84
91
  const isValid = selectedBlockClientIds.every( ( id ) =>
85
92
  isBlockValid( id )
86
93
  );
87
94
  const isVisual = selectedBlockClientIds.every(
88
95
  ( id ) => getBlockMode( id ) === 'visual'
89
96
  );
97
+ const _isUsingBindings = !! getBlockAttributes( selectedBlockClientId )
98
+ ?.metadata?.bindings;
90
99
  return {
91
100
  blockClientId: selectedBlockClientId,
92
101
  blockClientIds: selectedBlockClientIds,
93
102
  isDefaultEditingMode: _isDefaultEditingMode,
94
- blockType:
95
- selectedBlockClientId &&
96
- getBlockType( getBlockName( selectedBlockClientId ) ),
97
-
103
+ blockName: _blockName,
104
+ blockType: selectedBlockClientId && getBlockType( _blockName ),
98
105
  shouldShowVisualToolbar: isValid && isVisual,
99
106
  rootClientId: blockRootClientId,
107
+ toolbarKey: `${ selectedBlockClientId }${ firstParentClientId }`,
100
108
  showParentSelector:
101
109
  parentBlockType &&
102
110
  getBlockEditingMode( firstParentClientId ) === 'default' &&
@@ -107,6 +115,7 @@ export function PrivateBlockToolbar( {
107
115
  ) &&
108
116
  selectedBlockClientIds.length === 1 &&
109
117
  _isDefaultEditingMode,
118
+ isUsingBindings: _isUsingBindings,
110
119
  };
111
120
  }, [] );
112
121
 
@@ -121,15 +130,8 @@ export function PrivateBlockToolbar( {
121
130
 
122
131
  const isLargeViewport = ! useViewportMatch( 'medium', '<' );
123
132
 
124
- const isToolbarEnabled =
125
- blockType &&
126
- hasBlockSupport( blockType, '__experimentalToolbar', true );
127
- const hasAnyBlockControls = useHasAnyBlockControls();
128
-
129
- if (
130
- ! isToolbarEnabled ||
131
- ( ! isDefaultEditingMode && ! hasAnyBlockControls )
132
- ) {
133
+ const hasBlockToolbar = useHasBlockToolbar();
134
+ if ( ! hasBlockToolbar ) {
133
135
  return null;
134
136
  }
135
137
 
@@ -159,12 +161,15 @@ export function PrivateBlockToolbar( {
159
161
  __experimentalOnIndexChange={ __experimentalOnIndexChange }
160
162
  // Resets the index whenever the active block changes so
161
163
  // this is not persisted. See https://github.com/WordPress/gutenberg/pull/25760#issuecomment-717906169
162
- key={ blockClientId }
164
+ key={ toolbarKey }
163
165
  >
164
166
  <div ref={ toolbarWrapperRef } className={ innerClasses }>
165
167
  { ! isMultiToolbar &&
166
168
  isLargeViewport &&
167
169
  isDefaultEditingMode && <BlockParentSelector /> }
170
+ { isUsingBindings && canBindBlock( blockName ) && (
171
+ <BlockBindingsIndicator />
172
+ ) }
168
173
  { ( shouldShowVisualToolbar || isMultiToolbar ) &&
169
174
  isDefaultEditingMode && (
170
175
  <div
@@ -185,6 +190,7 @@ export function PrivateBlockToolbar( {
185
190
  </ToolbarGroup>
186
191
  </div>
187
192
  ) }
193
+ <Shuffle clientId={ blockClientId } />
188
194
  { shouldShowVisualToolbar && isMultiToolbar && (
189
195
  <BlockGroupToolbar />
190
196
  ) }
@@ -0,0 +1,93 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { shuffle } from '@wordpress/icons';
5
+ import { ToolbarButton, ToolbarGroup } from '@wordpress/components';
6
+ import { __ } from '@wordpress/i18n';
7
+ import { useMemo } from '@wordpress/element';
8
+ import { useSelect, useDispatch } from '@wordpress/data';
9
+
10
+ /**
11
+ * Internal dependencies
12
+ */
13
+ import { store as blockEditorStore } from '../../store';
14
+
15
+ const EMPTY_ARRAY = [];
16
+
17
+ function Container( props ) {
18
+ return (
19
+ <ToolbarGroup>
20
+ <ToolbarButton { ...props } />
21
+ </ToolbarGroup>
22
+ );
23
+ }
24
+
25
+ export default function Shuffle( { clientId, as = Container } ) {
26
+ const { categories, patterns } = useSelect(
27
+ ( select ) => {
28
+ const {
29
+ getBlockAttributes,
30
+ getBlockRootClientId,
31
+ __experimentalGetAllowedPatterns,
32
+ } = select( blockEditorStore );
33
+ const attributes = getBlockAttributes( clientId );
34
+ const _categories = attributes?.metadata?.categories || EMPTY_ARRAY;
35
+ const rootBlock = getBlockRootClientId( clientId );
36
+ const _patterns = __experimentalGetAllowedPatterns( rootBlock );
37
+ return {
38
+ categories: _categories,
39
+ patterns: _patterns,
40
+ };
41
+ },
42
+ [ clientId ]
43
+ );
44
+ const { replaceBlocks } = useDispatch( blockEditorStore );
45
+ const sameCategoryPatternsWithSingleWrapper = useMemo( () => {
46
+ if (
47
+ ! categories ||
48
+ categories.length === 0 ||
49
+ ! patterns ||
50
+ patterns.length === 0
51
+ ) {
52
+ return EMPTY_ARRAY;
53
+ }
54
+ return patterns.filter( ( pattern ) => {
55
+ return (
56
+ // Check if the pattern has only one top level block,
57
+ // otherwise we may shuffle to pattern that will not allow to continue shuffling.
58
+ pattern.blocks.length === 1 &&
59
+ pattern.categories?.some( ( category ) => {
60
+ return categories.includes( category );
61
+ } )
62
+ );
63
+ } );
64
+ }, [ categories, patterns ] );
65
+ if ( sameCategoryPatternsWithSingleWrapper.length === 0 ) {
66
+ return null;
67
+ }
68
+ const ComponentToUse = as;
69
+ return (
70
+ <ComponentToUse
71
+ label={ __( 'Shuffle' ) }
72
+ icon={ shuffle }
73
+ onClick={ () => {
74
+ const randomPattern =
75
+ sameCategoryPatternsWithSingleWrapper[
76
+ Math.floor(
77
+ // eslint-disable-next-line no-restricted-syntax
78
+ Math.random() *
79
+ sameCategoryPatternsWithSingleWrapper.length
80
+ )
81
+ ];
82
+ randomPattern.blocks[ 0 ].attributes = {
83
+ ...randomPattern.blocks[ 0 ].attributes,
84
+ metadata: {
85
+ ...randomPattern.blocks[ 0 ].attributes.metadata,
86
+ categories,
87
+ },
88
+ };
89
+ replaceBlocks( clientId, randomPattern.blocks );
90
+ } }
91
+ />
92
+ );
93
+ }
@@ -15,13 +15,7 @@ describe( 'Block Toolbar', () => {
15
15
  it( "doesn't render the block settings button if there aren't any settings for the current selected block", async () => {
16
16
  // Arrange
17
17
  const screen = await initializeEditor();
18
- await addBlock( screen, 'Image' );
19
-
20
- // Act
21
- fireEvent(
22
- screen.getByTestId( 'media-options-picker' ),
23
- 'backdropPress'
24
- );
18
+ await addBlock( screen, 'Shortcode' );
25
19
 
26
20
  // Assert
27
21
  expect( screen.queryByLabelText( 'Open Settings' ) ).toBeNull();
@@ -0,0 +1,49 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useSelect } from '@wordpress/data';
5
+ import { getBlockType, hasBlockSupport } from '@wordpress/blocks';
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { store as blockEditorStore } from '../../store';
10
+ import { useHasAnyBlockControls } from '../block-controls/use-has-block-controls';
11
+
12
+ /**
13
+ * Returns true if the block toolbar should be shown.
14
+ *
15
+ * @return {boolean} Whether the block toolbar component will be rendered.
16
+ */
17
+ export function useHasBlockToolbar() {
18
+ const hasAnyBlockControls = useHasAnyBlockControls();
19
+ return useSelect(
20
+ ( select ) => {
21
+ const {
22
+ getBlockEditingMode,
23
+ getBlockName,
24
+ getSelectedBlockClientIds,
25
+ } = select( blockEditorStore );
26
+
27
+ const selectedBlockClientIds = getSelectedBlockClientIds();
28
+ const selectedBlockClientId = selectedBlockClientIds[ 0 ];
29
+ const isDefaultEditingMode =
30
+ getBlockEditingMode( selectedBlockClientId ) === 'default';
31
+ const blockType =
32
+ selectedBlockClientId &&
33
+ getBlockType( getBlockName( selectedBlockClientId ) );
34
+ const isToolbarEnabled =
35
+ blockType &&
36
+ hasBlockSupport( blockType, '__experimentalToolbar', true );
37
+
38
+ if (
39
+ ! isToolbarEnabled ||
40
+ ( ! isDefaultEditingMode && ! hasAnyBlockControls )
41
+ ) {
42
+ return false;
43
+ }
44
+
45
+ return true;
46
+ },
47
+ [ hasAnyBlockControls ]
48
+ );
49
+ }
@@ -39,6 +39,7 @@ import { store as blockEditorStore } from '../../store';
39
39
  import BlockDraggable from '../block-draggable';
40
40
  import { __unstableUseBlockElement as useBlockElement } from '../block-list/use-block-props/use-block-refs';
41
41
  import BlockMover from '../block-mover';
42
+ import Shuffle from '../block-toolbar/shuffle';
42
43
 
43
44
  /**
44
45
  * Block selection button component, displaying the label of the block. If the block
@@ -271,6 +272,9 @@ function BlockSelectionButton( { clientId, rootClientId } ) {
271
272
  </BlockDraggable>
272
273
  ) }
273
274
  </FlexItem>
275
+ { editorMode === 'zoom-out' && (
276
+ <Shuffle clientId={ clientId } as={ Button } />
277
+ ) }
274
278
  <FlexItem>
275
279
  <Button
276
280
  ref={ ref }
@@ -6,7 +6,7 @@ import classnames from 'classnames';
6
6
  /**
7
7
  * Internal dependencies
8
8
  */
9
- import BlockPopover from '../block-popover';
9
+ import BlockPopoverCover from '../block-popover/cover';
10
10
  import useBlockToolbarPopoverProps from './use-block-toolbar-popover-props';
11
11
  import Inserter from '../inserter';
12
12
  import useSelectedBlockToolProps from './use-selected-block-tool-props';
@@ -28,9 +28,8 @@ export default function EmptyBlockInserter( {
28
28
  } );
29
29
 
30
30
  return (
31
- <BlockPopover
31
+ <BlockPopoverCover
32
32
  clientId={ capturingClientId || clientId }
33
- __unstableCoverTarget
34
33
  bottomClientId={ lastClientId }
35
34
  className={ classnames(
36
35
  'block-editor-block-list__block-side-inserter-popover',
@@ -39,8 +38,6 @@ export default function EmptyBlockInserter( {
39
38
  }
40
39
  ) }
41
40
  __unstableContentRef={ __unstableContentRef }
42
- resize={ false }
43
- shift={ false }
44
41
  { ...popoverProps }
45
42
  >
46
43
  <div className="block-editor-block-list__empty-block-inserter">
@@ -51,6 +48,6 @@ export default function EmptyBlockInserter( {
51
48
  __experimentalIsQuick
52
49
  />
53
50
  </div>
54
- </BlockPopover>
51
+ </BlockPopoverCover>
55
52
  );
56
53
  }