@wordpress/block-editor 8.1.2-next.f435e9e01b.0 → 8.2.1-next.a55ed9455a.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 (586) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/README.md +6 -26
  3. package/build/autocompleters/link.js +78 -0
  4. package/build/autocompleters/link.js.map +1 -0
  5. package/build/components/autocomplete/index.js +3 -1
  6. package/build/components/autocomplete/index.js.map +1 -1
  7. package/build/components/block-actions/index.js +1 -1
  8. package/build/components/block-actions/index.js.map +1 -1
  9. package/build/components/block-breadcrumb/index.js +4 -2
  10. package/build/components/block-breadcrumb/index.js.map +1 -1
  11. package/build/components/block-compare/index.js +2 -2
  12. package/build/components/block-compare/index.js.map +1 -1
  13. package/build/components/block-controls/index.js +1 -1
  14. package/build/components/block-controls/index.js.map +1 -1
  15. package/build/components/block-draggable/index.js +1 -1
  16. package/build/components/block-draggable/index.js.map +1 -1
  17. package/build/components/block-edit/edit.js +1 -1
  18. package/build/components/block-edit/edit.js.map +1 -1
  19. package/build/components/block-list/block-html.js +1 -1
  20. package/build/components/block-list/block-html.js.map +1 -1
  21. package/build/components/block-list/block-invalid-warning.js +1 -1
  22. package/build/components/block-list/block-invalid-warning.js.map +1 -1
  23. package/build/components/block-list/block-list-item.native.js +4 -4
  24. package/build/components/block-list/block-list-item.native.js.map +1 -1
  25. package/build/components/block-list/block-selection-button.native.js +4 -3
  26. package/build/components/block-list/block-selection-button.native.js.map +1 -1
  27. package/build/components/block-list/block.js +17 -3
  28. package/build/components/block-list/block.js.map +1 -1
  29. package/build/components/block-list/block.native.js +6 -6
  30. package/build/components/block-list/block.native.js.map +1 -1
  31. package/build/components/block-list/index.native.js +5 -5
  32. package/build/components/block-list/index.native.js.map +1 -1
  33. package/build/components/block-list/use-block-props/use-block-class-names.js +1 -1
  34. package/build/components/block-list/use-block-props/use-block-class-names.js.map +1 -1
  35. package/build/components/block-list/use-block-props/use-focus-first-element.js +3 -0
  36. package/build/components/block-list/use-block-props/use-focus-first-element.js.map +1 -1
  37. package/build/components/block-list/use-block-props/use-multi-selection.js +25 -27
  38. package/build/components/block-list/use-block-props/use-multi-selection.js.map +1 -1
  39. package/build/components/block-media-update-progress/index.native.js +4 -4
  40. package/build/components/block-media-update-progress/index.native.js.map +1 -1
  41. package/build/components/block-mobile-toolbar/block-actions-menu.native.js +3 -3
  42. package/build/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  43. package/build/components/block-mobile-toolbar/index.native.js +1 -1
  44. package/build/components/block-mobile-toolbar/index.native.js.map +1 -1
  45. package/build/components/block-mover/mover-description.js +4 -4
  46. package/build/components/block-mover/mover-description.js.map +1 -1
  47. package/build/components/block-mover/mover-description.native.js +5 -5
  48. package/build/components/block-mover/mover-description.native.js.map +1 -1
  49. package/build/components/block-settings/container.native.js +1 -5
  50. package/build/components/block-settings/container.native.js.map +1 -1
  51. package/build/components/block-settings-menu/block-settings-dropdown.js +7 -12
  52. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  53. package/build/components/block-styles/preview.native.js +1 -1
  54. package/build/components/block-styles/preview.native.js.map +1 -1
  55. package/build/components/block-switcher/index.js +2 -1
  56. package/build/components/block-switcher/index.js.map +1 -1
  57. package/build/components/block-switcher/use-transformed-patterns.js +0 -1
  58. package/build/components/block-switcher/use-transformed-patterns.js.map +1 -1
  59. package/build/components/block-title/index.js +7 -62
  60. package/build/components/block-title/index.js.map +1 -1
  61. package/build/components/block-title/use-block-display-title.js +94 -0
  62. package/build/components/block-title/use-block-display-title.js.map +1 -0
  63. package/build/components/block-toolbar/utils.js +9 -1
  64. package/build/components/block-toolbar/utils.js.map +1 -1
  65. package/build/components/block-tools/block-popover.js +1 -1
  66. package/build/components/block-tools/block-popover.js.map +1 -1
  67. package/build/components/block-tools/block-selection-button.js +2 -1
  68. package/build/components/block-tools/block-selection-button.js.map +1 -1
  69. package/build/components/block-types-list/index.native.js +1 -1
  70. package/build/components/block-types-list/index.native.js.map +1 -1
  71. package/build/components/border-radius-control/index.js +2 -2
  72. package/build/components/border-radius-control/index.js.map +1 -1
  73. package/build/components/border-radius-control/utils.js +10 -6
  74. package/build/components/border-radius-control/utils.js.map +1 -1
  75. package/build/components/contrast-checker/index.js +3 -3
  76. package/build/components/contrast-checker/index.js.map +1 -1
  77. package/build/components/convert-to-group-buttons/index.js +1 -1
  78. package/build/components/convert-to-group-buttons/index.js.map +1 -1
  79. package/build/components/convert-to-group-buttons/use-convert-to-group-button-props.js +1 -3
  80. package/build/components/convert-to-group-buttons/use-convert-to-group-button-props.js.map +1 -1
  81. package/build/components/copy-handler/index.js +3 -3
  82. package/build/components/copy-handler/index.js.map +1 -1
  83. package/build/components/font-sizes/with-font-sizes.js +3 -3
  84. package/build/components/font-sizes/with-font-sizes.js.map +1 -1
  85. package/build/components/index.js +9 -0
  86. package/build/components/index.js.map +1 -1
  87. package/build/components/index.native.js +38 -1
  88. package/build/components/index.native.js.map +1 -1
  89. package/build/components/inserter/block-patterns-tab.js +4 -4
  90. package/build/components/inserter/block-patterns-tab.js.map +1 -1
  91. package/build/components/inserter/block-types-tab.js +1 -1
  92. package/build/components/inserter/block-types-tab.js.map +1 -1
  93. package/build/components/inserter/hooks/use-block-type-impressions.native.js +2 -2
  94. package/build/components/inserter/hooks/use-block-type-impressions.native.js.map +1 -1
  95. package/build/components/inserter/index.js +3 -3
  96. package/build/components/inserter/index.js.map +1 -1
  97. package/build/components/inserter/index.native.js +7 -7
  98. package/build/components/inserter/index.native.js.map +1 -1
  99. package/build/components/inserter/menu.js.map +1 -1
  100. package/build/components/inserter/menu.native.js +3 -3
  101. package/build/components/inserter/menu.native.js.map +1 -1
  102. package/build/components/inserter/quick-inserter.js +20 -8
  103. package/build/components/inserter/quick-inserter.js.map +1 -1
  104. package/build/components/inserter/search-items.js +1 -1
  105. package/build/components/inserter/search-items.js.map +1 -1
  106. package/build/components/inserter/search-results.js +28 -11
  107. package/build/components/inserter/search-results.js.map +1 -1
  108. package/build/components/keyboard-shortcuts/index.js +1 -1
  109. package/build/components/keyboard-shortcuts/index.js.map +1 -1
  110. package/build/components/letter-spacing-control/index.js +3 -3
  111. package/build/components/letter-spacing-control/index.js.map +1 -1
  112. package/build/components/line-height-control/index.js +63 -45
  113. package/build/components/line-height-control/index.js.map +1 -1
  114. package/build/components/line-height-control/index.native.js +3 -1
  115. package/build/components/line-height-control/index.native.js.map +1 -1
  116. package/build/components/link-control/index.js +2 -2
  117. package/build/components/link-control/index.js.map +1 -1
  118. package/build/components/link-control/search-input.js +1 -1
  119. package/build/components/link-control/search-input.js.map +1 -1
  120. package/build/components/link-control/search-results.js +2 -2
  121. package/build/components/link-control/search-results.js.map +1 -1
  122. package/build/components/link-control/use-rich-url-data.js +1 -1
  123. package/build/components/link-control/use-rich-url-data.js.map +1 -1
  124. package/build/components/link-control/use-search-handler.js +2 -2
  125. package/build/components/link-control/use-search-handler.js.map +1 -1
  126. package/build/components/list-view/block-contents.js +8 -4
  127. package/build/components/list-view/block-contents.js.map +1 -1
  128. package/build/components/list-view/block-select-button.js +2 -2
  129. package/build/components/list-view/block-select-button.js.map +1 -1
  130. package/build/components/list-view/block.js +20 -9
  131. package/build/components/list-view/block.js.map +1 -1
  132. package/build/components/list-view/branch.js +2 -1
  133. package/build/components/list-view/branch.js.map +1 -1
  134. package/build/components/list-view/index.js +49 -41
  135. package/build/components/list-view/index.js.map +1 -1
  136. package/build/components/list-view/use-block-selection.js +139 -0
  137. package/build/components/list-view/use-block-selection.js.map +1 -0
  138. package/build/components/list-view/use-list-view-expand-selected-item.js +60 -0
  139. package/build/components/list-view/use-list-view-expand-selected-item.js.map +1 -0
  140. package/build/components/list-view/utils.js +29 -1
  141. package/build/components/list-view/utils.js.map +1 -1
  142. package/build/components/media-placeholder/index.native.js +7 -5
  143. package/build/components/media-placeholder/index.native.js.map +1 -1
  144. package/build/components/media-replace-flow/index.js +20 -24
  145. package/build/components/media-replace-flow/index.js.map +1 -1
  146. package/build/components/media-upload/index.native.js +4 -3
  147. package/build/components/media-upload/index.native.js.map +1 -1
  148. package/build/components/media-upload-progress/index.native.js +1 -1
  149. package/build/components/media-upload-progress/index.native.js.map +1 -1
  150. package/build/components/navigable-toolbar/index.js +3 -3
  151. package/build/components/navigable-toolbar/index.js.map +1 -1
  152. package/build/components/plain-text/index.native.js +3 -3
  153. package/build/components/plain-text/index.native.js.map +1 -1
  154. package/build/components/rich-text/format-toolbar-container.js +2 -2
  155. package/build/components/rich-text/format-toolbar-container.js.map +1 -1
  156. package/build/components/rich-text/format-toolbar-container.native.js +1 -1
  157. package/build/components/rich-text/format-toolbar-container.native.js.map +1 -1
  158. package/build/components/rich-text/index.js +7 -12
  159. package/build/components/rich-text/index.js.map +1 -1
  160. package/build/components/rich-text/index.native.js +3 -3
  161. package/build/components/rich-text/index.native.js.map +1 -1
  162. package/build/components/rich-text/use-paste-handler.js +7 -12
  163. package/build/components/rich-text/use-paste-handler.js.map +1 -1
  164. package/build/components/url-input/index.js +11 -11
  165. package/build/components/url-input/index.js.map +1 -1
  166. package/build/components/use-moving-animation/index.js +1 -1
  167. package/build/components/use-moving-animation/index.js.map +1 -1
  168. package/build/components/use-on-block-drop/index.js +2 -2
  169. package/build/components/use-on-block-drop/index.js.map +1 -1
  170. package/build/components/writing-flow/index.js +1 -0
  171. package/build/components/writing-flow/index.js.map +1 -1
  172. package/build/components/writing-flow/use-multi-selection.js +22 -24
  173. package/build/components/writing-flow/use-multi-selection.js.map +1 -1
  174. package/build/components/writing-flow/use-select-all.js +3 -2
  175. package/build/components/writing-flow/use-select-all.js.map +1 -1
  176. package/build/components/writing-flow/use-tab-nav.js +4 -3
  177. package/build/components/writing-flow/use-tab-nav.js.map +1 -1
  178. package/build/hooks/align.js +1 -1
  179. package/build/hooks/align.js.map +1 -1
  180. package/build/hooks/anchor.js +1 -1
  181. package/build/hooks/anchor.js.map +1 -1
  182. package/build/hooks/border.js +2 -14
  183. package/build/hooks/border.js.map +1 -1
  184. package/build/hooks/color.js +2 -2
  185. package/build/hooks/color.js.map +1 -1
  186. package/build/hooks/custom-class-name.js +40 -0
  187. package/build/hooks/custom-class-name.js.map +1 -1
  188. package/build/hooks/generated-class-name.js +3 -3
  189. package/build/hooks/generated-class-name.js.map +1 -1
  190. package/build/hooks/line-height.js +2 -0
  191. package/build/hooks/line-height.js.map +1 -1
  192. package/build/hooks/lock.js +1 -1
  193. package/build/hooks/lock.js.map +1 -1
  194. package/build/hooks/style.js +32 -13
  195. package/build/hooks/style.js.map +1 -1
  196. package/build/layouts/flow.js +7 -5
  197. package/build/layouts/flow.js.map +1 -1
  198. package/build/store/actions.js +55 -48
  199. package/build/store/actions.js.map +1 -1
  200. package/build/store/defaults.js +2 -1
  201. package/build/store/defaults.js.map +1 -1
  202. package/build/store/index.js +1 -2
  203. package/build/store/index.js.map +1 -1
  204. package/build/store/reducer.js +13 -13
  205. package/build/store/reducer.js.map +1 -1
  206. package/build/store/selectors.js +6 -6
  207. package/build/store/selectors.js.map +1 -1
  208. package/build/utils/index.js +0 -14
  209. package/build/utils/index.js.map +1 -1
  210. package/build/utils/parse-css-unit-to-px.js +3 -3
  211. package/build/utils/parse-css-unit-to-px.js.map +1 -1
  212. package/build/utils/pasting.js +91 -0
  213. package/build/utils/pasting.js.map +1 -0
  214. package/build/utils/transform-styles/ast/parse.js +5 -5
  215. package/build/utils/transform-styles/ast/parse.js.map +1 -1
  216. package/build/utils/transform-styles/transforms/url-rewrite.js +2 -2
  217. package/build/utils/transform-styles/transforms/url-rewrite.js.map +1 -1
  218. package/build-module/autocompleters/link.js +64 -0
  219. package/build-module/autocompleters/link.js.map +1 -0
  220. package/build-module/components/autocomplete/index.js +2 -1
  221. package/build-module/components/autocomplete/index.js.map +1 -1
  222. package/build-module/components/block-actions/index.js +1 -1
  223. package/build-module/components/block-actions/index.js.map +1 -1
  224. package/build-module/components/block-breadcrumb/index.js +4 -2
  225. package/build-module/components/block-breadcrumb/index.js.map +1 -1
  226. package/build-module/components/block-compare/index.js +2 -2
  227. package/build-module/components/block-compare/index.js.map +1 -1
  228. package/build-module/components/block-controls/index.js +1 -1
  229. package/build-module/components/block-controls/index.js.map +1 -1
  230. package/build-module/components/block-draggable/index.js +1 -1
  231. package/build-module/components/block-draggable/index.js.map +1 -1
  232. package/build-module/components/block-edit/edit.js +1 -1
  233. package/build-module/components/block-edit/edit.js.map +1 -1
  234. package/build-module/components/block-list/block-html.js +1 -1
  235. package/build-module/components/block-list/block-html.js.map +1 -1
  236. package/build-module/components/block-list/block-invalid-warning.js +1 -1
  237. package/build-module/components/block-list/block-invalid-warning.js.map +1 -1
  238. package/build-module/components/block-list/block-list-item.native.js +4 -4
  239. package/build-module/components/block-list/block-list-item.native.js.map +1 -1
  240. package/build-module/components/block-list/block-selection-button.native.js +4 -3
  241. package/build-module/components/block-list/block-selection-button.native.js.map +1 -1
  242. package/build-module/components/block-list/block.js +18 -4
  243. package/build-module/components/block-list/block.js.map +1 -1
  244. package/build-module/components/block-list/block.native.js +7 -7
  245. package/build-module/components/block-list/block.native.js.map +1 -1
  246. package/build-module/components/block-list/index.native.js +5 -5
  247. package/build-module/components/block-list/index.native.js.map +1 -1
  248. package/build-module/components/block-list/use-block-props/use-block-class-names.js +1 -1
  249. package/build-module/components/block-list/use-block-props/use-block-class-names.js.map +1 -1
  250. package/build-module/components/block-list/use-block-props/use-focus-first-element.js +2 -0
  251. package/build-module/components/block-list/use-block-props/use-focus-first-element.js.map +1 -1
  252. package/build-module/components/block-list/use-block-props/use-multi-selection.js +23 -28
  253. package/build-module/components/block-list/use-block-props/use-multi-selection.js.map +1 -1
  254. package/build-module/components/block-media-update-progress/index.native.js +4 -4
  255. package/build-module/components/block-media-update-progress/index.native.js.map +1 -1
  256. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js +3 -3
  257. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  258. package/build-module/components/block-mobile-toolbar/index.native.js +1 -1
  259. package/build-module/components/block-mobile-toolbar/index.native.js.map +1 -1
  260. package/build-module/components/block-mover/mover-description.js +4 -4
  261. package/build-module/components/block-mover/mover-description.js.map +1 -1
  262. package/build-module/components/block-mover/mover-description.native.js +5 -5
  263. package/build-module/components/block-mover/mover-description.native.js.map +1 -1
  264. package/build-module/components/block-settings/container.native.js +2 -6
  265. package/build-module/components/block-settings/container.native.js.map +1 -1
  266. package/build-module/components/block-settings-menu/block-settings-dropdown.js +7 -13
  267. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  268. package/build-module/components/block-styles/preview.native.js +1 -1
  269. package/build-module/components/block-styles/preview.native.js.map +1 -1
  270. package/build-module/components/block-switcher/index.js +2 -1
  271. package/build-module/components/block-switcher/index.js.map +1 -1
  272. package/build-module/components/block-switcher/use-transformed-patterns.js +0 -1
  273. package/build-module/components/block-switcher/use-transformed-patterns.js.map +1 -1
  274. package/build-module/components/block-title/index.js +7 -58
  275. package/build-module/components/block-title/index.js.map +1 -1
  276. package/build-module/components/block-title/use-block-display-title.js +80 -0
  277. package/build-module/components/block-title/use-block-display-title.js.map +1 -0
  278. package/build-module/components/block-toolbar/utils.js +9 -1
  279. package/build-module/components/block-toolbar/utils.js.map +1 -1
  280. package/build-module/components/block-tools/block-popover.js +1 -1
  281. package/build-module/components/block-tools/block-popover.js.map +1 -1
  282. package/build-module/components/block-tools/block-selection-button.js +2 -1
  283. package/build-module/components/block-tools/block-selection-button.js.map +1 -1
  284. package/build-module/components/block-types-list/index.native.js +1 -1
  285. package/build-module/components/block-types-list/index.native.js.map +1 -1
  286. package/build-module/components/border-radius-control/index.js +3 -3
  287. package/build-module/components/border-radius-control/index.js.map +1 -1
  288. package/build-module/components/border-radius-control/utils.js +11 -7
  289. package/build-module/components/border-radius-control/utils.js.map +1 -1
  290. package/build-module/components/contrast-checker/index.js +3 -3
  291. package/build-module/components/contrast-checker/index.js.map +1 -1
  292. package/build-module/components/convert-to-group-buttons/index.js +1 -1
  293. package/build-module/components/convert-to-group-buttons/index.js.map +1 -1
  294. package/build-module/components/convert-to-group-buttons/use-convert-to-group-button-props.js +1 -3
  295. package/build-module/components/convert-to-group-buttons/use-convert-to-group-button-props.js.map +1 -1
  296. package/build-module/components/copy-handler/index.js +2 -2
  297. package/build-module/components/copy-handler/index.js.map +1 -1
  298. package/build-module/components/font-sizes/with-font-sizes.js +3 -3
  299. package/build-module/components/font-sizes/with-font-sizes.js.map +1 -1
  300. package/build-module/components/index.js +1 -0
  301. package/build-module/components/index.js.map +1 -1
  302. package/build-module/components/index.native.js +5 -4
  303. package/build-module/components/index.native.js.map +1 -1
  304. package/build-module/components/inserter/block-patterns-tab.js +4 -4
  305. package/build-module/components/inserter/block-patterns-tab.js.map +1 -1
  306. package/build-module/components/inserter/block-types-tab.js +1 -1
  307. package/build-module/components/inserter/block-types-tab.js.map +1 -1
  308. package/build-module/components/inserter/hooks/use-block-type-impressions.native.js +2 -2
  309. package/build-module/components/inserter/hooks/use-block-type-impressions.native.js.map +1 -1
  310. package/build-module/components/inserter/index.js +3 -3
  311. package/build-module/components/inserter/index.js.map +1 -1
  312. package/build-module/components/inserter/index.native.js +7 -7
  313. package/build-module/components/inserter/index.native.js.map +1 -1
  314. package/build-module/components/inserter/menu.js.map +1 -1
  315. package/build-module/components/inserter/menu.native.js +3 -3
  316. package/build-module/components/inserter/menu.native.js.map +1 -1
  317. package/build-module/components/inserter/quick-inserter.js +20 -8
  318. package/build-module/components/inserter/quick-inserter.js.map +1 -1
  319. package/build-module/components/inserter/search-items.js +1 -1
  320. package/build-module/components/inserter/search-items.js.map +1 -1
  321. package/build-module/components/inserter/search-results.js +28 -11
  322. package/build-module/components/inserter/search-results.js.map +1 -1
  323. package/build-module/components/keyboard-shortcuts/index.js +1 -1
  324. package/build-module/components/keyboard-shortcuts/index.js.map +1 -1
  325. package/build-module/components/letter-spacing-control/index.js +3 -3
  326. package/build-module/components/letter-spacing-control/index.js.map +1 -1
  327. package/build-module/components/line-height-control/index.js +61 -45
  328. package/build-module/components/line-height-control/index.js.map +1 -1
  329. package/build-module/components/line-height-control/index.native.js +3 -1
  330. package/build-module/components/line-height-control/index.native.js.map +1 -1
  331. package/build-module/components/link-control/index.js +2 -2
  332. package/build-module/components/link-control/index.js.map +1 -1
  333. package/build-module/components/link-control/search-input.js +1 -1
  334. package/build-module/components/link-control/search-input.js.map +1 -1
  335. package/build-module/components/link-control/search-results.js +2 -2
  336. package/build-module/components/link-control/search-results.js.map +1 -1
  337. package/build-module/components/link-control/use-rich-url-data.js +1 -1
  338. package/build-module/components/link-control/use-rich-url-data.js.map +1 -1
  339. package/build-module/components/link-control/use-search-handler.js +2 -2
  340. package/build-module/components/link-control/use-search-handler.js.map +1 -1
  341. package/build-module/components/list-view/block-contents.js +8 -4
  342. package/build-module/components/list-view/block-contents.js.map +1 -1
  343. package/build-module/components/list-view/block-select-button.js +2 -2
  344. package/build-module/components/list-view/block-select-button.js.map +1 -1
  345. package/build-module/components/list-view/block.js +20 -9
  346. package/build-module/components/list-view/block.js.map +1 -1
  347. package/build-module/components/list-view/branch.js +2 -1
  348. package/build-module/components/list-view/branch.js.map +1 -1
  349. package/build-module/components/list-view/index.js +46 -42
  350. package/build-module/components/list-view/index.js.map +1 -1
  351. package/build-module/components/list-view/use-block-selection.js +123 -0
  352. package/build-module/components/list-view/use-block-selection.js.map +1 -0
  353. package/build-module/components/list-view/use-list-view-expand-selected-item.js +50 -0
  354. package/build-module/components/list-view/use-list-view-expand-selected-item.js.map +1 -0
  355. package/build-module/components/list-view/utils.js +25 -0
  356. package/build-module/components/list-view/utils.js.map +1 -1
  357. package/build-module/components/media-placeholder/index.native.js +7 -5
  358. package/build-module/components/media-placeholder/index.native.js.map +1 -1
  359. package/build-module/components/media-replace-flow/index.js +22 -27
  360. package/build-module/components/media-replace-flow/index.js.map +1 -1
  361. package/build-module/components/media-upload/index.native.js +4 -3
  362. package/build-module/components/media-upload/index.native.js.map +1 -1
  363. package/build-module/components/media-upload-progress/index.native.js +1 -1
  364. package/build-module/components/media-upload-progress/index.native.js.map +1 -1
  365. package/build-module/components/navigable-toolbar/index.js +3 -3
  366. package/build-module/components/navigable-toolbar/index.js.map +1 -1
  367. package/build-module/components/plain-text/index.native.js +3 -3
  368. package/build-module/components/plain-text/index.native.js.map +1 -1
  369. package/build-module/components/rich-text/format-toolbar-container.js +2 -2
  370. package/build-module/components/rich-text/format-toolbar-container.js.map +1 -1
  371. package/build-module/components/rich-text/format-toolbar-container.native.js +1 -1
  372. package/build-module/components/rich-text/format-toolbar-container.native.js.map +1 -1
  373. package/build-module/components/rich-text/index.js +7 -12
  374. package/build-module/components/rich-text/index.js.map +1 -1
  375. package/build-module/components/rich-text/index.native.js +3 -3
  376. package/build-module/components/rich-text/index.native.js.map +1 -1
  377. package/build-module/components/rich-text/use-paste-handler.js +6 -12
  378. package/build-module/components/rich-text/use-paste-handler.js.map +1 -1
  379. package/build-module/components/url-input/index.js +11 -11
  380. package/build-module/components/url-input/index.js.map +1 -1
  381. package/build-module/components/use-moving-animation/index.js +1 -1
  382. package/build-module/components/use-moving-animation/index.js.map +1 -1
  383. package/build-module/components/use-on-block-drop/index.js +2 -2
  384. package/build-module/components/use-on-block-drop/index.js.map +1 -1
  385. package/build-module/components/writing-flow/index.js +1 -0
  386. package/build-module/components/writing-flow/index.js.map +1 -1
  387. package/build-module/components/writing-flow/use-multi-selection.js +21 -21
  388. package/build-module/components/writing-flow/use-multi-selection.js.map +1 -1
  389. package/build-module/components/writing-flow/use-select-all.js +3 -2
  390. package/build-module/components/writing-flow/use-select-all.js.map +1 -1
  391. package/build-module/components/writing-flow/use-tab-nav.js +4 -3
  392. package/build-module/components/writing-flow/use-tab-nav.js.map +1 -1
  393. package/build-module/hooks/align.js +1 -1
  394. package/build-module/hooks/align.js.map +1 -1
  395. package/build-module/hooks/anchor.js +1 -1
  396. package/build-module/hooks/anchor.js.map +1 -1
  397. package/build-module/hooks/border.js +2 -14
  398. package/build-module/hooks/border.js.map +1 -1
  399. package/build-module/hooks/color.js +2 -2
  400. package/build-module/hooks/color.js.map +1 -1
  401. package/build-module/hooks/custom-class-name.js +38 -0
  402. package/build-module/hooks/custom-class-name.js.map +1 -1
  403. package/build-module/hooks/generated-class-name.js +3 -3
  404. package/build-module/hooks/generated-class-name.js.map +1 -1
  405. package/build-module/hooks/line-height.js +2 -0
  406. package/build-module/hooks/line-height.js.map +1 -1
  407. package/build-module/hooks/lock.js +1 -1
  408. package/build-module/hooks/lock.js.map +1 -1
  409. package/build-module/hooks/style.js +31 -13
  410. package/build-module/hooks/style.js.map +1 -1
  411. package/build-module/layouts/flow.js +7 -5
  412. package/build-module/layouts/flow.js.map +1 -1
  413. package/build-module/store/actions.js +52 -45
  414. package/build-module/store/actions.js.map +1 -1
  415. package/build-module/store/defaults.js +2 -1
  416. package/build-module/store/defaults.js.map +1 -1
  417. package/build-module/store/index.js +1 -2
  418. package/build-module/store/index.js.map +1 -1
  419. package/build-module/store/reducer.js +13 -13
  420. package/build-module/store/reducer.js.map +1 -1
  421. package/build-module/store/selectors.js +6 -6
  422. package/build-module/store/selectors.js.map +1 -1
  423. package/build-module/utils/index.js +0 -1
  424. package/build-module/utils/index.js.map +1 -1
  425. package/build-module/utils/parse-css-unit-to-px.js +3 -3
  426. package/build-module/utils/parse-css-unit-to-px.js.map +1 -1
  427. package/build-module/utils/pasting.js +80 -0
  428. package/build-module/utils/pasting.js.map +1 -0
  429. package/build-module/utils/transform-styles/ast/parse.js +5 -5
  430. package/build-module/utils/transform-styles/ast/parse.js.map +1 -1
  431. package/build-module/utils/transform-styles/transforms/url-rewrite.js +2 -2
  432. package/build-module/utils/transform-styles/transforms/url-rewrite.js.map +1 -1
  433. package/build-style/style-rtl.css +10 -12
  434. package/build-style/style.css +10 -12
  435. package/package.json +27 -26
  436. package/src/autocompleters/link.js +62 -0
  437. package/src/autocompleters/style.scss +8 -0
  438. package/src/components/alignment-control/test/index.js +2 -2
  439. package/src/components/autocomplete/index.js +2 -0
  440. package/src/components/block-actions/index.js +1 -1
  441. package/src/components/block-alignment-control/test/index.js +1 -1
  442. package/src/components/block-breadcrumb/index.js +5 -2
  443. package/src/components/block-compare/index.js +2 -2
  444. package/src/components/block-controls/index.js +1 -1
  445. package/src/components/block-draggable/index.js +1 -1
  446. package/src/components/block-draggable/stories/index.js +1 -1
  447. package/src/components/block-edit/edit.js +1 -1
  448. package/src/components/block-list/block-html.js +1 -1
  449. package/src/components/block-list/block-invalid-warning.js +1 -1
  450. package/src/components/block-list/block-list-item.native.js +4 -4
  451. package/src/components/block-list/block-selection-button.native.js +3 -3
  452. package/src/components/block-list/block.js +28 -4
  453. package/src/components/block-list/block.native.js +7 -6
  454. package/src/components/block-list/index.native.js +5 -5
  455. package/src/components/block-list/style.scss +3 -1
  456. package/src/components/block-list/use-block-props/use-block-class-names.js +1 -1
  457. package/src/components/block-list/use-block-props/use-focus-first-element.js +3 -0
  458. package/src/components/block-list/use-block-props/use-multi-selection.js +22 -30
  459. package/src/components/block-media-update-progress/index.native.js +4 -4
  460. package/src/components/block-media-update-progress/test/index.native.js +2 -2
  461. package/src/components/block-mobile-toolbar/block-actions-menu.native.js +3 -3
  462. package/src/components/block-mobile-toolbar/index.native.js +2 -2
  463. package/src/components/block-mover/mover-description.js +4 -4
  464. package/src/components/block-mover/mover-description.native.js +5 -5
  465. package/src/components/block-settings/container.native.js +5 -6
  466. package/src/components/block-settings-menu/block-settings-dropdown.js +7 -8
  467. package/src/components/block-styles/preview.native.js +1 -1
  468. package/src/components/block-switcher/index.js +4 -1
  469. package/src/components/block-switcher/use-transformed-patterns.js +0 -1
  470. package/src/components/block-title/README.md +17 -1
  471. package/src/components/block-title/index.js +7 -62
  472. package/src/components/block-title/test/index.js +21 -3
  473. package/src/components/block-title/use-block-display-title.js +83 -0
  474. package/src/components/block-toolbar/utils.js +12 -2
  475. package/src/components/block-tools/block-popover.js +1 -1
  476. package/src/components/block-tools/block-selection-button.js +4 -1
  477. package/src/components/block-types-list/index.native.js +1 -1
  478. package/src/components/border-radius-control/index.js +5 -3
  479. package/src/components/border-radius-control/test/utils.js +10 -10
  480. package/src/components/border-radius-control/utils.js +10 -8
  481. package/src/components/contrast-checker/index.js +3 -3
  482. package/src/components/convert-to-group-buttons/index.js +1 -1
  483. package/src/components/convert-to-group-buttons/use-convert-to-group-button-props.js +1 -6
  484. package/src/components/copy-handler/index.js +2 -2
  485. package/src/components/font-sizes/with-font-sizes.js +3 -3
  486. package/src/components/image-size-control/test/index.js +1 -1
  487. package/src/components/index.js +1 -0
  488. package/src/components/index.native.js +11 -4
  489. package/src/components/inserter/block-patterns-tab.js +13 -17
  490. package/src/components/inserter/block-types-tab.js +1 -1
  491. package/src/components/inserter/hooks/use-block-type-impressions.native.js +2 -2
  492. package/src/components/inserter/index.js +3 -3
  493. package/src/components/inserter/index.native.js +7 -7
  494. package/src/components/inserter/menu.js +1 -1
  495. package/src/components/inserter/menu.native.js +3 -3
  496. package/src/components/inserter/quick-inserter.js +32 -10
  497. package/src/components/inserter/search-items.js +1 -1
  498. package/src/components/inserter/search-results.js +55 -43
  499. package/src/components/inserter/test/fixtures/index.native.js +1 -1
  500. package/src/components/inserter/test/reusable-blocks-tab.js +2 -2
  501. package/src/components/justify-content-control/README.md +1 -1
  502. package/src/components/keyboard-shortcuts/index.js +1 -1
  503. package/src/components/letter-spacing-control/index.js +1 -1
  504. package/src/components/line-height-control/README.md +13 -2
  505. package/src/components/line-height-control/index.js +66 -43
  506. package/src/components/line-height-control/index.native.js +2 -0
  507. package/src/components/line-height-control/stories/index.js +33 -0
  508. package/src/components/line-height-control/test/index.js +61 -0
  509. package/src/components/link-control/index.js +2 -2
  510. package/src/components/link-control/search-input.js +1 -1
  511. package/src/components/link-control/search-results.js +2 -2
  512. package/src/components/link-control/test/index.js +142 -144
  513. package/src/components/link-control/use-rich-url-data.js +1 -1
  514. package/src/components/link-control/use-search-handler.js +2 -2
  515. package/src/components/list-view/README.md +2 -2
  516. package/src/components/list-view/block-contents.js +10 -3
  517. package/src/components/list-view/block-select-button.js +1 -2
  518. package/src/components/list-view/block.js +30 -10
  519. package/src/components/list-view/branch.js +1 -0
  520. package/src/components/list-view/index.js +56 -30
  521. package/src/components/list-view/test/utils.js +50 -0
  522. package/src/components/list-view/use-block-selection.js +163 -0
  523. package/src/components/list-view/use-list-view-expand-selected-item.js +58 -0
  524. package/src/components/list-view/utils.js +31 -0
  525. package/src/components/media-placeholder/index.native.js +11 -9
  526. package/src/components/media-replace-flow/README.md +7 -0
  527. package/src/components/media-replace-flow/index.js +20 -26
  528. package/src/components/media-replace-flow/test/index.js +100 -0
  529. package/src/components/media-upload/index.native.js +3 -2
  530. package/src/components/media-upload-progress/index.native.js +1 -1
  531. package/src/components/navigable-toolbar/index.js +3 -3
  532. package/src/components/plain-text/index.native.js +3 -3
  533. package/src/components/responsive-block-control/test/index.js +6 -6
  534. package/src/components/rich-text/format-toolbar-container.js +2 -2
  535. package/src/components/rich-text/format-toolbar-container.native.js +1 -1
  536. package/src/components/rich-text/index.js +7 -14
  537. package/src/components/rich-text/index.native.js +3 -3
  538. package/src/components/rich-text/use-paste-handler.js +7 -14
  539. package/src/components/url-input/index.js +11 -11
  540. package/src/components/use-block-drop-zone/test/index.js +1 -1
  541. package/src/components/use-moving-animation/index.js +1 -1
  542. package/src/components/use-on-block-drop/index.js +2 -2
  543. package/src/components/writing-flow/index.js +1 -0
  544. package/src/components/writing-flow/use-multi-selection.js +17 -20
  545. package/src/components/writing-flow/use-select-all.js +6 -2
  546. package/src/components/writing-flow/use-tab-nav.js +6 -3
  547. package/src/hooks/align.js +1 -1
  548. package/src/hooks/anchor.js +1 -1
  549. package/src/hooks/border.js +8 -19
  550. package/src/hooks/color.js +2 -2
  551. package/src/hooks/custom-class-name.js +45 -0
  552. package/src/hooks/generated-class-name.js +3 -3
  553. package/src/hooks/line-height.js +2 -0
  554. package/src/hooks/lock.js +1 -1
  555. package/src/hooks/style.js +31 -13
  556. package/src/hooks/test/align.js +1 -1
  557. package/src/hooks/typography.scss +0 -4
  558. package/src/layouts/flow.js +10 -5
  559. package/src/store/actions.js +24 -14
  560. package/src/store/defaults.js +2 -2
  561. package/src/store/index.js +0 -1
  562. package/src/store/reducer.js +13 -12
  563. package/src/store/selectors.js +6 -6
  564. package/src/store/test/actions.js +2 -2
  565. package/src/store/test/reducer.js +10 -1
  566. package/src/store/test/selectors.js +1 -1
  567. package/src/style.scss +0 -1
  568. package/src/utils/index.js +0 -1
  569. package/src/utils/parse-css-unit-to-px.js +3 -3
  570. package/src/utils/pasting.js +77 -0
  571. package/src/utils/test/parse-css-unit-to-px.js +5 -5
  572. package/src/utils/test/pasting.js +84 -0
  573. package/src/utils/transform-styles/ast/parse.js +5 -5
  574. package/src/utils/transform-styles/transforms/url-rewrite.js +2 -2
  575. package/build/utils/get-paste-event-data.js +0 -56
  576. package/build/utils/get-paste-event-data.js.map +0 -1
  577. package/build/utils/theme.js +0 -63
  578. package/build/utils/theme.js.map +0 -1
  579. package/build-module/utils/get-paste-event-data.js +0 -47
  580. package/build-module/utils/get-paste-event-data.js.map +0 -1
  581. package/build-module/utils/theme.js +0 -53
  582. package/build-module/utils/theme.js.map +0 -1
  583. package/src/components/line-height-control/style.scss +0 -8
  584. package/src/components/writing-flow/test/use-multi-selection.js +0 -36
  585. package/src/utils/get-paste-event-data.js +0 -42
  586. package/src/utils/theme.js +0 -48
