@wordpress/block-editor 9.8.1-next.957ca95e4c.0 → 10.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (511) 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/autocomplete/index.js +2 -2
  6. package/build/components/autocomplete/index.js.map +1 -1
  7. package/build/components/block-actions/index.js +5 -9
  8. package/build/components/block-actions/index.js.map +1 -1
  9. package/build/components/block-alignment-control/ui.js +5 -5
  10. package/build/components/block-alignment-control/ui.js.map +1 -1
  11. package/build/components/block-content-overlay/index.js +2 -4
  12. package/build/components/block-content-overlay/index.js.map +1 -1
  13. package/build/components/block-draggable/draggable-chip.js +2 -1
  14. package/build/components/block-draggable/draggable-chip.js.map +1 -1
  15. package/build/components/block-edit/edit.js +1 -1
  16. package/build/components/block-edit/edit.js.map +1 -1
  17. package/build/components/block-inspector/index.js +125 -17
  18. package/build/components/block-inspector/index.js.map +1 -1
  19. package/build/components/block-list/block-list-compact.native.js +2 -1
  20. package/build/components/block-list/block-list-compact.native.js.map +1 -1
  21. package/build/components/block-list/block.js +40 -9
  22. package/build/components/block-list/block.js.map +1 -1
  23. package/build/components/block-list/index.js +4 -4
  24. package/build/components/block-list/index.js.map +1 -1
  25. package/build/components/block-list/use-block-props/index.js +14 -11
  26. package/build/components/block-list/use-block-props/index.js.map +1 -1
  27. package/build/components/block-list/use-block-props/use-block-class-names.js +3 -2
  28. package/build/components/block-list/use-block-props/use-block-class-names.js.map +1 -1
  29. package/build/components/block-list/use-block-props/use-focus-first-element.js +3 -9
  30. package/build/components/block-list/use-block-props/use-focus-first-element.js.map +1 -1
  31. package/build/components/block-list/use-block-props/use-is-hovered.js +1 -2
  32. package/build/components/block-list/use-block-props/use-is-hovered.js.map +1 -1
  33. package/build/components/block-list/use-in-between-inserter.js +7 -12
  34. package/build/components/block-list/use-in-between-inserter.js.map +1 -1
  35. package/build/components/block-list-appender/index.js +20 -21
  36. package/build/components/block-list-appender/index.js.map +1 -1
  37. package/build/components/block-list-appender/index.native.js +1 -7
  38. package/build/components/block-list-appender/index.native.js.map +1 -1
  39. package/build/components/block-lock/use-block-lock.js +3 -1
  40. package/build/components/block-lock/use-block-lock.js.map +1 -1
  41. package/build/components/block-mobile-toolbar/block-actions-menu.native.js +20 -10
  42. package/build/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  43. package/build/components/block-mover/button.js +4 -6
  44. package/build/components/block-mover/button.js.map +1 -1
  45. package/build/components/block-mover/index.js +4 -6
  46. package/build/components/block-mover/index.js.map +1 -1
  47. package/build/components/block-mover/index.native.js +24 -8
  48. package/build/components/block-mover/index.native.js.map +1 -1
  49. package/build/components/block-popover/inbetween.js +82 -52
  50. package/build/components/block-popover/inbetween.js.map +1 -1
  51. package/build/components/block-popover/index.js +31 -7
  52. package/build/components/block-popover/index.js.map +1 -1
  53. package/build/components/block-preview/auto.js +4 -2
  54. package/build/components/block-preview/auto.js.map +1 -1
  55. package/build/components/block-settings-menu/block-settings-dropdown.js +3 -1
  56. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  57. package/build/components/block-settings-menu-controls/index.js +3 -1
  58. package/build/components/block-settings-menu-controls/index.js.map +1 -1
  59. package/build/components/block-styles/preview-panel.js +7 -1
  60. package/build/components/block-styles/preview-panel.js.map +1 -1
  61. package/build/components/block-switcher/block-transformations-menu.js +114 -25
  62. package/build/components/block-switcher/block-transformations-menu.js.map +1 -1
  63. package/build/components/block-toolbar/index.js +9 -8
  64. package/build/components/block-toolbar/index.js.map +1 -1
  65. package/build/components/block-tools/block-contextual-toolbar.js +3 -2
  66. package/build/components/block-tools/block-contextual-toolbar.js.map +1 -1
  67. package/build/components/block-tools/block-selection-button.js +13 -5
  68. package/build/components/block-tools/block-selection-button.js.map +1 -1
  69. package/build/components/block-tools/index.js +33 -15
  70. package/build/components/block-tools/index.js.map +1 -1
  71. package/build/components/block-tools/insertion-point.js +4 -9
  72. package/build/components/block-tools/insertion-point.js.map +1 -1
  73. package/build/components/block-tools/selected-block-popover.js +9 -8
  74. package/build/components/block-tools/selected-block-popover.js.map +1 -1
  75. package/build/components/block-tools/use-block-toolbar-popover-props.js +13 -8
  76. package/build/components/block-tools/use-block-toolbar-popover-props.js.map +1 -1
  77. package/build/components/block-tools/zoom-out-mode-inserters.js +71 -0
  78. package/build/components/block-tools/zoom-out-mode-inserters.js.map +1 -0
  79. package/build/components/block-vertical-alignment-control/ui.js +5 -2
  80. package/build/components/block-vertical-alignment-control/ui.js.map +1 -1
  81. package/build/components/border-radius-control/linked-button.js +5 -6
  82. package/build/components/border-radius-control/linked-button.js.map +1 -1
  83. package/build/components/colors-gradients/dropdown.js +1 -1
  84. package/build/components/colors-gradients/dropdown.js.map +1 -1
  85. package/build/components/convert-to-group-buttons/toolbar.js +8 -3
  86. package/build/components/convert-to-group-buttons/toolbar.js.map +1 -1
  87. package/build/components/iframe/index.js +31 -4
  88. package/build/components/iframe/index.js.map +1 -1
  89. package/build/components/inner-blocks/default-block-appender.js +1 -7
  90. package/build/components/inner-blocks/default-block-appender.js.map +1 -1
  91. package/build/components/inner-blocks/index.js +9 -3
  92. package/build/components/inner-blocks/index.js.map +1 -1
  93. package/build/components/inner-blocks/use-inner-block-template-sync.js +28 -17
  94. package/build/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  95. package/build/components/inner-blocks/use-nested-settings-update.js +28 -4
  96. package/build/components/inner-blocks/use-nested-settings-update.js.map +1 -1
  97. package/build/components/inserter/index.js +3 -6
  98. package/build/components/inserter/index.js.map +1 -1
  99. package/build/components/inserter/library.js +14 -3
  100. package/build/components/inserter/library.js.map +1 -1
  101. package/build/components/inserter/menu.js +21 -8
  102. package/build/components/inserter/menu.js.map +1 -1
  103. package/build/components/inserter/preview-panel.js +1 -1
  104. package/build/components/inserter/preview-panel.js.map +1 -1
  105. package/build/components/inserter/tabs.js +11 -4
  106. package/build/components/inserter/tabs.js.map +1 -1
  107. package/build/components/link-control/link-preview.js +1 -1
  108. package/build/components/link-control/link-preview.js.map +1 -1
  109. package/build/components/link-control/search-input.js +6 -3
  110. package/build/components/link-control/search-input.js.map +1 -1
  111. package/build/components/link-control/search-item.js +36 -5
  112. package/build/components/link-control/search-item.js.map +1 -1
  113. package/build/components/list-view/block.js +23 -11
  114. package/build/components/list-view/block.js.map +1 -1
  115. package/build/components/list-view/branch.js +19 -2
  116. package/build/components/list-view/branch.js.map +1 -1
  117. package/build/components/list-view/drop-indicator.js +30 -28
  118. package/build/components/list-view/drop-indicator.js.map +1 -1
  119. package/build/components/list-view/index.js +8 -4
  120. package/build/components/list-view/index.js.map +1 -1
  121. package/build/components/list-view/use-block-selection.js +0 -1
  122. package/build/components/list-view/use-block-selection.js.map +1 -1
  123. package/build/components/provider/use-block-sync.js +1 -7
  124. package/build/components/provider/use-block-sync.js.map +1 -1
  125. package/build/components/publish-date-time-picker/index.js +1 -1
  126. package/build/components/publish-date-time-picker/index.js.map +1 -1
  127. package/build/components/rich-text/format-toolbar-container.js +9 -9
  128. package/build/components/rich-text/format-toolbar-container.js.map +1 -1
  129. package/build/components/rich-text/index.js +31 -21
  130. package/build/components/rich-text/index.js.map +1 -1
  131. package/build/components/rich-text/index.native.js +11 -20
  132. package/build/components/rich-text/index.native.js.map +1 -1
  133. package/build/components/spacing-sizes-control/linked-button.js +2 -3
  134. package/build/components/spacing-sizes-control/linked-button.js.map +1 -1
  135. package/build/components/spacing-sizes-control/utils.js +1 -4
  136. package/build/components/spacing-sizes-control/utils.js.map +1 -1
  137. package/build/components/text-decoration-control/index.js +19 -15
  138. package/build/components/text-decoration-control/index.js.map +1 -1
  139. package/build/components/text-transform-control/index.js +25 -17
  140. package/build/components/text-transform-control/index.js.map +1 -1
  141. package/build/components/tool-selector/index.js +6 -11
  142. package/build/components/tool-selector/index.js.map +1 -1
  143. package/build/components/url-popover/image-url-input-ui.js +6 -4
  144. package/build/components/url-popover/image-url-input-ui.js.map +1 -1
  145. package/build/components/url-popover/index.js +1 -1
  146. package/build/components/url-popover/index.js.map +1 -1
  147. package/build/components/use-block-drop-zone/index.js +7 -4
  148. package/build/components/use-block-drop-zone/index.js.map +1 -1
  149. package/build/components/use-moving-animation/index.js +9 -28
  150. package/build/components/use-moving-animation/index.js.map +1 -1
  151. package/build/components/writing-flow/use-select-all.js +1 -7
  152. package/build/components/writing-flow/use-select-all.js.map +1 -1
  153. package/build/hooks/align.js +14 -2
  154. package/build/hooks/align.js.map +1 -1
  155. package/build/hooks/color-panel.js +2 -1
  156. package/build/hooks/color-panel.js.map +1 -1
  157. package/build/hooks/content-lock-ui.js +145 -0
  158. package/build/hooks/content-lock-ui.js.map +1 -0
  159. package/build/hooks/duotone.js +8 -1
  160. package/build/hooks/duotone.js.map +1 -1
  161. package/build/hooks/index.js +14 -0
  162. package/build/hooks/index.js.map +1 -1
  163. package/build/hooks/layout.js +11 -9
  164. package/build/hooks/layout.js.map +1 -1
  165. package/build/hooks/metadata-name.js +55 -0
  166. package/build/hooks/metadata-name.js.map +1 -0
  167. package/build/hooks/metadata.js +65 -0
  168. package/build/hooks/metadata.js.map +1 -0
  169. package/build/hooks/typography.js +10 -11
  170. package/build/hooks/typography.js.map +1 -1
  171. package/build/hooks/use-typography-props.js +51 -0
  172. package/build/hooks/use-typography-props.js.map +1 -0
  173. package/build/hooks/utils.js +3 -1
  174. package/build/hooks/utils.js.map +1 -1
  175. package/build/index.js +7 -0
  176. package/build/index.js.map +1 -1
  177. package/build/layouts/constrained.js +59 -20
  178. package/build/layouts/constrained.js.map +1 -1
  179. package/build/store/actions.js +65 -21
  180. package/build/store/actions.js.map +1 -1
  181. package/build/store/reducer.js +43 -19
  182. package/build/store/reducer.js.map +1 -1
  183. package/build/store/selectors.js +96 -10
  184. package/build/store/selectors.js.map +1 -1
  185. package/build/utils/parse-css-unit-to-px.js +1 -1
  186. package/build/utils/parse-css-unit-to-px.js.map +1 -1
  187. package/build-module/components/alignment-control/ui.js +6 -5
  188. package/build-module/components/alignment-control/ui.js.map +1 -1
  189. package/build-module/components/autocomplete/index.js +2 -2
  190. package/build-module/components/autocomplete/index.js.map +1 -1
  191. package/build-module/components/block-actions/index.js +5 -8
  192. package/build-module/components/block-actions/index.js.map +1 -1
  193. package/build-module/components/block-alignment-control/ui.js +5 -5
  194. package/build-module/components/block-alignment-control/ui.js.map +1 -1
  195. package/build-module/components/block-content-overlay/index.js +2 -4
  196. package/build-module/components/block-content-overlay/index.js.map +1 -1
  197. package/build-module/components/block-draggable/draggable-chip.js +2 -1
  198. package/build-module/components/block-draggable/draggable-chip.js.map +1 -1
  199. package/build-module/components/block-edit/edit.js +1 -1
  200. package/build-module/components/block-edit/edit.js.map +1 -1
  201. package/build-module/components/block-inspector/index.js +127 -19
  202. package/build-module/components/block-inspector/index.js.map +1 -1
  203. package/build-module/components/block-list/block-list-compact.native.js +2 -1
  204. package/build-module/components/block-list/block-list-compact.native.js.map +1 -1
  205. package/build-module/components/block-list/block.js +41 -9
  206. package/build-module/components/block-list/block.js.map +1 -1
  207. package/build-module/components/block-list/index.js +4 -4
  208. package/build-module/components/block-list/index.js.map +1 -1
  209. package/build-module/components/block-list/use-block-props/index.js +13 -11
  210. package/build-module/components/block-list/use-block-props/index.js.map +1 -1
  211. package/build-module/components/block-list/use-block-props/use-block-class-names.js +3 -2
  212. package/build-module/components/block-list/use-block-props/use-block-class-names.js.map +1 -1
  213. package/build-module/components/block-list/use-block-props/use-focus-first-element.js +3 -8
  214. package/build-module/components/block-list/use-block-props/use-focus-first-element.js.map +1 -1
  215. package/build-module/components/block-list/use-block-props/use-is-hovered.js +1 -2
  216. package/build-module/components/block-list/use-block-props/use-is-hovered.js.map +1 -1
  217. package/build-module/components/block-list/use-in-between-inserter.js +7 -12
  218. package/build-module/components/block-list/use-in-between-inserter.js.map +1 -1
  219. package/build-module/components/block-list-appender/index.js +20 -20
  220. package/build-module/components/block-list-appender/index.js.map +1 -1
  221. package/build-module/components/block-list-appender/index.native.js +1 -6
  222. package/build-module/components/block-list-appender/index.native.js.map +1 -1
  223. package/build-module/components/block-lock/use-block-lock.js +3 -1
  224. package/build-module/components/block-lock/use-block-lock.js.map +1 -1
  225. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js +20 -9
  226. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  227. package/build-module/components/block-mover/button.js +4 -5
  228. package/build-module/components/block-mover/button.js.map +1 -1
  229. package/build-module/components/block-mover/index.js +4 -5
  230. package/build-module/components/block-mover/index.js.map +1 -1
  231. package/build-module/components/block-mover/index.native.js +24 -7
  232. package/build-module/components/block-mover/index.native.js.map +1 -1
  233. package/build-module/components/block-popover/inbetween.js +83 -53
  234. package/build-module/components/block-popover/inbetween.js.map +1 -1
  235. package/build-module/components/block-popover/index.js +31 -7
  236. package/build-module/components/block-popover/index.js.map +1 -1
  237. package/build-module/components/block-preview/auto.js +4 -2
  238. package/build-module/components/block-preview/auto.js.map +1 -1
  239. package/build-module/components/block-settings-menu/block-settings-dropdown.js +3 -1
  240. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  241. package/build-module/components/block-settings-menu-controls/index.js +3 -1
  242. package/build-module/components/block-settings-menu-controls/index.js.map +1 -1
  243. package/build-module/components/block-styles/preview-panel.js +6 -1
  244. package/build-module/components/block-styles/preview-panel.js.map +1 -1
  245. package/build-module/components/block-switcher/block-transformations-menu.js +115 -27
  246. package/build-module/components/block-switcher/block-transformations-menu.js.map +1 -1
  247. package/build-module/components/block-toolbar/index.js +9 -8
  248. package/build-module/components/block-toolbar/index.js.map +1 -1
  249. package/build-module/components/block-tools/block-contextual-toolbar.js +3 -2
  250. package/build-module/components/block-tools/block-contextual-toolbar.js.map +1 -1
  251. package/build-module/components/block-tools/block-selection-button.js +12 -5
  252. package/build-module/components/block-tools/block-selection-button.js.map +1 -1
  253. package/build-module/components/block-tools/index.js +30 -15
  254. package/build-module/components/block-tools/index.js.map +1 -1
  255. package/build-module/components/block-tools/insertion-point.js +4 -9
  256. package/build-module/components/block-tools/insertion-point.js.map +1 -1
  257. package/build-module/components/block-tools/selected-block-popover.js +9 -8
  258. package/build-module/components/block-tools/selected-block-popover.js.map +1 -1
  259. package/build-module/components/block-tools/use-block-toolbar-popover-props.js +13 -8
  260. package/build-module/components/block-tools/use-block-toolbar-popover-props.js.map +1 -1
  261. package/build-module/components/block-tools/zoom-out-mode-inserters.js +59 -0
  262. package/build-module/components/block-tools/zoom-out-mode-inserters.js.map +1 -0
  263. package/build-module/components/block-vertical-alignment-control/ui.js +5 -2
  264. package/build-module/components/block-vertical-alignment-control/ui.js.map +1 -1
  265. package/build-module/components/border-radius-control/linked-button.js +5 -6
  266. package/build-module/components/border-radius-control/linked-button.js.map +1 -1
  267. package/build-module/components/colors-gradients/dropdown.js +1 -1
  268. package/build-module/components/colors-gradients/dropdown.js.map +1 -1
  269. package/build-module/components/convert-to-group-buttons/toolbar.js +8 -3
  270. package/build-module/components/convert-to-group-buttons/toolbar.js.map +1 -1
  271. package/build-module/components/iframe/index.js +32 -5
  272. package/build-module/components/iframe/index.js.map +1 -1
  273. package/build-module/components/inner-blocks/default-block-appender.js +1 -6
  274. package/build-module/components/inner-blocks/default-block-appender.js.map +1 -1
  275. package/build-module/components/inner-blocks/index.js +9 -3
  276. package/build-module/components/inner-blocks/index.js.map +1 -1
  277. package/build-module/components/inner-blocks/use-inner-block-template-sync.js +28 -17
  278. package/build-module/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  279. package/build-module/components/inner-blocks/use-nested-settings-update.js +28 -4
  280. package/build-module/components/inner-blocks/use-nested-settings-update.js.map +1 -1
  281. package/build-module/components/inserter/index.js +3 -6
  282. package/build-module/components/inserter/index.js.map +1 -1
  283. package/build-module/components/inserter/library.js +14 -3
  284. package/build-module/components/inserter/library.js.map +1 -1
  285. package/build-module/components/inserter/menu.js +20 -8
  286. package/build-module/components/inserter/menu.js.map +1 -1
  287. package/build-module/components/inserter/preview-panel.js +1 -1
  288. package/build-module/components/inserter/preview-panel.js.map +1 -1
  289. package/build-module/components/inserter/tabs.js +11 -4
  290. package/build-module/components/inserter/tabs.js.map +1 -1
  291. package/build-module/components/link-control/link-preview.js +1 -1
  292. package/build-module/components/link-control/link-preview.js.map +1 -1
  293. package/build-module/components/link-control/search-input.js +6 -2
  294. package/build-module/components/link-control/search-input.js.map +1 -1
  295. package/build-module/components/link-control/search-item.js +37 -6
  296. package/build-module/components/link-control/search-item.js.map +1 -1
  297. package/build-module/components/list-view/block.js +23 -11
  298. package/build-module/components/list-view/block.js.map +1 -1
  299. package/build-module/components/list-view/branch.js +19 -3
  300. package/build-module/components/list-view/branch.js.map +1 -1
  301. package/build-module/components/list-view/drop-indicator.js +30 -28
  302. package/build-module/components/list-view/drop-indicator.js.map +1 -1
  303. package/build-module/components/list-view/index.js +8 -4
  304. package/build-module/components/list-view/index.js.map +1 -1
  305. package/build-module/components/list-view/use-block-selection.js +0 -1
  306. package/build-module/components/list-view/use-block-selection.js.map +1 -1
  307. package/build-module/components/provider/use-block-sync.js +1 -6
  308. package/build-module/components/provider/use-block-sync.js.map +1 -1
  309. package/build-module/components/publish-date-time-picker/index.js +1 -1
  310. package/build-module/components/publish-date-time-picker/index.js.map +1 -1
  311. package/build-module/components/rich-text/format-toolbar-container.js +10 -10
  312. package/build-module/components/rich-text/format-toolbar-container.js.map +1 -1
  313. package/build-module/components/rich-text/index.js +31 -20
  314. package/build-module/components/rich-text/index.js.map +1 -1
  315. package/build-module/components/rich-text/index.native.js +11 -18
  316. package/build-module/components/rich-text/index.native.js.map +1 -1
  317. package/build-module/components/spacing-sizes-control/linked-button.js +2 -3
  318. package/build-module/components/spacing-sizes-control/linked-button.js.map +1 -1
  319. package/build-module/components/spacing-sizes-control/utils.js +1 -4
  320. package/build-module/components/spacing-sizes-control/utils.js.map +1 -1
  321. package/build-module/components/text-decoration-control/index.js +21 -16
  322. package/build-module/components/text-decoration-control/index.js.map +1 -1
  323. package/build-module/components/text-transform-control/index.js +28 -20
  324. package/build-module/components/text-transform-control/index.js.map +1 -1
  325. package/build-module/components/tool-selector/index.js +6 -11
  326. package/build-module/components/tool-selector/index.js.map +1 -1
  327. package/build-module/components/url-popover/image-url-input-ui.js +6 -4
  328. package/build-module/components/url-popover/image-url-input-ui.js.map +1 -1
  329. package/build-module/components/url-popover/index.js +1 -1
  330. package/build-module/components/url-popover/index.js.map +1 -1
  331. package/build-module/components/use-block-drop-zone/index.js +7 -4
  332. package/build-module/components/use-block-drop-zone/index.js.map +1 -1
  333. package/build-module/components/use-moving-animation/index.js +9 -28
  334. package/build-module/components/use-moving-animation/index.js.map +1 -1
  335. package/build-module/components/writing-flow/use-select-all.js +1 -6
  336. package/build-module/components/writing-flow/use-select-all.js.map +1 -1
  337. package/build-module/hooks/align.js +12 -2
  338. package/build-module/hooks/align.js.map +1 -1
  339. package/build-module/hooks/color-panel.js +2 -1
  340. package/build-module/hooks/color-panel.js.map +1 -1
  341. package/build-module/hooks/content-lock-ui.js +128 -0
  342. package/build-module/hooks/content-lock-ui.js.map +1 -0
  343. package/build-module/hooks/duotone.js +6 -1
  344. package/build-module/hooks/duotone.js.map +1 -1
  345. package/build-module/hooks/index.js +4 -0
  346. package/build-module/hooks/index.js.map +1 -1
  347. package/build-module/hooks/layout.js +11 -9
  348. package/build-module/hooks/layout.js.map +1 -1
  349. package/build-module/hooks/metadata-name.js +45 -0
  350. package/build-module/hooks/metadata-name.js.map +1 -0
  351. package/build-module/hooks/metadata.js +50 -0
  352. package/build-module/hooks/metadata.js.map +1 -0
  353. package/build-module/hooks/typography.js +10 -11
  354. package/build-module/hooks/typography.js.map +1 -1
  355. package/build-module/hooks/use-typography-props.js +38 -0
  356. package/build-module/hooks/use-typography-props.js.map +1 -0
  357. package/build-module/hooks/utils.js +4 -2
  358. package/build-module/hooks/utils.js.map +1 -1
  359. package/build-module/index.js +1 -1
  360. package/build-module/index.js.map +1 -1
  361. package/build-module/layouts/constrained.js +61 -22
  362. package/build-module/layouts/constrained.js.map +1 -1
  363. package/build-module/store/actions.js +58 -20
  364. package/build-module/store/actions.js.map +1 -1
  365. package/build-module/store/reducer.js +41 -19
  366. package/build-module/store/reducer.js.map +1 -1
  367. package/build-module/store/selectors.js +81 -10
  368. package/build-module/store/selectors.js.map +1 -1
  369. package/build-module/utils/parse-css-unit-to-px.js +1 -1
  370. package/build-module/utils/parse-css-unit-to-px.js.map +1 -1
  371. package/build-style/style-rtl.css +142 -46
  372. package/build-style/style.css +142 -46
  373. package/package.json +28 -28
  374. package/src/components/alignment-control/test/__snapshots__/index.js.snap +137 -108
  375. package/src/components/alignment-control/test/index.js +124 -33
  376. package/src/components/alignment-control/ui.js +8 -3
  377. package/src/components/autocomplete/index.js +2 -5
  378. package/src/components/block-actions/index.js +9 -8
  379. package/src/components/block-alignment-control/test/__snapshots__/index.js.snap +108 -65
  380. package/src/components/block-alignment-control/test/index.js +95 -31
  381. package/src/components/block-alignment-control/ui.js +2 -2
  382. package/src/components/block-compare/test/__snapshots__/block-view.js.snap +28 -26
  383. package/src/components/block-compare/test/block-view.js +3 -3
  384. package/src/components/block-content-overlay/index.js +2 -6
  385. package/src/components/block-content-overlay/style.scss +24 -3
  386. package/src/components/block-draggable/draggable-chip.js +4 -1
  387. package/src/components/block-edit/edit.js +5 -1
  388. package/src/components/block-edit/test/edit.js +23 -21
  389. package/src/components/block-icon/test/__snapshots__/index.js.snap +22 -0
  390. package/src/components/block-icon/test/index.js +31 -16
  391. package/src/components/block-inspector/index.js +126 -12
  392. package/src/components/block-inspector/style.scss +7 -1
  393. package/src/components/block-list/block-list-compact.native.js +1 -1
  394. package/src/components/block-list/block.js +53 -13
  395. package/src/components/block-list/index.js +4 -4
  396. package/src/components/block-list/style.scss +57 -11
  397. package/src/components/block-list/test/block-list-context.native.js +11 -13
  398. package/src/components/block-list/use-block-props/index.js +10 -10
  399. package/src/components/block-list/use-block-props/use-block-class-names.js +4 -1
  400. package/src/components/block-list/use-block-props/use-focus-first-element.js +3 -8
  401. package/src/components/block-list/use-block-props/use-is-hovered.js +2 -2
  402. package/src/components/block-list/use-in-between-inserter.js +11 -13
  403. package/src/components/block-list-appender/index.js +27 -18
  404. package/src/components/block-list-appender/index.native.js +3 -6
  405. package/src/components/block-lock/use-block-lock.js +2 -0
  406. package/src/components/block-mobile-toolbar/block-actions-menu.native.js +15 -9
  407. package/src/components/block-mover/button.js +6 -5
  408. package/src/components/block-mover/index.js +8 -7
  409. package/src/components/block-mover/index.native.js +20 -13
  410. package/src/components/block-popover/inbetween.js +124 -62
  411. package/src/components/block-popover/index.js +47 -8
  412. package/src/components/block-popover/style.scss +3 -4
  413. package/src/components/block-preview/auto.js +4 -2
  414. package/src/components/block-settings-menu/block-settings-dropdown.js +4 -0
  415. package/src/components/block-settings-menu-controls/README.md +9 -0
  416. package/src/components/block-settings-menu-controls/index.js +13 -2
  417. package/src/components/block-styles/preview-panel.js +3 -0
  418. package/src/components/block-switcher/block-transformations-menu.js +127 -33
  419. package/src/components/block-switcher/style.scss +4 -2
  420. package/src/components/block-title/test/index.js +28 -25
  421. package/src/components/block-toolbar/index.js +27 -17
  422. package/src/components/block-tools/block-contextual-toolbar.js +10 -3
  423. package/src/components/block-tools/block-selection-button.js +35 -16
  424. package/src/components/block-tools/index.js +40 -24
  425. package/src/components/block-tools/insertion-point.js +3 -7
  426. package/src/components/block-tools/selected-block-popover.js +9 -7
  427. package/src/components/block-tools/style.scss +5 -0
  428. package/src/components/block-tools/use-block-toolbar-popover-props.js +19 -6
  429. package/src/components/block-tools/zoom-out-mode-inserters.js +57 -0
  430. package/src/components/block-vertical-alignment-control/test/__snapshots__/index.js.snap +91 -51
  431. package/src/components/block-vertical-alignment-control/test/index.js +92 -23
  432. package/src/components/block-vertical-alignment-control/ui.js +3 -2
  433. package/src/components/border-radius-control/linked-button.js +12 -11
  434. package/src/components/color-palette/test/__snapshots__/control.js.snap +3 -12
  435. package/src/components/colors/test/with-colors.js +37 -12
  436. package/src/components/colors-gradients/dropdown.js +1 -1
  437. package/src/components/contrast-checker/test/index.js +135 -116
  438. package/src/components/convert-to-group-buttons/toolbar.js +6 -2
  439. package/src/components/default-block-appender/test/__snapshots__/index.js.snap +39 -57
  440. package/src/components/default-block-appender/test/index.js +32 -18
  441. package/src/components/font-sizes/README.MD +9 -0
  442. package/src/components/iframe/index.js +64 -5
  443. package/src/components/inner-blocks/README.md +2 -1
  444. package/src/components/inner-blocks/default-block-appender.js +1 -6
  445. package/src/components/inner-blocks/index.js +10 -2
  446. package/src/components/inner-blocks/use-inner-block-template-sync.js +40 -25
  447. package/src/components/inner-blocks/use-nested-settings-update.js +32 -3
  448. package/src/components/inserter/index.js +2 -8
  449. package/src/components/inserter/library.js +11 -5
  450. package/src/components/inserter/menu.js +42 -29
  451. package/src/components/inserter/preview-panel.js +1 -1
  452. package/src/components/inserter/stories/fixtures.js +44 -0
  453. package/src/components/inserter/stories/index.js +90 -0
  454. package/src/components/inserter/style.scss +21 -27
  455. package/src/components/inserter/tabs.js +8 -4
  456. package/src/components/link-control/link-preview.js +5 -3
  457. package/src/components/link-control/search-input.js +2 -2
  458. package/src/components/link-control/search-item.js +39 -7
  459. package/src/components/list-view/block.js +29 -10
  460. package/src/components/list-view/branch.js +27 -4
  461. package/src/components/list-view/drop-indicator.js +33 -32
  462. package/src/components/list-view/index.js +8 -3
  463. package/src/components/list-view/use-block-selection.js +0 -1
  464. package/src/components/media-placeholder/test/index.js +2 -2
  465. package/src/components/media-replace-flow/README.md +1 -1
  466. package/src/components/provider/use-block-sync.js +3 -6
  467. package/src/components/publish-date-time-picker/index.js +1 -1
  468. package/src/components/rich-text/format-toolbar-container.js +18 -10
  469. package/src/components/rich-text/index.js +26 -37
  470. package/src/components/rich-text/index.native.js +8 -21
  471. package/src/components/spacing-sizes-control/linked-button.js +2 -3
  472. package/src/components/spacing-sizes-control/style.scss +4 -1
  473. package/src/components/spacing-sizes-control/utils.js +1 -8
  474. package/src/components/text-decoration-control/index.js +31 -23
  475. package/src/components/text-decoration-control/style.scss +18 -0
  476. package/src/components/text-transform-control/index.js +42 -26
  477. package/src/components/text-transform-control/style.scss +18 -0
  478. package/src/components/tool-selector/index.js +9 -11
  479. package/src/components/url-input/test/button.js +145 -71
  480. package/src/components/url-popover/image-url-input-ui.js +5 -3
  481. package/src/components/url-popover/index.js +1 -1
  482. package/src/components/url-popover/test/__snapshots__/index.js.snap +108 -80
  483. package/src/components/url-popover/test/index.js +14 -12
  484. package/src/components/use-block-drop-zone/index.js +15 -4
  485. package/src/components/use-moving-animation/index.js +9 -24
  486. package/src/components/warning/test/__snapshots__/index.js.snap +11 -14
  487. package/src/components/warning/test/index.js +32 -29
  488. package/src/components/writing-flow/use-select-all.js +4 -6
  489. package/src/hooks/align.js +22 -13
  490. package/src/hooks/color-panel.js +2 -1
  491. package/src/hooks/content-lock-ui.js +161 -0
  492. package/src/hooks/duotone.js +13 -1
  493. package/src/hooks/index.js +4 -0
  494. package/src/hooks/layout.js +25 -19
  495. package/src/hooks/layout.scss +7 -1
  496. package/src/hooks/metadata-name.js +48 -0
  497. package/src/hooks/metadata.js +64 -0
  498. package/src/hooks/test/use-typography-props.js +28 -0
  499. package/src/hooks/typography.js +13 -14
  500. package/src/hooks/use-typography-props.js +41 -0
  501. package/src/hooks/utils.js +2 -11
  502. package/src/index.js +1 -0
  503. package/src/layouts/constrained.js +73 -24
  504. package/src/store/actions.js +45 -4
  505. package/src/store/reducer.js +36 -21
  506. package/src/store/selectors.js +99 -20
  507. package/src/store/test/reducer.js +8 -5
  508. package/src/store/test/selectors.js +4 -4
  509. package/src/style.scss +2 -0
  510. package/src/utils/parse-css-unit-to-px.js +1 -1
  511. package/src/components/colors/test/__snapshots__/with-colors.js.snap +0 -23
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { shallow } from 'enzyme';
4
+ import { render, screen } from '@testing-library/react';
5
+ import userEvent from '@testing-library/user-event';
5
6
 
