@wordpress/block-editor 12.24.0 → 12.25.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 (510) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +1 -1
  3. package/build/components/alignment-control/ui.js +3 -1
  4. package/build/components/alignment-control/ui.js.map +1 -1
  5. package/build/components/block-inspector/index.js +1 -1
  6. package/build/components/block-inspector/index.js.map +1 -1
  7. package/build/components/block-list/block.js +0 -9
  8. package/build/components/block-list/block.js.map +1 -1
  9. package/build/components/block-list/index.js +4 -3
  10. package/build/components/block-list/index.js.map +1 -1
  11. package/build/components/block-list/index.native.js +1 -9
  12. package/build/components/block-list/index.native.js.map +1 -1
  13. package/build/components/block-list/use-block-props/index.js +6 -6
  14. package/build/components/block-list/use-block-props/index.js.map +1 -1
  15. package/build/components/block-list/use-block-props/use-block-refs.js +17 -46
  16. package/build/components/block-list/use-block-props/use-block-refs.js.map +1 -1
  17. package/build/components/block-list/use-block-props/use-is-hovered.js +10 -14
  18. package/build/components/block-list/use-block-props/use-is-hovered.js.map +1 -1
  19. package/build/components/block-mover/index.native.js +3 -1
  20. package/build/components/block-mover/index.native.js.map +1 -1
  21. package/build/components/block-settings-menu/block-settings-dropdown.js +0 -25
  22. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  23. package/build/components/block-switcher/pattern-transformations-menu.js +3 -1
  24. package/build/components/block-switcher/pattern-transformations-menu.js.map +1 -1
  25. package/build/components/block-switcher/use-transformed-patterns.js +6 -2
  26. package/build/components/block-switcher/use-transformed-patterns.js.map +1 -1
  27. package/build/components/block-switcher/utils.js +15 -5
  28. package/build/components/block-switcher/utils.js.map +1 -1
  29. package/build/components/block-toolbar/use-has-block-toolbar.js +14 -9
  30. package/build/components/block-toolbar/use-has-block-toolbar.js.map +1 -1
  31. package/build/components/block-tools/index.js +3 -1
  32. package/build/components/block-tools/index.js.map +1 -1
  33. package/build/components/block-tools/use-show-block-tools.js +2 -5
  34. package/build/components/block-tools/use-show-block-tools.js.map +1 -1
  35. package/build/components/block-tools/zoom-out-mode-inserters.js +5 -1
  36. package/build/components/block-tools/zoom-out-mode-inserters.js.map +1 -1
  37. package/build/components/block-variation-picker/index.js +3 -2
  38. package/build/components/block-variation-picker/index.js.map +1 -1
  39. package/build/components/block-variation-transforms/index.js +3 -1
  40. package/build/components/block-variation-transforms/index.js.map +1 -1
  41. package/build/components/floating-toolbar/index.native.js +9 -5
  42. package/build/components/floating-toolbar/index.native.js.map +1 -1
  43. package/build/components/global-styles/background-panel.js +1 -1
  44. package/build/components/global-styles/background-panel.js.map +1 -1
  45. package/build/components/global-styles/color-panel.js +3 -1
  46. package/build/components/global-styles/color-panel.js.map +1 -1
  47. package/build/components/global-styles/dimensions-panel.js +16 -0
  48. package/build/components/global-styles/dimensions-panel.js.map +1 -1
  49. package/build/components/global-styles/hooks.js +3 -2
  50. package/build/components/global-styles/hooks.js.map +1 -1
  51. package/build/components/global-styles/typography-panel.js +23 -23
  52. package/build/components/global-styles/typography-panel.js.map +1 -1
  53. package/build/components/global-styles/use-global-styles-output.js +149 -132
  54. package/build/components/global-styles/use-global-styles-output.js.map +1 -1
  55. package/build/components/global-styles/utils.js +45 -0
  56. package/build/components/global-styles/utils.js.map +1 -1
  57. package/build/components/inner-blocks/index.js +16 -2
  58. package/build/components/inner-blocks/index.js.map +1 -1
  59. package/build/components/inserter/block-patterns-tab/index.js +12 -31
  60. package/build/components/inserter/block-patterns-tab/index.js.map +1 -1
  61. package/build/components/inserter/block-types-tab.js +4 -0
  62. package/build/components/inserter/block-types-tab.js.map +1 -1
  63. package/build/components/inserter/category-tabs/index.js +56 -0
  64. package/build/components/inserter/category-tabs/index.js.map +1 -0
  65. package/build/components/inserter/media-tab/index.js +2 -2
  66. package/build/components/inserter/media-tab/index.js.map +1 -1
  67. package/build/components/inserter/media-tab/media-panel.js +0 -25
  68. package/build/components/inserter/media-tab/media-panel.js.map +1 -1
  69. package/build/components/inserter/media-tab/media-preview.js +13 -3
  70. package/build/components/inserter/media-tab/media-preview.js.map +1 -1
  71. package/build/components/inserter/media-tab/media-tab.js +15 -29
  72. package/build/components/inserter/media-tab/media-tab.js.map +1 -1
  73. package/build/components/inserter/menu.js +59 -69
  74. package/build/components/inserter/menu.js.map +1 -1
  75. package/build/components/inserter/tabs.js +6 -6
  76. package/build/components/inserter/tabs.js.map +1 -1
  77. package/build/components/line-height-control/index.js +6 -2
  78. package/build/components/line-height-control/index.js.map +1 -1
  79. package/build/components/link-control/search-item.js +9 -3
  80. package/build/components/link-control/search-item.js.map +1 -1
  81. package/build/components/list-view/block-select-button.js +5 -170
  82. package/build/components/list-view/block-select-button.js.map +1 -1
  83. package/build/components/list-view/block.js +166 -14
  84. package/build/components/list-view/block.js.map +1 -1
  85. package/build/components/list-view/index.js +1 -1
  86. package/build/components/list-view/index.js.map +1 -1
  87. package/build/components/list-view/use-list-view-drop-zone.js +1 -1
  88. package/build/components/list-view/use-list-view-drop-zone.js.map +1 -1
  89. package/build/components/list-view/utils.js +3 -1
  90. package/build/components/list-view/utils.js.map +1 -1
  91. package/build/components/media-placeholder/index.js +3 -3
  92. package/build/components/media-placeholder/index.js.map +1 -1
  93. package/build/components/navigable-toolbar/index.js +3 -1
  94. package/build/components/navigable-toolbar/index.js.map +1 -1
  95. package/build/components/provider/block-refs-provider.js +3 -4
  96. package/build/components/provider/block-refs-provider.js.map +1 -1
  97. package/build/components/provider/use-block-sync.js +3 -12
  98. package/build/components/provider/use-block-sync.js.map +1 -1
  99. package/build/components/rich-text/event-listeners/before-input-rules.js +93 -0
  100. package/build/components/rich-text/event-listeners/before-input-rules.js.map +1 -0
  101. package/build/components/rich-text/event-listeners/delete.js +58 -0
  102. package/build/components/rich-text/event-listeners/delete.js.map +1 -0
  103. package/build/components/rich-text/event-listeners/enter.js +98 -0
  104. package/build/components/rich-text/event-listeners/enter.js.map +1 -0
  105. package/build/components/rich-text/event-listeners/firefox-compat.js +36 -0
  106. package/build/components/rich-text/event-listeners/firefox-compat.js.map +1 -0
  107. package/build/components/rich-text/event-listeners/index.js +44 -0
  108. package/build/components/rich-text/event-listeners/index.js.map +1 -0
  109. package/build/components/rich-text/event-listeners/input-events.js +22 -0
  110. package/build/components/rich-text/event-listeners/input-events.js.map +1 -0
  111. package/build/components/rich-text/event-listeners/input-rules.js +135 -0
  112. package/build/components/rich-text/event-listeners/input-rules.js.map +1 -0
  113. package/build/components/rich-text/event-listeners/insert-replacement-text.js +33 -0
  114. package/build/components/rich-text/event-listeners/insert-replacement-text.js.map +1 -0
  115. package/build/components/rich-text/event-listeners/paste-handler.js +146 -0
  116. package/build/components/rich-text/event-listeners/paste-handler.js.map +1 -0
  117. package/build/components/rich-text/event-listeners/remove-browser-shortcuts.js +27 -0
  118. package/build/components/rich-text/event-listeners/remove-browser-shortcuts.js.map +1 -0
  119. package/build/components/rich-text/event-listeners/shortcuts.js +22 -0
  120. package/build/components/rich-text/event-listeners/shortcuts.js.map +1 -0
  121. package/build/components/rich-text/event-listeners/undo-automatic-change.js +51 -0
  122. package/build/components/rich-text/event-listeners/undo-automatic-change.js.map +1 -0
  123. package/build/components/rich-text/index.js +11 -31
  124. package/build/components/rich-text/index.js.map +1 -1
  125. package/build/components/rich-text/index.native.js +13 -3
  126. package/build/components/rich-text/index.native.js.map +1 -1
  127. package/build/components/rich-text/multiline.js +6 -2
  128. package/build/components/rich-text/multiline.js.map +1 -1
  129. package/build/components/rich-text/native/index.native.js +12 -0
  130. package/build/components/rich-text/native/index.native.js.map +1 -1
  131. package/build/components/rich-text/use-format-types.js +8 -4
  132. package/build/components/rich-text/use-format-types.js.map +1 -1
  133. package/build/components/segmented-text-control/index.js +62 -0
  134. package/build/components/segmented-text-control/index.js.map +1 -0
  135. package/build/components/spacing-sizes-control/input-controls/spacing-input-control.js +16 -2
  136. package/build/components/spacing-sizes-control/input-controls/spacing-input-control.js.map +1 -1
  137. package/build/components/text-alignment-control/index.js +76 -0
  138. package/build/components/text-alignment-control/index.js.map +1 -0
  139. package/build/components/text-decoration-control/index.js +21 -25
  140. package/build/components/text-decoration-control/index.js.map +1 -1
  141. package/build/components/text-transform-control/index.js +18 -22
  142. package/build/components/text-transform-control/index.js.map +1 -1
  143. package/build/components/use-block-display-information/index.js +9 -3
  144. package/build/components/use-block-display-information/index.js.map +1 -1
  145. package/build/components/use-on-block-drop/index.js +3 -1
  146. package/build/components/use-on-block-drop/index.js.map +1 -1
  147. package/build/components/writing-flow/use-drag-selection.js +3 -1
  148. package/build/components/writing-flow/use-drag-selection.js.map +1 -1
  149. package/build/components/writing-flow/use-tab-nav.js +3 -1
  150. package/build/components/writing-flow/use-tab-nav.js.map +1 -1
  151. package/build/components/writing-mode-control/index.js +16 -20
  152. package/build/components/writing-mode-control/index.js.map +1 -1
  153. package/build/hooks/duotone.js +3 -1
  154. package/build/hooks/duotone.js.map +1 -1
  155. package/build/hooks/utils.js +11 -6
  156. package/build/hooks/utils.js.map +1 -1
  157. package/build/private-apis.js +4 -2
  158. package/build/private-apis.js.map +1 -1
  159. package/build/store/actions.js +32 -8
  160. package/build/store/actions.js.map +1 -1
  161. package/build/store/private-selectors.js +27 -6
  162. package/build/store/private-selectors.js.map +1 -1
  163. package/build/store/reducer.js +11 -8
  164. package/build/store/reducer.js.map +1 -1
  165. package/build/store/selectors.js +21 -7
  166. package/build/store/selectors.js.map +1 -1
  167. package/build/utils/object.js +17 -0
  168. package/build/utils/object.js.map +1 -1
  169. package/build/utils/order-inserter-block-items.js +6 -2
  170. package/build/utils/order-inserter-block-items.js.map +1 -1
  171. package/build/utils/pasting.js +6 -2
  172. package/build/utils/pasting.js.map +1 -1
  173. package/build-module/components/alignment-control/ui.js +3 -1
  174. package/build-module/components/alignment-control/ui.js.map +1 -1
  175. package/build-module/components/block-inspector/index.js +1 -1
  176. package/build-module/components/block-inspector/index.js.map +1 -1
  177. package/build-module/components/block-list/block.js +0 -9
  178. package/build-module/components/block-list/block.js.map +1 -1
  179. package/build-module/components/block-list/index.js +4 -3
  180. package/build-module/components/block-list/index.js.map +1 -1
  181. package/build-module/components/block-list/index.native.js +1 -9
  182. package/build-module/components/block-list/index.native.js.map +1 -1
  183. package/build-module/components/block-list/use-block-props/index.js +6 -6
  184. package/build-module/components/block-list/use-block-props/index.js.map +1 -1
  185. package/build-module/components/block-list/use-block-props/use-block-refs.js +19 -48
  186. package/build-module/components/block-list/use-block-props/use-block-refs.js.map +1 -1
  187. package/build-module/components/block-list/use-block-props/use-is-hovered.js +10 -14
  188. package/build-module/components/block-list/use-block-props/use-is-hovered.js.map +1 -1
  189. package/build-module/components/block-mover/index.native.js +3 -1
  190. package/build-module/components/block-mover/index.native.js.map +1 -1
  191. package/build-module/components/block-settings-menu/block-settings-dropdown.js +1 -26
  192. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  193. package/build-module/components/block-switcher/pattern-transformations-menu.js +3 -1
  194. package/build-module/components/block-switcher/pattern-transformations-menu.js.map +1 -1
  195. package/build-module/components/block-switcher/use-transformed-patterns.js +6 -2
  196. package/build-module/components/block-switcher/use-transformed-patterns.js.map +1 -1
  197. package/build-module/components/block-switcher/utils.js +15 -5
  198. package/build-module/components/block-switcher/utils.js.map +1 -1
  199. package/build-module/components/block-toolbar/use-has-block-toolbar.js +14 -9
  200. package/build-module/components/block-toolbar/use-has-block-toolbar.js.map +1 -1
  201. package/build-module/components/block-tools/index.js +3 -1
  202. package/build-module/components/block-tools/index.js.map +1 -1
  203. package/build-module/components/block-tools/use-show-block-tools.js +2 -5
  204. package/build-module/components/block-tools/use-show-block-tools.js.map +1 -1
  205. package/build-module/components/block-tools/zoom-out-mode-inserters.js +5 -1
  206. package/build-module/components/block-tools/zoom-out-mode-inserters.js.map +1 -1
  207. package/build-module/components/block-variation-picker/index.js +3 -2
  208. package/build-module/components/block-variation-picker/index.js.map +1 -1
  209. package/build-module/components/block-variation-transforms/index.js +3 -1
  210. package/build-module/components/block-variation-transforms/index.js.map +1 -1
  211. package/build-module/components/floating-toolbar/index.native.js +9 -5
  212. package/build-module/components/floating-toolbar/index.native.js.map +1 -1
  213. package/build-module/components/global-styles/background-panel.js +1 -1
  214. package/build-module/components/global-styles/background-panel.js.map +1 -1
  215. package/build-module/components/global-styles/color-panel.js +3 -1
  216. package/build-module/components/global-styles/color-panel.js.map +1 -1
  217. package/build-module/components/global-styles/dimensions-panel.js +17 -1
  218. package/build-module/components/global-styles/dimensions-panel.js.map +1 -1
  219. package/build-module/components/global-styles/hooks.js +3 -2
  220. package/build-module/components/global-styles/hooks.js.map +1 -1
  221. package/build-module/components/global-styles/typography-panel.js +24 -24
  222. package/build-module/components/global-styles/typography-panel.js.map +1 -1
  223. package/build-module/components/global-styles/use-global-styles-output.js +149 -132
  224. package/build-module/components/global-styles/use-global-styles-output.js.map +1 -1
  225. package/build-module/components/global-styles/utils.js +44 -0
  226. package/build-module/components/global-styles/utils.js.map +1 -1
  227. package/build-module/components/inner-blocks/index.js +16 -2
  228. package/build-module/components/inner-blocks/index.js.map +1 -1
  229. package/build-module/components/inserter/block-patterns-tab/index.js +13 -32
  230. package/build-module/components/inserter/block-patterns-tab/index.js.map +1 -1
  231. package/build-module/components/inserter/block-types-tab.js +4 -0
  232. package/build-module/components/inserter/block-types-tab.js.map +1 -1
  233. package/build-module/components/inserter/category-tabs/index.js +49 -0
  234. package/build-module/components/inserter/category-tabs/index.js.map +1 -0
  235. package/build-module/components/inserter/media-tab/index.js +1 -1
  236. package/build-module/components/inserter/media-tab/index.js.map +1 -1
  237. package/build-module/components/inserter/media-tab/media-panel.js +0 -24
  238. package/build-module/components/inserter/media-tab/media-panel.js.map +1 -1
  239. package/build-module/components/inserter/media-tab/media-preview.js +13 -3
  240. package/build-module/components/inserter/media-tab/media-preview.js.map +1 -1
  241. package/build-module/components/inserter/media-tab/media-tab.js +17 -31
  242. package/build-module/components/inserter/media-tab/media-tab.js.map +1 -1
  243. package/build-module/components/inserter/menu.js +61 -71
  244. package/build-module/components/inserter/menu.js.map +1 -1
  245. package/build-module/components/inserter/tabs.js +6 -6
  246. package/build-module/components/inserter/tabs.js.map +1 -1
  247. package/build-module/components/line-height-control/index.js +6 -2
  248. package/build-module/components/line-height-control/index.js.map +1 -1
  249. package/build-module/components/link-control/search-item.js +9 -3
  250. package/build-module/components/link-control/search-item.js.map +1 -1
  251. package/build-module/components/list-view/block-select-button.js +7 -172
  252. package/build-module/components/list-view/block-select-button.js.map +1 -1
  253. package/build-module/components/list-view/block.js +167 -15
  254. package/build-module/components/list-view/block.js.map +1 -1
  255. package/build-module/components/list-view/index.js +1 -1
  256. package/build-module/components/list-view/index.js.map +1 -1
  257. package/build-module/components/list-view/use-list-view-drop-zone.js +1 -1
  258. package/build-module/components/list-view/use-list-view-drop-zone.js.map +1 -1
  259. package/build-module/components/list-view/utils.js +3 -1
  260. package/build-module/components/list-view/utils.js.map +1 -1
  261. package/build-module/components/media-placeholder/index.js +3 -3
  262. package/build-module/components/media-placeholder/index.js.map +1 -1
  263. package/build-module/components/navigable-toolbar/index.js +3 -1
  264. package/build-module/components/navigable-toolbar/index.js.map +1 -1
  265. package/build-module/components/provider/block-refs-provider.js +3 -4
  266. package/build-module/components/provider/block-refs-provider.js.map +1 -1
  267. package/build-module/components/provider/use-block-sync.js +4 -13
  268. package/build-module/components/provider/use-block-sync.js.map +1 -1
  269. package/build-module/components/rich-text/event-listeners/before-input-rules.js +86 -0
  270. package/build-module/components/rich-text/event-listeners/before-input-rules.js.map +1 -0
  271. package/build-module/components/rich-text/event-listeners/delete.js +51 -0
  272. package/build-module/components/rich-text/event-listeners/delete.js.map +1 -0
  273. package/build-module/components/rich-text/event-listeners/enter.js +92 -0
  274. package/build-module/components/rich-text/event-listeners/enter.js.map +1 -0
  275. package/build-module/components/rich-text/event-listeners/firefox-compat.js +29 -0
  276. package/build-module/components/rich-text/event-listeners/firefox-compat.js.map +1 -0
  277. package/build-module/components/rich-text/event-listeners/index.js +36 -0
  278. package/build-module/components/rich-text/event-listeners/index.js.map +1 -0
  279. package/build-module/components/rich-text/event-listeners/input-events.js +15 -0
  280. package/build-module/components/rich-text/event-listeners/input-events.js.map +1 -0
  281. package/build-module/components/rich-text/event-listeners/input-rules.js +127 -0
  282. package/build-module/components/rich-text/event-listeners/input-rules.js.map +1 -0
  283. package/build-module/components/rich-text/event-listeners/insert-replacement-text.js +27 -0
  284. package/build-module/components/rich-text/event-listeners/insert-replacement-text.js.map +1 -0
  285. package/build-module/components/rich-text/event-listeners/paste-handler.js +142 -0
  286. package/build-module/components/rich-text/event-listeners/paste-handler.js.map +1 -0
  287. package/build-module/components/rich-text/event-listeners/remove-browser-shortcuts.js +21 -0
  288. package/build-module/components/rich-text/event-listeners/remove-browser-shortcuts.js.map +1 -0
  289. package/build-module/components/rich-text/event-listeners/shortcuts.js +15 -0
  290. package/build-module/components/rich-text/event-listeners/shortcuts.js.map +1 -0
  291. package/build-module/components/rich-text/event-listeners/undo-automatic-change.js +45 -0
  292. package/build-module/components/rich-text/event-listeners/undo-automatic-change.js.map +1 -0
  293. package/build-module/components/rich-text/index.js +12 -32
  294. package/build-module/components/rich-text/index.js.map +1 -1
  295. package/build-module/components/rich-text/index.native.js +13 -3
  296. package/build-module/components/rich-text/index.native.js.map +1 -1
  297. package/build-module/components/rich-text/multiline.js +6 -2
  298. package/build-module/components/rich-text/multiline.js.map +1 -1
  299. package/build-module/components/rich-text/native/index.native.js +12 -0
  300. package/build-module/components/rich-text/native/index.native.js.map +1 -1
  301. package/build-module/components/rich-text/use-format-types.js +8 -4
  302. package/build-module/components/rich-text/use-format-types.js.map +1 -1
  303. package/build-module/components/segmented-text-control/index.js +55 -0
  304. package/build-module/components/segmented-text-control/index.js.map +1 -0
  305. package/build-module/components/spacing-sizes-control/input-controls/spacing-input-control.js +16 -2
  306. package/build-module/components/spacing-sizes-control/input-controls/spacing-input-control.js.map +1 -1
  307. package/build-module/components/text-alignment-control/index.js +68 -0
  308. package/build-module/components/text-alignment-control/index.js.map +1 -0
  309. package/build-module/components/text-decoration-control/index.js +21 -25
  310. package/build-module/components/text-decoration-control/index.js.map +1 -1
  311. package/build-module/components/text-transform-control/index.js +18 -22
  312. package/build-module/components/text-transform-control/index.js.map +1 -1
  313. package/build-module/components/use-block-display-information/index.js +9 -3
  314. package/build-module/components/use-block-display-information/index.js.map +1 -1
  315. package/build-module/components/use-on-block-drop/index.js +3 -1
  316. package/build-module/components/use-on-block-drop/index.js.map +1 -1
  317. package/build-module/components/writing-flow/use-drag-selection.js +3 -1
  318. package/build-module/components/writing-flow/use-drag-selection.js.map +1 -1
  319. package/build-module/components/writing-flow/use-tab-nav.js +3 -1
  320. package/build-module/components/writing-flow/use-tab-nav.js.map +1 -1
  321. package/build-module/components/writing-mode-control/index.js +16 -20
  322. package/build-module/components/writing-mode-control/index.js.map +1 -1
  323. package/build-module/hooks/duotone.js +3 -1
  324. package/build-module/hooks/duotone.js.map +1 -1
  325. package/build-module/hooks/utils.js +11 -6
  326. package/build-module/hooks/utils.js.map +1 -1
  327. package/build-module/private-apis.js +4 -2
  328. package/build-module/private-apis.js.map +1 -1
  329. package/build-module/store/actions.js +32 -8
  330. package/build-module/store/actions.js.map +1 -1
  331. package/build-module/store/private-selectors.js +27 -5
  332. package/build-module/store/private-selectors.js.map +1 -1
  333. package/build-module/store/reducer.js +11 -8
  334. package/build-module/store/reducer.js.map +1 -1
  335. package/build-module/store/selectors.js +21 -7
  336. package/build-module/store/selectors.js.map +1 -1
  337. package/build-module/utils/object.js +16 -0
  338. package/build-module/utils/object.js.map +1 -1
  339. package/build-module/utils/order-inserter-block-items.js +6 -2
  340. package/build-module/utils/order-inserter-block-items.js.map +1 -1
  341. package/build-module/utils/pasting.js +6 -2
  342. package/build-module/utils/pasting.js.map +1 -1
  343. package/build-style/content-rtl.css +41 -68
  344. package/build-style/content.css +41 -68
  345. package/build-style/style-rtl.css +100 -199
  346. package/build-style/style.css +100 -199
  347. package/package.json +31 -31
  348. package/src/components/alignment-control/ui.js +3 -1
  349. package/src/components/block-bindings-toolbar-indicator/style.scss +1 -4
  350. package/src/components/block-canvas/style.scss +1 -3
  351. package/src/components/block-draggable/test/helpers.native.js +8 -8
  352. package/src/components/block-inspector/index.js +1 -2
  353. package/src/components/block-list/block.js +2 -13
  354. package/src/components/block-list/content.scss +9 -1
  355. package/src/components/block-list/index.js +4 -4
  356. package/src/components/block-list/index.native.js +1 -6
  357. package/src/components/block-list/use-block-props/index.js +12 -4
  358. package/src/components/block-list/use-block-props/use-block-refs.js +17 -57
  359. package/src/components/block-list/use-block-props/use-is-hovered.js +11 -16
  360. package/src/components/block-mover/index.native.js +3 -1
  361. package/src/components/block-patterns-list/style.scss +1 -3
  362. package/src/components/block-preview/style.scss +13 -15
  363. package/src/components/block-settings-menu/block-settings-dropdown.js +1 -51
  364. package/src/components/block-switcher/pattern-transformations-menu.js +3 -1
  365. package/src/components/block-switcher/use-transformed-patterns.js +6 -2
  366. package/src/components/block-switcher/utils.js +14 -5
  367. package/src/components/block-toolbar/style.scss +8 -11
  368. package/src/components/block-toolbar/use-has-block-toolbar.js +21 -16
  369. package/src/components/block-tools/index.js +3 -1
  370. package/src/components/block-tools/use-show-block-tools.js +36 -48
  371. package/src/components/block-tools/zoom-out-mode-inserters.js +5 -1
  372. package/src/components/block-variation-picker/content.scss +22 -72
  373. package/src/components/block-variation-picker/index.js +3 -2
  374. package/src/components/block-variation-transforms/index.js +3 -1
  375. package/src/components/floating-toolbar/index.native.js +5 -2
  376. package/src/components/global-styles/background-panel.js +1 -3
  377. package/src/components/global-styles/color-panel.js +3 -1
  378. package/src/components/global-styles/dimensions-panel.js +18 -1
  379. package/src/components/global-styles/hooks.js +2 -0
  380. package/src/components/global-styles/test/utils.js +21 -0
  381. package/src/components/global-styles/typography-panel.js +27 -23
  382. package/src/components/global-styles/use-global-styles-output.js +211 -187
  383. package/src/components/global-styles/utils.js +55 -0
  384. package/src/components/inner-blocks/index.js +14 -1
  385. package/src/components/inserter/block-patterns-tab/index.js +15 -65
  386. package/src/components/inserter/block-types-tab.js +5 -0
  387. package/src/components/inserter/category-tabs/index.js +74 -0
  388. package/src/components/inserter/media-tab/index.js +1 -1
  389. package/src/components/inserter/media-tab/media-panel.js +0 -22
  390. package/src/components/inserter/media-tab/media-preview.js +15 -7
  391. package/src/components/inserter/media-tab/media-tab.js +44 -83
  392. package/src/components/inserter/menu.js +139 -117
  393. package/src/components/inserter/style.scss +90 -170
  394. package/src/components/inserter/tabs.js +5 -13
  395. package/src/components/line-height-control/index.js +6 -2
  396. package/src/components/link-control/search-item.js +9 -3
  397. package/src/components/list-view/block-select-button.js +73 -266
  398. package/src/components/list-view/block.js +218 -28
  399. package/src/components/list-view/index.js +1 -1
  400. package/src/components/list-view/style.scss +20 -28
  401. package/src/components/list-view/use-list-view-drop-zone.js +1 -1
  402. package/src/components/list-view/utils.js +3 -1
  403. package/src/components/media-placeholder/content.scss +0 -11
  404. package/src/components/media-placeholder/index.js +3 -3
  405. package/src/components/navigable-toolbar/index.js +3 -1
  406. package/src/components/provider/block-refs-provider.js +3 -8
  407. package/src/components/provider/test/use-block-sync.js +7 -0
  408. package/src/components/provider/use-block-sync.js +3 -20
  409. package/src/components/rich-text/event-listeners/before-input-rules.js +92 -0
  410. package/src/components/rich-text/event-listeners/delete.js +53 -0
  411. package/src/components/rich-text/event-listeners/enter.js +104 -0
  412. package/src/components/rich-text/event-listeners/firefox-compat.js +31 -0
  413. package/src/components/rich-text/event-listeners/index.js +56 -0
  414. package/src/components/rich-text/event-listeners/input-events.js +13 -0
  415. package/src/components/rich-text/event-listeners/input-rules.js +146 -0
  416. package/src/components/rich-text/event-listeners/insert-replacement-text.js +28 -0
  417. package/src/components/rich-text/event-listeners/paste-handler.js +169 -0
  418. package/src/components/rich-text/event-listeners/remove-browser-shortcuts.js +24 -0
  419. package/src/components/rich-text/event-listeners/shortcuts.js +13 -0
  420. package/src/components/rich-text/event-listeners/undo-automatic-change.js +45 -0
  421. package/src/components/rich-text/index.js +7 -34
  422. package/src/components/rich-text/index.native.js +11 -0
  423. package/src/components/rich-text/multiline.js +6 -2
  424. package/src/components/rich-text/native/index.native.js +11 -0
  425. package/src/components/rich-text/use-format-types.js +6 -2
  426. package/src/components/segmented-text-control/index.js +63 -0
  427. package/src/components/{writing-mode-control → segmented-text-control}/style.scss +2 -5
  428. package/src/components/spacing-sizes-control/input-controls/spacing-input-control.js +16 -1
  429. package/src/components/text-alignment-control/index.js +91 -0
  430. package/src/components/text-alignment-control/stories/index.story.js +39 -0
  431. package/src/components/text-decoration-control/index.js +20 -33
  432. package/src/components/text-transform-control/index.js +17 -30
  433. package/src/components/use-block-display-information/index.js +9 -3
  434. package/src/components/use-on-block-drop/index.js +3 -1
  435. package/src/components/writing-flow/use-drag-selection.js +3 -1
  436. package/src/components/writing-flow/use-tab-nav.js +3 -1
  437. package/src/components/writing-mode-control/index.js +15 -28
  438. package/src/hooks/duotone.js +3 -1
  439. package/src/hooks/utils.js +16 -2
  440. package/src/private-apis.js +4 -2
  441. package/src/store/actions.js +36 -12
  442. package/src/store/private-selectors.js +28 -4
  443. package/src/store/reducer.js +13 -23
  444. package/src/store/selectors.js +20 -7
  445. package/src/style.scss +1 -2
  446. package/src/utils/object.js +16 -0
  447. package/src/utils/order-inserter-block-items.js +6 -2
  448. package/src/utils/pasting.js +6 -2
  449. package/build/components/block-list/use-block-props/use-block-moving-mode-class-names.js +0 -54
  450. package/build/components/block-list/use-block-props/use-block-moving-mode-class-names.js.map +0 -1
  451. package/build/components/rich-text/use-before-input-rules.js +0 -98
  452. package/build/components/rich-text/use-before-input-rules.js.map +0 -1
  453. package/build/components/rich-text/use-delete.js +0 -64
  454. package/build/components/rich-text/use-delete.js.map +0 -1
  455. package/build/components/rich-text/use-enter.js +0 -109
  456. package/build/components/rich-text/use-enter.js.map +0 -1
  457. package/build/components/rich-text/use-firefox-compat.js +0 -44
  458. package/build/components/rich-text/use-firefox-compat.js.map +0 -1
  459. package/build/components/rich-text/use-input-events.js +0 -25
  460. package/build/components/rich-text/use-input-events.js.map +0 -1
  461. package/build/components/rich-text/use-input-rules.js +0 -139
  462. package/build/components/rich-text/use-input-rules.js.map +0 -1
  463. package/build/components/rich-text/use-insert-replacement-text.js +0 -38
  464. package/build/components/rich-text/use-insert-replacement-text.js.map +0 -1
  465. package/build/components/rich-text/use-paste-handler.js +0 -158
  466. package/build/components/rich-text/use-paste-handler.js.map +0 -1
  467. package/build/components/rich-text/use-remove-browser-shortcuts.js +0 -32
  468. package/build/components/rich-text/use-remove-browser-shortcuts.js.map +0 -1
  469. package/build/components/rich-text/use-shortcuts.js +0 -25
  470. package/build/components/rich-text/use-shortcuts.js.map +0 -1
  471. package/build/components/rich-text/use-undo-automatic-change.js +0 -53
  472. package/build/components/rich-text/use-undo-automatic-change.js.map +0 -1
  473. package/build-module/components/block-list/use-block-props/use-block-moving-mode-class-names.js +0 -47
  474. package/build-module/components/block-list/use-block-props/use-block-moving-mode-class-names.js.map +0 -1
  475. package/build-module/components/rich-text/use-before-input-rules.js +0 -92
  476. package/build-module/components/rich-text/use-before-input-rules.js.map +0 -1
  477. package/build-module/components/rich-text/use-delete.js +0 -57
  478. package/build-module/components/rich-text/use-delete.js.map +0 -1
  479. package/build-module/components/rich-text/use-enter.js +0 -102
  480. package/build-module/components/rich-text/use-enter.js.map +0 -1
  481. package/build-module/components/rich-text/use-firefox-compat.js +0 -37
  482. package/build-module/components/rich-text/use-firefox-compat.js.map +0 -1
  483. package/build-module/components/rich-text/use-input-events.js +0 -18
  484. package/build-module/components/rich-text/use-input-events.js.map +0 -1
  485. package/build-module/components/rich-text/use-input-rules.js +0 -132
  486. package/build-module/components/rich-text/use-input-rules.js.map +0 -1
  487. package/build-module/components/rich-text/use-insert-replacement-text.js +0 -32
  488. package/build-module/components/rich-text/use-insert-replacement-text.js.map +0 -1
  489. package/build-module/components/rich-text/use-paste-handler.js +0 -152
  490. package/build-module/components/rich-text/use-paste-handler.js.map +0 -1
  491. package/build-module/components/rich-text/use-remove-browser-shortcuts.js +0 -26
  492. package/build-module/components/rich-text/use-remove-browser-shortcuts.js.map +0 -1
  493. package/build-module/components/rich-text/use-shortcuts.js +0 -18
  494. package/build-module/components/rich-text/use-shortcuts.js.map +0 -1
  495. package/build-module/components/rich-text/use-undo-automatic-change.js +0 -46
  496. package/build-module/components/rich-text/use-undo-automatic-change.js.map +0 -1
  497. package/src/components/block-list/use-block-props/use-block-moving-mode-class-names.js +0 -55
  498. package/src/components/rich-text/use-before-input-rules.js +0 -99
  499. package/src/components/rich-text/use-delete.js +0 -59
  500. package/src/components/rich-text/use-enter.js +0 -110
  501. package/src/components/rich-text/use-firefox-compat.js +0 -39
  502. package/src/components/rich-text/use-input-events.js +0 -19
  503. package/src/components/rich-text/use-input-rules.js +0 -150
  504. package/src/components/rich-text/use-insert-replacement-text.js +0 -31
  505. package/src/components/rich-text/use-paste-handler.js +0 -180
  506. package/src/components/rich-text/use-remove-browser-shortcuts.js +0 -29
  507. package/src/components/rich-text/use-shortcuts.js +0 -19
  508. package/src/components/rich-text/use-undo-automatic-change.js +0 -46
  509. package/src/components/text-decoration-control/style.scss +0 -18
  510. package/src/components/text-transform-control/style.scss +0 -18
