@wordpress/block-editor 10.5.0 → 11.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 (488) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/build/autocompleters/block.js +2 -6
  3. package/build/autocompleters/block.js.map +1 -1
  4. package/build/autocompleters/link.js +2 -0
  5. package/build/autocompleters/link.js.map +1 -1
  6. package/build/components/block-card/index.js +51 -3
  7. package/build/components/block-card/index.js.map +1 -1
  8. package/build/components/block-draggable/index.native.js +46 -39
  9. package/build/components/block-draggable/index.native.js.map +1 -1
  10. package/build/components/block-edit/edit.js +4 -3
  11. package/build/components/block-edit/edit.js.map +1 -1
  12. package/build/components/block-edit/edit.native.js +4 -7
  13. package/build/components/block-edit/edit.native.js.map +1 -1
  14. package/build/components/block-inspector/index.js +35 -33
  15. package/build/components/block-inspector/index.js.map +1 -1
  16. package/build/components/block-list/block-list-context.native.js +5 -8
  17. package/build/components/block-list/block-list-context.native.js.map +1 -1
  18. package/build/components/block-list/block.js +55 -24
  19. package/build/components/block-list/block.js.map +1 -1
  20. package/build/components/block-list/block.native.js +61 -28
  21. package/build/components/block-list/block.native.js.map +1 -1
  22. package/build/components/block-mobile-toolbar/block-actions-menu.native.js +12 -4
  23. package/build/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  24. package/build/components/block-pattern-setup/index.js +3 -2
  25. package/build/components/block-pattern-setup/index.js.map +1 -1
  26. package/build/components/block-patterns-list/index.js +33 -11
  27. package/build/components/block-patterns-list/index.js.map +1 -1
  28. package/build/components/block-preview/auto.js +9 -3
  29. package/build/components/block-preview/auto.js.map +1 -1
  30. package/build/components/block-preview/index.js +5 -9
  31. package/build/components/block-preview/index.js.map +1 -1
  32. package/build/components/block-settings-menu/block-settings-dropdown.js +5 -2
  33. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  34. package/build/components/block-toolbar/index.js +5 -1
  35. package/build/components/block-toolbar/index.js.map +1 -1
  36. package/build/components/block-tools/insertion-point.js +8 -49
  37. package/build/components/block-tools/insertion-point.js.map +1 -1
  38. package/build/components/block-variation-picker/index.js +1 -2
  39. package/build/components/block-variation-picker/index.js.map +1 -1
  40. package/build/components/height-control/index.js +115 -0
  41. package/build/components/height-control/index.js.map +1 -0
  42. package/build/components/iframe/index.js +11 -8
  43. package/build/components/iframe/index.js.map +1 -1
  44. package/build/components/image-editor/use-save-image.js +2 -0
  45. package/build/components/image-editor/use-save-image.js.map +1 -1
  46. package/build/components/image-editor/zoom-dropdown.js +1 -0
  47. package/build/components/image-editor/zoom-dropdown.js.map +1 -1
  48. package/build/components/index.js +9 -0
  49. package/build/components/index.js.map +1 -1
  50. package/build/components/inner-blocks/index.js +20 -6
  51. package/build/components/inner-blocks/index.js.map +1 -1
  52. package/build/components/inner-blocks/use-inner-block-template-sync.js +25 -10
  53. package/build/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  54. package/build/components/inserter/block-patterns-explorer/sidebar.js +1 -0
  55. package/build/components/inserter/block-patterns-explorer/sidebar.js.map +1 -1
  56. package/build/components/inserter/block-patterns-tab.js +25 -46
  57. package/build/components/inserter/block-patterns-tab.js.map +1 -1
  58. package/build/components/inserter/block-types-tab.js +3 -1
  59. package/build/components/inserter/block-types-tab.js.map +1 -1
  60. package/build/components/inserter/hooks/use-debounced-input.js +27 -0
  61. package/build/components/inserter/hooks/use-debounced-input.js.map +1 -0
  62. package/build/components/inserter/index.js +8 -3
  63. package/build/components/inserter/index.js.map +1 -1
  64. package/build/components/inserter/index.native.js +3 -4
  65. package/build/components/inserter/index.native.js.map +1 -1
  66. package/build/components/inserter/media-tab/hooks.js +103 -0
  67. package/build/components/inserter/media-tab/hooks.js.map +1 -0
  68. package/build/components/inserter/media-tab/index.js +32 -0
  69. package/build/components/inserter/media-tab/index.js.map +1 -0
  70. package/build/components/inserter/media-tab/media-list.js +100 -0
  71. package/build/components/inserter/media-tab/media-list.js.map +1 -0
  72. package/build/components/inserter/media-tab/media-panel.js +96 -0
  73. package/build/components/inserter/media-tab/media-panel.js.map +1 -0
  74. package/build/components/inserter/media-tab/media-tab.js +120 -0
  75. package/build/components/inserter/media-tab/media-tab.js.map +1 -0
  76. package/build/components/inserter/media-tab/utils.js +54 -0
  77. package/build/components/inserter/media-tab/utils.js.map +1 -0
  78. package/build/components/inserter/menu.js +35 -12
  79. package/build/components/inserter/menu.js.map +1 -1
  80. package/build/components/inserter/mobile-tab-navigation.js +70 -0
  81. package/build/components/inserter/mobile-tab-navigation.js.map +1 -0
  82. package/build/components/inserter/quick-inserter.js +1 -0
  83. package/build/components/inserter/quick-inserter.js.map +1 -1
  84. package/build/components/inserter/search-results.js +3 -1
  85. package/build/components/inserter/search-results.js.map +1 -1
  86. package/build/components/inserter/tabs.js +16 -2
  87. package/build/components/inserter/tabs.js.map +1 -1
  88. package/build/components/inserter-list-item/index.js +4 -1
  89. package/build/components/inserter-list-item/index.js.map +1 -1
  90. package/build/components/inspector-controls/groups.js +2 -0
  91. package/build/components/inspector-controls/groups.js.map +1 -1
  92. package/build/components/inspector-controls-tabs/advanced-controls-panel.js +46 -0
  93. package/build/components/inspector-controls-tabs/advanced-controls-panel.js.map +1 -0
  94. package/build/components/inspector-controls-tabs/index.js +71 -0
  95. package/build/components/inspector-controls-tabs/index.js.map +1 -0
  96. package/build/components/inspector-controls-tabs/settings-tab.js +28 -0
  97. package/build/components/inspector-controls-tabs/settings-tab.js.map +1 -0
  98. package/build/components/inspector-controls-tabs/styles-tab.js +61 -0
  99. package/build/components/inspector-controls-tabs/styles-tab.js.map +1 -0
  100. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.js +97 -0
  101. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.js.map +1 -0
  102. package/build/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js +18 -0
  103. package/build/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js.map +1 -0
  104. package/build/components/inspector-controls-tabs/utils.js +37 -0
  105. package/build/components/inspector-controls-tabs/utils.js.map +1 -0
  106. package/build/components/link-control/index.js +1 -0
  107. package/build/components/link-control/index.js.map +1 -1
  108. package/build/components/link-control/search-input.js +0 -1
  109. package/build/components/link-control/search-input.js.map +1 -1
  110. package/build/components/link-control/use-internal-input-value.js +3 -3
  111. package/build/components/link-control/use-internal-input-value.js.map +1 -1
  112. package/build/components/list-view/block.js +5 -2
  113. package/build/components/list-view/block.js.map +1 -1
  114. package/build/components/list-view/branch.js +13 -12
  115. package/build/components/list-view/branch.js.map +1 -1
  116. package/build/components/media-upload/index.native.js +2 -3
  117. package/build/components/media-upload/index.native.js.map +1 -1
  118. package/build/components/off-canvas-editor/appender.js +104 -0
  119. package/build/components/off-canvas-editor/appender.js.map +1 -0
  120. package/build/components/off-canvas-editor/block-edit-button.js +50 -0
  121. package/build/components/off-canvas-editor/block-edit-button.js.map +1 -0
  122. package/build/components/off-canvas-editor/block.js +36 -4
  123. package/build/components/off-canvas-editor/block.js.map +1 -1
  124. package/build/components/off-canvas-editor/branch.js +3 -5
  125. package/build/components/off-canvas-editor/branch.js.map +1 -1
  126. package/build/components/off-canvas-editor/index.js +20 -11
  127. package/build/components/off-canvas-editor/index.js.map +1 -1
  128. package/build/components/off-canvas-editor/leaf.js +1 -1
  129. package/build/components/off-canvas-editor/leaf.js.map +1 -1
  130. package/build/components/off-canvas-editor/link-ui.js +185 -0
  131. package/build/components/off-canvas-editor/link-ui.js.map +1 -0
  132. package/build/components/off-canvas-editor/update-attributes.js +108 -0
  133. package/build/components/off-canvas-editor/update-attributes.js.map +1 -0
  134. package/build/components/rich-text/format-toolbar/index.js +8 -4
  135. package/build/components/rich-text/format-toolbar/index.js.map +1 -1
  136. package/build/components/rich-text/index.js +3 -3
  137. package/build/components/rich-text/index.js.map +1 -1
  138. package/build/components/rich-text/index.native.js +0 -2
  139. package/build/components/rich-text/index.native.js.map +1 -1
  140. package/build/components/rich-text/use-insert-replacement-text.js +43 -0
  141. package/build/components/rich-text/use-insert-replacement-text.js.map +1 -0
  142. package/build/components/rich-text/use-undo-automatic-change.js +9 -1
  143. package/build/components/rich-text/use-undo-automatic-change.js.map +1 -1
  144. package/build/components/rich-text/utils.js +1 -19
  145. package/build/components/rich-text/utils.js.map +1 -1
  146. package/build/components/spacing-sizes-control/spacing-input-control.js +12 -3
  147. package/build/components/spacing-sizes-control/spacing-input-control.js.map +1 -1
  148. package/build/components/ungroup-button/index.native.js +4 -2
  149. package/build/components/ungroup-button/index.native.js.map +1 -1
  150. package/build/components/url-input/index.js +46 -43
  151. package/build/components/url-input/index.js.map +1 -1
  152. package/build/components/use-block-display-information/index.js +8 -4
  153. package/build/components/use-block-display-information/index.js.map +1 -1
  154. package/build/components/use-setting/index.js +9 -1
  155. package/build/components/use-setting/index.js.map +1 -1
  156. package/build/hooks/child-layout.js +209 -0
  157. package/build/hooks/child-layout.js.map +1 -0
  158. package/build/hooks/content-lock-ui.js +1 -1
  159. package/build/hooks/content-lock-ui.js.map +1 -1
  160. package/build/hooks/dimensions.js +25 -7
  161. package/build/hooks/dimensions.js.map +1 -1
  162. package/build/hooks/layout.js +57 -1
  163. package/build/hooks/layout.js.map +1 -1
  164. package/build/hooks/min-height.js +4 -10
  165. package/build/hooks/min-height.js.map +1 -1
  166. package/build/store/reducer.js +393 -270
  167. package/build/store/reducer.js.map +1 -1
  168. package/build/store/selectors.js +57 -47
  169. package/build/store/selectors.js.map +1 -1
  170. package/build/utils/sorting.js +63 -0
  171. package/build/utils/sorting.js.map +1 -0
  172. package/build-module/autocompleters/block.js +2 -6
  173. package/build-module/autocompleters/block.js.map +1 -1
  174. package/build-module/autocompleters/link.js +2 -0
  175. package/build-module/autocompleters/link.js.map +1 -1
  176. package/build-module/components/block-card/index.js +45 -3
  177. package/build-module/components/block-card/index.js.map +1 -1
  178. package/build-module/components/block-draggable/index.native.js +40 -31
  179. package/build-module/components/block-draggable/index.native.js.map +1 -1
  180. package/build-module/components/block-edit/edit.js +4 -2
  181. package/build-module/components/block-edit/edit.js.map +1 -1
  182. package/build-module/components/block-edit/edit.native.js +4 -6
  183. package/build-module/components/block-edit/edit.native.js.map +1 -1
  184. package/build-module/components/block-inspector/index.js +32 -30
  185. package/build-module/components/block-inspector/index.js.map +1 -1
  186. package/build-module/components/block-list/block-list-context.native.js +5 -8
  187. package/build-module/components/block-list/block-list-context.native.js.map +1 -1
  188. package/build-module/components/block-list/block.js +55 -25
  189. package/build-module/components/block-list/block.js.map +1 -1
  190. package/build-module/components/block-list/block.native.js +61 -28
  191. package/build-module/components/block-list/block.native.js.map +1 -1
  192. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js +13 -6
  193. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  194. package/build-module/components/block-pattern-setup/index.js +3 -2
  195. package/build-module/components/block-pattern-setup/index.js.map +1 -1
  196. package/build-module/components/block-patterns-list/index.js +35 -13
  197. package/build-module/components/block-patterns-list/index.js.map +1 -1
  198. package/build-module/components/block-preview/auto.js +9 -3
  199. package/build-module/components/block-preview/auto.js.map +1 -1
  200. package/build-module/components/block-preview/index.js +5 -8
  201. package/build-module/components/block-preview/index.js.map +1 -1
  202. package/build-module/components/block-settings-menu/block-settings-dropdown.js +5 -2
  203. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  204. package/build-module/components/block-toolbar/index.js +6 -2
  205. package/build-module/components/block-toolbar/index.js.map +1 -1
  206. package/build-module/components/block-tools/insertion-point.js +8 -49
  207. package/build-module/components/block-tools/insertion-point.js.map +1 -1
  208. package/build-module/components/block-variation-picker/index.js +1 -2
  209. package/build-module/components/block-variation-picker/index.js.map +1 -1
  210. package/build-module/components/height-control/index.js +103 -0
  211. package/build-module/components/height-control/index.js.map +1 -0
  212. package/build-module/components/iframe/index.js +11 -8
  213. package/build-module/components/iframe/index.js.map +1 -1
  214. package/build-module/components/image-editor/use-save-image.js +2 -0
  215. package/build-module/components/image-editor/use-save-image.js.map +1 -1
  216. package/build-module/components/image-editor/zoom-dropdown.js +1 -0
  217. package/build-module/components/image-editor/zoom-dropdown.js.map +1 -1
  218. package/build-module/components/index.js +1 -0
  219. package/build-module/components/index.js.map +1 -1
  220. package/build-module/components/inner-blocks/index.js +22 -8
  221. package/build-module/components/inner-blocks/index.js.map +1 -1
  222. package/build-module/components/inner-blocks/use-inner-block-template-sync.js +23 -10
  223. package/build-module/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  224. package/build-module/components/inserter/block-patterns-explorer/sidebar.js +1 -0
  225. package/build-module/components/inserter/block-patterns-explorer/sidebar.js.map +1 -1
  226. package/build-module/components/inserter/block-patterns-tab.js +27 -49
  227. package/build-module/components/inserter/block-patterns-tab.js.map +1 -1
  228. package/build-module/components/inserter/block-types-tab.js +3 -2
  229. package/build-module/components/inserter/block-types-tab.js.map +1 -1
  230. package/build-module/components/inserter/hooks/use-debounced-input.js +18 -0
  231. package/build-module/components/inserter/hooks/use-debounced-input.js.map +1 -0
  232. package/build-module/components/inserter/index.js +8 -3
  233. package/build-module/components/inserter/index.js.map +1 -1
  234. package/build-module/components/inserter/index.native.js +3 -5
  235. package/build-module/components/inserter/index.native.js.map +1 -1
  236. package/build-module/components/inserter/media-tab/hooks.js +89 -0
  237. package/build-module/components/inserter/media-tab/hooks.js.map +1 -0
  238. package/build-module/components/inserter/media-tab/index.js +4 -0
  239. package/build-module/components/inserter/media-tab/index.js.map +1 -0
  240. package/build-module/components/inserter/media-tab/media-list.js +86 -0
  241. package/build-module/components/inserter/media-tab/media-list.js.map +1 -0
  242. package/build-module/components/inserter/media-tab/media-panel.js +77 -0
  243. package/build-module/components/inserter/media-tab/media-panel.js.map +1 -0
  244. package/build-module/components/inserter/media-tab/media-tab.js +100 -0
  245. package/build-module/components/inserter/media-tab/media-tab.js.map +1 -0
  246. package/build-module/components/inserter/media-tab/utils.js +45 -0
  247. package/build-module/components/inserter/media-tab/utils.js.map +1 -0
  248. package/build-module/components/inserter/menu.js +33 -12
  249. package/build-module/components/inserter/menu.js.map +1 -1
  250. package/build-module/components/inserter/mobile-tab-navigation.js +61 -0
  251. package/build-module/components/inserter/mobile-tab-navigation.js.map +1 -0
  252. package/build-module/components/inserter/quick-inserter.js +1 -0
  253. package/build-module/components/inserter/quick-inserter.js.map +1 -1
  254. package/build-module/components/inserter/search-results.js +3 -2
  255. package/build-module/components/inserter/search-results.js.map +1 -1
  256. package/build-module/components/inserter/tabs.js +15 -2
  257. package/build-module/components/inserter/tabs.js.map +1 -1
  258. package/build-module/components/inserter-list-item/index.js +5 -2
  259. package/build-module/components/inserter-list-item/index.js.map +1 -1
  260. package/build-module/components/inspector-controls/groups.js +2 -0
  261. package/build-module/components/inspector-controls/groups.js.map +1 -1
  262. package/build-module/components/inspector-controls-tabs/advanced-controls-panel.js +32 -0
  263. package/build-module/components/inspector-controls-tabs/advanced-controls-panel.js.map +1 -0
  264. package/build-module/components/inspector-controls-tabs/index.js +56 -0
  265. package/build-module/components/inspector-controls-tabs/index.js.map +1 -0
  266. package/build-module/components/inspector-controls-tabs/settings-tab.js +17 -0
  267. package/build-module/components/inspector-controls-tabs/settings-tab.js.map +1 -0
  268. package/build-module/components/inspector-controls-tabs/styles-tab.js +46 -0
  269. package/build-module/components/inspector-controls-tabs/styles-tab.js.map +1 -0
  270. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.js +81 -0
  271. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.js.map +1 -0
  272. package/build-module/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js +8 -0
  273. package/build-module/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js.map +1 -0
  274. package/build-module/components/inspector-controls-tabs/utils.js +26 -0
  275. package/build-module/components/inspector-controls-tabs/utils.js.map +1 -0
  276. package/build-module/components/link-control/index.js +1 -0
  277. package/build-module/components/link-control/index.js.map +1 -1
  278. package/build-module/components/link-control/search-input.js +0 -1
  279. package/build-module/components/link-control/search-input.js.map +1 -1
  280. package/build-module/components/link-control/use-internal-input-value.js +3 -3
  281. package/build-module/components/link-control/use-internal-input-value.js.map +1 -1
  282. package/build-module/components/list-view/block.js +5 -2
  283. package/build-module/components/list-view/block.js.map +1 -1
  284. package/build-module/components/list-view/branch.js +12 -11
  285. package/build-module/components/list-view/branch.js.map +1 -1
  286. package/build-module/components/media-upload/index.native.js +2 -4
  287. package/build-module/components/media-upload/index.native.js.map +1 -1
  288. package/build-module/components/off-canvas-editor/appender.js +89 -0
  289. package/build-module/components/off-canvas-editor/appender.js.map +1 -0
  290. package/build-module/components/off-canvas-editor/block-edit-button.js +35 -0
  291. package/build-module/components/off-canvas-editor/block-edit-button.js.map +1 -0
  292. package/build-module/components/off-canvas-editor/block.js +36 -6
  293. package/build-module/components/off-canvas-editor/block.js.map +1 -1
  294. package/build-module/components/off-canvas-editor/branch.js +3 -4
  295. package/build-module/components/off-canvas-editor/branch.js.map +1 -1
  296. package/build-module/components/off-canvas-editor/index.js +20 -12
  297. package/build-module/components/off-canvas-editor/index.js.map +1 -1
  298. package/build-module/components/off-canvas-editor/leaf.js +1 -1
  299. package/build-module/components/off-canvas-editor/leaf.js.map +1 -1
  300. package/build-module/components/off-canvas-editor/link-ui.js +165 -0
  301. package/build-module/components/off-canvas-editor/link-ui.js.map +1 -0
  302. package/build-module/components/off-canvas-editor/update-attributes.js +97 -0
  303. package/build-module/components/off-canvas-editor/update-attributes.js.map +1 -0
  304. package/build-module/components/rich-text/format-toolbar/index.js +6 -2
  305. package/build-module/components/rich-text/format-toolbar/index.js.map +1 -1
  306. package/build-module/components/rich-text/index.js +2 -3
  307. package/build-module/components/rich-text/index.js.map +1 -1
  308. package/build-module/components/rich-text/index.native.js +0 -2
  309. package/build-module/components/rich-text/index.native.js.map +1 -1
  310. package/build-module/components/rich-text/use-insert-replacement-text.js +33 -0
  311. package/build-module/components/rich-text/use-insert-replacement-text.js.map +1 -0
  312. package/build-module/components/rich-text/use-undo-automatic-change.js +9 -1
  313. package/build-module/components/rich-text/use-undo-automatic-change.js.map +1 -1
  314. package/build-module/components/rich-text/utils.js +1 -16
  315. package/build-module/components/rich-text/utils.js.map +1 -1
  316. package/build-module/components/spacing-sizes-control/spacing-input-control.js +12 -3
  317. package/build-module/components/spacing-sizes-control/spacing-input-control.js.map +1 -1
  318. package/build-module/components/ungroup-button/index.native.js +3 -2
  319. package/build-module/components/ungroup-button/index.native.js.map +1 -1
  320. package/build-module/components/url-input/index.js +46 -43
  321. package/build-module/components/url-input/index.js.map +1 -1
  322. package/build-module/components/use-block-display-information/index.js +9 -5
  323. package/build-module/components/use-block-display-information/index.js.map +1 -1
  324. package/build-module/components/use-setting/index.js +8 -1
  325. package/build-module/components/use-setting/index.js.map +1 -1
  326. package/build-module/hooks/child-layout.js +189 -0
  327. package/build-module/hooks/child-layout.js.map +1 -0
  328. package/build-module/hooks/content-lock-ui.js +1 -1
  329. package/build-module/hooks/content-lock-ui.js.map +1 -1
  330. package/build-module/hooks/dimensions.js +25 -8
  331. package/build-module/hooks/dimensions.js.map +1 -1
  332. package/build-module/hooks/layout.js +55 -0
  333. package/build-module/hooks/layout.js.map +1 -1
  334. package/build-module/hooks/min-height.js +3 -9
  335. package/build-module/hooks/min-height.js.map +1 -1
  336. package/build-module/store/reducer.js +391 -271
  337. package/build-module/store/reducer.js.map +1 -1
  338. package/build-module/store/selectors.js +54 -47
  339. package/build-module/store/selectors.js.map +1 -1
  340. package/build-module/utils/sorting.js +56 -0
  341. package/build-module/utils/sorting.js.map +1 -0
  342. package/build-style/content-rtl.css +701 -0
  343. package/build-style/content.css +701 -0
  344. package/build-style/default-editor-styles-rtl.css +14 -0
  345. package/build-style/default-editor-styles.css +14 -0
  346. package/build-style/style-rtl.css +286 -662
  347. package/build-style/style.css +286 -662
  348. package/package.json +32 -30
  349. package/src/autocompleters/block.js +2 -6
  350. package/src/autocompleters/link.js +2 -0
  351. package/src/components/alignment-control/test/index.js +4 -1
  352. package/src/components/block-alignment-control/test/index.js +4 -1
  353. package/src/components/block-card/index.js +46 -2
  354. package/src/components/block-card/style.scss +4 -0
  355. package/src/components/block-content-overlay/{style.scss → content.scss} +7 -1
  356. package/src/components/block-draggable/content.scss +20 -0
  357. package/src/components/block-draggable/index.native.js +54 -40
  358. package/src/components/block-draggable/style.scss +0 -21
  359. package/src/components/block-draggable/test/helpers.native.js +7 -9
  360. package/src/components/block-draggable/test/index.native.js +35 -45
  361. package/src/components/block-edit/edit.js +5 -2
  362. package/src/components/block-edit/edit.native.js +5 -6
  363. package/src/components/block-inspector/index.js +96 -81
  364. package/src/components/block-inspector/style.scss +9 -1
  365. package/src/components/block-list/block-list-context.native.js +5 -8
  366. package/src/components/block-list/block.js +74 -23
  367. package/src/components/block-list/block.native.js +78 -23
  368. package/src/components/block-list/{style.scss → content.scss} +1 -15
  369. package/src/components/block-list-appender/{style.scss → content.scss} +0 -0
  370. package/src/components/block-mobile-toolbar/block-actions-menu.native.js +24 -6
  371. package/src/components/block-mover/test/__snapshots__/index.native.js.snap +0 -2
  372. package/src/components/block-pattern-setup/index.js +2 -1
  373. package/src/components/block-patterns-list/index.js +47 -24
  374. package/src/components/block-preview/README.md +15 -10
  375. package/src/components/block-preview/auto.js +7 -1
  376. package/src/components/block-preview/content.scss +4 -0
  377. package/src/components/block-preview/index.js +7 -12
  378. package/src/components/block-preview/style.scss +0 -7
  379. package/src/components/block-preview/test/index.js +18 -35
  380. package/src/components/block-selection-clearer/test/index.js +12 -12
  381. package/src/components/block-settings-menu/block-settings-dropdown.js +32 -20
  382. package/src/components/block-switcher/test/index.js +4 -0
  383. package/src/components/block-toolbar/index.js +12 -5
  384. package/src/components/block-toolbar/style.scss +10 -0
  385. package/src/components/block-tools/insertion-point.js +3 -47
  386. package/src/components/block-tools/style.scss +12 -5
  387. package/src/components/block-variation-picker/index.js +1 -4
  388. package/src/components/block-vertical-alignment-control/test/index.js +4 -1
  389. package/src/components/default-block-appender/{style.scss → content.scss} +0 -0
  390. package/src/components/height-control/index.js +123 -0
  391. package/src/components/height-control/stories/index.js +21 -0
  392. package/src/components/height-control/style.scss +5 -0
  393. package/src/components/iframe/index.js +25 -18
  394. package/src/components/image-editor/use-save-image.js +2 -0
  395. package/src/components/image-editor/zoom-dropdown.js +1 -0
  396. package/src/components/index.js +1 -0
  397. package/src/components/inner-blocks/{style.scss → content.scss} +0 -0
  398. package/src/components/inner-blocks/index.js +23 -6
  399. package/src/components/inner-blocks/use-inner-block-template-sync.js +28 -10
  400. package/src/components/inserter/block-patterns-explorer/sidebar.js +1 -0
  401. package/src/components/inserter/block-patterns-tab.js +28 -71
  402. package/src/components/inserter/block-types-tab.js +3 -2
  403. package/src/components/inserter/hooks/use-debounced-input.js +17 -0
  404. package/src/components/inserter/index.js +10 -2
  405. package/src/components/inserter/index.native.js +1 -1
  406. package/src/components/inserter/media-tab/hooks.js +88 -0
  407. package/src/components/inserter/media-tab/index.js +3 -0
  408. package/src/components/inserter/media-tab/media-list.js +93 -0
  409. package/src/components/inserter/media-tab/media-panel.js +83 -0
  410. package/src/components/inserter/media-tab/media-tab.js +135 -0
  411. package/src/components/inserter/media-tab/utils.js +37 -0
  412. package/src/components/inserter/menu.js +55 -13
  413. package/src/components/inserter/mobile-tab-navigation.js +85 -0
  414. package/src/components/inserter/quick-inserter.js +1 -0
  415. package/src/components/inserter/search-results.js +3 -2
  416. package/src/components/inserter/stories/index.js +1 -1
  417. package/src/components/inserter/stories/{fixtures.js → utils/fixtures.js} +0 -0
  418. package/src/components/inserter/style.scss +176 -11
  419. package/src/components/inserter/tabs.js +12 -1
  420. package/src/components/inserter-list-item/index.js +11 -1
  421. package/src/components/inserter-list-item/style.scss +26 -0
  422. package/src/components/inspector-controls/groups.js +2 -0
  423. package/src/components/inspector-controls-tabs/advanced-controls-panel.js +37 -0
  424. package/src/components/inspector-controls-tabs/index.js +62 -0
  425. package/src/components/inspector-controls-tabs/settings-tab.js +18 -0
  426. package/src/components/inspector-controls-tabs/styles-tab.js +51 -0
  427. package/src/components/inspector-controls-tabs/use-inspector-controls-tabs.js +89 -0
  428. package/src/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js +9 -0
  429. package/src/components/inspector-controls-tabs/utils.js +28 -0
  430. package/src/components/line-height-control/test/index.js +5 -5
  431. package/src/components/link-control/README.md +1 -1
  432. package/src/components/link-control/index.js +1 -0
  433. package/src/components/link-control/search-input.js +0 -1
  434. package/src/components/link-control/test/index.js +188 -401
  435. package/src/components/link-control/use-internal-input-value.js +3 -3
  436. package/src/components/list-view/block.js +3 -0
  437. package/src/components/list-view/branch.js +10 -8
  438. package/src/components/list-view/style.scss +20 -9
  439. package/src/components/media-placeholder/{style.scss → content.scss} +0 -0
  440. package/src/components/media-replace-flow/test/index.js +37 -9
  441. package/src/components/media-upload/test/index.native.js +2 -0
  442. package/src/components/off-canvas-editor/appender.js +93 -0
  443. package/src/components/off-canvas-editor/block-edit-button.js +27 -0
  444. package/src/components/off-canvas-editor/block.js +88 -22
  445. package/src/components/off-canvas-editor/branch.js +3 -5
  446. package/src/components/off-canvas-editor/index.js +59 -33
  447. package/src/components/off-canvas-editor/leaf.js +5 -1
  448. package/src/components/off-canvas-editor/link-ui.js +166 -0
  449. package/src/components/off-canvas-editor/style.scss +17 -388
  450. package/src/components/off-canvas-editor/update-attributes.js +99 -0
  451. package/src/components/plain-text/{style.scss → content.scss} +0 -0
  452. package/src/components/recursion-provider/test/index.js +27 -29
  453. package/src/components/rich-text/content.scss +42 -0
  454. package/src/components/rich-text/format-toolbar/index.js +6 -4
  455. package/src/components/rich-text/index.js +2 -2
  456. package/src/components/rich-text/index.native.js +0 -2
  457. package/src/components/rich-text/style.scss +0 -43
  458. package/src/components/rich-text/use-insert-replacement-text.js +31 -0
  459. package/src/components/rich-text/use-undo-automatic-change.js +7 -1
  460. package/src/components/rich-text/utils.js +2 -21
  461. package/src/components/spacing-sizes-control/spacing-input-control.js +9 -0
  462. package/src/components/ungroup-button/index.native.js +6 -2
  463. package/src/components/url-input/index.js +57 -73
  464. package/src/components/url-popover/test/__snapshots__/index.js.snap +8 -6
  465. package/src/components/url-popover/test/index.js +21 -9
  466. package/src/components/use-block-display-information/index.js +14 -5
  467. package/src/components/use-setting/index.js +13 -1
  468. package/src/components/use-setting/test/index.js +99 -0
  469. package/src/content.scss +10 -0
  470. package/src/hooks/child-layout.js +190 -0
  471. package/src/hooks/content-lock-ui.js +1 -1
  472. package/src/hooks/dimensions.js +45 -7
  473. package/src/hooks/layout.js +60 -0
  474. package/src/hooks/min-height.js +2 -19
  475. package/src/store/reducer.js +459 -423
  476. package/src/store/selectors.js +56 -57
  477. package/src/store/test/performance.js +71 -0
  478. package/src/store/test/reducer.js +623 -491
  479. package/src/store/test/selectors.js +1820 -1306
  480. package/src/style.scss +4 -7
  481. package/src/utils/sorting.js +54 -0
  482. package/src/utils/test/sorting.js +49 -0
  483. package/tsconfig.tsbuildinfo +1 -1
  484. package/build/components/block-preview/live.js +0 -30
  485. package/build/components/block-preview/live.js.map +0 -1
  486. package/build-module/components/block-preview/live.js +0 -20
  487. package/build-module/components/block-preview/live.js.map +0 -1
  488. package/src/components/block-preview/live.js +0 -19