@@ -80,7 +80,7 @@ function useRemoteUrlData( url ) {
80
80
  } );
81
81
  }
82
82
  } );
83
- // Cleanup: when the URL changes the abort the current request
83
+ // Cleanup: when the URL changes the abort the current request.
84
84
  return () => {
85
85
  controller.abort();
86
86
  };
@@ -115,8 +115,8 @@ const handleEntitySearch = async (
115
115
  // the `id` prop is intentionally ommitted here because it
116
116
  // is never exposed as part of the component's public API.
117
117
  // see: https://github.com/WordPress/gutenberg/pull/19775#discussion_r378931316.
118
- title: val, // must match the existing `<input>`s text value
119
- url: val, // must match the existing `<input>`s text value
118
+ title: val, // Must match the existing `<input>`s text value.
119
+ url: val, // Must match the existing `<input>`s text value.
120
120
  type: CREATE_TYPE,
121
121
  } );
122
122
  };
@@ -4,7 +4,7 @@ The ListView component provides an overview of the hierarchical structure of all
4
4
 
5
5
  Blocks that have child blocks (such as group or column blocks) are presented with the parent at the top and the nested children below.
6
6
 
7
- In addition to presenting the structure of the blocks in the editor, the ListView component lets users navigate to each block by clicking on its line in the hierarchy tree.
7
+ In addition to presenting the structure of the blocks in the editor, the ListView component lets users navigate to each block by clicking on its line in the hierarchy tree. Multiple blocks at the same level of nesting can be selected by holding down the `SHIFT` key and clicking blocks within the list.
8
8
 
