@wordpress/block-editor 9.8.1-next.957ca95e4c.0 → 10.0.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 (456) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +13 -1
  3. package/build/components/alignment-control/ui.js +6 -5
  4. package/build/components/alignment-control/ui.js.map +1 -1
  5. package/build/components/block-actions/index.js +5 -9
  6. package/build/components/block-actions/index.js.map +1 -1
  7. package/build/components/block-alignment-control/ui.js +5 -5
  8. package/build/components/block-alignment-control/ui.js.map +1 -1
  9. package/build/components/block-content-overlay/index.js +2 -4
  10. package/build/components/block-content-overlay/index.js.map +1 -1
  11. package/build/components/block-draggable/draggable-chip.js +2 -1
  12. package/build/components/block-draggable/draggable-chip.js.map +1 -1
  13. package/build/components/block-edit/edit.js +1 -1
  14. package/build/components/block-edit/edit.js.map +1 -1
  15. package/build/components/block-inspector/index.js +125 -17
  16. package/build/components/block-inspector/index.js.map +1 -1
  17. package/build/components/block-list/block.js +40 -9
  18. package/build/components/block-list/block.js.map +1 -1
  19. package/build/components/block-list/index.js +4 -4
  20. package/build/components/block-list/index.js.map +1 -1
  21. package/build/components/block-list/use-block-props/index.js +14 -11
  22. package/build/components/block-list/use-block-props/index.js.map +1 -1
  23. package/build/components/block-list/use-block-props/use-block-class-names.js +3 -2
  24. package/build/components/block-list/use-block-props/use-block-class-names.js.map +1 -1
  25. package/build/components/block-list/use-block-props/use-focus-first-element.js +3 -9
  26. package/build/components/block-list/use-block-props/use-focus-first-element.js.map +1 -1
  27. package/build/components/block-list/use-block-props/use-is-hovered.js +1 -2
  28. package/build/components/block-list/use-block-props/use-is-hovered.js.map +1 -1
  29. package/build/components/block-list/use-in-between-inserter.js +7 -12
  30. package/build/components/block-list/use-in-between-inserter.js.map +1 -1
  31. package/build/components/block-list-appender/index.js +20 -21
  32. package/build/components/block-list-appender/index.js.map +1 -1
  33. package/build/components/block-list-appender/index.native.js +1 -7
  34. package/build/components/block-list-appender/index.native.js.map +1 -1
  35. package/build/components/block-lock/use-block-lock.js +3 -1
  36. package/build/components/block-lock/use-block-lock.js.map +1 -1
  37. package/build/components/block-mobile-toolbar/block-actions-menu.native.js +20 -10
  38. package/build/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  39. package/build/components/block-mover/button.js +4 -6
  40. package/build/components/block-mover/button.js.map +1 -1
  41. package/build/components/block-mover/index.js +4 -6
  42. package/build/components/block-mover/index.js.map +1 -1
  43. package/build/components/block-mover/index.native.js +24 -8
  44. package/build/components/block-mover/index.native.js.map +1 -1
  45. package/build/components/block-popover/inbetween.js +58 -16
  46. package/build/components/block-popover/inbetween.js.map +1 -1
  47. package/build/components/block-popover/index.js +3 -2
  48. package/build/components/block-popover/index.js.map +1 -1
  49. package/build/components/block-preview/auto.js +4 -2
  50. package/build/components/block-preview/auto.js.map +1 -1
  51. package/build/components/block-settings-menu/block-settings-dropdown.js +3 -1
  52. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  53. package/build/components/block-settings-menu-controls/index.js +3 -1
  54. package/build/components/block-settings-menu-controls/index.js.map +1 -1
  55. package/build/components/block-styles/preview-panel.js +7 -1
  56. package/build/components/block-styles/preview-panel.js.map +1 -1
  57. package/build/components/block-switcher/block-transformations-menu.js +114 -25
  58. package/build/components/block-switcher/block-transformations-menu.js.map +1 -1
  59. package/build/components/block-toolbar/index.js +9 -8
  60. package/build/components/block-toolbar/index.js.map +1 -1
  61. package/build/components/block-tools/block-contextual-toolbar.js +3 -2
  62. package/build/components/block-tools/block-contextual-toolbar.js.map +1 -1
  63. package/build/components/block-tools/block-selection-button.js +13 -5
  64. package/build/components/block-tools/block-selection-button.js.map +1 -1
  65. package/build/components/block-tools/index.js +33 -15
  66. package/build/components/block-tools/index.js.map +1 -1
  67. package/build/components/block-tools/insertion-point.js +4 -9
  68. package/build/components/block-tools/insertion-point.js.map +1 -1
  69. package/build/components/block-tools/selected-block-popover.js +9 -8
  70. package/build/components/block-tools/selected-block-popover.js.map +1 -1
  71. package/build/components/block-tools/use-block-toolbar-popover-props.js +13 -8
  72. package/build/components/block-tools/use-block-toolbar-popover-props.js.map +1 -1
  73. package/build/components/block-tools/zoom-out-mode-inserters.js +71 -0
  74. package/build/components/block-tools/zoom-out-mode-inserters.js.map +1 -0
  75. package/build/components/block-vertical-alignment-control/ui.js +5 -2
  76. package/build/components/block-vertical-alignment-control/ui.js.map +1 -1
  77. package/build/components/colors-gradients/dropdown.js +1 -1
  78. package/build/components/colors-gradients/dropdown.js.map +1 -1
  79. package/build/components/iframe/index.js +31 -4
  80. package/build/components/iframe/index.js.map +1 -1
  81. package/build/components/inner-blocks/default-block-appender.js +1 -7
  82. package/build/components/inner-blocks/default-block-appender.js.map +1 -1
  83. package/build/components/inner-blocks/index.js +2 -2
  84. package/build/components/inner-blocks/index.js.map +1 -1
  85. package/build/components/inner-blocks/use-inner-block-template-sync.js +5 -5
  86. package/build/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  87. package/build/components/inner-blocks/use-nested-settings-update.js +1 -1
  88. package/build/components/inner-blocks/use-nested-settings-update.js.map +1 -1
  89. package/build/components/inserter/index.js +3 -6
  90. package/build/components/inserter/index.js.map +1 -1
  91. package/build/components/inserter/library.js +14 -3
  92. package/build/components/inserter/library.js.map +1 -1
  93. package/build/components/inserter/menu.js +21 -8
  94. package/build/components/inserter/menu.js.map +1 -1
  95. package/build/components/inserter/preview-panel.js +1 -1
  96. package/build/components/inserter/preview-panel.js.map +1 -1
  97. package/build/components/inserter/tabs.js +11 -4
  98. package/build/components/inserter/tabs.js.map +1 -1
  99. package/build/components/link-control/link-preview.js +1 -1
  100. package/build/components/link-control/link-preview.js.map +1 -1
  101. package/build/components/link-control/search-input.js +6 -3
  102. package/build/components/link-control/search-input.js.map +1 -1
  103. package/build/components/link-control/search-item.js +36 -5
  104. package/build/components/link-control/search-item.js.map +1 -1
  105. package/build/components/list-view/block.js +23 -11
  106. package/build/components/list-view/block.js.map +1 -1
  107. package/build/components/list-view/branch.js +19 -2
  108. package/build/components/list-view/branch.js.map +1 -1
  109. package/build/components/list-view/index.js +8 -4
  110. package/build/components/list-view/index.js.map +1 -1
  111. package/build/components/list-view/use-block-selection.js +0 -1
  112. package/build/components/list-view/use-block-selection.js.map +1 -1
  113. package/build/components/provider/use-block-sync.js +1 -7
  114. package/build/components/provider/use-block-sync.js.map +1 -1
  115. package/build/components/publish-date-time-picker/index.js +1 -1
  116. package/build/components/publish-date-time-picker/index.js.map +1 -1
  117. package/build/components/rich-text/index.js +27 -19
  118. package/build/components/rich-text/index.js.map +1 -1
  119. package/build/components/rich-text/index.native.js +11 -20
  120. package/build/components/rich-text/index.native.js.map +1 -1
  121. package/build/components/text-decoration-control/index.js +1 -1
  122. package/build/components/text-decoration-control/index.js.map +1 -1
  123. package/build/components/text-transform-control/index.js +1 -1
  124. package/build/components/text-transform-control/index.js.map +1 -1
  125. package/build/components/tool-selector/index.js +6 -11
  126. package/build/components/tool-selector/index.js.map +1 -1
  127. package/build/components/url-popover/index.js +1 -1
  128. package/build/components/url-popover/index.js.map +1 -1
  129. package/build/components/use-block-drop-zone/index.js +7 -4
  130. package/build/components/use-block-drop-zone/index.js.map +1 -1
  131. package/build/components/use-moving-animation/index.js +9 -28
  132. package/build/components/use-moving-animation/index.js.map +1 -1
  133. package/build/components/writing-flow/use-select-all.js +1 -7
  134. package/build/components/writing-flow/use-select-all.js.map +1 -1
  135. package/build/hooks/align.js +14 -2
  136. package/build/hooks/align.js.map +1 -1
  137. package/build/hooks/color-panel.js +2 -1
  138. package/build/hooks/color-panel.js.map +1 -1
  139. package/build/hooks/content-lock-ui.js +145 -0
  140. package/build/hooks/content-lock-ui.js.map +1 -0
  141. package/build/hooks/duotone.js +8 -1
  142. package/build/hooks/duotone.js.map +1 -1
  143. package/build/hooks/index.js +14 -0
  144. package/build/hooks/index.js.map +1 -1
  145. package/build/hooks/layout.js +11 -9
  146. package/build/hooks/layout.js.map +1 -1
  147. package/build/hooks/metadata-name.js +55 -0
  148. package/build/hooks/metadata-name.js.map +1 -0
  149. package/build/hooks/metadata.js +65 -0
  150. package/build/hooks/metadata.js.map +1 -0
  151. package/build/hooks/use-typography-props.js +51 -0
  152. package/build/hooks/use-typography-props.js.map +1 -0
  153. package/build/hooks/utils.js +3 -1
  154. package/build/hooks/utils.js.map +1 -1
  155. package/build/index.js +7 -0
  156. package/build/index.js.map +1 -1
  157. package/build/layouts/constrained.js +59 -20
  158. package/build/layouts/constrained.js.map +1 -1
  159. package/build/store/actions.js +65 -21
  160. package/build/store/actions.js.map +1 -1
  161. package/build/store/reducer.js +39 -18
  162. package/build/store/reducer.js.map +1 -1
  163. package/build/store/selectors.js +95 -9
  164. package/build/store/selectors.js.map +1 -1
  165. package/build/utils/parse-css-unit-to-px.js +1 -1
  166. package/build/utils/parse-css-unit-to-px.js.map +1 -1
  167. package/build-module/components/alignment-control/ui.js +6 -5
  168. package/build-module/components/alignment-control/ui.js.map +1 -1
  169. package/build-module/components/block-actions/index.js +5 -8
  170. package/build-module/components/block-actions/index.js.map +1 -1
  171. package/build-module/components/block-alignment-control/ui.js +5 -5
  172. package/build-module/components/block-alignment-control/ui.js.map +1 -1
  173. package/build-module/components/block-content-overlay/index.js +2 -4
  174. package/build-module/components/block-content-overlay/index.js.map +1 -1
  175. package/build-module/components/block-draggable/draggable-chip.js +2 -1
  176. package/build-module/components/block-draggable/draggable-chip.js.map +1 -1
  177. package/build-module/components/block-edit/edit.js +1 -1
  178. package/build-module/components/block-edit/edit.js.map +1 -1
  179. package/build-module/components/block-inspector/index.js +127 -19
  180. package/build-module/components/block-inspector/index.js.map +1 -1
  181. package/build-module/components/block-list/block.js +41 -9
  182. package/build-module/components/block-list/block.js.map +1 -1
  183. package/build-module/components/block-list/index.js +4 -4
  184. package/build-module/components/block-list/index.js.map +1 -1
  185. package/build-module/components/block-list/use-block-props/index.js +13 -11
  186. package/build-module/components/block-list/use-block-props/index.js.map +1 -1
  187. package/build-module/components/block-list/use-block-props/use-block-class-names.js +3 -2
  188. package/build-module/components/block-list/use-block-props/use-block-class-names.js.map +1 -1
  189. package/build-module/components/block-list/use-block-props/use-focus-first-element.js +3 -8
  190. package/build-module/components/block-list/use-block-props/use-focus-first-element.js.map +1 -1
  191. package/build-module/components/block-list/use-block-props/use-is-hovered.js +1 -2
  192. package/build-module/components/block-list/use-block-props/use-is-hovered.js.map +1 -1
  193. package/build-module/components/block-list/use-in-between-inserter.js +7 -12
  194. package/build-module/components/block-list/use-in-between-inserter.js.map +1 -1
  195. package/build-module/components/block-list-appender/index.js +20 -20
  196. package/build-module/components/block-list-appender/index.js.map +1 -1
  197. package/build-module/components/block-list-appender/index.native.js +1 -6
  198. package/build-module/components/block-list-appender/index.native.js.map +1 -1
  199. package/build-module/components/block-lock/use-block-lock.js +3 -1
  200. package/build-module/components/block-lock/use-block-lock.js.map +1 -1
  201. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js +20 -9
  202. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  203. package/build-module/components/block-mover/button.js +4 -5
  204. package/build-module/components/block-mover/button.js.map +1 -1
  205. package/build-module/components/block-mover/index.js +4 -5
  206. package/build-module/components/block-mover/index.js.map +1 -1
  207. package/build-module/components/block-mover/index.native.js +24 -7
  208. package/build-module/components/block-mover/index.native.js.map +1 -1
  209. package/build-module/components/block-popover/inbetween.js +59 -17
  210. package/build-module/components/block-popover/inbetween.js.map +1 -1
  211. package/build-module/components/block-popover/index.js +3 -2
  212. package/build-module/components/block-popover/index.js.map +1 -1
  213. package/build-module/components/block-preview/auto.js +4 -2
  214. package/build-module/components/block-preview/auto.js.map +1 -1
  215. package/build-module/components/block-settings-menu/block-settings-dropdown.js +3 -1
  216. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  217. package/build-module/components/block-settings-menu-controls/index.js +3 -1
  218. package/build-module/components/block-settings-menu-controls/index.js.map +1 -1
  219. package/build-module/components/block-styles/preview-panel.js +6 -1
  220. package/build-module/components/block-styles/preview-panel.js.map +1 -1
  221. package/build-module/components/block-switcher/block-transformations-menu.js +115 -27
  222. package/build-module/components/block-switcher/block-transformations-menu.js.map +1 -1
  223. package/build-module/components/block-toolbar/index.js +9 -8
  224. package/build-module/components/block-toolbar/index.js.map +1 -1
  225. package/build-module/components/block-tools/block-contextual-toolbar.js +3 -2
  226. package/build-module/components/block-tools/block-contextual-toolbar.js.map +1 -1
  227. package/build-module/components/block-tools/block-selection-button.js +12 -5
  228. package/build-module/components/block-tools/block-selection-button.js.map +1 -1
  229. package/build-module/components/block-tools/index.js +30 -15
  230. package/build-module/components/block-tools/index.js.map +1 -1
  231. package/build-module/components/block-tools/insertion-point.js +4 -9
  232. package/build-module/components/block-tools/insertion-point.js.map +1 -1
  233. package/build-module/components/block-tools/selected-block-popover.js +9 -8
  234. package/build-module/components/block-tools/selected-block-popover.js.map +1 -1
  235. package/build-module/components/block-tools/use-block-toolbar-popover-props.js +13 -8
  236. package/build-module/components/block-tools/use-block-toolbar-popover-props.js.map +1 -1
  237. package/build-module/components/block-tools/zoom-out-mode-inserters.js +59 -0
  238. package/build-module/components/block-tools/zoom-out-mode-inserters.js.map +1 -0
  239. package/build-module/components/block-vertical-alignment-control/ui.js +5 -2
  240. package/build-module/components/block-vertical-alignment-control/ui.js.map +1 -1
  241. package/build-module/components/colors-gradients/dropdown.js +1 -1
  242. package/build-module/components/colors-gradients/dropdown.js.map +1 -1
  243. package/build-module/components/iframe/index.js +32 -5
  244. package/build-module/components/iframe/index.js.map +1 -1
  245. package/build-module/components/inner-blocks/default-block-appender.js +1 -6
  246. package/build-module/components/inner-blocks/default-block-appender.js.map +1 -1
  247. package/build-module/components/inner-blocks/index.js +2 -2
  248. package/build-module/components/inner-blocks/index.js.map +1 -1
  249. package/build-module/components/inner-blocks/use-inner-block-template-sync.js +5 -5
  250. package/build-module/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  251. package/build-module/components/inner-blocks/use-nested-settings-update.js +1 -1
  252. package/build-module/components/inner-blocks/use-nested-settings-update.js.map +1 -1
  253. package/build-module/components/inserter/index.js +3 -6
  254. package/build-module/components/inserter/index.js.map +1 -1
  255. package/build-module/components/inserter/library.js +14 -3
  256. package/build-module/components/inserter/library.js.map +1 -1
  257. package/build-module/components/inserter/menu.js +20 -8
  258. package/build-module/components/inserter/menu.js.map +1 -1
  259. package/build-module/components/inserter/preview-panel.js +1 -1
  260. package/build-module/components/inserter/preview-panel.js.map +1 -1
  261. package/build-module/components/inserter/tabs.js +11 -4
  262. package/build-module/components/inserter/tabs.js.map +1 -1
  263. package/build-module/components/link-control/link-preview.js +1 -1
  264. package/build-module/components/link-control/link-preview.js.map +1 -1
  265. package/build-module/components/link-control/search-input.js +6 -2
  266. package/build-module/components/link-control/search-input.js.map +1 -1
  267. package/build-module/components/link-control/search-item.js +37 -6
  268. package/build-module/components/link-control/search-item.js.map +1 -1
  269. package/build-module/components/list-view/block.js +23 -11
  270. package/build-module/components/list-view/block.js.map +1 -1
  271. package/build-module/components/list-view/branch.js +19 -3
  272. package/build-module/components/list-view/branch.js.map +1 -1
  273. package/build-module/components/list-view/index.js +8 -4
  274. package/build-module/components/list-view/index.js.map +1 -1
  275. package/build-module/components/list-view/use-block-selection.js +0 -1
  276. package/build-module/components/list-view/use-block-selection.js.map +1 -1
  277. package/build-module/components/provider/use-block-sync.js +1 -6
  278. package/build-module/components/provider/use-block-sync.js.map +1 -1
  279. package/build-module/components/publish-date-time-picker/index.js +1 -1
  280. package/build-module/components/publish-date-time-picker/index.js.map +1 -1
  281. package/build-module/components/rich-text/index.js +27 -18
  282. package/build-module/components/rich-text/index.js.map +1 -1
  283. package/build-module/components/rich-text/index.native.js +11 -18
  284. package/build-module/components/rich-text/index.native.js.map +1 -1
  285. package/build-module/components/text-decoration-control/index.js +1 -1
  286. package/build-module/components/text-decoration-control/index.js.map +1 -1
  287. package/build-module/components/text-transform-control/index.js +1 -1
  288. package/build-module/components/text-transform-control/index.js.map +1 -1
  289. package/build-module/components/tool-selector/index.js +6 -11
  290. package/build-module/components/tool-selector/index.js.map +1 -1
  291. package/build-module/components/url-popover/index.js +1 -1
  292. package/build-module/components/url-popover/index.js.map +1 -1
  293. package/build-module/components/use-block-drop-zone/index.js +7 -4
  294. package/build-module/components/use-block-drop-zone/index.js.map +1 -1
  295. package/build-module/components/use-moving-animation/index.js +9 -28
  296. package/build-module/components/use-moving-animation/index.js.map +1 -1
  297. package/build-module/components/writing-flow/use-select-all.js +1 -6
  298. package/build-module/components/writing-flow/use-select-all.js.map +1 -1
  299. package/build-module/hooks/align.js +12 -2
  300. package/build-module/hooks/align.js.map +1 -1
  301. package/build-module/hooks/color-panel.js +2 -1
  302. package/build-module/hooks/color-panel.js.map +1 -1
  303. package/build-module/hooks/content-lock-ui.js +128 -0
  304. package/build-module/hooks/content-lock-ui.js.map +1 -0
  305. package/build-module/hooks/duotone.js +6 -1
  306. package/build-module/hooks/duotone.js.map +1 -1
  307. package/build-module/hooks/index.js +4 -0
  308. package/build-module/hooks/index.js.map +1 -1
  309. package/build-module/hooks/layout.js +11 -9
  310. package/build-module/hooks/layout.js.map +1 -1
  311. package/build-module/hooks/metadata-name.js +45 -0
  312. package/build-module/hooks/metadata-name.js.map +1 -0
  313. package/build-module/hooks/metadata.js +50 -0
  314. package/build-module/hooks/metadata.js.map +1 -0
  315. package/build-module/hooks/use-typography-props.js +38 -0
  316. package/build-module/hooks/use-typography-props.js.map +1 -0
  317. package/build-module/hooks/utils.js +4 -2
  318. package/build-module/hooks/utils.js.map +1 -1
  319. package/build-module/index.js +1 -1
  320. package/build-module/index.js.map +1 -1
  321. package/build-module/layouts/constrained.js +61 -22
  322. package/build-module/layouts/constrained.js.map +1 -1
  323. package/build-module/store/actions.js +58 -20
  324. package/build-module/store/actions.js.map +1 -1
  325. package/build-module/store/reducer.js +37 -18
  326. package/build-module/store/reducer.js.map +1 -1
  327. package/build-module/store/selectors.js +80 -9
  328. package/build-module/store/selectors.js.map +1 -1
  329. package/build-module/utils/parse-css-unit-to-px.js +1 -1
  330. package/build-module/utils/parse-css-unit-to-px.js.map +1 -1
  331. package/build-style/style-rtl.css +95 -45
  332. package/build-style/style.css +95 -45
  333. package/package.json +28 -28
  334. package/src/components/alignment-control/test/__snapshots__/index.js.snap +137 -108
  335. package/src/components/alignment-control/test/index.js +124 -33
  336. package/src/components/alignment-control/ui.js +8 -3
  337. package/src/components/block-actions/index.js +9 -8
  338. package/src/components/block-alignment-control/test/__snapshots__/index.js.snap +108 -65
  339. package/src/components/block-alignment-control/test/index.js +95 -31
  340. package/src/components/block-alignment-control/ui.js +2 -2
  341. package/src/components/block-compare/test/__snapshots__/block-view.js.snap +28 -26
  342. package/src/components/block-compare/test/block-view.js +3 -3
  343. package/src/components/block-content-overlay/index.js +2 -6
  344. package/src/components/block-content-overlay/style.scss +24 -3
  345. package/src/components/block-draggable/draggable-chip.js +4 -1
  346. package/src/components/block-edit/edit.js +5 -1
  347. package/src/components/block-edit/test/edit.js +23 -21
  348. package/src/components/block-icon/test/__snapshots__/index.js.snap +22 -0
  349. package/src/components/block-icon/test/index.js +31 -16
  350. package/src/components/block-inspector/index.js +126 -12
  351. package/src/components/block-inspector/style.scss +7 -1
  352. package/src/components/block-list/block.js +53 -13
  353. package/src/components/block-list/index.js +4 -4
  354. package/src/components/block-list/style.scss +39 -12
  355. package/src/components/block-list/test/block-list-context.native.js +11 -13
  356. package/src/components/block-list/use-block-props/index.js +10 -10
  357. package/src/components/block-list/use-block-props/use-block-class-names.js +4 -1
  358. package/src/components/block-list/use-block-props/use-focus-first-element.js +3 -8
  359. package/src/components/block-list/use-block-props/use-is-hovered.js +2 -2
  360. package/src/components/block-list/use-in-between-inserter.js +11 -13
  361. package/src/components/block-list-appender/index.js +27 -18
  362. package/src/components/block-list-appender/index.native.js +3 -6
  363. package/src/components/block-lock/use-block-lock.js +2 -0
  364. package/src/components/block-mobile-toolbar/block-actions-menu.native.js +15 -9
  365. package/src/components/block-mover/button.js +6 -5
  366. package/src/components/block-mover/index.js +8 -7
  367. package/src/components/block-mover/index.native.js +20 -13
  368. package/src/components/block-popover/inbetween.js +85 -21
  369. package/src/components/block-popover/index.js +3 -2
  370. package/src/components/block-popover/style.scss +3 -4
  371. package/src/components/block-preview/auto.js +4 -2
  372. package/src/components/block-settings-menu/block-settings-dropdown.js +4 -0
  373. package/src/components/block-settings-menu-controls/README.md +9 -0
  374. package/src/components/block-settings-menu-controls/index.js +13 -2
  375. package/src/components/block-styles/preview-panel.js +3 -0
  376. package/src/components/block-switcher/block-transformations-menu.js +127 -33
  377. package/src/components/block-switcher/style.scss +4 -2
  378. package/src/components/block-title/test/index.js +28 -25
  379. package/src/components/block-toolbar/index.js +27 -17
  380. package/src/components/block-tools/block-contextual-toolbar.js +10 -3
  381. package/src/components/block-tools/block-selection-button.js +35 -16
  382. package/src/components/block-tools/index.js +40 -24
  383. package/src/components/block-tools/insertion-point.js +3 -7
  384. package/src/components/block-tools/selected-block-popover.js +9 -7
  385. package/src/components/block-tools/style.scss +5 -0
  386. package/src/components/block-tools/use-block-toolbar-popover-props.js +19 -6
  387. package/src/components/block-tools/zoom-out-mode-inserters.js +57 -0
  388. package/src/components/block-vertical-alignment-control/test/__snapshots__/index.js.snap +91 -51
  389. package/src/components/block-vertical-alignment-control/test/index.js +92 -23
  390. package/src/components/block-vertical-alignment-control/ui.js +3 -2
  391. package/src/components/color-palette/test/__snapshots__/control.js.snap +3 -12
  392. package/src/components/colors/test/with-colors.js +37 -12
  393. package/src/components/colors-gradients/dropdown.js +1 -1
  394. package/src/components/contrast-checker/test/index.js +135 -116
  395. package/src/components/default-block-appender/test/__snapshots__/index.js.snap +39 -57
  396. package/src/components/default-block-appender/test/index.js +32 -18
  397. package/src/components/font-sizes/README.MD +9 -0
  398. package/src/components/iframe/index.js +64 -5
  399. package/src/components/inner-blocks/README.md +2 -1
  400. package/src/components/inner-blocks/default-block-appender.js +1 -6
  401. package/src/components/inner-blocks/index.js +3 -2
  402. package/src/components/inner-blocks/use-inner-block-template-sync.js +9 -5
  403. package/src/components/inner-blocks/use-nested-settings-update.js +3 -1
  404. package/src/components/inserter/index.js +2 -8
  405. package/src/components/inserter/library.js +11 -5
  406. package/src/components/inserter/menu.js +42 -29
  407. package/src/components/inserter/preview-panel.js +1 -1
  408. package/src/components/inserter/stories/fixtures.js +44 -0
  409. package/src/components/inserter/stories/index.js +90 -0
  410. package/src/components/inserter/style.scss +21 -27
  411. package/src/components/inserter/tabs.js +8 -4
  412. package/src/components/link-control/link-preview.js +5 -3
  413. package/src/components/link-control/search-input.js +2 -2
  414. package/src/components/link-control/search-item.js +39 -7
  415. package/src/components/list-view/block.js +29 -10
  416. package/src/components/list-view/branch.js +27 -4
  417. package/src/components/list-view/index.js +8 -3
  418. package/src/components/list-view/use-block-selection.js +0 -1
  419. package/src/components/media-placeholder/test/index.js +2 -2
  420. package/src/components/media-replace-flow/README.md +1 -1
  421. package/src/components/provider/use-block-sync.js +3 -6
  422. package/src/components/publish-date-time-picker/index.js +1 -1
  423. package/src/components/rich-text/index.js +24 -35
  424. package/src/components/rich-text/index.native.js +8 -21
  425. package/src/components/text-decoration-control/index.js +1 -1
  426. package/src/components/text-transform-control/index.js +1 -1
  427. package/src/components/tool-selector/index.js +9 -11
  428. package/src/components/url-input/test/button.js +145 -71
  429. package/src/components/url-popover/index.js +1 -1
  430. package/src/components/url-popover/test/__snapshots__/index.js.snap +108 -80
  431. package/src/components/url-popover/test/index.js +14 -12
  432. package/src/components/use-block-drop-zone/index.js +15 -4
  433. package/src/components/use-moving-animation/index.js +9 -24
  434. package/src/components/warning/test/__snapshots__/index.js.snap +11 -14
  435. package/src/components/warning/test/index.js +32 -29
  436. package/src/components/writing-flow/use-select-all.js +4 -6
  437. package/src/hooks/align.js +22 -13
  438. package/src/hooks/color-panel.js +2 -1
  439. package/src/hooks/content-lock-ui.js +161 -0
  440. package/src/hooks/duotone.js +13 -1
  441. package/src/hooks/index.js +4 -0
  442. package/src/hooks/layout.js +25 -19
  443. package/src/hooks/layout.scss +7 -1
  444. package/src/hooks/metadata-name.js +48 -0
  445. package/src/hooks/metadata.js +64 -0
  446. package/src/hooks/test/use-typography-props.js +28 -0
  447. package/src/hooks/use-typography-props.js +41 -0
  448. package/src/hooks/utils.js +2 -11
  449. package/src/index.js +1 -0
  450. package/src/layouts/constrained.js +73 -24
  451. package/src/store/actions.js +45 -4
  452. package/src/store/reducer.js +33 -21
  453. package/src/store/selectors.js +98 -19
  454. package/src/store/test/reducer.js +8 -5
  455. package/src/utils/parse-css-unit-to-px.js +1 -1
  456. package/src/components/colors/test/__snapshots__/with-colors.js.snap +0 -23