6
7
  /**
7
8
  * Internal dependencies
@@ -9,42 +10,55 @@ import { shallow } from 'enzyme';
9
10
  import { DefaultBlockAppender, ZWNBSP } from '../';
10
11
 
11
12
  describe( 'DefaultBlockAppender', () => {
12
- const expectOnAppendCalled = ( onAppend ) => {
13
- expect( onAppend ).toHaveBeenCalledTimes( 1 );
14
- expect( onAppend ).toHaveBeenCalledWith();
15
- };
16
-
17
13
  it( 'should match snapshot', () => {
18
14
  const onAppend = jest.fn();
19
- const wrapper = shallow(
15
+
16
+ const { container } = render(
20
17
  <DefaultBlockAppender onAppend={ onAppend } showPrompt />
21
18
  );
22
19
 
23
- expect( wrapper ).toMatchSnapshot();
20
+ expect( container ).toMatchSnapshot();
24
21
  } );
25
22
 
26
- it( 'should append a default block when input focused', () => {
23
+ it( 'should append a default block when input focused', async () => {
24
+ const user = userEvent.setup( {
25
+ advanceTimers: jest.advanceTimersByTime,
26
+ } );
27
27
  const onAppend = jest.fn();
28
- const wrapper = shallow(
28
+
29
+ const { container } = render(
29
30
  <DefaultBlockAppender onAppend={ onAppend } showPrompt />
30
31
  );
31
32
 
32
- wrapper.find( 'p' ).simulate( 'click' );
33
+ await user.click(
34
+ screen.getByRole( 'button', { name: 'Add default block' } )
35
+ );
33
36
 
34
- expect( wrapper ).toMatchSnapshot();
37
+ expect( container ).toMatchSnapshot();
35
38
 
36
- expectOnAppendCalled( onAppend );
39
+ // Called once for focusing and once for clicking.
40
+ expect( onAppend ).toHaveBeenCalledTimes( 2 );
41
+ expect( onAppend ).toHaveBeenCalledWith();
37
42
  } );
38
43
 
39
- it( 'should optionally show without prompt', () => {
44
+ it( 'should optionally show without prompt', async () => {
45
+ const user = userEvent.setup( {
46
+ advanceTimers: jest.advanceTimersByTime,
47
+ } );
40
48
  const onAppend = jest.fn();
41
- const wrapper = shallow(
49
+
50
+ const { container } = render(
42
51
  <DefaultBlockAppender onAppend={ onAppend } showPrompt={ false } />
43
52
  );
44
- const input = wrapper.find( 'p' );
45
53
 
46
- expect( input.prop( 'children' ) ).toEqual( ZWNBSP );
54
+ const appender = screen.getByRole( 'button', {
55
+ name: 'Add default block',
56
+ } );
57
+
58
+ await user.click( appender );
59
+
60
+ expect( appender ).toContainHTML( ZWNBSP );
47
61
 
48
- expect( wrapper ).toMatchSnapshot();
62
+ expect( container ).toMatchSnapshot();
49
63
  } );
50
64
  } );
@@ -31,6 +31,7 @@ const MyFontSizePicker = () => {
31
31
 
32
32
  return (
33
33
  <FontSizePicker
34
+ __nextHasNoMarginBottom
34
35
  value={ fontSize }
35
36
  fallbackFontSize={ fallbackFontSize }
36
37
  onChange={ ( newFontSize ) => {
@@ -79,3 +80,11 @@ If `true`, the UI will contain a slider, instead of a numeric text input field.
79
80
  - Type: `Boolean`
80
81
  - Required: no
81
82
  - Default: `false`
83
+
84
+ ### __nextHasNoMarginBottom
85
+
86
+ Start opting into the new margin-free styles that will become the default in a future version, currently scheduled to be WordPress 6.4. (The prop can be safely removed once this happens.)
87
+
88
+ - Type: `Boolean`
89
+ - Required: no
90
+ - Default: `false`
@@ -14,7 +14,11 @@ import {
14
14
  useReducer,
15
15
  } from '@wordpress/element';
16
16
  import { __ } from '@wordpress/i18n';
17
- import { useMergeRefs, useRefEffect } from '@wordpress/compose';
17
+ import {
18
+ useResizeObserver,
19
+ useMergeRefs,
20
+ useRefEffect,
21
+ } from '@wordpress/compose';
18
22
  import { __experimentalStyleProvider as StyleProvider } from '@wordpress/components';
19
23
 
20
24
  /**
@@ -184,7 +188,7 @@ async function loadScript( head, { id, src } ) {
184
188
  }
185
189
 
186
190
  function Iframe(
187
- { contentRef, children, head, tabIndex = 0, assets, ...props },
191
+ { contentRef, children, head, tabIndex = 0, assets, isZoomedOut, ...props },
188
192
  ref
189
193
  ) {
190
194
  const [ , forceRender ] = useReducer( () => ( {} ) );
@@ -194,10 +198,18 @@ function Iframe(
194
198
  const scripts = useParsedAssets( assets?.scripts );
195
199
  const clearerRef = useBlockSelectionClearer();
196
200
  const [ before, writingFlowRef, after ] = useWritingFlow();
201
+ const [ contentResizeListener, { height: contentHeight } ] =
202
+ useResizeObserver();
197
203
  const setRef = useRefEffect( ( node ) => {
204
+ let iFrameDocument;
205
+ // Prevent the default browser action for files dropped outside of dropzones.
206
+ function preventFileDropDefault( event ) {
207
+ event.preventDefault();
208
+ }
198
209
  function setDocumentIfReady() {
199
210
  const { contentDocument, ownerDocument } = node;
200
211
  const { readyState, documentElement } = contentDocument;
212
+ iFrameDocument = contentDocument;
201
213
 
202
214
  if ( readyState !== 'interactive' && readyState !== 'complete' ) {
203
215
  return false;
@@ -223,14 +235,35 @@ function Iframe(
223
235
  documentElement.removeChild( contentDocument.head );
224
236
  documentElement.removeChild( contentDocument.body );
225
237
 
238
+ iFrameDocument.addEventListener(
239
+ 'dragover',
240
+ preventFileDropDefault,
241
+ false
242
+ );
243
+ iFrameDocument.addEventListener(
244
+ 'drop',
245
+ preventFileDropDefault,
246
+ false
247
+ );
226
248
  return true;
227
249
  }
228
250
 
229
251
  // Document set with srcDoc is not immediately ready.
230
252
  node.addEventListener( 'load', setDocumentIfReady );
231
253
 
232
- return () => node.removeEventListener( 'load', setDocumentIfReady );
254
+ return () => {
255
+ node.removeEventListener( 'load', setDocumentIfReady );
256
+ iFrameDocument?.removeEventListener(
257
+ 'dragover',
258
+ preventFileDropDefault
259
+ );
260
+ iFrameDocument?.removeEventListener(
261
+ 'drop',
262
+ preventFileDropDefault
263
+ );
264
+ };
233
265
  }, [] );
266
+
234
267
  const headRef = useRefEffect( ( element ) => {
235
268
  scripts
236
269
  .reduce(
@@ -285,14 +318,40 @@ function Iframe(
285
318
  { iframeDocument &&
286
319
  createPortal(
287
320
  <>
288
- <head ref={ headRef }>{ head }</head>
321
+ <head ref={ headRef }>
322
+ { head }
323
+ <style>
324
+ { `html { transition: background 5s; ${
325
+ isZoomedOut
326
+ ? 'background: #2f2f2f; transition: background 0s;'
327
+ : ''
328
+ } }` }
329
+ </style>
330
+ </head>
289
331
  <body
290
332
  ref={ bodyRef }
291
333
  className={ classnames(
334
+ 'block-editor-iframe__body',
292
335
  BODY_CLASS_NAME,
293
- ...bodyClasses
336
+ ...bodyClasses,
337
+ {
338
+ 'is-zoomed-out': isZoomedOut,
339
+ }
294
340
  ) }
341
+ style={
342
+ isZoomedOut
343
+ ? {
344
+ // This is the remaining percentage from the scaling down
345
+ // of the iframe body(`scale(0.45)`). We also need to subtract
346
+ // the body's bottom margin.
347
+ marginBottom: `-${
348
+ contentHeight * 0.55 - 100
349
+ }px`,
350
+ }
351
+ : {}
352
+ }
295
353
  >
354
+ { contentResizeListener }
296
355
  { /*
297
356
  * This is a wrapper for the extra styles and scripts
298
357
  * rendered imperatively by cloning the parent,
@@ -125,11 +125,12 @@ Template locking of `InnerBlocks` is similar to [Custom Post Type templates lock
125
125
  Template locking allows locking the `InnerBlocks` area for the current template.
126
126
  _Options:_
127
127
 
128
+ - `contentOnly` — prevents all operations. Additionally, the block types that don't have content are hidden from the list view and can't gain focus within the block list. Unlike the other lock types, this is not overrideable by children.
128
129
  - `'all'` — prevents all operations. It is not possible to insert new blocks. Move existing blocks or delete them.
129
130
  - `'insert'` — prevents inserting or removing blocks, but allows moving existing ones.
130
131
  - `false` — prevents locking from being applied to an `InnerBlocks` area even if a parent block contains locking. ( Boolean )
131
132
 
132
- If locking is not set in an `InnerBlocks` area: the locking of the parent `InnerBlocks` area is used.
133
+ If locking is not set in an `InnerBlocks` area: the locking of the parent `InnerBlocks` area is used. Note that `contentOnly` can't be overriden: it's present, the `templateLock` value of any children is ignored.
133
134
 
134
135
  If the block is a top level block: the locking of the Custom Post Type is used.
135
136
 
@@ -1,8 +1,3 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { last } from 'lodash';
5
-
6
1
  /**
7
2
  * WordPress dependencies
8
3
  */
