@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
@@ -156,13 +156,13 @@
156
156
 
157
157
  &.is-displacement-up {
158
158
  transition: transform 0.2s;
159
- transform: translateY(-36px);
159
+ transform: translateY(-32px);
160
160
  @include reduce-motion("transition");
161
161
  }
162
162
 
163
163
  &.is-displacement-down {
164
164
  transition: transform 0.2s;
165
- transform: translateY(36px);
165
+ transform: translateY(32px);
166
166
  @include reduce-motion("transition");
167
167
  }
168
168
 
@@ -172,20 +172,20 @@
172
172
  // worth of space for the visual indicator of where a block will be placed when dropped.
173
173
  &.is-after-dragged-blocks {
174
174
  transition: transform 0.2s;
175
- transform: translateY(calc(var(--wp-admin--list-view-dragged-items-height, 36px) * -1));
175
+ transform: translateY(calc(var(--wp-admin--list-view-dragged-items-height, 32px) * -1));
176
176
  @include reduce-motion("transition");
177
177
  }
178
178
 
179
179
  &.is-after-dragged-blocks.is-displacement-up {
180
180
  transition: transform 0.2s;
181
- transform: translateY(calc(-36px + var(--wp-admin--list-view-dragged-items-height, 36px) * -1));
181
+ transform: translateY(calc(-32px + var(--wp-admin--list-view-dragged-items-height, 32px) * -1));
182
182
  @include reduce-motion("transition");
183
183
  }
184
184
 
185
185
  &.is-after-dragged-blocks.is-displacement-down {
186
186
  transition: transform 0.2s;
187
187
  transform:
188
- translateY(calc(36px + var(--wp-admin--list-view-dragged-items-height, 36px) *
188
+ translateY(calc(32px + var(--wp-admin--list-view-dragged-items-height, 32px) *
189
189
  -1));
190
190
  @include reduce-motion("transition");
191
191
  }
@@ -204,15 +204,15 @@
204
204
  z-index: -9999;
205
205
  }
206
206
 
207
- // List View renders a fixed number of items and relies on each item having a fixed height of 36px.
207
+ // List View renders a fixed number of items and relies on each item having a fixed height of 32px.
208
208
  // If this value changes, we should also change the itemHeight value set in useFixedWindowList.
209
209
  // See: https://github.com/WordPress/gutenberg/pull/35230 for additional context.
210
210
  .block-editor-list-view-block-contents {
211
211
  display: flex;
212
212
  align-items: center;
213
213
  width: 100%;
214
- height: auto;
215
- padding: ($grid-unit-15 * 0.5) ($grid-unit-15 * 0.5) ($grid-unit-15 * 0.5) 0;
214
+ height: $grid-unit-40;
215
+ padding: ($grid-unit-15 * 0.5) $grid-unit-05 ($grid-unit-15 * 0.5) 0;
216
216
  text-align: left;
217
217
  border-radius: $radius-block-ui;
218
218
  position: relative;
@@ -277,15 +277,14 @@
277
277
  }
278
278
 
279
279
  .block-editor-block-icon {
280
- margin-right: $grid-unit-10;
280
+ margin-right: $grid-unit-10 * 0.5; // 6px.
281
281
  flex: 0 0 $icon-size;
282
282
  }
283
283
 
284
284
  .block-editor-list-view-block__menu-cell,
285
285
  .block-editor-list-view-block__mover-cell,
286
286
  .block-editor-list-view-block__contents-cell {
287
- padding-top: 0;
288
- padding-bottom: 0;
287
+ padding: 0;
289
288
  }
290
289
 
291
290
  .block-editor-list-view-block__menu-cell,
@@ -316,7 +315,7 @@
316
315
  }
317
316
 
318
317
  .block-editor-list-view-block__menu-cell {
319
- padding-right: $grid-unit-15 * 0.5; // 6px.
318
+ padding-right: $grid-unit-05;
320
319
 
321
320
  .components-button.has-icon {
322
321
  height: 24px;
@@ -379,8 +378,10 @@
379
378
  }
380
379
  }
381
380
 
