@wordpress/block-editor 8.4.0 → 8.5.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 (369) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +56 -19
  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-draggable/index.js +2 -3
  8. package/build/components/block-draggable/index.js.map +1 -1
  9. package/build/components/block-icon/index.js +4 -0
  10. package/build/components/block-icon/index.js.map +1 -1
  11. package/build/components/block-inspector/index.js +6 -1
  12. package/build/components/block-inspector/index.js.map +1 -1
  13. package/build/components/block-list/use-block-props/index.js +1 -6
  14. package/build/components/block-list/use-block-props/index.js.map +1 -1
  15. package/build/components/block-list/use-block-props/use-focus-first-element.js +14 -17
  16. package/build/components/block-list/use-block-props/use-focus-first-element.js.map +1 -1
  17. package/build/components/block-list/use-block-props/use-focus-handler.js +7 -1
  18. package/build/components/block-list/use-block-props/use-focus-handler.js.map +1 -1
  19. package/build/components/block-list-appender/index.js +6 -1
  20. package/build/components/block-list-appender/index.js.map +1 -1
  21. package/build/components/block-lock/menu-item.js +9 -0
  22. package/build/components/block-lock/menu-item.js.map +1 -1
  23. package/build/components/block-lock/modal.js +4 -13
  24. package/build/components/block-lock/modal.js.map +1 -1
  25. package/build/components/block-lock/toolbar.js +11 -3
  26. package/build/components/block-lock/toolbar.js.map +1 -1
  27. package/build/components/block-mover/index.js +4 -0
  28. package/build/components/block-mover/index.js.map +1 -1
  29. package/build/components/block-settings-menu/block-settings-dropdown.js +50 -5
  30. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  31. package/build/components/block-switcher/index.js +1 -1
  32. package/build/components/block-switcher/index.js.map +1 -1
  33. package/build/components/block-title/index.js +2 -2
  34. package/build/components/block-title/index.js.map +1 -1
  35. package/build/components/block-title/use-block-display-title.js +1 -1
  36. package/build/components/block-title/use-block-display-title.js.map +1 -1
  37. package/build/components/block-toolbar/block-name-context.js +17 -0
  38. package/build/components/block-toolbar/block-name-context.js.map +1 -0
  39. package/build/components/block-toolbar/block-toolbar-last-item.js +20 -0
  40. package/build/components/block-toolbar/block-toolbar-last-item.js.map +1 -0
  41. package/build/components/block-toolbar/index.js +20 -5
  42. package/build/components/block-toolbar/index.js.map +1 -1
  43. package/build/components/block-tools/index.js +0 -16
  44. package/build/components/block-tools/index.js.map +1 -1
  45. package/build/components/block-variation-transforms/index.js +92 -47
  46. package/build/components/block-variation-transforms/index.js.map +1 -1
  47. package/build/components/block-vertical-alignment-control/index.js +13 -6
  48. package/build/components/block-vertical-alignment-control/index.js.map +1 -1
  49. package/build/components/contrast-checker/index.js +4 -0
  50. package/build/components/contrast-checker/index.js.map +1 -1
  51. package/build/components/convert-to-group-buttons/index.js +8 -0
  52. package/build/components/convert-to-group-buttons/index.js.map +1 -1
  53. package/build/components/convert-to-group-buttons/toolbar.js +105 -0
  54. package/build/components/convert-to-group-buttons/toolbar.js.map +1 -0
  55. package/build/components/copy-handler/index.js +4 -0
  56. package/build/components/copy-handler/index.js.map +1 -1
  57. package/build/components/font-sizes/font-size-picker.js +4 -0
  58. package/build/components/font-sizes/font-size-picker.js.map +1 -1
  59. package/build/components/iframe/index.js +6 -9
  60. package/build/components/iframe/index.js.map +1 -1
  61. package/build/components/index.js +18 -0
  62. package/build/components/index.js.map +1 -1
  63. package/build/components/justify-content-control/index.js +13 -6
  64. package/build/components/justify-content-control/index.js.map +1 -1
  65. package/build/components/keyboard-shortcuts/index.js +1 -1
  66. package/build/components/keyboard-shortcuts/index.js.map +1 -1
  67. package/build/components/line-height-control/index.js +10 -3
  68. package/build/components/line-height-control/index.js.map +1 -1
  69. package/build/components/list-view/block-select-button.js +25 -6
  70. package/build/components/list-view/block-select-button.js.map +1 -1
  71. package/build/components/list-view/block.js +5 -1
  72. package/build/components/list-view/block.js.map +1 -1
  73. package/build/components/list-view/branch.js +1 -1
  74. package/build/components/list-view/branch.js.map +1 -1
  75. package/build/components/media-replace-flow/index.js +4 -0
  76. package/build/components/media-replace-flow/index.js.map +1 -1
  77. package/build/components/multi-selection-inspector/index.js +1 -1
  78. package/build/components/multi-selection-inspector/index.js.map +1 -1
  79. package/build/components/rich-text/index.js +26 -4
  80. package/build/components/rich-text/index.js.map +1 -1
  81. package/build/components/rich-text/split-value.js +12 -2
  82. package/build/components/rich-text/split-value.js.map +1 -1
  83. package/build/components/rich-text/use-firefox-compat.js +49 -0
  84. package/build/components/rich-text/use-firefox-compat.js.map +1 -0
  85. package/build/components/rich-text/use-input-rules.js +34 -2
  86. package/build/components/rich-text/use-input-rules.js.map +1 -1
  87. package/build/components/skip-to-selected-block/index.js +4 -0
  88. package/build/components/skip-to-selected-block/index.js.map +1 -1
  89. package/build/components/writing-flow/index.js +9 -1
  90. package/build/components/writing-flow/index.js.map +1 -1
  91. package/build/components/writing-flow/use-arrow-nav.js +3 -44
  92. package/build/components/writing-flow/use-arrow-nav.js.map +1 -1
  93. package/build/components/writing-flow/use-click-selection.js +68 -0
  94. package/build/components/writing-flow/use-click-selection.js.map +1 -0
  95. package/build/components/writing-flow/use-drag-selection.js +134 -0
  96. package/build/components/writing-flow/use-drag-selection.js.map +1 -0
  97. package/build/components/writing-flow/use-input.js +116 -0
  98. package/build/components/writing-flow/use-input.js.map +1 -0
  99. package/build/components/writing-flow/use-multi-selection.js +18 -38
  100. package/build/components/writing-flow/use-multi-selection.js.map +1 -1
  101. package/build/components/writing-flow/use-selection-observer.js +161 -0
  102. package/build/components/writing-flow/use-selection-observer.js.map +1 -0
  103. package/build/components/writing-flow/use-tab-nav.js +1 -8
  104. package/build/components/writing-flow/use-tab-nav.js.map +1 -1
  105. package/build/hooks/border-color.js +3 -3
  106. package/build/hooks/border-color.js.map +1 -1
  107. package/build/hooks/border.js +0 -14
  108. package/build/hooks/border.js.map +1 -1
  109. package/build/hooks/color.js +20 -17
  110. package/build/hooks/color.js.map +1 -1
  111. package/build/hooks/font-family.js +5 -1
  112. package/build/hooks/font-family.js.map +1 -1
  113. package/build/hooks/font-size.js +4 -2
  114. package/build/hooks/font-size.js.map +1 -1
  115. package/build/hooks/gap.js +23 -16
  116. package/build/hooks/gap.js.map +1 -1
  117. package/build/hooks/layout.js +7 -2
  118. package/build/hooks/layout.js.map +1 -1
  119. package/build/hooks/style.js +34 -3
  120. package/build/hooks/style.js.map +1 -1
  121. package/build/hooks/utils.js +29 -0
  122. package/build/hooks/utils.js.map +1 -1
  123. package/build/layouts/flex.js +76 -12
  124. package/build/layouts/flex.js.map +1 -1
  125. package/build/layouts/flow.js +9 -4
  126. package/build/layouts/flow.js.map +1 -1
  127. package/build/store/actions.js +297 -51
  128. package/build/store/actions.js.map +1 -1
  129. package/build/store/defaults.js +5 -2
  130. package/build/store/defaults.js.map +1 -1
  131. package/build/store/reducer.js +25 -13
  132. package/build/store/reducer.js.map +1 -1
  133. package/build/store/selectors.js +142 -18
  134. package/build/store/selectors.js.map +1 -1
  135. package/build/utils/dom.js +2 -1
  136. package/build/utils/dom.js.map +1 -1
  137. package/build-module/components/alignment-control/index.js +12 -4
  138. package/build-module/components/alignment-control/index.js.map +1 -1
  139. package/build-module/components/block-alignment-control/index.js +12 -4
  140. package/build-module/components/block-alignment-control/index.js.map +1 -1
  141. package/build-module/components/block-draggable/index.js +2 -3
  142. package/build-module/components/block-draggable/index.js.map +1 -1
  143. package/build-module/components/block-icon/index.js +4 -0
  144. package/build-module/components/block-icon/index.js.map +1 -1
  145. package/build-module/components/block-inspector/index.js +6 -1
  146. package/build-module/components/block-inspector/index.js.map +1 -1
  147. package/build-module/components/block-list/use-block-props/index.js +1 -4
  148. package/build-module/components/block-list/use-block-props/index.js.map +1 -1
  149. package/build-module/components/block-list/use-block-props/use-focus-first-element.js +15 -17
  150. package/build-module/components/block-list/use-block-props/use-focus-first-element.js.map +1 -1
  151. package/build-module/components/block-list/use-block-props/use-focus-handler.js +7 -1
  152. package/build-module/components/block-list/use-block-props/use-focus-handler.js.map +1 -1
  153. package/build-module/components/block-list-appender/index.js +6 -1
  154. package/build-module/components/block-list-appender/index.js.map +1 -1
  155. package/build-module/components/block-lock/menu-item.js +9 -0
  156. package/build-module/components/block-lock/menu-item.js.map +1 -1
  157. package/build-module/components/block-lock/modal.js +5 -14
  158. package/build-module/components/block-lock/modal.js.map +1 -1
  159. package/build-module/components/block-lock/toolbar.js +11 -3
  160. package/build-module/components/block-lock/toolbar.js.map +1 -1
  161. package/build-module/components/block-mover/index.js +4 -0
  162. package/build-module/components/block-mover/index.js.map +1 -1
  163. package/build-module/components/block-settings-menu/block-settings-dropdown.js +50 -7
  164. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  165. package/build-module/components/block-switcher/index.js +2 -2
  166. package/build-module/components/block-switcher/index.js.map +1 -1
  167. package/build-module/components/block-title/index.js +2 -2
  168. package/build-module/components/block-title/index.js.map +1 -1
  169. package/build-module/components/block-title/use-block-display-title.js +1 -1
  170. package/build-module/components/block-title/use-block-display-title.js.map +1 -1
  171. package/build-module/components/block-toolbar/block-name-context.js +9 -0
  172. package/build-module/components/block-toolbar/block-name-context.js.map +1 -0
  173. package/build-module/components/block-toolbar/block-toolbar-last-item.js +11 -0
  174. package/build-module/components/block-toolbar/block-toolbar-last-item.js.map +1 -0
  175. package/build-module/components/block-toolbar/index.js +16 -4
  176. package/build-module/components/block-toolbar/index.js.map +1 -1
  177. package/build-module/components/block-tools/index.js +0 -16
  178. package/build-module/components/block-tools/index.js.map +1 -1
  179. package/build-module/components/block-variation-transforms/index.js +95 -49
  180. package/build-module/components/block-variation-transforms/index.js.map +1 -1
  181. package/build-module/components/block-vertical-alignment-control/index.js +12 -4
  182. package/build-module/components/block-vertical-alignment-control/index.js.map +1 -1
  183. package/build-module/components/contrast-checker/index.js +4 -0
  184. package/build-module/components/contrast-checker/index.js.map +1 -1
  185. package/build-module/components/convert-to-group-buttons/index.js +2 -1
  186. package/build-module/components/convert-to-group-buttons/index.js.map +1 -1
  187. package/build-module/components/convert-to-group-buttons/toolbar.js +90 -0
  188. package/build-module/components/convert-to-group-buttons/toolbar.js.map +1 -0
  189. package/build-module/components/copy-handler/index.js +4 -0
  190. package/build-module/components/copy-handler/index.js.map +1 -1
  191. package/build-module/components/font-sizes/font-size-picker.js +4 -0
  192. package/build-module/components/font-sizes/font-size-picker.js.map +1 -1
  193. package/build-module/components/iframe/index.js +6 -9
  194. package/build-module/components/iframe/index.js.map +1 -1
  195. package/build-module/components/index.js +2 -0
  196. package/build-module/components/index.js.map +1 -1
  197. package/build-module/components/justify-content-control/index.js +12 -4
  198. package/build-module/components/justify-content-control/index.js.map +1 -1
  199. package/build-module/components/keyboard-shortcuts/index.js +1 -1
  200. package/build-module/components/keyboard-shortcuts/index.js.map +1 -1
  201. package/build-module/components/line-height-control/index.js +9 -2
  202. package/build-module/components/line-height-control/index.js.map +1 -1
  203. package/build-module/components/list-view/block-select-button.js +22 -6
  204. package/build-module/components/list-view/block-select-button.js.map +1 -1
  205. package/build-module/components/list-view/block.js +5 -1
  206. package/build-module/components/list-view/block.js.map +1 -1
  207. package/build-module/components/list-view/branch.js +1 -1
  208. package/build-module/components/list-view/branch.js.map +1 -1
  209. package/build-module/components/media-replace-flow/index.js +4 -0
  210. package/build-module/components/media-replace-flow/index.js.map +1 -1
  211. package/build-module/components/multi-selection-inspector/index.js +2 -2
  212. package/build-module/components/multi-selection-inspector/index.js.map +1 -1
  213. package/build-module/components/rich-text/index.js +25 -4
  214. package/build-module/components/rich-text/index.js.map +1 -1
  215. package/build-module/components/rich-text/split-value.js +12 -2
  216. package/build-module/components/rich-text/split-value.js.map +1 -1
  217. package/build-module/components/rich-text/use-firefox-compat.js +39 -0
  218. package/build-module/components/rich-text/use-firefox-compat.js.map +1 -0
  219. package/build-module/components/rich-text/use-input-rules.js +35 -4
  220. package/build-module/components/rich-text/use-input-rules.js.map +1 -1
  221. package/build-module/components/skip-to-selected-block/index.js +4 -0
  222. package/build-module/components/skip-to-selected-block/index.js.map +1 -1
  223. package/build-module/components/writing-flow/index.js +5 -1
  224. package/build-module/components/writing-flow/index.js.map +1 -1
  225. package/build-module/components/writing-flow/use-arrow-nav.js +4 -45
  226. package/build-module/components/writing-flow/use-arrow-nav.js.map +1 -1
  227. package/build-module/components/writing-flow/use-click-selection.js +57 -0
  228. package/build-module/components/writing-flow/use-click-selection.js.map +1 -0
  229. package/build-module/components/writing-flow/use-drag-selection.js +124 -0
  230. package/build-module/components/writing-flow/use-drag-selection.js.map +1 -0
  231. package/build-module/components/writing-flow/use-input.js +104 -0
  232. package/build-module/components/writing-flow/use-input.js.map +1 -0
  233. package/build-module/components/writing-flow/use-multi-selection.js +18 -37
  234. package/build-module/components/writing-flow/use-multi-selection.js.map +1 -1
  235. package/build-module/components/writing-flow/use-selection-observer.js +150 -0
  236. package/build-module/components/writing-flow/use-selection-observer.js.map +1 -0
  237. package/build-module/components/writing-flow/use-tab-nav.js +1 -9
  238. package/build-module/components/writing-flow/use-tab-nav.js.map +1 -1
  239. package/build-module/hooks/border-color.js +5 -5
  240. package/build-module/hooks/border-color.js.map +1 -1
  241. package/build-module/hooks/border.js +0 -12
  242. package/build-module/hooks/border.js.map +1 -1
  243. package/build-module/hooks/color.js +19 -18
  244. package/build-module/hooks/color.js.map +1 -1
  245. package/build-module/hooks/font-family.js +3 -1
  246. package/build-module/hooks/font-family.js.map +1 -1
  247. package/build-module/hooks/font-size.js +4 -3
  248. package/build-module/hooks/font-size.js.map +1 -1
  249. package/build-module/hooks/gap.js +22 -15
  250. package/build-module/hooks/gap.js.map +1 -1
  251. package/build-module/hooks/layout.js +7 -2
  252. package/build-module/hooks/layout.js.map +1 -1
  253. package/build-module/hooks/style.js +33 -3
  254. package/build-module/hooks/style.js.map +1 -1
  255. package/build-module/hooks/utils.js +26 -0
  256. package/build-module/hooks/utils.js.map +1 -1
  257. package/build-module/layouts/flex.js +76 -13
  258. package/build-module/layouts/flex.js.map +1 -1
  259. package/build-module/layouts/flow.js +9 -5
  260. package/build-module/layouts/flow.js.map +1 -1
  261. package/build-module/store/actions.js +286 -49
  262. package/build-module/store/actions.js.map +1 -1
  263. package/build-module/store/defaults.js +5 -2
  264. package/build-module/store/defaults.js.map +1 -1
  265. package/build-module/store/reducer.js +25 -13
  266. package/build-module/store/reducer.js.map +1 -1
  267. package/build-module/store/selectors.js +138 -19
  268. package/build-module/store/selectors.js.map +1 -1
  269. package/build-module/utils/dom.js +2 -1
  270. package/build-module/utils/dom.js.map +1 -1
  271. package/build-style/style-rtl.css +107 -74
  272. package/build-style/style.css +107 -74
  273. package/build-types/utils/dom.d.ts.map +1 -1
  274. package/package.json +28 -28
  275. package/src/components/alignment-control/index.js +9 -4
  276. package/src/components/block-alignment-control/index.js +9 -4
  277. package/src/components/block-draggable/index.js +2 -5
  278. package/src/components/block-icon/index.js +3 -0
  279. package/src/components/block-inspector/index.js +4 -0
  280. package/src/components/block-list/style.scss +4 -5
  281. package/src/components/block-list/use-block-props/index.js +0 -5
  282. package/src/components/block-list/use-block-props/use-focus-first-element.js +19 -26
  283. package/src/components/block-list/use-block-props/use-focus-handler.js +8 -0
  284. package/src/components/block-list-appender/index.js +5 -0
  285. package/src/components/block-lock/menu-item.js +8 -1
  286. package/src/components/block-lock/modal.js +18 -13
  287. package/src/components/block-lock/style.scss +6 -3
  288. package/src/components/block-lock/toolbar.js +12 -2
  289. package/src/components/block-mover/index.js +3 -0
  290. package/src/components/block-mover/style.scss +4 -0
  291. package/src/components/block-settings-menu/block-settings-dropdown.js +62 -4
  292. package/src/components/block-switcher/index.js +2 -2
  293. package/src/components/block-switcher/style.scss +8 -1
  294. package/src/components/block-switcher/test/index.js +2 -2
  295. package/src/components/block-title/index.js +2 -2
  296. package/src/components/block-title/use-block-display-title.js +1 -1
  297. package/src/components/block-toolbar/block-name-context.js +8 -0
  298. package/src/components/block-toolbar/block-toolbar-last-item.js +12 -0
  299. package/src/components/block-toolbar/index.js +18 -2
  300. package/src/components/block-toolbar/style.scss +6 -0
  301. package/src/components/block-tools/index.js +0 -19
  302. package/src/components/block-tools/style.scss +3 -5
  303. package/src/components/block-variation-transforms/index.js +105 -36
  304. package/src/components/block-variation-transforms/style.scss +1 -1
  305. package/src/components/block-vertical-alignment-control/index.js +9 -4
  306. package/src/components/button-block-appender/style.scss +5 -1
  307. package/src/components/contrast-checker/index.js +3 -0
  308. package/src/components/convert-to-group-buttons/index.js +6 -1
  309. package/src/components/convert-to-group-buttons/toolbar.js +87 -0
  310. package/src/components/copy-handler/index.js +3 -0
  311. package/src/components/font-sizes/font-size-picker.js +3 -0
  312. package/src/components/iframe/index.js +5 -7
  313. package/src/components/index.js +2 -0
  314. package/src/components/justify-content-control/index.js +9 -4
  315. package/src/components/keyboard-shortcuts/index.js +1 -1
  316. package/src/components/line-height-control/index.js +8 -3
  317. package/src/components/list-view/block-select-button.js +21 -3
  318. package/src/components/list-view/block.js +8 -1
  319. package/src/components/list-view/branch.js +1 -1
  320. package/src/components/list-view/style.scss +56 -14
  321. package/src/components/media-placeholder/README.md +8 -0
  322. package/src/components/media-replace-flow/index.js +3 -0
  323. package/src/components/multi-selection-inspector/index.js +2 -2
  324. package/src/components/rich-text/index.js +24 -1
  325. package/src/components/rich-text/split-value.js +5 -1
  326. package/src/components/rich-text/use-firefox-compat.js +39 -0
  327. package/src/components/rich-text/use-input-rules.js +40 -3
  328. package/src/components/skip-to-selected-block/index.js +3 -0
  329. package/src/components/url-input/style.scss +3 -2
  330. package/src/components/writing-flow/index.js +8 -0
  331. package/src/components/writing-flow/readme.md +28 -0
  332. package/src/components/writing-flow/use-arrow-nav.js +4 -53
  333. package/src/components/writing-flow/use-click-selection.js +65 -0
  334. package/src/components/writing-flow/use-drag-selection.js +126 -0
  335. package/src/components/writing-flow/use-input.js +112 -0
  336. package/src/components/writing-flow/use-multi-selection.js +13 -36
  337. package/src/components/writing-flow/use-selection-observer.js +153 -0
  338. package/src/components/writing-flow/use-tab-nav.js +1 -11
  339. package/src/hooks/border-color.js +5 -5
  340. package/src/hooks/border.js +0 -13
  341. package/src/hooks/color.js +51 -24
  342. package/src/hooks/font-family.js +5 -2
  343. package/src/hooks/font-size.js +10 -7
  344. package/src/hooks/gap.js +25 -17
  345. package/src/hooks/layout.js +11 -1
  346. package/src/hooks/style.js +40 -4
  347. package/src/hooks/test/gap.js +25 -1
  348. package/src/hooks/test/style.js +94 -0
  349. package/src/hooks/test/utils.js +1 -1
  350. package/src/hooks/utils.js +26 -0
  351. package/src/layouts/flex.js +89 -5
  352. package/src/layouts/flow.js +15 -4
  353. package/src/store/actions.js +349 -32
  354. package/src/store/defaults.js +7 -2
  355. package/src/store/reducer.js +25 -10
  356. package/src/store/selectors.js +181 -24
  357. package/src/store/test/selectors.js +242 -5
  358. package/src/utils/dom.js +2 -1
  359. package/tsconfig.tsbuildinfo +1 -1
  360. package/build/components/block-list/use-block-props/use-multi-selection.js +0 -205
  361. package/build/components/block-list/use-block-props/use-multi-selection.js.map +0 -1
  362. package/build/components/block-list/use-block-props/use-scroll-into-view.js +0 -77
  363. package/build/components/block-list/use-block-props/use-scroll-into-view.js.map +0 -1
  364. package/build-module/components/block-list/use-block-props/use-multi-selection.js +0 -192
  365. package/build-module/components/block-list/use-block-props/use-multi-selection.js.map +0 -1
  366. package/build-module/components/block-list/use-block-props/use-scroll-into-view.js +0 -63
  367. package/build-module/components/block-list/use-block-props/use-scroll-into-view.js.map +0 -1
  368. package/src/components/block-list/use-block-props/use-multi-selection.js +0 -227
  369. package/src/components/block-list/use-block-props/use-scroll-into-view.js +0 -73
