@wordpress/block-editor 9.4.0 → 9.7.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 (483) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +1 -8
  3. package/build/components/block-list/block-invalid-warning.native.js +54 -6
  4. package/build/components/block-list/block-invalid-warning.native.js.map +1 -1
  5. package/build/components/block-list/block.js +14 -4
  6. package/build/components/block-list/block.js.map +1 -1
  7. package/build/components/block-list/block.native.js +2 -1
  8. package/build/components/block-list/block.native.js.map +1 -1
  9. package/build/components/block-list/index.native.js +5 -4
  10. package/build/components/block-list/index.native.js.map +1 -1
  11. package/build/components/block-list/layout.js +20 -5
  12. package/build/components/block-list/layout.js.map +1 -1
  13. package/build/components/block-list/use-block-props/use-block-class-names.js +5 -2
  14. package/build/components/block-list/use-block-props/use-block-class-names.js.map +1 -1
  15. package/build/components/block-lock/modal.js +37 -7
  16. package/build/components/block-lock/modal.js.map +1 -1
  17. package/build/components/block-mobile-toolbar/block-actions-menu.native.js +1 -1
  18. package/build/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  19. package/build/components/block-mover/mover-description.js +95 -32
  20. package/build/components/block-mover/mover-description.js.map +1 -1
  21. package/build/components/block-pattern-setup/index.js +5 -17
  22. package/build/components/block-pattern-setup/index.js.map +1 -1
  23. package/build/components/block-popover/inbetween.js +2 -2
  24. package/build/components/block-popover/inbetween.js.map +1 -1
  25. package/build/components/block-popover/index.js +1 -1
  26. package/build/components/block-popover/index.js.map +1 -1
  27. package/build/components/block-settings-menu/block-mode-toggle.js +1 -1
  28. package/build/components/block-settings-menu/block-mode-toggle.js.map +1 -1
  29. package/build/components/block-settings-menu/block-settings-dropdown.js +4 -1
  30. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  31. package/build/components/block-settings-menu-controls/index.js +1 -1
  32. package/build/components/block-settings-menu-controls/index.js.map +1 -1
  33. package/build/components/block-styles/index.js +3 -6
  34. package/build/components/block-styles/index.js.map +1 -1
  35. package/build/components/block-styles/preview.native.js.map +1 -1
  36. package/build/components/block-switcher/index.js +7 -1
  37. package/build/components/block-switcher/index.js.map +1 -1
  38. package/build/components/block-title/index.js +8 -2
  39. package/build/components/block-title/index.js.map +1 -1
  40. package/build/components/block-title/use-block-display-title.js +12 -5
  41. package/build/components/block-title/use-block-display-title.js.map +1 -1
  42. package/build/components/block-tools/block-contextual-toolbar.js +1 -1
  43. package/build/components/block-tools/block-contextual-toolbar.js.map +1 -1
  44. package/build/components/block-tools/block-selection-button.js +1 -7
  45. package/build/components/block-tools/block-selection-button.js.map +1 -1
  46. package/build/components/block-tools/index.js +4 -1
  47. package/build/components/block-tools/index.js.map +1 -1
  48. package/build/components/block-types-list/index.js +1 -1
  49. package/build/components/block-types-list/index.js.map +1 -1
  50. package/build/components/block-types-list/index.native.js +65 -23
  51. package/build/components/block-types-list/index.native.js.map +1 -1
  52. package/build/components/border-radius-control/index.js +5 -1
  53. package/build/components/border-radius-control/index.js.map +1 -1
  54. package/build/components/colors/utils.js +6 -2
  55. package/build/components/colors/utils.js.map +1 -1
  56. package/build/components/colors/with-colors.js +1 -1
  57. package/build/components/colors/with-colors.js.map +1 -1
  58. package/build/components/colors-gradients/control.js +49 -39
  59. package/build/components/colors-gradients/control.js.map +1 -1
  60. package/build/components/colors-gradients/dropdown.js +9 -3
  61. package/build/components/colors-gradients/dropdown.js.map +1 -1
  62. package/build/components/date-format-picker/index.js +1 -1
  63. package/build/components/date-format-picker/index.js.map +1 -1
  64. package/build/components/font-appearance-control/index.js +10 -4
  65. package/build/components/font-appearance-control/index.js.map +1 -1
  66. package/build/components/iframe/index.js +19 -6
  67. package/build/components/iframe/index.js.map +1 -1
  68. package/build/components/image-editor/cropper.js +4 -3
  69. package/build/components/image-editor/cropper.js.map +1 -1
  70. package/build/components/image-editor/index.js +3 -1
  71. package/build/components/image-editor/index.js.map +1 -1
  72. package/build/components/image-size-control/index.js +3 -1
  73. package/build/components/image-size-control/index.js.map +1 -1
  74. package/build/components/index.js +13 -6
  75. package/build/components/index.js.map +1 -1
  76. package/build/components/index.native.js +11 -4
  77. package/build/components/index.native.js.map +1 -1
  78. package/build/components/inserter/block-types-tab.native.js +30 -16
  79. package/build/components/inserter/block-types-tab.native.js.map +1 -1
  80. package/build/components/inserter/index.native.js +8 -3
  81. package/build/components/inserter/index.native.js.map +1 -1
  82. package/build/components/inserter/preview-panel.js +8 -8
  83. package/build/components/inserter/preview-panel.js.map +1 -1
  84. package/build/components/inserter/reusable-blocks-tab.native.js +5 -1
  85. package/build/components/inserter/reusable-blocks-tab.native.js.map +1 -1
  86. package/build/components/inserter/search-results.native.js +5 -2
  87. package/build/components/inserter/search-results.native.js.map +1 -1
  88. package/build/components/inserter/utils.native.js +21 -0
  89. package/build/components/inserter/utils.native.js.map +1 -1
  90. package/build/components/inserter-list-item/index.js +7 -20
  91. package/build/components/inserter-list-item/index.js.map +1 -1
  92. package/build/components/letter-spacing-control/index.js +6 -3
  93. package/build/components/letter-spacing-control/index.js.map +1 -1
  94. package/build/components/line-height-control/index.js +6 -3
  95. package/build/components/line-height-control/index.js.map +1 -1
  96. package/build/components/link-control/index.js +1 -1
  97. package/build/components/link-control/index.js.map +1 -1
  98. package/build/components/link-control/is-url-like.js +1 -7
  99. package/build/components/link-control/is-url-like.js.map +1 -1
  100. package/build/components/link-control/use-search-handler.js +1 -7
  101. package/build/components/link-control/use-search-handler.js.map +1 -1
  102. package/build/components/list-view/block-select-button.js +15 -7
  103. package/build/components/list-view/block-select-button.js.map +1 -1
  104. package/build/components/list-view/branch.js +1 -7
  105. package/build/components/list-view/branch.js.map +1 -1
  106. package/build/components/list-view/drop-indicator.js +1 -1
  107. package/build/components/list-view/drop-indicator.js.map +1 -1
  108. package/build/components/list-view/expander.js +3 -1
  109. package/build/components/list-view/expander.js.map +1 -1
  110. package/build/components/media-placeholder/index.js +13 -2
  111. package/build/components/media-placeholder/index.js.map +1 -1
  112. package/build/components/media-replace-flow/index.js +3 -6
  113. package/build/components/media-replace-flow/index.js.map +1 -1
  114. package/build/components/media-upload/index.native.js +8 -3
  115. package/build/components/media-upload/index.native.js.map +1 -1
  116. package/build/components/observe-typing/index.js +22 -8
  117. package/build/components/observe-typing/index.js.map +1 -1
  118. package/build/components/preview-options/index.js +2 -2
  119. package/build/components/preview-options/index.js.map +1 -1
  120. package/build/components/{use-no-recursive-renders → recursion-provider}/index.js +40 -18
  121. package/build/components/recursion-provider/index.js.map +1 -0
  122. package/build/components/rich-text/format-toolbar-container.js +61 -12
  123. package/build/components/rich-text/format-toolbar-container.js.map +1 -1
  124. package/build/components/rich-text/index.js +8 -2
  125. package/build/components/rich-text/index.js.map +1 -1
  126. package/build/components/rich-text/index.native.js +3 -1
  127. package/build/components/rich-text/index.native.js.map +1 -1
  128. package/build/components/rich-text/use-before-input-rules.js +110 -0
  129. package/build/components/rich-text/use-before-input-rules.js.map +1 -0
  130. package/build/components/rich-text/use-format-types.js +36 -16
  131. package/build/components/rich-text/use-format-types.js.map +1 -1
  132. package/build/components/text-decoration-control/index.js +3 -1
  133. package/build/components/text-decoration-control/index.js.map +1 -1
  134. package/build/components/text-transform-control/index.js +3 -1
  135. package/build/components/text-transform-control/index.js.map +1 -1
  136. package/build/components/url-popover/image-url-input-ui.js +4 -1
  137. package/build/components/url-popover/image-url-input-ui.js.map +1 -1
  138. package/build/components/url-popover/index.js +2 -1
  139. package/build/components/url-popover/index.js.map +1 -1
  140. package/build/components/writing-flow/use-arrow-nav.js +38 -27
  141. package/build/components/writing-flow/use-arrow-nav.js.map +1 -1
  142. package/build/components/writing-flow/use-drag-selection.js +9 -2
  143. package/build/components/writing-flow/use-drag-selection.js.map +1 -1
  144. package/build/components/writing-flow/use-multi-selection.js +3 -47
  145. package/build/components/writing-flow/use-multi-selection.js.map +1 -1
  146. package/build/components/writing-flow/use-select-all.js +3 -1
  147. package/build/components/writing-flow/use-select-all.js.map +1 -1
  148. package/build/components/writing-flow/use-selection-observer.js +1 -3
  149. package/build/components/writing-flow/use-selection-observer.js.map +1 -1
  150. package/build/components/writing-flow/use-tab-nav.js +1 -1
  151. package/build/components/writing-flow/use-tab-nav.js.map +1 -1
  152. package/build/hooks/color.js +2 -4
  153. package/build/hooks/color.js.map +1 -1
  154. package/build/hooks/index.js +8 -0
  155. package/build/hooks/index.js.map +1 -1
  156. package/build/hooks/layout.js +61 -15
  157. package/build/hooks/layout.js.map +1 -1
  158. package/build/hooks/style.js +41 -31
  159. package/build/hooks/style.js.map +1 -1
  160. package/build/hooks/utils.js +5 -3
  161. package/build/hooks/utils.js.map +1 -1
  162. package/build/index.js +7 -0
  163. package/build/index.js.map +1 -1
  164. package/build/layouts/flex.js +40 -36
  165. package/build/layouts/flex.js.map +1 -1
  166. package/build/layouts/flow.js +35 -37
  167. package/build/layouts/flow.js.map +1 -1
  168. package/build/layouts/utils.js +35 -3
  169. package/build/layouts/utils.js.map +1 -1
  170. package/build/store/actions.js +15 -18
  171. package/build/store/actions.js.map +1 -1
  172. package/build/store/index.js +0 -4
  173. package/build/store/index.js.map +1 -1
  174. package/build/store/reducer.js +5 -3
  175. package/build/store/reducer.js.map +1 -1
  176. package/build/store/selectors.js +3 -3
  177. package/build/store/selectors.js.map +1 -1
  178. package/build/utils/block-variation-transforms.js +15 -9
  179. package/build/utils/block-variation-transforms.js.map +1 -1
  180. package/build/utils/pasting.js +9 -1
  181. package/build/utils/pasting.js.map +1 -1
  182. package/build-module/components/block-list/block-invalid-warning.native.js +50 -6
  183. package/build-module/components/block-list/block-invalid-warning.native.js.map +1 -1
  184. package/build-module/components/block-list/block.js +15 -5
  185. package/build-module/components/block-list/block.js.map +1 -1
  186. package/build-module/components/block-list/block.native.js +2 -1
  187. package/build-module/components/block-list/block.native.js.map +1 -1
  188. package/build-module/components/block-list/index.native.js +4 -2
  189. package/build-module/components/block-list/index.native.js.map +1 -1
  190. package/build-module/components/block-list/layout.js +19 -4
  191. package/build-module/components/block-list/layout.js.map +1 -1
  192. package/build-module/components/block-list/use-block-props/use-block-class-names.js +5 -2
  193. package/build-module/components/block-list/use-block-props/use-block-class-names.js.map +1 -1
  194. package/build-module/components/block-lock/modal.js +39 -8
  195. package/build-module/components/block-lock/modal.js.map +1 -1
  196. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js +2 -2
  197. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  198. package/build-module/components/block-mover/mover-description.js +97 -33
  199. package/build-module/components/block-mover/mover-description.js.map +1 -1
  200. package/build-module/components/block-pattern-setup/index.js +6 -18
  201. package/build-module/components/block-pattern-setup/index.js.map +1 -1
  202. package/build-module/components/block-popover/inbetween.js +2 -2
  203. package/build-module/components/block-popover/inbetween.js.map +1 -1
  204. package/build-module/components/block-popover/index.js +1 -1
  205. package/build-module/components/block-popover/index.js.map +1 -1
  206. package/build-module/components/block-settings-menu/block-mode-toggle.js +1 -1
  207. package/build-module/components/block-settings-menu/block-mode-toggle.js.map +1 -1
  208. package/build-module/components/block-settings-menu/block-settings-dropdown.js +4 -1
  209. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  210. package/build-module/components/block-settings-menu-controls/index.js +2 -2
  211. package/build-module/components/block-settings-menu-controls/index.js.map +1 -1
  212. package/build-module/components/block-styles/index.js +4 -7
  213. package/build-module/components/block-styles/index.js.map +1 -1
  214. package/build-module/components/block-styles/preview.native.js.map +1 -1
  215. package/build-module/components/block-switcher/index.js +7 -1
  216. package/build-module/components/block-switcher/index.js.map +1 -1
  217. package/build-module/components/block-title/index.js +8 -2
  218. package/build-module/components/block-title/index.js.map +1 -1
  219. package/build-module/components/block-title/use-block-display-title.js +12 -5
  220. package/build-module/components/block-title/use-block-display-title.js.map +1 -1
  221. package/build-module/components/block-tools/block-contextual-toolbar.js +1 -1
  222. package/build-module/components/block-tools/block-contextual-toolbar.js.map +1 -1
  223. package/build-module/components/block-tools/block-selection-button.js +1 -7
  224. package/build-module/components/block-tools/block-selection-button.js.map +1 -1
  225. package/build-module/components/block-tools/index.js +4 -1
  226. package/build-module/components/block-tools/index.js.map +1 -1
  227. package/build-module/components/block-types-list/index.js +1 -1
  228. package/build-module/components/block-types-list/index.js.map +1 -1
  229. package/build-module/components/block-types-list/index.native.js +67 -25
  230. package/build-module/components/block-types-list/index.native.js.map +1 -1
  231. package/build-module/components/border-radius-control/index.js +6 -2
  232. package/build-module/components/border-radius-control/index.js.map +1 -1
  233. package/build-module/components/colors/utils.js +7 -3
  234. package/build-module/components/colors/utils.js.map +1 -1
  235. package/build-module/components/colors/with-colors.js +2 -2
  236. package/build-module/components/colors/with-colors.js.map +1 -1
  237. package/build-module/components/colors-gradients/control.js +50 -40
  238. package/build-module/components/colors-gradients/control.js.map +1 -1
  239. package/build-module/components/colors-gradients/dropdown.js +10 -4
  240. package/build-module/components/colors-gradients/dropdown.js.map +1 -1
  241. package/build-module/components/date-format-picker/index.js +1 -1
  242. package/build-module/components/date-format-picker/index.js.map +1 -1
  243. package/build-module/components/font-appearance-control/index.js +7 -4
  244. package/build-module/components/font-appearance-control/index.js.map +1 -1
  245. package/build-module/components/iframe/index.js +19 -6
  246. package/build-module/components/iframe/index.js.map +1 -1
  247. package/build-module/components/image-editor/cropper.js +4 -3
  248. package/build-module/components/image-editor/cropper.js.map +1 -1
  249. package/build-module/components/image-editor/index.js +3 -1
  250. package/build-module/components/image-editor/index.js.map +1 -1
  251. package/build-module/components/image-size-control/index.js +3 -1
  252. package/build-module/components/image-size-control/index.js.map +1 -1
  253. package/build-module/components/index.js +1 -1
  254. package/build-module/components/index.js.map +1 -1
  255. package/build-module/components/index.native.js +1 -1
  256. package/build-module/components/index.native.js.map +1 -1
  257. package/build-module/components/inserter/block-types-tab.native.js +31 -15
  258. package/build-module/components/inserter/block-types-tab.native.js.map +1 -1
  259. package/build-module/components/inserter/index.native.js +9 -2
  260. package/build-module/components/inserter/index.native.js.map +1 -1
  261. package/build-module/components/inserter/preview-panel.js +9 -9
  262. package/build-module/components/inserter/preview-panel.js.map +1 -1
  263. package/build-module/components/inserter/reusable-blocks-tab.native.js +6 -2
  264. package/build-module/components/inserter/reusable-blocks-tab.native.js.map +1 -1
  265. package/build-module/components/inserter/search-results.native.js +6 -3
  266. package/build-module/components/inserter/search-results.native.js.map +1 -1
  267. package/build-module/components/inserter/utils.native.js +19 -0
  268. package/build-module/components/inserter/utils.native.js.map +1 -1
  269. package/build-module/components/inserter-list-item/index.js +5 -18
  270. package/build-module/components/inserter-list-item/index.js.map +1 -1
  271. package/build-module/components/letter-spacing-control/index.js +5 -3
  272. package/build-module/components/letter-spacing-control/index.js.map +1 -1
  273. package/build-module/components/line-height-control/index.js +5 -3
  274. package/build-module/components/line-height-control/index.js.map +1 -1
  275. package/build-module/components/link-control/index.js +1 -1
  276. package/build-module/components/link-control/index.js.map +1 -1
  277. package/build-module/components/link-control/is-url-like.js +1 -6
  278. package/build-module/components/link-control/is-url-like.js.map +1 -1
  279. package/build-module/components/link-control/use-search-handler.js +1 -6
  280. package/build-module/components/link-control/use-search-handler.js.map +1 -1
  281. package/build-module/components/list-view/block-select-button.js +16 -8
  282. package/build-module/components/list-view/block-select-button.js.map +1 -1
  283. package/build-module/components/list-view/branch.js +1 -6
  284. package/build-module/components/list-view/branch.js.map +1 -1
  285. package/build-module/components/list-view/drop-indicator.js +1 -1
  286. package/build-module/components/list-view/drop-indicator.js.map +1 -1
  287. package/build-module/components/list-view/expander.js +3 -2
  288. package/build-module/components/list-view/expander.js.map +1 -1
  289. package/build-module/components/media-placeholder/index.js +13 -2
  290. package/build-module/components/media-placeholder/index.js.map +1 -1
  291. package/build-module/components/media-replace-flow/index.js +4 -7
  292. package/build-module/components/media-replace-flow/index.js.map +1 -1
  293. package/build-module/components/media-upload/index.native.js +9 -2
  294. package/build-module/components/media-upload/index.native.js.map +1 -1
  295. package/build-module/components/observe-typing/index.js +22 -8
  296. package/build-module/components/observe-typing/index.js.map +1 -1
  297. package/build-module/components/preview-options/index.js +2 -2
  298. package/build-module/components/preview-options/index.js.map +1 -1
  299. package/build-module/components/{use-no-recursive-renders → recursion-provider}/index.js +39 -19
  300. package/build-module/components/recursion-provider/index.js.map +1 -0
  301. package/build-module/components/rich-text/format-toolbar-container.js +58 -12
  302. package/build-module/components/rich-text/format-toolbar-container.js.map +1 -1
  303. package/build-module/components/rich-text/index.js +7 -2
  304. package/build-module/components/rich-text/index.js.map +1 -1
  305. package/build-module/components/rich-text/index.native.js +3 -1
  306. package/build-module/components/rich-text/index.native.js.map +1 -1
  307. package/build-module/components/rich-text/use-before-input-rules.js +96 -0
  308. package/build-module/components/rich-text/use-before-input-rules.js.map +1 -0
  309. package/build-module/components/rich-text/use-format-types.js +37 -18
  310. package/build-module/components/rich-text/use-format-types.js.map +1 -1
  311. package/build-module/components/text-decoration-control/index.js +4 -2
  312. package/build-module/components/text-decoration-control/index.js.map +1 -1
  313. package/build-module/components/text-transform-control/index.js +4 -2
  314. package/build-module/components/text-transform-control/index.js.map +1 -1
  315. package/build-module/components/url-popover/image-url-input-ui.js +4 -1
  316. package/build-module/components/url-popover/image-url-input-ui.js.map +1 -1
  317. package/build-module/components/url-popover/index.js +2 -1
  318. package/build-module/components/url-popover/index.js.map +1 -1
  319. package/build-module/components/writing-flow/use-arrow-nav.js +40 -29
  320. package/build-module/components/writing-flow/use-arrow-nav.js.map +1 -1
  321. package/build-module/components/writing-flow/use-drag-selection.js +9 -2
  322. package/build-module/components/writing-flow/use-drag-selection.js.map +1 -1
  323. package/build-module/components/writing-flow/use-multi-selection.js +3 -45
  324. package/build-module/components/writing-flow/use-multi-selection.js.map +1 -1
  325. package/build-module/components/writing-flow/use-select-all.js +3 -1
  326. package/build-module/components/writing-flow/use-select-all.js.map +1 -1
  327. package/build-module/components/writing-flow/use-selection-observer.js +1 -3
  328. package/build-module/components/writing-flow/use-selection-observer.js.map +1 -1
  329. package/build-module/components/writing-flow/use-tab-nav.js +1 -1
  330. package/build-module/components/writing-flow/use-tab-nav.js.map +1 -1
  331. package/build-module/hooks/color.js +2 -3
  332. package/build-module/hooks/color.js.map +1 -1
  333. package/build-module/hooks/index.js +1 -0
  334. package/build-module/hooks/index.js.map +1 -1
  335. package/build-module/hooks/layout.js +62 -16
  336. package/build-module/hooks/layout.js.map +1 -1
  337. package/build-module/hooks/style.js +44 -35
  338. package/build-module/hooks/style.js.map +1 -1
  339. package/build-module/hooks/utils.js +5 -2
  340. package/build-module/hooks/utils.js.map +1 -1
  341. package/build-module/index.js +1 -1
  342. package/build-module/index.js.map +1 -1
  343. package/build-module/layouts/flex.js +41 -33
  344. package/build-module/layouts/flex.js.map +1 -1
  345. package/build-module/layouts/flow.js +35 -38
  346. package/build-module/layouts/flow.js.map +1 -1
  347. package/build-module/layouts/utils.js +33 -3
  348. package/build-module/layouts/utils.js.map +1 -1
  349. package/build-module/store/actions.js +9 -10
  350. package/build-module/store/actions.js.map +1 -1
  351. package/build-module/store/index.js +0 -4
  352. package/build-module/store/index.js.map +1 -1
  353. package/build-module/store/reducer.js +5 -2
  354. package/build-module/store/reducer.js.map +1 -1
  355. package/build-module/store/selectors.js +4 -4
  356. package/build-module/store/selectors.js.map +1 -1
  357. package/build-module/utils/block-variation-transforms.js +14 -7
  358. package/build-module/utils/block-variation-transforms.js.map +1 -1
  359. package/build-module/utils/pasting.js +9 -1
  360. package/build-module/utils/pasting.js.map +1 -1
  361. package/build-style/style-rtl.css +72 -14
  362. package/build-style/style.css +72 -14
  363. package/package.json +28 -28
  364. package/src/components/block-list/block-invalid-warning.native.js +42 -7
  365. package/src/components/block-list/block.js +15 -4
  366. package/src/components/block-list/block.native.js +1 -0
  367. package/src/components/block-list/index.native.js +2 -2
  368. package/src/components/block-list/layout.js +15 -3
  369. package/src/components/block-list/style.scss +1 -1
  370. package/src/components/block-list/use-block-props/use-block-class-names.js +5 -1
  371. package/src/components/block-lock/modal.js +47 -9
  372. package/src/components/block-lock/style.scss +10 -0
  373. package/src/components/block-mobile-toolbar/block-actions-menu.native.js +3 -3
  374. package/src/components/block-mover/mover-description.js +131 -48
  375. package/src/components/block-mover/test/mover-description.js +55 -3
  376. package/src/components/block-pattern-setup/index.js +3 -15
  377. package/src/components/block-pattern-setup/style.scss +4 -2
  378. package/src/components/block-popover/inbetween.js +2 -1
  379. package/src/components/block-popover/index.js +1 -1
  380. package/src/components/block-popover/style.scss +25 -2
  381. package/src/components/block-settings-menu/block-mode-toggle.js +1 -0
  382. package/src/components/block-settings-menu/block-settings-dropdown.js +4 -1
  383. package/src/components/block-settings-menu-controls/index.js +2 -2
  384. package/src/components/block-styles/index.js +4 -7
  385. package/src/components/block-styles/preview.native.js +1 -0
  386. package/src/components/block-styles/style.scss +10 -0
  387. package/src/components/block-switcher/index.js +7 -1
  388. package/src/components/block-title/index.js +3 -2
  389. package/src/components/block-title/use-block-display-title.js +11 -5
  390. package/src/components/block-tools/block-contextual-toolbar.js +3 -1
  391. package/src/components/block-tools/block-selection-button.js +0 -5
  392. package/src/components/block-tools/index.js +4 -1
  393. package/src/components/block-types-list/index.js +1 -1
  394. package/src/components/block-types-list/index.native.js +76 -24
  395. package/src/components/block-types-list/style.native.scss +18 -0
  396. package/src/components/border-radius-control/index.js +6 -1
  397. package/src/components/color-palette/test/__snapshots__/control.js.snap +91 -79
  398. package/src/components/colors/test/__snapshots__/with-colors.js.snap +1 -1
  399. package/src/components/colors/test/with-colors.js +1 -1
  400. package/src/components/colors/utils.js +5 -2
  401. package/src/components/colors/with-colors.js +2 -2
  402. package/src/components/colors-gradients/control.js +82 -65
  403. package/src/components/colors-gradients/dropdown.js +14 -3
  404. package/src/components/colors-gradients/style.scss +34 -9
  405. package/src/components/colors-gradients/test/control.js +16 -23
  406. package/src/components/date-format-picker/index.js +1 -0
  407. package/src/components/font-appearance-control/index.js +3 -0
  408. package/src/components/iframe/index.js +25 -6
  409. package/src/components/image-editor/cropper.js +9 -3
  410. package/src/components/image-editor/index.js +2 -0
  411. package/src/components/image-size-control/README.md +7 -0
  412. package/src/components/image-size-control/index.js +2 -0
  413. package/src/components/index.js +4 -1
  414. package/src/components/index.native.js +4 -1
  415. package/src/components/inserter/block-types-tab.native.js +42 -21
  416. package/src/components/inserter/index.native.js +7 -2
  417. package/src/components/inserter/preview-panel.js +6 -14
  418. package/src/components/inserter/reusable-blocks-tab.native.js +4 -2
  419. package/src/components/inserter/search-results.native.js +4 -2
  420. package/src/components/inserter/style.scss +1 -1
  421. package/src/components/inserter/test/block-types-tab.native.js +2 -0
  422. package/src/components/inserter/test/utils.native.js +37 -0
  423. package/src/components/inserter/utils.native.js +11 -0
  424. package/src/components/inserter-list-item/index.js +5 -18
  425. package/src/components/letter-spacing-control/index.js +2 -0
  426. package/src/components/line-height-control/index.js +2 -0
  427. package/src/components/link-control/index.js +1 -0
  428. package/src/components/link-control/is-url-like.js +1 -6
  429. package/src/components/link-control/test/index.js +6 -4
  430. package/src/components/link-control/use-search-handler.js +1 -6
  431. package/src/components/list-view/block-select-button.js +29 -14
  432. package/src/components/list-view/branch.js +1 -6
  433. package/src/components/list-view/drop-indicator.js +1 -1
  434. package/src/components/list-view/expander.js +4 -2
  435. package/src/components/list-view/style.scss +18 -4
  436. package/src/components/media-placeholder/index.js +19 -0
  437. package/src/components/media-replace-flow/index.js +3 -6
  438. package/src/components/media-replace-flow/test/index.js +14 -4
  439. package/src/components/media-upload/index.native.js +7 -3
  440. package/src/components/observe-typing/index.js +17 -14
  441. package/src/components/preview-options/index.js +2 -2
  442. package/src/components/{use-no-recursive-renders → recursion-provider}/index.js +39 -28
  443. package/src/components/{use-no-recursive-renders/test/use-no-recursive-renders.js → recursion-provider/test/index.js} +5 -6
  444. package/src/components/rich-text/README.md +13 -1
  445. package/src/components/rich-text/format-toolbar-container.js +63 -14
  446. package/src/components/rich-text/index.js +3 -0
  447. package/src/components/rich-text/index.native.js +2 -0
  448. package/src/components/rich-text/use-before-input-rules.js +91 -0
  449. package/src/components/rich-text/use-format-types.js +38 -17
  450. package/src/components/text-decoration-control/index.js +4 -2
  451. package/src/components/text-transform-control/index.js +4 -2
  452. package/src/components/url-popover/image-url-input-ui.js +3 -0
  453. package/src/components/url-popover/index.js +1 -0
  454. package/src/components/url-popover/test/__snapshots__/index.js.snap +3 -0
  455. package/src/components/writing-flow/use-arrow-nav.js +36 -34
  456. package/src/components/writing-flow/use-drag-selection.js +7 -1
  457. package/src/components/writing-flow/use-multi-selection.js +1 -48
  458. package/src/components/writing-flow/use-select-all.js +2 -1
  459. package/src/components/writing-flow/use-selection-observer.js +2 -3
  460. package/src/components/writing-flow/use-tab-nav.js +1 -1
  461. package/src/hooks/color.js +10 -3
  462. package/src/hooks/index.js +1 -0
  463. package/src/hooks/layout.js +66 -23
  464. package/src/hooks/style.js +46 -39
  465. package/src/hooks/utils.js +7 -3
  466. package/src/index.js +1 -0
  467. package/src/layouts/flex.js +47 -41
  468. package/src/layouts/flow.js +35 -34
  469. package/src/layouts/test/flex.js +21 -0
  470. package/src/layouts/test/flow.js +21 -0
  471. package/src/layouts/test/utils.js +138 -0
  472. package/src/layouts/utils.js +44 -3
  473. package/src/store/actions.js +10 -11
  474. package/src/store/index.js +0 -4
  475. package/src/store/reducer.js +3 -2
  476. package/src/store/selectors.js +3 -4
  477. package/src/utils/block-variation-transforms.js +13 -6
  478. package/src/utils/pasting.js +10 -1
  479. package/src/utils/test/block-variation-transforms.js +24 -0
  480. package/src/utils/test/pasting.js +10 -0
  481. package/tsconfig.json +2 -1
  482. package/build/components/use-no-recursive-renders/index.js.map +0 -1
  483. package/build-module/components/use-no-recursive-renders/index.js.map +0 -1