382
- .block-editor-list-view-block-select-button__label-wrapper {
383
- min-width: 120px;
381
+ // Style lock and position icons in line with image previews.
382
+ .block-editor-list-view-block-select-button__label-wrapper svg {
383
+ left: $grid-unit-05 * 0.5; // 2px.
384
+ position: relative;
384
385
  }
385
386
 
386
387
  .block-editor-list-view-block-select-button__title {
@@ -464,21 +465,12 @@ $block-navigation-max-indent: 8;
464
465
  // Chevron container metrics.
465
466
  .block-editor-list-view__expander {
466
467
  height: $icon-size;
467
- margin-left: $grid-unit-05;
468
468
  width: $icon-size;
469
469
  cursor: pointer;
470
470
  }
471
471
 
472
472
  .block-editor-list-view-leaf[aria-level] .block-editor-list-view__expander {
473
- margin-left:
474
- ($icon-size) * $block-navigation-max-indent + 4 *
475
- ($block-navigation-max-indent - 1);
476
- }
477
-
478
- .block-editor-list-view-leaf:not([aria-level="1"]) {
479
- .block-editor-list-view__expander {
480
- margin-right: 4px;
481
- }
473
+ margin-left: ($grid-unit-30 * $block-navigation-max-indent);
482
474
  }
483
475
 
484
476
  // When updating the margin for each indentation level, the corresponding
@@ -488,9 +480,9 @@ $block-navigation-max-indent: 8;
488
480
  .block-editor-list-view-leaf[aria-level="#{ $i + 1 }"]
489
481
  .block-editor-list-view__expander {
490
482
  @if $i - 1 >= 0 {
491
- margin-left: ($icon-size * $i) + 4 * ($i - 1);
483
+ margin-left: ($grid-unit-30 * $i); // Effectivly centers the expander below the parent's icon.
492
484
  } @else {
493
- margin-left: ($icon-size * $i);
485
+ margin-left: 0;
494
486
  }
495
487
  }
496
488
  }
@@ -540,7 +532,7 @@ svg {
540
532
 
541
533
  .block-editor-list-view-drop-indicator__line {
542
534
  background: rgba(var(--wp-admin-theme-color--rgb), 0.04);
543
- height: 36px;
535
+ height: 32px;
544
536
  border-radius: 4px;
545
537
  overflow: hidden;
546
538
  }
@@ -553,7 +545,7 @@ svg {
553
545
  .block-editor-list-view-placeholder {
554
546
  padding: 0;
555
547
  margin: 0;
556
- height: 36px;
548
+ height: 32px;
557
549
  }
558
550
 
559
551
  .list-view-appender .block-editor-inserter__toggle {
@@ -62,7 +62,7 @@ import { store as blockEditorStore } from '../../store';
62
62
 
63
63
  // When the indentation level, the corresponding left margin in `style.scss`
64
64
  // must be updated as well to ensure the drop zone is aligned with the indentation.
65
- export const NESTING_LEVEL_INDENTATION = 28;
65
+ export const NESTING_LEVEL_INDENTATION = 24;
66
66
 
67
67
  /**
68
68
  * Determines whether the user is positioning the dragged block to be
@@ -74,7 +74,9 @@ export function focusListItem( focusClientId, treeGridElement ) {
74
74
  const row = treeGridElement?.querySelector(
75
75
  `[role=row][data-block="${ focusClientId }"]`
76
76
  );
77
- if ( ! row ) return null;
77
+ if ( ! row ) {
78
+ return null;
79
+ }
78
80
  // Focus the first focusable in the row, which is the ListViewBlockSelectButton.
79
81
  return focus.focusable.find( row )[ 0 ];
80
82
  };
@@ -1,10 +1,3 @@
1
- .block-editor-media-placeholder__url-input-container {
2
- // Reset the margin to ensure the url popover is adjacent to the button.
3
- .block-editor-media-placeholder__button {
4
- margin-bottom: 0;
5
- }
6
- }
7
-
8
1
  .block-editor-media-placeholder__url-input-form {
9
2
  display: flex;
10
3
 
@@ -29,10 +22,6 @@
29
22
  flex-shrink: 1;
30
23
  }
31
24
 
32
- .block-editor-media-placeholder__button {
33
- margin-bottom: 0.5rem;
34
- }
35
-
36
25
  .block-editor-media-placeholder__cancel-button.is-link {
37
26
  margin: 1em;
38
27
  display: block;
@@ -81,7 +81,7 @@ const URLSelectionUI = ( {
81
81
  className="block-editor-media-placeholder__button"
82
82
  onClick={ openURLInput }
83
83
  isPressed={ isURLInputVisible }
84
- variant="tertiary"
84
+ variant="secondary"
85
85
  >
86
86
  { __( 'Insert from URL' ) }
87
87
  </Button>
@@ -422,7 +422,7 @@ export function MediaPlaceholder( {
422
422
  <Button
423
423
  className="block-editor-media-placeholder__button"
424
424
  onClick={ onToggleFeaturedImage }
425
- variant="tertiary"
425
+ variant="secondary"
426
426
  >
427
427
  { __( 'Use featured image' ) }
428
428
  </Button>
@@ -435,7 +435,7 @@ export function MediaPlaceholder( {
435
435
  const defaultButton = ( { open } ) => {
436
436
  return (
437
437
  <Button
438
- variant="tertiary"
438
+ variant="secondary"
439
439
  onClick={ () => {
440
440
  open();
441
441
  } }
@@ -165,7 +165,9 @@ function useToolbarFocus( {
165
165
  }
166
166
  return () => {
167
167
  window.cancelAnimationFrame( raf );
168
- if ( ! onIndexChange || ! navigableToolbarRef ) return;
168
+ if ( ! onIndexChange || ! navigableToolbarRef ) {
169
+ return;
170
+ }
169
171
  // When the toolbar element is unmounted and onIndexChange is passed, we
170
172
  // pass the focused toolbar item index so it can be hydrated later.
171
173
  const items = getAllFocusableToolbarItemsIn( navigableToolbarRef );
@@ -2,17 +2,12 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import { createContext, useMemo } from '@wordpress/element';
5
+ import { observableMap } from '@wordpress/compose';
5
6
 
6
- export const BlockRefs = createContext( {
7
- refs: new Map(),
8
- callbacks: new Map(),
9
- } );
7
+ export const BlockRefs = createContext( { refsMap: observableMap() } );
10
8
 
11
9
  export function BlockRefsProvider( { children } ) {
12
- const value = useMemo(
13
- () => ( { refs: new Map(), callbacks: new Map() } ),
14
- []
15
- );
10
+ const value = useMemo( () => ( { refsMap: observableMap() } ), [] );
16
11
  return (
17
12
  <BlockRefs.Provider value={ value }>{ children }</BlockRefs.Provider>
18
13
  );
@@ -71,6 +71,7 @@ describe( 'useBlockSync hook', () => {
71
71
  expect( onInput ).not.toHaveBeenCalled();
72
72
  expect( replaceInnerBlocks ).not.toHaveBeenCalled();
73
73
  expect( resetBlocks ).toHaveBeenCalledWith( fakeBlocks );
74
+ expect( resetBlocks ).toHaveBeenCalledTimes( 1 );
74
75
 
75
76
  const testBlocks = [
76
77
  { clientId: 'a', innerBlocks: [], attributes: { foo: 1 } },
@@ -88,6 +89,7 @@ describe( 'useBlockSync hook', () => {
88
89
  expect( onInput ).not.toHaveBeenCalled();
89
90
  expect( replaceInnerBlocks ).not.toHaveBeenCalled();
90
91
  expect( resetBlocks ).toHaveBeenCalledWith( testBlocks );
92
+ expect( resetBlocks ).toHaveBeenCalledTimes( 2 );
91
93
 
92
94
  unmount();
93
95
 
@@ -95,6 +97,7 @@ describe( 'useBlockSync hook', () => {
95
97
  expect( onInput ).not.toHaveBeenCalled();
96
98
  expect( replaceInnerBlocks ).not.toHaveBeenCalled();
97
99
  expect( resetBlocks ).toHaveBeenCalledWith( [] );
100
+ expect( resetBlocks ).toHaveBeenCalledTimes( 3 );
98
101
  } );
99
102
 
100
103
  it( 'replaces the inner blocks of a block when the controlled value changes if a clientId is passed', async () => {
@@ -123,6 +126,7 @@ describe( 'useBlockSync hook', () => {
123
126
  'test', // It should use the given client ID.
124
127
  fakeBlocks // It should use the controlled blocks value.
125
128
  );
129
+ expect( replaceInnerBlocks ).toHaveBeenCalledTimes( 1 );
126
130
 
127
131
  const testBlocks = [
128
132
  {
@@ -148,6 +152,7 @@ describe( 'useBlockSync hook', () => {
148
152
  expect( replaceInnerBlocks ).toHaveBeenCalledWith( 'test', [
149
153
  expect.objectContaining( { name: 'test/test-block' } ),
150
154
  ] );
155
+ expect( replaceInnerBlocks ).toHaveBeenCalledTimes( 2 );
151
156
 
152
157
  unmount();
153
158
 
@@ -155,6 +160,7 @@ describe( 'useBlockSync hook', () => {
155
160
  expect( onInput ).not.toHaveBeenCalled();
156
161
  expect( resetBlocks ).not.toHaveBeenCalled();
157
162
  expect( replaceInnerBlocks ).toHaveBeenCalledWith( 'test', [] );
163
+ expect( replaceInnerBlocks ).toHaveBeenCalledTimes( 3 );
158
164
  } );
159
165
 
160
166
  it( 'does not add the controlled blocks to the block-editor store if the store already contains them', async () => {
@@ -354,6 +360,7 @@ describe( 'useBlockSync hook', () => {
354
360
  );
355
361
 
356
362
  expect( replaceInnerBlocks ).toHaveBeenCalledWith( 'test', [] );
363
+ expect( replaceInnerBlocks ).toHaveBeenCalledTimes( 1 );
357
364
  expect( onChange ).not.toHaveBeenCalled();
358
365
  expect( onInput ).not.toHaveBeenCalled();
359
366
  } );
@@ -2,7 +2,7 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import { useEffect, useRef } from '@wordpress/element';
5
- import { useRegistry, useSelect } from '@wordpress/data';
5
+ import { useRegistry } from '@wordpress/data';
6
6
  import { cloneBlock } from '@wordpress/blocks';
7
7
 
8
8
  /**
@@ -82,15 +82,6 @@ export default function useBlockSync( {
82
82
  } = registry.dispatch( blockEditorStore );
83
83
  const { getBlockName, getBlocks, getSelectionStart, getSelectionEnd } =
84
84
  registry.select( blockEditorStore );
85
- const isControlled = useSelect(
86
- ( select ) => {
87
- return (
88
- ! clientId ||
89
- select( blockEditorStore ).areInnerBlocksControlled( clientId )
90
- );
91
- },
92
- [ clientId ]
93
- );
94
85
 
95
86
  const pendingChanges = useRef( { incoming: null, outgoing: [] } );
96
87
  const subscribed = useRef( false );
@@ -186,15 +177,6 @@ export default function useBlockSync( {
186
177
  }
187
178
  }, [ controlledBlocks, clientId ] );
188
179
 
189
- useEffect( () => {
190
- // When the block becomes uncontrolled, it means its inner state has been reset
191
- // we need to take the blocks again from the external value property.
192
- if ( ! isControlled ) {
193
- pendingChanges.current.outgoing = [];
194
- setControlledBlocks();
195
- }
196
- }, [ isControlled ] );
197
-
198
180
  useEffect( () => {
199
181
  const {
200
182
  getSelectedBlocksInitialCaretPosition,
@@ -216,8 +198,9 @@ export default function useBlockSync( {
216
198
  // the subscription is triggering for a block (`clientId !== null`)
217
199
  // and its block name can't be found because it's not on the list.
218
200
  // (`getBlockName( clientId ) === null`).
219
- if ( clientId !== null && getBlockName( clientId ) === null )
201
+ if ( clientId !== null && getBlockName( clientId ) === null ) {
220
202
  return;
203
+ }
221
204
 
222
205
  // When RESET_BLOCKS on parent blocks get called, the controlled blocks
223
206
  // can reset to uncontrolled, in these situations, it means we need to populate
@@ -0,0 +1,92 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { insert, isCollapsed } from '@wordpress/rich-text';
5
+ import { applyFilters } from '@wordpress/hooks';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import { store as blockEditorStore } from '../../../store';
11
+
12
+ /**
13
+ * When typing over a selection, the selection will we wrapped by a matching
14
+ * character pair. The second character is optional, it defaults to the first
15
+ * character.
16
+ *
17
+ * @type {string[]} Array of character pairs.
18
+ */
19
+ const wrapSelectionSettings = [ '`', '"', "'", '“”', '‘’' ];
20
+
21
+ export default ( props ) => ( element ) => {
22
+ function onInput( event ) {
23
+ const { inputType, data } = event;
24
+ const { value, onChange, registry } = props.current;
25
+
26
+ // Only run the rules when inserting text.
27
+ if ( inputType !== 'insertText' ) {
28
+ return;
29
+ }
30
+
31
+ if ( isCollapsed( value ) ) {
32
+ return;
33
+ }
34
+
35
+ const pair = applyFilters(
36
+ 'blockEditor.wrapSelectionSettings',
37
+ wrapSelectionSettings
38
+ ).find(
39
+ ( [ startChar, endChar ] ) => startChar === data || endChar === data
40
+ );
41
+
42
+ if ( ! pair ) {
43
+ return;
44
+ }
45
+
46
+ const [ startChar, endChar = startChar ] = pair;
47
+ const start = value.start;
48
+ const end = value.end + startChar.length;
49
+
50
+ let newValue = insert( value, startChar, start, start );
51
+ newValue = insert( newValue, endChar, end, end );
52
+
53
+ const {
54
+ __unstableMarkLastChangeAsPersistent,
55
+ __unstableMarkAutomaticChange,
56
+ } = registry.dispatch( blockEditorStore );
57
+
58
+ __unstableMarkLastChangeAsPersistent();
59
+ onChange( newValue );
60
+ __unstableMarkAutomaticChange();
61
+
62
+ const init = {};
63
+
64
+ for ( const key in event ) {
65
+ init[ key ] = event[ key ];
66
+ }
67
+
68
+ init.data = endChar;
69
+
70
+ const { ownerDocument } = element;
71
+ const { defaultView } = ownerDocument;
72
+ const newEvent = new defaultView.InputEvent( 'input', init );
73
+
74
+ // Dispatch an `input` event with the new data. This will trigger the
75
+ // input rules.
76
+ // Postpone the `input` to the next event loop tick so that the dispatch
77
+ // doesn't happen synchronously in the middle of `beforeinput` dispatch.
78
+ // This is closer to how native `input` event would be timed, and also
79
+ // makes sure that the `input` event is dispatched only after the `onChange`
80
+ // call few lines above has fully updated the data store state and rerendered
81
+ // all affected components.
82
+ window.queueMicrotask( () => {
83
+ event.target.dispatchEvent( newEvent );
84
+ } );
85
+ event.preventDefault();
86
+ }
87
+
88
+ element.addEventListener( 'beforeinput', onInput );
89
+ return () => {
90
+ element.removeEventListener( 'beforeinput', onInput );
91
+ };
92
+ };
@@ -0,0 +1,53 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { DELETE, BACKSPACE } from '@wordpress/keycodes';
5
+ import { isCollapsed, isEmpty } from '@wordpress/rich-text';
6
+
7
+ export default ( props ) => ( element ) => {
8
+ function onKeyDown( event ) {
9
+ const { keyCode } = event;
10
+
11
+ if ( event.defaultPrevented ) {
12
+ return;
13
+ }
14
+
15
+ const { value, onMerge, onRemove } = props.current;
16
+
17
+ if ( keyCode === DELETE || keyCode === BACKSPACE ) {
18
+ const { start, end, text } = value;
19
+ const isReverse = keyCode === BACKSPACE;
20
+ const hasActiveFormats =
21
+ value.activeFormats && !! value.activeFormats.length;
22
+
23
+ // Only process delete if the key press occurs at an uncollapsed edge.
24
+ if (
25
+ ! isCollapsed( value ) ||
26
+ hasActiveFormats ||
27
+ ( isReverse && start !== 0 ) ||
28
+ ( ! isReverse && end !== text.length )
29
+ ) {
30
+ return;
31
+ }
32
+
33
+ if ( onMerge ) {
34
+ onMerge( ! isReverse );
35
+ }
36
+
37
+ // Only handle remove on Backspace. This serves dual-purpose of being
38
+ // an intentional user interaction distinguishing between Backspace and
39
+ // Delete to remove the empty field, but also to avoid merge & remove
40
+ // causing destruction of two fields (merge, then removed merged).
41
+ else if ( onRemove && isEmpty( value ) && isReverse ) {
42
+ onRemove( ! isReverse );
43
+ }
44
+
45
+ event.preventDefault();
46
+ }
47
+ }
48
+
49
+ element.addEventListener( 'keydown', onKeyDown );
50
+ return () => {
51
+ element.removeEventListener( 'keydown', onKeyDown );
52
+ };
53
+ };
@@ -0,0 +1,104 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { ENTER } from '@wordpress/keycodes';
5
+ import { insert, remove } from '@wordpress/rich-text';
6
+ import { getBlockTransforms, findTransform } from '@wordpress/blocks';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import { store as blockEditorStore } from '../../../store';
12
+ import { splitValue } from '../split-value';
13
+
14
+ export default ( props ) => ( element ) => {
15
+ function onKeyDown( event ) {
16
+ if ( event.target.contentEditable !== 'true' ) {
17
+ return;
18
+ }
19
+
20
+ if ( event.defaultPrevented ) {
21
+ return;
22
+ }
23
+
24
+ if ( event.keyCode !== ENTER ) {
25
+ return;
26
+ }
27
+
28
+ const {
29
+ removeEditorOnlyFormats,
30
+ value,
31
+ onReplace,
32
+ onSplit,
33
+ onChange,
34
+ disableLineBreaks,
35
+ onSplitAtEnd,
36
+ onSplitAtDoubleLineEnd,
37
+ registry,
38
+ } = props.current;
39
+
40
+ event.preventDefault();
41
+
42
+ const _value = { ...value };
43
+ _value.formats = removeEditorOnlyFormats( value );
44
+ const canSplit = onReplace && onSplit;
45
+
46
+ if ( onReplace ) {
47
+ const transforms = getBlockTransforms( 'from' ).filter(
48
+ ( { type } ) => type === 'enter'
49
+ );
50
+ const transformation = findTransform( transforms, ( item ) => {
51
+ return item.regExp.test( _value.text );
52
+ } );
53
+
54
+ if ( transformation ) {
55
+ onReplace( [
56
+ transformation.transform( {
57
+ content: _value.text,
58
+ } ),
59
+ ] );
60
+ registry
61
+ .dispatch( blockEditorStore )
62
+ .__unstableMarkAutomaticChange();
63
+ return;
64
+ }
65
+ }
66
+
67
+ const { text, start, end } = _value;
68
+
69
+ if ( event.shiftKey ) {
70
+ if ( ! disableLineBreaks ) {
71
+ onChange( insert( _value, '\n' ) );
72
+ }
73
+ } else if ( canSplit ) {
74
+ splitValue( {
75
+ value: _value,
76
+ onReplace,
77
+ onSplit,
78
+ } );
79
+ } else if ( onSplitAtEnd && start === end && end === text.length ) {
80
+ onSplitAtEnd();
81
+ } else if (
82
+ // For some blocks it's desirable to split at the end of the
83
+ // block when there are two line breaks at the end of the
84
+ // block, so triple Enter exits the block.
85
+ onSplitAtDoubleLineEnd &&
86
+ start === end &&
87
+ end === text.length &&
88
+ text.slice( -2 ) === '\n\n'
89
+ ) {
90
+ registry.batch( () => {
91
+ _value.start = _value.end - 2;
92
+ onChange( remove( _value ) );
93
+ onSplitAtDoubleLineEnd();
94
+ } );
95
+ } else if ( ! disableLineBreaks ) {
96
+ onChange( insert( _value, '\n' ) );
97
+ }
98
+ }
99
+
100
+ element.addEventListener( 'keydown', onKeyDown );
101
+ return () => {
102
+ element.removeEventListener( 'keydown', onKeyDown );
103
+ };
104
+ };
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { store as blockEditorStore } from '../../../store';
5
+
6
+ export default ( props ) => ( element ) => {
7
+ function onFocus() {
8
+ const { registry } = props.current;
9
+ if ( ! registry.select( blockEditorStore ).isMultiSelecting() ) {
10
+ return;
11
+ }
12
+
13
+ // This is a little hack to work around focus issues with nested
14
+ // editable elements in Firefox. For some reason the editable child
15
+ // element sometimes regains focus, while it should not be focusable
16
+ // and focus should remain on the editable parent element.
17
+ // To do: try to find the cause of the shifting focus.
18
+ const parentEditable = element.parentElement.closest(
19
+ '[contenteditable="true"]'
20
+ );
21
+
22
+ if ( parentEditable ) {
23
+ parentEditable.focus();
24
+ }
25
+ }
26
+
27
+ element.addEventListener( 'focus', onFocus );
28
+ return () => {
29
+ element.removeEventListener( 'focus', onFocus );
30
+ };
31
+ };