@@ -15,7 +15,8 @@
15
15
  // Use position relative for row animation.
16
16
  position: relative;
17
17
 
18
- &.is-selected {
18
+ // The background has to be applied to the td, not tr, or border-radius won't work.
19
+ &.is-selected td {
19
20
  background: var(--wp-admin-theme-color);
20
21
  }
21
22
  &.is-selected .block-editor-list-view-block-contents,
@@ -40,27 +41,53 @@
40
41
  box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) $white;
41
42
  }
42
43
 
44
+ &.is-dragging {
45
+ display: none;
46
+ }
47
+
48
+ // Border radius for corners of the selected item.
49
+ &.is-first-selected td:first-child {
50
+ border-top-left-radius: $radius-block-ui;
51
+ }
52
+ &.is-first-selected td:last-child {
53
+ border-top-right-radius: $radius-block-ui;
54
+ }
55
+ &.is-last-selected td:first-child {
56
+ border-bottom-left-radius: $radius-block-ui;
57
+ }
58
+ &.is-last-selected td:last-child {
59
+ border-bottom-right-radius: $radius-block-ui;
60
+ }
43
61
  &.is-branch-selected:not(.is-selected) {
44
62
  // Lighten a CSS variable without introducing a new SASS variable
45
63
  background:
46
64
  linear-gradient(transparentize($white, 0.1), transparentize($white, 0.1)),
47
65
  linear-gradient(var(--wp-admin-theme-color), var(--wp-admin-theme-color));
48
66
  }