@@ -28,7 +23,7 @@ export default compose( [
28
23
  const blockClientIds = getBlockOrder( clientId );
29
24
 
30
25
  return {
31
- lastBlockClientId: last( blockClientIds ),
26
+ lastBlockClientId: blockClientIds[ blockClientIds.length - 1 ],
32
27
  };
33
28
  } ),
34
29
  ] )( DefaultBlockAppender );
@@ -77,6 +77,13 @@ function UncontrolledInnerBlocks( props ) {
77
77
  const context = useSelect(
78
78
  ( select ) => {
79
79
  const block = select( blockEditorStore ).getBlock( clientId );
80
+
81
+ // This check is here to avoid the Redux zombie bug where a child subscription
82
+ // is called before a parent, causing potential JS errors when the child has been removed.
83
+ if ( ! block ) {
84
+ return;
85
+ }
86
+
80
87
  const blockType = getBlockType( block.name );
81
88
 
82
89
  if ( ! blockType || ! blockType.providesContext ) {
@@ -155,10 +162,11 @@ export function useInnerBlocksProps( props = {}, options = {} ) {
155
162
  getBlockName,
156
163
  isBlockSelected,
157
164
  hasSelectedInnerBlock,
158
- isNavigationMode,
165
+ __unstableGetEditorMode,
159
166
  } = select( blockEditorStore );
160
167
  const blockName = getBlockName( clientId );
161
- const enableClickThrough = isNavigationMode() || isSmallScreen;
168
+ const enableClickThrough =
169
+ __unstableGetEditorMode() === 'navigation' || isSmallScreen;
162
170
  return {
163
171
  __experimentalCaptureToolbars: select(
164
172
  blocksStore
@@ -19,8 +19,8 @@ import { store as blockEditorStore } from '../../store';
19
19
  * This hook makes sure that a block's inner blocks stay in sync with the given
20
20
  * block "template". The template is a block hierarchy to which inner blocks must
21
21
  * conform. If the blocks get "out of sync" with the template and the template
22
- * is meant to be locked (e.g. templateLock = "all"), then we replace the inner
23
- * blocks with the correct value after synchronizing it with the template.
22
+ * is meant to be locked (e.g. templateLock = "all" or templateLock = "contentOnly"),
23
+ * then we replace the inner blocks with the correct value after synchronizing it with the template.
24
24
  *
25
25
  * @param {string} clientId The block client ID.
26
26
  * @param {Object} template The template to match.
@@ -47,38 +47,53 @@ export default function useInnerBlockTemplateSync(
47
47
  ( select ) => select( blockEditorStore ).getBlocks( clientId ),
48
48
  [ clientId ]
49
49
  );
50
+ const { getBlocks } = useSelect( blockEditorStore );
50
51
 
51
52
  // Maintain a reference to the previous value so we can do a deep equality check.
52
53
  const existingTemplate = useRef( null );
53
54
  useLayoutEffect( () => {
54
- // Only synchronize innerBlocks with template if innerBlocks are empty or
55
- // a locking all exists directly on the block.
56
- if ( innerBlocks.length === 0 || templateLock === 'all' ) {
55
+ // There's an implicit dependency between useInnerBlockTemplateSync and useNestedSettingsUpdate
56
+ // The former needs to happen after the latter and since the latter is using microtasks to batch updates (performance optimization),
57
+ // we need to schedule this one in a microtask as well.
58
+ // Exemple: If you remove queueMicrotask here, ctrl + click to insert quote block won't close the inserter.
59
+ window.queueMicrotask( () => {
60
+ // Only synchronize innerBlocks with template if innerBlocks are empty
61
+ // or a locking "all" or "contentOnly" exists directly on the block.
62
+ const currentInnerBlocks = getBlocks( clientId );
63
+ const shouldApplyTemplate =
64
+ currentInnerBlocks.length === 0 ||
65
+ templateLock === 'all' ||
66
+ templateLock === 'contentOnly';
67
+
57
68
  const hasTemplateChanged = ! isEqual(
58
69
  template,
59
70
  existingTemplate.current
60
71
  );
61
- if ( hasTemplateChanged ) {
62
- existingTemplate.current = template;
63
- const nextBlocks = synchronizeBlocksWithTemplate(
64
- innerBlocks,
65
- template
72
+
73
+ if ( ! shouldApplyTemplate || ! hasTemplateChanged ) {
74
+ return;
75
+ }
76
+
77
+ existingTemplate.current = template;
78
+ const nextBlocks = synchronizeBlocksWithTemplate(
79
+ currentInnerBlocks,
80
+ template
81
+ );
82
+
83
+ if ( ! isEqual( nextBlocks, currentInnerBlocks ) ) {
84
+ replaceInnerBlocks(
85
+ clientId,
86
+ nextBlocks,
87
+ currentInnerBlocks.length === 0 &&
88
+ templateInsertUpdatesSelection &&
89
+ nextBlocks.length !== 0,
90
+ // This ensures the "initialPosition" doesn't change when applying the template
91
+ // If we're supposed to focus the block, we'll focus the first inner block
92
+ // otherwise, we won't apply any auto-focus.
93
+ // This ensures for instance that the focus stays in the inserter when inserting the "buttons" block.
94
+ getSelectedBlocksInitialCaretPosition()
66
95
  );
67
- if ( ! isEqual( nextBlocks, innerBlocks ) ) {
68
- replaceInnerBlocks(
69
- clientId,
70
- nextBlocks,
71
- innerBlocks.length === 0 &&
72
- templateInsertUpdatesSelection &&
73
- nextBlocks.length !== 0,
74
- // This ensures the "initialPosition" doesn't change when applying the template
75
- // If we're supposed to focus the block, we'll focus the first inner block
76
- // otherwise, we won't apply any auto-focus.
77
- // This ensures for instance that the focus stays in the inserter when inserting the "buttons" block.
78
- getSelectedBlocksInitialCaretPosition()
79
- );
80
- }
81
96
  }
82
- }
97
+ } );
83
98
  }, [ innerBlocks, template, templateLock, clientId ] );
84
99
  }
@@ -2,7 +2,7 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import { useLayoutEffect, useMemo } from '@wordpress/element';
5
- import { useSelect, useDispatch } from '@wordpress/data';
5
+ import { useSelect, useDispatch, useRegistry } from '@wordpress/data';
6
6
  import isShallowEqual from '@wordpress/is-shallow-equal';
7
7
 
8
8
  /**
@@ -13,6 +13,8 @@ import { getLayoutType } from '../../layouts';
13
13
 
14
14
  /** @typedef {import('../../selectors').WPDirectInsertBlock } WPDirectInsertBlock */
15
15
 
16
+ const pendingSettingsUpdates = new WeakMap();
17
+
16
18
  /**
17
19
  * This hook is a side effect which updates the block-editor store when changes
18
20
  * happen to inner block settings. The given props are transformed into a
@@ -46,6 +48,7 @@ export default function useNestedSettingsUpdate(
46
48
  layout
47
49
  ) {
48
50
  const { updateBlockListSettings } = useDispatch( blockEditorStore );
51
+ const registry = useRegistry();
49
52
 
50
53
  const { blockListSettings, parentLock } = useSelect(
51
54
  ( select ) => {
@@ -69,7 +72,9 @@ export default function useNestedSettingsUpdate(
69
72
  const newSettings = {
70
73
  allowedBlocks: _allowedBlocks,
71
74
  templateLock:
72
- templateLock === undefined ? parentLock : templateLock,
75
+ templateLock === undefined || parentLock === 'contentOnly'
76
+ ? parentLock
77
+ : templateLock,
73
78
  };
74
79
 
75
80
  // These values are not defined for RN, so only include them if they
@@ -96,7 +101,30 @@ export default function useNestedSettingsUpdate(
96
101
  }
97
102
 
98
103
  if ( ! isShallowEqual( blockListSettings, newSettings ) ) {
99
- updateBlockListSettings( clientId, newSettings );
104
+ // Batch updates to block list settings to avoid triggering cascading renders
105
+ // for each container block included in a tree and optimize initial render.
106
+ // To avoid triggering updateBlockListSettings for each container block
107
+ // causing X re-renderings for X container blocks,
108
+ // we batch all the updatedBlockListSettings in a single "data" batch
109
+ // which results in a single re-render.
110
+ if ( ! pendingSettingsUpdates.get( registry ) ) {
111
+ pendingSettingsUpdates.set( registry, [] );
112
+ }
113
+ pendingSettingsUpdates
114
+ .get( registry )
115
+ .push( [ clientId, newSettings ] );
116
+ window.queueMicrotask( () => {
117
+ if ( pendingSettingsUpdates.get( registry )?.length ) {
118
+ registry.batch( () => {
119
+ pendingSettingsUpdates
120
+ .get( registry )
121
+ .forEach( ( args ) => {
122
+ updateBlockListSettings( ...args );
123
+ } );
124
+ pendingSettingsUpdates.set( registry, [] );
125
+ } );
126
+ }
127
+ } );
100
128
  }
101
129
  }, [
102
130
  clientId,
@@ -110,5 +138,6 @@ export default function useNestedSettingsUpdate(
110
138
  orientation,
111
139
  updateBlockListSettings,
112
140
  layout,
141
+ registry,
113
142
  ] );
114
143
  }
@@ -168,6 +168,7 @@ class Inserter extends Component {
168
168
  clientId={ clientId }
169
169
  isAppender={ isAppender }
170
170
  showInserterHelpPanel={ showInserterHelpPanel }
171
+ prioritizePatterns={ prioritizePatterns }
171
172
  />
172
173
  );
173
174
  }
@@ -212,8 +213,6 @@ export default compose( [
212
213
  hasInserterItems,
213
214
  __experimentalGetAllowedBlocks,
214
215
  __experimentalGetDirectInsertBlock,
215
- getBlockIndex,
216
- getBlockCount,
217
216
  getSettings,
218
217
  } = select( blockEditorStore );
219
218
 
@@ -227,8 +226,6 @@ export default compose( [
227
226
  const directInsertBlock =
228
227
  __experimentalGetDirectInsertBlock( rootClientId );
229
228
 
230
- const index = getBlockIndex( clientId );
231
- const blockCount = getBlockCount();
232
229
  const settings = getSettings();
233
230
 
234
231
  const hasSingleBlockType =
@@ -249,10 +246,7 @@ export default compose( [
249
246
  directInsertBlock,
250
247
  rootClientId,
251
248
  prioritizePatterns:
252
- settings.__experimentalPreferPatternsOnRoot &&
253
- ! rootClientId &&
254
- index > 0 &&
255
- ( index < blockCount || blockCount === 0 ),
249
+ settings.__experimentalPreferPatternsOnRoot && ! rootClientId,
256
250
  };
257
251
  } ),
258
252
  withDispatch( ( dispatch, ownProps, { select } ) => {
@@ -26,13 +26,18 @@ function InserterLibrary(
26
26
  },
27
27
  ref
28
28
  ) {
29
- const destinationRootClientId = useSelect(
29
+ const { destinationRootClientId, prioritizePatterns } = useSelect(
30
30
  ( select ) => {
31
- const { getBlockRootClientId } = select( blockEditorStore );
31
+ const { getBlockRootClientId, getSettings } =
32
+ select( blockEditorStore );
32
33
 
33
- return (
34
- rootClientId || getBlockRootClientId( clientId ) || undefined
35
- );
34
+ const _rootClientId =
35
+ rootClientId || getBlockRootClientId( clientId ) || undefined;
36
+ return {
37
+ destinationRootClientId: _rootClientId,
38
+ prioritizePatterns:
39
+ getSettings().__experimentalPreferPatternsOnRoot,
40
+ };
36
41
  },
37
42
  [ clientId, rootClientId ]
38
43
  );
@@ -48,6 +53,7 @@ function InserterLibrary(
48
53
  __experimentalInsertionIndex={ __experimentalInsertionIndex }
49
54
  __experimentalFilterValue={ __experimentalFilterValue }
50
55
  shouldFocusBlock={ shouldFocusBlock }
56
+ prioritizePatterns={ prioritizePatterns }
51
57
  ref={ ref }
52
58
  />
53
59
  );
@@ -1,3 +1,8 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import classnames from 'classnames';
5
+
1
6
  /**
2
7
  * WordPress dependencies
3
8
  */
@@ -37,6 +42,7 @@ function InserterMenu(
37
42
  showMostUsedBlocks,
38
43
  __experimentalFilterValue = '',
39
44
  shouldFocusBlock = true,
45
+ prioritizePatterns,
40
46
  },
41
47
  ref
42
48
  ) {
@@ -180,23 +186,28 @@ function InserterMenu(
180
186
  },
181
187
  } ) );
182
188
 
189
+ const showAsTabs = ! filterValue && ( showPatterns || hasReusableBlocks );
190
+
183
191
  return (
184
192
  <div className="block-editor-inserter__menu">
185
- <div className="block-editor-inserter__main-area">
186
- { /* The following div is necessary to fix the sticky position of the search form. */ }
187
- <div className="block-editor-inserter__content">
188
- <SearchControl
189
- className="block-editor-inserter__search"
190
- onChange={ ( value ) => {
191
- if ( hoveredItem ) setHoveredItem( null );
192
- setFilterValue( value );
193
- } }
194
- value={ filterValue }
195
- label={ __( 'Search for blocks and patterns' ) }
196
- placeholder={ __( 'Search' ) }
197
- ref={ searchRef }
198
- />
199
- { !! filterValue && (
193
+ <div
194
+ className={ classnames( 'block-editor-inserter__main-area', {
195
+ 'show-as-tabs': showAsTabs,
196
+ } ) }
197
+ >
198
+ <SearchControl
199
+ className="block-editor-inserter__search"
200
+ onChange={ ( value ) => {
201
+ if ( hoveredItem ) setHoveredItem( null );
202
+ setFilterValue( value );
203
+ } }
204
+ value={ filterValue }
205
+ label={ __( 'Search for blocks and patterns' ) }
206
+ placeholder={ __( 'Search' ) }
207
+ ref={ searchRef }
208
+ />
209
+ { !! filterValue && (
210
+ <div className="block-editor-inserter__no-tab-container">
200
211
  <InserterSearchResults
201
212
  filterValue={ filterValue }
202
213
  onSelect={ onSelect }
@@ -210,20 +221,22 @@ function InserterMenu(
210
221
  showBlockDirectory
211
222
  shouldFocusBlock={ shouldFocusBlock }
212
223
  />
213
- ) }
214
- { ! filterValue && ( showPatterns || hasReusableBlocks ) && (
215
- <InserterTabs
216
- showPatterns={ showPatterns }
217
- showReusableBlocks={ hasReusableBlocks }
218
- >
219
- { getCurrentTab }
220
- </InserterTabs>
221
- ) }
222
- { ! filterValue &&
223
- ! showPatterns &&
224
- ! hasReusableBlocks &&
225
- blocksTab }
226
- </div>
224
+ </div>
225
+ ) }
226
+ { showAsTabs && (
227
+ <InserterTabs
228
+ showPatterns={ showPatterns }
229
+ showReusableBlocks={ hasReusableBlocks }
230
+ prioritizePatterns={ prioritizePatterns }
231
+ >
232
+ { getCurrentTab }
233
+ </InserterTabs>
234
+ ) }
235
+ { ! filterValue && ! showAsTabs && (
236
+ <div className="block-editor-inserter__no-tab-container">
237
+ { blocksTab }
238
+ </div>
239
+ ) }
227
240
  </div>
228
241
  { showInserterHelpPanel && hoveredItem && (
229
242
  <InserterPreviewPanel item={ hoveredItem } />
@@ -27,7 +27,7 @@ function InserterPreviewPanel( { item } ) {
27
27
  viewportWidth={ example?.viewportWidth ?? 500 }
28
28
  blocks={
29
29
  example
30
- ? getBlockFromExample( item.name, {
30
+ ? getBlockFromExample( name, {
31
31
  attributes: {
32
32
  ...example.attributes,
33
33
  ...initialAttributes,
@@ -0,0 +1,44 @@
1
+ export const patterns = [
2
+ {
3
+ categories: [ 'featured', 'text' ],
4
+ content:
5
+ '<!-- wp:heading {"align":"wide","style":{"typography":{"fontSize":"48px","lineHeight":"1.1"}}} -->\n<h2 class="alignwide" id="we-re-a-studio-in-berlin-with-an-international-practice-in-architecture-urban-planning-and-interior-design-we-believe-in-sharing-knowledge-and-promoting-dialogue-to-increase-the-creative-potential-of-collaboration" style="font-size:48px;line-height:1.1">We\'re a studio in Berlin with an international practice in architecture, urban planning and interior design. We believe in sharing knowledge and promoting dialogue to increase the creative potential of collaboration.</h2>\n<!-- /wp:heading -->',
6
+ description: 'Heading text',
7
+ keywords: [ 'large text', 'title' ],
8
+ name: 'heading',
9
+ title: 'Heading',
10
+ },
11
+ ];
12
+
13
+ export const patternCategories = [
14
+ {
15
+ name: 'featured',
16
+ label: 'Featured',
17
+ },
18
+ {
19
+ name: 'text',
20
+ label: 'Text',
21
+ },
22
+ ];
23
+
24
+ export const reusableBlocks = [
25
+ {
26
+ content: {
27
+ raw: '\x3C!-- wp:paragraph -->\n<p>This is reusable</p>\n\x3C!-- /wp:paragraph -->',
28
+ protected: false,
29
+ block_version: 1,
30
+ },
31
+ date: '2022-09-12T13:28:06',
32
+ date_gmt: '2022-09-12T13:28:06',
33
+ id: 70,
34
+ link: 'http://localhost:8888/?p=70',
35
+ modified: '2022-09-12T13:28:06',
36
+ modified_gmt: '2022-09-12T13:28:06',
37
+ password: '',
38
+ slug: 'simple-paragraph',
39
+ status: 'publish',
40
+ template: '',
41
+ title: { raw: 'Simple paragraph' },
42
+ type: 'wp_block',
43
+ },
44
+ ];