@@ -2,7 +2,6 @@
2
2
  * External dependencies
3
3
  */
4
4
  import classnames from 'classnames';
5
- import { castArray, first, last } from 'lodash';
6
5
 
7
6
  /**
8
7
  * WordPress dependencies
@@ -62,7 +61,10 @@ const BlockMoverButton = forwardRef(
62
61
  ref
63
62
  ) => {
64
63
  const instanceId = useInstanceId( BlockMoverButton );
65
- const blocksCount = castArray( clientIds ).length;
64
+ const normalizedClientIds = Array.isArray( clientIds )
65
+ ? clientIds
66
+ : [ clientIds ];
67
+ const blocksCount = normalizedClientIds.length;
66
68
 
67
69
  const {
68
70
  blockType,
@@ -81,12 +83,11 @@ const BlockMoverButton = forwardRef(
81
83
  getBlock,
82
84
  getBlockListSettings,
83
85
  } = select( blockEditorStore );
84
- const normalizedClientIds = castArray( clientIds );
85
- const firstClientId = first( normalizedClientIds );
86
+ const firstClientId = normalizedClientIds[ 0 ];
86
87
  const blockRootClientId = getBlockRootClientId( firstClientId );
87
88
  const firstBlockIndex = getBlockIndex( firstClientId );
88
89
  const lastBlockIndex = getBlockIndex(
89
- last( normalizedClientIds )
90
+ normalizedClientIds[ normalizedClientIds.length - 1 ]
90
91
  );
91
92
  const blockOrder = getBlockOrder( blockRootClientId );
92
93
  const block = getBlock( firstClientId );
@@ -1,7 +1,6 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { first, last, castArray } from 'lodash';
5
4
  import classnames from 'classnames';
6
5
 
7
6
  /**
@@ -30,13 +29,15 @@ function BlockMover( { clientIds, hideDragHandle } ) {
30
29
  getBlockOrder,
31
30
  getBlockRootClientId,
32
31
  } = select( blockEditorStore );
33
- const normalizedClientIds = castArray( clientIds );
34
- const firstClientId = first( normalizedClientIds );
35
- const _rootClientId = getBlockRootClientId(
36
- first( normalizedClientIds )
37
- );
32
+ const normalizedClientIds = Array.isArray( clientIds )
33
+ ? clientIds
34
+ : [ clientIds ];
35
+ const firstClientId = normalizedClientIds[ 0 ];
36
+ const _rootClientId = getBlockRootClientId( firstClientId );
38
37
  const firstIndex = getBlockIndex( firstClientId );
39
- const lastIndex = getBlockIndex( last( normalizedClientIds ) );
38
+ const lastIndex = getBlockIndex(
39
+ normalizedClientIds[ normalizedClientIds.length - 1 ]
40
+ );
40
41
  const blockOrder = getBlockOrder( _rootClientId );
41
42
 
42
43
  return {
@@ -1,7 +1,6 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { first, last, partial, castArray } from 'lodash';
5
4
  import { Platform } from 'react-native';
6
5
 
7
6
  /**
@@ -149,12 +148,16 @@ export default compose(
149
148
  getBlockRootClientId,
150
149
  getBlockOrder,
151
150
  } = select( blockEditorStore );
152
- const normalizedClientIds = castArray( clientIds );
153
- const firstClientId = first( normalizedClientIds );
151
+ const normalizedClientIds = Array.isArray( clientIds )
152
+ ? clientIds
153
+ : [ clientIds ];
154
+ const firstClientId = normalizedClientIds[ 0 ];
154
155
  const rootClientId = getBlockRootClientId( firstClientId );
155
156
  const blockOrder = getBlockOrder( rootClientId );
156
157
  const firstIndex = getBlockIndex( firstClientId );
157
- const lastIndex = getBlockIndex( last( normalizedClientIds ) );
158
+ const lastIndex = getBlockIndex(
159
+ normalizedClientIds[ normalizedClientIds.length - 1 ]
160
+ );
158
161
 
159
162
  return {
160
163
  firstIndex,
@@ -169,15 +172,19 @@ export default compose(
169
172
  const { moveBlocksDown, moveBlocksUp, moveBlocksToPosition } =
170
173
  dispatch( blockEditorStore );
171
174
  return {
172
- onMoveDown: partial( moveBlocksDown, clientIds, rootClientId ),
173
- onMoveUp: partial( moveBlocksUp, clientIds, rootClientId ),
174
- onLongMove: ( targetIndex ) =>
175
- partial(
176
- moveBlocksToPosition,
177
- clientIds,
178
- rootClientId,
179
- targetIndex
180
- ),
175
+ onMoveDown: ( ...args ) =>
176
+ moveBlocksDown( clientIds, rootClientId, ...args ),
177
+ onMoveUp: ( ...args ) =>
178
+ moveBlocksUp( clientIds, rootClientId, ...args ),
179
+ onLongMove:
180
+ ( targetIndex ) =>
181
+ ( ...args ) =>
182
+ moveBlocksToPosition(
183
+ clientIds,
184
+ rootClientId,
185
+ targetIndex,
186
+ ...args
187
+ ),
181
188
  };
182
189
  } ),
183
190
  withInstanceId
@@ -7,7 +7,13 @@ import classnames from 'classnames';
7
7
  * WordPress dependencies
8
8
  */
