@wordpress/block-editor 12.24.0 → 12.25.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 (510) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +1 -1
  3. package/build/components/alignment-control/ui.js +3 -1
  4. package/build/components/alignment-control/ui.js.map +1 -1
  5. package/build/components/block-inspector/index.js +1 -1
  6. package/build/components/block-inspector/index.js.map +1 -1
  7. package/build/components/block-list/block.js +0 -9
  8. package/build/components/block-list/block.js.map +1 -1
  9. package/build/components/block-list/index.js +4 -3
  10. package/build/components/block-list/index.js.map +1 -1
  11. package/build/components/block-list/index.native.js +1 -9
  12. package/build/components/block-list/index.native.js.map +1 -1
  13. package/build/components/block-list/use-block-props/index.js +6 -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-block-refs.js +17 -46
  16. package/build/components/block-list/use-block-props/use-block-refs.js.map +1 -1
  17. package/build/components/block-list/use-block-props/use-is-hovered.js +10 -14
  18. package/build/components/block-list/use-block-props/use-is-hovered.js.map +1 -1
  19. package/build/components/block-mover/index.native.js +3 -1
  20. package/build/components/block-mover/index.native.js.map +1 -1
  21. package/build/components/block-settings-menu/block-settings-dropdown.js +0 -25
  22. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  23. package/build/components/block-switcher/pattern-transformations-menu.js +3 -1
  24. package/build/components/block-switcher/pattern-transformations-menu.js.map +1 -1
  25. package/build/components/block-switcher/use-transformed-patterns.js +6 -2
  26. package/build/components/block-switcher/use-transformed-patterns.js.map +1 -1
  27. package/build/components/block-switcher/utils.js +15 -5
  28. package/build/components/block-switcher/utils.js.map +1 -1
  29. package/build/components/block-toolbar/use-has-block-toolbar.js +14 -9
  30. package/build/components/block-toolbar/use-has-block-toolbar.js.map +1 -1
  31. package/build/components/block-tools/index.js +3 -1
  32. package/build/components/block-tools/index.js.map +1 -1
  33. package/build/components/block-tools/use-show-block-tools.js +2 -5
  34. package/build/components/block-tools/use-show-block-tools.js.map +1 -1
  35. package/build/components/block-tools/zoom-out-mode-inserters.js +5 -1
  36. package/build/components/block-tools/zoom-out-mode-inserters.js.map +1 -1
  37. package/build/components/block-variation-picker/index.js +3 -2
  38. package/build/components/block-variation-picker/index.js.map +1 -1
  39. package/build/components/block-variation-transforms/index.js +3 -1
  40. package/build/components/block-variation-transforms/index.js.map +1 -1
  41. package/build/components/floating-toolbar/index.native.js +9 -5
  42. package/build/components/floating-toolbar/index.native.js.map +1 -1
  43. package/build/components/global-styles/background-panel.js +1 -1
  44. package/build/components/global-styles/background-panel.js.map +1 -1
  45. package/build/components/global-styles/color-panel.js +3 -1
  46. package/build/components/global-styles/color-panel.js.map +1 -1
  47. package/build/components/global-styles/dimensions-panel.js +16 -0
  48. package/build/components/global-styles/dimensions-panel.js.map +1 -1
  49. package/build/components/global-styles/hooks.js +3 -2
  50. package/build/components/global-styles/hooks.js.map +1 -1
  51. package/build/components/global-styles/typography-panel.js +23 -23
  52. package/build/components/global-styles/typography-panel.js.map +1 -1
  53. package/build/components/global-styles/use-global-styles-output.js +149 -132
  54. package/build/components/global-styles/use-global-styles-output.js.map +1 -1
  55. package/build/components/global-styles/utils.js +45 -0
  56. package/build/components/global-styles/utils.js.map +1 -1
  57. package/build/components/inner-blocks/index.js +16 -2
  58. package/build/components/inner-blocks/index.js.map +1 -1
  59. package/build/components/inserter/block-patterns-tab/index.js +12 -31
  60. package/build/components/inserter/block-patterns-tab/index.js.map +1 -1
  61. package/build/components/inserter/block-types-tab.js +4 -0
  62. package/build/components/inserter/block-types-tab.js.map +1 -1
  63. package/build/components/inserter/category-tabs/index.js +56 -0
  64. package/build/components/inserter/category-tabs/index.js.map +1 -0
  65. package/build/components/inserter/media-tab/index.js +2 -2
  66. package/build/components/inserter/media-tab/index.js.map +1 -1
  67. package/build/components/inserter/media-tab/media-panel.js +0 -25
  68. package/build/components/inserter/media-tab/media-panel.js.map +1 -1
  69. package/build/components/inserter/media-tab/media-preview.js +13 -3
  70. package/build/components/inserter/media-tab/media-preview.js.map +1 -1
  71. package/build/components/inserter/media-tab/media-tab.js +15 -29
  72. package/build/components/inserter/media-tab/media-tab.js.map +1 -1
  73. package/build/components/inserter/menu.js +59 -69
  74. package/build/components/inserter/menu.js.map +1 -1
  75. package/build/components/inserter/tabs.js +6 -6
  76. package/build/components/inserter/tabs.js.map +1 -1
  77. package/build/components/line-height-control/index.js +6 -2
  78. package/build/components/line-height-control/index.js.map +1 -1
  79. package/build/components/link-control/search-item.js +9 -3
  80. package/build/components/link-control/search-item.js.map +1 -1
  81. package/build/components/list-view/block-select-button.js +5 -170
  82. package/build/components/list-view/block-select-button.js.map +1 -1
  83. package/build/components/list-view/block.js +166 -14
  84. package/build/components/list-view/block.js.map +1 -1
  85. package/build/components/list-view/index.js +1 -1
  86. package/build/components/list-view/index.js.map +1 -1
  87. package/build/components/list-view/use-list-view-drop-zone.js +1 -1
  88. package/build/components/list-view/use-list-view-drop-zone.js.map +1 -1
  89. package/build/components/list-view/utils.js +3 -1
  90. package/build/components/list-view/utils.js.map +1 -1
  91. package/build/components/media-placeholder/index.js +3 -3
  92. package/build/components/media-placeholder/index.js.map +1 -1
  93. package/build/components/navigable-toolbar/index.js +3 -1
  94. package/build/components/navigable-toolbar/index.js.map +1 -1
  95. package/build/components/provider/block-refs-provider.js +3 -4
  96. package/build/components/provider/block-refs-provider.js.map +1 -1
  97. package/build/components/provider/use-block-sync.js +3 -12
  98. package/build/components/provider/use-block-sync.js.map +1 -1
  99. package/build/components/rich-text/event-listeners/before-input-rules.js +93 -0
  100. package/build/components/rich-text/event-listeners/before-input-rules.js.map +1 -0
  101. package/build/components/rich-text/event-listeners/delete.js +58 -0
  102. package/build/components/rich-text/event-listeners/delete.js.map +1 -0
  103. package/build/components/rich-text/event-listeners/enter.js +98 -0
  104. package/build/components/rich-text/event-listeners/enter.js.map +1 -0
  105. package/build/components/rich-text/event-listeners/firefox-compat.js +36 -0
  106. package/build/components/rich-text/event-listeners/firefox-compat.js.map +1 -0
  107. package/build/components/rich-text/event-listeners/index.js +44 -0
  108. package/build/components/rich-text/event-listeners/index.js.map +1 -0
  109. package/build/components/rich-text/event-listeners/input-events.js +22 -0
  110. package/build/components/rich-text/event-listeners/input-events.js.map +1 -0
  111. package/build/components/rich-text/event-listeners/input-rules.js +135 -0
  112. package/build/components/rich-text/event-listeners/input-rules.js.map +1 -0
  113. package/build/components/rich-text/event-listeners/insert-replacement-text.js +33 -0
  114. package/build/components/rich-text/event-listeners/insert-replacement-text.js.map +1 -0
  115. package/build/components/rich-text/event-listeners/paste-handler.js +146 -0
  116. package/build/components/rich-text/event-listeners/paste-handler.js.map +1 -0
  117. package/build/components/rich-text/event-listeners/remove-browser-shortcuts.js +27 -0
  118. package/build/components/rich-text/event-listeners/remove-browser-shortcuts.js.map +1 -0
  119. package/build/components/rich-text/event-listeners/shortcuts.js +22 -0
  120. package/build/components/rich-text/event-listeners/shortcuts.js.map +1 -0
  121. package/build/components/rich-text/event-listeners/undo-automatic-change.js +51 -0
  122. package/build/components/rich-text/event-listeners/undo-automatic-change.js.map +1 -0
  123. package/build/components/rich-text/index.js +11 -31
  124. package/build/components/rich-text/index.js.map +1 -1
  125. package/build/components/rich-text/index.native.js +13 -3
  126. package/build/components/rich-text/index.native.js.map +1 -1
  127. package/build/components/rich-text/multiline.js +6 -2
  128. package/build/components/rich-text/multiline.js.map +1 -1
  129. package/build/components/rich-text/native/index.native.js +12 -0
  130. package/build/components/rich-text/native/index.native.js.map +1 -1
  131. package/build/components/rich-text/use-format-types.js +8 -4
  132. package/build/components/rich-text/use-format-types.js.map +1 -1
  133. package/build/components/segmented-text-control/index.js +62 -0
  134. package/build/components/segmented-text-control/index.js.map +1 -0
  135. package/build/components/spacing-sizes-control/input-controls/spacing-input-control.js +16 -2
  136. package/build/components/spacing-sizes-control/input-controls/spacing-input-control.js.map +1 -1
  137. package/build/components/text-alignment-control/index.js +76 -0
  138. package/build/components/text-alignment-control/index.js.map +1 -0
  139. package/build/components/text-decoration-control/index.js +21 -25
  140. package/build/components/text-decoration-control/index.js.map +1 -1
  141. package/build/components/text-transform-control/index.js +18 -22
  142. package/build/components/text-transform-control/index.js.map +1 -1
  143. package/build/components/use-block-display-information/index.js +9 -3
  144. package/build/components/use-block-display-information/index.js.map +1 -1
  145. package/build/components/use-on-block-drop/index.js +3 -1
  146. package/build/components/use-on-block-drop/index.js.map +1 -1
  147. package/build/components/writing-flow/use-drag-selection.js +3 -1
  148. package/build/components/writing-flow/use-drag-selection.js.map +1 -1
  149. package/build/components/writing-flow/use-tab-nav.js +3 -1
  150. package/build/components/writing-flow/use-tab-nav.js.map +1 -1
  151. package/build/components/writing-mode-control/index.js +16 -20
  152. package/build/components/writing-mode-control/index.js.map +1 -1
  153. package/build/hooks/duotone.js +3 -1
  154. package/build/hooks/duotone.js.map +1 -1
  155. package/build/hooks/utils.js +11 -6
  156. package/build/hooks/utils.js.map +1 -1
  157. package/build/private-apis.js +4 -2
  158. package/build/private-apis.js.map +1 -1
  159. package/build/store/actions.js +32 -8
  160. package/build/store/actions.js.map +1 -1
  161. package/build/store/private-selectors.js +27 -6
  162. package/build/store/private-selectors.js.map +1 -1
  163. package/build/store/reducer.js +11 -8
  164. package/build/store/reducer.js.map +1 -1
  165. package/build/store/selectors.js +21 -7
  166. package/build/store/selectors.js.map +1 -1
  167. package/build/utils/object.js +17 -0
  168. package/build/utils/object.js.map +1 -1
  169. package/build/utils/order-inserter-block-items.js +6 -2
  170. package/build/utils/order-inserter-block-items.js.map +1 -1
  171. package/build/utils/pasting.js +6 -2
  172. package/build/utils/pasting.js.map +1 -1
  173. package/build-module/components/alignment-control/ui.js +3 -1
  174. package/build-module/components/alignment-control/ui.js.map +1 -1
  175. package/build-module/components/block-inspector/index.js +1 -1
  176. package/build-module/components/block-inspector/index.js.map +1 -1
  177. package/build-module/components/block-list/block.js +0 -9
  178. package/build-module/components/block-list/block.js.map +1 -1
  179. package/build-module/components/block-list/index.js +4 -3
  180. package/build-module/components/block-list/index.js.map +1 -1
  181. package/build-module/components/block-list/index.native.js +1 -9
  182. package/build-module/components/block-list/index.native.js.map +1 -1
  183. package/build-module/components/block-list/use-block-props/index.js +6 -6
  184. package/build-module/components/block-list/use-block-props/index.js.map +1 -1
  185. package/build-module/components/block-list/use-block-props/use-block-refs.js +19 -48
  186. package/build-module/components/block-list/use-block-props/use-block-refs.js.map +1 -1
  187. package/build-module/components/block-list/use-block-props/use-is-hovered.js +10 -14
  188. package/build-module/components/block-list/use-block-props/use-is-hovered.js.map +1 -1
  189. package/build-module/components/block-mover/index.native.js +3 -1
  190. package/build-module/components/block-mover/index.native.js.map +1 -1
  191. package/build-module/components/block-settings-menu/block-settings-dropdown.js +1 -26
  192. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  193. package/build-module/components/block-switcher/pattern-transformations-menu.js +3 -1
  194. package/build-module/components/block-switcher/pattern-transformations-menu.js.map +1 -1
  195. package/build-module/components/block-switcher/use-transformed-patterns.js +6 -2
  196. package/build-module/components/block-switcher/use-transformed-patterns.js.map +1 -1
  197. package/build-module/components/block-switcher/utils.js +15 -5
  198. package/build-module/components/block-switcher/utils.js.map +1 -1
  199. package/build-module/components/block-toolbar/use-has-block-toolbar.js +14 -9
  200. package/build-module/components/block-toolbar/use-has-block-toolbar.js.map +1 -1
  201. package/build-module/components/block-tools/index.js +3 -1
  202. package/build-module/components/block-tools/index.js.map +1 -1
  203. package/build-module/components/block-tools/use-show-block-tools.js +2 -5
  204. package/build-module/components/block-tools/use-show-block-tools.js.map +1 -1
  205. package/build-module/components/block-tools/zoom-out-mode-inserters.js +5 -1
  206. package/build-module/components/block-tools/zoom-out-mode-inserters.js.map +1 -1
  207. package/build-module/components/block-variation-picker/index.js +3 -2
  208. package/build-module/components/block-variation-picker/index.js.map +1 -1
  209. package/build-module/components/block-variation-transforms/index.js +3 -1
  210. package/build-module/components/block-variation-transforms/index.js.map +1 -1
  211. package/build-module/components/floating-toolbar/index.native.js +9 -5
  212. package/build-module/components/floating-toolbar/index.native.js.map +1 -1
  213. package/build-module/components/global-styles/background-panel.js +1 -1
  214. package/build-module/components/global-styles/background-panel.js.map +1 -1
  215. package/build-module/components/global-styles/color-panel.js +3 -1
  216. package/build-module/components/global-styles/color-panel.js.map +1 -1
  217. package/build-module/components/global-styles/dimensions-panel.js +17 -1
  218. package/build-module/components/global-styles/dimensions-panel.js.map +1 -1
  219. package/build-module/components/global-styles/hooks.js +3 -2
  220. package/build-module/components/global-styles/hooks.js.map +1 -1
  221. package/build-module/components/global-styles/typography-panel.js +24 -24
  222. package/build-module/components/global-styles/typography-panel.js.map +1 -1
  223. package/build-module/components/global-styles/use-global-styles-output.js +149 -132
  224. package/build-module/components/global-styles/use-global-styles-output.js.map +1 -1
  225. package/build-module/components/global-styles/utils.js +44 -0
  226. package/build-module/components/global-styles/utils.js.map +1 -1
  227. package/build-module/components/inner-blocks/index.js +16 -2
  228. package/build-module/components/inner-blocks/index.js.map +1 -1
  229. package/build-module/components/inserter/block-patterns-tab/index.js +13 -32
  230. package/build-module/components/inserter/block-patterns-tab/index.js.map +1 -1
  231. package/build-module/components/inserter/block-types-tab.js +4 -0
  232. package/build-module/components/inserter/block-types-tab.js.map +1 -1
  233. package/build-module/components/inserter/category-tabs/index.js +49 -0
  234. package/build-module/components/inserter/category-tabs/index.js.map +1 -0
  235. package/build-module/components/inserter/media-tab/index.js +1 -1
  236. package/build-module/components/inserter/media-tab/index.js.map +1 -1
  237. package/build-module/components/inserter/media-tab/media-panel.js +0 -24
  238. package/build-module/components/inserter/media-tab/media-panel.js.map +1 -1
  239. package/build-module/components/inserter/media-tab/media-preview.js +13 -3
  240. package/build-module/components/inserter/media-tab/media-preview.js.map +1 -1
  241. package/build-module/components/inserter/media-tab/media-tab.js +17 -31
  242. package/build-module/components/inserter/media-tab/media-tab.js.map +1 -1
  243. package/build-module/components/inserter/menu.js +61 -71
  244. package/build-module/components/inserter/menu.js.map +1 -1
  245. package/build-module/components/inserter/tabs.js +6 -6
  246. package/build-module/components/inserter/tabs.js.map +1 -1
  247. package/build-module/components/line-height-control/index.js +6 -2
  248. package/build-module/components/line-height-control/index.js.map +1 -1
  249. package/build-module/components/link-control/search-item.js +9 -3
  250. package/build-module/components/link-control/search-item.js.map +1 -1
  251. package/build-module/components/list-view/block-select-button.js +7 -172
  252. package/build-module/components/list-view/block-select-button.js.map +1 -1
  253. package/build-module/components/list-view/block.js +167 -15
  254. package/build-module/components/list-view/block.js.map +1 -1
  255. package/build-module/components/list-view/index.js +1 -1
  256. package/build-module/components/list-view/index.js.map +1 -1
  257. package/build-module/components/list-view/use-list-view-drop-zone.js +1 -1
  258. package/build-module/components/list-view/use-list-view-drop-zone.js.map +1 -1
  259. package/build-module/components/list-view/utils.js +3 -1
  260. package/build-module/components/list-view/utils.js.map +1 -1
  261. package/build-module/components/media-placeholder/index.js +3 -3
  262. package/build-module/components/media-placeholder/index.js.map +1 -1
  263. package/build-module/components/navigable-toolbar/index.js +3 -1
  264. package/build-module/components/navigable-toolbar/index.js.map +1 -1
  265. package/build-module/components/provider/block-refs-provider.js +3 -4
  266. package/build-module/components/provider/block-refs-provider.js.map +1 -1
  267. package/build-module/components/provider/use-block-sync.js +4 -13
  268. package/build-module/components/provider/use-block-sync.js.map +1 -1
  269. package/build-module/components/rich-text/event-listeners/before-input-rules.js +86 -0
  270. package/build-module/components/rich-text/event-listeners/before-input-rules.js.map +1 -0
  271. package/build-module/components/rich-text/event-listeners/delete.js +51 -0
  272. package/build-module/components/rich-text/event-listeners/delete.js.map +1 -0
  273. package/build-module/components/rich-text/event-listeners/enter.js +92 -0
  274. package/build-module/components/rich-text/event-listeners/enter.js.map +1 -0
  275. package/build-module/components/rich-text/event-listeners/firefox-compat.js +29 -0
  276. package/build-module/components/rich-text/event-listeners/firefox-compat.js.map +1 -0
  277. package/build-module/components/rich-text/event-listeners/index.js +36 -0
  278. package/build-module/components/rich-text/event-listeners/index.js.map +1 -0
  279. package/build-module/components/rich-text/event-listeners/input-events.js +15 -0
  280. package/build-module/components/rich-text/event-listeners/input-events.js.map +1 -0
  281. package/build-module/components/rich-text/event-listeners/input-rules.js +127 -0
  282. package/build-module/components/rich-text/event-listeners/input-rules.js.map +1 -0
  283. package/build-module/components/rich-text/event-listeners/insert-replacement-text.js +27 -0
  284. package/build-module/components/rich-text/event-listeners/insert-replacement-text.js.map +1 -0
  285. package/build-module/components/rich-text/event-listeners/paste-handler.js +142 -0
  286. package/build-module/components/rich-text/event-listeners/paste-handler.js.map +1 -0
  287. package/build-module/components/rich-text/event-listeners/remove-browser-shortcuts.js +21 -0
  288. package/build-module/components/rich-text/event-listeners/remove-browser-shortcuts.js.map +1 -0
  289. package/build-module/components/rich-text/event-listeners/shortcuts.js +15 -0
  290. package/build-module/components/rich-text/event-listeners/shortcuts.js.map +1 -0
  291. package/build-module/components/rich-text/event-listeners/undo-automatic-change.js +45 -0
  292. package/build-module/components/rich-text/event-listeners/undo-automatic-change.js.map +1 -0
  293. package/build-module/components/rich-text/index.js +12 -32
  294. package/build-module/components/rich-text/index.js.map +1 -1
  295. package/build-module/components/rich-text/index.native.js +13 -3
  296. package/build-module/components/rich-text/index.native.js.map +1 -1
  297. package/build-module/components/rich-text/multiline.js +6 -2
  298. package/build-module/components/rich-text/multiline.js.map +1 -1
  299. package/build-module/components/rich-text/native/index.native.js +12 -0
  300. package/build-module/components/rich-text/native/index.native.js.map +1 -1
  301. package/build-module/components/rich-text/use-format-types.js +8 -4
  302. package/build-module/components/rich-text/use-format-types.js.map +1 -1
  303. package/build-module/components/segmented-text-control/index.js +55 -0
  304. package/build-module/components/segmented-text-control/index.js.map +1 -0
  305. package/build-module/components/spacing-sizes-control/input-controls/spacing-input-control.js +16 -2
  306. package/build-module/components/spacing-sizes-control/input-controls/spacing-input-control.js.map +1 -1
  307. package/build-module/components/text-alignment-control/index.js +68 -0
  308. package/build-module/components/text-alignment-control/index.js.map +1 -0
  309. package/build-module/components/text-decoration-control/index.js +21 -25
  310. package/build-module/components/text-decoration-control/index.js.map +1 -1
  311. package/build-module/components/text-transform-control/index.js +18 -22
  312. package/build-module/components/text-transform-control/index.js.map +1 -1
  313. package/build-module/components/use-block-display-information/index.js +9 -3
  314. package/build-module/components/use-block-display-information/index.js.map +1 -1
  315. package/build-module/components/use-on-block-drop/index.js +3 -1
  316. package/build-module/components/use-on-block-drop/index.js.map +1 -1
  317. package/build-module/components/writing-flow/use-drag-selection.js +3 -1
  318. package/build-module/components/writing-flow/use-drag-selection.js.map +1 -1
  319. package/build-module/components/writing-flow/use-tab-nav.js +3 -1
  320. package/build-module/components/writing-flow/use-tab-nav.js.map +1 -1
  321. package/build-module/components/writing-mode-control/index.js +16 -20
  322. package/build-module/components/writing-mode-control/index.js.map +1 -1
  323. package/build-module/hooks/duotone.js +3 -1
  324. package/build-module/hooks/duotone.js.map +1 -1
  325. package/build-module/hooks/utils.js +11 -6
  326. package/build-module/hooks/utils.js.map +1 -1
  327. package/build-module/private-apis.js +4 -2
  328. package/build-module/private-apis.js.map +1 -1
  329. package/build-module/store/actions.js +32 -8
  330. package/build-module/store/actions.js.map +1 -1
  331. package/build-module/store/private-selectors.js +27 -5
  332. package/build-module/store/private-selectors.js.map +1 -1
  333. package/build-module/store/reducer.js +11 -8
  334. package/build-module/store/reducer.js.map +1 -1
  335. package/build-module/store/selectors.js +21 -7
  336. package/build-module/store/selectors.js.map +1 -1
  337. package/build-module/utils/object.js +16 -0
  338. package/build-module/utils/object.js.map +1 -1
  339. package/build-module/utils/order-inserter-block-items.js +6 -2
  340. package/build-module/utils/order-inserter-block-items.js.map +1 -1
  341. package/build-module/utils/pasting.js +6 -2
  342. package/build-module/utils/pasting.js.map +1 -1
  343. package/build-style/content-rtl.css +41 -68
  344. package/build-style/content.css +41 -68
  345. package/build-style/style-rtl.css +100 -199
  346. package/build-style/style.css +100 -199
  347. package/package.json +31 -31
  348. package/src/components/alignment-control/ui.js +3 -1
  349. package/src/components/block-bindings-toolbar-indicator/style.scss +1 -4
  350. package/src/components/block-canvas/style.scss +1 -3
  351. package/src/components/block-draggable/test/helpers.native.js +8 -8
  352. package/src/components/block-inspector/index.js +1 -2
  353. package/src/components/block-list/block.js +2 -13
  354. package/src/components/block-list/content.scss +9 -1
  355. package/src/components/block-list/index.js +4 -4
  356. package/src/components/block-list/index.native.js +1 -6
  357. package/src/components/block-list/use-block-props/index.js +12 -4
  358. package/src/components/block-list/use-block-props/use-block-refs.js +17 -57
  359. package/src/components/block-list/use-block-props/use-is-hovered.js +11 -16
  360. package/src/components/block-mover/index.native.js +3 -1
  361. package/src/components/block-patterns-list/style.scss +1 -3
  362. package/src/components/block-preview/style.scss +13 -15
  363. package/src/components/block-settings-menu/block-settings-dropdown.js +1 -51
  364. package/src/components/block-switcher/pattern-transformations-menu.js +3 -1
  365. package/src/components/block-switcher/use-transformed-patterns.js +6 -2
  366. package/src/components/block-switcher/utils.js +14 -5
  367. package/src/components/block-toolbar/style.scss +8 -11
  368. package/src/components/block-toolbar/use-has-block-toolbar.js +21 -16
  369. package/src/components/block-tools/index.js +3 -1
  370. package/src/components/block-tools/use-show-block-tools.js +36 -48
  371. package/src/components/block-tools/zoom-out-mode-inserters.js +5 -1
  372. package/src/components/block-variation-picker/content.scss +22 -72
  373. package/src/components/block-variation-picker/index.js +3 -2
  374. package/src/components/block-variation-transforms/index.js +3 -1
  375. package/src/components/floating-toolbar/index.native.js +5 -2
  376. package/src/components/global-styles/background-panel.js +1 -3
  377. package/src/components/global-styles/color-panel.js +3 -1
  378. package/src/components/global-styles/dimensions-panel.js +18 -1
  379. package/src/components/global-styles/hooks.js +2 -0
  380. package/src/components/global-styles/test/utils.js +21 -0
  381. package/src/components/global-styles/typography-panel.js +27 -23
  382. package/src/components/global-styles/use-global-styles-output.js +211 -187
  383. package/src/components/global-styles/utils.js +55 -0
  384. package/src/components/inner-blocks/index.js +14 -1
  385. package/src/components/inserter/block-patterns-tab/index.js +15 -65
  386. package/src/components/inserter/block-types-tab.js +5 -0
  387. package/src/components/inserter/category-tabs/index.js +74 -0
  388. package/src/components/inserter/media-tab/index.js +1 -1
  389. package/src/components/inserter/media-tab/media-panel.js +0 -22
  390. package/src/components/inserter/media-tab/media-preview.js +15 -7
  391. package/src/components/inserter/media-tab/media-tab.js +44 -83
  392. package/src/components/inserter/menu.js +139 -117
  393. package/src/components/inserter/style.scss +90 -170
  394. package/src/components/inserter/tabs.js +5 -13
  395. package/src/components/line-height-control/index.js +6 -2
  396. package/src/components/link-control/search-item.js +9 -3
  397. package/src/components/list-view/block-select-button.js +73 -266
  398. package/src/components/list-view/block.js +218 -28
  399. package/src/components/list-view/index.js +1 -1
  400. package/src/components/list-view/style.scss +20 -28
  401. package/src/components/list-view/use-list-view-drop-zone.js +1 -1
  402. package/src/components/list-view/utils.js +3 -1
  403. package/src/components/media-placeholder/content.scss +0 -11
  404. package/src/components/media-placeholder/index.js +3 -3
  405. package/src/components/navigable-toolbar/index.js +3 -1
  406. package/src/components/provider/block-refs-provider.js +3 -8
  407. package/src/components/provider/test/use-block-sync.js +7 -0
  408. package/src/components/provider/use-block-sync.js +3 -20
  409. package/src/components/rich-text/event-listeners/before-input-rules.js +92 -0
  410. package/src/components/rich-text/event-listeners/delete.js +53 -0
  411. package/src/components/rich-text/event-listeners/enter.js +104 -0
  412. package/src/components/rich-text/event-listeners/firefox-compat.js +31 -0
  413. package/src/components/rich-text/event-listeners/index.js +56 -0
  414. package/src/components/rich-text/event-listeners/input-events.js +13 -0
  415. package/src/components/rich-text/event-listeners/input-rules.js +146 -0
  416. package/src/components/rich-text/event-listeners/insert-replacement-text.js +28 -0
  417. package/src/components/rich-text/event-listeners/paste-handler.js +169 -0
  418. package/src/components/rich-text/event-listeners/remove-browser-shortcuts.js +24 -0
  419. package/src/components/rich-text/event-listeners/shortcuts.js +13 -0
  420. package/src/components/rich-text/event-listeners/undo-automatic-change.js +45 -0
  421. package/src/components/rich-text/index.js +7 -34
  422. package/src/components/rich-text/index.native.js +11 -0
  423. package/src/components/rich-text/multiline.js +6 -2
  424. package/src/components/rich-text/native/index.native.js +11 -0
  425. package/src/components/rich-text/use-format-types.js +6 -2
  426. package/src/components/segmented-text-control/index.js +63 -0
  427. package/src/components/{writing-mode-control → segmented-text-control}/style.scss +2 -5
  428. package/src/components/spacing-sizes-control/input-controls/spacing-input-control.js +16 -1
  429. package/src/components/text-alignment-control/index.js +91 -0
  430. package/src/components/text-alignment-control/stories/index.story.js +39 -0
  431. package/src/components/text-decoration-control/index.js +20 -33
  432. package/src/components/text-transform-control/index.js +17 -30
  433. package/src/components/use-block-display-information/index.js +9 -3
  434. package/src/components/use-on-block-drop/index.js +3 -1
  435. package/src/components/writing-flow/use-drag-selection.js +3 -1
  436. package/src/components/writing-flow/use-tab-nav.js +3 -1
  437. package/src/components/writing-mode-control/index.js +15 -28
  438. package/src/hooks/duotone.js +3 -1
  439. package/src/hooks/utils.js +16 -2
  440. package/src/private-apis.js +4 -2
  441. package/src/store/actions.js +36 -12
  442. package/src/store/private-selectors.js +28 -4
  443. package/src/store/reducer.js +13 -23
  444. package/src/store/selectors.js +20 -7
  445. package/src/style.scss +1 -2
  446. package/src/utils/object.js +16 -0
  447. package/src/utils/order-inserter-block-items.js +6 -2
  448. package/src/utils/pasting.js +6 -2
  449. package/build/components/block-list/use-block-props/use-block-moving-mode-class-names.js +0 -54
  450. package/build/components/block-list/use-block-props/use-block-moving-mode-class-names.js.map +0 -1
  451. package/build/components/rich-text/use-before-input-rules.js +0 -98
  452. package/build/components/rich-text/use-before-input-rules.js.map +0 -1
  453. package/build/components/rich-text/use-delete.js +0 -64
  454. package/build/components/rich-text/use-delete.js.map +0 -1
  455. package/build/components/rich-text/use-enter.js +0 -109
  456. package/build/components/rich-text/use-enter.js.map +0 -1
  457. package/build/components/rich-text/use-firefox-compat.js +0 -44
  458. package/build/components/rich-text/use-firefox-compat.js.map +0 -1
  459. package/build/components/rich-text/use-input-events.js +0 -25
  460. package/build/components/rich-text/use-input-events.js.map +0 -1
  461. package/build/components/rich-text/use-input-rules.js +0 -139
  462. package/build/components/rich-text/use-input-rules.js.map +0 -1
  463. package/build/components/rich-text/use-insert-replacement-text.js +0 -38
  464. package/build/components/rich-text/use-insert-replacement-text.js.map +0 -1
  465. package/build/components/rich-text/use-paste-handler.js +0 -158
  466. package/build/components/rich-text/use-paste-handler.js.map +0 -1
  467. package/build/components/rich-text/use-remove-browser-shortcuts.js +0 -32
  468. package/build/components/rich-text/use-remove-browser-shortcuts.js.map +0 -1
  469. package/build/components/rich-text/use-shortcuts.js +0 -25
  470. package/build/components/rich-text/use-shortcuts.js.map +0 -1
  471. package/build/components/rich-text/use-undo-automatic-change.js +0 -53
  472. package/build/components/rich-text/use-undo-automatic-change.js.map +0 -1
  473. package/build-module/components/block-list/use-block-props/use-block-moving-mode-class-names.js +0 -47
  474. package/build-module/components/block-list/use-block-props/use-block-moving-mode-class-names.js.map +0 -1
  475. package/build-module/components/rich-text/use-before-input-rules.js +0 -92
  476. package/build-module/components/rich-text/use-before-input-rules.js.map +0 -1
  477. package/build-module/components/rich-text/use-delete.js +0 -57
  478. package/build-module/components/rich-text/use-delete.js.map +0 -1
  479. package/build-module/components/rich-text/use-enter.js +0 -102
  480. package/build-module/components/rich-text/use-enter.js.map +0 -1
  481. package/build-module/components/rich-text/use-firefox-compat.js +0 -37
  482. package/build-module/components/rich-text/use-firefox-compat.js.map +0 -1
  483. package/build-module/components/rich-text/use-input-events.js +0 -18
  484. package/build-module/components/rich-text/use-input-events.js.map +0 -1
  485. package/build-module/components/rich-text/use-input-rules.js +0 -132
  486. package/build-module/components/rich-text/use-input-rules.js.map +0 -1
  487. package/build-module/components/rich-text/use-insert-replacement-text.js +0 -32
  488. package/build-module/components/rich-text/use-insert-replacement-text.js.map +0 -1
  489. package/build-module/components/rich-text/use-paste-handler.js +0 -152
  490. package/build-module/components/rich-text/use-paste-handler.js.map +0 -1
  491. package/build-module/components/rich-text/use-remove-browser-shortcuts.js +0 -26
  492. package/build-module/components/rich-text/use-remove-browser-shortcuts.js.map +0 -1
  493. package/build-module/components/rich-text/use-shortcuts.js +0 -18
  494. package/build-module/components/rich-text/use-shortcuts.js.map +0 -1
  495. package/build-module/components/rich-text/use-undo-automatic-change.js +0 -46
  496. package/build-module/components/rich-text/use-undo-automatic-change.js.map +0 -1
  497. package/src/components/block-list/use-block-props/use-block-moving-mode-class-names.js +0 -55
  498. package/src/components/rich-text/use-before-input-rules.js +0 -99
  499. package/src/components/rich-text/use-delete.js +0 -59
  500. package/src/components/rich-text/use-enter.js +0 -110
  501. package/src/components/rich-text/use-firefox-compat.js +0 -39
  502. package/src/components/rich-text/use-input-events.js +0 -19
  503. package/src/components/rich-text/use-input-rules.js +0 -150
  504. package/src/components/rich-text/use-insert-replacement-text.js +0 -31
  505. package/src/components/rich-text/use-paste-handler.js +0 -180
  506. package/src/components/rich-text/use-remove-browser-shortcuts.js +0 -29
  507. package/src/components/rich-text/use-shortcuts.js +0 -19
  508. package/src/components/rich-text/use-undo-automatic-change.js +0 -46
  509. package/src/components/text-decoration-control/style.scss +0 -18
  510. package/src/components/text-transform-control/style.scss +0 -18
