@wordpress/block-editor 10.1.1-next.4d3b314fd5.0 → 10.3.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 (327) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +41 -0
  3. package/build/components/block-controls/slot.js +2 -2
  4. package/build/components/block-controls/slot.js.map +1 -1
  5. package/build/components/block-draggable/draggable-chip.js +4 -2
  6. package/build/components/block-draggable/draggable-chip.js.map +1 -1
  7. package/build/components/block-inspector/index.js +4 -5
  8. package/build/components/block-inspector/index.js.map +1 -1
  9. package/build/components/block-list/block-list-compact.native.js +1 -0
  10. package/build/components/block-list/block-list-compact.native.js.map +1 -1
  11. package/build/components/block-list/block.js +72 -14
  12. package/build/components/block-list/block.js.map +1 -1
  13. package/build/components/block-list/block.native.js +79 -12
  14. package/build/components/block-list/block.native.js.map +1 -1
  15. package/build/components/block-list/use-in-between-inserter.js +7 -23
  16. package/build/components/block-list/use-in-between-inserter.js.map +1 -1
  17. package/build/components/block-lock/modal.js +9 -6
  18. package/build/components/block-lock/modal.js.map +1 -1
  19. package/build/components/block-parent-selector/index.js +5 -5
  20. package/build/components/block-parent-selector/index.js.map +1 -1
  21. package/build/components/block-patterns-list/index.js +5 -4
  22. package/build/components/block-patterns-list/index.js.map +1 -1
  23. package/build/components/block-popover/drop-zone.js +85 -0
  24. package/build/components/block-popover/drop-zone.js.map +1 -0
  25. package/build/components/block-popover/inbetween.js +3 -1
  26. package/build/components/block-popover/inbetween.js.map +1 -1
  27. package/build/components/block-popover/index.js +22 -17
  28. package/build/components/block-popover/index.js.map +1 -1
  29. package/build/components/block-preview/auto.js +2 -2
  30. package/build/components/block-preview/auto.js.map +1 -1
  31. package/build/components/block-preview/index.js +6 -9
  32. package/build/components/block-preview/index.js.map +1 -1
  33. package/build/components/block-preview/live.js +3 -7
  34. package/build/components/block-preview/live.js.map +1 -1
  35. package/build/components/block-selection-clearer/index.js +9 -1
  36. package/build/components/block-selection-clearer/index.js.map +1 -1
  37. package/build/components/block-settings-menu/block-settings-dropdown.js +22 -16
  38. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  39. package/build/components/block-styles/index.js +18 -42
  40. package/build/components/block-styles/index.js.map +1 -1
  41. package/build/components/block-toolbar/index.js +4 -4
  42. package/build/components/block-toolbar/index.js.map +1 -1
  43. package/build/components/block-tools/back-compat.js +2 -1
  44. package/build/components/block-tools/back-compat.js.map +1 -1
  45. package/build/components/block-tools/insertion-point.js +50 -20
  46. package/build/components/block-tools/insertion-point.js.map +1 -1
  47. package/build/components/block-tools/selected-block-popover.js +15 -3
  48. package/build/components/block-tools/selected-block-popover.js.map +1 -1
  49. package/build/components/colors-gradients/control.js +1 -1
  50. package/build/components/colors-gradients/control.js.map +1 -1
  51. package/build/components/colors-gradients/panel-color-gradient-settings.js +2 -2
  52. package/build/components/colors-gradients/panel-color-gradient-settings.js.map +1 -1
  53. package/build/components/font-sizes/fluid-utils.js +256 -0
  54. package/build/components/font-sizes/fluid-utils.js.map +1 -0
  55. package/build/components/font-sizes/index.js +8 -0
  56. package/build/components/font-sizes/index.js.map +1 -1
  57. package/build/components/image-editor/use-transform-image.js +2 -2
  58. package/build/components/image-editor/use-transform-image.js.map +1 -1
  59. package/build/components/index.js +0 -9
  60. package/build/components/index.js.map +1 -1
  61. package/build/components/inner-blocks/use-inner-block-template-sync.js +3 -2
  62. package/build/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  63. package/build/components/inserter/block-patterns-tab.js +151 -78
  64. package/build/components/inserter/block-patterns-tab.js.map +1 -1
  65. package/build/components/inserter/block-types-tab.js +1 -1
  66. package/build/components/inserter/block-types-tab.js.map +1 -1
  67. package/build/components/inserter/menu.js +14 -3
  68. package/build/components/inserter/menu.js.map +1 -1
  69. package/build/components/inserter/search-items.js +2 -17
  70. package/build/components/inserter/search-items.js.map +1 -1
  71. package/build/components/inserter-draggable-blocks/index.js +4 -2
  72. package/build/components/inserter-draggable-blocks/index.js.map +1 -1
  73. package/build/components/inspector-controls/slot.js +2 -1
  74. package/build/components/inspector-controls/slot.js.map +1 -1
  75. package/build/components/list-view/use-list-view-drop-zone.js +1 -14
  76. package/build/components/list-view/use-list-view-drop-zone.js.map +1 -1
  77. package/build/components/preview-options/index.js +2 -3
  78. package/build/components/preview-options/index.js.map +1 -1
  79. package/build/components/rich-text/index.js +17 -0
  80. package/build/components/rich-text/index.js.map +1 -1
  81. package/build/components/spacing-sizes-control/index.js +10 -2
  82. package/build/components/spacing-sizes-control/index.js.map +1 -1
  83. package/build/components/spacing-sizes-control/spacing-input-control.js +40 -9
  84. package/build/components/spacing-sizes-control/spacing-input-control.js.map +1 -1
  85. package/build/components/use-block-drop-zone/index.js +98 -57
  86. package/build/components/use-block-drop-zone/index.js.map +1 -1
  87. package/build/components/use-on-block-drop/index.js +12 -12
  88. package/build/components/use-on-block-drop/index.js.map +1 -1
  89. package/build/components/use-on-block-drop/types.js +6 -0
  90. package/build/components/use-on-block-drop/types.js.map +1 -0
  91. package/build/hooks/align.js +1 -3
  92. package/build/hooks/align.js.map +1 -1
  93. package/build/hooks/align.native.js +1 -7
  94. package/build/hooks/align.native.js.map +1 -1
  95. package/build/hooks/font-size.js +60 -0
  96. package/build/hooks/font-size.js.map +1 -1
  97. package/build/hooks/margin.js +6 -5
  98. package/build/hooks/margin.js.map +1 -1
  99. package/build/hooks/padding.js +2 -1
  100. package/build/hooks/padding.js.map +1 -1
  101. package/build/hooks/style.js +126 -4
  102. package/build/hooks/style.js.map +1 -1
  103. package/build/hooks/use-typography-props.js +17 -3
  104. package/build/hooks/use-typography-props.js.map +1 -1
  105. package/build/hooks/utils.js +1 -1
  106. package/build/hooks/utils.js.map +1 -1
  107. package/build/store/actions.js +59 -45
  108. package/build/store/actions.js.map +1 -1
  109. package/build/store/defaults.js +3 -0
  110. package/build/store/defaults.js.map +1 -1
  111. package/build/store/reducer.js +36 -18
  112. package/build/store/reducer.js.map +1 -1
  113. package/build/utils/math.js +14 -0
  114. package/build/utils/math.js.map +1 -1
  115. package/build/utils/pre-parse-patterns.js +19 -2
  116. package/build/utils/pre-parse-patterns.js.map +1 -1
  117. package/build-module/components/block-controls/slot.js +3 -3
  118. package/build-module/components/block-controls/slot.js.map +1 -1
  119. package/build-module/components/block-draggable/draggable-chip.js +7 -3
  120. package/build-module/components/block-draggable/draggable-chip.js.map +1 -1
  121. package/build-module/components/block-inspector/index.js +5 -6
  122. package/build-module/components/block-inspector/index.js.map +1 -1
  123. package/build-module/components/block-list/block-list-compact.native.js +1 -0
  124. package/build-module/components/block-list/block-list-compact.native.js.map +1 -1
  125. package/build-module/components/block-list/block.js +72 -14
  126. package/build-module/components/block-list/block.js.map +1 -1
  127. package/build-module/components/block-list/block.native.js +80 -13
  128. package/build-module/components/block-list/block.native.js.map +1 -1
  129. package/build-module/components/block-list/use-in-between-inserter.js +8 -24
  130. package/build-module/components/block-list/use-in-between-inserter.js.map +1 -1
  131. package/build-module/components/block-lock/modal.js +10 -8
  132. package/build-module/components/block-lock/modal.js.map +1 -1
  133. package/build-module/components/block-parent-selector/index.js +5 -5
  134. package/build-module/components/block-parent-selector/index.js.map +1 -1
  135. package/build-module/components/block-patterns-list/index.js +5 -4
  136. package/build-module/components/block-patterns-list/index.js.map +1 -1
  137. package/build-module/components/block-popover/drop-zone.js +70 -0
  138. package/build-module/components/block-popover/drop-zone.js.map +1 -0
  139. package/build-module/components/block-popover/inbetween.js +3 -1
  140. package/build-module/components/block-popover/inbetween.js.map +1 -1
  141. package/build-module/components/block-popover/index.js +22 -17
  142. package/build-module/components/block-popover/index.js.map +1 -1
  143. package/build-module/components/block-preview/auto.js +1 -1
  144. package/build-module/components/block-preview/auto.js.map +1 -1
  145. package/build-module/components/block-preview/index.js +6 -9
  146. package/build-module/components/block-preview/index.js.map +1 -1
  147. package/build-module/components/block-preview/live.js +3 -6
  148. package/build-module/components/block-preview/live.js.map +1 -1
  149. package/build-module/components/block-selection-clearer/index.js +9 -1
  150. package/build-module/components/block-selection-clearer/index.js.map +1 -1
  151. package/build-module/components/block-settings-menu/block-settings-dropdown.js +25 -19
  152. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  153. package/build-module/components/block-styles/index.js +19 -44
  154. package/build-module/components/block-styles/index.js.map +1 -1
  155. package/build-module/components/block-toolbar/index.js +4 -4
  156. package/build-module/components/block-toolbar/index.js.map +1 -1
  157. package/build-module/components/block-tools/back-compat.js +2 -1
  158. package/build-module/components/block-tools/back-compat.js.map +1 -1
  159. package/build-module/components/block-tools/insertion-point.js +48 -20
  160. package/build-module/components/block-tools/insertion-point.js.map +1 -1
  161. package/build-module/components/block-tools/selected-block-popover.js +15 -3
  162. package/build-module/components/block-tools/selected-block-popover.js.map +1 -1
  163. package/build-module/components/colors-gradients/control.js +2 -2
  164. package/build-module/components/colors-gradients/control.js.map +1 -1
  165. package/build-module/components/colors-gradients/panel-color-gradient-settings.js +3 -3
  166. package/build-module/components/colors-gradients/panel-color-gradient-settings.js.map +1 -1
  167. package/build-module/components/font-sizes/fluid-utils.js +245 -0
  168. package/build-module/components/font-sizes/fluid-utils.js.map +1 -0
  169. package/build-module/components/font-sizes/index.js +1 -0
  170. package/build-module/components/font-sizes/index.js.map +1 -1
  171. package/build-module/components/image-editor/use-transform-image.js +2 -2
  172. package/build-module/components/image-editor/use-transform-image.js.map +1 -1
  173. package/build-module/components/index.js +0 -1
  174. package/build-module/components/index.js.map +1 -1
  175. package/build-module/components/inner-blocks/use-inner-block-template-sync.js +3 -2
  176. package/build-module/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  177. package/build-module/components/inserter/block-patterns-tab.js +148 -81
  178. package/build-module/components/inserter/block-patterns-tab.js.map +1 -1
  179. package/build-module/components/inserter/block-types-tab.js +3 -3
  180. package/build-module/components/inserter/block-types-tab.js.map +1 -1
  181. package/build-module/components/inserter/menu.js +10 -3
  182. package/build-module/components/inserter/menu.js.map +1 -1
  183. package/build-module/components/inserter/search-items.js +3 -17
  184. package/build-module/components/inserter/search-items.js.map +1 -1
  185. package/build-module/components/inserter-draggable-blocks/index.js +4 -2
  186. package/build-module/components/inserter-draggable-blocks/index.js.map +1 -1
  187. package/build-module/components/inspector-controls/slot.js +3 -2
  188. package/build-module/components/inspector-controls/slot.js.map +1 -1
  189. package/build-module/components/list-view/use-list-view-drop-zone.js +1 -14
  190. package/build-module/components/list-view/use-list-view-drop-zone.js.map +1 -1
  191. package/build-module/components/preview-options/index.js +2 -3
  192. package/build-module/components/preview-options/index.js.map +1 -1
  193. package/build-module/components/rich-text/index.js +17 -0
  194. package/build-module/components/rich-text/index.js.map +1 -1
  195. package/build-module/components/spacing-sizes-control/index.js +10 -3
  196. package/build-module/components/spacing-sizes-control/index.js.map +1 -1
  197. package/build-module/components/spacing-sizes-control/spacing-input-control.js +40 -10
  198. package/build-module/components/spacing-sizes-control/spacing-input-control.js.map +1 -1
  199. package/build-module/components/use-block-drop-zone/index.js +98 -58
  200. package/build-module/components/use-block-drop-zone/index.js.map +1 -1
  201. package/build-module/components/use-on-block-drop/index.js +12 -12
  202. package/build-module/components/use-on-block-drop/index.js.map +1 -1
  203. package/build-module/components/use-on-block-drop/types.js +2 -0
  204. package/build-module/components/use-on-block-drop/types.js.map +1 -0
  205. package/build-module/hooks/align.js +1 -2
  206. package/build-module/hooks/align.js.map +1 -1
  207. package/build-module/hooks/align.native.js +1 -6
  208. package/build-module/hooks/align.native.js.map +1 -1
  209. package/build-module/hooks/font-size.js +59 -1
  210. package/build-module/hooks/font-size.js.map +1 -1
  211. package/build-module/hooks/margin.js +6 -5
  212. package/build-module/hooks/margin.js.map +1 -1
  213. package/build-module/hooks/padding.js +2 -1
  214. package/build-module/hooks/padding.js.map +1 -1
  215. package/build-module/hooks/style.js +124 -3
  216. package/build-module/hooks/style.js.map +1 -1
  217. package/build-module/hooks/use-typography-props.js +17 -4
  218. package/build-module/hooks/use-typography-props.js.map +1 -1
  219. package/build-module/hooks/utils.js +2 -2
  220. package/build-module/hooks/utils.js.map +1 -1
  221. package/build-module/store/actions.js +55 -42
  222. package/build-module/store/actions.js.map +1 -1
  223. package/build-module/store/defaults.js +3 -0
  224. package/build-module/store/defaults.js.map +1 -1
  225. package/build-module/store/reducer.js +36 -19
  226. package/build-module/store/reducer.js.map +1 -1
  227. package/build-module/utils/math.js +12 -0
  228. package/build-module/utils/math.js.map +1 -1
  229. package/build-module/utils/pre-parse-patterns.js +19 -2
  230. package/build-module/utils/pre-parse-patterns.js.map +1 -1
  231. package/build-style/style-rtl.css +256 -152
  232. package/build-style/style.css +256 -152
  233. package/package.json +28 -29
  234. package/src/components/block-breadcrumb/test/index.js +1 -1
  235. package/src/components/block-controls/slot.js +3 -3
  236. package/src/components/block-draggable/draggable-chip.js +4 -2
  237. package/src/components/block-inspector/index.js +8 -11
  238. package/src/components/block-list/block-list-compact.native.js +1 -0
  239. package/src/components/block-list/block.js +111 -7
  240. package/src/components/block-list/block.native.js +123 -9
  241. package/src/components/block-list/style.scss +93 -126
  242. package/src/components/block-list/use-in-between-inserter.js +8 -19
  243. package/src/components/block-lock/modal.js +12 -7
  244. package/src/components/block-mover/style.scss +0 -1
  245. package/src/components/block-parent-selector/index.js +5 -5
  246. package/src/components/block-patterns-list/index.js +9 -5
  247. package/src/components/block-patterns-list/style.scss +7 -3
  248. package/src/components/block-popover/README.md +8 -0
  249. package/src/components/block-popover/drop-zone.js +63 -0
  250. package/src/components/block-popover/inbetween.js +1 -1
  251. package/src/components/block-popover/index.js +39 -22
  252. package/src/components/block-popover/style.scss +17 -1
  253. package/src/components/block-preview/auto.js +1 -1
  254. package/src/components/block-preview/index.js +7 -8
  255. package/src/components/block-preview/live.js +2 -7
  256. package/src/components/block-preview/test/index.js +1 -7
  257. package/src/components/block-selection-clearer/index.js +7 -2
  258. package/src/components/block-selection-clearer/test/index.js +118 -0
  259. package/src/components/block-settings-menu/block-settings-dropdown.js +32 -18
  260. package/src/components/block-settings-menu/test/block-mode-toggle.js +17 -17
  261. package/src/components/block-styles/index.js +26 -49
  262. package/src/components/block-switcher/test/__snapshots__/index.js.snap +104 -33
  263. package/src/components/block-switcher/test/index.js +121 -61
  264. package/src/components/block-toolbar/index.js +4 -6
  265. package/src/components/block-toolbar/style.scss +38 -14
  266. package/src/components/block-tools/back-compat.js +1 -0
  267. package/src/components/block-tools/insertion-point.js +42 -17
  268. package/src/components/block-tools/selected-block-popover.js +14 -1
  269. package/src/components/button-block-appender/style.scss +5 -1
  270. package/src/components/color-palette/test/__snapshots__/control.js.snap +32 -52
  271. package/src/components/color-palette/test/control.js +11 -15
  272. package/src/components/colors-gradients/control.js +2 -2
  273. package/src/components/colors-gradients/panel-color-gradient-settings.js +3 -4
  274. package/src/components/colors-gradients/test/control.js +49 -77
  275. package/src/components/font-sizes/fluid-utils.js +296 -0
  276. package/src/components/font-sizes/index.js +1 -0
  277. package/src/components/font-sizes/test/fluid-utils.js +168 -0
  278. package/src/components/image-editor/use-transform-image.js +2 -2
  279. package/src/components/image-size-control/test/index.js +47 -60
  280. package/src/components/index.js +0 -1
  281. package/src/components/inner-blocks/use-inner-block-template-sync.js +3 -2
  282. package/src/components/inserter/block-patterns-tab.js +232 -98
  283. package/src/components/inserter/block-types-tab.js +3 -3
  284. package/src/components/inserter/menu.js +15 -2
  285. package/src/components/inserter/search-items.js +3 -15
  286. package/src/components/inserter/style.scss +94 -9
  287. package/src/components/inserter/test/reusable-blocks-tab.js +6 -6
  288. package/src/components/inserter/test/search-items.js +4 -0
  289. package/src/components/inserter-draggable-blocks/index.js +12 -2
  290. package/src/components/inserter-list-item/style.scss +20 -1
  291. package/src/components/inspector-controls/slot.js +6 -2
  292. package/src/components/link-control/test/index.js +1 -1
  293. package/src/components/list-view/use-list-view-drop-zone.js +4 -18
  294. package/src/components/panel-color-settings/test/index.js +4 -4
  295. package/src/components/preview-options/index.js +2 -2
  296. package/src/components/preview-options/style.scss +1 -1
  297. package/src/components/provider/test/use-block-sync.js +131 -165
  298. package/src/components/responsive-block-control/test/index.js +77 -122
  299. package/src/components/rich-text/index.js +22 -0
  300. package/src/components/spacing-sizes-control/index.js +15 -3
  301. package/src/components/spacing-sizes-control/spacing-input-control.js +24 -9
  302. package/src/components/spacing-sizes-control/style.scss +42 -31
  303. package/src/components/use-block-drop-zone/index.js +136 -79
  304. package/src/components/use-block-drop-zone/test/index.js +333 -81
  305. package/src/components/use-on-block-drop/index.js +11 -12
  306. package/src/components/use-on-block-drop/types.ts +1 -0
  307. package/src/hooks/align.js +3 -2
  308. package/src/hooks/align.native.js +5 -8
  309. package/src/hooks/font-size.js +75 -0
  310. package/src/hooks/margin.js +5 -4
  311. package/src/hooks/padding.js +1 -0
  312. package/src/hooks/style.js +122 -3
  313. package/src/hooks/test/style.js +206 -1
  314. package/src/hooks/test/use-typography-props.js +22 -0
  315. package/src/hooks/use-typography-props.js +18 -3
  316. package/src/hooks/utils.js +6 -2
  317. package/src/store/actions.js +20 -12
  318. package/src/store/defaults.js +3 -0
  319. package/src/store/reducer.js +35 -28
  320. package/src/store/test/actions.js +0 -9
  321. package/src/utils/math.js +17 -0
  322. package/src/utils/pre-parse-patterns.js +12 -7
  323. package/build/components/inserter/pattern-panel.js +0 -87
  324. package/build/components/inserter/pattern-panel.js.map +0 -1
  325. package/build-module/components/inserter/pattern-panel.js +0 -74
  326. package/build-module/components/inserter/pattern-panel.js.map +0 -1
  327. package/src/components/inserter/pattern-panel.js +0 -93