@@ -23,12 +23,14 @@ import {
23
23
  isReusableBlock,
24
24
  } from '@wordpress/blocks';
25
25
  import { __, sprintf } from '@wordpress/i18n';
26
- import { withDispatch, withSelect } from '@wordpress/data';
26
+ import { withDispatch, withSelect, useSelect } from '@wordpress/data';
27
27
  import { withInstanceId, compose } from '@wordpress/compose';
28
28
  import { moreHorizontalMobile } from '@wordpress/icons';
29
29
  import { useRef, useState } from '@wordpress/element';
30
30
  import { store as noticesStore } from '@wordpress/notices';
31
31
  import { store as reusableBlocksStore } from '@wordpress/reusable-blocks';
32
+ // Disable Reason: Needs to be refactored.
33
+ // eslint-disable-next-line no-restricted-imports
32
34
  import { store as coreStore } from '@wordpress/core-data';
33
35
 
34
36
  /**
@@ -78,6 +80,12 @@ const BlockActionsMenu = ( {
78
80
  clipboardBlock &&
79
81
  canInsertBlockType( clipboardBlock.name, rootClientId );
80
82
 
83
+ const innerBlockCount = useSelect(
84
+ ( select ) =>
85
+ select( blockEditorStore ).getBlockCount( selectedBlockClientId ),
86
+ [ selectedBlockClientId ]
87
+ );
88
+
81
89
  const {
82
90
  actionTitle: {
83
91
  backward: backwardButtonTitle,
@@ -187,13 +195,21 @@ const BlockActionsMenu = ( {
187
195
  },
188
196
  convertToRegularBlocks: {
189
197
  id: 'convertToRegularBlocksOption',
190
- label: __( 'Convert to regular blocks' ),
198
+ label:
199
+ innerBlockCount > 1
200
+ ? __( 'Convert to regular blocks' )
201
+ : __( 'Convert to regular block' ),
191
202
  value: 'convertToRegularBlocksOption',
192
203
  onSelect: () => {
204
+ const successNotice =
205
+ innerBlockCount > 1
206
+ ? /* translators: %s: name of the reusable block */
207
+ __( '%s converted to regular blocks' )
208
+ : /* translators: %s: name of the reusable block */
209
+ __( '%s converted to regular block' );
193
210
  createSuccessNotice(
194
211
  sprintf(
195
- /* translators: %s: name of the reusable block */
196
- __( '%s converted to regular blocks' ),
212
+ successNotice,
197
213
  reusableBlock?.title?.raw || blockTitle
198
214
  )
199
215
  );
