@wordpress/block-editor 8.3.1 → 8.5.1

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 (475) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.md +56 -18
  3. package/build/components/alignment-control/index.js +13 -6
  4. package/build/components/alignment-control/index.js.map +1 -1
  5. package/build/components/block-alignment-control/index.js +13 -6
  6. package/build/components/block-alignment-control/index.js.map +1 -1
  7. package/build/components/block-content-overlay/index.js +13 -4
  8. package/build/components/block-content-overlay/index.js.map +1 -1
  9. package/build/components/block-draggable/index.js +2 -3
  10. package/build/components/block-draggable/index.js.map +1 -1
  11. package/build/components/block-icon/index.js +4 -0
  12. package/build/components/block-icon/index.js.map +1 -1
  13. package/build/components/block-inspector/index.js +6 -1
  14. package/build/components/block-inspector/index.js.map +1 -1
  15. package/build/components/block-list/block-html.js +4 -1
  16. package/build/components/block-list/block-html.js.map +1 -1
  17. package/build/components/block-list/block.js +4 -1
  18. package/build/components/block-list/block.js.map +1 -1
  19. package/build/components/block-list/use-block-props/index.js +1 -6
  20. package/build/components/block-list/use-block-props/index.js.map +1 -1
  21. package/build/components/block-list/use-block-props/use-focus-first-element.js +22 -6
  22. package/build/components/block-list/use-block-props/use-focus-first-element.js.map +1 -1
  23. package/build/components/block-list/use-block-props/use-focus-handler.js +7 -1
  24. package/build/components/block-list/use-block-props/use-focus-handler.js.map +1 -1
  25. package/build/components/block-list-appender/index.js +6 -1
  26. package/build/components/block-list-appender/index.js.map +1 -1
  27. package/build/components/block-lock/index.js +40 -0
  28. package/build/components/block-lock/index.js.map +1 -0
  29. package/build/components/block-lock/menu-item.js +52 -0
  30. package/build/components/block-lock/menu-item.js.map +1 -0
  31. package/build/components/block-lock/modal.js +155 -0
  32. package/build/components/block-lock/modal.js.map +1 -0
  33. package/build/components/block-lock/toolbar.js +65 -0
  34. package/build/components/block-lock/toolbar.js.map +1 -0
  35. package/build/components/block-lock/use-block-lock.js +53 -0
  36. package/build/components/block-lock/use-block-lock.js.map +1 -0
  37. package/build/components/block-mover/index.js +4 -0
  38. package/build/components/block-mover/index.js.map +1 -1
  39. package/build/components/block-pattern-setup/index.js +37 -22
  40. package/build/components/block-pattern-setup/index.js.map +1 -1
  41. package/build/components/block-pattern-setup/setup-toolbar.js +1 -1
  42. package/build/components/block-pattern-setup/setup-toolbar.js.map +1 -1
  43. package/build/components/block-preview/auto.js +6 -3
  44. package/build/components/block-preview/auto.js.map +1 -1
  45. package/build/components/block-preview/index.js +4 -2
  46. package/build/components/block-preview/index.js.map +1 -1
  47. package/build/components/block-settings-menu/block-settings-dropdown.js +75 -10
  48. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  49. package/build/components/block-settings-menu-controls/index.js +19 -9
  50. package/build/components/block-settings-menu-controls/index.js.map +1 -1
  51. package/build/components/block-switcher/index.js +8 -3
  52. package/build/components/block-switcher/index.js.map +1 -1
  53. package/build/components/block-title/index.js +2 -2
  54. package/build/components/block-title/index.js.map +1 -1
  55. package/build/components/block-title/use-block-display-title.js +8 -6
  56. package/build/components/block-title/use-block-display-title.js.map +1 -1
  57. package/build/components/block-toolbar/block-name-context.js +17 -0
  58. package/build/components/block-toolbar/block-name-context.js.map +1 -0
  59. package/build/components/block-toolbar/block-toolbar-last-item.js +20 -0
  60. package/build/components/block-toolbar/block-toolbar-last-item.js.map +1 -0
  61. package/build/components/block-toolbar/index.js +24 -5
  62. package/build/components/block-toolbar/index.js.map +1 -1
  63. package/build/components/block-tools/index.js +0 -16
  64. package/build/components/block-tools/index.js.map +1 -1
  65. package/build/components/block-variation-transforms/index.js +92 -47
  66. package/build/components/block-variation-transforms/index.js.map +1 -1
  67. package/build/components/block-vertical-alignment-control/index.js +13 -6
  68. package/build/components/block-vertical-alignment-control/index.js.map +1 -1
  69. package/build/components/border-radius-control/index.js +0 -1
  70. package/build/components/border-radius-control/index.js.map +1 -1
  71. package/build/components/border-radius-control/utils.js +1 -1
  72. package/build/components/border-radius-control/utils.js.map +1 -1
  73. package/build/components/colors-gradients/control.js +3 -1
  74. package/build/components/colors-gradients/control.js.map +1 -1
  75. package/build/components/contrast-checker/index.js +4 -0
  76. package/build/components/contrast-checker/index.js.map +1 -1
  77. package/build/components/convert-to-group-buttons/index.js +8 -0
  78. package/build/components/convert-to-group-buttons/index.js.map +1 -1
  79. package/build/components/convert-to-group-buttons/toolbar.js +105 -0
  80. package/build/components/convert-to-group-buttons/toolbar.js.map +1 -0
  81. package/build/components/copy-handler/index.js +4 -0
  82. package/build/components/copy-handler/index.js.map +1 -1
  83. package/build/components/date-format-picker/index.js +132 -0
  84. package/build/components/date-format-picker/index.js.map +1 -0
  85. package/build/components/font-sizes/font-size-picker.js +4 -0
  86. package/build/components/font-sizes/font-size-picker.js.map +1 -1
  87. package/build/components/iframe/index.js +6 -9
  88. package/build/components/iframe/index.js.map +1 -1
  89. package/build/components/index.js +27 -0
  90. package/build/components/index.js.map +1 -1
  91. package/build/components/justify-content-control/index.js +13 -6
  92. package/build/components/justify-content-control/index.js.map +1 -1
  93. package/build/components/keyboard-shortcuts/index.js +1 -1
  94. package/build/components/keyboard-shortcuts/index.js.map +1 -1
  95. package/build/components/line-height-control/index.js +15 -6
  96. package/build/components/line-height-control/index.js.map +1 -1
  97. package/build/components/list-view/block-select-button.js +18 -23
  98. package/build/components/list-view/block-select-button.js.map +1 -1
  99. package/build/components/list-view/block.js +38 -13
  100. package/build/components/list-view/block.js.map +1 -1
  101. package/build/components/list-view/branch.js +16 -13
  102. package/build/components/list-view/branch.js.map +1 -1
  103. package/build/components/list-view/index.js +7 -1
  104. package/build/components/list-view/index.js.map +1 -1
  105. package/build/components/list-view/use-block-selection.js +9 -2
  106. package/build/components/list-view/use-block-selection.js.map +1 -1
  107. package/build/components/media-replace-flow/index.js +4 -0
  108. package/build/components/media-replace-flow/index.js.map +1 -1
  109. package/build/components/multi-selection-inspector/index.js +1 -1
  110. package/build/components/multi-selection-inspector/index.js.map +1 -1
  111. package/build/components/rich-text/index.js +27 -5
  112. package/build/components/rich-text/index.js.map +1 -1
  113. package/build/components/rich-text/index.native.js +13 -9
  114. package/build/components/rich-text/index.native.js.map +1 -1
  115. package/build/components/rich-text/split-value.js +12 -2
  116. package/build/components/rich-text/split-value.js.map +1 -1
  117. package/build/components/rich-text/use-firefox-compat.js +49 -0
  118. package/build/components/rich-text/use-firefox-compat.js.map +1 -0
  119. package/build/components/rich-text/use-input-rules.js +34 -2
  120. package/build/components/rich-text/use-input-rules.js.map +1 -1
  121. package/build/components/skip-to-selected-block/index.js +4 -0
  122. package/build/components/skip-to-selected-block/index.js.map +1 -1
  123. package/build/components/url-popover/image-url-input-ui.js +11 -27
  124. package/build/components/url-popover/image-url-input-ui.js.map +1 -1
  125. package/build/components/writing-flow/index.js +9 -1
  126. package/build/components/writing-flow/index.js.map +1 -1
  127. package/build/components/writing-flow/use-arrow-nav.js +3 -44
  128. package/build/components/writing-flow/use-arrow-nav.js.map +1 -1
  129. package/build/components/writing-flow/use-click-selection.js +68 -0
  130. package/build/components/writing-flow/use-click-selection.js.map +1 -0
  131. package/build/components/writing-flow/use-drag-selection.js +134 -0
  132. package/build/components/writing-flow/use-drag-selection.js.map +1 -0
  133. package/build/components/writing-flow/use-input.js +116 -0
  134. package/build/components/writing-flow/use-input.js.map +1 -0
  135. package/build/components/writing-flow/use-multi-selection.js +18 -38
  136. package/build/components/writing-flow/use-multi-selection.js.map +1 -1
  137. package/build/components/writing-flow/use-selection-observer.js +161 -0
  138. package/build/components/writing-flow/use-selection-observer.js.map +1 -0
  139. package/build/components/writing-flow/use-tab-nav.js +1 -8
  140. package/build/components/writing-flow/use-tab-nav.js.map +1 -1
  141. package/build/hooks/anchor.js +7 -6
  142. package/build/hooks/anchor.js.map +1 -1
  143. package/build/hooks/border-color.js +3 -3
  144. package/build/hooks/border-color.js.map +1 -1
  145. package/build/hooks/border.js +0 -14
  146. package/build/hooks/border.js.map +1 -1
  147. package/build/hooks/color.js +20 -17
  148. package/build/hooks/color.js.map +1 -1
  149. package/build/hooks/font-family.js +5 -1
  150. package/build/hooks/font-family.js.map +1 -1
  151. package/build/hooks/font-size.js +4 -2
  152. package/build/hooks/font-size.js.map +1 -1
  153. package/build/hooks/gap.js +77 -5
  154. package/build/hooks/gap.js.map +1 -1
  155. package/build/hooks/layout.js +7 -2
  156. package/build/hooks/layout.js.map +1 -1
  157. package/build/hooks/style.js +34 -3
  158. package/build/hooks/style.js.map +1 -1
  159. package/build/hooks/utils.js +29 -0
  160. package/build/hooks/utils.js.map +1 -1
  161. package/build/layouts/flex.js +82 -15
  162. package/build/layouts/flex.js.map +1 -1
  163. package/build/layouts/flow.js +22 -13
  164. package/build/layouts/flow.js.map +1 -1
  165. package/build/store/actions.js +297 -51
  166. package/build/store/actions.js.map +1 -1
  167. package/build/store/defaults.js +5 -1
  168. package/build/store/defaults.js.map +1 -1
  169. package/build/store/reducer.js +25 -13
  170. package/build/store/reducer.js.map +1 -1
  171. package/build/store/selectors.js +197 -23
  172. package/build/store/selectors.js.map +1 -1
  173. package/build/utils/dom.js +2 -1
  174. package/build/utils/dom.js.map +1 -1
  175. package/build-module/components/alignment-control/index.js +12 -4
  176. package/build-module/components/alignment-control/index.js.map +1 -1
  177. package/build-module/components/block-alignment-control/index.js +12 -4
  178. package/build-module/components/block-alignment-control/index.js.map +1 -1
  179. package/build-module/components/block-content-overlay/index.js +13 -4
  180. package/build-module/components/block-content-overlay/index.js.map +1 -1
  181. package/build-module/components/block-draggable/index.js +2 -3
  182. package/build-module/components/block-draggable/index.js.map +1 -1
  183. package/build-module/components/block-icon/index.js +4 -0
  184. package/build-module/components/block-icon/index.js.map +1 -1
  185. package/build-module/components/block-inspector/index.js +6 -1
  186. package/build-module/components/block-inspector/index.js.map +1 -1
  187. package/build-module/components/block-list/block-html.js +5 -2
  188. package/build-module/components/block-list/block-html.js.map +1 -1
  189. package/build-module/components/block-list/block.js +5 -2
  190. package/build-module/components/block-list/block.js.map +1 -1
  191. package/build-module/components/block-list/use-block-props/index.js +1 -4
  192. package/build-module/components/block-list/use-block-props/index.js.map +1 -1
  193. package/build-module/components/block-list/use-block-props/use-focus-first-element.js +22 -6
  194. package/build-module/components/block-list/use-block-props/use-focus-first-element.js.map +1 -1
  195. package/build-module/components/block-list/use-block-props/use-focus-handler.js +7 -1
  196. package/build-module/components/block-list/use-block-props/use-focus-handler.js.map +1 -1
  197. package/build-module/components/block-list-appender/index.js +6 -1
  198. package/build-module/components/block-list-appender/index.js.map +1 -1
  199. package/build-module/components/block-lock/index.js +5 -0
  200. package/build-module/components/block-lock/index.js.map +1 -0
  201. package/build-module/components/block-lock/menu-item.js +39 -0
  202. package/build-module/components/block-lock/menu-item.js.map +1 -0
  203. package/build-module/components/block-lock/modal.js +138 -0
  204. package/build-module/components/block-lock/modal.js.map +1 -0
  205. package/build-module/components/block-lock/toolbar.js +51 -0
  206. package/build-module/components/block-lock/toolbar.js.map +1 -0
  207. package/build-module/components/block-lock/use-block-lock.js +44 -0
  208. package/build-module/components/block-lock/use-block-lock.js.map +1 -0
  209. package/build-module/components/block-mover/index.js +4 -0
  210. package/build-module/components/block-mover/index.js.map +1 -1
  211. package/build-module/components/block-pattern-setup/index.js +39 -24
  212. package/build-module/components/block-pattern-setup/index.js.map +1 -1
  213. package/build-module/components/block-pattern-setup/setup-toolbar.js +1 -1
  214. package/build-module/components/block-pattern-setup/setup-toolbar.js.map +1 -1
  215. package/build-module/components/block-preview/auto.js +6 -3
  216. package/build-module/components/block-preview/auto.js.map +1 -1
  217. package/build-module/components/block-preview/index.js +4 -2
  218. package/build-module/components/block-preview/index.js.map +1 -1
  219. package/build-module/components/block-settings-menu/block-settings-dropdown.js +75 -12
  220. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  221. package/build-module/components/block-settings-menu-controls/index.js +18 -9
  222. package/build-module/components/block-settings-menu-controls/index.js.map +1 -1
  223. package/build-module/components/block-switcher/index.js +9 -4
  224. package/build-module/components/block-switcher/index.js.map +1 -1
  225. package/build-module/components/block-title/index.js +2 -2
  226. package/build-module/components/block-title/index.js.map +1 -1
  227. package/build-module/components/block-title/use-block-display-title.js +8 -6
  228. package/build-module/components/block-title/use-block-display-title.js.map +1 -1
  229. package/build-module/components/block-toolbar/block-name-context.js +9 -0
  230. package/build-module/components/block-toolbar/block-name-context.js.map +1 -0
  231. package/build-module/components/block-toolbar/block-toolbar-last-item.js +11 -0
  232. package/build-module/components/block-toolbar/block-toolbar-last-item.js.map +1 -0
  233. package/build-module/components/block-toolbar/index.js +19 -4
  234. package/build-module/components/block-toolbar/index.js.map +1 -1
  235. package/build-module/components/block-tools/index.js +0 -16
  236. package/build-module/components/block-tools/index.js.map +1 -1
  237. package/build-module/components/block-variation-transforms/index.js +95 -49
  238. package/build-module/components/block-variation-transforms/index.js.map +1 -1
  239. package/build-module/components/block-vertical-alignment-control/index.js +12 -4
  240. package/build-module/components/block-vertical-alignment-control/index.js.map +1 -1
  241. package/build-module/components/border-radius-control/index.js +0 -1
  242. package/build-module/components/border-radius-control/index.js.map +1 -1
  243. package/build-module/components/border-radius-control/utils.js +1 -1
  244. package/build-module/components/border-radius-control/utils.js.map +1 -1
  245. package/build-module/components/colors-gradients/control.js +3 -1
  246. package/build-module/components/colors-gradients/control.js.map +1 -1
  247. package/build-module/components/contrast-checker/index.js +4 -0
  248. package/build-module/components/contrast-checker/index.js.map +1 -1
  249. package/build-module/components/convert-to-group-buttons/index.js +2 -1
  250. package/build-module/components/convert-to-group-buttons/index.js.map +1 -1
  251. package/build-module/components/convert-to-group-buttons/toolbar.js +90 -0
  252. package/build-module/components/convert-to-group-buttons/toolbar.js.map +1 -0
  253. package/build-module/components/copy-handler/index.js +4 -0
  254. package/build-module/components/copy-handler/index.js.map +1 -1
  255. package/build-module/components/date-format-picker/index.js +122 -0
  256. package/build-module/components/date-format-picker/index.js.map +1 -0
  257. package/build-module/components/font-sizes/font-size-picker.js +4 -0
  258. package/build-module/components/font-sizes/font-size-picker.js.map +1 -1
  259. package/build-module/components/iframe/index.js +6 -9
  260. package/build-module/components/iframe/index.js.map +1 -1
  261. package/build-module/components/index.js +3 -0
  262. package/build-module/components/index.js.map +1 -1
  263. package/build-module/components/justify-content-control/index.js +12 -4
  264. package/build-module/components/justify-content-control/index.js.map +1 -1
  265. package/build-module/components/keyboard-shortcuts/index.js +1 -1
  266. package/build-module/components/keyboard-shortcuts/index.js.map +1 -1
  267. package/build-module/components/line-height-control/index.js +14 -5
  268. package/build-module/components/line-height-control/index.js.map +1 -1
  269. package/build-module/components/list-view/block-select-button.js +19 -23
  270. package/build-module/components/list-view/block-select-button.js.map +1 -1
  271. package/build-module/components/list-view/block.js +36 -13
  272. package/build-module/components/list-view/block.js.map +1 -1
  273. package/build-module/components/list-view/branch.js +16 -13
  274. package/build-module/components/list-view/branch.js.map +1 -1
  275. package/build-module/components/list-view/index.js +7 -1
  276. package/build-module/components/list-view/index.js.map +1 -1
  277. package/build-module/components/list-view/use-block-selection.js +10 -3
  278. package/build-module/components/list-view/use-block-selection.js.map +1 -1
  279. package/build-module/components/media-replace-flow/index.js +4 -0
  280. package/build-module/components/media-replace-flow/index.js.map +1 -1
  281. package/build-module/components/multi-selection-inspector/index.js +2 -2
  282. package/build-module/components/multi-selection-inspector/index.js.map +1 -1
  283. package/build-module/components/rich-text/index.js +26 -5
  284. package/build-module/components/rich-text/index.js.map +1 -1
  285. package/build-module/components/rich-text/index.native.js +13 -9
  286. package/build-module/components/rich-text/index.native.js.map +1 -1
  287. package/build-module/components/rich-text/split-value.js +12 -2
  288. package/build-module/components/rich-text/split-value.js.map +1 -1
  289. package/build-module/components/rich-text/use-firefox-compat.js +39 -0
  290. package/build-module/components/rich-text/use-firefox-compat.js.map +1 -0
  291. package/build-module/components/rich-text/use-input-rules.js +35 -4
  292. package/build-module/components/rich-text/use-input-rules.js.map +1 -1
  293. package/build-module/components/skip-to-selected-block/index.js +4 -0
  294. package/build-module/components/skip-to-selected-block/index.js.map +1 -1
  295. package/build-module/components/url-popover/image-url-input-ui.js +12 -28
  296. package/build-module/components/url-popover/image-url-input-ui.js.map +1 -1
  297. package/build-module/components/writing-flow/index.js +5 -1
  298. package/build-module/components/writing-flow/index.js.map +1 -1
  299. package/build-module/components/writing-flow/use-arrow-nav.js +4 -45
  300. package/build-module/components/writing-flow/use-arrow-nav.js.map +1 -1
  301. package/build-module/components/writing-flow/use-click-selection.js +57 -0
  302. package/build-module/components/writing-flow/use-click-selection.js.map +1 -0
  303. package/build-module/components/writing-flow/use-drag-selection.js +124 -0
  304. package/build-module/components/writing-flow/use-drag-selection.js.map +1 -0
  305. package/build-module/components/writing-flow/use-input.js +104 -0
  306. package/build-module/components/writing-flow/use-input.js.map +1 -0
  307. package/build-module/components/writing-flow/use-multi-selection.js +18 -37
  308. package/build-module/components/writing-flow/use-multi-selection.js.map +1 -1
  309. package/build-module/components/writing-flow/use-selection-observer.js +150 -0
  310. package/build-module/components/writing-flow/use-selection-observer.js.map +1 -0
  311. package/build-module/components/writing-flow/use-tab-nav.js +1 -9
  312. package/build-module/components/writing-flow/use-tab-nav.js.map +1 -1
  313. package/build-module/hooks/anchor.js +7 -6
  314. package/build-module/hooks/anchor.js.map +1 -1
  315. package/build-module/hooks/border-color.js +5 -5
  316. package/build-module/hooks/border-color.js.map +1 -1
  317. package/build-module/hooks/border.js +0 -12
  318. package/build-module/hooks/border.js.map +1 -1
  319. package/build-module/hooks/color.js +19 -18
  320. package/build-module/hooks/color.js.map +1 -1
  321. package/build-module/hooks/font-family.js +3 -1
  322. package/build-module/hooks/font-family.js.map +1 -1
  323. package/build-module/hooks/font-size.js +4 -3
  324. package/build-module/hooks/font-size.js.map +1 -1
  325. package/build-module/hooks/gap.js +75 -7
  326. package/build-module/hooks/gap.js.map +1 -1
  327. package/build-module/hooks/layout.js +7 -2
  328. package/build-module/hooks/layout.js.map +1 -1
  329. package/build-module/hooks/style.js +33 -3
  330. package/build-module/hooks/style.js.map +1 -1
  331. package/build-module/hooks/utils.js +26 -0
  332. package/build-module/hooks/utils.js.map +1 -1
  333. package/build-module/layouts/flex.js +81 -16
  334. package/build-module/layouts/flex.js.map +1 -1
  335. package/build-module/layouts/flow.js +20 -13
  336. package/build-module/layouts/flow.js.map +1 -1
  337. package/build-module/store/actions.js +286 -49
  338. package/build-module/store/actions.js.map +1 -1
  339. package/build-module/store/defaults.js +5 -1
  340. package/build-module/store/defaults.js.map +1 -1
  341. package/build-module/store/reducer.js +25 -13
  342. package/build-module/store/reducer.js.map +1 -1
  343. package/build-module/store/selectors.js +186 -22
  344. package/build-module/store/selectors.js.map +1 -1
  345. package/build-module/utils/dom.js +2 -1
  346. package/build-module/utils/dom.js.map +1 -1
  347. package/build-style/style-rtl.css +248 -49
  348. package/build-style/style.css +248 -49
  349. package/build-types/utils/dom.d.ts.map +1 -1
  350. package/package.json +28 -27
  351. package/src/components/alignment-control/index.js +9 -4
  352. package/src/components/block-alignment-control/index.js +9 -4
  353. package/src/components/block-content-overlay/index.js +19 -2
  354. package/src/components/block-draggable/index.js +2 -5
  355. package/src/components/block-icon/index.js +3 -0
  356. package/src/components/block-inspector/index.js +4 -0
  357. package/src/components/block-list/block-html.js +8 -4
  358. package/src/components/block-list/block.js +5 -1
  359. package/src/components/block-list/style.scss +4 -5
  360. package/src/components/block-list/use-block-props/index.js +0 -5
  361. package/src/components/block-list/use-block-props/use-focus-first-element.js +27 -6
  362. package/src/components/block-list/use-block-props/use-focus-handler.js +8 -0
  363. package/src/components/block-list-appender/index.js +5 -0
  364. package/src/components/block-lock/index.js +4 -0
  365. package/src/components/block-lock/menu-item.js +39 -0
  366. package/src/components/block-lock/modal.js +194 -0
  367. package/src/components/block-lock/style.scss +70 -0
  368. package/src/components/block-lock/toolbar.js +51 -0
  369. package/src/components/block-lock/use-block-lock.js +49 -0
  370. package/src/components/block-mover/index.js +3 -0
  371. package/src/components/block-mover/style.scss +4 -0
  372. package/src/components/block-pattern-setup/index.js +84 -59
  373. package/src/components/block-pattern-setup/setup-toolbar.js +3 -1
  374. package/src/components/block-pattern-setup/style.scss +32 -26
  375. package/src/components/block-preview/auto.js +10 -1
  376. package/src/components/block-preview/index.js +2 -0
  377. package/src/components/block-settings-menu/block-settings-dropdown.js +109 -9
  378. package/src/components/block-settings-menu-controls/index.js +33 -12
  379. package/src/components/block-switcher/index.js +15 -3
  380. package/src/components/block-switcher/style.scss +15 -4
  381. package/src/components/block-switcher/test/__snapshots__/index.js.snap +15 -13
  382. package/src/components/block-switcher/test/index.js +2 -2
  383. package/src/components/block-title/README.md +6 -1
  384. package/src/components/block-title/index.js +2 -2
  385. package/src/components/block-title/test/index.js +43 -1
  386. package/src/components/block-title/use-block-display-title.js +10 -7
  387. package/src/components/block-toolbar/block-name-context.js +8 -0
  388. package/src/components/block-toolbar/block-toolbar-last-item.js +12 -0
  389. package/src/components/block-toolbar/index.js +24 -2
  390. package/src/components/block-toolbar/style.scss +10 -0
  391. package/src/components/block-tools/index.js +0 -19
  392. package/src/components/block-tools/style.scss +27 -0
  393. package/src/components/block-variation-transforms/index.js +105 -36
  394. package/src/components/block-variation-transforms/style.scss +1 -1
  395. package/src/components/block-vertical-alignment-control/index.js +9 -4
  396. package/src/components/border-radius-control/index.js +0 -1
  397. package/src/components/border-radius-control/test/utils.js +4 -0
  398. package/src/components/border-radius-control/utils.js +2 -1
  399. package/src/components/button-block-appender/style.scss +5 -1
  400. package/src/components/color-palette/test/__snapshots__/control.js.snap +70 -4
  401. package/src/components/colors-gradients/control.js +1 -1
  402. package/src/components/colors-gradients/style.scss +6 -0
  403. package/src/components/contrast-checker/index.js +3 -0
  404. package/src/components/convert-to-group-buttons/index.js +6 -1
  405. package/src/components/convert-to-group-buttons/toolbar.js +87 -0
  406. package/src/components/copy-handler/index.js +3 -0
  407. package/src/components/date-format-picker/README.md +58 -0
  408. package/src/components/date-format-picker/index.js +161 -0
  409. package/src/components/date-format-picker/style.scss +31 -0
  410. package/src/components/font-sizes/font-size-picker.js +3 -0
  411. package/src/components/iframe/index.js +5 -7
  412. package/src/components/index.js +3 -0
  413. package/src/components/justify-content-control/index.js +9 -4
  414. package/src/components/keyboard-shortcuts/index.js +1 -1
  415. package/src/components/line-height-control/index.js +11 -6
  416. package/src/components/link-control/README.md +1 -1
  417. package/src/components/list-view/block-select-button.js +14 -31
  418. package/src/components/list-view/block.js +55 -13
  419. package/src/components/list-view/branch.js +37 -15
  420. package/src/components/list-view/index.js +6 -0
  421. package/src/components/list-view/style.scss +56 -14
  422. package/src/components/list-view/use-block-selection.js +15 -2
  423. package/src/components/media-placeholder/README.md +8 -0
  424. package/src/components/media-replace-flow/index.js +3 -0
  425. package/src/components/multi-selection-inspector/index.js +2 -2
  426. package/src/components/rich-text/index.js +25 -2
  427. package/src/components/rich-text/index.native.js +24 -8
  428. package/src/components/rich-text/split-value.js +5 -1
  429. package/src/components/rich-text/use-firefox-compat.js +39 -0
  430. package/src/components/rich-text/use-input-rules.js +40 -3
  431. package/src/components/skip-to-selected-block/index.js +3 -0
  432. package/src/components/url-input/style.scss +3 -2
  433. package/src/components/url-popover/image-url-input-ui.js +16 -29
  434. package/src/components/writing-flow/index.js +8 -0
  435. package/src/components/writing-flow/readme.md +28 -0
  436. package/src/components/writing-flow/use-arrow-nav.js +4 -53
  437. package/src/components/writing-flow/use-click-selection.js +65 -0
  438. package/src/components/writing-flow/use-drag-selection.js +126 -0
  439. package/src/components/writing-flow/use-input.js +112 -0
  440. package/src/components/writing-flow/use-multi-selection.js +13 -36
  441. package/src/components/writing-flow/use-selection-observer.js +153 -0
  442. package/src/components/writing-flow/use-tab-nav.js +1 -11
  443. package/src/hooks/anchor.js +8 -6
  444. package/src/hooks/border-color.js +5 -5
  445. package/src/hooks/border.js +0 -13
  446. package/src/hooks/color.js +51 -24
  447. package/src/hooks/font-family.js +5 -2
  448. package/src/hooks/font-size.js +10 -7
  449. package/src/hooks/gap.js +91 -12
  450. package/src/hooks/layout.js +11 -1
  451. package/src/hooks/style.js +40 -4
  452. package/src/hooks/test/gap.js +66 -0
  453. package/src/hooks/test/style.js +94 -0
  454. package/src/hooks/test/utils.js +1 -1
  455. package/src/hooks/utils.js +26 -0
  456. package/src/layouts/flex.js +93 -6
  457. package/src/layouts/flow.js +28 -12
  458. package/src/store/actions.js +349 -32
  459. package/src/store/defaults.js +7 -1
  460. package/src/store/reducer.js +25 -10
  461. package/src/store/selectors.js +229 -27
  462. package/src/store/test/selectors.js +305 -5
  463. package/src/style.scss +2 -0
  464. package/src/utils/dom.js +2 -1
  465. package/tsconfig.tsbuildinfo +1 -1
  466. package/build/components/block-list/use-block-props/use-multi-selection.js +0 -205
  467. package/build/components/block-list/use-block-props/use-multi-selection.js.map +0 -1
  468. package/build/components/block-list/use-block-props/use-scroll-into-view.js +0 -77
  469. package/build/components/block-list/use-block-props/use-scroll-into-view.js.map +0 -1
  470. package/build-module/components/block-list/use-block-props/use-multi-selection.js +0 -192
  471. package/build-module/components/block-list/use-block-props/use-multi-selection.js.map +0 -1
  472. package/build-module/components/block-list/use-block-props/use-scroll-into-view.js +0 -63
  473. package/build-module/components/block-list/use-block-props/use-scroll-into-view.js.map +0 -1
  474. package/src/components/block-list/use-block-props/use-multi-selection.js +0 -227
  475. package/src/components/block-list/use-block-props/use-scroll-into-view.js +0 -73
