@wordpress/block-editor 8.4.0 → 8.5.2

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 (421) 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-alignment-control/ui.js +1 -1
  8. package/build/components/block-alignment-control/ui.js.map +1 -1
  9. package/build/components/block-content-overlay/index.js +13 -4
  10. package/build/components/block-content-overlay/index.js.map +1 -1
  11. package/build/components/block-draggable/index.js +2 -3
  12. package/build/components/block-draggable/index.js.map +1 -1
  13. package/build/components/block-icon/index.js +4 -0
  14. package/build/components/block-icon/index.js.map +1 -1
  15. package/build/components/block-inspector/index.js +6 -1
  16. package/build/components/block-inspector/index.js.map +1 -1
  17. package/build/components/block-list/use-block-props/index.js +1 -6
  18. package/build/components/block-list/use-block-props/index.js.map +1 -1
  19. package/build/components/block-list/use-block-props/use-focus-first-element.js +14 -17
  20. package/build/components/block-list/use-block-props/use-focus-first-element.js.map +1 -1
  21. package/build/components/block-list/use-block-props/use-focus-handler.js +7 -1
  22. package/build/components/block-list/use-block-props/use-focus-handler.js.map +1 -1
  23. package/build/components/block-list-appender/index.js +6 -1
  24. package/build/components/block-list-appender/index.js.map +1 -1
  25. package/build/components/block-lock/index.js +8 -0
  26. package/build/components/block-lock/index.js.map +1 -1
  27. package/build/components/block-lock/menu-item.js +9 -15
  28. package/build/components/block-lock/menu-item.js.map +1 -1
  29. package/build/components/block-lock/modal.js +35 -23
  30. package/build/components/block-lock/modal.js.map +1 -1
  31. package/build/components/block-lock/toolbar.js +11 -16
  32. package/build/components/block-lock/toolbar.js.map +1 -1
  33. package/build/components/block-lock/use-block-lock.js +50 -0
  34. package/build/components/block-lock/use-block-lock.js.map +1 -0
  35. package/build/components/block-mover/index.js +4 -0
  36. package/build/components/block-mover/index.js.map +1 -1
  37. package/build/components/block-pattern-setup/index.js +37 -22
  38. package/build/components/block-pattern-setup/index.js.map +1 -1
  39. package/build/components/block-pattern-setup/setup-toolbar.js +1 -1
  40. package/build/components/block-pattern-setup/setup-toolbar.js.map +1 -1
  41. package/build/components/block-preview/auto.js +6 -3
  42. package/build/components/block-preview/auto.js.map +1 -1
  43. package/build/components/block-preview/index.js +4 -2
  44. package/build/components/block-preview/index.js.map +1 -1
  45. package/build/components/block-settings-menu/block-settings-dropdown.js +50 -5
  46. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  47. package/build/components/block-switcher/index.js +8 -3
  48. package/build/components/block-switcher/index.js.map +1 -1
  49. package/build/components/block-title/index.js +2 -2
  50. package/build/components/block-title/index.js.map +1 -1
  51. package/build/components/block-title/use-block-display-title.js +1 -1
  52. package/build/components/block-title/use-block-display-title.js.map +1 -1
  53. package/build/components/block-toolbar/block-name-context.js +17 -0
  54. package/build/components/block-toolbar/block-name-context.js.map +1 -0
  55. package/build/components/block-toolbar/block-toolbar-last-item.js +20 -0
  56. package/build/components/block-toolbar/block-toolbar-last-item.js.map +1 -0
  57. package/build/components/block-toolbar/index.js +20 -5
  58. package/build/components/block-toolbar/index.js.map +1 -1
  59. package/build/components/block-tools/index.js +0 -16
  60. package/build/components/block-tools/index.js.map +1 -1
  61. package/build/components/block-variation-transforms/index.js +92 -47
  62. package/build/components/block-variation-transforms/index.js.map +1 -1
  63. package/build/components/block-vertical-alignment-control/index.js +13 -6
  64. package/build/components/block-vertical-alignment-control/index.js.map +1 -1
  65. package/build/components/contrast-checker/index.js +4 -0
  66. package/build/components/contrast-checker/index.js.map +1 -1
  67. package/build/components/convert-to-group-buttons/index.js +8 -0
  68. package/build/components/convert-to-group-buttons/index.js.map +1 -1
  69. package/build/components/convert-to-group-buttons/toolbar.js +105 -0
  70. package/build/components/convert-to-group-buttons/toolbar.js.map +1 -0
  71. package/build/components/copy-handler/index.js +48 -9
  72. package/build/components/copy-handler/index.js.map +1 -1
  73. package/build/components/font-sizes/font-size-picker.js +4 -0
  74. package/build/components/font-sizes/font-size-picker.js.map +1 -1
  75. package/build/components/iframe/index.js +6 -9
  76. package/build/components/iframe/index.js.map +1 -1
  77. package/build/components/index.js +18 -0
  78. package/build/components/index.js.map +1 -1
  79. package/build/components/justify-content-control/index.js +13 -6
  80. package/build/components/justify-content-control/index.js.map +1 -1
  81. package/build/components/keyboard-shortcuts/index.js +1 -1
  82. package/build/components/keyboard-shortcuts/index.js.map +1 -1
  83. package/build/components/line-height-control/index.js +10 -3
  84. package/build/components/line-height-control/index.js.map +1 -1
  85. package/build/components/link-control/index.js +6 -7
  86. package/build/components/link-control/index.js.map +1 -1
  87. package/build/components/list-view/block-select-button.js +19 -6
  88. package/build/components/list-view/block-select-button.js.map +1 -1
  89. package/build/components/list-view/block.js +18 -3
  90. package/build/components/list-view/block.js.map +1 -1
  91. package/build/components/list-view/branch.js +1 -1
  92. package/build/components/list-view/branch.js.map +1 -1
  93. package/build/components/media-replace-flow/index.js +4 -0
  94. package/build/components/media-replace-flow/index.js.map +1 -1
  95. package/build/components/multi-selection-inspector/index.js +1 -1
  96. package/build/components/multi-selection-inspector/index.js.map +1 -1
  97. package/build/components/rich-text/index.js +26 -4
  98. package/build/components/rich-text/index.js.map +1 -1
  99. package/build/components/rich-text/split-value.js +12 -2
  100. package/build/components/rich-text/split-value.js.map +1 -1
  101. package/build/components/rich-text/use-firefox-compat.js +49 -0
  102. package/build/components/rich-text/use-firefox-compat.js.map +1 -0
  103. package/build/components/rich-text/use-input-rules.js +34 -2
  104. package/build/components/rich-text/use-input-rules.js.map +1 -1
  105. package/build/components/skip-to-selected-block/index.js +4 -0
  106. package/build/components/skip-to-selected-block/index.js.map +1 -1
  107. package/build/components/writing-flow/index.js +9 -1
  108. package/build/components/writing-flow/index.js.map +1 -1
  109. package/build/components/writing-flow/use-arrow-nav.js +3 -44
  110. package/build/components/writing-flow/use-arrow-nav.js.map +1 -1
  111. package/build/components/writing-flow/use-click-selection.js +68 -0
  112. package/build/components/writing-flow/use-click-selection.js.map +1 -0
  113. package/build/components/writing-flow/use-drag-selection.js +134 -0
  114. package/build/components/writing-flow/use-drag-selection.js.map +1 -0
  115. package/build/components/writing-flow/use-input.js +116 -0
  116. package/build/components/writing-flow/use-input.js.map +1 -0
  117. package/build/components/writing-flow/use-multi-selection.js +18 -38
  118. package/build/components/writing-flow/use-multi-selection.js.map +1 -1
  119. package/build/components/writing-flow/use-selection-observer.js +161 -0
  120. package/build/components/writing-flow/use-selection-observer.js.map +1 -0
  121. package/build/components/writing-flow/use-tab-nav.js +1 -8
  122. package/build/components/writing-flow/use-tab-nav.js.map +1 -1
  123. package/build/hooks/border-color.js +3 -3
  124. package/build/hooks/border-color.js.map +1 -1
  125. package/build/hooks/border.js +0 -14
  126. package/build/hooks/border.js.map +1 -1
  127. package/build/hooks/color.js +20 -17
  128. package/build/hooks/color.js.map +1 -1
  129. package/build/hooks/font-family.js +5 -1
  130. package/build/hooks/font-family.js.map +1 -1
  131. package/build/hooks/font-size.js +4 -2
  132. package/build/hooks/font-size.js.map +1 -1
  133. package/build/hooks/gap.js +23 -16
  134. package/build/hooks/gap.js.map +1 -1
  135. package/build/hooks/layout.js +7 -2
  136. package/build/hooks/layout.js.map +1 -1
  137. package/build/hooks/style.js +34 -3
  138. package/build/hooks/style.js.map +1 -1
  139. package/build/hooks/utils.js +29 -0
  140. package/build/hooks/utils.js.map +1 -1
  141. package/build/layouts/flex.js +76 -12
  142. package/build/layouts/flex.js.map +1 -1
  143. package/build/layouts/flow.js +9 -4
  144. package/build/layouts/flow.js.map +1 -1
  145. package/build/store/actions.js +290 -51
  146. package/build/store/actions.js.map +1 -1
  147. package/build/store/defaults.js +5 -2
  148. package/build/store/defaults.js.map +1 -1
  149. package/build/store/reducer.js +25 -13
  150. package/build/store/reducer.js.map +1 -1
  151. package/build/store/selectors.js +264 -21
  152. package/build/store/selectors.js.map +1 -1
  153. package/build/store/utils.js +27 -0
  154. package/build/store/utils.js.map +1 -0
  155. package/build/utils/dom.js +2 -1
  156. package/build/utils/dom.js.map +1 -1
  157. package/build-module/components/alignment-control/index.js +12 -4
  158. package/build-module/components/alignment-control/index.js.map +1 -1
  159. package/build-module/components/block-alignment-control/index.js +12 -4
  160. package/build-module/components/block-alignment-control/index.js.map +1 -1
  161. package/build-module/components/block-alignment-control/ui.js +2 -2
  162. package/build-module/components/block-alignment-control/ui.js.map +1 -1
  163. package/build-module/components/block-content-overlay/index.js +13 -4
  164. package/build-module/components/block-content-overlay/index.js.map +1 -1
  165. package/build-module/components/block-draggable/index.js +2 -3
  166. package/build-module/components/block-draggable/index.js.map +1 -1
  167. package/build-module/components/block-icon/index.js +4 -0
  168. package/build-module/components/block-icon/index.js.map +1 -1
  169. package/build-module/components/block-inspector/index.js +6 -1
  170. package/build-module/components/block-inspector/index.js.map +1 -1
  171. package/build-module/components/block-list/use-block-props/index.js +1 -4
  172. package/build-module/components/block-list/use-block-props/index.js.map +1 -1
  173. package/build-module/components/block-list/use-block-props/use-focus-first-element.js +15 -17
  174. package/build-module/components/block-list/use-block-props/use-focus-first-element.js.map +1 -1
  175. package/build-module/components/block-list/use-block-props/use-focus-handler.js +7 -1
  176. package/build-module/components/block-list/use-block-props/use-focus-handler.js.map +1 -1
  177. package/build-module/components/block-list-appender/index.js +6 -1
  178. package/build-module/components/block-list-appender/index.js.map +1 -1
  179. package/build-module/components/block-lock/index.js +1 -0
  180. package/build-module/components/block-lock/index.js.map +1 -1
  181. package/build-module/components/block-lock/menu-item.js +8 -13
  182. package/build-module/components/block-lock/menu-item.js.map +1 -1
  183. package/build-module/components/block-lock/modal.js +34 -24
  184. package/build-module/components/block-lock/modal.js.map +1 -1
  185. package/build-module/components/block-lock/toolbar.js +10 -14
  186. package/build-module/components/block-lock/toolbar.js.map +1 -1
  187. package/build-module/components/block-lock/use-block-lock.js +41 -0
  188. package/build-module/components/block-lock/use-block-lock.js.map +1 -0
  189. package/build-module/components/block-mover/index.js +4 -0
  190. package/build-module/components/block-mover/index.js.map +1 -1
  191. package/build-module/components/block-pattern-setup/index.js +39 -24
  192. package/build-module/components/block-pattern-setup/index.js.map +1 -1
  193. package/build-module/components/block-pattern-setup/setup-toolbar.js +1 -1
  194. package/build-module/components/block-pattern-setup/setup-toolbar.js.map +1 -1
  195. package/build-module/components/block-preview/auto.js +6 -3
  196. package/build-module/components/block-preview/auto.js.map +1 -1
  197. package/build-module/components/block-preview/index.js +4 -2
  198. package/build-module/components/block-preview/index.js.map +1 -1
  199. package/build-module/components/block-settings-menu/block-settings-dropdown.js +50 -7
  200. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  201. package/build-module/components/block-switcher/index.js +9 -4
  202. package/build-module/components/block-switcher/index.js.map +1 -1
  203. package/build-module/components/block-title/index.js +2 -2
  204. package/build-module/components/block-title/index.js.map +1 -1
  205. package/build-module/components/block-title/use-block-display-title.js +1 -1
  206. package/build-module/components/block-title/use-block-display-title.js.map +1 -1
  207. package/build-module/components/block-toolbar/block-name-context.js +9 -0
  208. package/build-module/components/block-toolbar/block-name-context.js.map +1 -0
  209. package/build-module/components/block-toolbar/block-toolbar-last-item.js +11 -0
  210. package/build-module/components/block-toolbar/block-toolbar-last-item.js.map +1 -0
  211. package/build-module/components/block-toolbar/index.js +16 -4
  212. package/build-module/components/block-toolbar/index.js.map +1 -1
  213. package/build-module/components/block-tools/index.js +0 -16
  214. package/build-module/components/block-tools/index.js.map +1 -1
  215. package/build-module/components/block-variation-transforms/index.js +95 -49
  216. package/build-module/components/block-variation-transforms/index.js.map +1 -1
  217. package/build-module/components/block-vertical-alignment-control/index.js +12 -4
  218. package/build-module/components/block-vertical-alignment-control/index.js.map +1 -1
  219. package/build-module/components/contrast-checker/index.js +4 -0
  220. package/build-module/components/contrast-checker/index.js.map +1 -1
  221. package/build-module/components/convert-to-group-buttons/index.js +2 -1
  222. package/build-module/components/convert-to-group-buttons/index.js.map +1 -1
  223. package/build-module/components/convert-to-group-buttons/toolbar.js +90 -0
  224. package/build-module/components/convert-to-group-buttons/toolbar.js.map +1 -0
  225. package/build-module/components/copy-handler/index.js +48 -9
  226. package/build-module/components/copy-handler/index.js.map +1 -1
  227. package/build-module/components/font-sizes/font-size-picker.js +4 -0
  228. package/build-module/components/font-sizes/font-size-picker.js.map +1 -1
  229. package/build-module/components/iframe/index.js +6 -9
  230. package/build-module/components/iframe/index.js.map +1 -1
  231. package/build-module/components/index.js +2 -0
  232. package/build-module/components/index.js.map +1 -1
  233. package/build-module/components/justify-content-control/index.js +12 -4
  234. package/build-module/components/justify-content-control/index.js.map +1 -1
  235. package/build-module/components/keyboard-shortcuts/index.js +1 -1
  236. package/build-module/components/keyboard-shortcuts/index.js.map +1 -1
  237. package/build-module/components/line-height-control/index.js +9 -2
  238. package/build-module/components/line-height-control/index.js.map +1 -1
  239. package/build-module/components/link-control/index.js +6 -7
  240. package/build-module/components/link-control/index.js.map +1 -1
  241. package/build-module/components/list-view/block-select-button.js +17 -6
  242. package/build-module/components/list-view/block-select-button.js.map +1 -1
  243. package/build-module/components/list-view/block.js +18 -3
  244. package/build-module/components/list-view/block.js.map +1 -1
  245. package/build-module/components/list-view/branch.js +1 -1
  246. package/build-module/components/list-view/branch.js.map +1 -1
  247. package/build-module/components/media-replace-flow/index.js +4 -0
  248. package/build-module/components/media-replace-flow/index.js.map +1 -1
  249. package/build-module/components/multi-selection-inspector/index.js +2 -2
  250. package/build-module/components/multi-selection-inspector/index.js.map +1 -1
  251. package/build-module/components/rich-text/index.js +25 -4
  252. package/build-module/components/rich-text/index.js.map +1 -1
  253. package/build-module/components/rich-text/split-value.js +12 -2
  254. package/build-module/components/rich-text/split-value.js.map +1 -1
  255. package/build-module/components/rich-text/use-firefox-compat.js +39 -0
  256. package/build-module/components/rich-text/use-firefox-compat.js.map +1 -0
  257. package/build-module/components/rich-text/use-input-rules.js +35 -4
  258. package/build-module/components/rich-text/use-input-rules.js.map +1 -1
  259. package/build-module/components/skip-to-selected-block/index.js +4 -0
  260. package/build-module/components/skip-to-selected-block/index.js.map +1 -1
  261. package/build-module/components/writing-flow/index.js +5 -1
  262. package/build-module/components/writing-flow/index.js.map +1 -1
  263. package/build-module/components/writing-flow/use-arrow-nav.js +4 -45
  264. package/build-module/components/writing-flow/use-arrow-nav.js.map +1 -1
  265. package/build-module/components/writing-flow/use-click-selection.js +57 -0
  266. package/build-module/components/writing-flow/use-click-selection.js.map +1 -0
  267. package/build-module/components/writing-flow/use-drag-selection.js +124 -0
  268. package/build-module/components/writing-flow/use-drag-selection.js.map +1 -0
  269. package/build-module/components/writing-flow/use-input.js +104 -0
  270. package/build-module/components/writing-flow/use-input.js.map +1 -0
  271. package/build-module/components/writing-flow/use-multi-selection.js +18 -37
  272. package/build-module/components/writing-flow/use-multi-selection.js.map +1 -1
  273. package/build-module/components/writing-flow/use-selection-observer.js +150 -0
  274. package/build-module/components/writing-flow/use-selection-observer.js.map +1 -0
  275. package/build-module/components/writing-flow/use-tab-nav.js +1 -9
  276. package/build-module/components/writing-flow/use-tab-nav.js.map +1 -1
  277. package/build-module/hooks/border-color.js +5 -5
  278. package/build-module/hooks/border-color.js.map +1 -1
  279. package/build-module/hooks/border.js +0 -12
  280. package/build-module/hooks/border.js.map +1 -1
  281. package/build-module/hooks/color.js +19 -18
  282. package/build-module/hooks/color.js.map +1 -1
  283. package/build-module/hooks/font-family.js +3 -1
  284. package/build-module/hooks/font-family.js.map +1 -1
  285. package/build-module/hooks/font-size.js +4 -3
  286. package/build-module/hooks/font-size.js.map +1 -1
  287. package/build-module/hooks/gap.js +22 -15
  288. package/build-module/hooks/gap.js.map +1 -1
  289. package/build-module/hooks/layout.js +7 -2
  290. package/build-module/hooks/layout.js.map +1 -1
  291. package/build-module/hooks/style.js +33 -3
  292. package/build-module/hooks/style.js.map +1 -1
  293. package/build-module/hooks/utils.js +26 -0
  294. package/build-module/hooks/utils.js.map +1 -1
  295. package/build-module/layouts/flex.js +76 -13
  296. package/build-module/layouts/flex.js.map +1 -1
  297. package/build-module/layouts/flow.js +9 -5
  298. package/build-module/layouts/flow.js.map +1 -1
  299. package/build-module/store/actions.js +277 -49
  300. package/build-module/store/actions.js.map +1 -1
  301. package/build-module/store/defaults.js +5 -2
  302. package/build-module/store/defaults.js.map +1 -1
  303. package/build-module/store/reducer.js +25 -13
  304. package/build-module/store/reducer.js.map +1 -1
  305. package/build-module/store/selectors.js +250 -21
  306. package/build-module/store/selectors.js.map +1 -1
  307. package/build-module/store/utils.js +20 -0
  308. package/build-module/store/utils.js.map +1 -0
  309. package/build-module/utils/dom.js +2 -1
  310. package/build-module/utils/dom.js.map +1 -1
  311. package/build-style/style-rtl.css +142 -101
  312. package/build-style/style.css +142 -101
  313. package/build-types/utils/dom.d.ts.map +1 -1
  314. package/package.json +28 -28
  315. package/src/components/alignment-control/index.js +9 -4
  316. package/src/components/block-alignment-control/index.js +9 -4
  317. package/src/components/block-alignment-control/ui.js +2 -2
  318. package/src/components/block-content-overlay/index.js +19 -2
  319. package/src/components/block-draggable/index.js +2 -5
  320. package/src/components/block-icon/index.js +3 -0
  321. package/src/components/block-inspector/index.js +4 -0
  322. package/src/components/block-list/style.scss +4 -5
  323. package/src/components/block-list/use-block-props/index.js +0 -5
  324. package/src/components/block-list/use-block-props/use-focus-first-element.js +19 -26
  325. package/src/components/block-list/use-block-props/use-focus-handler.js +8 -0
  326. package/src/components/block-list-appender/index.js +5 -0
  327. package/src/components/block-lock/index.js +1 -0
  328. package/src/components/block-lock/menu-item.js +6 -19
  329. package/src/components/block-lock/modal.js +52 -23
  330. package/src/components/block-lock/style.scss +7 -5
  331. package/src/components/block-lock/toolbar.js +7 -14
  332. package/src/components/block-lock/use-block-lock.js +45 -0
  333. package/src/components/block-mover/index.js +3 -0
  334. package/src/components/block-mover/style.scss +4 -0
  335. package/src/components/block-pattern-setup/index.js +84 -59
  336. package/src/components/block-pattern-setup/setup-toolbar.js +3 -1
  337. package/src/components/block-pattern-setup/style.scss +32 -26
  338. package/src/components/block-preview/auto.js +10 -1
  339. package/src/components/block-preview/index.js +2 -0
  340. package/src/components/block-settings-menu/block-settings-dropdown.js +62 -4
  341. package/src/components/block-switcher/index.js +15 -3
  342. package/src/components/block-switcher/style.scss +15 -4
  343. package/src/components/block-switcher/test/__snapshots__/index.js.snap +15 -13
  344. package/src/components/block-switcher/test/index.js +2 -2
  345. package/src/components/block-title/index.js +2 -2
  346. package/src/components/block-title/use-block-display-title.js +1 -1
  347. package/src/components/block-toolbar/block-name-context.js +8 -0
  348. package/src/components/block-toolbar/block-toolbar-last-item.js +12 -0
  349. package/src/components/block-toolbar/index.js +18 -2
  350. package/src/components/block-toolbar/style.scss +6 -0
  351. package/src/components/block-tools/index.js +0 -19
  352. package/src/components/block-tools/style.scss +3 -5
  353. package/src/components/block-variation-transforms/index.js +105 -36
  354. package/src/components/block-variation-transforms/style.scss +1 -1
  355. package/src/components/block-vertical-alignment-control/index.js +9 -4
  356. package/src/components/button-block-appender/style.scss +5 -1
  357. package/src/components/contrast-checker/index.js +3 -0
  358. package/src/components/convert-to-group-buttons/index.js +6 -1
  359. package/src/components/convert-to-group-buttons/toolbar.js +87 -0
  360. package/src/components/copy-handler/index.js +55 -10
  361. package/src/components/font-sizes/font-size-picker.js +3 -0
  362. package/src/components/iframe/index.js +5 -7
  363. package/src/components/index.js +2 -0
  364. package/src/components/justify-content-control/index.js +9 -4
  365. package/src/components/keyboard-shortcuts/index.js +1 -1
  366. package/src/components/line-height-control/index.js +8 -3
  367. package/src/components/link-control/index.js +5 -5
  368. package/src/components/list-view/block-select-button.js +13 -3
  369. package/src/components/list-view/block.js +24 -8
  370. package/src/components/list-view/branch.js +1 -1
  371. package/src/components/list-view/style.scss +56 -14
  372. package/src/components/media-placeholder/README.md +8 -0
  373. package/src/components/media-replace-flow/index.js +3 -0
  374. package/src/components/multi-selection-inspector/index.js +2 -2
  375. package/src/components/rich-text/index.js +24 -1
  376. package/src/components/rich-text/split-value.js +5 -1
  377. package/src/components/rich-text/use-firefox-compat.js +39 -0
  378. package/src/components/rich-text/use-input-rules.js +40 -3
  379. package/src/components/skip-to-selected-block/index.js +3 -0
  380. package/src/components/url-input/style.scss +3 -2
  381. package/src/components/writing-flow/index.js +8 -0
  382. package/src/components/writing-flow/readme.md +28 -0
  383. package/src/components/writing-flow/use-arrow-nav.js +4 -53
  384. package/src/components/writing-flow/use-click-selection.js +65 -0
  385. package/src/components/writing-flow/use-drag-selection.js +126 -0
  386. package/src/components/writing-flow/use-input.js +112 -0
  387. package/src/components/writing-flow/use-multi-selection.js +13 -36
  388. package/src/components/writing-flow/use-selection-observer.js +153 -0
  389. package/src/components/writing-flow/use-tab-nav.js +1 -11
  390. package/src/hooks/border-color.js +5 -5
  391. package/src/hooks/border.js +0 -13
  392. package/src/hooks/color.js +51 -24
  393. package/src/hooks/font-family.js +5 -2
  394. package/src/hooks/font-size.js +10 -7
  395. package/src/hooks/gap.js +25 -17
  396. package/src/hooks/layout.js +11 -1
  397. package/src/hooks/style.js +40 -4
  398. package/src/hooks/test/gap.js +25 -1
  399. package/src/hooks/test/style.js +94 -0
  400. package/src/hooks/test/utils.js +1 -1
  401. package/src/hooks/utils.js +26 -0
  402. package/src/layouts/flex.js +89 -5
  403. package/src/layouts/flow.js +15 -4
  404. package/src/store/actions.js +341 -32
  405. package/src/store/defaults.js +7 -2
  406. package/src/store/reducer.js +25 -10
  407. package/src/store/selectors.js +329 -26
  408. package/src/store/test/selectors.js +242 -5
  409. package/src/store/utils.js +19 -0
  410. package/src/utils/dom.js +2 -1
  411. package/tsconfig.tsbuildinfo +1 -1
  412. package/build/components/block-list/use-block-props/use-multi-selection.js +0 -205
  413. package/build/components/block-list/use-block-props/use-multi-selection.js.map +0 -1
  414. package/build/components/block-list/use-block-props/use-scroll-into-view.js +0 -77
  415. package/build/components/block-list/use-block-props/use-scroll-into-view.js.map +0 -1
  416. package/build-module/components/block-list/use-block-props/use-multi-selection.js +0 -192
  417. package/build-module/components/block-list/use-block-props/use-multi-selection.js.map +0 -1
  418. package/build-module/components/block-list/use-block-props/use-scroll-into-view.js +0 -63
  419. package/build-module/components/block-list/use-block-props/use-scroll-into-view.js.map +0 -1
  420. package/src/components/block-list/use-block-props/use-multi-selection.js +0 -227
  421. package/src/components/block-list/use-block-props/use-scroll-into-view.js +0 -73