@@ -32,6 +32,7 @@ function BlockPopover(
32
32
  __unstableCoverTarget = false,
33
33
  __unstablePopoverSlot,
34
34
  __unstableContentRef,
35
+ shift = true,
35
36
  ...props
36
37
  },
37
38
  ref
@@ -42,24 +43,15 @@ function BlockPopover(
42
43
  ref,
43
44
  usePopoverScroll( __unstableContentRef ),
44
45
  ] );
45
- const style = useMemo( () => {
46
- if ( ! selectedElement || lastSelectedElement !== selectedElement ) {
47
- return {};
48
- }
49
-
50
- return {
51
- position: 'absolute',
52
- width: selectedElement.offsetWidth,
53
- height: selectedElement.offsetHeight,
54
- };
55
- }, [ selectedElement, lastSelectedElement, __unstableRefreshSize ] );
56
46
 
57
- const [ popoverAnchorRecomputeCounter, forceRecomputePopoverAnchor ] =
58
- useReducer(
59
- // Module is there to make sure that the counter doesn't overflow.
60
- ( s ) => ( s + 1 ) % MAX_POPOVER_RECOMPUTE_COUNTER,
61
- 0
62
- );
47
+ const [
48
+ popoverDimensionsRecomputeCounter,
49
+ forceRecomputePopoverDimensions,
50
+ ] = useReducer(
51
+ // Module is there to make sure that the counter doesn't overflow.
52
+ ( s ) => ( s + 1 ) % MAX_POPOVER_RECOMPUTE_COUNTER,
53
+ 0
54
+ );
63
55
 