@@ -0,0 +1,49 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useSelect } from '@wordpress/data';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { store as blockEditorStore } from '../../store';
10
+
11
+ /**
12
+ * Return details about the block lock status.
13
+ *
14
+ * @param {string} clientId The block client Id.
15
+ * @param {boolean} checkParent Optional. The status is derived from the parent `templateLock`
16
+ * when the current block's lock state isn't defined.
17
+ *
18
+ * @return {Object} Block lock status
19
+ */
20
+ export default function useBlockLock( clientId, checkParent = false ) {
21
+ return useSelect(
22
+ ( select ) => {
23
+ const {
24
+ canEditBlock,
25
+ canMoveBlock,
26
+ canRemoveBlock,
27
+ canLockBlockType,
28
+ getBlockName,
29
+ getBlockRootClientId,
30
+ } = select( blockEditorStore );
31
+ const rootClientId = checkParent
32
+ ? getBlockRootClientId( clientId )
33
+ : null;
34
+
35
+ const canEdit = canEditBlock( clientId );
36
+ const canMove = canMoveBlock( clientId, rootClientId );
37
+ const canRemove = canRemoveBlock( clientId, rootClientId );
38
+
39
+ return {
40
+ canEdit,
41
+ canMove,
42
+ canRemove,
43
+ canLock: canLockBlockType( getBlockName( clientId ) ),
44
+ isLocked: ! canEdit || ! canMove || ! canRemove,
45
+ };
46
+ },
47
+ [ clientId, checkParent ]
48
+ );
49
+ }
@@ -95,6 +95,9 @@ function BlockMover( {
95
95
  );
96
96
  }