@@ -293,6 +309,8 @@ const BlockActionsMenu = ( {
293
309
  );
294
310
  };
295
311
 
312
+ const EMPTY_BLOCK_LIST = [];
313
+
296
314
  export default compose(
297
315
  withSelect( ( select, { clientIds } ) => {
298
316
  const {
@@ -345,8 +363,8 @@ export default compose(
345
363
  ? getBlocksByClientId( selectedBlockClientId )[ 0 ]
346
364
  : undefined;
347
365
  const selectedBlockPossibleTransformations = selectedBlock
348
- ? getBlockTransformItems( [ selectedBlock ], rootClientId )
349
- : [];
366
+ ? getBlockTransformItems( selectedBlock, rootClientId )
367
+ : EMPTY_BLOCK_LIST;
350
368
 
351
369
  const isReusableBlockType = block ? isReusableBlock( block ) : false;
352
370
  const reusableBlock = isReusableBlockType
@@ -15,7 +15,6 @@ Array [
15
15
  accessible={true}
16
16
  collapsable={false}
17
17
  focusable={true}
18
- nativeID="animatedComponent"
19
18
  onClick={[Function]}
20
19
  onResponderGrant={[Function]}
21
20
  onResponderMove={[Function]}
@@ -75,7 +74,6 @@ Array [
75
74
  accessible={true}
76
75
  collapsable={false}
77
76
  focusable={true}
78
- nativeID="animatedComponent"
79
77
  onClick={[Function]}
80
78
  onResponderGrant={[Function]}
81
79
  onResponderMove={[Function]}
@@ -138,8 +138,9 @@ const BlockPatternSetup = ( {
138
138
  blockName,
139
139
  filterPatternsFn,
140
140
  onBlockPatternSelect,
141
+ initialViewMode = VIEWMODES.carousel,
141
142
  } ) => {
142
- const [ viewMode, setViewMode ] = useState( VIEWMODES.carousel );
143
+ const [ viewMode, setViewMode ] = useState( initialViewMode );
143
144
  const [ activeSlide, setActiveSlide ] = useState( 0 );
144
145
  const { replaceBlock } = useDispatch( blockEditorStore );
145
146
  const patterns = usePatternsSetup( clientId, blockName, filterPatternsFn );
@@ -6,6 +6,7 @@ import {
6
6
  __unstableComposite as Composite,
7
7
  __unstableUseCompositeState as useCompositeState,
8
8
  __unstableCompositeItem as CompositeItem,
9
+ Tooltip,
9
10
  } from '@wordpress/components';
10
11
  import { useInstanceId } from '@wordpress/compose';
11
12
  import { __ } from '@wordpress/i18n';
@@ -16,7 +17,20 @@ import { __ } from '@wordpress/i18n';
16
17
  import BlockPreview from '../block-preview';
17
18
  import InserterDraggableBlocks from '../inserter-draggable-blocks';
18
19
 
19
- function BlockPattern( { isDraggable, pattern, onClick, composite } ) {
20
+ const WithToolTip = ( { showTooltip, title, children } ) => {
21
+ if ( showTooltip ) {
22
+ return <Tooltip text={ title }>{ children }</Tooltip>;
23
+ }
24
+ return <>{ children }</>;
25
+ };
26
+
27
+ function BlockPattern( {
28
+ isDraggable,
29
+ pattern,
30
+ onClick,
31
+ composite,
32
+ showTooltip,
33
+ } ) {
20
34
  const { blocks, viewportWidth } = pattern;
21
35
  const instanceId = useInstanceId( BlockPattern );
22
36
  const descriptionId = `block-editor-block-patterns-list__item-description-${ instanceId }`;
@@ -34,30 +48,37 @@ function BlockPattern( { isDraggable, pattern, onClick, composite } ) {
34
48
  onDragStart={ onDragStart }
35
49
  onDragEnd={ onDragEnd }
36
50
  >
37
- <CompositeItem
38
- role="option"
39
- as="div"
40
- { ...composite }
41
- className="block-editor-block-patterns-list__item"
42
- onClick={ () => onClick( pattern, blocks ) }
43
- aria-label={ pattern.title }
44
- aria-describedby={
45
- pattern.description ? descriptionId : undefined
46
- }
51
+ <WithToolTip
52
+ showTooltip={ showTooltip }
53
+ title={ pattern.title }
47
54
  >
48
- <BlockPreview
49
- blocks={ blocks }
50
- viewportWidth={ viewportWidth }
51
- />
52
- <div className="block-editor-block-patterns-list__item-title">
53
- { pattern.title }
54
- </div>
55
- { !! pattern.description && (
56
- <VisuallyHidden id={ descriptionId }>
57
- { pattern.description }
58
- </VisuallyHidden>
59
- ) }
60
- </CompositeItem>
55
+ <CompositeItem
56
+ role="option"
57
+ as="div"
58
+ { ...composite }
59
+ className="block-editor-block-patterns-list__item"
60
+ onClick={ () => onClick( pattern, blocks ) }
61
+ aria-label={ pattern.title }
62
+ aria-describedby={
63
+ pattern.description ? descriptionId : undefined
64
+ }
65
+ >
66
+ <BlockPreview
67
+ blocks={ blocks }
68
+ viewportWidth={ viewportWidth }
69
+ />
70
+ { ! showTooltip && (
71
+ <div className="block-editor-block-patterns-list__item-title">
72
+ { pattern.title }
73
+ </div>
74
+ ) }
75
+ { !! pattern.description && (
76
+ <VisuallyHidden id={ descriptionId }>
77
+ { pattern.description }
78
+ </VisuallyHidden>
79
+ ) }
80
+ </CompositeItem>
81
+ </WithToolTip>
61
82
  </div>
62
83
  ) }
63
84
  </InserterDraggableBlocks>
@@ -77,6 +98,7 @@ function BlockPatternList( {
77
98
  onClickPattern,
78
99
  orientation,
79
100
  label = __( 'Block Patterns' ),
101
+ showTitlesAsTooltip,
80
102
  } ) {
81
103
  const composite = useCompositeState( { orientation } );
82
104
  return (
@@ -95,6 +117,7 @@ function BlockPatternList( {
95
117
  onClick={ onClickPattern }
96
118
  isDraggable={ isDraggable }
97
119
  composite={ composite }
120
+ showTooltip={ showTitlesAsTooltip }
98
121
  />
99
122
  ) : (
100
123
  <BlockPatternPlaceholder key={ pattern.name } />
@@ -28,6 +28,8 @@ Width of the preview container in pixels. Controls at what size the blocks will
28
28
 
29
29
  `viewportWidth` can be used to simulate how blocks look on different device sizes or to make sure make sure multiple previews will be rendered with the same scale, regardless of their content.
30
30
 
31
+ Set `viewportWidth` to `0` to make the viewport the same width as the container.
32
+
31
33
  ### `__experimentalPadding`
32
34
 
33
35
  - **Type** `Int`
@@ -35,16 +37,19 @@ Width of the preview container in pixels. Controls at what size the blocks will
35
37
 
36
38
  Padding for the preview container body.
37
39
 
38
- ### `__experimentalLive`
39
-
40
- - **Type** `Boolean`
41
- - **Default:** `false`
40
+ ### `__experimentalStyles`
42
41
 
43
- Enables displaying previews without an iframe container.
42
+ List of additional editor styles to load into the preview iframe. Each object
43
+ should contain a `css` attribute. See `EditorStyles` for more info.
44
44
 
45
- ### `__experimentalOnClick`
46
-
47
- - **Type** `Function`
48
- - **Default:** `undefined`
45
+ ```jsx
46
+ <BlockPreview
47
+ blocks={ blocks }
48
+ __experimentalStyles={ [
49
+ { css: '.wp-block { margin: 16px; }' },
50
+ ] }
51
+ />
52
+ ```
49
53
 
50
- Use this callback in combination with `__experimentalLive`. The callback is attached to the preview container element.
54
+ - **Type** `Int`
55
+ - **Default** `[]`
@@ -25,7 +25,12 @@ function ScaledBlockPreview( {
25
25
  containerWidth,
26
26
  __experimentalPadding,
27
27
  __experimentalMinHeight,
28
+ __experimentalStyles,
28
29
  } ) {
30
+ if ( ! viewportWidth ) {
31
+ viewportWidth = containerWidth;
32
+ }
33
+
29
34
  const [ contentResizeListener, { height: contentHeight } ] =
30
35
  useResizeObserver();
31
36
  const { styles, assets, duotone } = useSelect( ( select ) => {
@@ -42,6 +47,7 @@ function ScaledBlockPreview( {
42
47
  if ( styles ) {
43
48
  return [
44
49
  ...styles,
50
+ ...__experimentalStyles,
45
51
  {
46
52
  css: 'body{height:auto;overflow:hidden;}',
47
53
  __unstableType: 'presets',
@@ -50,7 +56,7 @@ function ScaledBlockPreview( {
50
56
  }
51
57
 
52
58
  return styles;
53
- }, [ styles ] );
59
+ }, [ styles, __experimentalStyles ] );
54
60
 
55
61
  const svgFilters = useMemo( () => {
56
62
  return [ ...( duotone?.default ?? [] ), ...( duotone?.theme ?? [] ) ];
@@ -0,0 +1,4 @@
1
+ // Hide inserter from previews.
2
+ .block-editor-block-preview__content-iframe .block-list-appender {
3
+ display: none;
4
+ }
@@ -14,7 +14,6 @@ import { memo, useMemo } from '@wordpress/element';
14
14
  * Internal dependencies
15
15
  */
16
16
  import BlockEditorProvider from '../provider';
17
- import LiveBlockPreview from './live';
18
17
  import AutoHeightBlockPreview from './auto';
19
18
  import { store as blockEditorStore } from '../../store';
20
19
  import { BlockListItems } from '../block-list';
@@ -23,9 +22,8 @@ export function BlockPreview( {
23
22
  blocks,
24
23
  __experimentalPadding = 0,
25
24
  viewportWidth = 1200,
26
- __experimentalLive = false,
27
- __experimentalOnClick,
28
25
  __experimentalMinHeight,
26
+ __experimentalStyles = [],
29
27
  } ) {
30
28
  const originalSettings = useSelect(
31
29
  ( select ) => select( blockEditorStore ).getSettings(),
@@ -44,15 +42,12 @@ export function BlockPreview( {
44
42
  }
45
43
  return (
46
44
  <BlockEditorProvider value={ renderedBlocks } settings={ settings }>
47
- { __experimentalLive ? (
48
- <LiveBlockPreview onClick={ __experimentalOnClick } />
49
- ) : (
50
- <AutoHeightBlockPreview
51
- viewportWidth={ viewportWidth }
52
- __experimentalPadding={ __experimentalPadding }
53
- __experimentalMinHeight={ __experimentalMinHeight }
54
- />
55
- ) }
45
+ <AutoHeightBlockPreview
46
+ viewportWidth={ viewportWidth }
47
+ __experimentalPadding={ __experimentalPadding }
48
+ __experimentalMinHeight={ __experimentalMinHeight }
49
+ __experimentalStyles={ __experimentalStyles }
50
+ />
56
51
  </BlockEditorProvider>
57
52
  );
58
53
  }
@@ -29,19 +29,12 @@
29
29
  min-height: auto;
30
30
 
31
31
  .block-editor-block-list__insertion-point,
32
- .block-editor-block-drop-zone,
33
- .reusable-block-indicator,
34
32
  .block-list-appender {
35
33
  display: none;
36
34
  }
37
35
  }
38
36
  }
39
37
 
40
- // Hide inserter from previews.
41
- .block-editor-block-preview__content-iframe .block-list-appender {
42
- display: none;
43
- }
44
-
45
38
  .block-editor-block-preview__live-content {
46
39
  * {
47
40
  pointer-events: none;
@@ -17,36 +17,6 @@ import {
17
17
  */
18
18
  import { useBlockPreview } from '../';
19
19
 
20
- jest.mock( '@wordpress/dom', () => {
21
- const focus = jest.requireActual( '../../../../../dom/src' ).focus;
22
-
23
- return {
24
- focus: {
25
- ...focus,
26
- focusable: {
27
- ...focus.focusable,
28
- find( context ) {
29
- // In JSDOM, all elements have zero'd widths and height.
30
- // This is a metric for focusable's `isVisible`, so find
31
- // and apply an arbitrary non-zero width.
32
- Array.from( context.querySelectorAll( '*' ) ).forEach(
33
- ( element ) => {
34
- Object.defineProperties( element, {
35
- offsetWidth: {
36
- get: () => 1,
37
- configurable: true,
38
- },
39
- } );
40
- }
41
- );
42
-
43
- return focus.focusable.find( ...arguments );
44
- },
45
- },
46
- },
47
- };
48
- } );
49
-
50
20
  jest.useRealTimers();
51
21
 
52
22
  describe( 'useBlockPreview', () => {
@@ -78,14 +48,19 @@ describe( 'useBlockPreview', () => {
78
48
  blocks,
79
49
  props: { className },
80
50
  } );
81
- return <div { ...blockPreviewProps } />;
51
+ return (
52
+ <div
53
+ { ...blockPreviewProps }
54
+ data-testid="block-preview-component"
55
+ />
56
+ );
82
57
  }
83
58
 
84
59
  it( 'will render a block preview with minimal nesting', async () => {
85
60
  const blocks = [];
86
61
  blocks.push( createBlock( 'core/test-block' ) );
87
62
 
88
- const { container } = render(
63
+ render(
89
64
  <BlockPreviewComponent
90
65
  className="test-container-classname"
91
66
  blocks={ blocks }
@@ -99,12 +74,20 @@ describe( 'useBlockPreview', () => {
99
74
  );
100
75
  expect( previewedBlockContents ).toBeInTheDocument();
101
76
 
77
+ const blockPreviewComponent = screen.getByTestId(
78
+ 'block-preview-component'
79
+ );
80
+
102
81
  // Ensure the block preview class names are merged with the component's class name.
103
- expect( container.firstChild.className ).toBe(
104
- 'test-container-classname block-editor-block-preview__live-content components-disabled'
82
+ expect( blockPreviewComponent ).toHaveClass(
83
+ 'block-editor-block-preview__live-content'
84
+ );
85
+ expect( blockPreviewComponent ).toHaveClass(
86
+ 'test-container-classname'
105
87
  );
88
+ expect( blockPreviewComponent ).toHaveClass( 'components-disabled' );
106
89
 
107
90
  // Ensure there is no nesting between the parent component and rendered blocks.
108
- expect( container.firstChild.firstChild ).toBe( previewedBlock );
91
+ expect( blockPreviewComponent ).toContainElement( previewedBlock );
109
92
  } );
110
93
  } );
@@ -43,12 +43,12 @@ describe( 'BlockSelectionClearer component', () => {
43
43
  } ) );
44
44
 
45
45
  render(
46
- <BlockSelectionClearer>
46
+ <BlockSelectionClearer data-testid="selection-clearer">
47
47
  <button>Not a block</button>
48
48
  </BlockSelectionClearer>
49
49
  );
50
- const button = screen.getByRole( 'button' );
51
- fireEvent.mouseDown( button.parentElement );
50
+
51
+ fireEvent.mouseDown( screen.getByTestId( 'selection-clearer' ) );
52
52
 
53
53
  expect( mockClearSelectedBlock ).toBeCalled();
54
54
  } );
@@ -64,12 +64,12 @@ describe( 'BlockSelectionClearer component', () => {
64
64
  } ) );
65
65
 
66
66
  render(
67
- <BlockSelectionClearer>
67
+ <BlockSelectionClearer data-testid="selection-clearer">
68
68
  <button>Not a block</button>
69
69
  </BlockSelectionClearer>
70
70
  );
71
- const button = screen.getByRole( 'button' );
72
- fireEvent.mouseDown( button.parentElement );
71
+
72
+ fireEvent.mouseDown( screen.getByTestId( 'selection-clearer' ) );
73
73
 
74
74
  expect( mockClearSelectedBlock ).toBeCalled();
75
75
  } );
@@ -82,12 +82,12 @@ describe( 'BlockSelectionClearer component', () => {
82
82
  } ) );
83
83
 
84
84
  render(
85
- <BlockSelectionClearer>
85
+ <BlockSelectionClearer data-testid="selection-clearer">
86
86
  <button>Not a block</button>
87
87
  </BlockSelectionClearer>
88
88
  );
89
- const button = screen.getByRole( 'button' );
90
- fireEvent.mouseDown( button.parentElement );
89
+
90
+ fireEvent.mouseDown( screen.getByTestId( 'selection-clearer' ) );
91
91
 
92
92
  expect( mockClearSelectedBlock ).not.toBeCalled();
93
93
  } );
@@ -106,12 +106,12 @@ describe( 'BlockSelectionClearer component', () => {
106
106
  } ) );
107
107
 
108
108
  render(
109
- <BlockSelectionClearer>
109
+ <BlockSelectionClearer data-testid="selection-clearer">
110
110
  <button>Not a block</button>
111
111
  </BlockSelectionClearer>
112
112
  );
113
- const button = screen.getByRole( 'button' );
114
- fireEvent.mouseDown( button.parentElement );
113
+
114
+ fireEvent.mouseDown( screen.getByTestId( 'selection-clearer' ) );
115
115
 
116
116
  expect( mockClearSelectedBlock ).not.toBeCalled();
117
117
  } );
@@ -189,6 +189,11 @@ export function BlockSettingsDropdown( {
189
189
  },
190
190
  } );
191
191
 
192
+ // This can occur when the selected block (the parent)
193
+ // displays child blocks within a List View.
194
+ const parentBlockIsSelected =
195
+ selectedBlockClientIds?.includes( firstParentClientId );
196
+
192
197
  return (
193
198
  <BlockActions
194
199
  clientIds={ clientIds }
@@ -221,26 +226,33 @@ export function BlockSettingsDropdown( {
221
226
  <__unstableBlockSettingsMenuFirstItem.Slot
222
227
  fillProps={ { onClose } }
223
228
  />
224
- { !! firstParentClientId && (
225
- <MenuItem
226
- { ...showParentOutlineGestures }
227
- ref={ selectParentButtonRef }
228
- icon={
229
- <BlockIcon
230
- icon={ parentBlockType.icon }
231
- />
232
- }
233
- onClick={ () =>
234
- selectBlock( firstParentClientId )
235
- }
236
- >
237
- { sprintf(
238
- /* translators: %s: Name of the block's parent. */
239
- __( 'Select parent block (%s)' ),
240
- parentBlockType.title
241
- ) }
242
- </MenuItem>
243
- ) }
229
+ { ! parentBlockIsSelected &&
230
+ !! firstParentClientId && (
231
+ <MenuItem
232
+ { ...showParentOutlineGestures }
233
+ ref={ selectParentButtonRef }
234
+ icon={
235
+ <BlockIcon
236
+ icon={
237
+ parentBlockType.icon
238
+ }
239
+ />
240
+ }
241
+ onClick={ () =>
242
+ selectBlock(
243
+ firstParentClientId
244
+ )
245
+ }
246
+ >
247
+ { sprintf(
248
+ /* translators: %s: Name of the block's parent. */
249
+ __(
250
+ 'Select parent block (%s)'
251
+ ),
252
+ parentBlockType.title
253
+ ) }
254
+ </MenuItem>
255
+ ) }
244
256
  { count === 1 && (
245
257
  <BlockHTMLConvertButton
246
258
  clientId={ firstBlockClientId }
@@ -15,6 +15,7 @@ import { copy } from '@wordpress/icons';
15
15
  * Internal dependencies
16
16
  */
17
17
  import { BlockSwitcher, BlockSwitcherDropdownMenu } from '../';
18
+ import { act } from 'react-test-renderer';
18
19
 
19
20
  jest.mock( '@wordpress/data/src/components/use-select', () => jest.fn() );
20
21
  jest.mock( '../../block-title/use-block-display-title', () =>
@@ -210,6 +211,7 @@ describe( 'BlockSwitcherDropdownMenu', () => {
210
211
  } ),
211
212
  '[ArrowDown]'
212
213
  );
214
+ await act( () => Promise.resolve() );
213
215
 
214
216
  expect(
215
217
  screen.getByRole( 'button', {
@@ -252,6 +254,7 @@ describe( 'BlockSwitcherDropdownMenu', () => {
252
254
  expanded: false,
253
255
  } )
254
256
  );
257
+ await act( () => Promise.resolve() );
255
258
 
256
259
  expect(
257
260
  screen.getByRole( 'button', {
@@ -282,6 +285,7 @@ describe( 'BlockSwitcherDropdownMenu', () => {
282
285
  expanded: false,
283
286
  } )
284
287
  );
288
+ await act( () => Promise.resolve() );
285
289
 
286
290
  expect(
287
291
  within(
@@ -9,7 +9,12 @@ import classnames from 'classnames';
9
9
  import { useSelect, useDispatch } from '@wordpress/data';
10
10
  import { useRef } from '@wordpress/element';
11
11
  import { useViewportMatch } from '@wordpress/compose';
12
- import { getBlockType, hasBlockSupport } from '@wordpress/blocks';
12
+ import {
13
+ getBlockType,
14
+ hasBlockSupport,
15
+ isReusableBlock,
16
+ isTemplatePart,
17
+ } from '@wordpress/blocks';
13
18
  import { ToolbarGroup } from '@wordpress/components';
14
19
 
15
20
  /**
@@ -109,11 +114,13 @@ const BlockToolbar = ( { hideDragHandle } ) => {
109
114
 
110
115
  const shouldShowVisualToolbar = isValid && isVisual;
111
116
  const isMultiToolbar = blockClientIds.length > 1;
117
+ const isSynced =
118
+ isReusableBlock( blockType ) || isTemplatePart( blockType );
112
119
 
113
- const classes = classnames(
114
- 'block-editor-block-toolbar',
115
- shouldShowMovers && 'is-showing-movers'
116
- );
120
+ const classes = classnames( 'block-editor-block-toolbar', {
121
+ 'is-showing-movers': shouldShowMovers,
122
+ 'is-synced': isSynced,
123
+ } );
117
124
 
118
125
  return (
119
126
  <div className={ classes }>
@@ -39,6 +39,16 @@
39
39
  border-right: $border-width solid $gray-300;
40
40
  }
41
41
 
42
+ &.is-synced .block-editor-block-switcher .components-button .block-editor-block-icon {
43
+ color: var(--wp-block-synced-color);
44
+ }
45
+
46
+ &.is-synced .components-toolbar-button.block-editor-block-switcher__no-switcher-icon {
47
+ &:disabled .block-editor-block-icon.has-colors {
48
+ color: var(--wp-block-synced-color);
49
+ }
50
+ }
51
+
42
52
  > :last-child,
43
53
  > :last-child .components-toolbar-group,
44
54
  > :last-child .components-toolbar {