@@ -0,0 +1,56 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useMemo, useRef } from '@wordpress/element';
5
+ import { useRefEffect } from '@wordpress/compose';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import beforeInputRules from './before-input-rules';
11
+ import inputRules from './input-rules';
12
+ import insertReplacementText from './insert-replacement-text';
13
+ import removeBrowserShortcuts from './remove-browser-shortcuts';
14
+ import shortcuts from './shortcuts';
15
+ import inputEvents from './input-events';
16
+ import undoAutomaticChange from './undo-automatic-change';
17
+ import pasteHandler from './paste-handler';
18
+ import _delete from './delete';
19
+ import enter from './enter';
20
+ import firefoxCompat from './firefox-compat';
21
+
22
+ const allEventListeners = [
23
+ beforeInputRules,
24
+ inputRules,
25
+ insertReplacementText,
26
+ removeBrowserShortcuts,
27
+ shortcuts,
28
+ inputEvents,
29
+ undoAutomaticChange,
30
+ pasteHandler,
31
+ _delete,
32
+ enter,
33
+ firefoxCompat,
34
+ ];
35
+
36
+ export function useEventListeners( props ) {
37
+ const propsRef = useRef( props );
38
+ propsRef.current = props;
39
+ const refEffects = useMemo(
40
+ () => allEventListeners.map( ( refEffect ) => refEffect( propsRef ) ),
41
+ [ propsRef ]
42
+ );
43
+
44
+ return useRefEffect(
45
+ ( element ) => {
46
+ if ( ! props.isSelected ) {
47
+ return;
48
+ }
49
+ const cleanups = refEffects.map( ( effect ) => effect( element ) );
50
+ return () => {
51
+ cleanups.forEach( ( cleanup ) => cleanup() );
52
+ };
53
+ },
54
+ [ refEffects, props.isSelected ]
55
+ );
56
+ }
@@ -0,0 +1,13 @@
1
+ export default ( props ) => ( element ) => {
2
+ const { inputEvents } = props.current;
3
+ function onInput( event ) {
4
+ for ( const keyboardShortcut of inputEvents.current ) {
5
+ keyboardShortcut( event );
6
+ }
7
+ }
8
+
9
+ element.addEventListener( 'input', onInput );
10
+ return () => {
11
+ element.removeEventListener( 'input', onInput );
12
+ };
13
+ };
@@ -0,0 +1,146 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { insert, toHTMLString } from '@wordpress/rich-text';
5
+ import { getBlockTransforms, findTransform } from '@wordpress/blocks';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import { store as blockEditorStore } from '../../../store';
11
+ import { preventEventDiscovery } from '../prevent-event-discovery';
12
+ import {
13
+ retrieveSelectedAttribute,
14
+ START_OF_SELECTED_AREA,
15
+ } from '../../../utils/selection';
16
+
17
+ function findSelection( blocks ) {
18
+ let i = blocks.length;
19
+
20
+ while ( i-- ) {
21
+ const attributeKey = retrieveSelectedAttribute(
22
+ blocks[ i ].attributes
23
+ );
24
+
25
+ if ( attributeKey ) {
26
+ blocks[ i ].attributes[ attributeKey ] = blocks[ i ].attributes[
27
+ attributeKey
28
+ ]
29
+ // To do: refactor this to use rich text's selection instead, so
30
+ // we no longer have to use on this hack inserting a special
31
+ // character.
32
+ .toString()
33
+ .replace( START_OF_SELECTED_AREA, '' );
34
+ return [ blocks[ i ].clientId, attributeKey, 0, 0 ];
35
+ }
36
+
37
+ const nestedSelection = findSelection( blocks[ i ].innerBlocks );
38
+
39
+ if ( nestedSelection ) {
40
+ return nestedSelection;
41
+ }
42
+ }
43
+
44
+ return [];
45
+ }
46
+
47
+ export default ( props ) => ( element ) => {
48
+ function inputRule() {
49
+ const { getValue, onReplace, selectionChange, registry } =
50
+ props.current;
51
+
52
+ if ( ! onReplace ) {
53
+ return;
54
+ }
55
+
56
+ // We must use getValue() here because value may be update
57
+ // asynchronously.
58
+ const value = getValue();
59
+ const { start, text } = value;
60
+ const characterBefore = text.slice( start - 1, start );
61
+
62
+ // The character right before the caret must be a plain space.
63
+ if ( characterBefore !== ' ' ) {
64
+ return;
65
+ }
66
+
67
+ const trimmedTextBefore = text.slice( 0, start ).trim();
68
+ const prefixTransforms = getBlockTransforms( 'from' ).filter(
69
+ ( { type } ) => type === 'prefix'
70
+ );
71
+ const transformation = findTransform(
72
+ prefixTransforms,
73
+ ( { prefix } ) => {
74
+ return trimmedTextBefore === prefix;
75
+ }
76
+ );
77
+
78
+ if ( ! transformation ) {
79
+ return;
80
+ }
81
+
82
+ const content = toHTMLString( {
83
+ value: insert( value, START_OF_SELECTED_AREA, 0, start ),
84
+ } );
85
+ const block = transformation.transform( content );
86
+
87
+ selectionChange( ...findSelection( [ block ] ) );
88
+ onReplace( [ block ] );
89
+ registry.dispatch( blockEditorStore ).__unstableMarkAutomaticChange();
90
+
91
+ return true;
92
+ }
93
+
94
+ function onInput( event ) {
95
+ const { inputType, type } = event;
96
+ const {
97
+ getValue,
98
+ onChange,
99
+ __unstableAllowPrefixTransformations,
100
+ formatTypes,
101
+ registry,
102
+ } = props.current;
103
+
104
+ // Only run input rules when inserting text.
105
+ if ( inputType !== 'insertText' && type !== 'compositionend' ) {
106
+ return;
107
+ }
108
+
109
+ if ( __unstableAllowPrefixTransformations && inputRule() ) {
110
+ return;
111
+ }
112
+
113
+ const value = getValue();
114
+ const transformed = formatTypes.reduce(
115
+ ( accumlator, { __unstableInputRule } ) => {
116
+ if ( __unstableInputRule ) {
117
+ accumlator = __unstableInputRule( accumlator );
118
+ }
119
+
120
+ return accumlator;
121
+ },
122
+ preventEventDiscovery( value )
123
+ );
124
+
125
+ const {
126
+ __unstableMarkLastChangeAsPersistent,
127
+ __unstableMarkAutomaticChange,
128
+ } = registry.dispatch( blockEditorStore );
129
+
130
+ if ( transformed !== value ) {
131
+ __unstableMarkLastChangeAsPersistent();
132
+ onChange( {
133
+ ...transformed,
134
+ activeFormats: value.activeFormats,
135
+ } );
136
+ __unstableMarkAutomaticChange();
137
+ }
138
+ }
139
+
140
+ element.addEventListener( 'input', onInput );
141
+ element.addEventListener( 'compositionend', onInput );
142
+ return () => {
143
+ element.removeEventListener( 'input', onInput );
144
+ element.removeEventListener( 'compositionend', onInput );
145
+ };
146
+ };
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { store as blockEditorStore } from '../../../store';
5
+
6
+ /**
7
+ * When the browser is about to auto correct, add an undo level so the user can
8
+ * revert the change.
9
+ *
10
+ * @param {Object} props
11
+ */
12
+ export default ( props ) => ( element ) => {
13
+ function onInput( event ) {
14
+ if ( event.inputType !== 'insertReplacementText' ) {
15
+ return;
16
+ }
17
+
18
+ const { registry } = props.current;
19
+ registry
20
+ .dispatch( blockEditorStore )
21
+ .__unstableMarkLastChangeAsPersistent();
22
+ }
23
+
24
+ element.addEventListener( 'beforeinput', onInput );
25
+ return () => {
26
+ element.removeEventListener( 'beforeinput', onInput );
27
+ };
28
+ };
@@ -0,0 +1,169 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import {
5
+ pasteHandler,
6
+ findTransform,
7
+ getBlockTransforms,
8
+ } from '@wordpress/blocks';
9
+ import { isEmpty, insert, create } from '@wordpress/rich-text';
10
+ import { isURL } from '@wordpress/url';
11
+
12
+ /**
13
+ * Internal dependencies
14
+ */
15
+ import { addActiveFormats } from '../utils';
16
+ import { splitValue } from '../split-value';
17
+ import { getPasteEventData } from '../../../utils/pasting';
18
+
19
+ /** @typedef {import('@wordpress/rich-text').RichTextValue} RichTextValue */
20
+
21
+ export default ( props ) => ( element ) => {
22
+ function _onPaste( event ) {
23
+ const {
24
+ disableFormats,
25
+ onChange,
26
+ value,
27
+ formatTypes,
28
+ tagName,
29
+ onReplace,
30
+ onSplit,
31
+ __unstableEmbedURLOnPaste,
32
+ pastePlainText,
33
+ } = props.current;
34
+
35
+ const { plainText, html, files } = getPasteEventData( event );
36
+
37
+ event.preventDefault();
38
+
39
+ // Allows us to ask for this information when we get a report.
40
+ window.console.log( 'Received HTML:\n\n', html );
41
+ window.console.log( 'Received plain text:\n\n', plainText );
42
+
43
+ if ( disableFormats ) {
44
+ onChange( insert( value, plainText ) );
45
+ return;
46
+ }
47
+
48
+ const isInternal =
49
+ event.clipboardData.getData( 'rich-text' ) === 'true';
50
+
51
+ function pasteInline( content ) {
52
+ const transformed = formatTypes.reduce(
53
+ ( accumulator, { __unstablePasteRule } ) => {
54
+ // Only allow one transform.
55
+ if ( __unstablePasteRule && accumulator === value ) {
56
+ accumulator = __unstablePasteRule( value, {
57
+ html,
58
+ plainText,
59
+ } );
60
+ }
61
+
62
+ return accumulator;
63
+ },
64
+ value
65
+ );
66
+ if ( transformed !== value ) {
67
+ onChange( transformed );
68
+ } else {
69
+ const valueToInsert = create( { html: content } );
70
+ addActiveFormats( valueToInsert, value.activeFormats );
71
+ onChange( insert( value, valueToInsert ) );
72
+ }
73
+ }
74
+
75
+ // If the data comes from a rich text instance, we can directly use it
76
+ // without filtering the data. The filters are only meant for externally
77
+ // pasted content and remove inline styles.
78
+ if ( isInternal ) {
79
+ pasteInline( html );
80
+ return;
81
+ }
82
+
83
+ if ( pastePlainText ) {
84
+ onChange( insert( value, create( { text: plainText } ) ) );
85
+ return;
86
+ }
87
+
88
+ if ( files?.length ) {
89
+ // Allows us to ask for this information when we get a report.
90
+ // eslint-disable-next-line no-console
91
+ window.console.log( 'Received items:\n\n', files );
92
+
93
+ const fromTransforms = getBlockTransforms( 'from' );
94
+ const blocks = files
95
+ .reduce( ( accumulator, file ) => {
96
+ const transformation = findTransform(
97
+ fromTransforms,
98
+ ( transform ) =>
99
+ transform.type === 'files' &&
100
+ transform.isMatch( [ file ] )
101
+ );
102
+ if ( transformation ) {
103
+ accumulator.push(
104
+ transformation.transform( [ file ] )
105
+ );
106
+ }
107
+ return accumulator;
108
+ }, [] )
109
+ .flat();
110
+ if ( ! blocks.length ) {
111
+ return;
112
+ }
113
+
114
+ if ( onReplace && isEmpty( value ) ) {
115
+ onReplace( blocks );
116
+ } else {
117
+ splitValue( {
118
+ value,
119
+ pastedBlocks: blocks,
120
+ onReplace,
121
+ onSplit,
122
+ } );
123
+ }
124
+
125
+ return;
126
+ }
127
+
128
+ let mode = onReplace && onSplit ? 'AUTO' : 'INLINE';
129
+
130
+ const trimmedPlainText = plainText.trim();
131
+
132
+ if (
133
+ __unstableEmbedURLOnPaste &&
134
+ isEmpty( value ) &&
135
+ isURL( trimmedPlainText ) &&
136
+ // For the link pasting feature, allow only http(s) protocols.
137
+ /^https?:/.test( trimmedPlainText )
138
+ ) {
139
+ mode = 'BLOCKS';
140
+ }
141
+
142
+ const content = pasteHandler( {
143
+ HTML: html,
144
+ plainText,
145
+ mode,
146
+ tagName,
147
+ } );
148
+
149
+ if ( typeof content === 'string' ) {
150
+ pasteInline( content );
151
+ } else if ( content.length > 0 ) {
152
+ if ( onReplace && isEmpty( value ) ) {
153
+ onReplace( content, content.length - 1, -1 );
154
+ } else {
155
+ splitValue( {
156
+ value,
157
+ pastedBlocks: content,
158
+ onReplace,
159
+ onSplit,
160
+ } );
161
+ }
162
+ }
163
+ }
164
+
165
+ element.addEventListener( 'paste', _onPaste );
166
+ return () => {
167
+ element.removeEventListener( 'paste', _onPaste );
168
+ };
169
+ };
@@ -0,0 +1,24 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { isKeyboardEvent } from '@wordpress/keycodes';
5
+
6
+ /**
7
+ * Hook to prevent default behaviors for key combinations otherwise handled
8
+ * internally by RichText.
9
+ */
10
+ export default () => ( node ) => {
11
+ function onKeydown( event ) {
12
+ if (
13
+ isKeyboardEvent.primary( event, 'z' ) ||
14
+ isKeyboardEvent.primary( event, 'y' ) ||
15
+ isKeyboardEvent.primaryShift( event, 'z' )
16
+ ) {
17
+ event.preventDefault();
18
+ }
19
+ }
20
+ node.addEventListener( 'keydown', onKeydown );
21
+ return () => {
22
+ node.removeEventListener( 'keydown', onKeydown );
23
+ };
24
+ };
@@ -0,0 +1,13 @@
1
+ export default ( props ) => ( element ) => {
2
+ const { keyboardShortcuts } = props.current;
3
+ function onKeyDown( event ) {
4
+ for ( const keyboardShortcut of keyboardShortcuts.current ) {
5
+ keyboardShortcut( event );
6
+ }
7
+ }
8
+
9
+ element.addEventListener( 'keydown', onKeyDown );
10
+ return () => {
11
+ element.removeEventListener( 'keydown', onKeyDown );
12
+ };
13
+ };
@@ -0,0 +1,45 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { BACKSPACE, ESCAPE } from '@wordpress/keycodes';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { store as blockEditorStore } from '../../../store';
10
+
11
+ export default ( props ) => ( element ) => {
12
+ function onKeyDown( event ) {
13
+ const { keyCode } = event;
14
+
15
+ if ( event.defaultPrevented ) {
16
+ return;
17
+ }
18
+
19
+ if ( keyCode !== BACKSPACE && keyCode !== ESCAPE ) {
20
+ return;
21
+ }
22
+
23
+ const { registry } = props.current;
24
+ const { didAutomaticChange, getSettings } =
25
+ registry.select( blockEditorStore );
26
+
27
+ const { __experimentalUndo } = getSettings();
28
+
29
+ if ( ! __experimentalUndo ) {
30
+ return;
31
+ }
32
+
33
+ if ( ! didAutomaticChange() ) {
34
+ return;
35
+ }
36
+
37
+ event.preventDefault();
38
+ __experimentalUndo();
39
+ }
40
+
41
+ element.addEventListener( 'keydown', onKeyDown );
42
+ return () => {
43
+ element.removeEventListener( 'keydown', onKeyDown );
44
+ };
45
+ };
@@ -12,7 +12,7 @@ import {
12
12
  forwardRef,
13
13
  createContext,
14
14
  } from '@wordpress/element';