49
- &.is-branch-selected.is-selected .block-editor-list-view-block-contents {
50
- border-radius: 2px 2px 0 0;
67
+ &.is-branch-selected.is-first-selected td:first-child {
68
+ border-top-left-radius: $radius-block-ui;
69
+ }
70
+ &.is-branch-selected.is-first-selected td:last-child {
71
+ border-top-right-radius: $radius-block-ui;
51
72
  }
52
73
  &[aria-expanded="false"] {
53
- &.is-branch-selected.is-selected .block-editor-list-view-block-contents {
54
- border-radius: 2px;
74
+ &.is-branch-selected.is-first-selected td:first-child {
75
+ border-top-left-radius: $radius-block-ui;
76
+ }
77
+ &.is-branch-selected.is-first-selected td:last-child {
78
+ border-top-right-radius: $radius-block-ui;
79
+ }
80
+ &.is-branch-selected.is-last-selected td:first-child {
81
+ border-bottom-left-radius: $radius-block-ui;
82
+ }
83
+ &.is-branch-selected.is-last-selected td:last-child {
84
+ border-bottom-right-radius: $radius-block-ui;
55
85
  }
56
86
  }
57
- &.is-branch-selected:not(.is-selected) .block-editor-list-view-block-contents {
87
+ &.is-branch-selected:not(.is-selected) td {
58
88
  border-radius: 0;
59
89
  }
60
90
 
61
- &.is-dragging {
62
- display: none;
63
- }
64
91
 
65
92
  // List View renders a fixed number of items and relies on each item having a fixed height of 36px.
66
93
  // If this value changes, we should also change the itemHeight value set in useFixedWindowList.
@@ -73,7 +100,7 @@
73
100
  padding: ($grid-unit-15 * 0.5) $grid-unit-15 ($grid-unit-15 * 0.5) 0;
74
101
  text-align: left;
75
102
  color: $gray-900;
76
- border-radius: 2px;
103
+ border-radius: $radius-block-ui;
77
104
  position: relative;
78
105
  white-space: nowrap;
79
106
 
@@ -106,7 +133,7 @@
106
133
  left: 0;
107
134
  border-radius: inherit;
108
135
  box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
109
- z-index: 1;
136
+ z-index: 2;
110
137
  pointer-events: none;
111
138
 
112
139
  // Hide focus styles while a user is dragging blocks/files etc.
@@ -152,17 +179,23 @@
152
179
  .block-editor-list-view-block__mover-cell {
153
180
  line-height: 0;
154
181
  width: $button-size;
155
- opacity: 0;
156
182
  vertical-align: middle;
157
183
  @include reduce-motion("transition");
158
184
 
185
+ > * {
186
+ opacity: 0;
187
+ }
188
+
159
189
  // Show on hover, visible, and show above to keep the hit area size.
160
190
  &:hover,
161
191
  &.is-visible {
162
192
  position: relative;
163
193
  z-index: 1;
164
- opacity: 1;
165
- @include edit-post__fade-in-animation;
194
+
195
+ > * {
196
+ opacity: 1;
197
+ @include edit-post__fade-in-animation;
198
+ }
166
199
  }
167
200
 
168
201
  &,
@@ -278,6 +311,15 @@
278
311
  &.is-selected .block-editor-list-view-block-select-button__anchor {
279
312
  background: rgba($black, 0.3);
280
313
  }
314
+
315
+ .block-editor-list-view-block-select-button__lock {
316
+ line-height: 0;
317
+ width: 24px;
318
+ min-width: 24px;
319
+ margin-left: auto;
320
+ padding: 0;
321
+ vertical-align: middle;
322
+ }
281
323
  }
282
324
 
283
325
  .block-editor-list-view-block-select-button__description,
@@ -140,6 +140,14 @@ Whether to allow multiple selection of files or not.
140
140
  - Default: `false`
141
141
  - Platform: Web
142
142
 
143
+ ### mediaPreview
144
+
145
+ The component is rendered as a preview in the placeholder.
146
+
147
+ - Type: `Component`
148
+ - Required: No
149
+ - Platform: Web
150
+
143
151
  ### onError
144
152
 
145
153
  Callback called when an upload error happens.
@@ -212,6 +212,9 @@ const MediaReplaceFlow = ( {
212
212
  );
213
213
  };
214
214
 
215
+ /**
216
+ * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/media-replace-flow/README.md
217
+ */
215
218
  export default compose( [
216
219
  withDispatch( ( dispatch ) => {
217
220
  const { createNotice, removeNotice } = dispatch( noticesStore );
@@ -5,7 +5,7 @@ import { sprintf, _n } from '@wordpress/i18n';
5
5
  import { withSelect } from '@wordpress/data';
6
6
  import { serialize } from '@wordpress/blocks';
7
7
  import { count as wordCount } from '@wordpress/wordcount';
8
- import { stack } from '@wordpress/icons';
8
+ import { copy } from '@wordpress/icons';
9
9
 
10
10
  /**
11
11
  * Internal dependencies
@@ -18,7 +18,7 @@ function MultiSelectionInspector( { blocks } ) {
18
18
 
19
19
  return (
20
20
  <div className="block-editor-multi-selection-inspector__card">
21
- <BlockIcon icon={ stack } showColors />
21
+ <BlockIcon icon={ copy } showColors />
22
22
  <div className="block-editor-multi-selection-inspector__card-content">
23
23
  <div className="block-editor-multi-selection-inspector__card-title">
24
24
  { sprintf(
@@ -45,6 +45,7 @@ import { useFormatTypes } from './use-format-types';
45
45
  import { useRemoveBrowserShortcuts } from './use-remove-browser-shortcuts';
46
46
  import { useShortcuts } from './use-shortcuts';
47
47
  import { useInputEvents } from './use-input-events';
48
+ import { useFirefoxCompat } from './use-firefox-compat';
48
49
  import FormatEdit from './format-edit';
49
50
  import { getMultilineTag, getAllowedFormats } from './utils';
50
51
 
@@ -131,6 +132,7 @@ function RichTextWrapper(
131
132
  if ( originalIsSelected === undefined ) {
132
133
  isSelected =
133
134
  selectionStart.clientId === clientId &&
135
+ selectionEnd.clientId === clientId &&
134
136
  selectionStart.attributeKey === identifier;
135
137
  } else if ( originalIsSelected ) {
136
138
  isSelected = selectionStart.clientId === clientId;
@@ -171,7 +173,26 @@ function RichTextWrapper(
171
173
 
172
174
  const onSelectionChange = useCallback(
173
175
  ( start, end ) => {
174
- selectionChange( clientId, identifier, start, end );
176
+ const selection = {};
177
+ const unset = start === undefined && end === undefined;
178
+
179
+ if ( typeof start === 'number' || unset ) {
180
+ selection.start = {
181
+ clientId,
182
+ attributeKey: identifier,
183
+ offset: start,
184
+ };
185
+ }
186
+
187
+ if ( typeof end === 'number' || unset ) {
188
+ selection.end = {
189
+ clientId,
190
+ attributeKey: identifier,
191
+ offset: end,
192
+ };
193
+ }
194
+
195
+ selectionChange( selection );
175
196
  },
176
197
  [ clientId, identifier ]
177
198
  );
@@ -340,6 +361,7 @@ function RichTextWrapper(
340
361
  __unstableAllowPrefixTransformations,
341
362
  formatTypes,
342
363
  onReplace,
364
+ selectionChange,
343
365
  } ),
344
366
  useRemoveBrowserShortcuts(),
345
367
  useShortcuts( keyboardShortcuts ),
@@ -371,6 +393,7 @@ function RichTextWrapper(
371
393
  disableLineBreaks,
372
394
  onSplitAtEnd,
373
395
  } ),
396
+ useFirefoxCompat(),
374
397
  anchorRef,
375
398
  ] ) }
376
399
  contentEditable={ true }
@@ -20,8 +20,12 @@ export function splitValue( {
20
20
  return;
21
21
  }
22
22
 
23
+ // Ensure the value has a selection. This might happen when trying to split
24
+ // an empty value before there was a `selectionchange` event.
25
+ const { start = 0, end = 0 } = value;
26
+ const valueWithEnsuredSelection = { ...value, start, end };
23
27
  const blocks = [];
24
- const [ before, after ] = split( value );
28
+ const [ before, after ] = split( valueWithEnsuredSelection );
25
29
  const hasPastedBlocks = pastedBlocks.length > 0;
26
30
  let lastPastedBlockIndex = -1;
27
31
 
@@ -0,0 +1,39 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useRefEffect } from '@wordpress/compose';
5
+ import { useSelect } from '@wordpress/data';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import { store as blockEditorStore } from '../../store';
11
+
12
+ export function useFirefoxCompat() {
13
+ const { isMultiSelecting } = useSelect( blockEditorStore );
14
+ return useRefEffect( ( element ) => {
15
+ function onFocus() {
16
+ if ( ! isMultiSelecting() ) {
17
+ return;
18
+ }
19
+
20
+ // This is a little hack to work around focus issues with nested
21
+ // editable elements in Firefox. For some reason the editable child
22
+ // element sometimes regains focus, while it should not be focusable
23
+ // and focus should remain on the editable parent element.
24
+ // To do: try to find the cause of the shifting focus.
25
+ const parentEditable = element.parentElement.closest(
26
+ '[contenteditable="true"]'
27
+ );
28
+
29
+ if ( parentEditable ) {
30
+ parentEditable.focus();
31
+ }
32
+ }
33
+
34
+ element.addEventListener( 'focus', onFocus );
35
+ return () => {
36
+ element.removeEventListener( 'focus', onFocus );
37
+ };
38
+ }, [] );
39
+ }
@@ -1,9 +1,14 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { findKey } from 'lodash';
5
+
1
6
  /**
2
7
  * WordPress dependencies
3
8
  */
4
9
  import { useRef } from '@wordpress/element';
5
10
  import { useRefEffect } from '@wordpress/compose';
6
- import { slice, toHTMLString } from '@wordpress/rich-text';
11
+ import { insert, toHTMLString } from '@wordpress/rich-text';
7
12
  import { getBlockTransforms, findTransform } from '@wordpress/blocks';
8
13
  import { useDispatch } from '@wordpress/data';
9
14
 
@@ -13,6 +18,37 @@ import { useDispatch } from '@wordpress/data';
13
18
  import { store as blockEditorStore } from '../../store';
14
19
  import { preventEventDiscovery } from './prevent-event-discovery';
15
20
 
21
+ // A robust way to retain selection position through various
22
+ // transforms is to insert a special character at the position and
23
+ // then recover it.
24
+ const START_OF_SELECTED_AREA = '\u0086';
25
+
26
+ function findSelection( blocks ) {
27
+ let i = blocks.length;
28
+
29
+ while ( i-- ) {
30
+ const attributeKey = findKey(
31
+ blocks[ i ].attributes,
32
+ ( v ) =>
33
+ typeof v === 'string' &&
34
+ v.indexOf( START_OF_SELECTED_AREA ) !== -1
35
+ );
36
+
37
+ if ( attributeKey ) {
38
+ blocks[ i ].attributes[ attributeKey ] = blocks[ i ].attributes[
39
+ attributeKey
40
+ ].replace( START_OF_SELECTED_AREA, '' );
41
+ return blocks[ i ].clientId;
42
+ }
43
+
44
+ const nestedSelection = findSelection( blocks[ i ].innerBlocks );
45
+
46
+ if ( nestedSelection ) {
47
+ return nestedSelection;
48
+ }
49
+ }
50
+ }
51
+
16
52
  export function useInputRules( props ) {
17
53
  const {
18
54
  __unstableMarkLastChangeAsPersistent,
@@ -22,7 +58,7 @@ export function useInputRules( props ) {
22
58
  propsRef.current = props;
23
59
  return useRefEffect( ( element ) => {
24
60
  function inputRule() {
25
- const { value, onReplace } = propsRef.current;
61
+ const { value, onReplace, selectionChange } = propsRef.current;
26
62
 
27
63
  if ( ! onReplace ) {
28
64
  return;
@@ -52,10 +88,11 @@ export function useInputRules( props ) {
52
88
  }
53
89
 
54
90
  const content = toHTMLString( {
55
- value: slice( value, start, text.length ),
91
+ value: insert( value, START_OF_SELECTED_AREA, 0, start ),
56
92
  } );
57
93
  const block = transformation.transform( content );
58
94
 
95
+ selectionChange( findSelection( [ block ] ) );
59
96
  onReplace( [ block ] );
60
97
  __unstableMarkAutomaticChange();
61
98
  }
@@ -28,6 +28,9 @@ const SkipToSelectedBlock = ( { selectedBlockClientId } ) => {
28
28
  ) : null;
29
29
  };
30
30
 
31
+ /**
32
+ * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/skip-to-selected-block/README.md
33
+ */
31
34
  export default withSelect( ( select ) => {
32
35
  return {
33
36
  selectedBlockClientId: select(
@@ -71,12 +71,13 @@ $input-size: 300px;
71
71
  .block-editor-url-input .components-spinner {
72
72
  display: none;
73
73
  @include break-small() {
74
- display: inherit;
74
+ display: grid;
75
75
  }
76
76
  }
77
77
 
78
78
  .block-editor-url-input__suggestion {
79
- padding: 4px $input-padding;
79
+ min-height: $button-size;
80
+ height: auto;
80
81
  color: $gray-700;
81
82
  display: block;
82
83
  font-size: $default-font-size;
@@ -18,6 +18,10 @@ import useMultiSelection from './use-multi-selection';
18
18
  import useTabNav from './use-tab-nav';
19
19
  import useArrowNav from './use-arrow-nav';
20
20
  import useSelectAll from './use-select-all';
21
+ import useDragSelection from './use-drag-selection';
22
+ import useSelectionObserver from './use-selection-observer';
23
+ import useClickSelection from './use-click-selection';
24
+ import useInput from './use-input';
21
25
  import { store as blockEditorStore } from '../../store';
22
26
 
23
27
  export function useWritingFlow() {
@@ -31,6 +35,10 @@ export function useWritingFlow() {
31
35
  before,
32
36
  useMergeRefs( [
33
37
  ref,
38
+ useInput(),
39
+ useDragSelection(),
40
+ useSelectionObserver(),
41
+ useClickSelection(),
34
42
  useMultiSelection(),
35
43
  useSelectAll(),
36
44
  useArrowNav(),
@@ -0,0 +1,28 @@
1
+ # Writing Flow
2
+
3
+ This hook handles selection across blocks.
4
+
5
+ ## Partial multi-block selection
6
+
7
+ Selecting across blocks is possible by temporarily setting the `contentEditable`
8
+ attribute to `true`. This sounds scary, but we prevent all default behaviours
9
+ except for selection, so don't worry. :)
10
+
11
+ * For selection by mouse, we make everything editable when the mouse leaves an
12
+ editable field.
13
+ * For Shift+Click selection, we do it on `mousedown`.
14
+ * For keyboard selection we do it when the selection reaches the edge of an
15
+ editable field.
16
+
17
+ In the future, we should consider using the `contentEditable` attribute for
18
+ arrow key navigation as well.
19
+
20
+ Now that it's possible to select across blocks, we need to sync this state to
21
+ the block editor store. We can do this by listening to the `selectionchange`
22
+ event. In writing flow, we can sync the selected block client ID, but when the
23
+ selection starts or ends in a rich text field, it will be rich text that sync a
24
+ more precise position (the block attribute key and offset in addition to the
25
+ client ID).
26
+
27
+ With the selection state in the block editor store, we can now handle things
28
+ like Backspace, Delete, and Enter.
@@ -16,7 +16,7 @@ import {
16
16
  isRTL,
17
17
  } from '@wordpress/dom';
18
18
  import { UP, DOWN, LEFT, RIGHT } from '@wordpress/keycodes';
19
- import { useSelect, useDispatch } from '@wordpress/data';
19
+ import { useSelect } from '@wordpress/data';
20
20
  import { useRefEffect } from '@wordpress/compose';
21
21
 
22
22
  /**
@@ -120,16 +120,12 @@ export function getClosestTabbable(
120
120
  export default function useArrowNav() {
121
121
  const {
122
122
  getSelectedBlockClientId,
123
- getMultiSelectedBlocksStartClientId,
124
123
  getMultiSelectedBlocksEndClientId,
125
124
  getPreviousBlockClientId,
126
125
  getNextBlockClientId,
127
- getFirstMultiSelectedBlockClientId,
128
- getLastMultiSelectedBlockClientId,
129
126
  getSettings,
130
127
  hasMultiSelection,
131
128
  } = useSelect( blockEditorStore );
132
- const { multiSelect, selectBlock } = useDispatch( blockEditorStore );
133
129
  return useRefEffect( ( node ) => {
134
130
  // Here a DOMRect is stored while moving the caret vertically so
135
131
  // vertical position of the start position can be restored. This is to
@@ -140,44 +136,6 @@ export default function useArrowNav() {
140
136
  verticalRect = null;
141
137
  }
142
138
 
143
- function expandSelection( isReverse ) {
144
- const selectedBlockClientId = getSelectedBlockClientId();
145
- const selectionStartClientId = getMultiSelectedBlocksStartClientId();
146
- const selectionEndClientId = getMultiSelectedBlocksEndClientId();
147
- const selectionBeforeEndClientId = getPreviousBlockClientId(
148
- selectionEndClientId || selectedBlockClientId
149
- );
150
- const selectionAfterEndClientId = getNextBlockClientId(
151
- selectionEndClientId || selectedBlockClientId
152
- );
153
- const nextSelectionEndClientId = isReverse
154
- ? selectionBeforeEndClientId
155
- : selectionAfterEndClientId;
156
-
157
- if ( nextSelectionEndClientId ) {
158
- if ( selectionStartClientId === nextSelectionEndClientId ) {
159
- selectBlock( nextSelectionEndClientId );
160
- } else {
161
- multiSelect(
162
- selectionStartClientId || selectedBlockClientId,
163
- nextSelectionEndClientId
164
- );
165
- }
166
- }
167
- }
168
-
169
- function moveSelection( isReverse ) {
170
- const selectedFirstClientId = getFirstMultiSelectedBlockClientId();
171
- const selectedLastClientId = getLastMultiSelectedBlockClientId();
172
- const focusedBlockClientId = isReverse
173
- ? selectedFirstClientId
174
- : selectedLastClientId;
175
-
176
- if ( focusedBlockClientId ) {
177
- selectBlock( focusedBlockClientId );
178
- }
179
- }
180
-
181
139
  /**
182
140
  * Returns true if the given target field is the last in its block which
183
141
  * can be considered for tab transition. For example, in a block with
@@ -218,12 +176,6 @@ export default function useArrowNav() {
218
176
  const { defaultView } = ownerDocument;
219
177
 
220
178
  if ( hasMultiSelection() ) {
221
- if ( isNav ) {
222
- const action = isShift ? expandSelection : moveSelection;
223
- action( isReverse );
224
- event.preventDefault();
225
- }
226
-
227
179
  return;
228
180
  }
229
181
 
@@ -278,10 +230,9 @@ export default function useArrowNav() {
278
230
  isTabbableEdge( target, isReverse ) &&
279
231
  isNavEdge( target, isReverse )
280
232
  ) {
281
- // Shift key is down, and there is multi selection or we're
282
- // at the end of the current block.
283
- expandSelection( isReverse );
284
- event.preventDefault();
233
+ node.contentEditable = true;
234
+ // Firefox doesn't automatically move focus.
235
+ node.focus();
285
236
  }
286
237
  } else if (
287
238
  isVertical &&
@@ -0,0 +1,65 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useSelect, useDispatch } from '@wordpress/data';
5
+ import { useRefEffect } from '@wordpress/compose';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import { store as blockEditorStore } from '../../store';
11
+ import { getBlockClientId } from '../../utils/dom';
12
+
13
+ export default function useClickSelection() {
14
+ const { multiSelect, selectBlock } = useDispatch( blockEditorStore );
15
+ const {
16
+ isSelectionEnabled,
17
+ getBlockParents,
18
+ getBlockSelectionStart,
19
+ hasMultiSelection,
20
+ } = useSelect( blockEditorStore );
21
+ return useRefEffect(
22
+ ( node ) => {
23
+ function onMouseDown( event ) {
24
+ // The main button.
25
+ // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button
26
+ if ( ! isSelectionEnabled() || event.button !== 0 ) {
27
+ return;
28
+ }
29
+
30
+ const startClientId = getBlockSelectionStart();
31
+ const clickedClientId = getBlockClientId( event.target );
32
+
33
+ if ( event.shiftKey ) {
34
+ if ( startClientId !== clickedClientId ) {
35
+ node.contentEditable = true;
36
+ // Firefox doesn't automatically move focus.
37
+ node.focus();
38
+ }
39
+ } else if ( hasMultiSelection() ) {
40
+ // Allow user to escape out of a multi-selection to a
41
+ // singular selection of a block via click. This is handled
42
+ // here since focus handling excludes blocks when there is
43
+ // multiselection, as focus can be incurred by starting a
44
+ // multiselection (focus moved to first block's multi-
45
+ // controls).
46
+ selectBlock( clickedClientId );
47
+ }
48
+ }
49
+
50
+ node.addEventListener( 'mousedown', onMouseDown );
51
+
52
+ return () => {
53
+ node.removeEventListener( 'mousedown', onMouseDown );
54
+ };
55
+ },
56
+ [
57
+ multiSelect,
58
+ selectBlock,
59
+ isSelectionEnabled,
60
+ getBlockParents,
61
+ getBlockSelectionStart,
62
+ hasMultiSelection,
63
+ ]
64
+ );
65
+ }