@@ -6,7 +6,6 @@ import classnames from 'classnames';
6
6
  /**
7
7
  * WordPress dependencies
8
8
  */
9
- import { hasBlockSupport } from '@wordpress/blocks';
10
9
  import {
11
10
  Button,
12
11
  __experimentalHStack as HStack,
@@ -15,11 +14,8 @@ import {
15
14
  } from '@wordpress/components';
16
15
  import { forwardRef } from '@wordpress/element';
17
16
  import { Icon, lockSmall as lock, pinSmall } from '@wordpress/icons';
18
- import { SPACE, ENTER, BACKSPACE, DELETE } from '@wordpress/keycodes';
19
- import { useSelect, useDispatch } from '@wordpress/data';
20
- import { __unstableUseShortcutEventMatch as useShortcutEventMatch } from '@wordpress/keyboard-shortcuts';
17
+ import { SPACE, ENTER } from '@wordpress/keycodes';
21
18
  import { __, sprintf } from '@wordpress/i18n';
22
- import isShallowEqual from '@wordpress/is-shallow-equal';
23
19
 
24
20
  /**
25
21
  * Internal dependencies
@@ -29,9 +25,7 @@ import useBlockDisplayInformation from '../use-block-display-information';
29
25
  import useBlockDisplayTitle from '../block-title/use-block-display-title';
30
26
  import ListViewExpander from './expander';
31
27
  import { useBlockLock } from '../block-lock';
32
- import { store as blockEditorStore } from '../../store';
33
28
  import useListViewImages from './use-list-view-images';
34
- import { useListViewContext } from './context';
35
29
 
36
30
  function ListViewBlockSelectButton(
37
31
  {
@@ -48,7 +42,6 @@ function ListViewBlockSelectButton(
48
42
  draggable,
49
43
  isExpanded,
50
44
  ariaDescribedBy,
51
- updateFocusAndSelection,
52
45
  },
53
46
  ref
54
47
  ) {
@@ -58,27 +51,8 @@ function ListViewBlockSelectButton(
58
51
  context: 'list-view',
59
52
  } );
60
53
  const { isLocked } = useBlockLock( clientId );
61
- const {
62
- canInsertBlockType,
63
- getSelectedBlockClientIds,
64
- getPreviousBlockClientId,
65
- getBlockRootClientId,
66
- getBlockOrder,
67
- getBlockParents,
68
- getBlocksByClientId,
69
- canRemoveBlocks,
70
- } = useSelect( blockEditorStore );
71
- const {
72
- duplicateBlocks,
73
- multiSelect,
74
- removeBlocks,
75
- insertAfterBlock,
76
- insertBeforeBlock,
77
- } = useDispatch( blockEditorStore );
78
- const isMatch = useShortcutEventMatch();
79
54
  const isSticky = blockInformation?.positionType === 'sticky';
80
55
  const images = useListViewImages( { clientId, isExpanded } );
81
- const { collapseAll, expand, rootClientId } = useListViewContext();
82
56
 
83
57
  const positionLabel = blockInformation?.positionLabel
84
58
  ? sprintf(
@@ -97,256 +71,89 @@ function ListViewBlockSelectButton(
97
71
  onDragStart?.( event );
98
72
  };
99
73
 
100
- // Determine which blocks to update:
101
- // If the current (focused) block is part of the block selection, use the whole selection.
102
- // If the focused block is not part of the block selection, only update the focused block.
103
- function getBlocksToUpdate() {
104
- const selectedBlockClientIds = getSelectedBlockClientIds();
105
- const isUpdatingSelectedBlocks =
106
- selectedBlockClientIds.includes( clientId );
107
- const firstBlockClientId = isUpdatingSelectedBlocks
108
- ? selectedBlockClientIds[ 0 ]
109
- : clientId;
110
- const firstBlockRootClientId =
111
- getBlockRootClientId( firstBlockClientId );
112
-
113
- const blocksToUpdate = isUpdatingSelectedBlocks
114
- ? selectedBlockClientIds
115
- : [ clientId ];
116
-
117
- return {
118
- blocksToUpdate,
119
- firstBlockClientId,
120
- firstBlockRootClientId,
121
- selectedBlockClientIds,
122
- };
123
- }
124
-
125
74
  /**
126
75
  * @param {KeyboardEvent} event
127
76
  */
128
- async function onKeyDownHandler( event ) {
77
+ function onKeyDown( event ) {
129
78
  if ( event.keyCode === ENTER || event.keyCode === SPACE ) {
130
79
  onClick( event );
131
- } else if (
132
- event.keyCode === BACKSPACE ||
133
- event.keyCode === DELETE ||
134
- isMatch( 'core/block-editor/remove', event )
135
- ) {
136
- const {
137
- blocksToUpdate: blocksToDelete,
138
- firstBlockClientId,
139
- firstBlockRootClientId,
140
- selectedBlockClientIds,
141
- } = getBlocksToUpdate();
142
-
143
- // Don't update the selection if the blocks cannot be deleted.
144
- if ( ! canRemoveBlocks( blocksToDelete, firstBlockRootClientId ) ) {
145
- return;
146
- }
147
-
148
- let blockToFocus =
149
- getPreviousBlockClientId( firstBlockClientId ) ??
150
- // If the previous block is not found (when the first block is deleted),
151
- // fallback to focus the parent block.
152
- firstBlockRootClientId;
153
-
154
- removeBlocks( blocksToDelete, false );
155
-
156
- // Update the selection if the original selection has been removed.
157
- const shouldUpdateSelection =
158
- selectedBlockClientIds.length > 0 &&
159
- getSelectedBlockClientIds().length === 0;
160
-
161
- // If there's no previous block nor parent block, focus the first block.
162
- if ( ! blockToFocus ) {
163
- blockToFocus = getBlockOrder()[ 0 ];
164
- }
165
-
166
- updateFocusAndSelection( blockToFocus, shouldUpdateSelection );
167
- } else if ( isMatch( 'core/block-editor/duplicate', event ) ) {
168
- if ( event.defaultPrevented ) {
169
- return;
170
- }
171
- event.preventDefault();
172
-
173
- const { blocksToUpdate, firstBlockRootClientId } =
174
- getBlocksToUpdate();
175
-
176
- const canDuplicate = getBlocksByClientId( blocksToUpdate ).every(
177
- ( block ) => {
178
- return (
179
- !! block &&
180
- hasBlockSupport( block.name, 'multiple', true ) &&
181
- canInsertBlockType( block.name, firstBlockRootClientId )
182
- );
183
- }
184
- );
185
-
186
- if ( canDuplicate ) {
187
- const updatedBlocks = await duplicateBlocks(
188
- blocksToUpdate,
189
- false
190
- );
191
-
192
- if ( updatedBlocks?.length ) {
193
- // If blocks have been duplicated, focus the first duplicated block.
194
- updateFocusAndSelection( updatedBlocks[ 0 ], false );
195
- }
196
- }
197
- } else if ( isMatch( 'core/block-editor/insert-before', event ) ) {
198
- if ( event.defaultPrevented ) {
199
- return;
200
- }
201
- event.preventDefault();
202
-
203
- const { blocksToUpdate } = getBlocksToUpdate();
204
- await insertBeforeBlock( blocksToUpdate[ 0 ] );
205
- const newlySelectedBlocks = getSelectedBlockClientIds();
206
-
207
- // Focus the first block of the newly inserted blocks, to keep focus within the list view.
208
- updateFocusAndSelection( newlySelectedBlocks[ 0 ], false );
209
- } else if ( isMatch( 'core/block-editor/insert-after', event ) ) {
210
- if ( event.defaultPrevented ) {
211
- return;
212
- }
213
- event.preventDefault();
214
-
215
- const { blocksToUpdate } = getBlocksToUpdate();
216
- await insertAfterBlock( blocksToUpdate.at( -1 ) );
217
- const newlySelectedBlocks = getSelectedBlockClientIds();
218
-
219
- // Focus the first block of the newly inserted blocks, to keep focus within the list view.
220
- updateFocusAndSelection( newlySelectedBlocks[ 0 ], false );
221
- } else if ( isMatch( 'core/block-editor/select-all', event ) ) {
222
- if ( event.defaultPrevented ) {
223
- return;
224
- }
225
- event.preventDefault();
226
-
227
- const { firstBlockRootClientId, selectedBlockClientIds } =
228
- getBlocksToUpdate();
229
- const blockClientIds = getBlockOrder( firstBlockRootClientId );
230
- if ( ! blockClientIds.length ) {
231
- return;
232
- }
233
-
234
- // If we have selected all sibling nested blocks, try selecting up a level.
235
- // This is a similar implementation to that used by `useSelectAll`.
236
- // `isShallowEqual` is used for the list view instead of a length check,
237
- // as the array of siblings of the currently focused block may be a different
238
- // set of blocks from the current block selection if the user is focused
239
- // on a different part of the list view from the block selection.
240
- if ( isShallowEqual( selectedBlockClientIds, blockClientIds ) ) {
241
- // Only select up a level if the first block is not the root block.
242
- // This ensures that the block selection can't break out of the root block
243
- // used by the list view, if the list view is only showing a partial hierarchy.
244
- if (
245
- firstBlockRootClientId &&
246
- firstBlockRootClientId !== rootClientId
247
- ) {
248
- updateFocusAndSelection( firstBlockRootClientId, true );
249
- return;
250
- }
251
- }
252
-
253
- // Select all while passing `null` to skip focusing to the editor canvas,
254
- // and retain focus within the list view.
255
- multiSelect(
256
- blockClientIds[ 0 ],
257
- blockClientIds[ blockClientIds.length - 1 ],
258
- null
259
- );
260
- } else if ( isMatch( 'core/block-editor/collapse-list-view', event ) ) {
261
- if ( event.defaultPrevented ) {
262
- return;
263
- }
264
- event.preventDefault();
265
- const { firstBlockClientId } = getBlocksToUpdate();
266
- const blockParents = getBlockParents( firstBlockClientId, false );
267
- // Collapse all blocks.
268
- collapseAll();
269
- // Expand all parents of the current block.
270
- expand( blockParents );
271
80
  }
272
81
  }
273
82
 
274
83
  return (
275
- <>
276
- <Button
277
- className={ classnames(
278
- 'block-editor-list-view-block-select-button',
279
- className
280
- ) }
281
- onClick={ onClick }
282
- onContextMenu={ onContextMenu }
283
- onKeyDown={ onKeyDownHandler }
284
- onMouseDown={ onMouseDown }
285
- ref={ ref }
286
- tabIndex={ tabIndex }
287
- onFocus={ onFocus }
288
- onDragStart={ onDragStartHandler }
289
- onDragEnd={ onDragEnd }
290
- draggable={ draggable }
291
- href={ `#block-${ clientId }` }
292
- aria-describedby={ ariaDescribedBy }
293
- aria-expanded={ isExpanded }
84
+ <Button
85
+ className={ classnames(
86
+ 'block-editor-list-view-block-select-button',
87
+ className
88
+ ) }
89
+ onClick={ onClick }
90
+ onContextMenu={ onContextMenu }
91
+ onKeyDown={ onKeyDown }
92
+ onMouseDown={ onMouseDown }
93
+ ref={ ref }
94
+ tabIndex={ tabIndex }
95
+ onFocus={ onFocus }
96
+ onDragStart={ onDragStartHandler }
97
+ onDragEnd={ onDragEnd }
98
+ draggable={ draggable }
99
+ href={ `#block-${ clientId }` }
100
+ aria-describedby={ ariaDescribedBy }
101
+ aria-expanded={ isExpanded }
102
+ >
103
+ <ListViewExpander onClick={ onToggleExpanded } />
104
+ <BlockIcon
105
+ icon={ blockInformation?.icon }
106
+ showColors
107
+ context="list-view"
108
+ />
109
+ <HStack
110
+ alignment="center"
111
+ className="block-editor-list-view-block-select-button__label-wrapper"
112
+ justify="flex-start"
113
+ spacing={ 1 }
294
114
  >
295
- <ListViewExpander onClick={ onToggleExpanded } />
296
- <BlockIcon
297
- icon={ blockInformation?.icon }
298
- showColors
299
- context="list-view"
300
- />
301
- <HStack
302
- alignment="center"
303
- className="block-editor-list-view-block-select-button__label-wrapper"
304
- justify="flex-start"
305
- spacing={ 1 }
306
- >
307
- <span className="block-editor-list-view-block-select-button__title">
308
- <Truncate ellipsizeMode="auto">{ blockTitle }</Truncate>
309
- </span>
310
- { blockInformation?.anchor && (
311
- <span className="block-editor-list-view-block-select-button__anchor-wrapper">
312
- <Truncate
313
- className="block-editor-list-view-block-select-button__anchor"
314
- ellipsizeMode="auto"
315
- >
316
- { blockInformation.anchor }
317
- </Truncate>
318
- </span>
319
- ) }
320
- { positionLabel && isSticky && (
321
- <Tooltip text={ positionLabel }>
322
- <Icon icon={ pinSmall } />
323
- </Tooltip>
324
- ) }
325
- { images.length ? (
326
- <span
327
- className="block-editor-list-view-block-select-button__images"
328
- aria-hidden
115
+ <span className="block-editor-list-view-block-select-button__title">
116
+ <Truncate ellipsizeMode="auto">{ blockTitle }</Truncate>
117
+ </span>
118
+ { blockInformation?.anchor && (
119
+ <span className="block-editor-list-view-block-select-button__anchor-wrapper">
120
+ <Truncate
121
+ className="block-editor-list-view-block-select-button__anchor"
122
+ ellipsizeMode="auto"
329
123
  >
330
- { images.map( ( image, index ) => (
331
- <span
332
- className="block-editor-list-view-block-select-button__image"
333
- key={ image.clientId }
334
- style={ {
335
- backgroundImage: `url(${ image.url })`,
336
- zIndex: images.length - index, // Ensure the first image is on top, and subsequent images are behind.
337
- } }
338
- />
339
- ) ) }
340
- </span>
341
- ) : null }
342
- { isLocked && (
343
- <span className="block-editor-list-view-block-select-button__lock">
344
- <Icon icon={ lock } />
345
- </span>
346
- ) }
347
- </HStack>
348
- </Button>
349
- </>
124
+ { blockInformation.anchor }
125
+ </Truncate>
126
+ </span>
127
+ ) }
128
+ { positionLabel && isSticky && (
129
+ <Tooltip text={ positionLabel }>
130
+ <Icon icon={ pinSmall } />
131
+ </Tooltip>
132
+ ) }
133
+ { images.length ? (
134
+ <span
135
+ className="block-editor-list-view-block-select-button__images"
136
+ aria-hidden
137
+ >
138
+ { images.map( ( image, index ) => (
139
+ <span
140
+ className="block-editor-list-view-block-select-button__image"
141
+ key={ image.clientId }
142
+ style={ {
143
+ backgroundImage: `url(${ image.url })`,
144
+ zIndex: images.length - index, // Ensure the first image is on top, and subsequent images are behind.
145
+ } }
146
+ />
147
+ ) ) }
148
+ </span>
149
+ ) : null }
150
+ { isLocked && (
151
+ <span className="block-editor-list-view-block-select-button__lock">
152
+ <Icon icon={ lock } />
153
+ </span>
154
+ ) }
155
+ </HStack>
156
+ </Button>
350
157
  );
351
158
  }
352
159
 
@@ -22,7 +22,9 @@ import {
22
22
  } from '@wordpress/element';
23
23
  import { useDispatch, useSelect } from '@wordpress/data';
24
24
  import { __ } from '@wordpress/i18n';
25
- import { ESCAPE } from '@wordpress/keycodes';
25
+ import { BACKSPACE, DELETE } from '@wordpress/keycodes';
26
+ import isShallowEqual from '@wordpress/is-shallow-equal';
27
+ import { __unstableUseShortcutEventMatch as useShortcutEventMatch } from '@wordpress/keyboard-shortcuts';
26
28
 
27
29
  /**
28
30
  * Internal dependencies
@@ -44,6 +46,7 @@ import { store as blockEditorStore } from '../../store';
44
46
  import useBlockDisplayInformation from '../use-block-display-information';
45
47
  import { useBlockLock } from '../block-lock';
46
48
  import AriaReferencedText from './aria-referenced-text';
49
+ import { unlock } from '../../lock-unlock';
47
50
 
48
51
  function ListViewBlock( {
49
52
  block: { clientId },
@@ -78,29 +81,49 @@ function ListViewBlock( {
78
81
  isSelected &&
79
82
  selectedClientIds[ selectedClientIds.length - 1 ] === clientId;
80
83
 
81
- const { toggleBlockHighlight } = useDispatch( blockEditorStore );
82
-
83
- const blockInformation = useBlockDisplayInformation( clientId );
84
+ const {
85
+ toggleBlockHighlight,
86
+ duplicateBlocks,
87
+ multiSelect,
88
+ removeBlocks,
89
+ insertAfterBlock,
90
+ insertBeforeBlock,
91
+ setOpenedBlockSettingsMenu,
92
+ } = unlock( useDispatch( blockEditorStore ) );
84
93
 
85
- const { block, blockName, blockEditingMode } = useSelect(
86
- ( select ) => {
87
- const { getBlock, getBlockName, getBlockEditingMode } =
88
- select( blockEditorStore );
94
+ const {
95
+ canInsertBlockType,
96
+ getSelectedBlockClientIds,
97
+ getPreviousBlockClientId,
98
+ getBlockRootClientId,
99
+ getBlockOrder,
100
+ getBlockParents,
101
+ getBlocksByClientId,
102
+ canRemoveBlocks,
103
+ } = useSelect( blockEditorStore );
89
104
 
90
- return {
91
- block: getBlock( clientId ),
92
- blockName: getBlockName( clientId ),
93
- blockEditingMode: getBlockEditingMode( clientId ),
94
- };
95
- },
96
- [ clientId ]
97
- );
105
+ const blockInformation = useBlockDisplayInformation( clientId );
98
106
 
99
- const allowRightClickOverrides = useSelect(
100
- ( select ) =>
101
- select( blockEditorStore ).getSettings().allowRightClickOverrides,
102
- []
103
- );
107
+ const { block, blockName, blockEditingMode, allowRightClickOverrides } =
108
+ useSelect(
109
+ ( select ) => {
110
+ const {
111
+ getBlock,
112
+ getBlockName,
113
+ getBlockEditingMode,
114
+ getSettings,
115
+ } = select( blockEditorStore );
116
+
117
+ return {
118
+ block: getBlock( clientId ),
119
+ blockName: getBlockName( clientId ),
120
+ blockEditingMode: getBlockEditingMode( clientId ),
121
+ allowRightClickOverrides:
122
+ getSettings().allowRightClickOverrides,
123
+ };
124
+ },
125
+ [ clientId ]
126
+ );
104
127
 
105
128
  const showBlockActions =
106
129
  // When a block hides its toolbar it also hides the block settings menu,
@@ -115,26 +138,194 @@ function ListViewBlock( {
115
138
  const {
116
139
  expand,
117
140
  collapse,
141
+ collapseAll,
118
142
  BlockSettingsMenu,
119
143
  listViewInstanceId,
120
144
  expandedState,
121
145
  setInsertedBlock,
122
146
  treeGridElementRef,
147
+ rootClientId,
123
148
  } = useListViewContext();
149
+ const isMatch = useShortcutEventMatch();
150
+
151
+ // Determine which blocks to update:
152
+ // If the current (focused) block is part of the block selection, use the whole selection.
153
+ // If the focused block is not part of the block selection, only update the focused block.
154
+ function getBlocksToUpdate() {
155
+ const selectedBlockClientIds = getSelectedBlockClientIds();
156
+ const isUpdatingSelectedBlocks =
157
+ selectedBlockClientIds.includes( clientId );
158
+ const firstBlockClientId = isUpdatingSelectedBlocks
159
+ ? selectedBlockClientIds[ 0 ]
160
+ : clientId;
161
+ const firstBlockRootClientId =
162
+ getBlockRootClientId( firstBlockClientId );
163
+
164
+ const blocksToUpdate = isUpdatingSelectedBlocks
165
+ ? selectedBlockClientIds
166
+ : [ clientId ];
124
167
 
125
- // If multiple blocks are selected, deselect all blocks when the user
126
- // presses the escape key.
127
- const onKeyDown = ( event ) => {
168
+ return {
169
+ blocksToUpdate,
170
+ firstBlockClientId,
171
+ firstBlockRootClientId,
172
+ selectedBlockClientIds,
173
+ };
174
+ }
175
+
176
+ /**
177
+ * @param {KeyboardEvent} event
178
+ */
179
+ async function onKeyDown( event ) {
180
+ if ( event.defaultPrevented ) {
181
+ return;
182
+ }
183
+
184
+ // If multiple blocks are selected, deselect all blocks when the user
185
+ // presses the escape key.
128
186
  if (
129
- event.keyCode === ESCAPE &&
130
- ! event.defaultPrevented &&
187
+ isMatch( 'core/block-editor/unselect', event ) &&
131
188
  selectedClientIds.length > 0
132
189
  ) {
133
190
  event.stopPropagation();
134
191
  event.preventDefault();
135
192
  selectBlock( event, undefined );
193
+ } else if (
194
+ event.keyCode === BACKSPACE ||
195
+ event.keyCode === DELETE ||
196
+ isMatch( 'core/block-editor/remove', event )
197
+ ) {
198
+ const {
199
+ blocksToUpdate: blocksToDelete,
200
+ firstBlockClientId,
201
+ firstBlockRootClientId,
202
+ selectedBlockClientIds,
203
+ } = getBlocksToUpdate();
204
+
205
+ // Don't update the selection if the blocks cannot be deleted.
206
+ if ( ! canRemoveBlocks( blocksToDelete, firstBlockRootClientId ) ) {
207
+ return;
208
+ }
209
+
210
+ let blockToFocus =
211
+ getPreviousBlockClientId( firstBlockClientId ) ??
212
+ // If the previous block is not found (when the first block is deleted),
213
+ // fallback to focus the parent block.
214
+ firstBlockRootClientId;
215
+
216
+ removeBlocks( blocksToDelete, false );
217
+
218
+ // Update the selection if the original selection has been removed.
219
+ const shouldUpdateSelection =
220
+ selectedBlockClientIds.length > 0 &&
221
+ getSelectedBlockClientIds().length === 0;
222
+
223
+ // If there's no previous block nor parent block, focus the first block.
224
+ if ( ! blockToFocus ) {
225
+ blockToFocus = getBlockOrder()[ 0 ];
226
+ }
227
+
228
+ updateFocusAndSelection( blockToFocus, shouldUpdateSelection );
229
+ } else if ( isMatch( 'core/block-editor/duplicate', event ) ) {
230
+ event.preventDefault();
231
+
232
+ const { blocksToUpdate, firstBlockRootClientId } =
233
+ getBlocksToUpdate();
234
+
235
+ const canDuplicate = getBlocksByClientId( blocksToUpdate ).every(
236
+ ( blockToUpdate ) => {
237
+ return (
238
+ !! blockToUpdate &&
239
+ hasBlockSupport(
240
+ blockToUpdate.name,
241
+ 'multiple',
242
+ true
243
+ ) &&
244
+ canInsertBlockType(
245
+ blockToUpdate.name,
246
+ firstBlockRootClientId
247
+ )
248
+ );
249
+ }
250
+ );
251
+
252
+ if ( canDuplicate ) {
253
+ const updatedBlocks = await duplicateBlocks(
254
+ blocksToUpdate,
255
+ false
256
+ );
257
+
258
+ if ( updatedBlocks?.length ) {
259
+ // If blocks have been duplicated, focus the first duplicated block.
260
+ updateFocusAndSelection( updatedBlocks[ 0 ], false );
261
+ }
262
+ }
263
+ } else if ( isMatch( 'core/block-editor/insert-before', event ) ) {
264
+ event.preventDefault();
265
+
266
+ const { blocksToUpdate } = getBlocksToUpdate();
267
+ await insertBeforeBlock( blocksToUpdate[ 0 ] );
268
+ const newlySelectedBlocks = getSelectedBlockClientIds();
269
+
270
+ // Focus the first block of the newly inserted blocks, to keep focus within the list view.
271
+ setOpenedBlockSettingsMenu( undefined );
272
+ updateFocusAndSelection( newlySelectedBlocks[ 0 ], false );
273
+ } else if ( isMatch( 'core/block-editor/insert-after', event ) ) {
274
+ event.preventDefault();
275
+
276
+ const { blocksToUpdate } = getBlocksToUpdate();
277
+ await insertAfterBlock( blocksToUpdate.at( -1 ) );
278
+ const newlySelectedBlocks = getSelectedBlockClientIds();
279
+
280
+ // Focus the first block of the newly inserted blocks, to keep focus within the list view.
281
+ setOpenedBlockSettingsMenu( undefined );
282
+ updateFocusAndSelection( newlySelectedBlocks[ 0 ], false );
283
+ } else if ( isMatch( 'core/block-editor/select-all', event ) ) {
284
+ event.preventDefault();
285
+
286
+ const { firstBlockRootClientId, selectedBlockClientIds } =
287
+ getBlocksToUpdate();
288
+ const blockClientIds = getBlockOrder( firstBlockRootClientId );
289
+ if ( ! blockClientIds.length ) {
290
+ return;
291
+ }
292
+
293
+ // If we have selected all sibling nested blocks, try selecting up a level.
294
+ // This is a similar implementation to that used by `useSelectAll`.
295
+ // `isShallowEqual` is used for the list view instead of a length check,
296
+ // as the array of siblings of the currently focused block may be a different
297
+ // set of blocks from the current block selection if the user is focused
298
+ // on a different part of the list view from the block selection.
299
+ if ( isShallowEqual( selectedBlockClientIds, blockClientIds ) ) {
300
+ // Only select up a level if the first block is not the root block.
301
+ // This ensures that the block selection can't break out of the root block
302
+ // used by the list view, if the list view is only showing a partial hierarchy.
303
+ if (
304
+ firstBlockRootClientId &&
305
+ firstBlockRootClientId !== rootClientId
306
+ ) {
307
+ updateFocusAndSelection( firstBlockRootClientId, true );
308
+ return;
309
+ }
310
+ }
311
+
312
+ // Select all while passing `null` to skip focusing to the editor canvas,
313
+ // and retain focus within the list view.
314
+ multiSelect(
315
+ blockClientIds[ 0 ],
316
+ blockClientIds[ blockClientIds.length - 1 ],
317
+ null
318
+ );
319
+ } else if ( isMatch( 'core/block-editor/collapse-list-view', event ) ) {
320
+ event.preventDefault();
321
+ const { firstBlockClientId } = getBlocksToUpdate();
322
+ const blockParents = getBlockParents( firstBlockClientId, false );
323
+ // Collapse all blocks.
324
+ collapseAll();
325
+ // Expand all parents of the current block.
326
+ expand( blockParents );
136
327
  }
137
- };
328
+ }
138
329
 
139
330
  const onMouseEnter = useCallback( () => {
140
331
  setIsHovered( true );
@@ -345,7 +536,6 @@ function ListViewBlock( {
345
536
  isExpanded={ canEdit ? isExpanded : undefined }
346
537
  selectedClientIds={ selectedClientIds }
347
538
  ariaDescribedBy={ descriptionId }
348
- updateFocusAndSelection={ updateFocusAndSelection }
349
539
  />
350
540
  <AriaReferencedText id={ descriptionId }>
351
541
  { `${ blockPositionDescription } ${ blockPropertiesDescription }` }
@@ -64,7 +64,7 @@ const expanded = ( state, action ) => {
64
64
  return state;
65
65
  };
66
66
 
67
- export const BLOCK_LIST_ITEM_HEIGHT = 36;
67
+ export const BLOCK_LIST_ITEM_HEIGHT = 32;
68
68
 
69
69
  /** @typedef {import('react').ComponentType} ComponentType */
70
70
  /** @typedef {import('react').Ref<HTMLElement>} Ref */