@@ -1278,17 +1278,24 @@ function selectionHelper( state = {}, action ) {
1278
1278
  export function selection( state = {}, action ) {
1279
1279
  switch ( action.type ) {
1280
1280
  case 'SELECTION_CHANGE':
1281
+ if ( action.clientId ) {
1282
+ return {
1283
+ selectionStart: {
1284
+ clientId: action.clientId,
1285
+ attributeKey: action.attributeKey,
1286
+ offset: action.startOffset,
1287
+ },
1288
+ selectionEnd: {
1289
+ clientId: action.clientId,
1290
+ attributeKey: action.attributeKey,
1291
+ offset: action.endOffset,
1292
+ },
1293
+ };
1294
+ }
1295
+
1281
1296
  return {
1282
- selectionStart: {
1283
- clientId: action.clientId,
1284
- attributeKey: action.attributeKey,
1285
- offset: action.startOffset,
1286
- },
1287
- selectionEnd: {
1288
- clientId: action.clientId,
1289
- attributeKey: action.attributeKey,
1290
- offset: action.endOffset,
1291
- },
1297
+ selectionStart: action.start || state.selectionStart,
1298
+ selectionEnd: action.end || state.selectionEnd,
1292
1299
  };
1293
1300
  case 'RESET_SELECTION':
1294
1301
  const { selectionStart, selectionEnd } = action;
@@ -1298,6 +1305,14 @@ export function selection( state = {}, action ) {
1298
1305
  };
1299
1306
  case 'MULTI_SELECT':
1300
1307
  const { start, end } = action;
1308
+
1309
+ if (
1310
+ start === state.selectionStart?.clientId &&
1311
+ end === state.selectionEnd?.clientId
1312
+ ) {
1313
+ return state;
1314
+ }
1315
+
1301
1316
  return {
1302
1317
  selectionStart: { clientId: start },
1303
1318
  selectionEnd: { clientId: end },
@@ -3,7 +3,6 @@
3
3
  */
4
4
  import {
5
5
  castArray,
6
- flatMap,
7
6
  first,
8
7
  isArray,
9
8
  isBoolean,
@@ -28,10 +27,18 @@ import {
28
27
  hasBlockSupport,
29
28
  getPossibleBlockTransformations,
30
29
  parse,
30
+ switchToBlockType,
31
31
  } from '@wordpress/blocks';
32
32
  import { Platform } from '@wordpress/element';
33
33
  import { applyFilters } from '@wordpress/hooks';
34
34
  import { symbol } from '@wordpress/icons';
35
+ import { __ } from '@wordpress/i18n';
36
+ import { create, remove, toHTMLString } from '@wordpress/rich-text';
37
+
38
+ /**
39
+ * Internal dependencies
40
+ */
41
+ import { mapRichTextSettings } from './utils';
35
42
 
36
43
  /**
37
44
  * A block selection object.
@@ -215,26 +222,35 @@ export const __unstableGetClientIdsTree = createSelector(
215
222
  );
216
223
 
217
224
  /**
218
- * Returns an array containing the clientIds of all descendants
219
- * of the blocks given.
225
+ * Returns an array containing the clientIds of all descendants of the blocks
226
+ * given. Returned ids are ordered first by the order of the ids given, then
227
+ * by the order that they appear in the editor.
220
228
  *
221
229
  * @param {Object} state Global application state.
222
230
  * @param {Array} clientIds Array of blocks to inspect.
223
231
  *
224
232
  * @return {Array} ids of descendants.
225
233
  */
226
- export const getClientIdsOfDescendants = ( state, clientIds ) =>
227
- flatMap( clientIds, ( clientId ) => {
228
- const descendants = getBlockOrder( state, clientId );
229
- return [
230
- ...descendants,
231
- ...getClientIdsOfDescendants( state, descendants ),
232
- ];
233
- } );
234
+ export const getClientIdsOfDescendants = createSelector(
235
+ ( state, clientIds ) => {
236
+ const collectedIds = [];
237
+ for ( const givenId of clientIds ) {
238
+ for ( const descendantId of getBlockOrder( state, givenId ) ) {
239
+ collectedIds.push(
240
+ descendantId,
241
+ ...getClientIdsOfDescendants( state, [ descendantId ] )
242
+ );
243
+ }
244
+ }
245
+ return collectedIds;
246
+ },
247
+ ( state ) => [ state.blocks.order ]
248
+ );
234
249
 
235
250
  /**
236
- * Returns an array containing the clientIds of the top-level blocks
237
- * and their descendants of any depth (for nested blocks).
251
+ * Returns an array containing the clientIds of the top-level blocks and
252
+ * their descendants of any depth (for nested blocks). Ids are returned
253
+ * in the same order that they appear in the editor.
238
254
  *
239
255
  * @param {Object} state Global application state.
240
256
  *
@@ -242,11 +258,14 @@ export const getClientIdsOfDescendants = ( state, clientIds ) =>
242
258
  */
243
259
  export const getClientIdsWithDescendants = createSelector(
244
260
  ( state ) => {
245
- const topLevelIds = getBlockOrder( state );
246
- return [
247
- ...topLevelIds,
248
- ...getClientIdsOfDescendants( state, topLevelIds ),
249
- ];
261
+ const collectedIds = [];
262
+ for ( const topLevelId of getBlockOrder( state ) ) {
263
+ collectedIds.push(
264
+ topLevelId,
265
+ ...getClientIdsOfDescendants( state, [ topLevelId ] )
266
+ );
267
+ }
268
+ return collectedIds;
250
269
  },
251
270
  ( state ) => [ state.blocks.order ]
252
271
  );
@@ -895,6 +914,222 @@ export function getMultiSelectedBlocksEndClientId( state ) {
895
914
  return selectionEnd.clientId || null;
896
915
  }
897
916
 
917
+ /**
918
+ * Returns true if the selection is not partial.
919
+ *
920
+ * @param {Object} state Editor state.
921
+ *
922
+ * @return {boolean} Whether the selection is mergeable.
923
+ */
924
+ export function __unstableIsFullySelected( state ) {
925
+ const selectionAnchor = getSelectionStart( state );
926
+ const selectionFocus = getSelectionEnd( state );
927
+ return (
928
+ ! selectionAnchor.attributeKey &&
929
+ ! selectionFocus.attributeKey &&
930
+ typeof selectionAnchor.offset === 'undefined' &&
931
+ typeof selectionFocus.offset === 'undefined'
932
+ );
933
+ }
934
+
935
+ /**
936
+ * Returns true if the selection is collapsed.
937
+ *
938
+ * @param {Object} state Editor state.
939
+ *
940
+ * @return {boolean} Whether the selection is collapsed.
941
+ */
942
+ export function __unstableIsSelectionCollapsed( state ) {
943
+ const selectionAnchor = getSelectionStart( state );
944
+ const selectionFocus = getSelectionEnd( state );
945
+ return (
946
+ !! selectionAnchor &&
947
+ !! selectionFocus &&
948
+ selectionAnchor.clientId === selectionFocus.clientId &&
949
+ selectionAnchor.attributeKey === selectionFocus.attributeKey &&
950
+ selectionAnchor.offset === selectionFocus.offset
951
+ );
952
+ }
953
+
954
+ /**
955
+ * Check whether the selection is mergeable.
956
+ *
957
+ * @param {Object} state Editor state.
958
+ * @param {boolean} isForward Whether to merge forwards.
959
+ *
960
+ * @return {boolean} Whether the selection is mergeable.
961
+ */
962
+ export function __unstableIsSelectionMergeable( state, isForward ) {
963
+ const selectionAnchor = getSelectionStart( state );
964
+ const selectionFocus = getSelectionEnd( state );
965
+
966
+ // It's not mergeable if the start and end are within the same block.
967
+ if ( selectionAnchor.clientId === selectionFocus.clientId ) return false;
968
+
969
+ // It's not mergeable if there's no rich text selection.
970
+ if (
971
+ ! selectionAnchor.attributeKey ||
972
+ ! selectionFocus.attributeKey ||
973
+ typeof selectionAnchor.offset === 'undefined' ||
974
+ typeof selectionFocus.offset === 'undefined'
975
+ )
976
+ return false;
977
+
978
+ const anchorRootClientId = getBlockRootClientId(
979
+ state,
980
+ selectionAnchor.clientId
981
+ );
982
+ const focusRootClientId = getBlockRootClientId(
983
+ state,
984
+ selectionFocus.clientId
985
+ );
986
+
987
+ // It's not mergeable if the selection doesn't start and end in the same
988
+ // block list. Maybe in the future it should be allowed.
989
+ if ( anchorRootClientId !== focusRootClientId ) {
990
+ return false;
991
+ }
992
+
993
+ const blockOrder = getBlockOrder( state, anchorRootClientId );
994
+ const anchorIndex = blockOrder.indexOf( selectionAnchor.clientId );
995
+ const focusIndex = blockOrder.indexOf( selectionFocus.clientId );
996
+
997
+ // Reassign selection start and end based on order.
998
+ let selectionStart, selectionEnd;
999
+
1000
+ if ( anchorIndex > focusIndex ) {
1001
+ selectionStart = selectionFocus;
1002
+ selectionEnd = selectionAnchor;
1003
+ } else {
1004
+ selectionStart = selectionAnchor;
1005
+ selectionEnd = selectionFocus;
1006
+ }
1007
+
1008
+ const targetBlockClientId = isForward
1009
+ ? selectionEnd.clientId
1010
+ : selectionStart.clientId;
1011
+ const blockToMergeClientId = isForward
1012
+ ? selectionStart.clientId
1013
+ : selectionEnd.clientId;
1014
+
1015
+ const targetBlock = getBlock( state, targetBlockClientId );
1016
+ const targetBlockType = getBlockType( targetBlock.name );
1017
+
1018
+ if ( ! targetBlockType.merge ) return false;
1019
+
1020
+ const blockToMerge = getBlock( state, blockToMergeClientId );
1021
+
1022
+ // It's mergeable if the blocks are of the same type.
1023
+ if ( blockToMerge.name === targetBlock.name ) return true;
1024
+
1025
+ // If the blocks are of a different type, try to transform the block being
1026
+ // merged into the same type of block.
1027
+ const blocksToMerge = switchToBlockType( blockToMerge, targetBlock.name );
1028
+
1029
+ return blocksToMerge && blocksToMerge.length;
1030
+ }
1031
+
1032
+ /**
1033
+ * Get partial selected blocks with their content updated
1034
+ * based on the selection.
1035
+ *
1036
+ * @param {Object} state Editor state.
1037
+ *
1038
+ * @return {Object[]} Updated partial selected blocks.
1039
+ */
1040
+ export const __unstableGetSelectedBlocksWithPartialSelection = ( state ) => {
1041
+ const selectionAnchor = getSelectionStart( state );
1042
+ const selectionFocus = getSelectionEnd( state );
1043
+
1044
+ if ( selectionAnchor.clientId === selectionFocus.clientId ) {
1045
+ return EMPTY_ARRAY;
1046
+ }
1047
+
1048
+ // Can't split if the selection is not set.
1049
+ if (
1050
+ ! selectionAnchor.attributeKey ||
1051
+ ! selectionFocus.attributeKey ||
1052
+ typeof selectionAnchor.offset === 'undefined' ||
1053
+ typeof selectionFocus.offset === 'undefined'
1054
+ ) {
1055
+ return EMPTY_ARRAY;
1056
+ }
1057
+
1058
+ const anchorRootClientId = getBlockRootClientId(
1059
+ state,
1060
+ selectionAnchor.clientId
1061
+ );
1062
+ const focusRootClientId = getBlockRootClientId(
1063
+ state,
1064
+ selectionFocus.clientId
1065
+ );
1066
+
1067
+ // It's not splittable if the selection doesn't start and end in the same
1068
+ // block list. Maybe in the future it should be allowed.
1069
+ if ( anchorRootClientId !== focusRootClientId ) {
1070
+ return EMPTY_ARRAY;
1071
+ }
1072
+
1073
+ const blockOrder = getBlockOrder( state, anchorRootClientId );
1074
+ const anchorIndex = blockOrder.indexOf( selectionAnchor.clientId );
1075
+ const focusIndex = blockOrder.indexOf( selectionFocus.clientId );
1076
+
1077
+ // Reassign selection start and end based on order.
1078
+ const [ selectionStart, selectionEnd ] =
1079
+ anchorIndex > focusIndex
1080
+ ? [ selectionFocus, selectionAnchor ]
1081
+ : [ selectionAnchor, selectionFocus ];
1082
+
1083
+ const blockA = getBlock( state, selectionStart.clientId );
1084
+ const blockAType = getBlockType( blockA.name );
1085
+
1086
+ const blockB = getBlock( state, selectionEnd.clientId );
1087
+ const blockBType = getBlockType( blockB.name );
1088
+
1089
+ const htmlA = blockA.attributes[ selectionStart.attributeKey ];
1090
+ const htmlB = blockB.attributes[ selectionEnd.attributeKey ];
1091
+
1092
+ const attributeDefinitionA =
1093
+ blockAType.attributes[ selectionStart.attributeKey ];
1094
+ const attributeDefinitionB =
1095
+ blockBType.attributes[ selectionEnd.attributeKey ];
1096
+
1097
+ let valueA = create( {
1098
+ html: htmlA,
1099
+ ...mapRichTextSettings( attributeDefinitionA ),
1100
+ } );
1101
+ let valueB = create( {
1102
+ html: htmlB,
1103
+ ...mapRichTextSettings( attributeDefinitionB ),
1104
+ } );
1105
+
1106
+ valueA = remove( valueA, 0, selectionStart.offset );
1107
+ valueB = remove( valueB, selectionEnd.offset, valueB.text.length );
1108
+
1109
+ return [
1110
+ {
1111
+ ...blockA,
1112
+ attributes: {
1113
+ ...blockA.attributes,
1114
+ [ selectionStart.attributeKey ]: toHTMLString( {
1115
+ value: valueA,
1116
+ ...mapRichTextSettings( attributeDefinitionA ),
1117
+ } ),
1118
+ },
1119
+ },
1120
+ {
1121
+ ...blockB,
1122
+ attributes: {
1123
+ ...blockB.attributes,
1124
+ [ selectionEnd.attributeKey ]: toHTMLString( {
1125
+ value: valueB,
1126
+ ...mapRichTextSettings( attributeDefinitionB ),
1127
+ } ),
1128
+ },
1129
+ },
1130
+ ];
1131
+ };
1132
+
898
1133
  /**
899
1134
  * Returns an array containing all block client IDs in the editor in the order
900
1135
  * they appear. Optionally accepts a root client ID of the block list for which
@@ -1284,10 +1519,28 @@ const canInsertBlockTypeUnmemoized = (
1284
1519
  parentName
1285
1520
  );
1286
1521
 
1522
+ let hasBlockAllowedAncestor = true;
1523
+ const blockAllowedAncestorBlocks = blockType.ancestor;
1524
+ if ( blockAllowedAncestorBlocks ) {
1525
+ const ancestors = [
1526
+ rootClientId,
1527
+ ...getBlockParents( state, rootClientId ),
1528
+ ];
1529
+
1530
+ hasBlockAllowedAncestor = some( ancestors, ( ancestorClientId ) =>
1531
+ checkAllowList(
1532
+ blockAllowedAncestorBlocks,
1533
+ getBlockName( state, ancestorClientId )
1534
+ )
1535
+ );
1536
+ }
1537
+
1287
1538
  const canInsert =
1288
- ( hasParentAllowedBlock === null && hasBlockAllowedParent === null ) ||
1289
- hasParentAllowedBlock === true ||
1290
- hasBlockAllowedParent === true;
1539
+ hasBlockAllowedAncestor &&
1540
+ ( ( hasParentAllowedBlock === null &&
1541
+ hasBlockAllowedParent === null ) ||
1542
+ hasParentAllowedBlock === true ||
1543
+ hasBlockAllowedParent === true );
1291
1544
 
1292
1545
  if ( ! canInsert ) {
1293
1546
  return canInsert;
@@ -1377,7 +1630,7 @@ export function canRemoveBlock( state, clientId, rootClientId = null ) {
1377
1630
 
1378
1631
  const { lock } = attributes;
1379
1632
  const parentIsLocked = !! getTemplateLock( state, rootClientId );
1380
- // If we don't have a lock on the blockType level, we differ to the parent templateLock.
1633
+ // If we don't have a lock on the blockType level, we defer to the parent templateLock.
1381
1634
  if ( lock === undefined || lock?.remove === undefined ) {
1382
1635
  return ! parentIsLocked;
1383
1636
  }
@@ -1418,7 +1671,7 @@ export function canMoveBlock( state, clientId, rootClientId = null ) {
1418
1671
 
1419
1672
  const { lock } = attributes;
1420
1673
  const parentIsLocked = getTemplateLock( state, rootClientId ) === 'all';
1421
- // If we don't have a lock on the blockType level, we differ to the parent templateLock.
1674
+ // If we don't have a lock on the blockType level, we defer to the parent templateLock.
1422
1675
  if ( lock === undefined || lock?.move === undefined ) {
1423
1676
  return ! parentIsLocked;
1424
1677
  }
@@ -1442,6 +1695,43 @@ export function canMoveBlocks( state, clientIds, rootClientId = null ) {
1442
1695
  );
1443
1696
  }
1444
1697
 
1698
+ /**
1699
+ * Determines if the given block is allowed to be edited.
1700
+ *
1701
+ * @param {Object} state Editor state.
1702
+ * @param {string} clientId The block client Id.
1703
+ *
1704
+ * @return {boolean} Whether the given block is allowed to be edited.
1705
+ */
1706
+ export function canEditBlock( state, clientId ) {
1707
+ const attributes = getBlockAttributes( state, clientId );
1708
+ if ( attributes === null ) {
1709
+ return true;
1710
+ }
1711
+
1712
+ const { lock } = attributes;
1713
+
1714
+ // When the edit is true, we cannot edit the block.
1715
+ return ! lock?.edit;
1716
+ }
1717
+
1718
+ /**
1719
+ * Determines if the given block type can be locked/unlocked by a user.
1720
+ *
1721
+ * @param {Object} state Editor state.
1722
+ * @param {(string|Object)} nameOrType Block name or type object.
1723
+ *
1724
+ * @return {boolean} Whether a given block type can be locked/unlocked.
1725
+ */
1726
+ export function canLockBlockType( state, nameOrType ) {
1727
+ if ( ! hasBlockSupport( nameOrType, 'lock', true ) ) {
1728
+ return false;
1729
+ }
1730
+
1731
+ // Use block editor settings as the default value.
1732
+ return !! state.settings?.canLockBlocks;
1733
+ }
1734
+
1445
1735
  /**
1446
1736
  * Returns information about how recently and frequently a block has been inserted.
1447
1737
  *
@@ -1767,6 +2057,7 @@ export const getInserterItems = createSelector(
1767
2057
  */
1768
2058
  export const getBlockTransformItems = createSelector(
1769
2059
  ( state, blocks, rootClientId = null ) => {
2060
+ const [ sourceBlock ] = blocks;
1770
2061
  const buildBlockTypeTransformItem = buildBlockTypeItem( state, {
1771
2062
  buildScope: 'transform',
1772
2063
  } );
@@ -1780,20 +2071,32 @@ export const getBlockTransformItems = createSelector(
1780
2071
  blockTypeTransformItems,
1781
2072
  ( { name } ) => name
1782
2073
  );
2074
+
2075
+ // Consider unwraping the highest priority.
2076
+ itemsByName[ '*' ] = {
2077
+ frecency: +Infinity,
2078
+ id: '*',
2079
+ isDisabled: false,
2080
+ name: '*',
2081
+ title: __( 'Unwrap' ),
2082
+ icon: itemsByName[ sourceBlock.name ]?.icon,
2083
+ };
2084
+
1783
2085
  const possibleTransforms = getPossibleBlockTransformations(
1784
2086
  blocks
1785
2087
  ).reduce( ( accumulator, block ) => {
1786
- if ( itemsByName[ block?.name ] ) {
2088
+ if ( block === '*' ) {
2089
+ accumulator.push( itemsByName[ '*' ] );
2090
+ } else if ( itemsByName[ block?.name ] ) {
1787
2091
  accumulator.push( itemsByName[ block.name ] );
1788
2092
  }
1789
2093
  return accumulator;
1790
2094
  }, [] );
1791
- const possibleBlockTransformations = orderBy(
2095
+ return orderBy(
1792
2096
  possibleTransforms,
1793
2097
  ( block ) => itemsByName[ block.name ].frecency,
1794
2098
  'desc'
1795
2099
  );
1796
- return possibleBlockTransformations;
1797
2100
  },
1798
2101
  ( state, rootClientId ) => [
1799
2102
  state.blockListSettings[ rootClientId ],