97
97
 
98
+ /**
99
+ * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/block-mover/README.md
100
+ */
98
101
  export default withSelect( ( select, { clientIds } ) => {
99
102
  const {
100
103
  getBlock,
@@ -22,6 +22,10 @@
22
22
  @include break-small() {
23
23
  flex-direction: column;
24
24
  }
25
+
26
+ // @todo: override toolbar group inherited paddings from components/block-tools/style.scss.
27
+ // This is best fixed by making the mover control area a proper single toolbar group.
28
+ padding: 0;
25
29
  }
26
30
 
27
31
  &.is-horizontal .block-editor-block-mover__move-button-container,
@@ -11,7 +11,7 @@ import {
11
11
  } from '@wordpress/components';
12
12
 
13
13
  import { useState } from '@wordpress/element';
14
- import { useInstanceId } from '@wordpress/compose';
14
+ import { useInstanceId, useResizeObserver } from '@wordpress/compose';
15
15
  import { __ } from '@wordpress/i18n';
16
16
 
17
17
  /**
@@ -28,6 +28,7 @@ const SetupContent = ( {
28
28
  activeSlide,
29
29
  patterns,
30
30
  onBlockPatternSelect,
31
+ height,
31
32
  } ) => {
32
33
  const composite = useCompositeState();
33
34
  const containerClass = 'block-editor-block-pattern-setup__container';
@@ -38,41 +39,52 @@ const SetupContent = ( {
38
39
  [ activeSlide + 1, 'next-slide' ],
39
40
  ] );
40
41
  return (
41
- <div className={ containerClass }>
42
- <ul className="carousel-container">
43
- { patterns.map( ( pattern, index ) => (
44
- <BlockPatternSlide
45
- className={ slideClass.get( index ) || '' }
46
- key={ pattern.name }
47
- pattern={ pattern }
48
- />
49
- ) ) }
50
- </ul>
42
+ <div
43
+ className="block-editor-block-pattern-setup__carousel"
44
+ style={ { height } }
45
+ >
46
+ <div className={ containerClass }>
47
+ <ul className="carousel-container">
48
+ { patterns.map( ( pattern, index ) => (
49
+ <BlockPatternSlide
50
+ className={ slideClass.get( index ) || '' }
51
+ key={ pattern.name }
52
+ pattern={ pattern }
53
+ minHeight={ height }
54
+ />
55
+ ) ) }
56
+ </ul>
57
+ </div>
51
58
  </div>
52
59
  );
53
60
  }
54
61
  return (
55
- <Composite
56
- { ...composite }
57
- role="listbox"
58
- className={ containerClass }
59
- aria-label={ __( 'Patterns list' ) }
62
+ <div
63
+ style={ { height } }
64
+ className="block-editor-block-pattern-setup__grid"
60
65
  >
61
- { patterns.map( ( pattern ) => (
62
- <BlockPattern
63
- key={ pattern.name }
64
- pattern={ pattern }
65
- onSelect={ onBlockPatternSelect }
66
- composite={ composite }
67
- />
68
- ) ) }
69
- </Composite>
66
+ <Composite
67
+ { ...composite }
68
+ role="listbox"
69
+ className={ containerClass }
70
+ aria-label={ __( 'Patterns list' ) }
71
+ >
72
+ { patterns.map( ( pattern ) => (
73
+ <BlockPattern
74
+ key={ pattern.name }
75
+ pattern={ pattern }
76
+ onSelect={ onBlockPatternSelect }
77
+ composite={ composite }
78
+ />
79
+ ) ) }
80
+ </Composite>
81
+ </div>
70
82
  );
71
83
  };
72
84
 
73
85
  function BlockPattern( { pattern, onSelect, composite } ) {
74
86
  const baseClassName = 'block-editor-block-pattern-setup-list';
75
- const { blocks, title, description, viewportWidth = 700 } = pattern;
87
+ const { blocks, description, viewportWidth = 700 } = pattern;
76
88
  const descriptionId = useInstanceId(
77
89
  BlockPattern,
78
90
  `${ baseClassName }__item-description`
@@ -94,9 +106,6 @@ function BlockPattern( { pattern, onSelect, composite } ) {
94
106
  blocks={ blocks }
95
107
  viewportWidth={ viewportWidth }
96
108
  />
97
- <div className={ `${ baseClassName }__item-title` }>
98
- { title }
99
- </div>
100
109
  </CompositeItem>
101
110
  { !! description && (
102
111
  <VisuallyHidden id={ descriptionId }>
@@ -107,7 +116,7 @@ function BlockPattern( { pattern, onSelect, composite } ) {
107
116
  );
108
117
  }
109
118
 
110
- function BlockPatternSlide( { className, pattern } ) {
119
+ function BlockPatternSlide( { className, pattern, minHeight } ) {
111
120
  const { blocks, title, description } = pattern;
112
121
  const descriptionId = useInstanceId(
113
122
  BlockPatternSlide,
@@ -119,7 +128,10 @@ function BlockPatternSlide( { className, pattern } ) {
119
128
  aria-label={ title }
120
129
  aria-describedby={ description ? descriptionId : undefined }
121
130
  >
122
- <BlockPreview blocks={ blocks } __experimentalLive />
131
+ <BlockPreview
132
+ blocks={ blocks }
133
+ __experimentalMinHeight={ minHeight }
134
+ />
123
135
  { !! description && (
124
136
  <VisuallyHidden id={ descriptionId }>
125
137
  { description }
@@ -141,6 +153,10 @@ const BlockPatternSetup = ( {
141
153
  const [ showBlank, setShowBlank ] = useState( false );
142
154
  const { replaceBlock } = useDispatch( blockEditorStore );
143
155
  const patterns = usePatternsSetup( clientId, blockName, filterPatternsFn );
156
+ const [
157
+ contentResizeListener,
158
+ { height: contentHeight },
159
+ ] = useResizeObserver();
144
160
 
145
161
  if ( ! patterns?.length || showBlank ) {
146
162
  return startBlankComponent;
@@ -152,35 +168,44 @@ const BlockPatternSetup = ( {
152
168
  };
153
169
  const onPatternSelectCallback =
154
170
  onBlockPatternSelect || onBlockPatternSelectDefault;
171
+ const onStartBlank = startBlankComponent
172
+ ? () => {
173
+ setShowBlank( true );
174
+ }
175
+ : undefined;
155
176
  return (
156
- <div
157
- className={ `block-editor-block-pattern-setup view-mode-${ viewMode }` }
158
- >
159
- <SetupToolbar
160
- viewMode={ viewMode }
161
- setViewMode={ setViewMode }
162
- activeSlide={ activeSlide }
163
- totalSlides={ patterns.length }
164
- handleNext={ () => {
165
- setActiveSlide( ( active ) => active + 1 );
166
- } }
167
- handlePrevious={ () => {
168
- setActiveSlide( ( active ) => active - 1 );
169
- } }
170
- onBlockPatternSelect={ () => {
171
- onPatternSelectCallback( patterns[ activeSlide ].blocks );
172
- } }
173
- onStartBlank={ () => {
174
- setShowBlank( true );
175
- } }
176
- />
177
- <SetupContent
178
- viewMode={ viewMode }
179
- activeSlide={ activeSlide }
180
- patterns={ patterns }
181
- onBlockPatternSelect={ onPatternSelectCallback }
182
- />
183
- </div>
177
+ <>
178
+ { contentResizeListener }
179
+ <div
180
+ className={ `block-editor-block-pattern-setup view-mode-${ viewMode }` }
181
+ >
182
+ <SetupContent
183
+ viewMode={ viewMode }
184
+ activeSlide={ activeSlide }
185
+ patterns={ patterns }
186
+ onBlockPatternSelect={ onPatternSelectCallback }
187
+ height={ contentHeight - 2 * 60 }
188
+ />
189
+ <SetupToolbar
190
+ viewMode={ viewMode }
191
+ setViewMode={ setViewMode }
192
+ activeSlide={ activeSlide }
193
+ totalSlides={ patterns.length }
194
+ handleNext={ () => {
195
+ setActiveSlide( ( active ) => active + 1 );
196
+ } }
197
+ handlePrevious={ () => {
198
+ setActiveSlide( ( active ) => active - 1 );
199
+ } }
200
+ onBlockPatternSelect={ () => {
201
+ onPatternSelectCallback(
202
+ patterns[ activeSlide ].blocks
203
+ );
204
+ } }
205
+ onStartBlank={ onStartBlank }
206
+ />
207
+ </div>
208
+ </>
184
209
  );
185
210
  };
186
211
 
@@ -17,7 +17,9 @@ import { VIEWMODES } from './constants';
17
17
 
18
18
  const Actions = ( { onStartBlank, onBlockPatternSelect } ) => (
19
19
  <div className="block-editor-block-pattern-setup__actions">
20
- <Button onClick={ onStartBlank }>{ __( 'Start blank' ) }</Button>
20
+ { onStartBlank && (
21
+ <Button onClick={ onStartBlank }>{ __( 'Start blank' ) }</Button>
22
+ ) }
21
23
  <Button variant="primary" onClick={ onBlockPatternSelect }>
22
24
  { __( 'Choose' ) }
23
25
  </Button>
@@ -5,8 +5,6 @@
5
5
  align-items: flex-start;
6
6
  width: 100%;
7
7
  border-radius: $radius-block-ui;
8
- box-shadow: inset 0 0 0 $border-width $gray-900;
9
- outline: 1px solid transparent; // Shown for Windows 10 High Contrast mode.
10
8
 
11
9
  // TODO change to check parent.
12
10
  &.view-mode-grid {
@@ -15,37 +13,41 @@
15
13
  }
16
14
 
17
15
  .block-editor-block-pattern-setup__container {
18
- display: grid;
19
- grid-template-columns: 1fr 1fr;
20
- grid-gap: $grid-unit-20;
21
- padding: $grid-unit-20;
22
- max-height: 550px;
23
- overflow: auto;
24
- margin: 0 $border-width $border-width $border-width;
25
- width: calc(100% - #{ $border-width * 2 });
26
- background: $white;
16
+ column-gap: $grid-unit-30;
17
+ display: block;
18
+ width: 100%;
19
+ padding: $grid-unit-40;
20
+ column-count: 2;
21
+
22
+ @include break-huge() {
23
+ column-count: 3;
24
+ }
27
25
 
28
26
  .block-editor-block-preview__container,
29
27
  div[role="button"] {
30
28
  cursor: pointer;
31
29
  }
32
30
 
33
- .block-editor-block-pattern-setup-list__item-title {
34
- padding: $grid-unit-05;
35
- font-size: $helptext-font-size;
36
- text-align: center;
37
- }
31
+ .block-editor-block-pattern-setup-list__list-item {
32
+ break-inside: avoid-column;
33
+ margin-bottom: $grid-unit-30;
34
+
35
+ .block-editor-block-preview__container {
36
+ min-height: 100px;
37
+ border-radius: $radius-block-ui;
38
+ border: $border-width solid $gray-300;
39
+ }
38
40
 
39
- .block-editor-block-preview__container {
40
- border-radius: $radius-block-ui;
41
- border: $border-width solid $gray-300;
41
+ .block-editor-block-preview__content {
42
+ width: 100%;
43
+ }
42
44
  }
43
45
  }
44
46
  }
45
47
 
46
48
  .block-editor-block-pattern-setup__toolbar {
49
+ height: $header-height;
47
50
  box-sizing: border-box;
48
- position: relative;
49
51
  padding: $grid-unit-20;
50
52
  width: 100%;
51
53
  text-align: left;
@@ -54,13 +56,12 @@
54
56
  // Block UI appearance.
55
57
  border-radius: $radius-block-ui $radius-block-ui 0 0;
56
58
  background-color: $white;
57
- box-shadow: inset 0 0 0 $border-width $gray-900;
58
- outline: 1px solid transparent; // Shown for Windows 10 High Contrast mode.
59
-
60
59
  display: flex;
61
60
  flex-direction: row;
62
61
  align-items: center;
63
62
  justify-content: space-between;
63
+ border-top: 1px solid $gray-300;
64
+ align-self: flex-end;
64
65
 
65
66
  .block-editor-block-pattern-setup__display-controls {
66
67
  display: flex;
@@ -93,13 +94,12 @@
93
94
  box-sizing: border-box;
94
95
  }
95
96
  .pattern-slide {
96
- opacity: 0;
97
97
  position: absolute;
98
98
  top: 0;
99
99
  width: 100%;
100
100
  margin: auto;
101
- padding: $grid-unit-20;
102
- transition: transform 0.5s, opacity 0.5s, z-index 0.5s;
101
+ padding: 0;
102
+ transition: transform 0.5s, z-index 0.5s;
103
103
  z-index: z-index(".block-editor-block-pattern-setup .pattern-slide");
104
104
 
105
105
  &.active-slide {
@@ -125,3 +125,9 @@
125
125
  }
126
126
  }
127
127
  }
128
+
129
+ .block-editor-block-pattern-setup__carousel,
130
+ .block-editor-block-pattern-setup__grid {
131
+ width: 100%;
132
+ overflow-y: auto;
133
+ }
@@ -19,7 +19,11 @@ let MemoizedBlockList;
19
19
 
20
20
  const MAX_HEIGHT = 2000;
21
21
 
22
- function AutoBlockPreview( { viewportWidth, __experimentalPadding } ) {
22
+ function AutoBlockPreview( {
23
+ viewportWidth,
24
+ __experimentalPadding,
25
+ __experimentalMinHeight,
26
+ } ) {
23
27
  const [
24
28
  containerResizeListener,
25
29
  { width: containerWidth },
@@ -68,6 +72,7 @@ function AutoBlockPreview( { viewportWidth, __experimentalPadding } ) {
68
72
  contentHeight > MAX_HEIGHT
69
73
  ? MAX_HEIGHT * scale
70
74
  : undefined,
75
+ minHeight: __experimentalMinHeight,
71
76
  } }
72
77
  >
73
78
  <Iframe
@@ -98,6 +103,10 @@ function AutoBlockPreview( { viewportWidth, __experimentalPadding } ) {
98
103
  // This is a catch-all max-height for patterns.
99
104
  // See: https://github.com/WordPress/gutenberg/pull/38175.
100
105
  maxHeight: MAX_HEIGHT,
106
+ minHeight:
107
+ scale < 1 && __experimentalMinHeight
108
+ ? __experimentalMinHeight / scale
109
+ : __experimentalMinHeight,
101
110
  } }
102
111
  >
103
112
  { contentResizeListener }
@@ -29,6 +29,7 @@ export function BlockPreview( {
29
29
  viewportWidth = 1200,
30
30
  __experimentalLive = false,
31
31
  __experimentalOnClick,
32
+ __experimentalMinHeight,
32
33
  } ) {
33
34
  const originalSettings = useSelect(
34
35
  ( select ) => select( blockEditorStore ).getSettings(),
@@ -51,6 +52,7 @@ export function BlockPreview( {
51
52
  <AutoHeightBlockPreview
52
53
  viewportWidth={ viewportWidth }
53
54
  __experimentalPadding={ __experimentalPadding }
55
+ __experimentalMinHeight={ __experimentalMinHeight }
54
56
  />
55
57
  ) }
56
58
  </BlockEditorProvider>
@@ -6,12 +6,17 @@ import { castArray, flow, noop } from 'lodash';
6
6
  /**
7
7
  * WordPress dependencies
8
8
  */
9
- import { __, sprintf } from '@wordpress/i18n';
9
+ import { getBlockType, serialize } from '@wordpress/blocks';
10
10
  import { DropdownMenu, MenuGroup, MenuItem } from '@wordpress/components';
11
- import { useSelect } from '@wordpress/data';
11
+ import { useDispatch, useSelect } from '@wordpress/data';
12
12
  import { moreVertical } from '@wordpress/icons';
13
- import { Children, cloneElement, useCallback } from '@wordpress/element';
14
- import { serialize } from '@wordpress/blocks';
13
+ import {
14
+ Children,
15
+ cloneElement,
16
+ useCallback,
17
+ useRef,
18
+ } from '@wordpress/element';
19
+ import { __, sprintf } from '@wordpress/i18n';
15
20
  import { store as keyboardShortcutsStore } from '@wordpress/keyboard-shortcuts';
16
21
  import { useCopyToClipboard } from '@wordpress/compose';
17
22
 
@@ -19,12 +24,14 @@ import { useCopyToClipboard } from '@wordpress/compose';
19
24
  * Internal dependencies
20
25
  */
21
26
  import BlockActions from '../block-actions';
27
+ import BlockIcon from '../block-icon';
22
28
  import BlockModeToggle from './block-mode-toggle';
23
29
  import BlockHTMLConvertButton from './block-html-convert-button';
24
30
  import __unstableBlockSettingsMenuFirstItem from './block-settings-menu-first-item';
25
31
  import BlockSettingsMenuControls from '../block-settings-menu-controls';
26
32
  import { store as blockEditorStore } from '../../store';
27
33
  import useBlockDisplayTitle from '../block-title/use-block-display-title';
34
+ import { useShowMoversGestures } from '../block-toolbar/utils';
28
35
 
29
36
  const POPOVER_PROPS = {
30
37
  className: 'block-editor-block-settings-menu__popover',
@@ -46,11 +53,40 @@ export function BlockSettingsDropdown( {
46
53
  const blockClientIds = castArray( clientIds );
47
54
  const count = blockClientIds.length;
48
55
  const firstBlockClientId = blockClientIds[ 0 ];
49
- const { onlyBlock } = useSelect(
56
+ const {
57
+ firstParentClientId,
58
+ hasReducedUI,
59
+ onlyBlock,
60
+ parentBlockType,
61
+ previousBlockClientId,
62
+ nextBlockClientId,
63
+ selectedBlockClientIds,
64
+ } = useSelect(
50
65
  ( select ) => {
51
- const { getBlockCount } = select( blockEditorStore );
66
+ const {
67
+ getBlockCount,
68
+ getBlockName,
69
+ getBlockParents,
70
+ getPreviousBlockClientId,
71
+ getNextBlockClientId,
72
+ getSelectedBlockClientIds,
73
+ getSettings,
74
+ } = select( blockEditorStore );
75
+
76
+ const parents = getBlockParents( firstBlockClientId );
77
+ const _firstParentClientId = parents[ parents.length - 1 ];
78
+ const parentBlockName = getBlockName( _firstParentClientId );
79
+
52
80
  return {
81
+ firstParentClientId: _firstParentClientId,
82
+ hasReducedUI: getSettings().hasReducedUI,
53
83
  onlyBlock: 1 === getBlockCount(),
84
+ parentBlockType: getBlockType( parentBlockName ),
85
+ previousBlockClientId: getPreviousBlockClientId(
86
+ firstBlockClientId
87
+ ),
88
+ nextBlockClientId: getNextBlockClientId( firstBlockClientId ),
89
+ selectedBlockClientIds: getSelectedBlockClientIds(),
54
90
  };
55
91
  },
56
92
  [ firstBlockClientId ]
@@ -72,7 +108,11 @@ export function BlockSettingsDropdown( {
72
108
  };
73
109
  }, [] );
74
110
 
75
- const updateSelection = useCallback(
111
+ const { selectBlock, toggleBlockHighlight } = useDispatch(
112
+ blockEditorStore
113
+ );
114
+
115
+ const updateSelectionAfterDuplicate = useCallback(
76
116
  __experimentalSelectBlock
77
117
  ? async ( clientIdsPromise ) => {
78
118
  const ids = await clientIdsPromise;
@@ -86,6 +126,33 @@ export function BlockSettingsDropdown( {
86
126
 
87
127
  const blockTitle = useBlockDisplayTitle( firstBlockClientId, 25 );
88
128
 
129
+ const updateSelectionAfterRemove = useCallback(
130
+ __experimentalSelectBlock
131
+ ? () => {
132
+ const blockToSelect =
133
+ previousBlockClientId || nextBlockClientId;
134
+
135
+ if (
136
+ blockToSelect &&
137
+ // From the block options dropdown, it's possible to remove a block that is not selected,
138
+ // in this case, it's not necessary to update the selection since the selected block wasn't removed.
139
+ selectedBlockClientIds.includes( firstBlockClientId ) &&
140
+ // Don't update selection when next/prev block also is in the selection ( and gets removed ),
141
+ // In case someone selects all blocks and removes them at once.
142
+ ! selectedBlockClientIds.includes( blockToSelect )
143
+ ) {
144
+ __experimentalSelectBlock( blockToSelect );
145
+ }
146
+ }
147
+ : noop,
148
+ [
149
+ __experimentalSelectBlock,
150
+ previousBlockClientId,
151
+ nextBlockClientId,
152
+ selectedBlockClientIds,
153
+ ]
154
+ );
155
+
89
156
  const label = sprintf(
90
157
  /* translators: %s: block name */
91
158
  __( 'Remove %s' ),
@@ -93,6 +160,19 @@ export function BlockSettingsDropdown( {
93
160
  );
94
161
  const removeBlockLabel = count === 1 ? label : __( 'Remove blocks' );
95
162
 
163
+ // Allows highlighting the parent block outline when focusing or hovering
164
+ // the parent block selector within the child.
165
+ const selectParentButtonRef = useRef();
166
+ const { gestures: showParentOutlineGestures } = useShowMoversGestures( {
167
+ ref: selectParentButtonRef,
168
+ onChange( isFocused ) {
169
+ if ( isFocused && hasReducedUI ) {
170
+ return;
171
+ }
172
+ toggleBlockHighlight( firstParentClientId, isFocused );
173
+ },
174
+ } );
175
+
96
176
  return (
97
177
  <BlockActions
98
178
  clientIds={ clientIds }
@@ -125,6 +205,26 @@ export function BlockSettingsDropdown( {
125
205
  <__unstableBlockSettingsMenuFirstItem.Slot
126
206
  fillProps={ { onClose } }
127
207
  />
208
+ { firstParentClientId !== undefined && (
209
+ <MenuItem
210
+ { ...showParentOutlineGestures }
211
+ ref={ selectParentButtonRef }
212
+ icon={
213
+ <BlockIcon
214
+ icon={ parentBlockType.icon }
215
+ />
216
+ }
217
+ onClick={ () =>
218
+ selectBlock( firstParentClientId )
219
+ }
220
+ >
221
+ { sprintf(
222
+ /* translators: %s: Name of the block's parent. */
223
+ __( 'Select parent block (%s)' ),
224
+ parentBlockType.title
225
+ ) }
226
+ </MenuItem>
227
+ ) }
128
228
  { count === 1 && (
129
229
  <BlockHTMLConvertButton
130
230
  clientId={ firstBlockClientId }
@@ -139,7 +239,7 @@ export function BlockSettingsDropdown( {
139
239
  onClick={ flow(
140
240
  onClose,
141
241
  onDuplicate,
142
- updateSelection
242
+ updateSelectionAfterDuplicate
143
243
  ) }
144
244
  shortcut={ shortcuts.duplicate }
145
245
  >
@@ -197,7 +297,7 @@ export function BlockSettingsDropdown( {
197
297
  onClick={ flow(
198
298
  onClose,
199
299
  onRemove,
200
- updateSelection
300
+ updateSelectionAfterRemove
201
301
  ) }
202
302
  shortcut={ shortcuts.remove }
203
303
  >