@@ -0,0 +1,91 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useRef } from '@wordpress/element';
5
+ import { useRefEffect } from '@wordpress/compose';
6
+ import { insert, isCollapsed } from '@wordpress/rich-text';
7
+ import { useDispatch } from '@wordpress/data';
8
+ import { applyFilters } from '@wordpress/hooks';
9
+
10
+ /**
11
+ * Internal dependencies
12
+ */
13
+ import { store as blockEditorStore } from '../../store';
14
+
15
+ /**
16
+ * When typing over a selection, the selection will we wrapped by a matching
17
+ * character pair. The second character is optional, it defaults to the first
18
+ * character.
19
+ *
20
+ * @type {string[]} Array of character pairs.
21
+ */
22
+ const wrapSelectionSettings = [ '`', '"', "'", '“”', '‘’' ];
23
+
24
+ export function useBeforeInputRules( props ) {
25
+ const {
26
+ __unstableMarkLastChangeAsPersistent,
27
+ __unstableMarkAutomaticChange,
28
+ } = useDispatch( blockEditorStore );
29
+ const propsRef = useRef( props );
30
+ propsRef.current = props;
31
+ return useRefEffect( ( element ) => {
32
+ function onInput( event ) {
33
+ const { inputType, data } = event;
34
+ const { value, onChange } = propsRef.current;
35
+
36
+ // Only run the rules when inserting text.
37
+ if ( inputType !== 'insertText' ) {
38
+ return;
39
+ }
40
+
41
+ if ( isCollapsed( value ) ) {
42
+ return;
43
+ }
44
+
45
+ const pair = applyFilters(
46
+ 'blockEditor.wrapSelectionSettings',
47
+ wrapSelectionSettings
48
+ ).find(
49
+ ( [ startChar, endChar ] ) =>
50
+ startChar === data || endChar === data
51
+ );
52
+
53
+ if ( ! pair ) {
54
+ return;
55
+ }
56
+
57
+ const [ startChar, endChar = startChar ] = pair;
58
+ const start = value.start;
59
+ const end = value.end + startChar.length;
60
+
61
+ let newValue = insert( value, startChar, start, start );
62
+ newValue = insert( newValue, endChar, end, end );
63
+
64
+ __unstableMarkLastChangeAsPersistent();
65
+ onChange( newValue );
66
+ __unstableMarkAutomaticChange();
67
+
68
+ const init = {};
69
+
70
+ for ( const key in event ) {
71
+ init[ key ] = event[ key ];
72
+ }
73
+
74
+ init.data = endChar;
75
+
76
+ const { ownerDocument } = element;
77
+ const { defaultView } = ownerDocument;
78
+ const newEvent = new defaultView.InputEvent( 'input', init );
79
+
80
+ // Dispatch an input event with the new data. This will trigger the
81
+ // input rules.
82
+ event.target.dispatchEvent( newEvent );
83
+ event.preventDefault();
84
+ }
85
+
86
+ element.addEventListener( 'beforeinput', onInput );
87
+ return () => {
88
+ element.removeEventListener( 'beforeinput', onInput );
89
+ };
90
+ }, [] );
91
+ }
@@ -1,12 +1,13 @@
1
1
  /**
2
- * WordPress dependencies
2
+ * External dependencies
3
3
  */
