@wordpress/block-editor 10.2.0 → 10.4.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 (482) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +41 -0
  3. package/build/components/alignment-control/ui.js +1 -1
  4. package/build/components/alignment-control/ui.js.map +1 -1
  5. package/build/components/block-alignment-control/constants.js +1 -1
  6. package/build/components/block-alignment-control/constants.js.map +1 -1
  7. package/build/components/block-alignment-matrix-control/index.js +1 -1
  8. package/build/components/block-alignment-matrix-control/index.js.map +1 -1
  9. package/build/components/block-compare/index.js +1 -3
  10. package/build/components/block-compare/index.js.map +1 -1
  11. package/build/components/block-draggable/draggable-chip.js +4 -2
  12. package/build/components/block-draggable/draggable-chip.js.map +1 -1
  13. package/build/components/block-edit/index.js +4 -2
  14. package/build/components/block-edit/index.js.map +1 -1
  15. package/build/components/block-inspector/index.js +4 -4
  16. package/build/components/block-inspector/index.js.map +1 -1
  17. package/build/components/block-list/block-list-compact.native.js +1 -0
  18. package/build/components/block-list/block-list-compact.native.js.map +1 -1
  19. package/build/components/block-list/block.js +75 -15
  20. package/build/components/block-list/block.js.map +1 -1
  21. package/build/components/block-list/block.native.js +79 -12
  22. package/build/components/block-list/block.native.js.map +1 -1
  23. package/build/components/block-list/use-in-between-inserter.js +7 -23
  24. package/build/components/block-list/use-in-between-inserter.js.map +1 -1
  25. package/build/components/block-lock/modal.js +9 -6
  26. package/build/components/block-lock/modal.js.map +1 -1
  27. package/build/components/block-parent-selector/index.js +3 -3
  28. package/build/components/block-parent-selector/index.js.map +1 -1
  29. package/build/components/block-patterns-list/index.js +5 -4
  30. package/build/components/block-patterns-list/index.js.map +1 -1
  31. package/build/components/block-popover/drop-zone.js +85 -0
  32. package/build/components/block-popover/drop-zone.js.map +1 -0
  33. package/build/components/block-popover/inbetween.js +2 -1
  34. package/build/components/block-popover/inbetween.js.map +1 -1
  35. package/build/components/block-popover/index.js +4 -2
  36. package/build/components/block-popover/index.js.map +1 -1
  37. package/build/components/block-preview/auto.js +2 -2
  38. package/build/components/block-preview/auto.js.map +1 -1
  39. package/build/components/block-preview/index.js +8 -13
  40. package/build/components/block-preview/index.js.map +1 -1
  41. package/build/components/block-preview/live.js +3 -7
  42. package/build/components/block-preview/live.js.map +1 -1
  43. package/build/components/block-selection-clearer/index.js +9 -1
  44. package/build/components/block-selection-clearer/index.js.map +1 -1
  45. package/build/components/block-settings-menu/block-settings-dropdown.js +19 -19
  46. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  47. package/build/components/block-styles/index.js +18 -42
  48. package/build/components/block-styles/index.js.map +1 -1
  49. package/build/components/block-switcher/index.js +2 -8
  50. package/build/components/block-switcher/index.js.map +1 -1
  51. package/build/components/block-switcher/preview-block-popover.js +1 -1
  52. package/build/components/block-switcher/preview-block-popover.js.map +1 -1
  53. package/build/components/block-toolbar/index.js +4 -4
  54. package/build/components/block-toolbar/index.js.map +1 -1
  55. package/build/components/block-tools/back-compat.js +2 -1
  56. package/build/components/block-tools/back-compat.js.map +1 -1
  57. package/build/components/block-tools/insertion-point.js +56 -16
  58. package/build/components/block-tools/insertion-point.js.map +1 -1
  59. package/build/components/block-tools/selected-block-popover.js +15 -3
  60. package/build/components/block-tools/selected-block-popover.js.map +1 -1
  61. package/build/components/block-vertical-alignment-control/ui.js +1 -1
  62. package/build/components/block-vertical-alignment-control/ui.js.map +1 -1
  63. package/build/components/border-radius-control/all-input-control.js +2 -1
  64. package/build/components/border-radius-control/all-input-control.js.map +1 -1
  65. package/build/components/border-radius-control/index.js +2 -1
  66. package/build/components/border-radius-control/index.js.map +1 -1
  67. package/build/components/border-radius-control/input-controls.js +2 -1
  68. package/build/components/border-radius-control/input-controls.js.map +1 -1
  69. package/build/components/colors-gradients/control.js +1 -1
  70. package/build/components/colors-gradients/control.js.map +1 -1
  71. package/build/components/colors-gradients/panel-color-gradient-settings.js +2 -2
  72. package/build/components/colors-gradients/panel-color-gradient-settings.js.map +1 -1
  73. package/build/components/duotone-control/index.js +1 -1
  74. package/build/components/duotone-control/index.js.map +1 -1
  75. package/build/components/font-sizes/fluid-utils.js +256 -0
  76. package/build/components/font-sizes/fluid-utils.js.map +1 -0
  77. package/build/components/font-sizes/index.js +8 -0
  78. package/build/components/font-sizes/index.js.map +1 -1
  79. package/build/components/font-sizes/with-font-sizes.js +1 -1
  80. package/build/components/font-sizes/with-font-sizes.js.map +1 -1
  81. package/build/components/iframe/index.js +1 -1
  82. package/build/components/iframe/index.js.map +1 -1
  83. package/build/components/image-editor/constants.js +1 -1
  84. package/build/components/image-editor/constants.js.map +1 -1
  85. package/build/components/index.js +0 -9
  86. package/build/components/index.js.map +1 -1
  87. package/build/components/inner-blocks/index.js +6 -2
  88. package/build/components/inner-blocks/index.js.map +1 -1
  89. package/build/components/inner-blocks/use-inner-block-template-sync.js +3 -2
  90. package/build/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  91. package/build/components/inserter/block-patterns-tab.js +151 -78
  92. package/build/components/inserter/block-patterns-tab.js.map +1 -1
  93. package/build/components/inserter/hooks/use-insertion-point.js +2 -7
  94. package/build/components/inserter/hooks/use-insertion-point.js.map +1 -1
  95. package/build/components/inserter/menu.js +14 -3
  96. package/build/components/inserter/menu.js.map +1 -1
  97. package/build/components/inserter/search-items.js +23 -2
  98. package/build/components/inserter/search-items.js.map +1 -1
  99. package/build/components/inserter-draggable-blocks/index.js +4 -2
  100. package/build/components/inserter-draggable-blocks/index.js.map +1 -1
  101. package/build/components/line-height-control/index.js +2 -1
  102. package/build/components/line-height-control/index.js.map +1 -1
  103. package/build/components/list-view/drop-indicator.js +2 -1
  104. package/build/components/list-view/drop-indicator.js.map +1 -1
  105. package/build/components/list-view/use-list-view-drop-zone.js +1 -14
  106. package/build/components/list-view/use-list-view-drop-zone.js.map +1 -1
  107. package/build/components/media-replace-flow/index.js +1 -1
  108. package/build/components/media-replace-flow/index.js.map +1 -1
  109. package/build/components/preview-options/index.js +2 -3
  110. package/build/components/preview-options/index.js.map +1 -1
  111. package/build/components/rich-text/format-toolbar/index.js +1 -1
  112. package/build/components/rich-text/format-toolbar/index.js.map +1 -1
  113. package/build/components/rich-text/format-toolbar-container.js +1 -1
  114. package/build/components/rich-text/format-toolbar-container.js.map +1 -1
  115. package/build/components/rich-text/use-paste-handler.js +1 -1
  116. package/build/components/rich-text/use-paste-handler.js.map +1 -1
  117. package/build/components/spacing-sizes-control/all-input-control.js +6 -2
  118. package/build/components/spacing-sizes-control/all-input-control.js.map +1 -1
  119. package/build/components/spacing-sizes-control/axial-input-controls.js +6 -2
  120. package/build/components/spacing-sizes-control/axial-input-controls.js.map +1 -1
  121. package/build/components/spacing-sizes-control/index.js +6 -2
  122. package/build/components/spacing-sizes-control/index.js.map +1 -1
  123. package/build/components/spacing-sizes-control/input-controls.js +6 -2
  124. package/build/components/spacing-sizes-control/input-controls.js.map +1 -1
  125. package/build/components/spacing-sizes-control/spacing-input-control.js +45 -8
  126. package/build/components/spacing-sizes-control/spacing-input-control.js.map +1 -1
  127. package/build/components/url-input/index.js +1 -1
  128. package/build/components/url-input/index.js.map +1 -1
  129. package/build/components/use-block-drop-zone/index.js +98 -57
  130. package/build/components/use-block-drop-zone/index.js.map +1 -1
  131. package/build/components/use-on-block-drop/index.js +12 -12
  132. package/build/components/use-on-block-drop/index.js.map +1 -1
  133. package/build/components/use-on-block-drop/types.js +6 -0
  134. package/build/components/use-on-block-drop/types.js.map +1 -0
  135. package/build/hooks/align.js +1 -3
  136. package/build/hooks/align.js.map +1 -1
  137. package/build/hooks/align.native.js +1 -7
  138. package/build/hooks/align.native.js.map +1 -1
  139. package/build/hooks/border.js +1 -0
  140. package/build/hooks/border.js.map +1 -1
  141. package/build/hooks/dimensions.js +32 -4
  142. package/build/hooks/dimensions.js.map +1 -1
  143. package/build/hooks/font-size.js +61 -0
  144. package/build/hooks/font-size.js.map +1 -1
  145. package/build/hooks/layout.js +4 -3
  146. package/build/hooks/layout.js.map +1 -1
  147. package/build/hooks/margin.js +24 -17
  148. package/build/hooks/margin.js.map +1 -1
  149. package/build/hooks/padding.js +20 -12
  150. package/build/hooks/padding.js.map +1 -1
  151. package/build/hooks/style.js +126 -4
  152. package/build/hooks/style.js.map +1 -1
  153. package/build/hooks/use-typography-props.js +17 -3
  154. package/build/hooks/use-typography-props.js.map +1 -1
  155. package/build/hooks/utils.js +8 -7
  156. package/build/hooks/utils.js.map +1 -1
  157. package/build/layouts/constrained.js +0 -1
  158. package/build/layouts/constrained.js.map +1 -1
  159. package/build/layouts/flex.js +1 -1
  160. package/build/layouts/flex.js.map +1 -1
  161. package/build/store/actions.js +63 -45
  162. package/build/store/actions.js.map +1 -1
  163. package/build/store/array.js +1 -7
  164. package/build/store/array.js.map +1 -1
  165. package/build/store/defaults.js +3 -0
  166. package/build/store/defaults.js.map +1 -1
  167. package/build/store/reducer.js +31 -15
  168. package/build/store/reducer.js.map +1 -1
  169. package/build/store/selectors.js +46 -29
  170. package/build/store/selectors.js.map +1 -1
  171. package/build/utils/math.js +14 -0
  172. package/build/utils/math.js.map +1 -1
  173. package/build/utils/pre-parse-patterns.js +19 -2
  174. package/build/utils/pre-parse-patterns.js.map +1 -1
  175. package/build-module/components/alignment-control/ui.js +1 -1
  176. package/build-module/components/alignment-control/ui.js.map +1 -1
  177. package/build-module/components/block-alignment-control/constants.js +1 -1
  178. package/build-module/components/block-alignment-control/constants.js.map +1 -1
  179. package/build-module/components/block-alignment-matrix-control/index.js +1 -1
  180. package/build-module/components/block-alignment-matrix-control/index.js.map +1 -1
  181. package/build-module/components/block-compare/index.js +2 -3
  182. package/build-module/components/block-compare/index.js.map +1 -1
  183. package/build-module/components/block-draggable/draggable-chip.js +7 -3
  184. package/build-module/components/block-draggable/draggable-chip.js.map +1 -1
  185. package/build-module/components/block-edit/index.js +4 -2
  186. package/build-module/components/block-edit/index.js.map +1 -1
  187. package/build-module/components/block-inspector/index.js +4 -4
  188. package/build-module/components/block-inspector/index.js.map +1 -1
  189. package/build-module/components/block-list/block-list-compact.native.js +1 -0
  190. package/build-module/components/block-list/block-list-compact.native.js.map +1 -1
  191. package/build-module/components/block-list/block.js +75 -15
  192. package/build-module/components/block-list/block.js.map +1 -1
  193. package/build-module/components/block-list/block.native.js +80 -13
  194. package/build-module/components/block-list/block.native.js.map +1 -1
  195. package/build-module/components/block-list/use-in-between-inserter.js +8 -24
  196. package/build-module/components/block-list/use-in-between-inserter.js.map +1 -1
  197. package/build-module/components/block-lock/modal.js +10 -8
  198. package/build-module/components/block-lock/modal.js.map +1 -1
  199. package/build-module/components/block-parent-selector/index.js +3 -3
  200. package/build-module/components/block-parent-selector/index.js.map +1 -1
  201. package/build-module/components/block-patterns-list/index.js +5 -4
  202. package/build-module/components/block-patterns-list/index.js.map +1 -1
  203. package/build-module/components/block-popover/drop-zone.js +70 -0
  204. package/build-module/components/block-popover/drop-zone.js.map +1 -0
  205. package/build-module/components/block-popover/inbetween.js +2 -1
  206. package/build-module/components/block-popover/inbetween.js.map +1 -1
  207. package/build-module/components/block-popover/index.js +4 -2
  208. package/build-module/components/block-popover/index.js.map +1 -1
  209. package/build-module/components/block-preview/auto.js +1 -1
  210. package/build-module/components/block-preview/auto.js.map +1 -1
  211. package/build-module/components/block-preview/index.js +8 -12
  212. package/build-module/components/block-preview/index.js.map +1 -1
  213. package/build-module/components/block-preview/live.js +3 -6
  214. package/build-module/components/block-preview/live.js.map +1 -1
  215. package/build-module/components/block-selection-clearer/index.js +9 -1
  216. package/build-module/components/block-selection-clearer/index.js.map +1 -1
  217. package/build-module/components/block-settings-menu/block-settings-dropdown.js +20 -19
  218. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  219. package/build-module/components/block-styles/index.js +19 -44
  220. package/build-module/components/block-styles/index.js.map +1 -1
  221. package/build-module/components/block-switcher/index.js +2 -7
  222. package/build-module/components/block-switcher/index.js.map +1 -1
  223. package/build-module/components/block-switcher/preview-block-popover.js +1 -1
  224. package/build-module/components/block-switcher/preview-block-popover.js.map +1 -1
  225. package/build-module/components/block-toolbar/index.js +4 -4
  226. package/build-module/components/block-toolbar/index.js.map +1 -1
  227. package/build-module/components/block-tools/back-compat.js +2 -1
  228. package/build-module/components/block-tools/back-compat.js.map +1 -1
  229. package/build-module/components/block-tools/insertion-point.js +54 -16
  230. package/build-module/components/block-tools/insertion-point.js.map +1 -1
  231. package/build-module/components/block-tools/selected-block-popover.js +15 -3
  232. package/build-module/components/block-tools/selected-block-popover.js.map +1 -1
  233. package/build-module/components/block-vertical-alignment-control/ui.js +1 -1
  234. package/build-module/components/block-vertical-alignment-control/ui.js.map +1 -1
  235. package/build-module/components/border-radius-control/all-input-control.js +2 -1
  236. package/build-module/components/border-radius-control/all-input-control.js.map +1 -1
  237. package/build-module/components/border-radius-control/index.js +2 -1
  238. package/build-module/components/border-radius-control/index.js.map +1 -1
  239. package/build-module/components/border-radius-control/input-controls.js +2 -1
  240. package/build-module/components/border-radius-control/input-controls.js.map +1 -1
  241. package/build-module/components/colors-gradients/control.js +2 -2
  242. package/build-module/components/colors-gradients/control.js.map +1 -1
  243. package/build-module/components/colors-gradients/panel-color-gradient-settings.js +3 -3
  244. package/build-module/components/colors-gradients/panel-color-gradient-settings.js.map +1 -1
  245. package/build-module/components/duotone-control/index.js +1 -1
  246. package/build-module/components/duotone-control/index.js.map +1 -1
  247. package/build-module/components/font-sizes/fluid-utils.js +245 -0
  248. package/build-module/components/font-sizes/fluid-utils.js.map +1 -0
  249. package/build-module/components/font-sizes/index.js +1 -0
  250. package/build-module/components/font-sizes/index.js.map +1 -1
  251. package/build-module/components/font-sizes/with-font-sizes.js +2 -2
  252. package/build-module/components/font-sizes/with-font-sizes.js.map +1 -1
  253. package/build-module/components/iframe/index.js +1 -1
  254. package/build-module/components/iframe/index.js.map +1 -1
  255. package/build-module/components/image-editor/constants.js +1 -1
  256. package/build-module/components/image-editor/constants.js.map +1 -1
  257. package/build-module/components/index.js +0 -1
  258. package/build-module/components/index.js.map +1 -1
  259. package/build-module/components/inner-blocks/index.js +6 -2
  260. package/build-module/components/inner-blocks/index.js.map +1 -1
  261. package/build-module/components/inner-blocks/use-inner-block-template-sync.js +3 -2
  262. package/build-module/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  263. package/build-module/components/inserter/block-patterns-tab.js +148 -81
  264. package/build-module/components/inserter/block-patterns-tab.js.map +1 -1
  265. package/build-module/components/inserter/hooks/use-insertion-point.js +2 -6
  266. package/build-module/components/inserter/hooks/use-insertion-point.js.map +1 -1
  267. package/build-module/components/inserter/menu.js +10 -3
  268. package/build-module/components/inserter/menu.js.map +1 -1
  269. package/build-module/components/inserter/search-items.js +23 -3
  270. package/build-module/components/inserter/search-items.js.map +1 -1
  271. package/build-module/components/inserter-draggable-blocks/index.js +4 -2
  272. package/build-module/components/inserter-draggable-blocks/index.js.map +1 -1
  273. package/build-module/components/line-height-control/index.js +2 -1
  274. package/build-module/components/line-height-control/index.js.map +1 -1
  275. package/build-module/components/list-view/drop-indicator.js +2 -1
  276. package/build-module/components/list-view/drop-indicator.js.map +1 -1
  277. package/build-module/components/list-view/use-list-view-drop-zone.js +1 -14
  278. package/build-module/components/list-view/use-list-view-drop-zone.js.map +1 -1
  279. package/build-module/components/media-replace-flow/index.js +1 -1
  280. package/build-module/components/media-replace-flow/index.js.map +1 -1
  281. package/build-module/components/preview-options/index.js +2 -3
  282. package/build-module/components/preview-options/index.js.map +1 -1
  283. package/build-module/components/rich-text/format-toolbar/index.js +1 -1
  284. package/build-module/components/rich-text/format-toolbar/index.js.map +1 -1
  285. package/build-module/components/rich-text/format-toolbar-container.js +1 -1
  286. package/build-module/components/rich-text/format-toolbar-container.js.map +1 -1
  287. package/build-module/components/rich-text/use-paste-handler.js +1 -1
  288. package/build-module/components/rich-text/use-paste-handler.js.map +1 -1
  289. package/build-module/components/spacing-sizes-control/all-input-control.js +6 -2
  290. package/build-module/components/spacing-sizes-control/all-input-control.js.map +1 -1
  291. package/build-module/components/spacing-sizes-control/axial-input-controls.js +6 -2
  292. package/build-module/components/spacing-sizes-control/axial-input-controls.js.map +1 -1
  293. package/build-module/components/spacing-sizes-control/index.js +6 -2
  294. package/build-module/components/spacing-sizes-control/index.js.map +1 -1
  295. package/build-module/components/spacing-sizes-control/input-controls.js +6 -2
  296. package/build-module/components/spacing-sizes-control/input-controls.js.map +1 -1
  297. package/build-module/components/spacing-sizes-control/spacing-input-control.js +44 -8
  298. package/build-module/components/spacing-sizes-control/spacing-input-control.js.map +1 -1
  299. package/build-module/components/url-input/index.js +1 -1
  300. package/build-module/components/url-input/index.js.map +1 -1
  301. package/build-module/components/use-block-drop-zone/index.js +98 -58
  302. package/build-module/components/use-block-drop-zone/index.js.map +1 -1
  303. package/build-module/components/use-on-block-drop/index.js +12 -12
  304. package/build-module/components/use-on-block-drop/index.js.map +1 -1
  305. package/build-module/components/use-on-block-drop/types.js +2 -0
  306. package/build-module/components/use-on-block-drop/types.js.map +1 -0
  307. package/build-module/hooks/align.js +1 -2
  308. package/build-module/hooks/align.js.map +1 -1
  309. package/build-module/hooks/align.native.js +1 -6
  310. package/build-module/hooks/align.native.js.map +1 -1
  311. package/build-module/hooks/border.js +1 -0
  312. package/build-module/hooks/border.js.map +1 -1
  313. package/build-module/hooks/dimensions.js +32 -4
  314. package/build-module/hooks/dimensions.js.map +1 -1
  315. package/build-module/hooks/font-size.js +60 -1
  316. package/build-module/hooks/font-size.js.map +1 -1
  317. package/build-module/hooks/layout.js +5 -4
  318. package/build-module/hooks/layout.js.map +1 -1
  319. package/build-module/hooks/margin.js +25 -18
  320. package/build-module/hooks/margin.js.map +1 -1
  321. package/build-module/hooks/padding.js +21 -13
  322. package/build-module/hooks/padding.js.map +1 -1
  323. package/build-module/hooks/style.js +124 -3
  324. package/build-module/hooks/style.js.map +1 -1
  325. package/build-module/hooks/use-typography-props.js +17 -4
  326. package/build-module/hooks/use-typography-props.js.map +1 -1
  327. package/build-module/hooks/utils.js +8 -8
  328. package/build-module/hooks/utils.js.map +1 -1
  329. package/build-module/layouts/constrained.js +0 -1
  330. package/build-module/layouts/constrained.js.map +1 -1
  331. package/build-module/layouts/flex.js +1 -1
  332. package/build-module/layouts/flex.js.map +1 -1
  333. package/build-module/store/actions.js +59 -42
  334. package/build-module/store/actions.js.map +1 -1
  335. package/build-module/store/array.js +1 -6
  336. package/build-module/store/array.js.map +1 -1
  337. package/build-module/store/defaults.js +3 -0
  338. package/build-module/store/defaults.js.map +1 -1
  339. package/build-module/store/reducer.js +32 -16
  340. package/build-module/store/reducer.js.map +1 -1
  341. package/build-module/store/selectors.js +47 -30
  342. package/build-module/store/selectors.js.map +1 -1
  343. package/build-module/utils/math.js +12 -0
  344. package/build-module/utils/math.js.map +1 -1
  345. package/build-module/utils/pre-parse-patterns.js +19 -2
  346. package/build-module/utils/pre-parse-patterns.js.map +1 -1
  347. package/build-style/style-rtl.css +292 -206
  348. package/build-style/style.css +288 -202
  349. package/package.json +29 -28
  350. package/src/components/alignment-control/ui.js +1 -1
  351. package/src/components/block-alignment-control/constants.js +1 -1
  352. package/src/components/block-alignment-matrix-control/index.js +1 -1
  353. package/src/components/block-breadcrumb/test/__snapshots__/index.js.snap +13 -11
  354. package/src/components/block-breadcrumb/test/index.js +2 -2
  355. package/src/components/block-compare/index.js +3 -2
  356. package/src/components/block-draggable/draggable-chip.js +4 -2
  357. package/src/components/block-edit/index.js +2 -1
  358. package/src/components/block-inspector/index.js +8 -7
  359. package/src/components/block-list/block-list-compact.native.js +1 -0
  360. package/src/components/block-list/block.js +113 -7
  361. package/src/components/block-list/block.native.js +123 -9
  362. package/src/components/block-list/style.scss +93 -126
  363. package/src/components/block-list/use-in-between-inserter.js +8 -19
  364. package/src/components/block-lock/modal.js +12 -7
  365. package/src/components/block-mover/stories/index.js +1 -1
  366. package/src/components/block-mover/style.scss +35 -1
  367. package/src/components/block-parent-selector/index.js +3 -3
  368. package/src/components/block-patterns-list/index.js +9 -5
  369. package/src/components/block-patterns-list/style.scss +7 -3
  370. package/src/components/block-popover/README.md +8 -0
  371. package/src/components/block-popover/drop-zone.js +63 -0
  372. package/src/components/block-popover/inbetween.js +1 -0
  373. package/src/components/block-popover/index.js +3 -1
  374. package/src/components/block-popover/style.scss +17 -5
  375. package/src/components/block-preview/auto.js +1 -1
  376. package/src/components/block-preview/index.js +15 -11
  377. package/src/components/block-preview/live.js +2 -7
  378. package/src/components/block-preview/test/index.js +1 -7
  379. package/src/components/block-selection-clearer/index.js +7 -2
  380. package/src/components/block-selection-clearer/test/index.js +118 -0
  381. package/src/components/block-settings-menu/block-settings-dropdown.js +29 -18
  382. package/src/components/block-settings-menu/test/block-mode-toggle.js +17 -17
  383. package/src/components/block-styles/index.js +26 -49
  384. package/src/components/block-switcher/index.js +2 -7
  385. package/src/components/block-switcher/preview-block-popover.js +1 -1
  386. package/src/components/block-switcher/test/index.js +2 -2
  387. package/src/components/block-toolbar/index.js +4 -6
  388. package/src/components/block-toolbar/style.scss +38 -14
  389. package/src/components/block-tools/back-compat.js +1 -0
  390. package/src/components/block-tools/insertion-point.js +49 -15
  391. package/src/components/block-tools/selected-block-popover.js +14 -1
  392. package/src/components/block-variation-picker/README.md +1 -1
  393. package/src/components/block-vertical-alignment-control/ui.js +1 -1
  394. package/src/components/border-radius-control/all-input-control.js +1 -0
  395. package/src/components/border-radius-control/index.js +1 -0
  396. package/src/components/border-radius-control/input-controls.js +1 -0
  397. package/src/components/border-radius-control/style.scss +15 -24
  398. package/src/components/button-block-appender/style.scss +4 -2
  399. package/src/components/color-palette/test/__snapshots__/control.js.snap +86 -104
  400. package/src/components/color-palette/test/control.js +11 -15
  401. package/src/components/colors-gradients/control.js +2 -2
  402. package/src/components/colors-gradients/panel-color-gradient-settings.js +3 -4
  403. package/src/components/colors-gradients/test/control.js +49 -77
  404. package/src/components/duotone-control/index.js +1 -1
  405. package/src/components/font-sizes/fluid-utils.js +296 -0
  406. package/src/components/font-sizes/index.js +1 -0
  407. package/src/components/font-sizes/test/fluid-utils.js +168 -0
  408. package/src/components/font-sizes/with-font-sizes.js +2 -3
  409. package/src/components/iframe/index.js +1 -1
  410. package/src/components/image-editor/constants.js +1 -1
  411. package/src/components/image-size-control/test/index.js +47 -60
  412. package/src/components/index.js +0 -1
  413. package/src/components/inner-blocks/index.js +5 -1
  414. package/src/components/inner-blocks/test/index.js +4 -0
  415. package/src/components/inner-blocks/use-inner-block-template-sync.js +3 -2
  416. package/src/components/inserter/block-patterns-tab.js +232 -98
  417. package/src/components/inserter/hooks/use-insertion-point.js +3 -11
  418. package/src/components/inserter/menu.js +15 -2
  419. package/src/components/inserter/search-items.js +23 -3
  420. package/src/components/inserter/style.scss +94 -9
  421. package/src/components/inserter/test/reusable-blocks-tab.js +6 -6
  422. package/src/components/inserter/test/search-items.js +6 -0
  423. package/src/components/inserter-draggable-blocks/index.js +12 -2
  424. package/src/components/inserter-list-item/style.scss +22 -1
  425. package/src/components/letter-spacing-control/README.md +55 -0
  426. package/src/components/line-height-control/index.js +1 -0
  427. package/src/components/link-control/README.md +3 -3
  428. package/src/components/link-control/test/index.js +1 -1
  429. package/src/components/list-view/drop-indicator.js +1 -0
  430. package/src/components/list-view/style.scss +1 -36
  431. package/src/components/list-view/use-list-view-drop-zone.js +4 -18
  432. package/src/components/media-replace-flow/index.js +1 -1
  433. package/src/components/media-replace-flow/test/index.js +69 -51
  434. package/src/components/panel-color-settings/test/index.js +4 -4
  435. package/src/components/preview-options/index.js +2 -2
  436. package/src/components/preview-options/style.scss +1 -1
  437. package/src/components/provider/test/use-block-sync.js +131 -165
  438. package/src/components/responsive-block-control/test/index.js +4 -4
  439. package/src/components/rich-text/format-toolbar/index.js +1 -1
  440. package/src/components/rich-text/format-toolbar-container.js +1 -1
  441. package/src/components/rich-text/use-paste-handler.js +1 -1
  442. package/src/components/spacing-sizes-control/all-input-control.js +4 -0
  443. package/src/components/spacing-sizes-control/axial-input-controls.js +4 -0
  444. package/src/components/spacing-sizes-control/index.js +4 -0
  445. package/src/components/spacing-sizes-control/input-controls.js +4 -0
  446. package/src/components/spacing-sizes-control/spacing-input-control.js +26 -3
  447. package/src/components/spacing-sizes-control/style.scss +27 -19
  448. package/src/components/url-input/index.js +1 -1
  449. package/src/components/use-block-drop-zone/index.js +136 -79
  450. package/src/components/use-block-drop-zone/test/index.js +333 -81
  451. package/src/components/use-on-block-drop/index.js +11 -12
  452. package/src/components/use-on-block-drop/types.ts +1 -0
  453. package/src/hooks/align.js +3 -2
  454. package/src/hooks/align.native.js +5 -8
  455. package/src/hooks/border.js +1 -0
  456. package/src/hooks/dimensions.js +32 -5
  457. package/src/hooks/font-size.js +76 -0
  458. package/src/hooks/layout.js +7 -9
  459. package/src/hooks/margin.js +20 -14
  460. package/src/hooks/padding.js +20 -16
  461. package/src/hooks/style.js +122 -3
  462. package/src/hooks/test/align.js +96 -72
  463. package/src/hooks/test/style.js +206 -1
  464. package/src/hooks/test/use-typography-props.js +22 -0
  465. package/src/hooks/use-typography-props.js +18 -3
  466. package/src/hooks/utils.js +10 -7
  467. package/src/layouts/constrained.js +0 -1
  468. package/src/layouts/flex.js +1 -1
  469. package/src/store/actions.js +24 -12
  470. package/src/store/array.js +1 -6
  471. package/src/store/defaults.js +3 -0
  472. package/src/store/reducer.js +31 -24
  473. package/src/store/selectors.js +28 -21
  474. package/src/store/test/actions.js +0 -9
  475. package/src/store/test/selectors.js +1 -1
  476. package/src/utils/math.js +17 -0
  477. package/src/utils/pre-parse-patterns.js +12 -7
  478. package/build/components/inserter/pattern-panel.js +0 -87
  479. package/build/components/inserter/pattern-panel.js.map +0 -1
  480. package/build-module/components/inserter/pattern-panel.js +0 -74
  481. package/build-module/components/inserter/pattern-panel.js.map +0 -1
  482. package/src/components/inserter/pattern-panel.js +0 -93