64
56
  // When blocks are moved up/down, they are animated to their new position by
65
57
  // updating the `transform` property manually (i.e. without using CSS
@@ -74,7 +66,7 @@ function BlockPopover(
74
66
  }
75
67
 
76
68
  const observer = new window.MutationObserver(
77
- forceRecomputePopoverAnchor
69
+ forceRecomputePopoverDimensions
78
70
  );
79
71
  observer.observe( selectedElement, { attributes: true } );
80
72
 
@@ -83,12 +75,36 @@ function BlockPopover(
83
75
  };
84
76
  }, [ selectedElement ] );
85
77
 
78
+ const style = useMemo( () => {
79
+ if (
80
+ // popoverDimensionsRecomputeCounter is by definition always equal or greater
81
+ // than 0. This check is only there to satisfy the correctness of the
82
+ // exhaustive-deps rule for the `useMemo` hook.
83
+ popoverDimensionsRecomputeCounter < 0 ||
84
+ ! selectedElement ||
85
+ lastSelectedElement !== selectedElement
86
+ ) {
87
+ return {};
88
+ }
89
+
90
+ return {
91
+ position: 'absolute',
92
+ width: selectedElement.offsetWidth,
93
+ height: selectedElement.offsetHeight,
94
+ };
95
+ }, [
96
+ selectedElement,
97
+ lastSelectedElement,
98
+ __unstableRefreshSize,
99
+ popoverDimensionsRecomputeCounter,
100
+ ] );
101
+
86
102
  const popoverAnchor = useMemo( () => {
87
103
  if (
88
- // popoverAnchorRecomputeCounter is by definition always equal or greater
104
+ // popoverDimensionsRecomputeCounter is by definition always equal or greater
89
105
  // than 0. This check is only there to satisfy the correctness of the
90
106
  // exhaustive-deps rule for the `useMemo` hook.
91
- popoverAnchorRecomputeCounter < 0 ||
107
+ popoverDimensionsRecomputeCounter < 0 ||
92
108
  ! selectedElement ||
93
109
  ( bottomClientId && ! lastSelectedElement )
94
110
  ) {
@@ -132,7 +148,7 @@ function BlockPopover(
132
148
  bottomClientId,
133
149
  lastSelectedElement,
134
150
  selectedElement,
135
- popoverAnchorRecomputeCounter,
151
+ popoverDimensionsRecomputeCounter,
136
152
  ] );
137
153
 
138
154
  if ( ! selectedElement || ( bottomClientId && ! lastSelectedElement ) ) {
@@ -148,9 +164,10 @@ function BlockPopover(
148
164
  // Render in the old slot if needed for backward compatibility,
149
165
  // otherwise render in place (not in the default popover slot).
150
166
  __unstableSlotName={ __unstablePopoverSlot || null }
167
+ placement="top-start"
151
168
  resize={ false }
152
169
  flip={ false }
153
- shift
170
+ shift={ shift }
154
171
  { ...props }
155
172
  className={ classnames(
156
173
  'block-editor-block-popover',
@@ -21,7 +21,7 @@
21
21
  }
22
22
 
23
23
  // Enable pointer events for the toolbar's content.
24
- &:not(.block-editor-block-popover__inbetween) .components-popover__content {
24
+ &:not(.block-editor-block-popover__inbetween, .block-editor-block-popover__drop-zone) .components-popover__content {
25
25
  * {
26
26
  pointer-events: all;
27
27
  }
@@ -48,3 +48,19 @@
48
48
  }
49
49
  }
50
50
  }
51
+
52
+
53
+ .components-popover.block-editor-block-popover__drop-zone {
54
+ // Disable pointer events for dragging and dropping.
55
+ // This drop zone is fully presentational, the actual DnD implementation is handled elsewhere.
56
+ * {
57
+ pointer-events: none;
58
+ }
59
+
60
+ .block-editor-block-popover__drop-zone-foreground {
61
+ position: absolute;
62
+ inset: 0;
63
+ background-color: var(--wp-admin-theme-color);
64
+ border-radius: 2px;
65
+ }
66
+ }
@@ -1,10 +1,10 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { Disabled } from '@wordpress/components';
5
4
  import { useResizeObserver, pure, useRefEffect } from '@wordpress/compose';
6
5
  import { useSelect } from '@wordpress/data';
7
6
  import { useMemo } from '@wordpress/element';
7
+ import { Disabled } from '@wordpress/components';
8
8
 
9
9
  /**
10
10
  * Internal dependencies
@@ -32,11 +32,10 @@ export function BlockPreview( {
32
32
  ( select ) => select( blockEditorStore ).getSettings(),
33
33
  []
34
34
  );
35
- const settings = useMemo( () => {
36
- const _settings = { ...originalSettings };
37
- _settings.__experimentalBlockPatterns = [];
38
- return _settings;
39
- }, [ originalSettings ] );
35
+ const settings = useMemo(
36
+ () => ( { ...originalSettings, __unstableIsPreviewMode: true } ),
37
+ [ originalSettings ]
38
+ );
40
39
  const renderedBlocks = useMemo( () => castArray( blocks ), [ blocks ] );
41
40
  if ( ! blocks || blocks.length === 0 ) {
42
41
  return null;
@@ -94,12 +93,12 @@ export function useBlockPreview( {
94
93
  ( select ) => select( blockEditorStore ).getSettings(),
95
94
  []
96
95
  );
97
- const disabledRef = useDisabled();
98
- const ref = useMergeRefs( [ props.ref, disabledRef ] );
99
96
  const settings = useMemo(
100
- () => ( { ...originalSettings, __experimentalBlockPatterns: [] } ),
97
+ () => ( { ...originalSettings, __unstableIsPreviewMode: true } ),
101
98
  [ originalSettings ]
102
99
  );
100
+ const disabledRef = useDisabled();
101
+ const ref = useMergeRefs( [ props.ref, disabledRef ] );
103
102
  const renderedBlocks = useMemo( () => castArray( blocks ), [ blocks ] );
104
103
 
105
104
  const children = (
@@ -1,8 +1,3 @@
1
- /**
2
- * WordPress dependencies
3
- */
4
- import { Disabled } from '@wordpress/components';
5
-
6
1
  /**
7
2
  * Internal dependencies
8
3
  */
@@ -16,9 +11,9 @@ export default function LiveBlockPreview( { onClick } ) {
16
11
  onClick={ onClick }
17
12
  onKeyPress={ onClick }
18
13
  >
19
- <Disabled>
14
+ <div inert="true">
20
15
  <BlockList />
21
- </Disabled>
16
+ </div>
22
17
  </div>
23
18
  );
24
19
  }
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { render, screen, waitFor } from '@testing-library/react';
4
+ import { render, screen } from '@testing-library/react';
5
5
 
6
6
  /**
7
7
  * WordPress dependencies
@@ -99,12 +99,6 @@ describe( 'useBlockPreview', () => {
99
99
  );
100
100
  expect( previewedBlockContents ).toBeInTheDocument();
101
101
 
102
- // Test elements within block contents are disabled.
103
- await waitFor( () => {
104
- const button = screen.getByText( 'Button' );
105
- expect( button.hasAttribute( 'disabled' ) ).toBe( true );
106
- } );
107
-
108
102
  // Ensure the block preview class names are merged with the component's class name.
109
103
  expect( container.firstChild.className ).toBe(
110
104
  'test-container-classname block-editor-block-preview__live-content components-disabled'
@@ -17,12 +17,17 @@ import { store as blockEditorStore } from '../../store';
17
17
  * @return {import('react').RefCallback} Ref callback.
18
18
  */
19
19
  export function useBlockSelectionClearer() {
20
- const { hasSelectedBlock, hasMultiSelection } =
20
+ const { getSettings, hasSelectedBlock, hasMultiSelection } =
21
21
  useSelect( blockEditorStore );
22
22
  const { clearSelectedBlock } = useDispatch( blockEditorStore );
23
+ const { __experimentalClearBlockSelection: isEnabled } = getSettings();
23
24
 
24
25
  return useRefEffect(
25
26
  ( node ) => {
27
+ if ( ! isEnabled ) {
28
+ return;
29
+ }
30
+
26
31
  function onMouseDown( event ) {
27
32
  if ( ! hasSelectedBlock() && ! hasMultiSelection() ) {
28
33
  return;
@@ -42,7 +47,7 @@ export function useBlockSelectionClearer() {
42
47
  node.removeEventListener( 'mousedown', onMouseDown );
43
48
  };
44
49
  },
45
- [ hasSelectedBlock, hasMultiSelection, clearSelectedBlock ]
50
+ [ hasSelectedBlock, hasMultiSelection, clearSelectedBlock, isEnabled ]
46
51
  );
47
52
  }
48
53
 
@@ -0,0 +1,118 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { fireEvent, render, screen } from '@testing-library/react';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { useDispatch, useSelect } from '@wordpress/data';
10
+
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+ import BlockSelectionClearer from '../';
15
+
16
+ const defaultUseSelectValues = {
17
+ hasSelectedBlock: jest.fn().mockReturnValue( false ),
18
+ hasMultiSelection: jest.fn().mockReturnValue( false ),
19
+ getSettings: jest.fn().mockReturnValue( {
20
+ __experimentalClearBlockSelection: true,
21
+ } ),
22
+ };
23
+
24
+ jest.mock( '@wordpress/data/src/components/use-dispatch', () => ( {
25
+ useDispatch: jest.fn(),
26
+ } ) );
27
+
28
+ jest.mock( '@wordpress/data/src/components/use-select', () => {
29
+ // This allows us to tweak the returned value on each test.
30
+ const mock = jest.fn();
31
+ return mock;
32
+ } );
33
+
34
+ describe( 'BlockSelectionClearer component', () => {
35
+ it( 'should clear the selected block when a selected block exists', () => {
36
+ const mockClearSelectedBlock = jest.fn();
37
+ useSelect.mockImplementation( () => ( {
38
+ ...defaultUseSelectValues,
39
+ hasSelectedBlock: jest.fn().mockReturnValue( true ),
40
+ } ) );
41
+ useDispatch.mockImplementation( () => ( {
42
+ clearSelectedBlock: mockClearSelectedBlock,
43
+ } ) );
44
+
45
+ render(
46
+ <BlockSelectionClearer>
47
+ <button>Not a block</button>
48
+ </BlockSelectionClearer>
49
+ );
50
+ const button = screen.getByRole( 'button' );
51
+ fireEvent.mouseDown( button.parentElement );
52
+
53
+ expect( mockClearSelectedBlock ).toBeCalled();
54
+ } );
55
+
56
+ it( 'should clear the selected block when multiple blocks are selected', () => {
57
+ const mockClearSelectedBlock = jest.fn();
58
+ useSelect.mockImplementation( () => ( {
59
+ ...defaultUseSelectValues,
60
+ hasMultiSelection: jest.fn().mockReturnValue( true ),
61
+ } ) );
62
+ useDispatch.mockImplementation( () => ( {
63
+ clearSelectedBlock: mockClearSelectedBlock,
64
+ } ) );
65
+
66
+ render(
67
+ <BlockSelectionClearer>
68
+ <button>Not a block</button>
69
+ </BlockSelectionClearer>
70
+ );
71
+ const button = screen.getByRole( 'button' );
72
+ fireEvent.mouseDown( button.parentElement );
73
+
74
+ expect( mockClearSelectedBlock ).toBeCalled();
75
+ } );
76
+
77
+ it( 'should not clear the block selection when no blocks are selected', () => {
78
+ const mockClearSelectedBlock = jest.fn();
79
+ useSelect.mockImplementation( () => defaultUseSelectValues );
80
+ useDispatch.mockImplementation( () => ( {
81
+ clearSelectedBlock: mockClearSelectedBlock,
82
+ } ) );
83
+
84
+ render(
85
+ <BlockSelectionClearer>
86
+ <button>Not a block</button>
87
+ </BlockSelectionClearer>
88
+ );
89
+ const button = screen.getByRole( 'button' );
90
+ fireEvent.mouseDown( button.parentElement );
91
+
92
+ expect( mockClearSelectedBlock ).not.toBeCalled();
93
+ } );
94
+
95
+ it( 'should not clear the block selection when the feature is disabled', () => {
96
+ const mockClearSelectedBlock = jest.fn();
97
+ useSelect.mockImplementation( () => ( {
98
+ ...defaultUseSelectValues,
99
+ hasSelectedBlock: jest.fn().mockReturnValue( true ),
100
+ getSettings: jest.fn().mockReturnValue( {
101
+ __experimentalClearBlockSelection: false,
102
+ } ),
103
+ } ) );
104
+ useDispatch.mockImplementation( () => ( {
105
+ clearSelectedBlock: mockClearSelectedBlock,
106
+ } ) );
107
+
108
+ render(
109
+ <BlockSelectionClearer>
110
+ <button>Not a block</button>
111
+ </BlockSelectionClearer>
112
+ );
113
+ const button = screen.getByRole( 'button' );
114
+ fireEvent.mouseDown( button.parentElement );
115
+
116
+ expect( mockClearSelectedBlock ).not.toBeCalled();
117
+ } );
118
+ } );
@@ -1,12 +1,16 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { castArray, flow } from 'lodash';
4
+ import { castArray } from 'lodash';
5
5
 
6
6
  /**
7
7
  * WordPress dependencies
8
8
  */
9
- import { getBlockType, serialize } from '@wordpress/blocks';
9
+ import {
10
+ getBlockType,
11
+ serialize,
12
+ store as blocksStore,
13
+ } from '@wordpress/blocks';
10
14
  import { DropdownMenu, MenuGroup, MenuItem } from '@wordpress/components';
11
15
  import { useDispatch, useSelect } from '@wordpress/data';
12
16
  import { moreVertical } from '@wordpress/icons';
@@ -18,7 +22,7 @@ import {
18
22
  } from '@wordpress/element';
19
23
  import { __, sprintf } from '@wordpress/i18n';
20
24
  import { store as keyboardShortcutsStore } from '@wordpress/keyboard-shortcuts';
21
- import { useCopyToClipboard } from '@wordpress/compose';
25
+ import { pipe, useCopyToClipboard } from '@wordpress/compose';
22
26
 
23
27
  /**
24
28
  * Internal dependencies
@@ -59,7 +63,7 @@ export function BlockSettingsDropdown( {
59
63
  const firstBlockClientId = blockClientIds[ 0 ];
60
64
  const {
61
65
  firstParentClientId,
62
- hasReducedUI,
66
+ isDistractionFree,
63
67
  onlyBlock,
64
68
  parentBlockType,
65
69
  previousBlockClientId,
@@ -70,22 +74,32 @@ export function BlockSettingsDropdown( {
70
74
  const {
71
75
  getBlockCount,
72
76
  getBlockName,
73
- getBlockParents,
77
+ getBlockRootClientId,
74
78
  getPreviousBlockClientId,
75
79
  getNextBlockClientId,
76
80
  getSelectedBlockClientIds,
77
81
  getSettings,
82
+ getBlockAttributes,
78
83
  } = select( blockEditorStore );
79
84
 
80
- const parents = getBlockParents( firstBlockClientId );
81
- const _firstParentClientId = parents[ parents.length - 1 ];
82
- const parentBlockName = getBlockName( _firstParentClientId );
85
+ const { getActiveBlockVariation } = select( blocksStore );
86
+
87
+ const _firstParentClientId =
88
+ getBlockRootClientId( firstBlockClientId );
89
+ const parentBlockName =
90
+ _firstParentClientId && getBlockName( _firstParentClientId );
83
91
 
84
92
  return {
85
93
  firstParentClientId: _firstParentClientId,
86
- hasReducedUI: getSettings().hasReducedUI,
87
- onlyBlock: 1 === getBlockCount(),
88
- parentBlockType: getBlockType( parentBlockName ),
94
+ isDistractionFree: getSettings().isDistractionFree,
95
+ onlyBlock: 1 === getBlockCount( _firstParentClientId ),
96
+ parentBlockType:
97
+ _firstParentClientId &&
98
+ ( getActiveBlockVariation(
99
+ parentBlockName,
100
+ getBlockAttributes( _firstParentClientId )
101
+ ) ||
102
+ getBlockType( parentBlockName ) ),
89
103
  previousBlockClientId:
90
104
  getPreviousBlockClientId( firstBlockClientId ),
91
105
  nextBlockClientId: getNextBlockClientId( firstBlockClientId ),
@@ -171,7 +185,7 @@ export function BlockSettingsDropdown( {
171
185
  const { gestures: showParentOutlineGestures } = useShowMoversGestures( {
172
186
  ref: selectParentButtonRef,
173
187
  onChange( isFocused ) {
174
- if ( isFocused && hasReducedUI ) {
188
+ if ( isFocused && isDistractionFree ) {
175
189
  return;
176
190
  }
177
191
  toggleBlockHighlight( firstParentClientId, isFocused );
@@ -210,7 +224,7 @@ export function BlockSettingsDropdown( {
210
224
  <__unstableBlockSettingsMenuFirstItem.Slot
211
225
  fillProps={ { onClose } }
212
226
  />
213
- { firstParentClientId !== undefined && (
227
+ { !! firstParentClientId && (
214
228
  <MenuItem
215
229
  { ...showParentOutlineGestures }
216
230
  ref={ selectParentButtonRef }
@@ -241,7 +255,7 @@ export function BlockSettingsDropdown( {
241
255
  />
242
256
  { canDuplicate && (
243
257
  <MenuItem
244
- onClick={ flow(
258
+ onClick={ pipe(
245
259
  onClose,
246
260
  onDuplicate,
247
261
  updateSelectionAfterDuplicate
@@ -254,7 +268,7 @@ export function BlockSettingsDropdown( {
254
268
  { canInsertDefaultBlock && (
255
269
  <>
256
270
  <MenuItem
257
- onClick={ flow(
271
+ onClick={ pipe(
258
272
  onClose,
259
273
  onInsertBefore
260
274
  ) }
@@ -263,7 +277,7 @@ export function BlockSettingsDropdown( {
263
277
  { __( 'Insert before' ) }
264
278
  </MenuItem>
265
279
  <MenuItem
266
- onClick={ flow(
280
+ onClick={ pipe(
267
281
  onClose,
268
282
  onInsertAfter
269
283
  ) }
@@ -275,7 +289,7 @@ export function BlockSettingsDropdown( {
275
289
  ) }
276
290
  { canMove && ! onlyBlock && (
277
291
  <MenuItem
278
- onClick={ flow( onClose, onMoveTo ) }
292
+ onClick={ pipe( onClose, onMoveTo ) }
279
293
  >
280
294
  { __( 'Move to' ) }
281
295
  </MenuItem>
@@ -302,7 +316,7 @@ export function BlockSettingsDropdown( {
302
316
  { canRemove && (
303
317
  <MenuGroup>
304
318
  <MenuItem
305
- onClick={ flow(
319
+ onClick={ pipe(
306
320
  onClose,
307
321
  onRemove,
308
322
  updateSelectionAfterRemove
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import ShallowRenderer from 'react-test-renderer/shallow';
4
+ import { render, screen } from '@testing-library/react';
5
5
 
6
6
  /**
7
7
  * Internal dependencies
@@ -9,46 +9,44 @@ import ShallowRenderer from 'react-test-renderer/shallow';
9
9
  import { BlockModeToggle } from '../block-mode-toggle';
10
10
 
11
11
  describe( 'BlockModeToggle', () => {
12
- function getShallowRenderOutput( element ) {
13
- const renderer = new ShallowRenderer();
14
- renderer.render( element );
15
- return renderer.getRenderOutput();
16
- }
17
-
18
12
  it( "should not render the HTML mode button if the block doesn't support it", () => {
19
- const wrapper = getShallowRenderOutput(
13
+ render(
20
14
  <BlockModeToggle blockType={ { supports: { html: false } } } />
21
15
  );
22
16
 
23
- expect( wrapper ).toBe( null );
17
+ expect(
18
+ screen.queryByRole( 'menuitem', { name: 'Edit as HTML' } )
19
+ ).not.toBeInTheDocument();
24
20
  } );
25
21
 
26
22
  it( 'should render the HTML mode button', () => {
27
- const wrapper = getShallowRenderOutput(
23
+ render(
28
24
  <BlockModeToggle
29
25
  blockType={ { supports: { html: true } } }
30
26
  mode="visual"
31
27
  />
32
28
  );
33
- const text = wrapper.props.children;
34
29
 
35
- expect( text ).toEqual( 'Edit as HTML' );
30
+ expect(
31
+ screen.getByRole( 'menuitem', { name: 'Edit as HTML' } )
32
+ ).toBeVisible();
36
33
  } );
37
34
 
38
35
  it( 'should render the Visual mode button', () => {
39
- const wrapper = getShallowRenderOutput(
36
+ render(
40
37
  <BlockModeToggle
41
38
  blockType={ { supports: { html: true } } }
42
39
  mode="html"
43
40
  />
44
41
  );
45
- const text = wrapper.props.children;
46
42
 
47
- expect( text ).toEqual( 'Edit visually' );
43
+ expect(
44
+ screen.getByRole( 'menuitem', { name: 'Edit visually' } )
45
+ ).toBeVisible();
48
46
  } );
49
47
 
50
48
  it( 'should not render the Visual mode button if code editing is disabled', () => {
51
- const wrapper = getShallowRenderOutput(
49
+ render(
52
50
  <BlockModeToggle
53
51
  blockType={ { supports: { html: true } } }
54
52
  mode="html"
@@ -56,6 +54,8 @@ describe( 'BlockModeToggle', () => {
56
54
  />
57
55
  );
58
56
 
59
- expect( wrapper ).toBe( null );
57
+ expect(
58
+ screen.queryByRole( 'menuitem', { name: 'Edit visually' } )
59
+ ).not.toBeInTheDocument();
60
60
  } );
61
61
  } );