4
- import { useMemo } from '@wordpress/element';
5
- import { useSelect, useDispatch } from '@wordpress/data';
4
+ import { mapKeys } from 'lodash';
6
5
 
7
6
  /**
8
- * Internal dependencies
7
+ * WordPress dependencies
9
8
  */
9
+ import { useMemo } from '@wordpress/element';
10
+ import { useSelect, useDispatch } from '@wordpress/data';
10
11
  import { store as richTextStore } from '@wordpress/rich-text';
11
12
 
12
13
  function formatTypesSelector( select ) {
@@ -32,6 +33,21 @@ const interactiveContentTags = new Set( [
32
33
  'video',
33
34
  ] );
34
35
 
36
+ function prefixSelectKeys( selected, prefix ) {
37
+ if ( typeof selected !== 'object' ) return { [ prefix ]: selected };
38
+ return mapKeys( selected, ( value, key ) => `${ prefix }.${ key }` );
39
+ }
40
+
41
+ function getPrefixedSelectKeys( selected, prefix ) {
42
+ if ( selected[ prefix ] ) return selected[ prefix ];
43
+ return Object.keys( selected )
44
+ .filter( ( key ) => key.startsWith( prefix + '.' ) )
45
+ .reduce( ( accumulator, key ) => {
46
+ accumulator[ key.slice( prefix.length + 1 ) ] = selected[ key ];
47
+ return accumulator;
48
+ }, {} );
49
+ }
50
+
35
51
  /**
36
52
  * This hook provides RichText with the `formatTypes` and its derived props from
37
53
  * experimental format type settings.
@@ -68,18 +84,23 @@ export function useFormatTypes( {
68
84
  const keyedSelected = useSelect(
69
85
  ( select ) =>
70
86
  formatTypes.reduce( ( accumulator, type ) => {
71
- if ( type.__experimentalGetPropsForEditableTreePreparation ) {
72
- accumulator[ type.name ] =
87
+ if ( ! type.__experimentalGetPropsForEditableTreePreparation ) {
88
+ return accumulator;
89
+ }
90
+
91
+ return {
92
+ ...accumulator,
93
+ ...prefixSelectKeys(
73
94
  type.__experimentalGetPropsForEditableTreePreparation(
74
95
  select,
75
96
  {
76
97
  richTextIdentifier: identifier,
77
98
  blockClientId: clientId,
78
99
  }
79
- );
80
- }
81
-
82
- return accumulator;
100
+ ),
101
+ type.name
102
+ ),
103
+ };
83
104
  }, {} ),
84
105
  [ formatTypes, clientId, identifier ]
85
106
  );
@@ -89,11 +110,14 @@ export function useFormatTypes( {
89
110
  const changeHandlers = [];
90
111
  const dependencies = [];
91
112
 
113
+ for ( const key in keyedSelected ) {
114
+ dependencies.push( keyedSelected[ key ] );
115
+ }
116
+
92
117
  formatTypes.forEach( ( type ) => {
93
118
  if ( type.__experimentalCreatePrepareEditableTree ) {
94
- const selected = keyedSelected[ type.name ];
95
119
  const handler = type.__experimentalCreatePrepareEditableTree(
96
- selected,
120
+ getPrefixedSelectKeys( keyedSelected, type.name ),
97
121
  {
98
122
  richTextIdentifier: identifier,
99
123
  blockClientId: clientId,
@@ -105,10 +129,6 @@ export function useFormatTypes( {
105
129
  } else {
106
130
  prepareHandlers.push( handler );
107
131
  }
108
-
109
- for ( const key in selected ) {
110
- dependencies.push( selected[ key ] );
111
- }
112
132
  }
113
133
 
114
134
  if ( type.__experimentalCreateOnChangeEditableValue ) {
@@ -125,10 +145,11 @@ export function useFormatTypes( {
125
145
  );
126
146
  }
127
147
 
148
+ const selected = getPrefixedSelectKeys( keyedSelected, type.name );
128
149
  changeHandlers.push(
129
150
  type.__experimentalCreateOnChangeEditableValue(
130
151
  {
131
- ...( keyedSelected[ type.name ] || {} ),
152
+ ...( typeof selected === 'object' ? selected : {} ),
132
153
  ...dispatchers,
133
154
  },
134
155
  {
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { Button } from '@wordpress/components';
4
+ import { BaseControl, Button } from '@wordpress/components';
5
5
  import { formatStrikethrough, formatUnderline } from '@wordpress/icons';
6
6
  import { __ } from '@wordpress/i18n';
7
7
 
@@ -30,7 +30,9 @@ const TEXT_DECORATIONS = [
30
30
  export default function TextDecorationControl( { value, onChange } ) {
31
31
  return (
32
32
  <fieldset className="block-editor-text-decoration-control">
33
- <legend>{ __( 'Decoration' ) }</legend>
33
+ <BaseControl.VisualLabel as="legend">
34
+ { __( 'Decoration' ) }
35
+ </BaseControl.VisualLabel>
34
36
  <div className="block-editor-text-decoration-control__buttons">
35
37
  { TEXT_DECORATIONS.map( ( textDecoration ) => {
36
38
  return (
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { Button } from '@wordpress/components';
4
+ import { BaseControl, Button } from '@wordpress/components';
5
5
  import { __ } from '@wordpress/i18n';
6
6
  import {
7
7
  formatCapitalize,
@@ -39,7 +39,9 @@ const TEXT_TRANSFORMS = [
39
39
  export default function TextTransformControl( { value, onChange } ) {
40
40
  return (
41
41
  <fieldset className="block-editor-text-transform-control">
42
- <legend>{ __( 'Letter case' ) }</legend>
42
+ <BaseControl.VisualLabel as="legend">
43
+ { __( 'Letter case' ) }
44
+ </BaseControl.VisualLabel>
43
45
  <div className="block-editor-text-transform-control__buttons">
44
46
  { TEXT_TRANSFORMS.map( ( textTransform ) => {
45
47
  return (
@@ -51,6 +51,7 @@ const ImageURLInputUI = ( {
51
51
  rel,
52
52
  } ) => {
53
53
  const [ isOpen, setIsOpen ] = useState( false );
54
+ const buttonRef = useRef( null );
54
55
  const openLinkUI = useCallback( () => {
55
56
  setIsOpen( true );
56
57
  } );
@@ -245,9 +246,11 @@ const ImageURLInputUI = ( {
245
246
  label={ url ? __( 'Edit link' ) : __( 'Insert link' ) }
246
247
  aria-expanded={ isOpen }
247
248
  onClick={ openLinkUI }
249
+ ref={ buttonRef }
248
250
  />
249
251
  { isOpen && (
250
252
  <URLPopover
253
+ anchorRef={ buttonRef }
251
254
  onFocusOutside={ onFocusOutside() }
252
255
  onClose={ closeLinkUI }
253
256
  renderSettings={ () => advancedOptions }
@@ -33,6 +33,7 @@ function URLPopover( {
33
33
  className="block-editor-url-popover"
34
34
  focusOnMount={ focusOnMount }
35
35
  position={ position }
36
+ __unstableShift
36
37
  { ...popoverProps }
37
38
  >
38
39
  <div className="block-editor-url-popover__input-container">
@@ -2,6 +2,7 @@
2
2
 
3
3
  exports[`URLPopover matches the snapshot in its default state 1`] = `
4
4
  <ForwardRef(Popover)
5
+ __unstableShift={true}
5
6
  className="block-editor-url-popover"
6
7
  focusOnMount="firstElement"
7
8
  position="bottom center"
@@ -38,6 +39,7 @@ exports[`URLPopover matches the snapshot in its default state 1`] = `
38
39
 
39
40
  exports[`URLPopover matches the snapshot when the settings are toggled open 1`] = `
40
41
  <ForwardRef(Popover)
42
+ __unstableShift={true}
41
43
  className="block-editor-url-popover"
42
44
  focusOnMount="firstElement"
43
45
  position="bottom center"
@@ -81,6 +83,7 @@ exports[`URLPopover matches the snapshot when the settings are toggled open 1`]
81
83
 
82
84
  exports[`URLPopover matches the snapshot when there are no settings 1`] = `
83
85
  <ForwardRef(Popover)
86
+ __unstableShift={true}
84
87
  className="block-editor-url-popover"
85
88
  focusOnMount="firstElement"
86
89
  position="bottom center"
@@ -11,13 +11,13 @@ import {
11
11
  isRTL,
12
12
  } from '@wordpress/dom';
13
13
  import { UP, DOWN, LEFT, RIGHT } from '@wordpress/keycodes';
14
- import { useSelect } from '@wordpress/data';
14
+ import { useDispatch, useSelect } from '@wordpress/data';
15
15
  import { useRefEffect } from '@wordpress/compose';
16
16
 
17
17
  /**
18
18
  * Internal dependencies
19
19
  */
20
- import { isInSameBlock } from '../../utils/dom';
20
+ import { getBlockClientId } from '../../utils/dom';
21
21
  import { store as blockEditorStore } from '../../store';
22
22
 
23
23
  /**
@@ -130,13 +130,13 @@ export function getClosestTabbable(
130
130
 
131
131
  export default function useArrowNav() {
132
132
  const {
133
- getSelectedBlockClientId,
133
+ getMultiSelectedBlocksStartClientId,
134
134
  getMultiSelectedBlocksEndClientId,
135
- getPreviousBlockClientId,
136
- getNextBlockClientId,
137
135
  getSettings,
138
136
  hasMultiSelection,
137
+ __unstableIsFullySelected,
139
138
  } = useSelect( blockEditorStore );
139
+ const { selectBlock } = useDispatch( blockEditorStore );
140
140
  return useRefEffect( ( node ) => {
141
141
  // Here a DOMRect is stored while moving the caret vertically so
142
142
  // vertical position of the start position can be restored. This is to
@@ -147,26 +147,13 @@ export default function useArrowNav() {
147
147
  verticalRect = null;
148
148
  }
149
149
 
150
- /**
151
- * Returns true if the given target field is the last in its block which
152
- * can be considered for tab transition. For example, in a block with
153
- * two text fields, this would return true when reversing from the first
154
- * of the two fields, but false when reversing from the second.
155
- *
156
- * @param {Element} target Currently focused text field.
157
- * @param {boolean} isReverse True if considering as the first field.
158
- *
159
- * @return {boolean} Whether field is at edge for tab transition.
160
- */
161
- function isTabbableEdge( target, isReverse ) {
150
+ function isClosestTabbableABlock( target, isReverse ) {
162
151
  const closestTabbable = getClosestTabbable(
163
152
  target,
164
153
  isReverse,
165
154
  node
166
155
  );
167
- return (
168
- ! closestTabbable || ! isInSameBlock( target, closestTabbable )
169
- );
156
+ return closestTabbable && getBlockClientId( closestTabbable );
170
157
  }
171
158
 
172
159
  function onKeyDown( event ) {
@@ -186,7 +173,35 @@ export default function useArrowNav() {
186
173
  const { ownerDocument } = node;
187
174
  const { defaultView } = ownerDocument;
188
175
 
176
+ // If there is a multi-selection, the arrow keys should collapse the
177
+ // selection to the start or end of the selection.
189
178
  if ( hasMultiSelection() ) {
179
+ // Only handle if we have a full selection (not a native partial
180
+ // selection).
181
+ if ( ! __unstableIsFullySelected() ) {
182
+ return;
183
+ }
184
+
185
+ if ( event.defaultPrevented ) {
186
+ return;
187
+ }
188
+
189
+ if ( ! isNav ) {
190
+ return;
191
+ }
192
+
193
+ if ( isShift ) {
194
+ return;
195
+ }
196
+
197
+ event.preventDefault();
198
+
199
+ if ( isReverse ) {
200
+ selectBlock( getMultiSelectedBlocksStartClientId() );
201
+ } else {
202
+ selectBlock( getMultiSelectedBlocksEndClientId(), -1 );
203
+ }
204
+
190
205
  return;
191
206
  }
192
207
 
@@ -223,23 +238,10 @@ export default function useArrowNav() {
223
238
  // next, which is the exact reverse of LTR.
224
239
  const isReverseDir = isRTL( target ) ? ! isReverse : isReverse;
225
240
  const { keepCaretInsideBlock } = getSettings();
226
- const selectedBlockClientId = getSelectedBlockClientId();
227
241
 
228
242
  if ( isShift ) {
229
- const selectionEndClientId =
230
- getMultiSelectedBlocksEndClientId();
231
- const selectionBeforeEndClientId = getPreviousBlockClientId(
232
- selectionEndClientId || selectedBlockClientId
233
- );
234
- const selectionAfterEndClientId = getNextBlockClientId(
235
- selectionEndClientId || selectedBlockClientId
236
- );
237
-
238
243
  if (
239
- // Ensure that there is a target block.
240
- ( ( isReverse && selectionBeforeEndClientId ) ||
241
- ( ! isReverse && selectionAfterEndClientId ) ) &&
242
- isTabbableEdge( target, isReverse ) &&
244
+ isClosestTabbableABlock( target, isReverse ) &&
243
245
  isNavEdge( target, isReverse )
244
246
  ) {
245
247
  node.contentEditable = true;
@@ -27,7 +27,7 @@ function setContentEditableWrapper( node, value ) {
27
27
  export default function useDragSelection() {
28
28
  const { startMultiSelect, stopMultiSelect } =
29
29
  useDispatch( blockEditorStore );
30
- const { isSelectionEnabled, hasMultiSelection } =
30
+ const { isSelectionEnabled, hasMultiSelection, isDraggingBlocks } =
31
31
  useSelect( blockEditorStore );
32
32
  return useRefEffect(
33
33
  ( node ) => {
@@ -72,6 +72,12 @@ export default function useDragSelection() {
72
72
  }
73
73
 
74
74
  function onMouseLeave( { buttons, target } ) {
75
+ // Avoid triggering a multi-selection if the user is already
76
+ // dragging blocks.
77
+ if ( isDraggingBlocks() ) {
78
+ return;
79
+ }
80
+
75
81
  // The primary button must be pressed to initiate selection.
76
82
  // See https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons
77
83
  if ( buttons !== 1 ) {
@@ -1,8 +1,3 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { first, last } from 'lodash';
5
-
6
1
  /**
7
2
  * WordPress dependencies
8
3
  */
@@ -13,7 +8,6 @@ import { useSelect } from '@wordpress/data';
13
8
  * Internal dependencies
14
9
  */
15
10
  import { store as blockEditorStore } from '../../store';
16
- import { __unstableUseBlockRef as useBlockRef } from '../block-list/use-block-props/use-block-refs';
17
11
 
18
12
  function selector( select ) {
19
13
  const {
@@ -44,10 +38,6 @@ export default function useMultiSelection() {
44
38
  selectedBlockClientId,
45
39
  isFullSelection,
46
40
  } = useSelect( selector, [] );
47
- const selectedRef = useBlockRef( selectedBlockClientId );
48
- // These must be in the right DOM order.
49
- const startRef = useBlockRef( first( multiSelectedBlockClientIds ) );
50
- const endRef = useBlockRef( last( multiSelectedBlockClientIds ) );
51
41
 
52
42
  /**
53
43
  * When the component updates, and there is multi selection, we need to
@@ -66,26 +56,6 @@ export default function useMultiSelection() {
66
56
  }
67
57
 
68
58
  if ( ! hasMultiSelection || isMultiSelecting ) {
69
- if ( ! selectedBlockClientId || isMultiSelecting ) {
70
- return;
71
- }
72
-
73
- const selection = defaultView.getSelection();
74
-
75
- if ( selection.rangeCount && ! selection.isCollapsed ) {
76
- const blockNode = selectedRef.current;
77
- const { startContainer, endContainer } =
78
- selection.getRangeAt( 0 );
79
-
80
- if (
81
- !! blockNode &&
82
- ( ! blockNode.contains( startContainer ) ||
83
- ! blockNode.contains( endContainer ) )
84
- ) {
85
- selection.removeAllRanges();
86
- }
87
- }
88
-
89
59
  return;
90
60
  }
91
61
 
@@ -105,25 +75,8 @@ export default function useMultiSelection() {
105
75
  // able to select across instances immediately.
106
76
  node.contentEditable = true;
107
77
 
108
- // For some browsers, like Safari, it is important that focus happens
109
- // BEFORE selection.
78
+ defaultView.getSelection().removeAllRanges();
110
79
  node.focus();
111
-
112
- // The block refs might not be immediately available
113
- // when dragging blocks into another block.
114
- if ( ! startRef.current || ! endRef.current ) {
115
- return;
116
- }
117
-
118
- const selection = defaultView.getSelection();
119
- const range = ownerDocument.createRange();
120
-
121
- // These must be in the right DOM order.
122
- range.setStartBefore( startRef.current );
123
- range.setEndAfter( endRef.current );
124
-
125
- selection.removeAllRanges();
126
- selection.addRange( range );
127
80
  },
128
81
  [
129
82
  hasMultiSelection,
@@ -19,7 +19,7 @@ import { store as blockEditorStore } from '../../store';
19
19
  export default function useSelectAll() {
20
20
  const { getBlockOrder, getSelectedBlockClientIds, getBlockRootClientId } =
21
21
  useSelect( blockEditorStore );
22
- const { multiSelect } = useDispatch( blockEditorStore );
22
+ const { multiSelect, selectBlock } = useDispatch( blockEditorStore );
23
23
  const isMatch = useShortcutEventMatch();
24
24
 
25
25
  return useRefEffect( ( node ) => {
@@ -53,6 +53,7 @@ export default function useSelectAll() {
53
53
  const lastClientId = last( blockClientIds );
54
54
 
55
55
  if ( firstClientId === lastClientId ) {
56
+ selectBlock( firstClientId );
56
57
  return;
57
58
  }
58
59
 
@@ -84,12 +84,11 @@ export default function useSelectionObserver() {
84
84
 
85
85
  function onSelectionChange( event ) {
86
86
  const selection = defaultView.getSelection();
87
- // If no selection is found, end multi selection and disable the
88
- // contentEditable wrapper.
87
+
89
88
  if ( ! selection.rangeCount ) {
90
- setContentEditableWrapper( node, false );
91
89
  return;
92
90
  }
91
+
93
92
  // If selection is collapsed and we haven't used `shift+click`,
94
93
  // end multi selection and disable the contentEditable wrapper.
95
94
  // We have to check about `shift+click` case because elements
@@ -75,7 +75,7 @@ export default function useTabNav() {
75
75
  return;
76
76
  }
77
77
 
78
- if ( event.keyCode === ESCAPE && ! hasMultiSelection() ) {
78
+ if ( event.keyCode === ESCAPE ) {
79
79
  event.preventDefault();
80
80
  setNavigationMode( true );
81
81
  return;
@@ -2,7 +2,6 @@
2
2
  * External dependencies
3
3
  */
4
4
  import classnames from 'classnames';
5
- import { isObject } from 'lodash';
6
5
 
7
6
  /**
8
7
  * WordPress dependencies
@@ -55,13 +54,21 @@ const hasLinkColorSupport = ( blockType ) => {
55
54
 
56
55
  const colorSupport = getBlockSupport( blockType, COLOR_SUPPORT_KEY );
57
56
 
58
- return isObject( colorSupport ) && !! colorSupport.link;
57
+ return (
58
+ colorSupport !== null &&
59
+ typeof colorSupport === 'object' &&
60
+ !! colorSupport.link
61
+ );
59
62
  };
60
63
 
61
64
  const hasGradientSupport = ( blockType ) => {
62
65
  const colorSupport = getBlockSupport( blockType, COLOR_SUPPORT_KEY );
63
66
 
64
- return isObject( colorSupport ) && !! colorSupport.gradients;
67
+ return (
68
+ colorSupport !== null &&
69
+ typeof colorSupport === 'object' &&
70
+ !! colorSupport.gradients
71
+ );
65
72
  };
66
73
 
67
74
  const hasBackgroundColorSupport = ( blockType ) => {
@@ -20,4 +20,5 @@ export { useCustomSides } from './dimensions';
20
20
  export { getBorderClassesAndStyles, useBorderProps } from './use-border-props';
21
21
  export { getColorClassesAndStyles, useColorProps } from './use-color-props';
22
22
  export { getSpacingClassesAndStyles } from './use-spacing-props';
23
+ export { getGapCSSValue } from './gap';
23
24
  export { useCachedTruthy } from './use-cached-truthy';