9
9
  import { useSelect } from '@wordpress/data';
10
- import { useCallback, useMemo, createContext } from '@wordpress/element';
10
+ import {
11
+ useCallback,
12
+ useMemo,
13
+ createContext,
14
+ useReducer,
15
+ useLayoutEffect,
16
+ } from '@wordpress/element';
11
17
  import { Popover } from '@wordpress/components';
12
18
  import { isRTL } from '@wordpress/i18n';
13
19
 
@@ -28,6 +34,12 @@ function BlockPopoverInbetween( {
28
34
  __unstableContentRef,
29
35
  ...props
30
36
  } ) {
37
+ // This is a temporary hack to get the inbetween inserter to recompute properly.
38
+ const [ positionRecompute, forceRecompute ] = useReducer(
39
+ ( s ) => s + 1,
40
+ 0
41
+ );
42
+
31
43
  const { orientation, rootClientId, isVisible } = useSelect(
32
44
  ( select ) => {
33
45
  const {
@@ -36,7 +48,9 @@ function BlockPopoverInbetween( {
36
48
  isBlockVisible,
37
49
  } = select( blockEditorStore );
38
50
 
39
- const _rootClientId = getBlockRootClientId( previousClientId );
51
+ const _rootClientId = getBlockRootClientId(
52
+ previousClientId ?? nextClientId
53
+ );
40
54
  return {
41
55
  orientation:
42
56
  getBlockListSettings( _rootClientId )?.orientation ||
@@ -47,7 +61,7 @@ function BlockPopoverInbetween( {
47
61
  isBlockVisible( nextClientId ),
48
62
  };
49
63
  },
50
- [ previousClientId ]
64
+ [ previousClientId, nextClientId ]
51
65
  );
52
66
  const previousElement = useBlockElement( previousClientId );
53
67
  const nextElement = useBlockElement( nextClientId );
@@ -66,9 +80,7 @@ function BlockPopoverInbetween( {
66
80
 
67
81
  if ( isVertical ) {
68
82
  return {
69
- width: previousElement
70
- ? previousElement.offsetWidth
71
- : nextElement.offsetWidth,
83
+ width: previousRect ? previousRect.width : nextRect.width,
72
84
  height:
73
85
  nextRect && previousRect
74
86
  ? nextRect.top - previousRect.bottom
@@ -85,11 +97,15 @@ function BlockPopoverInbetween( {
85
97
 
86
98
  return {
87
99
  width,
88
- height: previousElement
89
- ? previousElement.offsetHeight
90
- : nextElement.offsetHeight,
100
+ height: previousRect ? previousRect.height : nextRect.height,
91
101
  };
92
- }, [ previousElement, nextElement, isVertical ] );
102
+ }, [
103
+ previousElement,
104
+ nextElement,
105
+ isVertical,
106
+ positionRecompute,
107
+ isVisible,
108
+ ] );
93
109
 
94
110
  const getAnchorRect = useCallback( () => {
95
111
  if ( ( ! previousElement && ! nextElement ) || ! isVisible ) {
@@ -110,8 +126,8 @@ function BlockPopoverInbetween( {
110
126
  return {
111
127
  top: previousRect ? previousRect.bottom : nextRect.top,
112
128
  left: previousRect ? previousRect.right : nextRect.right,
113
- right: previousRect ? previousRect.left : nextRect.left,
114
- bottom: nextRect ? nextRect.top : previousRect.bottom,
129
+ right: previousRect ? previousRect.right : nextRect.right,
130
+ bottom: previousRect ? previousRect.bottom : nextRect.top,
115
131
  height: 0,
116
132
  width: 0,
117
133
  ownerDocument,
@@ -121,8 +137,8 @@ function BlockPopoverInbetween( {
121
137
  return {
122
138
  top: previousRect ? previousRect.bottom : nextRect.top,
123
139
  left: previousRect ? previousRect.left : nextRect.left,
124
- right: previousRect ? previousRect.right : nextRect.right,
125
- bottom: nextRect ? nextRect.top : previousRect.bottom,
140
+ right: previousRect ? previousRect.left : nextRect.left,
141
+ bottom: previousRect ? previousRect.bottom : nextRect.top,
126
142
  height: 0,
127
143
  width: 0,
128
144
  ownerDocument,
@@ -133,8 +149,8 @@ function BlockPopoverInbetween( {
133
149
  return {
134
150
  top: previousRect ? previousRect.top : nextRect.top,
135
151
  left: previousRect ? previousRect.left : nextRect.right,
136
- right: nextRect ? nextRect.right : previousRect.left,
137
- bottom: previousRect ? previousRect.bottom : nextRect.bottom,
152
+ right: previousRect ? previousRect.left : nextRect.right,
153
+ bottom: previousRect ? previousRect.top : nextRect.top,
138
154
  height: 0,
139
155
  width: 0,
140
156
  ownerDocument,
@@ -144,16 +160,57 @@ function BlockPopoverInbetween( {
144
160
  return {
145
161
  top: previousRect ? previousRect.top : nextRect.top,
146
162
  left: previousRect ? previousRect.right : nextRect.left,
147
- right: nextRect ? nextRect.left : previousRect.right,
148
- bottom: previousRect ? previousRect.bottom : nextRect.bottom,
163
+ right: previousRect ? previousRect.right : nextRect.left,
164
+ bottom: previousRect ? previousRect.left : nextRect.right,
149
165
  height: 0,
150
166
  width: 0,
151
167
  ownerDocument,
152
168
  };
153
- }, [ previousElement, nextElement ] );
169
+ }, [ previousElement, nextElement, positionRecompute, isVisible ] );
154
170
 
155
171
  const popoverScrollRef = usePopoverScroll( __unstableContentRef );
156
172
 
173
+ // This is only needed for a smooth transition when moving blocks.
174
+ useLayoutEffect( () => {
175
+ if ( ! previousElement ) {
176
+ return;
177
+ }
178
+ const observer = new window.MutationObserver( forceRecompute );
179
+ observer.observe( previousElement, { attributes: true } );
180
+
181
+ return () => {
182
+ observer.disconnect();
183
+ };
184
+ }, [ previousElement ] );
185
+
186
+ useLayoutEffect( () => {
187
+ if ( ! nextElement ) {
188
+ return;
189
+ }
190
+ const observer = new window.MutationObserver( forceRecompute );
191
+ observer.observe( nextElement, { attributes: true } );
192
+
193
+ return () => {
194
+ observer.disconnect();
195
+ };
196
+ }, [ nextElement ] );
197
+
198
+ useLayoutEffect( () => {
199
+ if ( ! previousElement ) {
200
+ return;
201
+ }
202
+ previousElement.ownerDocument.defaultView.addEventListener(
203
+ 'resize',
204
+ forceRecompute
205
+ );
206
+ return () => {
207
+ previousElement.ownerDocument.defaultView.removeEventListener(
208
+ 'resize',
209
+ forceRecompute
210
+ );
211
+ };
212
+ }, [ previousElement ] );
213
+
157
214
  // If there's either a previous or a next element, show the inbetween popover.
158
215
  // Note that drag and drop uses the inbetween popover to show the drop indicator
159
216
  // before the first block and after the last block.
@@ -186,9 +243,16 @@ function BlockPopoverInbetween( {
186
243
  'block-editor-block-popover__inbetween',
187
244
  props.className
188
245
  ) }
189
- __unstableForcePosition
246
+ resize={ false }
247
+ flip={ false }
248
+ placement="bottom-start"
190
249
  >
191
- <div style={ style }>{ children }</div>
250
+ <div
251
+ className="block-editor-block-popover__inbetween-container"
252
+ style={ style }
253
+ >
254
+ { children }
255
+ </div>
192
256
  </Popover>
193
257
  );
194
258
  /* eslint-enable jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events */
@@ -66,8 +66,9 @@ function BlockPopover(
66
66
  // Render in the old slot if needed for backward compatibility,
67
67
  // otherwise render in place (not in the default popover slot).
68
68
  __unstableSlotName={ __unstablePopoverSlot || null }
69
- __unstableForcePosition
70
- __unstableShift
69
+ resize={ false }
70
+ flip={ false }
71
+ shift
71
72
  { ...props }
72
73
  className={ classnames(
73
74
  'block-editor-block-popover',
@@ -6,6 +6,9 @@
6
6
  // like the popover is impacted by the block gap margin.
7
7
  margin: 0 !important;
8
8
 
9
+ // Allow clicking through the toolbar holder.
10
+ pointer-events: none;
11
+
9
12
  .components-popover__content {
10
13
  margin: 0 !important;
11
14
  min-width: auto;
@@ -15,9 +18,6 @@
15
18
  outline: none;
16
19
  box-shadow: none;
17
20
  overflow-y: visible;
18
-
19
- // Allow clicking through the toolbar holder.
20
- pointer-events: none;
21
21
  }
22
22
 
23
23
  // Enable pointer events for the toolbar's content.
@@ -39,7 +39,6 @@
39
39
  }
40
40
 
41
41
  // Re-enable pointer events when the inbetween inserter has a '+' button.
42
- //
43
42
  // Needs specificity, do not simplify.
44
43
  .is-with-inserter {
45
44
  pointer-events: all;
@@ -91,8 +91,10 @@ function AutoBlockPreview( {
91
91
  bodyElement.style.padding =
92
92
  __experimentalPadding + 'px';
93
93
 
94
- // necessary for contentResizeListener to work.
95
- bodyElement.style.position = 'relative';
94
+ // Necessary for contentResizeListener to work.
95
+ bodyElement.style.boxSizing = 'border-box';
96
+ bodyElement.style.position = 'absolute';
97
+ bodyElement.style.width = '100%';
96
98
  }, [] ) }
97
99
  aria-hidden
98
100
  tabIndex={ -1 }
@@ -51,6 +51,7 @@ export function BlockSettingsDropdown( {
51
51
  clientIds,
52
52
  __experimentalSelectBlock,
53
53
  children,
54
+ __unstableDisplayLocation,
54
55
  ...props
55
56
  } ) {
56
57
  const blockClientIds = castArray( clientIds );
@@ -289,6 +290,9 @@ export function BlockSettingsDropdown( {
289
290
  <BlockSettingsMenuControls.Slot
290
291
  fillProps={ { onClose } }
291
292
  clientIds={ clientIds }
293
+ __unstableDisplayLocation={
294
+ __unstableDisplayLocation
295
+ }
292
296
  />
293
297
  { typeof children === 'function'
294
298
  ? children( { onClose } )
@@ -16,3 +16,12 @@ 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.
@@ -25,7 +25,11 @@ import { store as blockEditorStore } from '../../store';
25
25
 
26
26
  const { Fill, Slot } = createSlotFill( 'BlockSettingsMenuControls' );
27
27
 
28
- const BlockSettingsMenuControlsSlot = ( { fillProps, clientIds = null } ) => {
28
+ const BlockSettingsMenuControlsSlot = ( {
29
+ fillProps,
30
+ clientIds = null,
31
+ __unstableDisplayLocation,
32
+ } ) => {
29
33
  const { selectedBlocks, selectedClientIds, canRemove } = useSelect(
30
34
  ( select ) => {
31
35
  const {
@@ -58,7 +62,14 @@ const BlockSettingsMenuControlsSlot = ( { fillProps, clientIds = null } ) => {
58
62
  ( isGroupable || isUngroupable ) && canRemove;
59
63
 
60
64
  return (
61
- <Slot fillProps={ { ...fillProps, selectedBlocks, selectedClientIds } }>
65
+ <Slot
66
+ fillProps={ {
67
+ ...fillProps,
68
+ __unstableDisplayLocation,
69
+ selectedBlocks,
70
+ selectedClientIds,
71
+ } }
72
+ >
62
73
  { ( fills ) => {
63
74
  if (
64
75
  ! fills?.length > 0 &&
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
+ import { getBlockType } from '@wordpress/blocks';
4
5
  import { useMemo } from '@wordpress/element';
5
6
 
6
7
  /**
@@ -15,6 +16,7 @@ export default function BlockStylesPreviewPanel( {
15
16
  className,
16
17
  activeStyle,
17
18
  } ) {
19
+ const example = getBlockType( genericPreviewBlock.name )?.example;
18
20
  const styleClassName = replaceActiveStyle( className, activeStyle, style );
19
21
  const previewBlocks = useMemo( () => {
20
22
  return {
@@ -27,6 +29,7 @@ export default function BlockStylesPreviewPanel( {
27
29
  styleClassName +
28
30
  ' block-editor-block-styles__block-preview-container',
29
31
  },
32
+ example,
30
33
  };
31
34
  }, [ genericPreviewBlock, styleClassName ] );
32
35
 
@@ -7,7 +7,7 @@ import {
7
7
  getBlockMenuDefaultClassName,
8
8
  switchToBlockType,
9
9
  } from '@wordpress/blocks';
10
- import { useState } from '@wordpress/element';
10
+ import { useState, useMemo } from '@wordpress/element';
11
11
 
12
12
  /**
13
13
  * Internal dependencies
@@ -15,6 +15,53 @@ import { useState } from '@wordpress/element';
15
15
  import BlockIcon from '../block-icon';
16
16
  import PreviewBlockPopover from './preview-block-popover';
17
17
 
18
+ /**
19
+ * Helper hook to group transformations to display them in a specific order in the UI.
20
+ * For now we group only priority content driven transformations(ex. paragraph -> heading).
21
+ *
22
+ * Later on we could also group 'layout' transformations(ex. paragraph -> group) and
23
+ * display them in different sections.
24
+ *
25
+ * @param {Object[]} possibleBlockTransformations The available block transformations.
26
+ * @return {Record<string, Object[]>} The grouped block transformations.
27
+ */
28
+ function useGroupedTransforms( possibleBlockTransformations ) {
29
+ const priorityContentTranformationBlocks = {
30
+ 'core/paragraph': 1,
31
+ 'core/heading': 2,
32
+ 'core/list': 3,
33
+ 'core/quote': 4,
34
+ };
35
+ const transformations = useMemo( () => {
36
+ const priorityTextTranformsNames = Object.keys(
37
+ priorityContentTranformationBlocks
38
+ );
39
+ return possibleBlockTransformations.reduce(
40
+ ( accumulator, item ) => {
41
+ const { name } = item;
42
+ if ( priorityTextTranformsNames.includes( name ) ) {
43
+ accumulator.priorityTextTransformations.push( item );
44
+ } else {
45
+ accumulator.restTransformations.push( item );
46
+ }
47
+ return accumulator;
48
+ },
49
+ { priorityTextTransformations: [], restTransformations: [] }
50
+ );
51
+ }, [ possibleBlockTransformations ] );
52
+
53
+ // Order the priority text transformations.
54
+ transformations.priorityTextTransformations.sort(
55
+ ( { name: currentName }, { name: nextName } ) => {
56
+ return priorityContentTranformationBlocks[ currentName ] <
57
+ priorityContentTranformationBlocks[ nextName ]
58
+ ? -1
59
+ : 1;
60
+ }
61
+ );
62
+ return transformations;
63
+ }
64
+
18
65
  const BlockTransformationsMenu = ( {
19
66
  className,
20
67
  possibleBlockTransformations,
@@ -23,41 +70,88 @@ const BlockTransformationsMenu = ( {
23
70
  } ) => {
24
71
  const [ hoveredTransformItemName, setHoveredTransformItemName ] =
25
72
  useState();
73
+
74
+ const { priorityTextTransformations, restTransformations } =
75
+ useGroupedTransforms( possibleBlockTransformations );
76
+ // We have to check if both content transformations(priority and rest) are set
77
+ // in order to create a separate MenuGroup for them.
78
+ const hasBothContentTransformations =
79
+ priorityTextTransformations.length && restTransformations.length;
80
+ const restTransformItems = !! restTransformations.length && (
81
+ <RestTransformationItems
82
+ restTransformations={ restTransformations }
83
+ onSelect={ onSelect }
84
+ setHoveredTransformItemName={ setHoveredTransformItemName }
85
+ />
86
+ );
26
87
  return (
27
- <MenuGroup label={ __( 'Transform to' ) } className={ className }>
28
- { hoveredTransformItemName && (
29
- <PreviewBlockPopover
30
- blocks={ switchToBlockType(
31
- blocks,
32
- hoveredTransformItemName
33
- ) }
34
- />
35
- ) }
36
- { possibleBlockTransformations.map( ( item ) => {
37
- const { name, icon, title, isDisabled } = item;
38
- return (
39
- <MenuItem
40
- key={ name }
41
- className={ getBlockMenuDefaultClassName( name ) }
42
- onClick={ ( event ) => {
43
- event.preventDefault();
44
- onSelect( name );
45
- } }
46
- disabled={ isDisabled }
47
- onMouseLeave={ () =>
48
- setHoveredTransformItemName( null )
88
+ <>
89
+ <MenuGroup label={ __( 'Transform to' ) } className={ className }>
90
+ { hoveredTransformItemName && (
91
+ <PreviewBlockPopover
92
+ blocks={ switchToBlockType(
93
+ blocks,
94
+ hoveredTransformItemName
95
+ ) }
96
+ />
97
+ ) }
98
+ { priorityTextTransformations.map( ( item ) => (
99
+ <BlockTranformationItem
100
+ key={ item.name }
101
+ item={ item }
102
+ onSelect={ onSelect }
103
+ setHoveredTransformItemName={
104
+ setHoveredTransformItemName
49
105
  }
50
- onMouseEnter={ () =>
51
- setHoveredTransformItemName( name )
52
- }
53
- >
54
- <BlockIcon icon={ icon } showColors />
55
- { title }
56
- </MenuItem>
57
- );
58
- } ) }
59
- </MenuGroup>
106
+ />
107
+ ) ) }
108
+ { ! hasBothContentTransformations && restTransformItems }
109
+ </MenuGroup>
110
+ { !! hasBothContentTransformations && (
111
+ <MenuGroup className={ className }>
112
+ { restTransformItems }
113
+ </MenuGroup>
114
+ ) }
115
+ </>
60
116
  );
61
117
  };
62
118
 
119
+ function RestTransformationItems( {
120
+ restTransformations,
121
+ onSelect,
122
+ setHoveredTransformItemName,
123
+ } ) {
124
+ return restTransformations.map( ( item ) => (
125
+ <BlockTranformationItem
126
+ key={ item.name }
127
+ item={ item }
128
+ onSelect={ onSelect }
129
+ setHoveredTransformItemName={ setHoveredTransformItemName }
130
+ />
131
+ ) );
132
+ }
133
+
134
+ function BlockTranformationItem( {
135
+ item,
136
+ onSelect,
137
+ setHoveredTransformItemName,
138
+ } ) {
139
+ const { name, icon, title, isDisabled } = item;
140
+ return (
141
+ <MenuItem
142
+ className={ getBlockMenuDefaultClassName( name ) }
143
+ onClick={ ( event ) => {
144
+ event.preventDefault();
145
+ onSelect( name );
146
+ } }
147
+ disabled={ isDisabled }
148
+ onMouseLeave={ () => setHoveredTransformItemName( null ) }
149
+ onMouseEnter={ () => setHoveredTransformItemName( name ) }
150
+ >
151
+ <BlockIcon icon={ icon } showColors />
152
+ { title }
153
+ </MenuItem>
154
+ );
155
+ }
156
+
63
157
  export default BlockTransformationsMenu;
@@ -119,8 +119,10 @@
119
119
  .block-editor-block-switcher__preview {
120
120
  width: 300px;
121
121
  height: auto;
122
- max-height: 500px;
123
- padding: $grid-unit-20;
122
+ // Subtract margin from max-height.
123
+ max-height: calc(500px - #{$grid-unit-40});
124
+ margin: $grid-unit-20;
125
+ overflow: hidden;
124
126
  }
125
127
  }
126
128