@@ -42,7 +42,7 @@ function InlineSelectionToolbar( {
42
42
  function InlineToolbar( { popoverAnchor } ) {
43
43
  return (
44
44
  <Popover
45
- position="top center"
45
+ placement="top"
46
46
  focusOnMount={ false }
47
47
  anchor={ popoverAnchor }
48
48
  className="block-editor-rich-text__inline-format-toolbar"
@@ -255,7 +255,7 @@ export function usePasteHandler( props ) {
255
255
 
256
256
  /**
257
257
  * Normalizes a given string of HTML to remove the Windows-specific "Fragment"
258
- * comments and any preceeding and trailing content.
258
+ * comments and any preceding and trailing content.
259
259
  *
260
260
  * @param {string} html the html to be normalized
261
261
  * @return {string} the normalized html
@@ -16,6 +16,8 @@ export default function AllInputControl( {
16
16
  spacingSizes,
17
17
  type,
18
18
  minimumCustomValue,
19
+ onMouseOver,
20
+ onMouseOut,
19
21
  } ) {
20
22
  const allValue = getAllRawValue( values );
21
23
  const hasValues = isValuesDefined( values );
@@ -35,6 +37,8 @@ export default function AllInputControl( {
35
37
  isMixed={ isMixed }
36
38
  type={ type }
37
39
  minimumCustomValue={ minimumCustomValue }
40
+ onMouseOver={ onMouseOver }
41
+ onMouseOut={ onMouseOut }
38
42
  />
39
43
  );
40
44
  }
@@ -13,6 +13,8 @@ export default function AxialInputControls( {
13
13
  spacingSizes,
14
14
  type,
15
15
  minimumCustomValue,
16
+ onMouseOver,
17
+ onMouseOut,
16
18
  } ) {
17
19
  const createHandleOnChange = ( side ) => ( next ) => {
18
20
  if ( ! onChange ) {
@@ -54,6 +56,8 @@ export default function AxialInputControls( {
54
56
  spacingSizes={ spacingSizes }
55
57
  type={ type }
56
58
  minimumCustomValue={ minimumCustomValue }
59
+ onMouseOver={ onMouseOver }
60
+ onMouseOut={ onMouseOut }
57
61
  />
58
62
  );
59
63
  } ) }
@@ -29,6 +29,8 @@ export default function SpacingSizesControl( {
29
29
  splitOnAxis = false,
30
30
  useSelect,
31
31
  minimumCustomValue = 0,
32
+ onMouseOver,
33
+ onMouseOut,
32
34
  } ) {
33
35
  const spacingSizes = [
34
36
  { name: 0, slug: '0', size: 0 },
@@ -70,6 +72,8 @@ export default function SpacingSizesControl( {
70
72
  useSelect,
71
73
  type: label,
72
74
  minimumCustomValue,
75
+ onMouseOver,
76
+ onMouseOut,
73
77
  };
74
78
 
75
79
  return (
@@ -11,6 +11,8 @@ export default function BoxInputControls( {
11
11
  spacingSizes,
12
12
  type,
13
13
  minimumCustomValue,
14
+ onMouseOver,
15
+ onMouseOut,
14
16
  } ) {
15
17
  // Filter sides if custom configuration provided, maintaining default order.
16
18
  const filteredSides = sides?.length
@@ -38,6 +40,8 @@ export default function BoxInputControls( {
38
40
  spacingSizes={ spacingSizes }
39
41
  type={ type }
40
42
  minimumCustomValue={ minimumCustomValue }
43
+ onMouseOver={ onMouseOver }
44
+ onMouseOut={ onMouseOut }
41
45
  />
42
46
  );
43
47
  } ) }
@@ -34,6 +34,15 @@ import {
34
34
  isValueSpacingPreset,
35
35
  } from './utils';
36
36
 
37
+ const CUSTOM_VALUE_SETTINGS = {
38
+ px: { max: 300, steps: 1 },
39
+ '%': { max: 100, steps: 1 },
40
+ vw: { max: 100, steps: 1 },
41
+ vh: { max: 100, steps: 1 },
42
+ em: { max: 10, steps: 0.1 },
43
+ rm: { max: 10, steps: 0.1 },
44
+ };
45
+
37
46
  export default function SpacingInputControl( {
38
47
  spacingSizes,
39
48
  value,
@@ -42,6 +51,8 @@ export default function SpacingInputControl( {
42
51
  isMixed = false,
43
52
  type,
44
53
  minimumCustomValue,
54
+ onMouseOver,
55
+ onMouseOut,
45
56
  } ) {
46
57
  // Treat value as a preset value if the passed in value matches the value of one of the spacingSizes.
47
58
  value = getPresetValueFromCustomValue( value, spacingSizes );
@@ -107,7 +118,7 @@ export default function SpacingInputControl( {
107
118
  const customTooltipContent = ( newValue ) =>
108
119
  value === undefined ? undefined : spacingSizes[ newValue ]?.name;
109
120
 
110
- const customRangeValue = parseInt( currentValue, 10 );
121
+ const customRangeValue = parseFloat( currentValue, 10 );
111
122
 
112
123
  const getNewCustomValue = ( newSize ) => {
113
124
  const isNumeric = ! isNaN( parseFloat( newSize ) );
@@ -209,6 +220,8 @@ export default function SpacingInputControl( {
209
220
  { showCustomValueControl && (
210
221
  <>
211
222
  <UnitControl
223
+ onMouseOver={ onMouseOver }
224
+ onMouseOut={ onMouseOut }
212
225
  onChange={ ( newSize ) =>
213
226
  onChange( getNewCustomValue( newSize ) )
214
227
  }
@@ -220,13 +233,18 @@ export default function SpacingInputControl( {
220
233
  label={ ariaLabel }
221
234
  hideLabelFromVision={ true }
222
235
  className="components-spacing-sizes-control__custom-value-input"
223
- style={ { gridColumn: '1' } }
236
+ size={ '__unstable-large' }
224
237
  />
225
238
 
226
239
  <RangeControl
240
+ onMouseOver={ onMouseOver }
241
+ onMouseOut={ onMouseOut }
227
242
  value={ customRangeValue }
228
243
  min={ 0 }
229
- max={ 100 }
244
+ max={ CUSTOM_VALUE_SETTINGS[ selectedUnit ]?.max ?? 10 }
245
+ step={
246
+ CUSTOM_VALUE_SETTINGS[ selectedUnit ]?.steps ?? 0.1
247
+ }
230
248
  withInputField={ false }
231
249
  onChange={ handleCustomValueSliderChange }
232
250
  className="components-spacing-sizes-control__custom-value-range"
@@ -235,6 +253,8 @@ export default function SpacingInputControl( {
235
253
  ) }
236
254
  { showRangeControl && ! showCustomValueControl && (
237
255
  <RangeControl
256
+ onMouseOver={ onMouseOver }
257
+ onMouseOut={ onMouseOut }
238
258
  className="components-spacing-sizes-control__range-control"
239
259
  value={ currentValue }
240
260
  onChange={ ( newSize ) =>
@@ -279,6 +299,9 @@ export default function SpacingInputControl( {
279
299
  label={ ariaLabel }
280
300
  hideLabelFromVision={ true }
281
301
  __nextUnconstrainedWidth={ true }
302
+ size={ '__unstable-large' }
303
+ onMouseOver={ onMouseOver }
304
+ onMouseOut={ onMouseOut }
282
305
  />
283
306
  ) }
284
307
  </>
@@ -2,7 +2,7 @@
2
2
  display: grid;
3
3
  grid-template-columns: auto 1fr auto;
4
4
  align-items: center;
5
- grid-template-rows: 25px auto;
5
+ grid-template-rows: 16px auto;
6
6
  }
7
7
 
8
8
  .component-spacing-sizes-control {
@@ -27,7 +27,7 @@
27
27
  grid-column: 1 / 1;
28
28
  justify-content: left;
29
29
  height: $grid-unit-20;
30
- margin-top: $grid-unit-15;
30
+ margin-top: $grid-unit-20;
31
31
  }
32
32
 
33
33
  .components-spacing-sizes-control__side-label {
@@ -37,8 +37,9 @@
37
37
  }
38
38
 
39
39
  &.is-unlinked {
40
- .components-range-control.components-spacing-sizes-control__range-control {
41
- margin-top: $grid-unit-15;
40
+ .components-range-control.components-spacing-sizes-control__range-control,
41
+ .components-spacing-sizes-control__custom-value-input {
42
+ margin-top: $grid-unit-10;
42
43
  }
43
44
  }
44
45
 
@@ -60,12 +61,7 @@
60
61
  grid-column: 2 / 2;
61
62
  grid-row: 1 / 1;
62
63
  justify-self: end;
63
- padding: 0;
64
- &.is-small.has-icon {
65
- padding: 0;
66
- min-width: $icon-size;
67
- height: $grid-unit-20;
68
- }
64
+ margin-top: -4px;
69
65
  }
70
66
 
71
67
  .component-spacing-sizes-control__linked-button ~ .components-spacing-sizes-control__custom-toggle-all {
@@ -75,33 +71,44 @@
75
71
  .components-spacing-sizes-control__custom-toggle-single {
76
72
  grid-column: 3 / 3;
77
73
  justify-self: end;
78
- &.is-small.has-icon {
79
- padding: 0;
80
- min-width: $icon-size;
81
- height: $grid-unit-20;
82
- margin-top: $grid-unit-15;
83
- }
74
+ margin-top: $grid-unit-15;
84
75
  }
85
76
 
86
77
  .component-spacing-sizes-control__linked-button {
87
78
  grid-column: 3 / 3;
88
79
  grid-row: 1 / 1;
89
80
  justify-self: end;
81
+ line-height: 0;
82
+ margin-top: -4px;
90
83
  }
91
84
 
92
85
  .components-spacing-sizes-control__custom-value-range {
93
86
  grid-column: span 2;
94
- margin-left: $grid-unit-10;
95
- height: 30px;
87
+ margin-left: $grid-unit-20;
88
+ margin-top: 8px;
96
89
  }
97
90
 
98
91
  .components-spacing-sizes-control__custom-value-input {
99
92
  width: 124px;
93
+ margin-top: 8px;
94
+ grid-column: 1;
95
+ }
96
+
97
+ .components-range-control {
98
+ height: 40px;
99
+ /* Vertically center the RangeControl until it has true 40px height. */
100
+ display: flex;
101
+ align-items: center;
102
+
103
+ > .components-base-control__field {
104
+ /* Fixes RangeControl contents when the outer wrapper is flex */
105
+ flex: 1;
106
+ }
100
107
  }
101
108
 
102
109
  .components-spacing-sizes-control__range-control {
103
110
  grid-column: span 3;
104
- height: 40px;
111
+ margin-top: 8px;
105
112
  }
106
113
 
107
114
  .components-range-control__mark {
@@ -125,5 +132,6 @@
125
132
 
126
133
  .components-spacing-sizes-control__custom-select-control {
127
134
  grid-column: span 3;
135
+ margin-top: $grid-unit-10;
128
136
  }
129
137
  }
@@ -543,7 +543,7 @@ class URLInput extends Component {
543
543
  !! suggestions.length
544
544
  ) {
545
545
  return (
546
- <Popover position="bottom" focusOnMount={ false }>
546
+ <Popover placement="bottom" focusOnMount={ false }>
547
547
  <div
548
548
  { ...suggestionsListProps }
549
549
  className={ classnames(
@@ -8,15 +8,20 @@ import {
8
8
  __experimentalUseDropZone as useDropZone,
9
9
  } from '@wordpress/compose';
10
10
  import { isRTL } from '@wordpress/i18n';
11
+ import { isUnmodifiedDefaultBlock as getIsUnmodifiedDefaultBlock } from '@wordpress/blocks';
11
12
 
12
13
  /**
13
14
  * Internal dependencies
14
15
  */
15
16
  import useOnBlockDrop from '../use-on-block-drop';
16
- import { getDistanceToNearestEdge } from '../../utils/math';
17
+ import {
18
+ getDistanceToNearestEdge,
19
+ isPointContainedByRect,
20
+ } from '../../utils/math';
17
21
  import { store as blockEditorStore } from '../../store';
18
22
 
19
23
  /** @typedef {import('../../utils/math').WPPoint} WPPoint */
24
+ /** @typedef {import('../use-on-block-drop/types').WPDropOperation} WPDropOperation */
20
25
 
21
26
  /**
22
27
  * The orientation of a block list.
@@ -25,16 +30,31 @@ import { store as blockEditorStore } from '../../store';
25
30
  */
26
31
 
27
32
  /**
28
- * Given a list of block DOM elements finds the index that a block should be dropped
29
- * at.
33
+ * The insert position when dropping a block.
30
34
  *
31
- * @param {Element[]} elements Array of DOM elements that represent each block in a block list.
32
- * @param {WPPoint} position The position of the item being dragged.
33
- * @param {WPBlockListOrientation} orientation The orientation of a block list.
35
+ * @typedef {'before'|'after'} WPInsertPosition
36
+ */
37
+
38
+ /**
39
+ * @typedef {Object} WPBlockData
40
+ * @property {boolean} isUnmodifiedDefaultBlock Is the block unmodified default block.
41
+ * @property {() => DOMRect} getBoundingClientRect Get the bounding client rect of the block.
42
+ * @property {number} blockIndex The index of the block.
43
+ */
44
+
45
+ /**
46
+ * Get the drop target position from a given drop point and the orientation.
34
47
  *
35
- * @return {number|undefined} The block index that's closest to the drag position.
48
+ * @param {WPBlockData[]} blocksData The block data list.
49
+ * @param {WPPoint} position The position of the item being dragged.
50
+ * @param {WPBlockListOrientation} orientation The orientation of the block list.
51
+ * @return {[number, WPDropOperation]} The drop target position.
36
52
  */
37
- export function getNearestBlockIndex( elements, position, orientation ) {
53
+ export function getDropTargetPosition(
54
+ blocksData,
55
+ position,
56
+ orientation = 'vertical'
57
+ ) {
38
58
  const allowedEdges =
39
59
  orientation === 'horizontal'
40
60
  ? [ 'left', 'right' ]
@@ -42,49 +62,67 @@ export function getNearestBlockIndex( elements, position, orientation ) {
42
62
 
43
63
  const isRightToLeft = isRTL();
44
64
 
45
- let candidateIndex;
46
- let candidateDistance;
47
-
48
- elements.forEach( ( element, index ) => {
49
- const rect = element.getBoundingClientRect();
50
- const [ distance, edge ] = getDistanceToNearestEdge(
51
- position,
52
- rect,
53
- allowedEdges
54
- );
55
-
56
- if ( candidateDistance === undefined || distance < candidateDistance ) {
57
- // If the user is dropping to the trailing edge of the block
58
- // add 1 to the index to represent dragging after.
59
- // Take RTL languages into account where the left edge is
60
- // the trailing edge.
61
- const isTrailingEdge =
62
- edge === 'bottom' ||
63
- ( ! isRightToLeft && edge === 'right' ) ||
64
- ( isRightToLeft && edge === 'left' );
65
- const offset = isTrailingEdge ? 1 : 0;
66
-
67
- // Update the currently known best candidate.
68
- candidateDistance = distance;
69
- candidateIndex = index + offset;
70
- }
71
- } );
65
+ let nearestIndex = 0;
66
+ let insertPosition = 'before';
67
+ let minDistance = Infinity;
72
68
 
73
- return candidateIndex;
74
- }
69
+ blocksData.forEach(
70
+ ( { isUnmodifiedDefaultBlock, getBoundingClientRect, blockIndex } ) => {
71
+ const rect = getBoundingClientRect();
75
72
 
76
- /**
77
- * Determine if the element is an empty paragraph block.
78
- *
79
- * @param {?HTMLElement} element The element being tested.
80
- * @return {boolean} True or False.
81
- */
82
- function isEmptyParagraph( element ) {
83
- return (
84
- !! element &&
85
- element.dataset.type === 'core/paragraph' &&
86
- element.dataset.empty === 'true'
73
+ let [ distance, edge ] = getDistanceToNearestEdge(
74
+ position,
75
+ rect,
76
+ allowedEdges
77
+ );
78
+ // Prioritize the element if the point is inside of an unmodified default block.
79
+ if (
80
+ isUnmodifiedDefaultBlock &&
81
+ isPointContainedByRect( position, rect )
82
+ ) {
83
+ distance = 0;
84
+ }
85
+
86
+ if ( distance < minDistance ) {
87
+ // Where the dropped block will be inserted on the nearest block.
88
+ insertPosition =
89
+ edge === 'bottom' ||
90
+ ( ! isRightToLeft && edge === 'right' ) ||
91
+ ( isRightToLeft && edge === 'left' )
92
+ ? 'after'
93
+ : 'before';
94
+
95
+ // Update the currently known best candidate.
96
+ minDistance = distance;
97
+ nearestIndex = blockIndex;
98
+ }
99
+ }
87
100
  );
101
+
102
+ const adjacentIndex =
103
+ nearestIndex + ( insertPosition === 'after' ? 1 : -1 );
104
+ const isNearestBlockUnmodifiedDefaultBlock =
105
+ !! blocksData[ nearestIndex ]?.isUnmodifiedDefaultBlock;
106
+ const isAdjacentBlockUnmodifiedDefaultBlock =
107
+ !! blocksData[ adjacentIndex ]?.isUnmodifiedDefaultBlock;
108
+
109
+ // If both blocks are not unmodified default blocks then just insert between them.
110
+ if (
111
+ ! isNearestBlockUnmodifiedDefaultBlock &&
112
+ ! isAdjacentBlockUnmodifiedDefaultBlock
113
+ ) {
114
+ // If the user is dropping to the trailing edge of the block
115
+ // add 1 to the index to represent dragging after.
116
+ const insertionIndex =
117
+ insertPosition === 'after' ? nearestIndex + 1 : nearestIndex;
118
+ return [ insertionIndex, 'insert' ];
119
+ }
120
+
121
+ // Otherwise, replace the nearest unmodified default block.
122
+ return [
123
+ isNearestBlockUnmodifiedDefaultBlock ? nearestIndex : adjacentIndex,
124
+ 'replace',
125
+ ];
88
126
  }
89
127
 
90
128
  /**
@@ -104,7 +142,10 @@ export default function useBlockDropZone( {
104
142
  // an empty string to represent top-level blocks.
105
143
  rootClientId: targetRootClientId = '',
106
144
  } = {} ) {
107
- const [ targetBlockIndex, setTargetBlockIndex ] = useState( null );
145
+ const [ dropTarget, setDropTarget ] = useState( {
146
+ index: null,
147
+ operation: 'insert',
148
+ } );
108
149
 
109
150
  const isDisabled = useSelect(
110
151
  ( select ) => {
@@ -125,40 +166,58 @@ export default function useBlockDropZone( {
125
166
  [ targetRootClientId ]
126
167
  );
127
168
 
128
- const { getBlockListSettings } = useSelect( blockEditorStore );
169
+ const { getBlockListSettings, getBlocks, getBlockIndex } =
170
+ useSelect( blockEditorStore );
129
171
  const { showInsertionPoint, hideInsertionPoint } =
130
172
  useDispatch( blockEditorStore );
131
173
 
132
- const onBlockDrop = useOnBlockDrop( targetRootClientId, targetBlockIndex );
174
+ const onBlockDrop = useOnBlockDrop( targetRootClientId, dropTarget.index, {
175
+ operation: dropTarget.operation,
176
+ } );
133
177
  const throttled = useThrottle(
134
- useCallback( ( event, currentTarget ) => {
135
- const blockElements = Array.from( currentTarget.children ).filter(
136
- // Ensure the element is a block. It should have the `wp-block` class.
137
- ( element ) => element.classList.contains( 'wp-block' )
138
- );
139
- const targetIndex = getNearestBlockIndex(
140
- blockElements,
141
- { x: event.clientX, y: event.clientY },
142
- getBlockListSettings( targetRootClientId )?.orientation
143
- );
144
-
145
- setTargetBlockIndex( targetIndex === undefined ? 0 : targetIndex );
146
-
147
- if ( targetIndex !== undefined ) {
148
- const nextBlock = blockElements[ targetIndex ];
149
- const previousBlock = blockElements[ targetIndex - 1 ];
150
-
151
- // Don't show the insertion point when it's near an empty paragraph block.
152
- if (
153
- isEmptyParagraph( nextBlock ) ||
154
- isEmptyParagraph( previousBlock )
155
- ) {
178
+ useCallback(
179
+ ( event, ownerDocument ) => {
180
+ const blocks = getBlocks( targetRootClientId );
181
+
182
+ // The block list is empty, don't show the insertion point but still allow dropping.
183
+ if ( blocks.length === 0 ) {
184
+ setDropTarget( {
185
+ index: 0,
186
+ operation: 'insert',
187
+ } );
156
188
  return;
157
189
  }
158
190
 
159
- showInsertionPoint( targetRootClientId, targetIndex );
160
- }
161
- }, [] ),
191
+ const blocksData = blocks.map( ( block ) => {
192
+ const clientId = block.clientId;
193
+
194
+ return {
195
+ isUnmodifiedDefaultBlock:
196
+ getIsUnmodifiedDefaultBlock( block ),
197
+ getBoundingClientRect: () =>
198
+ ownerDocument
199
+ .getElementById( `block-${ clientId }` )
200
+ .getBoundingClientRect(),
201
+ blockIndex: getBlockIndex( clientId ),
202
+ };
203
+ } );
204
+
205
+ const [ targetIndex, operation ] = getDropTargetPosition(
206
+ blocksData,
207
+ { x: event.clientX, y: event.clientY },
208
+ getBlockListSettings( targetRootClientId )?.orientation
209
+ );
210
+
211
+ setDropTarget( {
212
+ index: targetIndex,
213
+ operation,
214
+ } );
215
+ showInsertionPoint( targetRootClientId, targetIndex, {
216
+ operation,
217
+ } );
218
+ },
219
+ [ targetRootClientId ]
220
+ ),
162
221
  200
163
222
  );
164
223
 
@@ -169,17 +228,15 @@ export default function useBlockDropZone( {
169
228
  // `currentTarget` is only available while the event is being
170
229
  // handled, so get it now and pass it to the thottled function.
171
230
  // https://developer.mozilla.org/en-US/docs/Web/API/Event/currentTarget
172
- throttled( event, event.currentTarget );
231
+ throttled( event, event.currentTarget.ownerDocument );
173
232
  },
174
233
  onDragLeave() {
175
234
  throttled.cancel();
176
235
  hideInsertionPoint();
177
- setTargetBlockIndex( null );
178
236
  },
179
237
  onDragEnd() {
180
238
  throttled.cancel();
181
239
  hideInsertionPoint();
182
- setTargetBlockIndex( null );
183
240
  },
184
241
  } );
185
242
  }