9
9
  ![List view](https://make.wordpress.org/core/files/2020/08/block-navigation.png)
10
10
  ![View of a group list view](https://make.wordpress.org/core/files/2020/08/view-of-group-block-navigation.png)
@@ -23,7 +23,7 @@ Renders a list view with default syles.
23
23
  ```jsx
24
24
  import { ListView } from '@wordpress/block-editor';
25
25
 
26
- const MyNavigation = () => <ListView onSelect={ onClose } />;
26
+ const MyNavigation = () => <ListView />;
27
27
  ```
28
28
 
29
29
  ## Related components
@@ -27,6 +27,7 @@ const ListViewBlockContents = forwardRef(
27
27
  siblingBlockCount,
28
28
  level,
29
29
  isExpanded,
30
+ selectedClientIds,
30
31
  ...props
31
32
  },
32
33
  ref
@@ -36,12 +37,10 @@ const ListViewBlockContents = forwardRef(
36
37
  const { blockMovingClientId, selectedBlockInBlockEditor } = useSelect(
37
38
  ( select ) => {
38
39
  const {
39
- getBlockRootClientId,
40
40
  hasBlockMovingClientId,
41
41
  getSelectedBlockClientId,
42
42
  } = select( blockEditorStore );
43
43
  return {
44
- rootClientId: getBlockRootClientId( clientId ) || '',
45
44
  blockMovingClientId: hasBlockMovingClientId(),
46
45
  selectedBlockInBlockEditor: getSelectedBlockClientId(),
47
46
  };
@@ -56,8 +55,16 @@ const ListViewBlockContents = forwardRef(
56
55
  'is-dropping-before': isBlockMoveTarget,
57
56
  } );
58
57
 
58
+ // Only include all selected blocks if the currently clicked on block
59
+ // is one of the selected blocks. This ensures that if a user attempts
60
+ // to drag a block that isn't part of the selection, they're still able
61
+ // to drag it and rearrange its position.
62
+ const draggableClientIds = selectedClientIds.includes( clientId )
63
+ ? selectedClientIds
64
+ : [ clientId ];
65
+
59
66
  return (
60
- <BlockDraggable clientIds={ [ block.clientId ] }>
67
+ <BlockDraggable clientIds={ draggableClientIds }>
61
68
  { ( { draggable, onDragStart, onDragEnd } ) => (
62
69
  <ListViewBlockSelectButton
63
70
  ref={ ref }
@@ -60,7 +60,6 @@ function ListViewBlockSelectButton(
60
60
 
61
61
  function onKeyDownHandler( event ) {
62
62
  if ( event.keyCode === ENTER || event.keyCode === SPACE ) {
63
- event.preventDefault();
64
63
  onClick( event );
65
64
  }
66
65
  }
@@ -86,7 +85,7 @@ function ListViewBlockSelectButton(
86
85
  >
87
86
  <ListViewExpander onClick={ onToggleExpanded } />
88
87
  <BlockIcon icon={ blockInformation?.icon } showColors />
89
- <BlockTitle clientId={ clientId } />
88
+ <BlockTitle clientId={ clientId } maximumLength={ 35 } />
90
89
  { blockInformation?.anchor && (
91
90
  <span className="block-editor-list-view-block-select-button__anchor">
92
91
  { blockInformation.anchor }
@@ -48,6 +48,7 @@ function ListViewBlock( {
48
48
  showBlockMovers,
49
49
  path,
50
50
  isExpanded,
51
+ selectedClientIds,
51
52
  } ) {
52
53
  const cellRef = useRef( null );
53
54
  const [ isHovered, setIsHovered ] = useState( false );
@@ -104,14 +105,22 @@ function ListViewBlock( {
104
105
 
105
106
  const selectEditorBlock = useCallback(
106
107
  ( event ) => {
107
- event.stopPropagation();
108
- selectBlock( clientId );
108
+ selectBlock( event, clientId );
109
109
  },
110
110
  [ clientId, selectBlock ]
111
111
  );
112
112
 
113
+ const selectDuplicatedBlock = useCallback(
114
+ ( newClientId ) => {
115
+ selectBlock( undefined, newClientId );
116
+ },
117
+ [ selectBlock ]
118
+ );
119
+
113
120
  const toggleExpanded = useCallback(
114
121
  ( event ) => {
122
+ // Prevent shift+click from opening link in a new window when toggling.
123
+ event.preventDefault();
115
124
  event.stopPropagation();
116
125
  if ( isExpanded === true ) {
117
126
  collapse( clientId );
@@ -124,7 +133,7 @@ function ListViewBlock( {
124
133
 
125
134
  const showBlockActions =
126
135
  withExperimentalFeatures &&
127
- //hide actions for blocks like core/widget-areas
136
+ // hide actions for blocks like core/widget-areas
128
137
  ( ! hideContainerBlockActions ||
129
138
  ( hideContainerBlockActions && level > 1 ) );
130
139
 
@@ -146,11 +155,21 @@ function ListViewBlock( {
146
155
  } );
147
156
 
148
157
  const blockInformation = useBlockDisplayInformation( clientId );
149
- const settingsAriaLabel = sprintf(
150
- // translators: %s: The title of the block.
151
- __( 'Options for %s block' ),
152
- blockInformation.title
153
- );
158
+ const settingsAriaLabel = blockInformation
159
+ ? sprintf(
160
+ // translators: %s: The title of the block.
161
+ __( 'Options for %s block' ),
162
+ blockInformation.title
163
+ )
164
+ : __( 'Options' );
165
+
166
+ // Only include all selected blocks if the currently clicked on block
167
+ // is one of the selected blocks. This ensures that if a user attempts
168
+ // to alter a block that isn't part of the selection, they're still able
169
+ // to do so.
170
+ const dropdownClientIds = selectedClientIds.includes( clientId )
171
+ ? selectedClientIds
172
+ : [ clientId ];
154
173
 
155
174
  return (
156
175
  <ListViewLeaf
@@ -186,6 +205,7 @@ function ListViewBlock( {
186
205
  tabIndex={ tabIndex }
187
206
  onFocus={ onFocus }
188
207
  isExpanded={ isExpanded }
208
+ selectedClientIds={ selectedClientIds }
189
209
  />
190
210
  </div>
191
211
  ) }
@@ -226,7 +246,7 @@ function ListViewBlock( {
226
246
  <TreeGridCell className={ listViewBlockSettingsClassName }>
227
247
  { ( { ref, tabIndex, onFocus } ) => (
228
248
  <BlockSettingsDropdown
229
- clientIds={ [ clientId ] }
249
+ clientIds={ dropdownClientIds }
230
250
  icon={ moreVertical }
231
251
  label={ settingsAriaLabel }
232
252
  toggleProps={ {
@@ -236,7 +256,7 @@ function ListViewBlock( {
236
256
  onFocus,
237
257
  } }
238
258
  disableOpenOnArrowDown
239
- __experimentalSelectBlock={ selectEditorBlock }
259
+ __experimentalSelectBlock={ selectDuplicatedBlock }
240
260
  />
241
261
  ) }
242
262
  </TreeGridCell>
@@ -145,6 +145,7 @@ function ListViewBranch( props ) {
145
145
  path={ updatedPath }
146
146
  isExpanded={ isExpanded }
147
147
  listPosition={ nextPosition }
148
+ selectedClientIds={ selectedClientIds }
148
149
  />
149
150
  ) }
150
151
  { ! showBlock && (
@@ -6,7 +6,7 @@ import {
6
6
  __experimentalUseFixedWindowList as useFixedWindowList,
7
7
  } from '@wordpress/compose';
8
8
  import { __experimentalTreeGrid as TreeGrid } from '@wordpress/components';
9
- import { AsyncModeProvider, useDispatch, useSelect } from '@wordpress/data';
9
+ import { AsyncModeProvider, useSelect } from '@wordpress/data';
10
10
  import {
11
11
  useCallback,
12
12
  useEffect,
@@ -23,41 +23,47 @@ import { __ } from '@wordpress/i18n';
23
23
  import ListViewBranch from './branch';
24
24
  import { ListViewContext } from './context';
25
25
  import ListViewDropIndicator from './drop-indicator';
26
+ import useBlockSelection from './use-block-selection';
26
27
  import useListViewClientIds from './use-list-view-client-ids';
27
28
  import useListViewDropZone from './use-list-view-drop-zone';
29
+ import useListViewExpandSelectedItem from './use-list-view-expand-selected-item';
28
30
  import { store as blockEditorStore } from '../../store';
29
31
 
30
- const noop = () => {};
31
32
  const expanded = ( state, action ) => {
32
- switch ( action.type ) {
33
- case 'expand':
34
- return { ...state, ...{ [ action.clientId ]: true } };
35
- case 'collapse':
36
- return { ...state, ...{ [ action.clientId ]: false } };
37
- default:
38
- return state;
33
+ if ( Array.isArray( action.clientIds ) ) {
34
+ return {
35
+ ...state,
36
+ ...action.clientIds.reduce(
37
+ ( newState, id ) => ( {
38
+ ...newState,
39
+ [ id ]: action.type === 'expand',
40
+ } ),
41
+ {}
42
+ ),
43
+ };
39
44
  }
45
+ return state;
40
46
  };
41
47
 
48
+ export const BLOCK_LIST_ITEM_HEIGHT = 36;
49
+
42
50
  /**
43
51
  * Wrap `ListViewRows` with `TreeGrid`. ListViewRows is a
44
52
  * recursive component (it renders itself), so this ensures TreeGrid is only
45
53
  * present at the very top of the navigation grid.
46
54
  *
47
- * @param {Object} props Components props.
48
- * @param {Array} props.blocks Custom subset of block client IDs to be used instead of the default hierarchy.
49
- * @param {Function} props.onSelect Block selection callback.
50
- * @param {boolean} props.showNestedBlocks Flag to enable displaying nested blocks.
51
- * @param {boolean} props.showBlockMovers Flag to enable block movers
52
- * @param {boolean} props.__experimentalFeatures Flag to enable experimental features.
53
- * @param {boolean} props.__experimentalPersistentListViewFeatures Flag to enable features for the Persistent List View experiment.
54
- * @param {boolean} props.__experimentalHideContainerBlockActions Flag to hide actions of top level blocks (like core/widget-area)
55
- * @param {Object} ref Forwarded ref
55
+ * @param {Object} props Components props.
56
+ * @param {Array} props.blocks Custom subset of block client IDs to be used instead of the default hierarchy.
57
+ * @param {boolean} props.showNestedBlocks Flag to enable displaying nested blocks.
58
+ * @param {boolean} props.showBlockMovers Flag to enable block movers
59
+ * @param {boolean} props.__experimentalFeatures Flag to enable experimental features.
60
+ * @param {boolean} props.__experimentalPersistentListViewFeatures Flag to enable features for the Persistent List View experiment.
61
+ * @param {boolean} props.__experimentalHideContainerBlockActions Flag to hide actions of top level blocks (like core/widget-area)
62
+ * @param {Object} ref Forwarded ref
56
63
  */
57
64
  function ListView(
58
65
  {
59
66
  blocks,
60
- onSelect = noop,
61
67
  __experimentalFeatures,
62
68
  __experimentalPersistentListViewFeatures,
63
69
  __experimentalHideContainerBlockActions,
@@ -72,7 +78,7 @@ function ListView(
72
78
  draggedClientIds,
73
79
  selectedClientIds,
74
80
  } = useListViewClientIds( blocks );
75
- const { selectBlock } = useDispatch( blockEditorStore );
81
+
76
82
  const { visibleBlockCount } = useSelect(
77
83
  ( select ) => {
78
84
  const { getGlobalBlockCount, getClientIdsOfDescendants } = select(
@@ -88,13 +94,9 @@ function ListView(
88
94
  },
89
95
  [ draggedClientIds ]
90
96
  );
91
- const selectEditorBlock = useCallback(
92
- ( clientId ) => {
93
- selectBlock( clientId );
94
- onSelect( clientId );
95
- },
96
- [ selectBlock, onSelect ]
97
- );
97
+
98
+ const { updateBlockSelection } = useBlockSelection();
99
+
98
100
  const [ expandedState, setExpandedState ] = useReducer( expanded, {} );
99
101
 
100
102
  const { ref: dropZoneRef, target: blockDropTarget } = useListViewDropZone();
@@ -102,6 +104,17 @@ function ListView(
102
104
  const treeGridRef = useMergeRefs( [ elementRef, dropZoneRef, ref ] );
103
105
 
104
106
  const isMounted = useRef( false );
107
+ const { setSelectedTreeId } = useListViewExpandSelectedItem( {
108
+ firstSelectedBlockClientId: selectedClientIds[ 0 ],
109
+ setExpandedState,
110
+ } );
111
+ const selectEditorBlock = useCallback(
112
+ ( event, clientId ) => {
113
+ updateBlockSelection( event, clientId );
114
+ setSelectedTreeId( clientId );
115
+ },
116
+ [ setSelectedTreeId, updateBlockSelection ]
117
+ );
105
118
  useEffect( () => {
106
119
  isMounted.current = true;
107
120
  }, [] );
@@ -111,7 +124,7 @@ function ListView(
111
124
  // See: https://github.com/WordPress/gutenberg/pull/35230 for additional context.
112
125
  const [ fixedListWindow ] = useFixedWindowList(
113
126
  elementRef,
114
- 36,
127
+ BLOCK_LIST_ITEM_HEIGHT,
115
128
  visibleBlockCount,
116
129
  {
117
130
  useWindowing: __experimentalPersistentListViewFeatures,
@@ -124,7 +137,7 @@ function ListView(
124
137
  if ( ! clientId ) {
125
138
  return;
126
139
  }
127
- setExpandedState( { type: 'expand', clientId } );
140
+ setExpandedState( { type: 'expand', clientIds: [ clientId ] } );
128
141
  },
129
142
  [ setExpandedState ]
130
143
  );
@@ -133,7 +146,7 @@ function ListView(
133
146
  if ( ! clientId ) {
134
147
  return;
135
148
  }
136
- setExpandedState( { type: 'collapse', clientId } );
149
+ setExpandedState( { type: 'collapse', clientIds: [ clientId ] } );
137
150
  },
138
151
  [ setExpandedState ]
139
152
  );
@@ -149,6 +162,18 @@ function ListView(
149
162
  },
150
163
  [ collapse ]
151
164
  );
165
+ const focusRow = useCallback(
166
+ ( event, startRow, endRow ) => {
167
+ if ( event.shiftKey ) {
168
+ updateBlockSelection(
169
+ event,
170
+ startRow?.dataset?.block,
171
+ endRow?.dataset?.block
172
+ );
173
+ }
174
+ },
175
+ [ updateBlockSelection ]
176
+ );
152
177
 
153
178
  const contextValue = useMemo(
154
179
  () => ( {
@@ -185,6 +210,7 @@ function ListView(
185
210
  ref={ treeGridRef }
186
211
  onCollapseRow={ collapseRow }
187
212
  onExpandRow={ expandRow }
213
+ onFocusRow={ focusRow }
188
214
  >
189
215
  <ListViewContext.Provider value={ contextValue }>
190
216
  <ListViewBranch
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { getCommonDepthClientIds } from '../utils';
5
+
6
+ describe( 'getCommonDepthClientIds', () => {
7
+ it( 'should return start and end when no depth is provided', () => {
8
+ const result = getCommonDepthClientIds(
9
+ 'start-id',
10
+ 'clicked-id',
11
+ [],
12
+ []
13
+ );
14
+
15
+ expect( result ).toEqual( { start: 'start-id', end: 'clicked-id' } );
16
+ } );
17
+
18
+ it( 'should return deepest start and end when depths match', () => {
19
+ const result = getCommonDepthClientIds(
20
+ 'start-id',
21
+ 'clicked-id',
22
+ [ 'start-1', 'start-2', 'start-3' ],
23
+ [ 'end-1', 'end-2', 'end-3' ]
24
+ );
25
+
26
+ expect( result ).toEqual( { start: 'start-id', end: 'clicked-id' } );
27
+ } );
28
+
29
+ it( 'should return shallower ids when start is shallower', () => {
30
+ const result = getCommonDepthClientIds(
31
+ 'start-id',
32
+ 'clicked-id',
33
+ [ 'start-1' ],
34
+ [ 'end-1', 'end-2', 'end-3' ]
35
+ );
36
+
37
+ expect( result ).toEqual( { start: 'start-id', end: 'end-2' } );
38
+ } );
39
+
40
+ it( 'should return shallower ids when end is shallower', () => {
41
+ const result = getCommonDepthClientIds(
42
+ 'start-id',
43
+ 'clicked-id',
44
+ [ 'start-1', 'start-2', 'start-3' ],
45
+ [ 'end-1', 'end-2' ]
46
+ );
47
+
48
+ expect( result ).toEqual( { start: 'start-3', end: 'clicked-id' } );
49
+ } );
50
+ } );
@@ -0,0 +1,163 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { difference } from 'lodash';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { speak } from '@wordpress/a11y';
10
+ import { __, sprintf } from '@wordpress/i18n';
11
+ import { useDispatch, useSelect } from '@wordpress/data';
12
+ import { useCallback } from '@wordpress/element';
13
+ import { UP, DOWN } from '@wordpress/keycodes';
14
+ import { store as blocksStore } from '@wordpress/blocks';
15
+
16
+ /**
17
+ * Internal dependencies
18
+ */
19
+ import { store as blockEditorStore } from '../../store';
20
+ import { getCommonDepthClientIds } from './utils';
21
+
22
+ export default function useBlockSelection() {
23
+ const { clearSelectedBlock, multiSelect, selectBlock } = useDispatch(
24
+ blockEditorStore
25
+ );
26
+ const {
27
+ getBlockName,
28
+ getBlockParents,
29
+ getBlockSelectionStart,
30
+ getBlockSelectionEnd,
31
+ getSelectedBlockClientIds,
32
+ hasMultiSelection,
33
+ hasSelectedBlock,
34
+ } = useSelect( blockEditorStore );
35
+
36
+ const { getBlockType } = useSelect( blocksStore );
37
+
38
+ const updateBlockSelection = useCallback(
39
+ async ( event, clientId, destinationClientId ) => {
40
+ if ( ! event?.shiftKey ) {
41
+ await clearSelectedBlock();
42
+ selectBlock( clientId );
43
+ return;
44
+ }
45
+
46
+ // To handle multiple block selection via the `SHIFT` key, prevent
47
+ // the browser default behavior of opening the link in a new window.
48
+ event.preventDefault();
49
+
50
+ const isKeyPress =
51
+ event.type === 'keydown' &&
52
+ ( event.keyCode === UP || event.keyCode === DOWN );
53
+
54
+ // Handle clicking on a block when no blocks are selected, and return early.
55
+ if (
56
+ ! isKeyPress &&
57
+ ! hasSelectedBlock() &&
58
+ ! hasMultiSelection()
59
+ ) {
60
+ selectBlock( clientId, null );
61
+ return;
62
+ }
63
+
64
+ const selectedBlocks = getSelectedBlockClientIds();
65
+ const clientIdWithParents = [
66
+ ...getBlockParents( clientId ),
67
+ clientId,
68
+ ];
69
+
70
+ if (
71
+ isKeyPress &&
72
+ ! selectedBlocks.some( ( blockId ) =>
73
+ clientIdWithParents.includes( blockId )
74
+ )
75
+ ) {
76
+ // Ensure that shift-selecting blocks via the keyboard only
77
+ // expands the current selection if focusing over already
78
+ // selected blocks. Otherwise, clear the selection so that
79
+ // a user can create a new selection entirely by keyboard.
80
+ await clearSelectedBlock();
81
+ }
82
+
83
+ let startTarget = getBlockSelectionStart();
84
+ let endTarget = clientId;
85
+
86
+ // Handle keyboard behavior for selecting multiple blocks.
87
+ if ( isKeyPress ) {
88
+ if ( ! hasSelectedBlock() && ! hasMultiSelection() ) {
89
+ // Set the starting point of the selection to the currently
90
+ // focused block, if there are no blocks currently selected.
91
+ // This ensures that as the selection is expanded or contracted,
92
+ // the starting point of the selection is anchored to that block.
93
+ startTarget = clientId;
94
+ }
95
+ if ( destinationClientId ) {
96
+ // If the user presses UP or DOWN, we want to ensure that the block they're
97
+ // moving to is the target for selection, and not the currently focused one.
98
+ endTarget = destinationClientId;
99
+ }
100
+ }
101
+
102
+ const startParents = getBlockParents( startTarget );
103
+ const endParents = getBlockParents( endTarget );
104
+
105
+ const { start, end } = getCommonDepthClientIds(
106
+ startTarget,
107
+ endTarget,
108
+ startParents,
109
+ endParents
110
+ );
111
+ await multiSelect( start, end, null );
112
+
113
+ // Announce deselected block, or number of deselected blocks if
114
+ // the total number of blocks deselected is greater than one.
115
+ const updatedSelectedBlocks = getSelectedBlockClientIds();
116
+
117
+ const selectionDiff = difference(
118
+ selectedBlocks,
119
+ updatedSelectedBlocks
120
+ );
121
+
122
+ let label;
123
+ if ( selectionDiff.length === 1 ) {
124
+ const title = getBlockType( getBlockName( selectionDiff[ 0 ] ) )
125
+ ?.title;
126
+ if ( title ) {
127
+ label = sprintf(
128
+ /* translators: %s: block name */
129
+ __( '%s deselected.' ),
130
+ title
131
+ );
132
+ }
133
+ } else if ( selectionDiff.length > 1 ) {
134
+ label = sprintf(
135
+ /* translators: %s: number of deselected blocks */
136
+ __( '%s blocks deselected.' ),
137
+ selectionDiff.length
138
+ );
139
+ }
140
+
141
+ if ( label ) {
142
+ speak( label );
143
+ }
144
+ },
145
+ [
146
+ clearSelectedBlock,
147
+ getBlockName,
148
+ getBlockType,
149
+ getBlockParents,
150
+ getBlockSelectionStart,
151
+ getBlockSelectionEnd,
152
+ getSelectedBlockClientIds,
153
+ hasMultiSelection,
154
+ hasSelectedBlock,
155
+ multiSelect,
156
+ selectBlock,
157
+ ]
158
+ );
159
+
160
+ return {
161
+ updateBlockSelection,
162
+ };
163
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useEffect, useState } from '@wordpress/element';
5
+ import { useSelect } from '@wordpress/data';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import { store as blockEditorStore } from '../../store';
11
+
12
+ export default function useListViewExpandSelectedItem( {
13
+ firstSelectedBlockClientId,
14
+ setExpandedState,
15
+ } ) {
16
+ const [ selectedTreeId, setSelectedTreeId ] = useState( null );
17
+ const { selectedBlockParentClientIds } = useSelect(
18
+ ( select ) => {
19
+ const { getBlockParents } = select( blockEditorStore );
20
+ return {
21
+ selectedBlockParentClientIds: getBlockParents(
22
+ firstSelectedBlockClientId,
23
+ false
24
+ ),
25
+ };
26
+ },
27
+ [ firstSelectedBlockClientId ]
28
+ );
29
+
30
+ const parentClientIds =
31
+ Array.isArray( selectedBlockParentClientIds ) &&
32
+ selectedBlockParentClientIds.length
33
+ ? selectedBlockParentClientIds
34
+ : null;
35
+
36
+ // Expand tree when a block is selected.
37
+ useEffect( () => {
38
+ // If the selectedTreeId is the same as the selected block,
39
+ // it means that the block was selected using the block list tree.
40
+ if ( selectedTreeId === firstSelectedBlockClientId ) {
41
+ return;
42
+ }
43
+
44
+ // If the selected block has parents, get the top-level parent.
45
+ if ( parentClientIds ) {
46
+ // If the selected block has parents,
47
+ // expand the tree branch.
48
+ setExpandedState( {
49
+ type: 'expand',
50
+ clientIds: selectedBlockParentClientIds,
51
+ } );
52
+ }
53
+ }, [ firstSelectedBlockClientId ] );
54
+
55
+ return {
56
+ setSelectedTreeId,
57
+ };
58
+ }
@@ -30,3 +30,34 @@ export const isClientIdSelected = ( clientId, selectedBlockClientIds ) =>
30
30
  isArray( selectedBlockClientIds ) && selectedBlockClientIds.length
31
31
  ? selectedBlockClientIds.indexOf( clientId ) !== -1
32
32
  : selectedBlockClientIds === clientId;
33
+
34
+ /**
35
+ * From a start and end clientId of potentially different nesting levels,
36
+ * return the nearest-depth ids that have a common level of depth in the
37
+ * nesting hierarchy. For multiple block selection, this ensure that the
38
+ * selection is always at the same nesting level, and not split across
39
+ * separate levels.
40
+ *
41
+ * @param {string} startId The first id of a selection.
42
+ * @param {string} endId The end id of a selection, usually one that has been clicked on.
43
+ * @param {string[]} startParents An array of ancestor ids for the start id, in descending order.
44
+ * @param {string[]} endParents An array of ancestor ids for the end id, in descending order.
45
+ * @return {Object} An object containing the start and end ids.
46
+ */
47
+ export function getCommonDepthClientIds(
48
+ startId,
49
+ endId,
50
+ startParents,
51
+ endParents
52
+ ) {
53
+ const startPath = [ ...startParents, startId ];
54
+ const endPath = [ ...endParents, endId ];
55
+ const depth = Math.min( startPath.length, endPath.length ) - 1;
56
+ const start = startPath[ depth ];
57
+ const end = endPath[ depth ];
58
+
59
+ return {
60
+ start,
61
+ end,
62
+ };
63
+ }