15
- import { useDispatch, useSelect } from '@wordpress/data';
15
+ import { useDispatch, useRegistry, useSelect } from '@wordpress/data';
16
16
  import { useMergeRefs, useInstanceId } from '@wordpress/compose';
17
17
  import {
18
18
  __unstableUseRichText as useRichText,
@@ -29,19 +29,9 @@ import { useBlockEditContext } from '../block-edit';
29
29
  import { blockBindingsKey, isPreviewModeKey } from '../block-edit/context';
30
30
  import FormatToolbarContainer from './format-toolbar-container';
31
31
  import { store as blockEditorStore } from '../../store';
32
- import { useUndoAutomaticChange } from './use-undo-automatic-change';
33
32
  import { useMarkPersistent } from './use-mark-persistent';
34
- import { usePasteHandler } from './use-paste-handler';
35
- import { useBeforeInputRules } from './use-before-input-rules';
36
- import { useInputRules } from './use-input-rules';
37
- import { useDelete } from './use-delete';
38
- import { useEnter } from './use-enter';
39
33
  import { useFormatTypes } from './use-format-types';
40
- import { useRemoveBrowserShortcuts } from './use-remove-browser-shortcuts';
41
- import { useShortcuts } from './use-shortcuts';
42
- import { useInputEvents } from './use-input-events';
43
- import { useInsertReplacementText } from './use-insert-replacement-text';
44
- import { useFirefoxCompat } from './use-firefox-compat';
34
+ import { useEventListeners } from './event-listeners';
45
35
  import FormatEdit from './format-edit';
46
36
  import { getAllowedFormats } from './utils';
47
37
  import { Content, valueToHTMLString } from './content';
@@ -357,6 +347,7 @@ export function RichTextWrapper(
357
347
  anchorRef.current?.focus();
358
348
  }
359
349
 
350
+ const registry = useRegistry();
360
351
  const TagName = tagName;
361
352
  return (
362
353
  <>
@@ -400,48 +391,30 @@ export function RichTextWrapper(
400
391
  forwardedRef,
401
392
  autocompleteProps.ref,
402
393
  props.ref,
403
- useBeforeInputRules( { value, onChange } ),
404
- useInputRules( {
394
+ useEventListeners( {
395
+ registry,
405
396
  getValue,
406
397
  onChange,
407
398
  __unstableAllowPrefixTransformations,
408
399
  formatTypes,
409
400
  onReplace,
410
401
  selectionChange,
411
- } ),
412
- useInsertReplacementText(),
413
- useRemoveBrowserShortcuts(),
414
- useShortcuts( keyboardShortcuts ),
415
- useInputEvents( inputEvents ),
416
- useUndoAutomaticChange(),
417
- usePasteHandler( {
418
402
  isSelected,
419
403
  disableFormats,
420
- onChange,
421
404
  value,
422
- formatTypes,
423
405
  tagName,
424
- onReplace,
425
406
  onSplit,
426
407
  __unstableEmbedURLOnPaste,
427
408
  pastePlainText,
428
- } ),
429
- useDelete( {
430
- value,
431
409
  onMerge,
432
410
  onRemove,
433
- } ),
434
- useEnter( {
435
411
  removeEditorOnlyFormats,
436
- value,
437
- onReplace,
438
- onSplit,
439
- onChange,
440
412
  disableLineBreaks,
441
413
  onSplitAtEnd,
442
414
  onSplitAtDoubleLineEnd,
415
+ keyboardShortcuts,
416
+ inputEvents,
443
417
  } ),
444
- useFirefoxCompat(),
445
418
  anchorRef,
446
419
  ] ) }
447
420
  contentEditable={ ! shouldDisableEditing }
@@ -118,6 +118,7 @@ export function RichTextWrapper(
118
118
  getBlock,
119
119
  isMultiSelecting,
120
120
  hasMultiSelection,
121
+ getSelectedBlockClientId,
121
122
  } = select( blockEditorStore );
122
123
 
123
124
  const selectionStart = getSelectionStart();
@@ -154,6 +155,7 @@ export function RichTextWrapper(
154
155
  didAutomaticChange: didAutomaticChange(),
155
156
  disabled: isMultiSelecting() || hasMultiSelection(),
156
157
  undo,
158
+ getSelectedBlockClientId,
157
159
  ...extraProps,
158
160
  };
159
161
  };
@@ -164,6 +166,7 @@ export function RichTextWrapper(
164
166
  selectionStart,
165
167
  selectionEnd,
166
168
  isSelected,
169
+ getSelectedBlockClientId,
167
170
  didAutomaticChange,
168
171
  disabled,
169
172
  undo,
@@ -175,6 +178,7 @@ export function RichTextWrapper(
175
178
  exitFormattedText,
176
179
  selectionChange,
177
180
  __unstableMarkAutomaticChange,
181
+ clearSelectedBlock,
178
182
  } = useDispatch( blockEditorStore );
179
183
  const adjustedAllowedFormats = getAllowedFormats( {
180
184
  allowedFormats,
@@ -209,6 +213,12 @@ export function RichTextWrapper(
209
213
  [ clientId, identifier ]
210
214
  );
211
215
 
216
+ const clearCurrentSelectionOnUnmount = useCallback( () => {
217
+ if ( getSelectedBlockClientId() === clientId ) {
218
+ clearSelectedBlock();
219
+ }
220
+ }, [ clearSelectedBlock, clientId, getSelectedBlockClientId ] );
221
+
212
222
  const onDelete = useCallback(
213
223
  ( { value, isReverse } ) => {
214
224
  if ( onMerge ) {
@@ -590,6 +600,7 @@ export function RichTextWrapper(
590
600
  disableSuggestions={ disableSuggestions }
591
601
  disableAutocorrection={ disableAutocorrection }
592
602
  containerWidth={ containerWidth }
603
+ clearCurrentSelectionOnUnmount={ clearCurrentSelectionOnUnmount }
593
604
  // Props to be set on the editable container are destructured on the
594
605
  // element itself for web (see below), but passed through rich text
595
606
  // for native.
@@ -84,7 +84,9 @@ function RichTextMultiline(
84
84
  const newValues = values.slice();
85
85
  let offset = 0;
86
86
  if ( forward ) {
87
- if ( ! newValues[ index + 1 ] ) return;
87
+ if ( ! newValues[ index + 1 ] ) {
88
+ return;
89
+ }
88
90
  newValues.splice(
89
91
  index,
90
92
  2,
@@ -92,7 +94,9 @@ function RichTextMultiline(
92
94
  );
93
95
  offset = newValues[ index ].length - 1;
94
96
  } else {
95
- if ( ! newValues[ index - 1 ] ) return;
97
+ if ( ! newValues[ index - 1 ] ) {
98
+ return;
99
+ }
96
100
  newValues.splice(
97
101
  index - 1,
98
102
  2,
@@ -873,6 +873,17 @@ export class RichText extends Component {
873
873
  }
874
874
  }
875
875
 
876
+ componentWillUnmount() {
877
+ const { clearCurrentSelectionOnUnmount } = this.props;
878
+
879
+ // There are cases when the component is unmounted e.g. scrolling in a
880
+ // long post due to virtualization, so the block selection needs to be cleared
881
+ // so it doesn't auto-focus when it's added back.
882
+ if ( this._editor?.isFocused() ) {
883
+ clearCurrentSelectionOnUnmount?.();
884
+ }
885
+ }
886
+
876
887
  getHtmlToRender( record, tagName ) {
877
888
  // Save back to HTML from React tree.
878
889
  let value = this.valueToFormat( record );
@@ -29,7 +29,9 @@ const interactiveContentTags = new Set( [
29
29
  ] );
30
30
 
31
31
  function prefixSelectKeys( selected, prefix ) {
32
- if ( typeof selected !== 'object' ) return { [ prefix ]: selected };
32
+ if ( typeof selected !== 'object' ) {
33
+ return { [ prefix ]: selected };
34
+ }
33
35
  return Object.fromEntries(
34
36
  Object.entries( selected ).map( ( [ key, value ] ) => [
35
37
  `${ prefix }.${ key }`,
@@ -39,7 +41,9 @@ function prefixSelectKeys( selected, prefix ) {
39
41
  }
40
42
 
41
43
  function getPrefixedSelectKeys( selected, prefix ) {
42
- if ( selected[ prefix ] ) return selected[ prefix ];
44
+ if ( selected[ prefix ] ) {
45
+ return selected[ prefix ];
46
+ }
43
47
  return Object.keys( selected )
44
48
  .filter( ( key ) => key.startsWith( prefix + '.' ) )
45
49
  .reduce( ( accumulator, key ) => {